diff options
Diffstat (limited to 'README_md.html')
-rw-r--r-- | README_md.html | 429 |
1 files changed, 429 insertions, 0 deletions
diff --git a/README_md.html b/README_md.html new file mode 100644 index 0000000..5fcd6f0 --- /dev/null +++ b/README_md.html @@ -0,0 +1,429 @@ +<!DOCTYPE html> + +<html> +<head> +<meta charset="UTF-8"> + +<title>README - net-ssh 6.0.0.beta1</title> + +<script type="text/javascript"> + var rdoc_rel_prefix = "./"; + var index_rel_prefix = "./"; +</script> + +<script src="./js/jquery.js"></script> +<script src="./js/darkfish.js"></script> + +<link href="./css/fonts.css" rel="stylesheet"> +<link href="./css/rdoc.css" rel="stylesheet"> + + + +<body id="top" role="document" class="file"> +<nav role="navigation"> + <div id="project-navigation"> + <div id="home-section" role="region" title="Quick navigation" class="nav-section"> + <h2> + <a href="./index.html" rel="home">Home</a> + </h2> + + <div id="table-of-contents-navigation"> + <a href="./table_of_contents.html#pages">Pages</a> + <a href="./table_of_contents.html#classes">Classes</a> + <a href="./table_of_contents.html#methods">Methods</a> + </div> +</div> + + <div id="search-section" role="search" class="project-section initially-hidden"> + <form action="#" method="get" accept-charset="utf-8"> + <div id="search-field-wrapper"> + <input id="search-field" role="combobox" aria-label="Search" + aria-autocomplete="list" aria-controls="search-results" + type="text" name="search" placeholder="Search" spellcheck="false" + title="Type to search, Up and Down to navigate, Enter to load"> + </div> + + <ul id="search-results" aria-label="Search Results" + aria-busy="false" aria-expanded="false" + aria-atomic="false" class="initially-hidden"></ul> + </form> +</div> + + </div> + + +<div class="nav-section"> + <h3>Table of Contents</h3> + + <ul class="link-list" role="directory"> + <li><a href="#label-Net-3A-3ASSH+6.x">Net::SSH 6.x</a> + <li><a href="#label-DESCRIPTION-3A">DESCRIPTION:</a> + <li><a href="#label-FEATURES-3A">FEATURES:</a> + <li><a href="#label-Supported+Algorithms">Supported Algorithms</a> + <li><a href="#label-Host+Keys">Host Keys</a> + <li><a href="#label-Key+Exchange">Key Exchange</a> + <li><a href="#label-Encryption+algorithms+-28ciphers-29">Encryption algorithms (ciphers)</a> + <li><a href="#label-Message+Authentication+Code+algorithms">Message Authentication Code algorithms</a> + <li><a href="#label-SYNOPSIS-3A">SYNOPSIS:</a> + <li><a href="#label-REQUIREMENTS-3A">REQUIREMENTS:</a> + <li><a href="#label-INSTALL-3A">INSTALL:</a> + <li><a href="#label-RUBY+SUPPORT">RUBY SUPPORT</a> + <li><a href="#label-RUNNING+TESTS">RUNNING TESTS</a> + <li><a href="#label-BUILDING+GEM">BUILDING GEM</a> + <li><a href="#label-GEM+SIGNING+-28for+maintainers-29">GEM SIGNING (for maintainers)</a> + <li><a href="#label-CREDITS">CREDITS</a> + <li><a href="#label-Contributors">Contributors</a> + <li><a href="#label-Backers">Backers</a> + <li><a href="#label-Sponsors">Sponsors</a> + <li><a href="#label-LICENSE-3A">LICENSE:</a> + </ul> +</div> + + + <div id="project-metadata"> + <div id="fileindex-section" class="nav-section"> + <h3>Pages</h3> + + <ul class="link-list"> + + <li><a href="./CHANGES_txt.html">CHANGES</a> + + <li><a href="./LICENSE_txt.html">LICENSE</a> + + <li><a href="./README_md.html">README</a> + + <li><a href="./THANKS_txt.html">THANKS</a> + + </ul> +</div> + + </div> +</nav> + +<main role="main" aria-label="Page README.md"> + +<p><a href="https://badge.fury.io/rb/net-ssh"><img +src="https://badge.fury.io/rb/net-ssh.svg"></a> <a +href="https://gitter.im/net-ssh/net-ssh?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img +src="https://badges.gitter.im/net-ssh/net-ssh.svg"></a> <a +href="https://travis-ci.org/net-ssh/net-ssh"><img +src="https://travis-ci.org/net-ssh/net-ssh.svg?branch=master"></a> <a +href="https://codecov.io/gh/net-ssh/net-ssh"><img +src="https://codecov.io/gh/net-ssh/net-ssh/branch/master/graph/badge.svg"></a> +<a href="#backers"><img +src="https://opencollective.com/net-ssh/backers/badge.svg"></a>] <a +href="#sponsors"><img +src="https://opencollective.com/net-ssh/sponsors/badge.svg"></a></p> + +<h1 id="label-Net-3A-3ASSH+6.x"><a href="Net/SSH.html">Net::SSH</a> 6.x<span><a href="#label-Net-3A-3ASSH+6.x">¶</a> <a href="#top">↑</a></span></h1> +<ul><li> +<p>Docs: <a +href="http://net-ssh.github.com/net-ssh">net-ssh.github.com/net-ssh</a></p> +</li><li> +<p>Issues: <a +href="https://github.com/net-ssh/net-ssh/issues">github.com/net-ssh/net-ssh/issues</a></p> +</li><li> +<p>Codes: <a +href="https://github.com/net-ssh/net-ssh">github.com/net-ssh/net-ssh</a></p> +</li><li> +<p>Email: net-ssh@solutious.com</p> +</li></ul> + +<p><em>As of v2.6.4, all gem releases are signed. See <a +href="#install">INSTALL</a>.</em></p> + +<h2 id="label-DESCRIPTION-3A">DESCRIPTION:<span><a href="#label-DESCRIPTION-3A">¶</a> <a href="#top">↑</a></span></h2> + +<p><a href="Net/SSH.html">Net::SSH</a> is a pure-Ruby implementation of the +SSH2 client protocol. It allows you to write programs that invoke and +interact with processes on remote servers, via SSH2.</p> + +<h2 id="label-FEATURES-3A">FEATURES:<span><a href="#label-FEATURES-3A">¶</a> <a href="#top">↑</a></span></h2> +<ul><li> +<p>Execute processes on remote servers and capture their output</p> +</li><li> +<p>Run multiple processes in parallel over a single SSH connection</p> +</li><li> +<p>Support for SSH subsystems</p> +</li><li> +<p>Forward local and remote ports via an SSH connection</p> +</li></ul> + +<h2 id="label-Supported+Algorithms">Supported Algorithms<span><a href="#label-Supported+Algorithms">¶</a> <a href="#top">↑</a></span></h2> + +<p><a href="Net/SSH.html">Net::SSH</a> 6.0 disables by default the usage of +weak algorithms. We strongly recommend that you install a servers's +version that supports the latest algorithms.</p> + +<p>It is possible to return to the previous behavior by adding the option : +<code>append_all_supported_algorithms: true</code></p> + +<p>Unsecure algoritms will be definively remove in <a +href="Net/SSH.html">Net::SSH</a> 7.*.</p> + +<h3 id="label-Host+Keys">Host Keys<span><a href="#label-Host+Keys">¶</a> <a href="#top">↑</a></span></h3> + +<p>| Name | Support | Details | |———————-|———————–|———-| | ssh-rsa | OK | | | +ssh-ed25519 | OK | Require the gem <code>ed25519</code> | | +ecdsa-sha2-nistp521 | OK | <a href="https://safecurves.cr.yp.to/">using +weak elliptic curves</a> | | ecdsa-sha2-nistp384 | OK | <a +href="https://safecurves.cr.yp.to/">using weak elliptic curves</a> | | +ecdsa-sha2-nistp256 | OK | <a href="https://safecurves.cr.yp.to/">using +weak elliptic curves</a> | | ssh-dss | Deprecated in 6.0 | unsecure, will +be removed in 7.0 |</p> + +<h3 id="label-Key+Exchange">Key Exchange<span><a href="#label-Key+Exchange">¶</a> <a href="#top">↑</a></span></h3> + +<p>| Name | Support | Details | |————————————–|———————–|———-| | +curve25519-sha256 | OK | Require the gem <code>x25519</code> | | +ecdh-sha2-nistp521 | OK | <a href="https://safecurves.cr.yp.to/">using weak +elliptic curves</a> | | ecdh-sha2-nistp384 | OK | <a +href="https://safecurves.cr.yp.to/">using weak elliptic curves</a> | | +ecdh-sha2-nistp256 | OK | <a href="https://safecurves.cr.yp.to/">using weak +elliptic curves</a> | | diffie-hellman-group1-sha1 | Deprecated in 6.0 | +unsecure, will be removed in 7.0 | | diffie-hellman-group14-sha1 | OK | | | +diffie-hellman-group-exchange-sha1 | Deprecated in 6.0 | unsecure, will be +removed in 7.0 | | diffie-hellman-group-exchange-sha256 | OK | |</p> + +<h3 id="label-Encryption+algorithms+-28ciphers-29">Encryption algorithms (ciphers)<span><a href="#label-Encryption+algorithms+-28ciphers-29">¶</a> <a href="#top">↑</a></span></h3> + +<p>| Name | Support | Details | |————————————–|———————–|———-| | aes256-ctr / +aes192-ctr / aes128-ctr | OK | <a href="https://safecurves.cr.yp.to/">using +weak elliptic curves</a> | | aes256-cbc / aes192-cbc / aes128-cbc | +Deprecated in 6.0 | unsecure, will be removed in 7.0 | | +rijndael-cbc@lysator.liu.se | Deprecated in 6.0 | unsecure, will be removed +in 7.0 | | blowfish-ctr blowfish-cbc | Deprecated in 6.0 | unsecure, will +be removed in 7.0 | | cast128-ctr cast128-cbc | Deprecated in 6.0 | +unsecure, will be removed in 7.0 | | 3des-ctr 3des-cbc | Deprecated in 6.0 +| unsecure, will be removed in 7.0 | | idea-cbc | Deprecated in 6.0 | +unsecure, will be removed in 7.0 | | none | Deprecated in 6.0 | unsecure, +will be removed in 7.0 |</p> + +<h3 id="label-Message+Authentication+Code+algorithms">Message Authentication Code algorithms<span><a href="#label-Message+Authentication+Code+algorithms">¶</a> <a href="#top">↑</a></span></h3> + +<p>| Name | Support | Details | |———————-|———————–|———-| | hmac-sha2-512-etm | +OK | | | hmac-sha2-256-etm | OK | | | hmac-sha2-512 | OK | | | +hmac-sha2-256 | OK | | | hmac-sha2-512-96 | Deprecated in 6.0 | removed +from the specification, will be removed in 7.0 | | hmac-sha2-256-96 | +Deprecated in 6.0 | removed from the specification, will be removed in 7.0 +| | hmac-sha1 | OK | for backward compatibility | | hmac-sha1-96 | +Deprecated in 6.0 | unsecure, will be removed in 7.0 | | hmac-ripemd160 | +Deprecated in 6.0 | unsecure, will be removed in 7.0 | | hmac-md5 | +Deprecated in 6.0 | unsecure, will be removed in 7.0 | | hmac-md5-96 | +Deprecated in 6.0 | unsecure, will be removed in 7.0 | | none | Deprecated +in 6.0 | unsecure, will be removed in 7.0 |</p> + +<h2 id="label-SYNOPSIS-3A">SYNOPSIS:<span><a href="#label-SYNOPSIS-3A">¶</a> <a href="#top">↑</a></span></h2> + +<p>In a nutshell:</p> + +<pre class="ruby"><span class="ruby-identifier">require</span> <span class="ruby-string">'net/ssh'</span> + +<span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">SSH</span>.<span class="ruby-identifier">start</span>(<span class="ruby-string">'host'</span>, <span class="ruby-string">'user'</span>, <span class="ruby-identifier">password</span><span class="ruby-operator">:</span> <span class="ruby-string">"password"</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">ssh</span><span class="ruby-operator">|</span> +<span class="ruby-comment"># capture all stderr and stdout output from a remote process</span> +<span class="ruby-identifier">output</span> = <span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">exec!</span>(<span class="ruby-string">"hostname"</span>) +<span class="ruby-identifier">puts</span> <span class="ruby-identifier">output</span> + +<span class="ruby-comment"># capture only stdout matching a particular pattern</span> +<span class="ruby-identifier">stdout</span> = <span class="ruby-string">""</span> +<span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">exec!</span>(<span class="ruby-string">"ls -l /home/jamis"</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">channel</span>, <span class="ruby-identifier">stream</span>, <span class="ruby-identifier">data</span><span class="ruby-operator">|</span> + <span class="ruby-identifier">stdout</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">data</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">stream</span> <span class="ruby-operator">==</span> :<span class="ruby-identifier">stdout</span> +<span class="ruby-keyword">end</span> +<span class="ruby-identifier">puts</span> <span class="ruby-identifier">stdout</span> + +<span class="ruby-comment"># run multiple processes in parallel to completion</span> +<span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">exec</span> <span class="ruby-string">"sed ..."</span> +<span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">exec</span> <span class="ruby-string">"awk ..."</span> +<span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">exec</span> <span class="ruby-string">"rm -rf ..."</span> +<span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">loop</span> + +<span class="ruby-comment"># open a new channel and configure a minimal set of callbacks, then run</span> +<span class="ruby-comment"># the event loop until the channel finishes (closes)</span> +<span class="ruby-identifier">channel</span> = <span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">open_channel</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">ch</span><span class="ruby-operator">|</span> + <span class="ruby-identifier">ch</span>.<span class="ruby-identifier">exec</span> <span class="ruby-string">"/usr/local/bin/ruby /path/to/file.rb"</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">ch</span>, <span class="ruby-identifier">success</span><span class="ruby-operator">|</span> + <span class="ruby-identifier">raise</span> <span class="ruby-string">"could not execute command"</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">success</span> + + <span class="ruby-comment"># "on_data" is called when the process writes something to stdout</span> + <span class="ruby-identifier">ch</span>.<span class="ruby-identifier">on_data</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">c</span>, <span class="ruby-identifier">data</span><span class="ruby-operator">|</span> + <span class="ruby-identifier">$stdout</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">data</span> + <span class="ruby-keyword">end</span> + + <span class="ruby-comment"># "on_extended_data" is called when the process writes something to stderr</span> + <span class="ruby-identifier">ch</span>.<span class="ruby-identifier">on_extended_data</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">c</span>, <span class="ruby-identifier">type</span>, <span class="ruby-identifier">data</span><span class="ruby-operator">|</span> + <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">print</span> <span class="ruby-identifier">data</span> + <span class="ruby-keyword">end</span> + + <span class="ruby-identifier">ch</span>.<span class="ruby-identifier">on_close</span> { <span class="ruby-identifier">puts</span> <span class="ruby-string">"done!"</span> } + <span class="ruby-keyword">end</span> +<span class="ruby-keyword">end</span> + +<span class="ruby-identifier">channel</span>.<span class="ruby-identifier">wait</span> + +<span class="ruby-comment"># forward connections on local port 1234 to port 80 of www.capify.org</span> +<span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">forward</span>.<span class="ruby-identifier">local</span>(<span class="ruby-value">1234</span>, <span class="ruby-string">"www.capify.org"</span>, <span class="ruby-value">80</span>) +<span class="ruby-identifier">ssh</span>.<span class="ruby-identifier">loop</span> { <span class="ruby-keyword">true</span> } +<span class="ruby-keyword">end</span> +</pre> + +<p>See <a href="Net/SSH.html">Net::SSH</a> for more documentation, and links +to further information.</p> + +<h2 id="label-REQUIREMENTS-3A">REQUIREMENTS:<span><a href="#label-REQUIREMENTS-3A">¶</a> <a href="#top">↑</a></span></h2> + +<p>The only requirement you might be missing is the <a +href="OpenSSL.html">OpenSSL</a> bindings for Ruby with a version greather +than <code>1.0.1</code>. These are built by default on most platforms, but +you can verify that they're built and installed on your system by +running the following command line:</p> + +<pre>ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'</pre> + +<p>If that spits out something like <code>OpenSSL 1.0.1 14 Mar 2012</code>, +then you're set. If you get an error, then you'll need to see about +rebuilding ruby with <a href="OpenSSL.html">OpenSSL</a> support, or (if +your platform supports it) installing the <a +href="OpenSSL.html">OpenSSL</a> bindings separately.</p> + +<h2 id="label-INSTALL-3A">INSTALL:<span><a href="#label-INSTALL-3A">¶</a> <a href="#top">↑</a></span></h2> + +<pre class="ruby"><span class="ruby-identifier">gem</span> <span class="ruby-identifier">install</span> <span class="ruby-identifier">net</span><span class="ruby-operator">-</span><span class="ruby-identifier">ssh</span> <span class="ruby-comment"># might need sudo privileges</span> +</pre> + +<p>NOTE: If you are running on jruby on windows you need to install +<code>jruby-pageant</code> manually (gemspec doesn't allow for platform +specific dependencies).</p> + +<p>However, in order to be sure the code you're installing hasn't been +tampered with, it's recommended that you verify the <a +href="http://docs.rubygems.org/read/chapter/21">signature</a>. To do this, +you need to add my public key as a trusted certificate (you only need to do +this once):</p> + +<pre># Add the public key as a trusted certificate +# (You only need to do this once) +curl -O https://raw.githubusercontent.com/net-ssh/net-ssh/master/net-ssh-public_cert.pem +gem cert --add net-ssh-public_cert.pem</pre> + +<p>Then, when install the gem, do so with high security:</p> + +<pre>gem install net-ssh -P HighSecurity</pre> + +<p>If you don't add the public key, you'll see an error like +“Couldn't verify data signature”. If you're still having trouble +let me know and I'll give you a hand.</p> + +<p>For ed25519 public key auth support your bundle file should contain +<code>ed25519</code>, <code>bcrypt_pbkdf</code> dependencies.</p> + +<pre class="ruby"><span class="ruby-identifier">gem</span> <span class="ruby-identifier">install</span> <span class="ruby-identifier">ed25519</span> +<span class="ruby-identifier">gem</span> <span class="ruby-identifier">install</span> <span class="ruby-identifier">bcrypt_pbkdf</span> +</pre> + +<p>For curve25519-sha256 kex exchange support your bundle file should contain +<code>x25519</code> dependency.</p> + +<h2 id="label-RUBY+SUPPORT">RUBY SUPPORT<span><a href="#label-RUBY+SUPPORT">¶</a> <a href="#top">↑</a></span></h2> +<ul><li> +<p>See <a +href="https://github.com/net-ssh/net-ssh/blob/master/net-ssh.gemspec">net-ssh.gemspec</a> +for current versions ruby requirements</p> +</li></ul> + +<h2 id="label-RUNNING+TESTS">RUNNING TESTS<span><a href="#label-RUNNING+TESTS">¶</a> <a href="#top">↑</a></span></h2> + +<p>If you want to run the tests or use any of the Rake tasks, you'll need +Mocha and other dependencies listed in Gemfile</p> + +<p>Run the test suite from the net-ssh directory with the following command:</p> + +<pre class="ruby"><span class="ruby-identifier">bundle</span> <span class="ruby-identifier">exec</span> <span class="ruby-identifier">rake</span> <span class="ruby-identifier">test</span> +</pre> + +<p>Run a single test file like this:</p> + +<pre>ruby -Ilib -Itest test/transport/test_server_version.rb</pre> + +<p>To run integration tests see test/integration/README.txt</p> + +<h3 id="label-BUILDING+GEM">BUILDING GEM<span><a href="#label-BUILDING+GEM">¶</a> <a href="#top">↑</a></span></h3> + +<pre class="ruby"><span class="ruby-identifier">rake</span> <span class="ruby-identifier">build</span> +</pre> + +<h3 id="label-GEM+SIGNING+-28for+maintainers-29">GEM SIGNING (for maintainers)<span><a href="#label-GEM+SIGNING+-28for+maintainers-29">¶</a> <a href="#top">↑</a></span></h3> + +<p>If you have the net-ssh private signing key, you will be able to create +signed release builds. Make sure the private key path matches the +<code>signing_key</code> path set in <code>net-ssh.gemspec</code> and tell +rake to sign the gem by setting the <code>NET_SSH_BUILDGEM_SIGNED</code> +flag:</p> + +<pre>NET_SSH_BUILDGEM_SIGNED=true rake build</pre> + +<p>For time to time, the public certificate associated to the private key +needs to be renewed. You can do this with the following command:</p> + +<pre>gem cert --build netssh@solutious.com --private-key path/2/net-ssh-private_key.pem +mv gem-public_cert.pem net-ssh-public_cert.pem +gem cert --add net-ssh-public_cert.pem</pre> + +<h2 id="label-CREDITS">CREDITS<span><a href="#label-CREDITS">¶</a> <a href="#top">↑</a></span></h2> + +<h3 id="label-Contributors">Contributors<span><a href="#label-Contributors">¶</a> <a href="#top">↑</a></span></h3> + +<p>This project exists thanks to all the people who contribute.</p> + +<p><a href="graphs/contributors"><img +src="https://opencollective.com/net-ssh/contributors.svg?width=890&button=false"></a></p> + +<h3 id="label-Backers">Backers<span><a href="#label-Backers">¶</a> <a href="#top">↑</a></span></h3> + +<p>Thank you to all our backers! 🙏 <a +href="https://opencollective.com/net-ssh#backer">Become a backer</a></p> + +<p><a href="https://opencollective.com/net-ssh#backers"><img +src="https://opencollective.com/net-ssh/backers.svg?width=890"></a></p> + +<h3 id="label-Sponsors">Sponsors<span><a href="#label-Sponsors">¶</a> <a href="#top">↑</a></span></h3> + +<p>Support this project by becoming a sponsor. Your logo will show up here +with a link to your website. <a +href="https://opencollective.com/net-ssh#sponsor">Become a sponsor</a></p> + +<p><a href="https://opencollective.com/net-ssh/sponsor/0/website"><img +src="https://opencollective.com/net-ssh/sponsor/0/avatar.svg"></a></p> + +<h2 id="label-LICENSE-3A">LICENSE:<span><a href="#label-LICENSE-3A">¶</a> <a href="#top">↑</a></span></h2> + +<p>(The MIT License)</p> + +<p>Copyright © 2008 Jamis Buck</p> + +<p>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:</p> + +<p>The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software.</p> + +<p>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.</p> +</main> + + + +<footer id="validator-badges" role="contentinfo"> + <p><a href="http://validator.w3.org/check/referer">Validate</a> + <p>Generated by <a href="https://rdoc.github.io/rdoc">RDoc</a> 5.0.0. + <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>. +</footer> + |