From 2b28091386dc4b3597b56b773254056185b0c6e0 Mon Sep 17 00:00:00 2001 From: Devendra Date: Wed, 25 Jun 2014 23:01:13 +0530 Subject: [#73858464] adding sphinx docs --- docs/build/html/.buildinfo | 4 + docs/build/html/_sources/index.txt | 35 + docs/build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes docs/build/html/_static/basic.css | 537 ++++++++++ docs/build/html/_static/comment-bright.png | Bin 0 -> 3500 bytes docs/build/html/_static/comment-close.png | Bin 0 -> 3578 bytes docs/build/html/_static/comment.png | Bin 0 -> 3445 bytes docs/build/html/_static/default.css | 256 +++++ docs/build/html/_static/doctools.js | 238 +++++ docs/build/html/_static/down-pressed.png | Bin 0 -> 368 bytes docs/build/html/_static/down.png | Bin 0 -> 363 bytes docs/build/html/_static/file.png | Bin 0 -> 392 bytes docs/build/html/_static/jquery.js | 2 + docs/build/html/_static/minus.png | Bin 0 -> 199 bytes docs/build/html/_static/plus.png | Bin 0 -> 199 bytes docs/build/html/_static/pygments.css | 62 ++ docs/build/html/_static/searchtools.js | 622 +++++++++++ docs/build/html/_static/sidebar.js | 159 +++ docs/build/html/_static/underscore.js | 31 + docs/build/html/_static/up-pressed.png | Bin 0 -> 372 bytes docs/build/html/_static/up.png | Bin 0 -> 363 bytes docs/build/html/_static/websupport.js | 808 +++++++++++++++ docs/build/html/genindex.html | 358 +++++++ docs/build/html/index.html | 1555 ++++++++++++++++++++++++++++ docs/build/html/objects.inv | Bin 0 -> 411 bytes docs/build/html/py-modindex.html | 112 ++ docs/build/html/search.html | 105 ++ docs/build/html/searchindex.js | 1 + 28 files changed, 4885 insertions(+) create mode 100644 docs/build/html/.buildinfo create mode 100644 docs/build/html/_sources/index.txt create mode 100644 docs/build/html/_static/ajax-loader.gif create mode 100644 docs/build/html/_static/basic.css create mode 100644 docs/build/html/_static/comment-bright.png create mode 100644 docs/build/html/_static/comment-close.png create mode 100644 docs/build/html/_static/comment.png create mode 100644 docs/build/html/_static/default.css create mode 100644 docs/build/html/_static/doctools.js create mode 100644 docs/build/html/_static/down-pressed.png create mode 100644 docs/build/html/_static/down.png create mode 100644 docs/build/html/_static/file.png create mode 100644 docs/build/html/_static/jquery.js create mode 100644 docs/build/html/_static/minus.png create mode 100644 docs/build/html/_static/plus.png create mode 100644 docs/build/html/_static/pygments.css create mode 100644 docs/build/html/_static/searchtools.js create mode 100644 docs/build/html/_static/sidebar.js create mode 100644 docs/build/html/_static/underscore.js create mode 100644 docs/build/html/_static/up-pressed.png create mode 100644 docs/build/html/_static/up.png create mode 100644 docs/build/html/_static/websupport.js create mode 100644 docs/build/html/genindex.html create mode 100644 docs/build/html/index.html create mode 100644 docs/build/html/objects.inv create mode 100644 docs/build/html/py-modindex.html create mode 100644 docs/build/html/search.html create mode 100644 docs/build/html/searchindex.js (limited to 'docs/build/html') diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo new file mode 100644 index 0000000..c24b844 --- /dev/null +++ b/docs/build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 9bfef501afd0f10215c217de6f058e7b +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/_sources/index.txt b/docs/build/html/_sources/index.txt new file mode 100644 index 0000000..af3593e --- /dev/null +++ b/docs/build/html/_sources/index.txt @@ -0,0 +1,35 @@ +.. PubNub documentation master file, created by + sphinx-quickstart on Wed Jun 25 12:50:44 2014. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PubNub's documentation! +================================== + +.. toctree:: + :maxdepth: 5 + +.. automodule:: Pubnub + +Pubnub +--------------------------------- +.. autoclass:: Pubnub + :members: publish, subscribe, unsubscribe, presence, history, here_now, grant, audit, revoke, get_origin, set_origin, get_auth_key, set_auth_key, encrypt, decrypt, time + +PubnubTwisted +--------------------------------- +.. autoclass:: PubnubTwisted + :members: publish, subscribe, unsubscribe, presence, history, here_now, grant, audit, revoke, get_origin, set_origin, get_auth_key, set_auth_key, encrypt, decrypt, time + + +PubnubTornado +--------------------------------- +.. autoclass:: PubnubTornado + :members: publish, subscribe, unsubscribe, presence, history, here_now, grant, audit, revoke, get_origin, set_origin, get_auth_key, set_auth_key, encrypt, decrypt, time + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` + diff --git a/docs/build/html/_static/ajax-loader.gif b/docs/build/html/_static/ajax-loader.gif new file mode 100644 index 0000000..61faf8c Binary files /dev/null and b/docs/build/html/_static/ajax-loader.gif differ diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css new file mode 100644 index 0000000..967e36c --- /dev/null +++ b/docs/build/html/_static/basic.css @@ -0,0 +1,537 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 170px; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + width: 30px; +} + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/build/html/_static/comment-bright.png b/docs/build/html/_static/comment-bright.png new file mode 100644 index 0000000..551517b Binary files /dev/null and b/docs/build/html/_static/comment-bright.png differ diff --git a/docs/build/html/_static/comment-close.png b/docs/build/html/_static/comment-close.png new file mode 100644 index 0000000..09b54be Binary files /dev/null and b/docs/build/html/_static/comment-close.png differ diff --git a/docs/build/html/_static/comment.png b/docs/build/html/_static/comment.png new file mode 100644 index 0000000..92feb52 Binary files /dev/null and b/docs/build/html/_static/comment.png differ diff --git a/docs/build/html/_static/default.css b/docs/build/html/_static/default.css new file mode 100644 index 0000000..5f1399a --- /dev/null +++ b/docs/build/html/_static/default.css @@ -0,0 +1,256 @@ +/* + * default.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- default theme. + * + * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning tt { + background: #efc2c2; +} + +.note tt { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} \ No newline at end of file diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js new file mode 100644 index 0000000..c5455c9 --- /dev/null +++ b/docs/build/html/_static/doctools.js @@ -0,0 +1,238 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s == 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node) { + if (node.nodeType == 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this); + }); + } + } + return this.each(function() { + highlight(this); + }); +}; + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('
' + _('Hide Search Matches') + '
') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/build/html/_static/down-pressed.png b/docs/build/html/_static/down-pressed.png new file mode 100644 index 0000000..6f7ad78 Binary files /dev/null and b/docs/build/html/_static/down-pressed.png differ diff --git a/docs/build/html/_static/down.png b/docs/build/html/_static/down.png new file mode 100644 index 0000000..3003a88 Binary files /dev/null and b/docs/build/html/_static/down.png differ diff --git a/docs/build/html/_static/file.png b/docs/build/html/_static/file.png new file mode 100644 index 0000000..d18082e Binary files /dev/null and b/docs/build/html/_static/file.png differ diff --git a/docs/build/html/_static/jquery.js b/docs/build/html/_static/jquery.js new file mode 100644 index 0000000..83589da --- /dev/null +++ b/docs/build/html/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v1.8.3 jquery.com | jquery.org/license */ +(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write(""),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a| t | 
| +
 | 
| +
 | 
| +
 | 
| +
 | 
| +
 | +
 | 
| +
 | +
 | 
| +
 | 
| +
 | 
| +
 | 
| +
 | 
Method for fetching permissions from pubnub servers.
+This method provides a mechanism to reveal existing PubNub Access Manager attributes +for any combination of subscribe_key, channel and auth_key.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response +{
+++“message”:”Success”, +“payload”:{
++++
+- “channels”:{+
- +
+
+- “my_channel”:{+
- “auths”:{“my_ro_authkey”:{“r”:1,”w”:0}, +“my_rw_authkey”:{“r”:0,”w”:1}, +“my_admin_authkey”:{“r”:1,”w”:1}+
}
+}
+},
+
}
+Usage:
+++pubnub.audit (‘my_channel’); # Sync Mode
Method for decrypting data.
+This method takes ciphertext as input and returns decrypted data. +This need not be called directly as enncryption/decryption is +taken care of transparently by Pubnub class if cipher key is +provided at time of initializing pubnub object
+Method for encrypting data.
+This method takes plaintext as input and returns encrypted data. +This need not be called directly as enncryption/decryption is +taken care of transparently by Pubnub class if cipher key is +provided at time of initializing pubnub object
+Method for granting permissions.
+This function establishes subscribe and/or write permissions for +PubNub Access Manager (PAM) by setting the read or write attribute +to true. A grant with read or write set to false (or not included) +will revoke any previous grants with read or write set to true.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response: +{
+++“message”:”Success”, +“payload”:{
+++“ttl”:5, +“auths”:{
+++“my_ro_authkey”:{“r”:1,”w”:0}}, +“subscribe_key”:”my_subkey”, +“level”:”user”, +“channel”:”my_channel”
+}
+
}
+Get here now data.
+You can obtain information about the current state of a channel including +a list of unique user-ids currently subscribed to the channel and the total +occupancy count of the channel by calling the here_now() function in your +application.
+Sync Mode: list +Async Mode: None
+Response Format:
+The here_now() method returns a list of uuid s currently subscribed to the channel.
+uuids:[“String”,”String”, ... ,”String”] - List of UUIDs currently subscribed to the channel.
+occupancy: Number - Total current occupancy of the channel.
+Example Response: +{
+++occupancy: 4, +uuids: [
+++‘123123234t234f34fq3dq’, +‘143r34f34t34fq34q34q3’, +‘23f34d3f4rq34r34rq23q’, +‘w34tcw45t45tcw435tww3’,]
+
}
+This method fetches historical messages of a channel.
+PubNub Storage/Playback Service provides real-time access to an unlimited +history for all messages published to PubNub. Stored messages are replicated +across multiple availability zones in several geographical data center +locations. Stored messages can be encrypted with AES-256 message encryption +ensuring that they are not readable while stored on PubNub’s network.
+It is possible to control how messages are returned and in what order, +for example you can:
+++Return messages in the order newest to oldest (default behavior).
+Return messages in the order oldest to newest by setting reverse to true.
+Page through results by providing a start or end time token.
+Retrieve a “slice” of the time line by providing both a start and end time token.
+Limit the number of messages to a specific quantity using the count parameter.
+
Returns a list in sync mode i.e. when callback argument is not given
+Subscribe to presence data on a channel.
+++Only works in async mode
channel: Channel name ( string ) on which to publish message +callback: A callback method should be passed to the method.
+++If set, the api works in async mode. +Required argument when working with twisted or tornado .
Publishes data on a channel.
+The publish() method is used to send a message to all subscribers of a channel. +To publish a message you must first specify a valid publish_key at initialization. +A successfully published message is replicated across the PubNub Real-Time Network +and sent simultaneously to all subscribed clients on a channel.
+++Messages in transit can be secured from potential eavesdroppers with SSL/TLS by
setting ssl to True during initialization.
+Published messages can also be encrypted with AES-256 simply by specifying a cipher_key +during initialization.
+Sync Mode : list +Async Mode : None
+The function returns the following formatted response:
+++[ Number, “Status”, “Time Token”]
The output below demonstrates the response to a successful call:
+++[1,”Sent”,”13769558699541401”]
Method for revoking permissions.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response: +{
+++“message”:”Success”, +“payload”:{
+++“ttl”:5, +“auths”:{
+++“my_authkey”:{“r”:0,”w”:0}}, +“subscribe_key”:”my_subkey”, +“level”:”user”, +“channel”:”my_channel”
+}
+
}
+Subscribe to data on a channel.
+This function causes the client to create an open TCP socket to the +PubNub Real-Time Network and begin listening for messages on a specified channel. +To subscribe to a channel the client must send the appropriate subscribe_key at +initialization.
+Only works in async mode
+This function will return a 17 digit precision Unix epoch.
+Args:
++++
+- callback: (optional)+
- A callback method should be passed to the method. +If set, the api works in async mode. +Required argument when working with twisted or tornado .+
Returns a 17 digit number in sync mode i.e. when callback argument is not given
+channel: Channel name ( string ) on which to publish message +message: Message to be published ( String / int / double / dict / list ). +callback: A callback method should be passed to the method.
+++If set, the api works in async mode. +Required argument when working with twisted or tornado .
Method for fetching permissions from pubnub servers.
+This method provides a mechanism to reveal existing PubNub Access Manager attributes +for any combination of subscribe_key, channel and auth_key.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response +{
+++“message”:”Success”, +“payload”:{
++++
+- “channels”:{+
- +
+
+- “my_channel”:{+
- “auths”:{“my_ro_authkey”:{“r”:1,”w”:0}, +“my_rw_authkey”:{“r”:0,”w”:1}, +“my_admin_authkey”:{“r”:1,”w”:1}+
}
+}
+},
+
}
+Usage:
+++pubnub.audit (‘my_channel’); # Sync Mode
Method for decrypting data.
+This method takes ciphertext as input and returns decrypted data. +This need not be called directly as enncryption/decryption is +taken care of transparently by Pubnub class if cipher key is +provided at time of initializing pubnub object
+Method for encrypting data.
+This method takes plaintext as input and returns encrypted data. +This need not be called directly as enncryption/decryption is +taken care of transparently by Pubnub class if cipher key is +provided at time of initializing pubnub object
+Method for granting permissions.
+This function establishes subscribe and/or write permissions for +PubNub Access Manager (PAM) by setting the read or write attribute +to true. A grant with read or write set to false (or not included) +will revoke any previous grants with read or write set to true.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response: +{
+++“message”:”Success”, +“payload”:{
+++“ttl”:5, +“auths”:{
+++“my_ro_authkey”:{“r”:1,”w”:0}}, +“subscribe_key”:”my_subkey”, +“level”:”user”, +“channel”:”my_channel”
+}
+
}
+Get here now data.
+You can obtain information about the current state of a channel including +a list of unique user-ids currently subscribed to the channel and the total +occupancy count of the channel by calling the here_now() function in your +application.
+Sync Mode: list +Async Mode: None
+Response Format:
+The here_now() method returns a list of uuid s currently subscribed to the channel.
+uuids:[“String”,”String”, ... ,”String”] - List of UUIDs currently subscribed to the channel.
+occupancy: Number - Total current occupancy of the channel.
+Example Response: +{
+++occupancy: 4, +uuids: [
+++‘123123234t234f34fq3dq’, +‘143r34f34t34fq34q34q3’, +‘23f34d3f4rq34r34rq23q’, +‘w34tcw45t45tcw435tww3’,]
+
}
+This method fetches historical messages of a channel.
+PubNub Storage/Playback Service provides real-time access to an unlimited +history for all messages published to PubNub. Stored messages are replicated +across multiple availability zones in several geographical data center +locations. Stored messages can be encrypted with AES-256 message encryption +ensuring that they are not readable while stored on PubNub’s network.
+It is possible to control how messages are returned and in what order, +for example you can:
+++Return messages in the order newest to oldest (default behavior).
+Return messages in the order oldest to newest by setting reverse to true.
+Page through results by providing a start or end time token.
+Retrieve a “slice” of the time line by providing both a start and end time token.
+Limit the number of messages to a specific quantity using the count parameter.
+
Returns a list in sync mode i.e. when callback argument is not given
+Subscribe to presence data on a channel.
+++Only works in async mode
channel: Channel name ( string ) on which to publish message +callback: A callback method should be passed to the method.
+++If set, the api works in async mode. +Required argument when working with twisted or tornado .
Publishes data on a channel.
+The publish() method is used to send a message to all subscribers of a channel. +To publish a message you must first specify a valid publish_key at initialization. +A successfully published message is replicated across the PubNub Real-Time Network +and sent simultaneously to all subscribed clients on a channel.
+++Messages in transit can be secured from potential eavesdroppers with SSL/TLS by
setting ssl to True during initialization.
+Published messages can also be encrypted with AES-256 simply by specifying a cipher_key +during initialization.
+Sync Mode : list +Async Mode : None
+The function returns the following formatted response:
+++[ Number, “Status”, “Time Token”]
The output below demonstrates the response to a successful call:
+++[1,”Sent”,”13769558699541401”]
Method for revoking permissions.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response: +{
+++“message”:”Success”, +“payload”:{
+++“ttl”:5, +“auths”:{
+++“my_authkey”:{“r”:0,”w”:0}}, +“subscribe_key”:”my_subkey”, +“level”:”user”, +“channel”:”my_channel”
+}
+
}
+Subscribe to data on a channel.
+This function causes the client to create an open TCP socket to the +PubNub Real-Time Network and begin listening for messages on a specified channel. +To subscribe to a channel the client must send the appropriate subscribe_key at +initialization.
+Only works in async mode
+This function will return a 17 digit precision Unix epoch.
+Args:
++++
+- callback: (optional)+
- A callback method should be passed to the method. +If set, the api works in async mode. +Required argument when working with twisted or tornado .+
Returns a 17 digit number in sync mode i.e. when callback argument is not given
+channel: Channel name ( string ) on which to publish message +message: Message to be published ( String / int / double / dict / list ). +callback: A callback method should be passed to the method.
+++If set, the api works in async mode. +Required argument when working with twisted or tornado .
Method for fetching permissions from pubnub servers.
+This method provides a mechanism to reveal existing PubNub Access Manager attributes +for any combination of subscribe_key, channel and auth_key.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response +{
+++“message”:”Success”, +“payload”:{
++++
+- “channels”:{+
- +
+
+- “my_channel”:{+
- “auths”:{“my_ro_authkey”:{“r”:1,”w”:0}, +“my_rw_authkey”:{“r”:0,”w”:1}, +“my_admin_authkey”:{“r”:1,”w”:1}+
}
+}
+},
+
}
+Usage:
+++pubnub.audit (‘my_channel’); # Sync Mode
Method for decrypting data.
+This method takes ciphertext as input and returns decrypted data. +This need not be called directly as enncryption/decryption is +taken care of transparently by Pubnub class if cipher key is +provided at time of initializing pubnub object
+Method for encrypting data.
+This method takes plaintext as input and returns encrypted data. +This need not be called directly as enncryption/decryption is +taken care of transparently by Pubnub class if cipher key is +provided at time of initializing pubnub object
+Method for granting permissions.
+This function establishes subscribe and/or write permissions for +PubNub Access Manager (PAM) by setting the read or write attribute +to true. A grant with read or write set to false (or not included) +will revoke any previous grants with read or write set to true.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response: +{
+++“message”:”Success”, +“payload”:{
+++“ttl”:5, +“auths”:{
+++“my_ro_authkey”:{“r”:1,”w”:0}}, +“subscribe_key”:”my_subkey”, +“level”:”user”, +“channel”:”my_channel”
+}
+
}
+Get here now data.
+You can obtain information about the current state of a channel including +a list of unique user-ids currently subscribed to the channel and the total +occupancy count of the channel by calling the here_now() function in your +application.
+Sync Mode: list +Async Mode: None
+Response Format:
+The here_now() method returns a list of uuid s currently subscribed to the channel.
+uuids:[“String”,”String”, ... ,”String”] - List of UUIDs currently subscribed to the channel.
+occupancy: Number - Total current occupancy of the channel.
+Example Response: +{
+++occupancy: 4, +uuids: [
+++‘123123234t234f34fq3dq’, +‘143r34f34t34fq34q34q3’, +‘23f34d3f4rq34r34rq23q’, +‘w34tcw45t45tcw435tww3’,]
+
}
+This method fetches historical messages of a channel.
+PubNub Storage/Playback Service provides real-time access to an unlimited +history for all messages published to PubNub. Stored messages are replicated +across multiple availability zones in several geographical data center +locations. Stored messages can be encrypted with AES-256 message encryption +ensuring that they are not readable while stored on PubNub’s network.
+It is possible to control how messages are returned and in what order, +for example you can:
+++Return messages in the order newest to oldest (default behavior).
+Return messages in the order oldest to newest by setting reverse to true.
+Page through results by providing a start or end time token.
+Retrieve a “slice” of the time line by providing both a start and end time token.
+Limit the number of messages to a specific quantity using the count parameter.
+
Returns a list in sync mode i.e. when callback argument is not given
+Subscribe to presence data on a channel.
+++Only works in async mode
channel: Channel name ( string ) on which to publish message +callback: A callback method should be passed to the method.
+++If set, the api works in async mode. +Required argument when working with twisted or tornado .
Publishes data on a channel.
+The publish() method is used to send a message to all subscribers of a channel. +To publish a message you must first specify a valid publish_key at initialization. +A successfully published message is replicated across the PubNub Real-Time Network +and sent simultaneously to all subscribed clients on a channel.
+++Messages in transit can be secured from potential eavesdroppers with SSL/TLS by
setting ssl to True during initialization.
+Published messages can also be encrypted with AES-256 simply by specifying a cipher_key +during initialization.
+Sync Mode : list +Async Mode : None
+The function returns the following formatted response:
+++[ Number, “Status”, “Time Token”]
The output below demonstrates the response to a successful call:
+++[1,”Sent”,”13769558699541401”]
Method for revoking permissions.
+Returns a dict in sync mode i.e. when callback argument is not given +The dict returned contains values with keys ‘message’ and ‘payload’
+Sample Response: +{
+++“message”:”Success”, +“payload”:{
+++“ttl”:5, +“auths”:{
+++“my_authkey”:{“r”:0,”w”:0}}, +“subscribe_key”:”my_subkey”, +“level”:”user”, +“channel”:”my_channel”
+}
+
}
+Subscribe to data on a channel.
+This function causes the client to create an open TCP socket to the +PubNub Real-Time Network and begin listening for messages on a specified channel. +To subscribe to a channel the client must send the appropriate subscribe_key at +initialization.
+Only works in async mode
+This function will return a 17 digit precision Unix epoch.
+Args:
++++
+- callback: (optional)+
- A callback method should be passed to the method. +If set, the api works in async mode. +Required argument when working with twisted or tornado .+
Returns a 17 digit number in sync mode i.e. when callback argument is not given
+channel: Channel name ( string ) on which to publish message +message: Message to be published ( String / int / double / dict / list ). +callback: A callback method should be passed to the method.
+++If set, the api works in async mode. +Required argument when working with twisted or tornado .
+ Please activate JavaScript to enable the search + functionality. +
++ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +
+ + +