From 2220c964e7ab03ad15ef7bef942c68038daaa19d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Thu, 14 Nov 2013 11:09:55 +0100 Subject: [PATCH 01/18] Drop epydoc and setup initial Sphinx framework --- DEVELOPER.md | 6 +- MANIFEST.in | 1 - apidocs/html/api-objects.txt | 90 -- apidocs/html/class-tree.html | 139 --- apidocs/html/crarr.png | Bin 340 -> 0 bytes apidocs/html/epydoc.css | 322 ------- apidocs/html/epydoc.js | 293 ------ apidocs/html/frames.html | 17 - apidocs/html/help.html | 276 ------ apidocs/html/identifier-index.html | 489 ---------- apidocs/html/index.html | 17 - apidocs/html/module-tree.html | 119 --- apidocs/html/pygeoip-module.html | 218 ----- apidocs/html/pygeoip-pysrc.html | 785 ---------------- apidocs/html/pygeoip.GeoIP-class.html | 825 ---------------- apidocs/html/pygeoip.GeoIPError-class.html | 179 ---- .../html/pygeoip._GeoIPMetaclass-class.html | 245 ----- apidocs/html/pygeoip.const-module.html | 646 ------------- apidocs/html/pygeoip.const-pysrc.html | 555 ----------- apidocs/html/pygeoip.timezone-module.html | 266 ------ apidocs/html/pygeoip.timezone-pysrc.html | 883 ------------------ apidocs/html/pygeoip.util-module.html | 210 ----- apidocs/html/pygeoip.util-pysrc.html | 156 ---- apidocs/html/redirect.html | 38 - apidocs/html/toc-everything.html | 88 -- apidocs/html/toc-pygeoip-module.html | 36 - apidocs/html/toc-pygeoip.const-module.html | 74 -- apidocs/html/toc-pygeoip.timezone-module.html | 32 - apidocs/html/toc-pygeoip.util-module.html | 31 - apidocs/html/toc.html | 34 - build.sh | 3 +- docs/Makefile | 177 ++++ docs/_build/doctrees/environment.pickle | Bin 0 -> 4093 bytes docs/_build/doctrees/index.doctree | Bin 0 -> 6088 bytes docs/_build/html/.buildinfo | 4 + docs/_build/html/_sources/index.txt | 22 + docs/_build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes docs/_build/html/_static/basic.css | 540 +++++++++++ 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 | 235 +++++ 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/nature.css | 245 +++++ 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 | 92 ++ docs/_build/html/index.html | 111 +++ docs/_build/html/objects.inv | Bin 0 -> 205 bytes docs/_build/html/search.html | 99 ++ docs/_build/html/searchindex.js | 1 + docs/conf.py | 259 +++++ docs/index.txt | 22 + epydoc.ini | 6 - 65 files changed, 3749 insertions(+), 7077 deletions(-) delete mode 100644 apidocs/html/api-objects.txt delete mode 100644 apidocs/html/class-tree.html delete mode 100644 apidocs/html/crarr.png delete mode 100644 apidocs/html/epydoc.css delete mode 100644 apidocs/html/epydoc.js delete mode 100644 apidocs/html/frames.html delete mode 100644 apidocs/html/help.html delete mode 100644 apidocs/html/identifier-index.html delete mode 100644 apidocs/html/index.html delete mode 100644 apidocs/html/module-tree.html delete mode 100644 apidocs/html/pygeoip-module.html delete mode 100644 apidocs/html/pygeoip-pysrc.html delete mode 100644 apidocs/html/pygeoip.GeoIP-class.html delete mode 100644 apidocs/html/pygeoip.GeoIPError-class.html delete mode 100644 apidocs/html/pygeoip._GeoIPMetaclass-class.html delete mode 100644 apidocs/html/pygeoip.const-module.html delete mode 100644 apidocs/html/pygeoip.const-pysrc.html delete mode 100644 apidocs/html/pygeoip.timezone-module.html delete mode 100644 apidocs/html/pygeoip.timezone-pysrc.html delete mode 100644 apidocs/html/pygeoip.util-module.html delete mode 100644 apidocs/html/pygeoip.util-pysrc.html delete mode 100644 apidocs/html/redirect.html delete mode 100644 apidocs/html/toc-everything.html delete mode 100644 apidocs/html/toc-pygeoip-module.html delete mode 100644 apidocs/html/toc-pygeoip.const-module.html delete mode 100644 apidocs/html/toc-pygeoip.timezone-module.html delete mode 100644 apidocs/html/toc-pygeoip.util-module.html delete mode 100644 apidocs/html/toc.html create mode 100644 docs/Makefile create mode 100644 docs/_build/doctrees/environment.pickle create mode 100644 docs/_build/doctrees/index.doctree 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/nature.css 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/search.html create mode 100644 docs/_build/html/searchindex.js create mode 100644 docs/conf.py create mode 100644 docs/index.txt delete mode 100644 epydoc.ini diff --git a/DEVELOPER.md b/DEVELOPER.md index df8b6f6..f0ab57c 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -1,5 +1,5 @@ # Bootstrap manual for developers -_Dependencies: tox, nose, epydoc_ +_Dependencies: tox, nose_ ### Testing @@ -20,10 +20,6 @@ This requires a machine with Python 2.5 - 3.3 installed and all dependencies men ### Documentation -The documentation can be re-generated by running epydoc from repository root. - - epydoc --config=epydoc.ini --no-private - For converting Markdown to reStructuredText used by PyPi we use pandoc. [Read pandoc's install instructions](http://johnmacfarlane.net/pandoc/installing.html). diff --git a/MANIFEST.in b/MANIFEST.in index cf11473..b18eecd 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,5 +4,4 @@ include README.rst include LICENSE.md include DEVELOPER.md include CHANGELOG.md -include epydoc.ini include tox.ini diff --git a/apidocs/html/api-objects.txt b/apidocs/html/api-objects.txt deleted file mode 100644 index 28c602d..0000000 --- a/apidocs/html/api-objects.txt +++ /dev/null @@ -1,90 +0,0 @@ -pygeoip pygeoip-module.html -pygeoip.ENCODING pygeoip-module.html#ENCODING -pygeoip.time_zone_by_country_and_region pygeoip.timezone-module.html#time_zone_by_country_and_region -pygeoip.__package__ pygeoip-module.html#__package__ -pygeoip.STANDARD pygeoip-module.html#STANDARD -pygeoip.MMAP_CACHE pygeoip-module.html#MMAP_CACHE -pygeoip.MEMORY_CACHE pygeoip-module.html#MEMORY_CACHE -pygeoip.const pygeoip.const-module.html -pygeoip.const.GEOIP_STANDARD pygeoip.const-module.html#GEOIP_STANDARD -pygeoip.const.ENCODING pygeoip.const-module.html#ENCODING -pygeoip.const.COUNTRY_CODES3 pygeoip.const-module.html#COUNTRY_CODES3 -pygeoip.const.PY3 pygeoip.const-module.html#PY3 -pygeoip.const.IPV6_EDITIONS pygeoip.const-module.html#IPV6_EDITIONS -pygeoip.const.ORG_EDITION pygeoip.const-module.html#ORG_EDITION -pygeoip.const.CITY_EDITION_REV1_V6 pygeoip.const-module.html#CITY_EDITION_REV1_V6 -pygeoip.const.CONTINENT_NAMES pygeoip.const-module.html#CONTINENT_NAMES -pygeoip.const.STRUCTURE_INFO_MAX_SIZE pygeoip.const-module.html#STRUCTURE_INFO_MAX_SIZE -pygeoip.const.COUNTRY_NAMES pygeoip.const-module.html#COUNTRY_NAMES -pygeoip.const.REGION_EDITION_REV0 pygeoip.const-module.html#REGION_EDITION_REV0 -pygeoip.const.REGION_EDITION_REV1 pygeoip.const-module.html#REGION_EDITION_REV1 -pygeoip.const.CANADA_OFFSET pygeoip.const-module.html#CANADA_OFFSET -pygeoip.const.MAX_ORG_RECORD_LENGTH pygeoip.const-module.html#MAX_ORG_RECORD_LENGTH -pygeoip.const.CITY_EDITIONS pygeoip.const-module.html#CITY_EDITIONS -pygeoip.const.__package__ pygeoip.const-module.html#__package__ -pygeoip.const.ASNUM_EDITION pygeoip.const-module.html#ASNUM_EDITION -pygeoip.const.CITY_EDITION_REV0 pygeoip.const-module.html#CITY_EDITION_REV0 -pygeoip.const.STATE_BEGIN_REV1 pygeoip.const-module.html#STATE_BEGIN_REV1 -pygeoip.const.STATE_BEGIN_REV0 pygeoip.const-module.html#STATE_BEGIN_REV0 -pygeoip.const.FULL_RECORD_LENGTH pygeoip.const-module.html#FULL_RECORD_LENGTH -pygeoip.const.COUNTRY_EDITION_V6 pygeoip.const-module.html#COUNTRY_EDITION_V6 -pygeoip.const.ISP_EDITION pygeoip.const-module.html#ISP_EDITION -pygeoip.const.NETSPEED_EDITION pygeoip.const-module.html#NETSPEED_EDITION -pygeoip.const.PY2 pygeoip.const-module.html#PY2 -pygeoip.const.WORLD_OFFSET pygeoip.const-module.html#WORLD_OFFSET -pygeoip.const.CITY_EDITION_REV1 pygeoip.const-module.html#CITY_EDITION_REV1 -pygeoip.const.DATABASE_INFO_MAX_SIZE pygeoip.const-module.html#DATABASE_INFO_MAX_SIZE -pygeoip.const.ASNUM_EDITION_V6 pygeoip.const-module.html#ASNUM_EDITION_V6 -pygeoip.const.ORG_RECORD_LENGTH pygeoip.const-module.html#ORG_RECORD_LENGTH -pygeoip.const.COUNTRY_BEGIN pygeoip.const-module.html#COUNTRY_BEGIN -pygeoip.const.PROXY_EDITION pygeoip.const-module.html#PROXY_EDITION -pygeoip.const.STANDARD pygeoip.const-module.html#STANDARD -pygeoip.const.REGION_EDITIONS pygeoip.const-module.html#REGION_EDITIONS -pygeoip.const.FIPS_RANGE pygeoip.const-module.html#FIPS_RANGE -pygeoip.const.SEGMENT_RECORD_LENGTH pygeoip.const-module.html#SEGMENT_RECORD_LENGTH -pygeoip.const.COUNTRY_EDITION pygeoip.const-module.html#COUNTRY_EDITION -pygeoip.const.US_OFFSET pygeoip.const-module.html#US_OFFSET -pygeoip.const.STANDARD_RECORD_LENGTH pygeoip.const-module.html#STANDARD_RECORD_LENGTH -pygeoip.const.MMAP_CACHE pygeoip.const-module.html#MMAP_CACHE -pygeoip.const.DMA_MAP pygeoip.const-module.html#DMA_MAP -pygeoip.const.COUNTRY_CODES pygeoip.const-module.html#COUNTRY_CODES -pygeoip.const.GEOIP_MEMORY_CACHE pygeoip.const-module.html#GEOIP_MEMORY_CACHE -pygeoip.const.REGION_CITY_EDITIONS pygeoip.const-module.html#REGION_CITY_EDITIONS -pygeoip.const.MEMORY_CACHE pygeoip.const-module.html#MEMORY_CACHE -pygeoip.const.MAX_RECORD_LENGTH pygeoip.const-module.html#MAX_RECORD_LENGTH -pygeoip.timezone pygeoip.timezone-module.html -pygeoip.timezone.country_dict pygeoip.timezone-module.html#country_dict -pygeoip.timezone.time_zone_by_country_and_region pygeoip.timezone-module.html#time_zone_by_country_and_region -pygeoip.timezone.__package__ pygeoip.timezone-module.html#__package__ -pygeoip.util pygeoip.util-module.html -pygeoip.util.ip2long pygeoip.util-module.html#ip2long -pygeoip.util.__package__ pygeoip.util-module.html#__package__ -pygeoip.GeoIP pygeoip.GeoIP-class.html -pygeoip.GeoIP.country_code_by_addr pygeoip.GeoIP-class.html#country_code_by_addr -pygeoip.GeoIP.__metaclass__ pygeoip._GeoIPMetaclass-class.html -pygeoip.GeoIP.record_by_name pygeoip.GeoIP-class.html#record_by_name -pygeoip.GeoIP._setup_segments pygeoip.GeoIP-class.html#_setup_segments -pygeoip.GeoIP._seek_country pygeoip.GeoIP-class.html#_seek_country -pygeoip.GeoIP.region_by_name pygeoip.GeoIP-class.html#region_by_name -pygeoip.GeoIP.__init__ pygeoip.GeoIP-class.html#__init__ -pygeoip.GeoIP.time_zone_by_name pygeoip.GeoIP-class.html#time_zone_by_name -pygeoip.GeoIP._get_region pygeoip.GeoIP-class.html#_get_region -pygeoip.GeoIP.country_code_by_name pygeoip.GeoIP-class.html#country_code_by_name -pygeoip.GeoIP._get_org pygeoip.GeoIP-class.html#_get_org -pygeoip.GeoIP._str_to_fp pygeoip.GeoIP-class.html#_str_to_fp -pygeoip.GeoIP.last_netmask pygeoip.GeoIP-class.html#last_netmask -pygeoip.GeoIP.time_zone_by_addr pygeoip.GeoIP-class.html#time_zone_by_addr -pygeoip.GeoIP._id_by_addr pygeoip.GeoIP-class.html#_id_by_addr -pygeoip.GeoIP._get_record pygeoip.GeoIP-class.html#_get_record -pygeoip.GeoIP.org_by_addr pygeoip.GeoIP-class.html#org_by_addr -pygeoip.GeoIP.region_by_addr pygeoip.GeoIP-class.html#region_by_addr -pygeoip.GeoIP.record_by_addr pygeoip.GeoIP-class.html#record_by_addr -pygeoip.GeoIP._gethostbyname pygeoip.GeoIP-class.html#_gethostbyname -pygeoip.GeoIP.country_name_by_addr pygeoip.GeoIP-class.html#country_name_by_addr -pygeoip.GeoIP.org_by_name pygeoip.GeoIP-class.html#org_by_name -pygeoip.GeoIP.country_name_by_name pygeoip.GeoIP-class.html#country_name_by_name -pygeoip.GeoIPError pygeoip.GeoIPError-class.html -pygeoip._GeoIPMetaclass pygeoip._GeoIPMetaclass-class.html -pygeoip._GeoIPMetaclass._instances pygeoip._GeoIPMetaclass-class.html#_instances -pygeoip._GeoIPMetaclass.__call__ pygeoip._GeoIPMetaclass-class.html#__call__ -pygeoip._GeoIPMetaclass._instance_lock pygeoip._GeoIPMetaclass-class.html#_instance_lock diff --git a/apidocs/html/class-tree.html b/apidocs/html/class-tree.html deleted file mode 100644 index 60a9ad2..0000000 --- a/apidocs/html/class-tree.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - Class Hierarchy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - -
[frames] | no frames]
-
-
- [ Module Hierarchy - | Class Hierarchy ] -

-

Class Hierarchy

- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/crarr.png b/apidocs/html/crarr.png deleted file mode 100644 index 26b43c52433b71e72a9a478c52d446278335f0e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^f?NMQuI$%1#8??M1uoZK z0}62#ctjR6FvuMOVaB`*rFK9;mUKs7M+SzC{oH>NS%G}l0G|-o|NsA=J-p%i`2!7U zCdJ_j4{u-SDsoA1U`TRixpVcz%O`iHHAYk?=&YaLkmD!Pp6~GW^M_S4D^grJKD>P~ zuPf!ku`N^TLavn`Edv_JSQ6wH%;50sMjDXg>*?YcQgJIe!GUqln>_|<+Os&OOUQS1 zY~Wzutud*iVS#|PHMc&?2WHoZpEo8l+6!Oc$x~=%U)469Gl^f?nq7UBw#1AXkrEde cmFKWBXcRFE*(?@T0vgQV>FVdQ&MBb@0LpZ4r2qf` diff --git a/apidocs/html/epydoc.css b/apidocs/html/epydoc.css deleted file mode 100644 index 86d4170..0000000 --- a/apidocs/html/epydoc.css +++ /dev/null @@ -1,322 +0,0 @@ - - -/* Epydoc CSS Stylesheet - * - * This stylesheet can be used to customize the appearance of epydoc's - * HTML output. - * - */ - -/* Default Colors & Styles - * - Set the default foreground & background color with 'body'; and - * link colors with 'a:link' and 'a:visited'. - * - Use bold for decision list terms. - * - The heading styles defined here are used for headings *within* - * docstring descriptions. All headings used by epydoc itself use - * either class='epydoc' or class='toc' (CSS styles for both - * defined below). - */ -body { background: #ffffff; color: #000000; } -p { margin-top: 0.5em; margin-bottom: 0.5em; } -a:link { color: #0000ff; } -a:visited { color: #204080; } -dt { font-weight: bold; } -h1 { font-size: +140%; font-style: italic; - font-weight: bold; } -h2 { font-size: +125%; font-style: italic; - font-weight: bold; } -h3 { font-size: +110%; font-style: italic; - font-weight: normal; } -code { font-size: 100%; } -/* N.B.: class, not pseudoclass */ -a.link { font-family: monospace; } - -/* Page Header & Footer - * - The standard page header consists of a navigation bar (with - * pointers to standard pages such as 'home' and 'trees'); a - * breadcrumbs list, which can be used to navigate to containing - * classes or modules; options links, to show/hide private - * variables and to show/hide frames; and a page title (using - *

). The page title may be followed by a link to the - * corresponding source code (using 'span.codelink'). - * - The footer consists of a navigation bar, a timestamp, and a - * pointer to epydoc's homepage. - */ -h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } -h2.epydoc { font-size: +130%; font-weight: bold; } -h3.epydoc { font-size: +115%; font-weight: bold; - margin-top: 0.2em; } -td h3.epydoc { font-size: +115%; font-weight: bold; - margin-bottom: 0; } -table.navbar { background: #a0c0ff; color: #000000; - border: 2px groove #c0d0d0; } -table.navbar table { color: #000000; } -th.navbar-select { background: #70b0ff; - color: #000000; } -table.navbar a { text-decoration: none; } -table.navbar a:link { color: #0000ff; } -table.navbar a:visited { color: #204080; } -span.breadcrumbs { font-size: 85%; font-weight: bold; } -span.options { font-size: 70%; } -span.codelink { font-size: 85%; } -td.footer { font-size: 85%; } - -/* Table Headers - * - Each summary table and details section begins with a 'header' - * row. This row contains a section title (marked by - * 'span.table-header') as well as a show/hide private link - * (marked by 'span.options', defined above). - * - Summary tables that contain user-defined groups mark those - * groups using 'group header' rows. - */ -td.table-header { background: #70b0ff; color: #000000; - border: 1px solid #608090; } -td.table-header table { color: #000000; } -td.table-header table a:link { color: #0000ff; } -td.table-header table a:visited { color: #204080; } -span.table-header { font-size: 120%; font-weight: bold; } -th.group-header { background: #c0e0f8; color: #000000; - text-align: left; font-style: italic; - font-size: 115%; - border: 1px solid #608090; } - -/* Summary Tables (functions, variables, etc) - * - Each object is described by a single row of the table with - * two cells. The left cell gives the object's type, and is - * marked with 'code.summary-type'. The right cell gives the - * object's name and a summary description. - * - CSS styles for the table's header and group headers are - * defined above, under 'Table Headers' - */ -table.summary { border-collapse: collapse; - background: #e8f0f8; color: #000000; - border: 1px solid #608090; - margin-bottom: 0.5em; } -td.summary { border: 1px solid #608090; } -code.summary-type { font-size: 85%; } -table.summary a:link { color: #0000ff; } -table.summary a:visited { color: #204080; } - - -/* Details Tables (functions, variables, etc) - * - Each object is described in its own div. - * - A single-row summary table w/ table-header is used as - * a header for each details section (CSS style for table-header - * is defined above, under 'Table Headers'). - */ -table.details { border-collapse: collapse; - background: #e8f0f8; color: #000000; - border: 1px solid #608090; - margin: .2em 0 0 0; } -table.details table { color: #000000; } -table.details a:link { color: #0000ff; } -table.details a:visited { color: #204080; } - -/* Fields */ -dl.fields { margin-left: 2em; margin-top: 1em; - margin-bottom: 1em; } -dl.fields dd ul { margin-left: 0em; padding-left: 0em; } -dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } -div.fields { margin-left: 2em; } -div.fields p { margin-bottom: 0.5em; } - -/* Index tables (identifier index, term index, etc) - * - link-index is used for indices containing lists of links - * (namely, the identifier index & term index). - * - index-where is used in link indices for the text indicating - * the container/source for each link. - * - metadata-index is used for indices containing metadata - * extracted from fields (namely, the bug index & todo index). - */ -table.link-index { border-collapse: collapse; - background: #e8f0f8; color: #000000; - border: 1px solid #608090; } -td.link-index { border-width: 0px; } -table.link-index a:link { color: #0000ff; } -table.link-index a:visited { color: #204080; } -span.index-where { font-size: 70%; } -table.metadata-index { border-collapse: collapse; - background: #e8f0f8; color: #000000; - border: 1px solid #608090; - margin: .2em 0 0 0; } -td.metadata-index { border-width: 1px; border-style: solid; } -table.metadata-index a:link { color: #0000ff; } -table.metadata-index a:visited { color: #204080; } - -/* Function signatures - * - sig* is used for the signature in the details section. - * - .summary-sig* is used for the signature in the summary - * table, and when listing property accessor functions. - * */ -.sig-name { color: #006080; } -.sig-arg { color: #008060; } -.sig-default { color: #602000; } -.summary-sig { font-family: monospace; } -.summary-sig-name { color: #006080; font-weight: bold; } -table.summary a.summary-sig-name:link - { color: #006080; font-weight: bold; } -table.summary a.summary-sig-name:visited - { color: #006080; font-weight: bold; } -.summary-sig-arg { color: #006040; } -.summary-sig-default { color: #501800; } - -/* Subclass list - */ -ul.subclass-list { display: inline; } -ul.subclass-list li { display: inline; } - -/* To render variables, classes etc. like functions */ -table.summary .summary-name { color: #006080; font-weight: bold; - font-family: monospace; } -table.summary - a.summary-name:link { color: #006080; font-weight: bold; - font-family: monospace; } -table.summary - a.summary-name:visited { color: #006080; font-weight: bold; - font-family: monospace; } - -/* Variable values - * - In the 'variable details' sections, each varaible's value is - * listed in a 'pre.variable' box. The width of this box is - * restricted to 80 chars; if the value's repr is longer than - * this it will be wrapped, using a backslash marked with - * class 'variable-linewrap'. If the value's repr is longer - * than 3 lines, the rest will be ellided; and an ellipsis - * marker ('...' marked with 'variable-ellipsis') will be used. - * - If the value is a string, its quote marks will be marked - * with 'variable-quote'. - * - If the variable is a regexp, it is syntax-highlighted using - * the re* CSS classes. - */ -pre.variable { padding: .5em; margin: 0; - background: #dce4ec; color: #000000; - border: 1px solid #708890; } -.variable-linewrap { color: #604000; font-weight: bold; } -.variable-ellipsis { color: #604000; font-weight: bold; } -.variable-quote { color: #604000; font-weight: bold; } -.variable-group { color: #008000; font-weight: bold; } -.variable-op { color: #604000; font-weight: bold; } -.variable-string { color: #006030; } -.variable-unknown { color: #a00000; font-weight: bold; } -.re { color: #000000; } -.re-char { color: #006030; } -.re-op { color: #600000; } -.re-group { color: #003060; } -.re-ref { color: #404040; } - -/* Base tree - * - Used by class pages to display the base class hierarchy. - */ -pre.base-tree { font-size: 80%; margin: 0; } - -/* Frames-based table of contents headers - * - Consists of two frames: one for selecting modules; and - * the other listing the contents of the selected module. - * - h1.toc is used for each frame's heading - * - h2.toc is used for subheadings within each frame. - */ -h1.toc { text-align: center; font-size: 105%; - margin: 0; font-weight: bold; - padding: 0; } -h2.toc { font-size: 100%; font-weight: bold; - margin: 0.5em 0 0 -0.3em; } - -/* Syntax Highlighting for Source Code - * - doctest examples are displayed in a 'pre.py-doctest' block. - * If the example is in a details table entry, then it will use - * the colors specified by the 'table pre.py-doctest' line. - * - Source code listings are displayed in a 'pre.py-src' block. - * Each line is marked with 'span.py-line' (used to draw a line - * down the left margin, separating the code from the line - * numbers). Line numbers are displayed with 'span.py-lineno'. - * The expand/collapse block toggle button is displayed with - * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not - * modify the font size of the text.) - * - If a source code page is opened with an anchor, then the - * corresponding code block will be highlighted. The code - * block's header is highlighted with 'py-highlight-hdr'; and - * the code block's body is highlighted with 'py-highlight'. - * - The remaining py-* classes are used to perform syntax - * highlighting (py-string for string literals, py-name for names, - * etc.) - */ -pre.py-doctest { padding: .5em; margin: 1em; - background: #e8f0f8; color: #000000; - border: 1px solid #708890; } -table pre.py-doctest { background: #dce4ec; - color: #000000; } -pre.py-src { border: 2px solid #000000; - background: #f0f0f0; color: #000000; } -.py-line { border-left: 2px solid #000000; - margin-left: .2em; padding-left: .4em; } -.py-lineno { font-style: italic; font-size: 90%; - padding-left: .5em; } -a.py-toggle { text-decoration: none; } -div.py-highlight-hdr { border-top: 2px solid #000000; - border-bottom: 2px solid #000000; - background: #d8e8e8; } -div.py-highlight { border-bottom: 2px solid #000000; - background: #d0e0e0; } -.py-prompt { color: #005050; font-weight: bold;} -.py-more { color: #005050; font-weight: bold;} -.py-string { color: #006030; } -.py-comment { color: #003060; } -.py-keyword { color: #600000; } -.py-output { color: #404040; } -.py-name { color: #000050; } -.py-name:link { color: #000050 !important; } -.py-name:visited { color: #000050 !important; } -.py-number { color: #005000; } -.py-defname { color: #000060; font-weight: bold; } -.py-def-name { color: #000060; font-weight: bold; } -.py-base-class { color: #000060; } -.py-param { color: #000060; } -.py-docstring { color: #006030; } -.py-decorator { color: #804020; } -/* Use this if you don't want links to names underlined: */ -/*a.py-name { text-decoration: none; }*/ - -/* Graphs & Diagrams - * - These CSS styles are used for graphs & diagrams generated using - * Graphviz dot. 'img.graph-without-title' is used for bare - * diagrams (to remove the border created by making the image - * clickable). - */ -img.graph-without-title { border: none; } -img.graph-with-title { border: 1px solid #000000; } -span.graph-title { font-weight: bold; } -span.graph-caption { } - -/* General-purpose classes - * - 'p.indent-wrapped-lines' defines a paragraph whose first line - * is not indented, but whose subsequent lines are. - * - The 'nomargin-top' class is used to remove the top margin (e.g. - * from lists). The 'nomargin' class is used to remove both the - * top and bottom margin (but not the left or right margin -- - * for lists, that would cause the bullets to disappear.) - */ -p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; - margin: 0; } -.nomargin-top { margin-top: 0; } -.nomargin { margin-top: 0; margin-bottom: 0; } - -/* HTML Log */ -div.log-block { padding: 0; margin: .5em 0 .5em 0; - background: #e8f0f8; color: #000000; - border: 1px solid #000000; } -div.log-error { padding: .1em .3em .1em .3em; margin: 4px; - background: #ffb0b0; color: #000000; - border: 1px solid #000000; } -div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; - background: #ffffb0; color: #000000; - border: 1px solid #000000; } -div.log-info { padding: .1em .3em .1em .3em; margin: 4px; - background: #b0ffb0; color: #000000; - border: 1px solid #000000; } -h2.log-hdr { background: #70b0ff; color: #000000; - margin: 0; padding: 0em 0.5em 0em 0.5em; - border-bottom: 1px solid #000000; font-size: 110%; } -p.log { font-weight: bold; margin: .5em 0 .5em 0; } -tr.opt-changed { color: #000000; font-weight: bold; } -tr.opt-default { color: #606060; } -pre.log { margin: 0; padding: 0; padding-left: 1em; } diff --git a/apidocs/html/epydoc.js b/apidocs/html/epydoc.js deleted file mode 100644 index e787dbc..0000000 --- a/apidocs/html/epydoc.js +++ /dev/null @@ -1,293 +0,0 @@ -function toggle_private() { - // Search for any private/public links on this page. Store - // their old text in "cmd," so we will know what action to - // take; and change their text to the opposite action. - var cmd = "?"; - var elts = document.getElementsByTagName("a"); - for(var i=0; i...
"; - elt.innerHTML = s; - } -} - -function toggle(id) { - elt = document.getElementById(id+"-toggle"); - if (elt.innerHTML == "-") - collapse(id); - else - expand(id); - return false; -} - -function highlight(id) { - var elt = document.getElementById(id+"-def"); - if (elt) elt.className = "py-highlight-hdr"; - var elt = document.getElementById(id+"-expanded"); - if (elt) elt.className = "py-highlight"; - var elt = document.getElementById(id+"-collapsed"); - if (elt) elt.className = "py-highlight"; -} - -function num_lines(s) { - var n = 1; - var pos = s.indexOf("\n"); - while ( pos > 0) { - n += 1; - pos = s.indexOf("\n", pos+1); - } - return n; -} - -// Collapse all blocks that mave more than `min_lines` lines. -function collapse_all(min_lines) { - var elts = document.getElementsByTagName("div"); - for (var i=0; i 0) - if (elt.id.substring(split, elt.id.length) == "-expanded") - if (num_lines(elt.innerHTML) > min_lines) - collapse(elt.id.substring(0, split)); - } -} - -function expandto(href) { - var start = href.indexOf("#")+1; - if (start != 0 && start != href.length) { - if (href.substring(start, href.length) != "-") { - collapse_all(4); - pos = href.indexOf(".", start); - while (pos != -1) { - var id = href.substring(start, pos); - expand(id); - pos = href.indexOf(".", pos+1); - } - var id = href.substring(start, href.length); - expand(id); - highlight(id); - } - } -} - -function kill_doclink(id) { - var parent = document.getElementById(id); - parent.removeChild(parent.childNodes.item(0)); -} -function auto_kill_doclink(ev) { - if (!ev) var ev = window.event; - if (!this.contains(ev.toElement)) { - var parent = document.getElementById(this.parentID); - parent.removeChild(parent.childNodes.item(0)); - } -} - -function doclink(id, name, targets_id) { - var elt = document.getElementById(id); - - // If we already opened the box, then destroy it. - // (This case should never occur, but leave it in just in case.) - if (elt.childNodes.length > 1) { - elt.removeChild(elt.childNodes.item(0)); - } - else { - // The outer box: relative + inline positioning. - var box1 = document.createElement("div"); - box1.style.position = "relative"; - box1.style.display = "inline"; - box1.style.top = 0; - box1.style.left = 0; - - // A shadow for fun - var shadow = document.createElement("div"); - shadow.style.position = "absolute"; - shadow.style.left = "-1.3em"; - shadow.style.top = "-1.3em"; - shadow.style.background = "#404040"; - - // The inner box: absolute positioning. - var box2 = document.createElement("div"); - box2.style.position = "relative"; - box2.style.border = "1px solid #a0a0a0"; - box2.style.left = "-.2em"; - box2.style.top = "-.2em"; - box2.style.background = "white"; - box2.style.padding = ".3em .4em .3em .4em"; - box2.style.fontStyle = "normal"; - box2.onmouseout=auto_kill_doclink; - box2.parentID = id; - - // Get the targets - var targets_elt = document.getElementById(targets_id); - var targets = targets_elt.getAttribute("targets"); - var links = ""; - target_list = targets.split(","); - for (var i=0; i" + - target[0] + ""; - } - - // Put it all together. - elt.insertBefore(box1, elt.childNodes.item(0)); - //box1.appendChild(box2); - box1.appendChild(shadow); - shadow.appendChild(box2); - box2.innerHTML = - "Which "+name+" do you want to see documentation for?" + - ""; - } - return false; -} - -function get_anchor() { - var href = location.href; - var start = href.indexOf("#")+1; - if ((start != 0) && (start != href.length)) - return href.substring(start, href.length); - } -function redirect_url(dottedName) { - // Scan through each element of the "pages" list, and check - // if "name" matches with any of them. - for (var i=0; i-m" or "-c"; - // extract the portion & compare it to dottedName. - var pagename = pages[i].substring(0, pages[i].length-2); - if (pagename == dottedName.substring(0,pagename.length)) { - - // We've found a page that matches `dottedName`; - // construct its URL, using leftover `dottedName` - // content to form an anchor. - var pagetype = pages[i].charAt(pages[i].length-1); - var url = pagename + ((pagetype=="m")?"-module.html": - "-class.html"); - if (dottedName.length > pagename.length) - url += "#" + dottedName.substring(pagename.length+1, - dottedName.length); - return url; - } - } - } diff --git a/apidocs/html/frames.html b/apidocs/html/frames.html deleted file mode 100644 index 9bfdd51..0000000 --- a/apidocs/html/frames.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - pygeoip - - - - - - - - - diff --git a/apidocs/html/help.html b/apidocs/html/help.html deleted file mode 100644 index 090c876..0000000 --- a/apidocs/html/help.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - -
[frames] | no frames]
-
- -

API Documentation

- -

This document contains the API (Application Programming Interface) -documentation for pygeoip. Documentation for the Python -objects defined by the project is divided into separate pages for each -package, module, and class. The API documentation also includes two -pages containing information about the project as a whole: a trees -page, and an index page.

- -

Object Documentation

- -

Each Package Documentation page contains:

-
    -
  • A description of the package.
  • -
  • A list of the modules and sub-packages contained by the - package.
  • -
  • A summary of the classes defined by the package.
  • -
  • A summary of the functions defined by the package.
  • -
  • A summary of the variables defined by the package.
  • -
  • A detailed description of each function defined by the - package.
  • -
  • A detailed description of each variable defined by the - package.
  • -
- -

Each Module Documentation page contains:

-
    -
  • A description of the module.
  • -
  • A summary of the classes defined by the module.
  • -
  • A summary of the functions defined by the module.
  • -
  • A summary of the variables defined by the module.
  • -
  • A detailed description of each function defined by the - module.
  • -
  • A detailed description of each variable defined by the - module.
  • -
- -

Each Class Documentation page contains:

-
    -
  • A class inheritance diagram.
  • -
  • A list of known subclasses.
  • -
  • A description of the class.
  • -
  • A summary of the methods defined by the class.
  • -
  • A summary of the instance variables defined by the class.
  • -
  • A summary of the class (static) variables defined by the - class.
  • -
  • A detailed description of each method defined by the - class.
  • -
  • A detailed description of each instance variable defined by the - class.
  • -
  • A detailed description of each class (static) variable defined - by the class.
  • -
- -

Project Documentation

- -

The Trees page contains the module and class hierarchies:

-
    -
  • The module hierarchy lists every package and module, with - modules grouped into packages. At the top level, and within each - package, modules and sub-packages are listed alphabetically.
  • -
  • The class hierarchy lists every class, grouped by base - class. If a class has more than one base class, then it will be - listed under each base class. At the top level, and under each base - class, classes are listed alphabetically.
  • -
- -

The Index page contains indices of terms and - identifiers:

-
    -
  • The term index lists every term indexed by any object's - documentation. For each term, the index provides links to each - place where the term is indexed.
  • -
  • The identifier index lists the (short) name of every package, - module, class, method, function, variable, and parameter. For each - identifier, the index provides a short description, and a link to - its documentation.
  • -
- -

The Table of Contents

- -

The table of contents occupies the two frames on the left side of -the window. The upper-left frame displays the project -contents, and the lower-left frame displays the module -contents:

- - - - - - - - - -
- Project
Contents
...
- API
Documentation
Frame


-
- Module
Contents
 
...
  -

- -

The project contents frame contains a list of all packages -and modules that are defined by the project. Clicking on an entry -will display its contents in the module contents frame. Clicking on a -special entry, labeled "Everything," will display the contents of -the entire project.

- -

The module contents frame contains a list of every -submodule, class, type, exception, function, and variable defined by a -module or package. Clicking on an entry will display its -documentation in the API documentation frame. Clicking on the name of -the module, at the top of the frame, will display the documentation -for the module itself.

- -

The "frames" and "no frames" buttons below the top -navigation bar can be used to control whether the table of contents is -displayed or not.

- -

The Navigation Bar

- -

A navigation bar is located at the top and bottom of every page. -It indicates what type of page you are currently viewing, and allows -you to go to related pages. The following table describes the labels -on the navigation bar. Note that not some labels (such as -[Parent]) are not displayed on all pages.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object -
[Module]viewing a modulethe module containing the current object -
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
- -

The "show private" and "hide private" buttons below -the top navigation bar can be used to control whether documentation -for private objects is displayed. Private objects are usually defined -as objects whose (short) names begin with a single underscore, but do -not end with an underscore. For example, "_x", -"__pprint", and "epydoc.epytext._tokenize" -are private objects; but "re.sub", -"__init__", and "type_" are not. However, -if a module defines the "__all__" variable, then its -contents are used to decide which objects are private.

- -

A timestamp below the bottom navigation bar indicates when each -page was last updated.

- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/identifier-index.html b/apidocs/html/identifier-index.html deleted file mode 100644 index 5273465..0000000 --- a/apidocs/html/identifier-index.html +++ /dev/null @@ -1,489 +0,0 @@ - - - - - Identifier Index - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - -
[frames] | no frames]
-
- -
-

Identifier Index

-
-[ - A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z - _ -] -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

A

- - - - - - - - -

C

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

D

- - - - - - - - -

E

- - - - - - - - -

F

- - - - - - - - -

G

- - - - - - - - - - - - -

I

- - - - - - - - -

L

- - - - - - - - -

M

- - - - - - - - - - - - -

N

- - - - - - - - -

O

- - - - - - - - - - - - -

P

- - - - - - - - - - - - -

R

- - - - - - - - - - - - - - - - - -

S

- - - - - - - - - - - - - - - - - -

T

- - - - - - - - - - - - -

U

- - - - - - - - -

W

- - - - - - - - -

_

- - - - - - - - - - - - - - - - - -
-

- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/index.html b/apidocs/html/index.html deleted file mode 100644 index 9bfdd51..0000000 --- a/apidocs/html/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - pygeoip - - - - - - - - - diff --git a/apidocs/html/module-tree.html b/apidocs/html/module-tree.html deleted file mode 100644 index 25c5721..0000000 --- a/apidocs/html/module-tree.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - Module Hierarchy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - -
[frames] | no frames]
-
-
- [ Module Hierarchy - | Class Hierarchy ] -

-

Module Hierarchy

- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip-module.html b/apidocs/html/pygeoip-module.html deleted file mode 100644 index d2cab57..0000000 --- a/apidocs/html/pygeoip-module.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - pygeoip - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip - - - - - -
[frames] | no frames]
-
- -

Package pygeoip

source code

-

Pure Python GeoIP API

- -
-
Authors:
-
- Jennifer Ennis <zaylea@gmail.com>, - William Tisäter <william@defunct.cc> -
-
-

License: - Copyright(C) 2004 MaxMind LLC -

This program 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 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 Lesser General Public - License along with this program. If not, see - <http://www.gnu.org/licenses/lgpl.txt>.

-

-
- - - - - - -
- Submodules
-
- -
- - - - - - - - - - - - -
- Classes
-   - - GeoIPError -
-   - - GeoIP -
- - - - - - - - - - - - - - - - - - - - - -
- Variables
-   - - STANDARD = 0 -
-   - - MMAP_CACHE = 8 -
-   - - MEMORY_CACHE = 1 -
-   - - ENCODING = 'iso-8859-1' -
-   - - __package__ = 'pygeoip' -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip-pysrc.html b/apidocs/html/pygeoip-pysrc.html deleted file mode 100644 index 3089960..0000000 --- a/apidocs/html/pygeoip-pysrc.html +++ /dev/null @@ -1,785 +0,0 @@ - - - - - pygeoip - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip - - - - - -
[frames] | no frames]
-
-

Source Code for Package pygeoip

-
-  1  # -*- coding: utf-8 -*- 
-  2  """ 
-  3  Pure Python GeoIP API 
-  4   
-  5  @author: Jennifer Ennis <zaylea@gmail.com> 
-  6  @author: William Tisäter <william@defunct.cc> 
-  7   
-  8  @license: Copyright(C) 2004 MaxMind LLC 
-  9   
- 10  This program is free software: you can redistribute it and/or modify 
- 11  it under the terms of the GNU Lesser General Public License as published by 
- 12  the Free Software Foundation, either version 3 of the License, or 
- 13  (at your option) any later version. 
- 14   
- 15  This program is distributed in the hope that it will be useful, 
- 16  but WITHOUT ANY WARRANTY; without even the implied warranty of 
- 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- 18  GNU General Public License for more details. 
- 19   
- 20  You should have received a copy of the GNU Lesser General Public License 
- 21  along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>. 
- 22  """ 
- 23   
- 24  import os 
- 25  import socket 
- 26  import codecs 
- 27  from math import floor 
- 28  from threading import Lock 
- 29   
- 30  try: 
- 31      import mmap 
- 32  except ImportError:  # pragma: no cover 
- 33      mmap = None 
- 34   
- 35  try: 
- 36      from StringIO import StringIO 
- 37      range = xrange  # Use xrange for Python 2 
- 38  except ImportError: 
- 39      from io import StringIO, BytesIO 
- 40   
- 41  from pygeoip import util, const 
- 42  from pygeoip.const import PY2, PY3 
- 43  from pygeoip.timezone import time_zone_by_country_and_region 
- 44   
- 45   
- 46  STANDARD = const.STANDARD 
- 47  MMAP_CACHE = const.MMAP_CACHE 
- 48  MEMORY_CACHE = const.MEMORY_CACHE 
- 49   
- 50  ENCODING = const.ENCODING 
-
51 - 52 - 53 -class GeoIPError(Exception): -
54 pass -
55 -
56 - 57 -class _GeoIPMetaclass(type): -
58 _instances = {} - 59 _instance_lock = Lock() - 60 -
61 - def __call__(cls, *args, **kwargs): -
62 """ Singleton method to gets an instance without reparsing - 63 the database, the filename is being used as cache key. - 64 """ - 65 if len(args) > 0: - 66 filename = args[0] - 67 elif 'filename' in kwargs: - 68 filename = kwargs['filename'] - 69 else: - 70 return None - 71 - 72 if not kwargs.get('cache', True): - 73 return super(_GeoIPMetaclass, cls).__call__(*args, **kwargs) - 74 - 75 cls._instance_lock.acquire() - 76 if filename not in cls._instances: - 77 cls._instances[filename] = super(_GeoIPMetaclass, cls).__call__(*args, **kwargs) - 78 cls._instance_lock.release() - 79 - 80 return cls._instances[filename] -
81 -
82 - 83 -class GeoIP(object): -
84 __metaclass__ = _GeoIPMetaclass - 85 -
86 - def __init__(self, filename, flags=0, cache=True): -
87 """ - 88 Initialize the class. - 89 - 90 @param filename: Path to a geoip database. - 91 @type filename: str - 92 @param flags: Flags that affect how the database is processed. - 93 Currently supported flags are STANDARD (the default), - 94 MEMORY_CACHE (preload the whole file into memory) and - 95 MMAP_CACHE (access the file via mmap). - 96 @type flags: int - 97 @param cache: Used in tests to skip instance caching - 98 @type cache: bool - 99 """ -100 self._flags = flags -101 self._netmask = None -102 -103 if self._flags & const.MMAP_CACHE and mmap is None: # pragma: no cover -104 import warnings -105 warnings.warn("MMAP_CACHE cannot be used without a mmap module") -106 self._flags &= ~const.MMAP_CACHE -107 -108 if self._flags & const.MMAP_CACHE: -109 f = codecs.open(filename, 'rb', ENCODING) -110 access = mmap.ACCESS_READ -111 self._fp = mmap.mmap(f.fileno(), 0, access=access) -112 self._type = 'MMAP_CACHE' -113 f.close() -114 elif self._flags & const.MEMORY_CACHE: -115 f = codecs.open(filename, 'rb', ENCODING) -116 self._memory = f.read() -117 self._fp = self._str_to_fp(self._memory) -118 self._type = 'MEMORY_CACHE' -119 f.close() -120 else: -121 self._fp = codecs.open(filename, 'rb', ENCODING) -122 self._type = 'STANDARD' -123 -124 self._lock = Lock() -125 self._setup_segments() -
126 -127 @classmethod -
128 - def _str_to_fp(cls, data): -
129 """ -130 Convert bytes data to file handle object -131 -132 @param data: string data -133 @type data: str -134 @return: file handle object -135 @rtype: StringIO or BytesIO -136 """ -137 return BytesIO(bytearray(data, ENCODING)) if PY3 else StringIO(data) -
138 -
139 - def _setup_segments(self): -
140 """ -141 Parses the database file to determine what kind of database is -142 being used and setup segment sizes and start points that will -143 be used by the seek*() methods later. -144 -145 Supported databases: -146 -147 * COUNTRY_EDITION -148 * COUNTRY_EDITION_V6 -149 * REGION_EDITION_REV0 -150 * REGION_EDITION_REV1 -151 * CITY_EDITION_REV0 -152 * CITY_EDITION_REV1 -153 * CITY_EDITION_REV1_V6 -154 * ORG_EDITION -155 * ISP_EDITION -156 * ASNUM_EDITION -157 * ASNUM_EDITION_V6 -158 -159 """ -160 self._databaseType = const.COUNTRY_EDITION -161 self._recordLength = const.STANDARD_RECORD_LENGTH -162 self._databaseSegments = const.COUNTRY_BEGIN -163 -164 self._lock.acquire() -165 filepos = self._fp.tell() -166 self._fp.seek(-3, os.SEEK_END) -167 -168 for i in range(const.STRUCTURE_INFO_MAX_SIZE): -169 chars = chr(255) * 3 -170 delim = self._fp.read(3) -171 -172 if PY3 and type(delim) is bytes: -173 delim = delim.decode(ENCODING) -174 -175 if PY2: -176 chars = chars.decode(ENCODING) -177 if type(delim) is str: -178 delim = delim.decode(ENCODING) -179 -180 if delim == chars: -181 byte = self._fp.read(1) -182 self._databaseType = ord(byte) -183 -184 # Compatibility with databases from April 2003 and earlier -185 if self._databaseType >= 106: -186 self._databaseType -= 105 -187 -188 if self._databaseType == const.REGION_EDITION_REV0: -189 self._databaseSegments = const.STATE_BEGIN_REV0 -190 -191 elif self._databaseType == const.REGION_EDITION_REV1: -192 self._databaseSegments = const.STATE_BEGIN_REV1 -193 -194 elif self._databaseType in (const.CITY_EDITION_REV0, -195 const.CITY_EDITION_REV1, -196 const.CITY_EDITION_REV1_V6, -197 const.ORG_EDITION, -198 const.ISP_EDITION, -199 const.ASNUM_EDITION, -200 const.ASNUM_EDITION_V6): -201 self._databaseSegments = 0 -202 buf = self._fp.read(const.SEGMENT_RECORD_LENGTH) -203 -204 if PY3 and type(buf) is bytes: -205 buf = buf.decode(ENCODING) -206 -207 for j in range(const.SEGMENT_RECORD_LENGTH): -208 self._databaseSegments += (ord(buf[j]) << (j * 8)) -209 -210 LONG_RECORDS = (const.ORG_EDITION, const.ISP_EDITION) -211 if self._databaseType in LONG_RECORDS: -212 self._recordLength = const.ORG_RECORD_LENGTH -213 break -214 else: -215 self._fp.seek(-4, os.SEEK_CUR) -216 -217 self._fp.seek(filepos, os.SEEK_SET) -218 self._lock.release() -
219 -
220 - def _seek_country(self, ipnum): -
221 """ -222 Using the record length and appropriate start points, seek to the -223 country that corresponds to the converted IP address integer. -224 -225 @param ipnum: result of ip2long conversion -226 @type ipnum: int -227 @return: offset of start of record -228 @rtype: int -229 """ -230 try: -231 offset = 0 -232 seek_depth = 127 if len(str(ipnum)) > 10 else 31 -233 -234 for depth in range(seek_depth, -1, -1): -235 if self._flags & const.MEMORY_CACHE: -236 startIndex = 2 * self._recordLength * offset -237 endIndex = startIndex + (2 * self._recordLength) -238 buf = self._memory[startIndex:endIndex] -239 else: -240 startIndex = 2 * self._recordLength * offset -241 readLength = 2 * self._recordLength -242 self._lock.acquire() -243 self._fp.seek(startIndex, os.SEEK_SET) -244 buf = self._fp.read(readLength) -245 self._lock.release() -246 -247 if PY3 and type(buf) is bytes: -248 buf = buf.decode(ENCODING) -249 -250 x = [0, 0] -251 for i in range(2): -252 for j in range(self._recordLength): -253 byte = buf[self._recordLength * i + j] -254 x[i] += ord(byte) << (j * 8) -255 if ipnum & (1 << depth): -256 if x[1] >= self._databaseSegments: -257 self._netmask = seek_depth - depth + 1 -258 return x[1] -259 offset = x[1] -260 else: -261 if x[0] >= self._databaseSegments: -262 self._netmask = seek_depth - depth + 1 -263 return x[0] -264 offset = x[0] -265 except (IndexError, UnicodeDecodeError): -266 pass -267 -268 raise GeoIPError('Corrupt database') -
269 -
270 - def _get_org(self, ipnum): -
271 """ -272 Seek and return organization or ISP name for ipnum. -273 @param ipnum: Converted IP address -274 @type ipnum: int -275 @return: org/isp name -276 @rtype: str -277 """ -278 seek_org = self._seek_country(ipnum) -279 if seek_org == self._databaseSegments: -280 return None -281 -282 read_length = (2 * self._recordLength - 1) * self._databaseSegments -283 self._lock.acquire() -284 self._fp.seek(seek_org + read_length, os.SEEK_SET) -285 buf = self._fp.read(const.MAX_ORG_RECORD_LENGTH) -286 self._lock.release() -287 -288 if PY3 and type(buf) is bytes: -289 buf = buf.decode(ENCODING) -290 -291 return buf[:buf.index(chr(0))] -
292 -
293 - def _get_region(self, ipnum): -
294 """ -295 Seek and return the region information. -296 -297 @param ipnum: Converted IP address -298 @type ipnum: int -299 @return: dict containing country_code and region_code -300 @rtype: dict -301 """ -302 region_code = None -303 country_code = None -304 seek_country = self._seek_country(ipnum) -305 -306 def get_region_code(offset): -307 region1 = chr(offset // 26 + 65) -308 region2 = chr(offset % 26 + 65) -309 return ''.join([region1, region2]) -
310 -311 if self._databaseType == const.REGION_EDITION_REV0: -312 seek_region = seek_country - const.STATE_BEGIN_REV0 -313 if seek_region >= 1000: -314 country_code = 'US' -315 region_code = get_region_code(seek_region - 1000) -316 else: -317 country_code = const.COUNTRY_CODES[seek_region] -318 elif self._databaseType == const.REGION_EDITION_REV1: -319 seek_region = seek_country - const.STATE_BEGIN_REV1 -320 if seek_region < const.US_OFFSET: -321 pass -322 elif seek_region < const.CANADA_OFFSET: -323 country_code = 'US' -324 region_code = get_region_code(seek_region - const.US_OFFSET) -325 elif seek_region < const.WORLD_OFFSET: -326 country_code = 'CA' -327 region_code = get_region_code(seek_region - const.CANADA_OFFSET) -328 else: -329 index = (seek_region - const.WORLD_OFFSET) // const.FIPS_RANGE -330 if index in const.COUNTRY_CODES: -331 country_code = const.COUNTRY_CODES[index] -332 elif self._databaseType in const.CITY_EDITIONS: -333 rec = self._get_record(ipnum) -334 region_code = rec.get('region_code') -335 country_code = rec.get('country_code') -336 -337 return {'country_code': country_code, 'region_code': region_code} -
338 -
339 - def _get_record(self, ipnum): -
340 """ -341 Populate location dict for converted IP. -342 -343 @param ipnum: Converted IP address -344 @type ipnum: int -345 @return: dict with city, region_code, area_code, time_zone, -346 dma_code, metro_code, country_code3, latitude, postal_code, -347 longitude, country_code, country_name, continent -348 @rtype: dict -349 """ -350 seek_country = self._seek_country(ipnum) -351 if seek_country == self._databaseSegments: -352 return {} -353 -354 read_length = (2 * self._recordLength - 1) * self._databaseSegments -355 self._lock.acquire() -356 self._fp.seek(seek_country + read_length, os.SEEK_SET) -357 buf = self._fp.read(const.FULL_RECORD_LENGTH) -358 self._lock.release() -359 -360 if PY3 and type(buf) is bytes: -361 buf = buf.decode(ENCODING) -362 -363 record = { -364 'dma_code': 0, -365 'area_code': 0, -366 'metro_code': None, -367 'postal_code': None -368 } -369 -370 latitude = 0 -371 longitude = 0 -372 -373 char = ord(buf[0]) -374 record['country_code'] = const.COUNTRY_CODES[char] -375 record['country_code3'] = const.COUNTRY_CODES3[char] -376 record['country_name'] = const.COUNTRY_NAMES[char] -377 record['continent'] = const.CONTINENT_NAMES[char] -378 -379 def read_data(buf, pos): -380 cur = pos -381 while buf[cur] != '\0': -382 cur += 1 -383 return cur, buf[pos:cur] if cur > pos else None -
384 -385 offset, record['region_code'] = read_data(buf, 1) -386 offset, record['city'] = read_data(buf, offset + 1) -387 offset, record['postal_code'] = read_data(buf, offset + 1) -388 offset = offset + 1 -389 -390 for j in range(3): -391 latitude += (ord(buf[offset + j]) << (j * 8)) -392 -393 for j in range(3): -394 longitude += (ord(buf[offset + j + 3]) << (j * 8)) -395 -396 record['latitude'] = (latitude / 10000.0) - 180.0 -397 record['longitude'] = (longitude / 10000.0) - 180.0 -398 -399 if self._databaseType in (const.CITY_EDITION_REV1, const.CITY_EDITION_REV1_V6): -400 if record['country_code'] == 'US': -401 dma_area = 0 -402 for j in range(3): -403 dma_area += ord(buf[offset + j + 6]) << (j * 8) -404 -405 record['dma_code'] = int(floor(dma_area / 1000)) -406 record['area_code'] = dma_area % 1000 -407 record['metro_code'] = const.DMA_MAP.get(record['dma_code']) -408 -409 params = (record['country_code'], record['region_code']) -410 record['time_zone'] = time_zone_by_country_and_region(*params) -411 -412 return record -413 -
414 - def _gethostbyname(self, hostname): -
415 if self._databaseType in const.IPV6_EDITIONS: -416 response = socket.getaddrinfo(hostname, 0, socket.AF_INET6) -417 family, socktype, proto, canonname, sockaddr = response[0] -418 address, port, flow, scope = sockaddr -419 return address -420 else: -421 return socket.gethostbyname(hostname) -
422 -
423 - def _id_by_addr(self, addr): -
424 """ -425 Looks up the index for the country which is the key for the -426 code and name. -427 -428 @param addr: IPv4 or IPv6 address -429 @type addr: str -430 @return: network byte order 32-bit integer -431 @rtype: int -432 """ -433 ipv = 6 if addr.find(':') >= 0 else 4 -434 if ipv == 4 and self._databaseType != const.COUNTRY_EDITION: -435 raise GeoIPError('Invalid database type; expected IPv6 address') -436 if ipv == 6 and self._databaseType != const.COUNTRY_EDITION_V6: -437 raise GeoIPError('Invalid database type; expected IPv4 address') -438 -439 ipnum = util.ip2long(addr) -440 return self._seek_country(ipnum) - const.COUNTRY_BEGIN -
441 -
442 - def last_netmask(self): -
443 """ -444 Return the netmask depth of the last lookup. -445 -446 @return: network depth -447 @rtype: int -448 """ -449 return self._netmask -
450 -
451 - def country_code_by_addr(self, addr): -
452 """ -453 Returns 2-letter country code (e.g. 'US') for specified IP address. -454 Use this method if you have a Country, Region, or City database. -455 -456 @param addr: IP address -457 @type addr: str -458 @return: 2-letter country code -459 @rtype: str -460 """ -461 VALID_EDITIONS = (const.COUNTRY_EDITION, const.COUNTRY_EDITION_V6) -462 if self._databaseType in VALID_EDITIONS: -463 country_id = self._id_by_addr(addr) -464 return const.COUNTRY_CODES[country_id] -465 elif self._databaseType in const.REGION_CITY_EDITIONS: -466 return self.region_by_addr(addr).get('country_code') -467 -468 raise GeoIPError('Invalid database type, expected Country, City or Region') -
469 -
470 - def country_code_by_name(self, hostname): -
471 """ -472 Returns 2-letter country code (e.g. 'US') for specified hostname. -473 Use this method if you have a Country, Region, or City database. -474 -475 @param hostname: Hostname -476 @type hostname: str -477 @return: 2-letter country code -478 @rtype: str -479 """ -480 addr = self._gethostbyname(hostname) -481 return self.country_code_by_addr(addr) -
482 -
483 - def country_name_by_addr(self, addr): -
484 """ -485 Returns full country name for specified IP address. -486 Use this method if you have a Country or City database. -487 -488 @param addr: IP address -489 @type addr: str -490 @return: country name -491 @rtype: str -492 """ -493 VALID_EDITIONS = (const.COUNTRY_EDITION, const.COUNTRY_EDITION_V6) -494 if self._databaseType in VALID_EDITIONS: -495 country_id = self._id_by_addr(addr) -496 return const.COUNTRY_NAMES[country_id] -497 elif self._databaseType in const.CITY_EDITIONS: -498 return self.record_by_addr(addr).get('country_name') -499 else: -500 message = 'Invalid database type, expected Country or City' -501 raise GeoIPError(message) -
502 -
503 - def country_name_by_name(self, hostname): -
504 """ -505 Returns full country name for specified hostname. -506 Use this method if you have a Country database. -507 -508 @param hostname: Hostname -509 @type hostname: str -510 @return: country name -511 @rtype: str -512 """ -513 addr = self._gethostbyname(hostname) -514 return self.country_name_by_addr(addr) -
515 -
516 - def org_by_addr(self, addr): -
517 """ -518 Lookup Organization, ISP or ASNum for given IP address. -519 Use this method if you have an Organization, ISP or ASNum database. -520 -521 @param addr: IP address -522 @type addr: str -523 @return: organization or ISP name -524 @rtype: str -525 """ -526 valid = (const.ORG_EDITION, const.ISP_EDITION, const.ASNUM_EDITION, const.ASNUM_EDITION_V6) -527 if self._databaseType not in valid: -528 message = 'Invalid database type, expected Org, ISP or ASNum' -529 raise GeoIPError(message) -530 -531 ipnum = util.ip2long(addr) -532 return self._get_org(ipnum) -
533 -
534 - def org_by_name(self, hostname): -
535 """ -536 Lookup the organization (or ISP) for hostname. -537 Use this method if you have an Organization/ISP database. -538 -539 @param hostname: Hostname -540 @type hostname: str -541 @return: Organization or ISP name -542 @rtype: str -543 """ -544 addr = self._gethostbyname(hostname) -545 return self.org_by_addr(addr) -
546 -
547 - def record_by_addr(self, addr): -
548 """ -549 Look up the record for a given IP address. -550 Use this method if you have a City database. -551 -552 @param addr: IP address -553 @type addr: str -554 @return: Dictionary with country_code, country_code3, country_name, -555 region, city, postal_code, latitude, longitude, dma_code, -556 metro_code, area_code, region_code, time_zone -557 @rtype: dict -558 """ -559 if self._databaseType not in const.CITY_EDITIONS: -560 message = 'Invalid database type, expected City' -561 raise GeoIPError(message) -562 -563 ipnum = util.ip2long(addr) -564 rec = self._get_record(ipnum) -565 if not rec: -566 return None -567 -568 return rec -
569 -
570 - def record_by_name(self, hostname): -
571 """ -572 Look up the record for a given hostname. -573 Use this method if you have a City database. -574 -575 @param hostname: Hostname -576 @type hostname: str -577 @return: Dictionary with country_code, country_code3, country_name, -578 region, city, postal_code, latitude, longitude, dma_code, -579 metro_code, area_code, region_code, time_zone -580 @rtype: dict -581 """ -582 addr = self._gethostbyname(hostname) -583 return self.record_by_addr(addr) -
584 -
585 - def region_by_addr(self, addr): -
586 """ -587 Lookup the region for given IP address. -588 Use this method if you have a Region database. -589 -590 @param addr: IP address -591 @type addr: str -592 @return: Dictionary containing country_code and region_code -593 @rtype: dict -594 """ -595 if self._databaseType not in const.REGION_CITY_EDITIONS: -596 message = 'Invalid database type, expected Region or City' -597 raise GeoIPError(message) -598 -599 ipnum = util.ip2long(addr) -600 return self._get_region(ipnum) -
601 -
602 - def region_by_name(self, hostname): -
603 """ -604 Lookup the region for given hostname. -605 Use this method if you have a Region database. -606 -607 @param hostname: Hostname -608 @type hostname: str -609 @return: Dictionary containing country_code, region_code and region -610 @rtype: dict -611 """ -612 addr = self._gethostbyname(hostname) -613 return self.region_by_addr(addr) -
614 -
615 - def time_zone_by_addr(self, addr): -
616 """ -617 Look up the time zone for a given IP address. -618 Use this method if you have a Region or City database. -619 -620 @param addr: IP address -621 @type addr: str -622 @return: Time zone -623 @rtype: str -624 """ -625 if self._databaseType not in const.CITY_EDITIONS: -626 message = 'Invalid database type, expected City' -627 raise GeoIPError(message) -628 -629 ipnum = util.ip2long(addr) -630 return self._get_record(ipnum).get('time_zone') -
631 -
632 - def time_zone_by_name(self, hostname): -
633 """ -634 Look up the time zone for a given hostname. -635 Use this method if you have a Region or City database. -636 -637 @param hostname: Hostname -638 @type hostname: str -639 @return: Time zone -640 @rtype: str -641 """ -642 addr = self._gethostbyname(hostname) -643 return self.time_zone_by_addr(addr) -
644 -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip.GeoIP-class.html b/apidocs/html/pygeoip.GeoIP-class.html deleted file mode 100644 index 6d8f75c..0000000 --- a/apidocs/html/pygeoip.GeoIP-class.html +++ /dev/null @@ -1,825 +0,0 @@ - - - - - pygeoip.GeoIP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Class GeoIP - - - - - -
[frames] | no frames]
-
- -

Class GeoIP

source code

-
-object --+
-         |
-        GeoIP
-
- -
- - - - - - - - - -
- Nested Classes
-   - - __metaclass__ -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Instance Methods
-   - - - - - - -
__init__(self, - filename, - flags=0, - cache=True)
- Initialize the class.
- source code - -
- -
- int - - - - - - -
last_netmask(self)
- Return the netmask depth of the last lookup.
- source code - -
- -
- str - - - - - - -
country_code_by_addr(self, - addr)
- Returns 2-letter country code (e.g.
- source code - -
- -
- str - - - - - - -
country_code_by_name(self, - hostname)
- Returns 2-letter country code (e.g.
- source code - -
- -
- str - - - - - - -
country_name_by_addr(self, - addr)
- Returns full country name for specified IP address.
- source code - -
- -
- str - - - - - - -
country_name_by_name(self, - hostname)
- Returns full country name for specified hostname.
- source code - -
- -
- str - - - - - - -
org_by_addr(self, - addr)
- Lookup Organization, ISP or ASNum for given IP address.
- source code - -
- -
- str - - - - - - -
org_by_name(self, - hostname)
- Lookup the organization (or ISP) for hostname.
- source code - -
- -
- dict - - - - - - -
record_by_addr(self, - addr)
- Look up the record for a given IP address.
- source code - -
- -
- dict - - - - - - -
record_by_name(self, - hostname)
- Look up the record for a given hostname.
- source code - -
- -
- dict - - - - - - -
region_by_addr(self, - addr)
- Lookup the region for given IP address.
- source code - -
- -
- dict - - - - - - -
region_by_name(self, - hostname)
- Lookup the region for given hostname.
- source code - -
- -
- str - - - - - - -
time_zone_by_addr(self, - addr)
- Look up the time zone for a given IP address.
- source code - -
- -
- str - - - - - - -
time_zone_by_name(self, - hostname)
- Look up the time zone for a given hostname.
- source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- Properties
-

Inherited from object: - __class__ -

-
- - - - - - -
- Method Details
- -
- -
- - -
-

__init__(self, - filename, - flags=0, - cache=True) -
(Constructor) -

-
source code  -
- -

Initialize the class.

-
-
Parameters:
-
    -
  • filename (str) - Path to a geoip database.
  • -
  • flags (int) - Flags that affect how the database is processed. Currently - supported flags are STANDARD (the default), MEMORY_CACHE (preload - the whole file into memory) and MMAP_CACHE (access the file via - mmap).
  • -
  • cache (bool) - Used in tests to skip instance caching
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

last_netmask(self) -

-
source code  -
- -

Return the netmask depth of the last lookup.

-
-
Returns: int
-
network depth
-
-
-
- -
- -
- - -
-

country_code_by_addr(self, - addr) -

-
source code  -
- -

Returns 2-letter country code (e.g. 'US') for specified IP address. - Use this method if you have a Country, Region, or City database.

-
-
Parameters:
-
    -
  • addr (str) - IP address
  • -
-
Returns: str
-
2-letter country code
-
-
-
- -
- -
- - -
-

country_code_by_name(self, - hostname) -

-
source code  -
- -

Returns 2-letter country code (e.g. 'US') for specified hostname. Use - this method if you have a Country, Region, or City database.

-
-
Parameters:
-
    -
  • hostname (str) - Hostname
  • -
-
Returns: str
-
2-letter country code
-
-
-
- -
- -
- - -
-

country_name_by_addr(self, - addr) -

-
source code  -
- -

Returns full country name for specified IP address. Use this method if - you have a Country or City database.

-
-
Parameters:
-
    -
  • addr (str) - IP address
  • -
-
Returns: str
-
country name
-
-
-
- -
- -
- - -
-

country_name_by_name(self, - hostname) -

-
source code  -
- -

Returns full country name for specified hostname. Use this method if - you have a Country database.

-
-
Parameters:
-
    -
  • hostname (str) - Hostname
  • -
-
Returns: str
-
country name
-
-
-
- -
- -
- - -
-

org_by_addr(self, - addr) -

-
source code  -
- -

Lookup Organization, ISP or ASNum for given IP address. Use this - method if you have an Organization, ISP or ASNum database.

-
-
Parameters:
-
    -
  • addr (str) - IP address
  • -
-
Returns: str
-
organization or ISP name
-
-
-
- -
- -
- - -
-

org_by_name(self, - hostname) -

-
source code  -
- -

Lookup the organization (or ISP) for hostname. Use this method if you - have an Organization/ISP database.

-
-
Parameters:
-
    -
  • hostname (str) - Hostname
  • -
-
Returns: str
-
Organization or ISP name
-
-
-
- -
- -
- - -
-

record_by_addr(self, - addr) -

-
source code  -
- -

Look up the record for a given IP address. Use this method if you have - a City database.

-
-
Parameters:
-
    -
  • addr (str) - IP address
  • -
-
Returns: dict
-
Dictionary with country_code, country_code3, country_name, - region, city, postal_code, latitude, longitude, dma_code, - metro_code, area_code, region_code, time_zone
-
-
-
- -
- -
- - -
-

record_by_name(self, - hostname) -

-
source code  -
- -

Look up the record for a given hostname. Use this method if you have a - City database.

-
-
Parameters:
-
    -
  • hostname (str) - Hostname
  • -
-
Returns: dict
-
Dictionary with country_code, country_code3, country_name, - region, city, postal_code, latitude, longitude, dma_code, - metro_code, area_code, region_code, time_zone
-
-
-
- -
- -
- - -
-

region_by_addr(self, - addr) -

-
source code  -
- -

Lookup the region for given IP address. Use this method if you have a - Region database.

-
-
Parameters:
-
    -
  • addr (str) - IP address
  • -
-
Returns: dict
-
Dictionary containing country_code and region_code
-
-
-
- -
- -
- - -
-

region_by_name(self, - hostname) -

-
source code  -
- -

Lookup the region for given hostname. Use this method if you have a - Region database.

-
-
Parameters:
-
    -
  • hostname (str) - Hostname
  • -
-
Returns: dict
-
Dictionary containing country_code, region_code and region
-
-
-
- -
- -
- - -
-

time_zone_by_addr(self, - addr) -

-
source code  -
- -

Look up the time zone for a given IP address. Use this method if you - have a Region or City database.

-
-
Parameters:
-
    -
  • addr (str) - IP address
  • -
-
Returns: str
-
Time zone
-
-
-
- -
- -
- - -
-

time_zone_by_name(self, - hostname) -

-
source code  -
- -

Look up the time zone for a given hostname. Use this method if you - have a Region or City database.

-
-
Parameters:
-
    -
  • hostname (str) - Hostname
  • -
-
Returns: str
-
Time zone
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip.GeoIPError-class.html b/apidocs/html/pygeoip.GeoIPError-class.html deleted file mode 100644 index 8d629f0..0000000 --- a/apidocs/html/pygeoip.GeoIPError-class.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - pygeoip.GeoIPError - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Class GeoIPError - - - - - -
[frames] | no frames]
-
- -

Class GeoIPError

source code

-
-              object --+        
-                       |        
-exceptions.BaseException --+    
-                           |    
-        exceptions.Exception --+
-                               |
-                              GeoIPError
-
- -
- - - - - - - - - -
- Instance Methods
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- Properties
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip._GeoIPMetaclass-class.html b/apidocs/html/pygeoip._GeoIPMetaclass-class.html deleted file mode 100644 index 60f278d..0000000 --- a/apidocs/html/pygeoip._GeoIPMetaclass-class.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - pygeoip._GeoIPMetaclass - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Class _GeoIPMetaclass - - - - - -
[frames] | no frames]
-
- -

Type _GeoIPMetaclass

source code

-
-object --+    
-         |    
-      type --+
-             |
-            _GeoIPMetaclass
-
- -
- - - - - - - - - - - - -
- Instance Methods
-   - - - - - - -
__call__(cls, - *args, - **kwargs)
- Singleton method to gets an instance without reparsing the database, - the filename is being used as cache key.
- source code - -
- -
-

Inherited from type: - __delattr__, - __eq__, - __ge__, - __getattribute__, - __gt__, - __hash__, - __init__, - __instancecheck__, - __le__, - __lt__, - __ne__, - __new__, - __repr__, - __setattr__, - __subclasscheck__, - __subclasses__, - mro -

-

Inherited from object: - __format__, - __reduce__, - __reduce_ex__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- Properties
-

Inherited from type: - __abstractmethods__, - __base__, - __bases__, - __basicsize__, - __dictoffset__, - __flags__, - __itemsize__, - __mro__, - __name__, - __weakrefoffset__ -

-

Inherited from object: - __class__ -

-
- - - - - - -
- Method Details
- -
- -
- - -
-

__call__(cls, - *args, - **kwargs) -
(Call operator) -

-
source code  -
- -

Singleton method to gets an instance without reparsing the database, - the filename is being used as cache key.

-
-
Overrides: - type.__call__ -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip.const-module.html b/apidocs/html/pygeoip.const-module.html deleted file mode 100644 index 69d71b7..0000000 --- a/apidocs/html/pygeoip.const-module.html +++ /dev/null @@ -1,646 +0,0 @@ - - - - - pygeoip.const - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Module const - - - - - -
[frames] | no frames]
-
- -

Module const

source code

-

Constants for the database parser

- -
-
Authors:
-
- Jennifer Ennis <zaylea@gmail.com>, - William Tisäter <william@defunct.cc> -
-
-

License: - Copyright(C) 2004 MaxMind LLC -

This program 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 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 Lesser General Public - License along with this program. If not, see - <http://www.gnu.org/licenses/lgpl.txt>.

-

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Variables
-   - - PY2 = True -
-   - - PY3 = False -
-   - - GEOIP_STANDARD = 0 -
-   - - GEOIP_MEMORY_CACHE = 1 -
-   - - DMA_MAP = {500: 'Portland-Auburn, ME', 501: 'New York, NY', 50... -
-   - - COUNTRY_CODES = ('', 'AP', 'EU', 'AD', 'AE', 'AF', 'AG', 'AI',... -
-   - - COUNTRY_CODES3 = ('', 'AP', 'EU', 'AND', 'ARE', 'AFG', 'ATG', ... -
-   - - COUNTRY_NAMES = ('', 'Asia/Pacific Region', 'Europe', 'Andorra... -
-   - - CONTINENT_NAMES = ('--', 'AS', 'EU', 'EU', 'AS', 'AS', 'NA', '... -
-   - - STANDARD = 0 -
-   - - MEMORY_CACHE = 1 -
-   - - MMAP_CACHE = 8 -
-   - - COUNTRY_BEGIN = 16776960 -
-   - - STATE_BEGIN_REV0 = 16700000 -
-   - - STATE_BEGIN_REV1 = 16000000 -
-   - - STRUCTURE_INFO_MAX_SIZE = 20 -
-   - - DATABASE_INFO_MAX_SIZE = 100 -
-   - - COUNTRY_EDITION = 1 -
-   - - COUNTRY_EDITION_V6 = 12 -
-   - - REGION_EDITION_REV0 = 7 -
-   - - REGION_EDITION_REV1 = 3 -
-   - - CITY_EDITION_REV0 = 6 -
-   - - CITY_EDITION_REV1 = 2 -
-   - - CITY_EDITION_REV1_V6 = 30 -
-   - - ORG_EDITION = 5 -
-   - - ISP_EDITION = 4 -
-   - - ASNUM_EDITION = 9 -
-   - - ASNUM_EDITION_V6 = 21 -
-   - - PROXY_EDITION = 8 -
-   - - NETSPEED_EDITION = 11 -
-   - - IPV6_EDITIONS = (12, 21, 30) -
-   - - CITY_EDITIONS = (6, 2, 30) -
-   - - REGION_EDITIONS = (7, 3) -
-   - - REGION_CITY_EDITIONS = (7, 3, 6, 2, 30) -
-   - - SEGMENT_RECORD_LENGTH = 3 -
-   - - STANDARD_RECORD_LENGTH = 3 -
-   - - ORG_RECORD_LENGTH = 4 -
-   - - MAX_RECORD_LENGTH = 4 -
-   - - MAX_ORG_RECORD_LENGTH = 300 -
-   - - FULL_RECORD_LENGTH = 50 -
-   - - US_OFFSET = 1 -
-   - - CANADA_OFFSET = 677 -
-   - - WORLD_OFFSET = 1353 -
-   - - FIPS_RANGE = 360 -
-   - - ENCODING = 'iso-8859-1' -
-   - - __package__ = 'pygeoip' -
- - - - - - -
- Variables Details
- -
- -
-

DMA_MAP

- -
-
-
-
Value:
-
-{500: 'Portland-Auburn, ME',
- 501: 'New York, NY',
- 502: 'Binghamton, NY',
- 503: 'Macon, GA',
- 504: 'Philadelphia, PA',
- 505: 'Detroit, MI',
- 506: 'Boston, MA',
- 507: 'Savannah, GA',
-...
-
-
-
-
-
- -
- -
-

COUNTRY_CODES

- -
-
-
-
Value:
-
-('',
- 'AP',
- 'EU',
- 'AD',
- 'AE',
- 'AF',
- 'AG',
- 'AI',
-...
-
-
-
-
-
- -
- -
-

COUNTRY_CODES3

- -
-
-
-
Value:
-
-('',
- 'AP',
- 'EU',
- 'AND',
- 'ARE',
- 'AFG',
- 'ATG',
- 'AIA',
-...
-
-
-
-
-
- -
- -
-

COUNTRY_NAMES

- -
-
-
-
Value:
-
-('',
- 'Asia/Pacific Region',
- 'Europe',
- 'Andorra',
- 'United Arab Emirates',
- 'Afghanistan',
- 'Antigua and Barbuda',
- 'Anguilla',
-...
-
-
-
-
-
- -
- -
-

CONTINENT_NAMES

- -
-
-
-
Value:
-
-('--',
- 'AS',
- 'EU',
- 'EU',
- 'AS',
- 'AS',
- 'NA',
- 'NA',
-...
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip.const-pysrc.html b/apidocs/html/pygeoip.const-pysrc.html deleted file mode 100644 index 0d623a4..0000000 --- a/apidocs/html/pygeoip.const-pysrc.html +++ /dev/null @@ -1,555 +0,0 @@ - - - - - pygeoip.const - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Module const - - - - - -
[frames] | no frames]
-
-

Source Code for Module pygeoip.const

-
-  1  # -*- coding: utf-8 -*- 
-  2  """ 
-  3  Constants for the database parser 
-  4   
-  5  @author: Jennifer Ennis <zaylea@gmail.com> 
-  6  @author: William Tisäter <william@defunct.cc> 
-  7   
-  8  @license: Copyright(C) 2004 MaxMind LLC 
-  9   
- 10  This program is free software: you can redistribute it and/or modify 
- 11  it under the terms of the GNU Lesser General Public License as published by 
- 12  the Free Software Foundation, either version 3 of the License, or 
- 13  (at your option) any later version. 
- 14   
- 15  This program is distributed in the hope that it will be useful, 
- 16  but WITHOUT ANY WARRANTY; without even the implied warranty of 
- 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- 18  GNU General Public License for more details. 
- 19   
- 20  You should have received a copy of the GNU Lesser General Public License 
- 21  along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>. 
- 22  """ 
- 23   
- 24  from platform import python_version_tuple 
- 25   
- 26  PY2 = python_version_tuple()[0] == '2' 
- 27  PY3 = python_version_tuple()[0] == '3' 
- 28   
- 29  GEOIP_STANDARD = 0 
- 30  GEOIP_MEMORY_CACHE = 1 
- 31   
- 32  DMA_MAP = { 
- 33      500: 'Portland-Auburn, ME', 
- 34      501: 'New York, NY', 
- 35      502: 'Binghamton, NY', 
- 36      503: 'Macon, GA', 
- 37      504: 'Philadelphia, PA', 
- 38      505: 'Detroit, MI', 
- 39      506: 'Boston, MA', 
- 40      507: 'Savannah, GA', 
- 41      508: 'Pittsburgh, PA', 
- 42      509: 'Ft Wayne, IN', 
- 43      510: 'Cleveland, OH', 
- 44      511: 'Washington, DC', 
- 45      512: 'Baltimore, MD', 
- 46      513: 'Flint, MI', 
- 47      514: 'Buffalo, NY', 
- 48      515: 'Cincinnati, OH', 
- 49      516: 'Erie, PA', 
- 50      517: 'Charlotte, NC', 
- 51      518: 'Greensboro, NC', 
- 52      519: 'Charleston, SC', 
- 53      520: 'Augusta, GA', 
- 54      521: 'Providence, RI', 
- 55      522: 'Columbus, GA', 
- 56      523: 'Burlington, VT', 
- 57      524: 'Atlanta, GA', 
- 58      525: 'Albany, GA', 
- 59      526: 'Utica-Rome, NY', 
- 60      527: 'Indianapolis, IN', 
- 61      528: 'Miami, FL', 
- 62      529: 'Louisville, KY', 
- 63      530: 'Tallahassee, FL', 
- 64      531: 'Tri-Cities, TN', 
- 65      532: 'Albany-Schenectady-Troy, NY', 
- 66      533: 'Hartford, CT', 
- 67      534: 'Orlando, FL', 
- 68      535: 'Columbus, OH', 
- 69      536: 'Youngstown-Warren, OH', 
- 70      537: 'Bangor, ME', 
- 71      538: 'Rochester, NY', 
- 72      539: 'Tampa, FL', 
- 73      540: 'Traverse City-Cadillac, MI', 
- 74      541: 'Lexington, KY', 
- 75      542: 'Dayton, OH', 
- 76      543: 'Springfield-Holyoke, MA', 
- 77      544: 'Norfolk-Portsmouth, VA', 
- 78      545: 'Greenville-New Bern-Washington, NC', 
- 79      546: 'Columbia, SC', 
- 80      547: 'Toledo, OH', 
- 81      548: 'West Palm Beach, FL', 
- 82      549: 'Watertown, NY', 
- 83      550: 'Wilmington, NC', 
- 84      551: 'Lansing, MI', 
- 85      552: 'Presque Isle, ME', 
- 86      553: 'Marquette, MI', 
- 87      554: 'Wheeling, WV', 
- 88      555: 'Syracuse, NY', 
- 89      556: 'Richmond-Petersburg, VA', 
- 90      557: 'Knoxville, TN', 
- 91      558: 'Lima, OH', 
- 92      559: 'Bluefield-Beckley-Oak Hill, WV', 
- 93      560: 'Raleigh-Durham, NC', 
- 94      561: 'Jacksonville, FL', 
- 95      563: 'Grand Rapids, MI', 
- 96      564: 'Charleston-Huntington, WV', 
- 97      565: 'Elmira, NY', 
- 98      566: 'Harrisburg-Lancaster-Lebanon-York, PA', 
- 99      567: 'Greenville-Spartenburg, SC', 
-100      569: 'Harrisonburg, VA', 
-101      570: 'Florence-Myrtle Beach, SC', 
-102      571: 'Ft Myers, FL', 
-103      573: 'Roanoke-Lynchburg, VA', 
-104      574: 'Johnstown-Altoona, PA', 
-105      575: 'Chattanooga, TN', 
-106      576: 'Salisbury, MD', 
-107      577: 'Wilkes Barre-Scranton, PA', 
-108      581: 'Terre Haute, IN', 
-109      582: 'Lafayette, IN', 
-110      583: 'Alpena, MI', 
-111      584: 'Charlottesville, VA', 
-112      588: 'South Bend, IN', 
-113      592: 'Gainesville, FL', 
-114      596: 'Zanesville, OH', 
-115      597: 'Parkersburg, WV', 
-116      598: 'Clarksburg-Weston, WV', 
-117      600: 'Corpus Christi, TX', 
-118      602: 'Chicago, IL', 
-119      603: 'Joplin-Pittsburg, MO', 
-120      604: 'Columbia-Jefferson City, MO', 
-121      605: 'Topeka, KS', 
-122      606: 'Dothan, AL', 
-123      609: 'St Louis, MO', 
-124      610: 'Rockford, IL', 
-125      611: 'Rochester-Mason City-Austin, MN', 
-126      612: 'Shreveport, LA', 
-127      613: 'Minneapolis-St Paul, MN', 
-128      616: 'Kansas City, MO', 
-129      617: 'Milwaukee, WI', 
-130      618: 'Houston, TX', 
-131      619: 'Springfield, MO', 
-132      620: 'Tuscaloosa, AL', 
-133      622: 'New Orleans, LA', 
-134      623: 'Dallas-Fort Worth, TX', 
-135      624: 'Sioux City, IA', 
-136      625: 'Waco-Temple-Bryan, TX', 
-137      626: 'Victoria, TX', 
-138      627: 'Wichita Falls, TX', 
-139      628: 'Monroe, LA', 
-140      630: 'Birmingham, AL', 
-141      631: 'Ottumwa-Kirksville, IA', 
-142      632: 'Paducah, KY', 
-143      633: 'Odessa-Midland, TX', 
-144      634: 'Amarillo, TX', 
-145      635: 'Austin, TX', 
-146      636: 'Harlingen, TX', 
-147      637: 'Cedar Rapids-Waterloo, IA', 
-148      638: 'St Joseph, MO', 
-149      639: 'Jackson, TN', 
-150      640: 'Memphis, TN', 
-151      641: 'San Antonio, TX', 
-152      642: 'Lafayette, LA', 
-153      643: 'Lake Charles, LA', 
-154      644: 'Alexandria, LA', 
-155      646: 'Anniston, AL', 
-156      647: 'Greenwood-Greenville, MS', 
-157      648: 'Champaign-Springfield-Decatur, IL', 
-158      649: 'Evansville, IN', 
-159      650: 'Oklahoma City, OK', 
-160      651: 'Lubbock, TX', 
-161      652: 'Omaha, NE', 
-162      656: 'Panama City, FL', 
-163      657: 'Sherman, TX', 
-164      658: 'Green Bay-Appleton, WI', 
-165      659: 'Nashville, TN', 
-166      661: 'San Angelo, TX', 
-167      662: 'Abilene-Sweetwater, TX', 
-168      669: 'Madison, WI', 
-169      670: 'Ft Smith-Fay-Springfield, AR', 
-170      671: 'Tulsa, OK', 
-171      673: 'Columbus-Tupelo-West Point, MS', 
-172      675: 'Peoria-Bloomington, IL', 
-173      676: 'Duluth, MN', 
-174      678: 'Wichita, KS', 
-175      679: 'Des Moines, IA', 
-176      682: 'Davenport-Rock Island-Moline, IL', 
-177      686: 'Mobile, AL', 
-178      687: 'Minot-Bismarck-Dickinson, ND', 
-179      691: 'Huntsville, AL', 
-180      692: 'Beaumont-Port Author, TX', 
-181      693: 'Little Rock-Pine Bluff, AR', 
-182      698: 'Montgomery, AL', 
-183      702: 'La Crosse-Eau Claire, WI', 
-184      705: 'Wausau-Rhinelander, WI', 
-185      709: 'Tyler-Longview, TX', 
-186      710: 'Hattiesburg-Laurel, MS', 
-187      711: 'Meridian, MS', 
-188      716: 'Baton Rouge, LA', 
-189      717: 'Quincy, IL', 
-190      718: 'Jackson, MS', 
-191      722: 'Lincoln-Hastings, NE', 
-192      724: 'Fargo-Valley City, ND', 
-193      725: 'Sioux Falls, SD', 
-194      734: 'Jonesboro, AR', 
-195      736: 'Bowling Green, KY', 
-196      737: 'Mankato, MN', 
-197      740: 'North Platte, NE', 
-198      743: 'Anchorage, AK', 
-199      744: 'Honolulu, HI', 
-200      745: 'Fairbanks, AK', 
-201      746: 'Biloxi-Gulfport, MS', 
-202      747: 'Juneau, AK', 
-203      749: 'Laredo, TX', 
-204      751: 'Denver, CO', 
-205      752: 'Colorado Springs, CO', 
-206      753: 'Phoenix, AZ', 
-207      754: 'Butte-Bozeman, MT', 
-208      755: 'Great Falls, MT', 
-209      756: 'Billings, MT', 
-210      757: 'Boise, ID', 
-211      758: 'Idaho Falls-Pocatello, ID', 
-212      759: 'Cheyenne, WY', 
-213      760: 'Twin Falls, ID', 
-214      762: 'Missoula, MT', 
-215      764: 'Rapid City, SD', 
-216      765: 'El Paso, TX', 
-217      766: 'Helena, MT', 
-218      767: 'Casper-Riverton, WY', 
-219      770: 'Salt Lake City, UT', 
-220      771: 'Yuma, AZ', 
-221      773: 'Grand Junction, CO', 
-222      789: 'Tucson, AZ', 
-223      790: 'Albuquerque, NM', 
-224      798: 'Glendive, MT', 
-225      800: 'Bakersfield, CA', 
-226      801: 'Eugene, OR', 
-227      802: 'Eureka, CA', 
-228      803: 'Los Angeles, CA', 
-229      804: 'Palm Springs, CA', 
-230      807: 'San Francisco, CA', 
-231      810: 'Yakima-Pasco, WA', 
-232      811: 'Reno, NV', 
-233      813: 'Medford-Klamath Falls, OR', 
-234      819: 'Seattle-Tacoma, WA', 
-235      820: 'Portland, OR', 
-236      821: 'Bend, OR', 
-237      825: 'San Diego, CA', 
-238      828: 'Monterey-Salinas, CA', 
-239      839: 'Las Vegas, NV', 
-240      855: 'Santa Barbara, CA', 
-241      862: 'Sacramento, CA', 
-242      866: 'Fresno, CA', 
-243      868: 'Chico-Redding, CA', 
-244      881: 'Spokane, WA' 
-245  } 
-246   
-247  COUNTRY_CODES = ( 
-248      '', 
-249      'AP', 'EU', 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AN', 'AO', 'AQ', 
-250      'AR', 'AS', 'AT', 'AU', 'AW', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 
-251      'BH', 'BI', 'BJ', 'BM', 'BN', 'BO', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 
-252      'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 
-253      'CO', 'CR', 'CU', 'CV', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 
-254      'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 
-255      'FO', 'FR', 'FX', 'GA', 'GB', 'GD', 'GE', 'GF', 'GH', 'GI', 'GL', 'GM', 
-256      'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 
-257      'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 
-258      'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 
-259      'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 
-260      'LY', 'MA', 'MC', 'MD', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 
-261      'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 
-262      'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 
-263      'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 
-264      'PY', 'QA', 'RE', 'RO', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 
-265      'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'ST', 'SV', 'SY', 
-266      'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TM', 'TN', 'TO', 'TL', 
-267      'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 
-268      'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'RS', 'ZA', 
-269      'ZM', 'ME', 'ZW', 'A1', 'A2', 'O1', 'AX', 'GG', 'IM', 'JE', 'BL', 'MF', 
-270      'BQ', 'SS' 
-271  ) 
-272   
-273  COUNTRY_CODES3 = ( 
-274      '', 'AP', 'EU', 'AND', 'ARE', 'AFG', 'ATG', 'AIA', 'ALB', 'ARM', 'ANT', 
-275      'AGO', 'AQ', 'ARG', 'ASM', 'AUT', 'AUS', 'ABW', 'AZE', 'BIH', 'BRB', 'BGD', 
-276      'BEL', 'BFA', 'BGR', 'BHR', 'BDI', 'BEN', 'BMU', 'BRN', 'BOL', 'BRA', 
-277      'BHS', 'BTN', 'BV', 'BWA', 'BLR', 'BLZ', 'CAN', 'CC', 'COD', 'CAF', 'COG', 
-278      'CHE', 'CIV', 'COK', 'CHL', 'CMR', 'CHN', 'COL', 'CRI', 'CUB', 'CPV', 'CX', 
-279      'CYP', 'CZE', 'DEU', 'DJI', 'DNK', 'DMA', 'DOM', 'DZA', 'ECU', 'EST', 
-280      'EGY', 'ESH', 'ERI', 'ESP', 'ETH', 'FIN', 'FJI', 'FLK', 'FSM', 'FRO', 
-281      'FRA', 'FX', 'GAB', 'GBR', 'GRD', 'GEO', 'GUF', 'GHA', 'GIB', 'GRL', 'GMB', 
-282      'GIN', 'GLP', 'GNQ', 'GRC', 'GS', 'GTM', 'GUM', 'GNB', 'GUY', 'HKG', 'HM', 
-283      'HND', 'HRV', 'HTI', 'HUN', 'IDN', 'IRL', 'ISR', 'IND', 'IO', 'IRQ', 'IRN', 
-284      'ISL', 'ITA', 'JAM', 'JOR', 'JPN', 'KEN', 'KGZ', 'KHM', 'KIR', 'COM', 
-285      'KNA', 'PRK', 'KOR', 'KWT', 'CYM', 'KAZ', 'LAO', 'LBN', 'LCA', 'LIE', 
-286      'LKA', 'LBR', 'LSO', 'LTU', 'LUX', 'LVA', 'LBY', 'MAR', 'MCO', 'MDA', 
-287      'MDG', 'MHL', 'MKD', 'MLI', 'MMR', 'MNG', 'MAC', 'MNP', 'MTQ', 'MRT', 
-288      'MSR', 'MLT', 'MUS', 'MDV', 'MWI', 'MEX', 'MYS', 'MOZ', 'NAM', 'NCL', 
-289      'NER', 'NFK', 'NGA', 'NIC', 'NLD', 'NOR', 'NPL', 'NRU', 'NIU', 'NZL', 
-290      'OMN', 'PAN', 'PER', 'PYF', 'PNG', 'PHL', 'PAK', 'POL', 'SPM', 'PCN', 
-291      'PRI', 'PSE', 'PRT', 'PLW', 'PRY', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 
-292      'SAU', 'SLB', 'SYC', 'SDN', 'SWE', 'SGP', 'SHN', 'SVN', 'SJM', 'SVK', 
-293      'SLE', 'SMR', 'SEN', 'SOM', 'SUR', 'STP', 'SLV', 'SYR', 'SWZ', 'TCA', 
-294      'TCD', 'TF', 'TGO', 'THA', 'TJK', 'TKL', 'TKM', 'TUN', 'TON', 'TLS', 'TUR', 
-295      'TTO', 'TUV', 'TWN', 'TZA', 'UKR', 'UGA', 'UM', 'USA', 'URY', 'UZB', 'VAT', 
-296      'VCT', 'VEN', 'VGB', 'VIR', 'VNM', 'VUT', 'WLF', 'WSM', 'YEM', 'YT', 'SRB', 
-297      'ZAF', 'ZMB', 'MNE', 'ZWE', 'A1', 'A2', 'O1', 'ALA', 'GGY', 'IMN', 'JEY', 
-298      'BLM', 'MAF', 'BES', 'SSD' 
-299  ) 
-300   
-301  COUNTRY_NAMES = ( 
-302      '', 'Asia/Pacific Region', 'Europe', 'Andorra', 'United Arab Emirates', 
-303      'Afghanistan', 'Antigua and Barbuda', 'Anguilla', 'Albania', 'Armenia', 
-304      'Netherlands Antilles', 'Angola', 'Antarctica', 'Argentina', 
-305      'American Samoa', 'Austria', 'Australia', 'Aruba', 'Azerbaijan', 
-306      'Bosnia and Herzegovina', 'Barbados', 'Bangladesh', 'Belgium', 
-307      'Burkina Faso', 'Bulgaria', 'Bahrain', 'Burundi', 'Benin', 'Bermuda', 
-308      'Brunei Darussalam', 'Bolivia', 'Brazil', 'Bahamas', 'Bhutan', 
-309      'Bouvet Island', 'Botswana', 'Belarus', 'Belize', 'Canada', 
-310      'Cocos (Keeling) Islands', 'Congo, The Democratic Republic of the', 
-311      'Central African Republic', 'Congo', 'Switzerland', 'Cote D\'Ivoire', 
-312      'Cook Islands', 'Chile', 'Cameroon', 'China', 'Colombia', 'Costa Rica', 
-313      'Cuba', 'Cape Verde', 'Christmas Island', 'Cyprus', 'Czech Republic', 
-314      'Germany', 'Djibouti', 'Denmark', 'Dominica', 'Dominican Republic', 
-315      'Algeria', 'Ecuador', 'Estonia', 'Egypt', 'Western Sahara', 'Eritrea', 
-316      'Spain', 'Ethiopia', 'Finland', 'Fiji', 'Falkland Islands (Malvinas)', 
-317      'Micronesia, Federated States of', 'Faroe Islands', 'France', 
-318      'France, Metropolitan', 'Gabon', 'United Kingdom', 'Grenada', 'Georgia', 
-319      'French Guiana', 'Ghana', 'Gibraltar', 'Greenland', 'Gambia', 'Guinea', 
-320      'Guadeloupe', 'Equatorial Guinea', 'Greece', 
-321      'South Georgia and the South Sandwich Islands', 'Guatemala', 'Guam', 
-322      'Guinea-Bissau', 'Guyana', 'Hong Kong', 
-323      'Heard Island and McDonald Islands', 'Honduras', 'Croatia', 'Haiti', 
-324      'Hungary', 'Indonesia', 'Ireland', 'Israel', 'India', 
-325      'British Indian Ocean Territory', 'Iraq', 'Iran, Islamic Republic of', 
-326      'Iceland', 'Italy', 'Jamaica', 'Jordan', 'Japan', 'Kenya', 'Kyrgyzstan', 
-327      'Cambodia', 'Kiribati', 'Comoros', 'Saint Kitts and Nevis', 
-328      'Korea, Democratic People\'s Republic of', 'Korea, Republic of', 'Kuwait', 
-329      'Cayman Islands', 'Kazakhstan', 'Lao People\'s Democratic Republic', 
-330      'Lebanon', 'Saint Lucia', 'Liechtenstein', 'Sri Lanka', 'Liberia', 
-331      'Lesotho', 'Lithuania', 'Luxembourg', 'Latvia', 'Libya', 'Morocco', 
-332      'Monaco', 'Moldova, Republic of', 'Madagascar', 'Marshall Islands', 
-333      'Macedonia', 'Mali', 'Myanmar', 'Mongolia', 'Macau', 
-334      'Northern Mariana Islands', 'Martinique', 'Mauritania', 'Montserrat', 
-335      'Malta', 'Mauritius', 'Maldives', 'Malawi', 'Mexico', 'Malaysia', 
-336      'Mozambique', 'Namibia', 'New Caledonia', 'Niger', 'Norfolk Island', 
-337      'Nigeria', 'Nicaragua', 'Netherlands', 'Norway', 'Nepal', 'Nauru', 'Niue', 
-338      'New Zealand', 'Oman', 'Panama', 'Peru', 'French Polynesia', 
-339      'Papua New Guinea', 'Philippines', 'Pakistan', 'Poland', 
-340      'Saint Pierre and Miquelon', 'Pitcairn Islands', 'Puerto Rico', 
-341      'Palestinian Territory', 'Portugal', 'Palau', 'Paraguay', 'Qatar', 
-342      'Reunion', 'Romania', 'Russian Federation', 'Rwanda', 'Saudi Arabia', 
-343      'Solomon Islands', 'Seychelles', 'Sudan', 'Sweden', 'Singapore', 
-344      'Saint Helena', 'Slovenia', 'Svalbard and Jan Mayen', 'Slovakia', 
-345      'Sierra Leone', 'San Marino', 'Senegal', 'Somalia', 'Suriname', 
-346      'Sao Tome and Principe', 'El Salvador', 'Syrian Arab Republic', 
-347      'Swaziland', 'Turks and Caicos Islands', 'Chad', 
-348      'French Southern Territories', 'Togo', 'Thailand', 'Tajikistan', 'Tokelau', 
-349      'Turkmenistan', 'Tunisia', 'Tonga', 'Timor-Leste', 'Turkey', 
-350      'Trinidad and Tobago', 'Tuvalu', 'Taiwan', 'Tanzania, United Republic of', 
-351      'Ukraine', 'Uganda', 'United States Minor Outlying Islands', 
-352      'United States', 'Uruguay', 'Uzbekistan', 'Holy See (Vatican City State)', 
-353      'Saint Vincent and the Grenadines', 'Venezuela', 'Virgin Islands, British', 
-354      'Virgin Islands, U.S.', 'Vietnam', 'Vanuatu', 'Wallis and Futuna', 'Samoa', 
-355      'Yemen', 'Mayotte', 'Serbia', 'South Africa', 'Zambia', 'Montenegro', 
-356      'Zimbabwe', 'Anonymous Proxy', 'Satellite Provider', 'Other', 
-357      'Aland Islands', 'Guernsey', 'Isle of Man', 'Jersey', 'Saint Barthelemy', 
-358      'Saint Martin', 'Bonaire, Sint Eustatius and Saba', 'South Sudan' 
-359  ) 
-360   
-361  CONTINENT_NAMES = ( 
-362      '--', 'AS', 'EU', 'EU', 'AS', 'AS', 'NA', 'NA', 'EU', 'AS', 'NA', 'AF', 
-363      'AN', 'SA', 'OC', 'EU', 'OC', 'NA', 'AS', 'EU', 'NA', 'AS', 'EU', 'AF', 
-364      'EU', 'AS', 'AF', 'AF', 'NA', 'AS', 'SA', 'SA', 'NA', 'AS', 'AN', 'AF', 
-365      'EU', 'NA', 'NA', 'AS', 'AF', 'AF', 'AF', 'EU', 'AF', 'OC', 'SA', 'AF', 
-366      'AS', 'SA', 'NA', 'NA', 'AF', 'AS', 'AS', 'EU', 'EU', 'AF', 'EU', 'NA', 
-367      'NA', 'AF', 'SA', 'EU', 'AF', 'AF', 'AF', 'EU', 'AF', 'EU', 'OC', 'SA', 
-368      'OC', 'EU', 'EU', 'NA', 'AF', 'EU', 'NA', 'AS', 'SA', 'AF', 'EU', 'NA', 
-369      'AF', 'AF', 'NA', 'AF', 'EU', 'AN', 'NA', 'OC', 'AF', 'SA', 'AS', 'AN', 
-370      'NA', 'EU', 'NA', 'EU', 'AS', 'EU', 'AS', 'AS', 'AS', 'AS', 'AS', 'EU', 
-371      'EU', 'NA', 'AS', 'AS', 'AF', 'AS', 'AS', 'OC', 'AF', 'NA', 'AS', 'AS', 
-372      'AS', 'NA', 'AS', 'AS', 'AS', 'NA', 'EU', 'AS', 'AF', 'AF', 'EU', 'EU', 
-373      'EU', 'AF', 'AF', 'EU', 'EU', 'AF', 'OC', 'EU', 'AF', 'AS', 'AS', 'AS', 
-374      'OC', 'NA', 'AF', 'NA', 'EU', 'AF', 'AS', 'AF', 'NA', 'AS', 'AF', 'AF', 
-375      'OC', 'AF', 'OC', 'AF', 'NA', 'EU', 'EU', 'AS', 'OC', 'OC', 'OC', 'AS', 
-376      'NA', 'SA', 'OC', 'OC', 'AS', 'AS', 'EU', 'NA', 'OC', 'NA', 'AS', 'EU', 
-377      'OC', 'SA', 'AS', 'AF', 'EU', 'EU', 'AF', 'AS', 'OC', 'AF', 'AF', 'EU', 
-378      'AS', 'AF', 'EU', 'EU', 'EU', 'AF', 'EU', 'AF', 'AF', 'SA', 'AF', 'NA', 
-379      'AS', 'AF', 'NA', 'AF', 'AN', 'AF', 'AS', 'AS', 'OC', 'AS', 'AF', 'OC', 
-380      'AS', 'EU', 'NA', 'OC', 'AS', 'AF', 'EU', 'AF', 'OC', 'NA', 'SA', 'AS', 
-381      'EU', 'NA', 'SA', 'NA', 'NA', 'AS', 'OC', 'OC', 'OC', 'AS', 'AF', 'EU', 
-382      'AF', 'AF', 'EU', 'AF', '--', '--', '--', 'EU', 'EU', 'EU', 'EU', 'NA', 
-383      'NA', 'NA', 'AF' 
-384  ) 
-385   
-386  # storage / caching flags 
-387  STANDARD = 0 
-388  MEMORY_CACHE = 1 
-389  MMAP_CACHE = 8 
-390   
-391  # Database structure constants 
-392  COUNTRY_BEGIN = 16776960 
-393  STATE_BEGIN_REV0 = 16700000 
-394  STATE_BEGIN_REV1 = 16000000 
-395   
-396  STRUCTURE_INFO_MAX_SIZE = 20 
-397  DATABASE_INFO_MAX_SIZE = 100 
-398   
-399  # Database editions 
-400  COUNTRY_EDITION = 1 
-401  COUNTRY_EDITION_V6 = 12 
-402  REGION_EDITION_REV0 = 7 
-403  REGION_EDITION_REV1 = 3 
-404  CITY_EDITION_REV0 = 6 
-405  CITY_EDITION_REV1 = 2 
-406  CITY_EDITION_REV1_V6 = 30 
-407  ORG_EDITION = 5 
-408  ISP_EDITION = 4 
-409  ASNUM_EDITION = 9 
-410  ASNUM_EDITION_V6 = 21 
-411  # Not yet supported databases 
-412  PROXY_EDITION = 8 
-413  NETSPEED_EDITION = 11 
-414   
-415  # Collection of databases 
-416  IPV6_EDITIONS = (COUNTRY_EDITION_V6, ASNUM_EDITION_V6, CITY_EDITION_REV1_V6) 
-417  CITY_EDITIONS = (CITY_EDITION_REV0, CITY_EDITION_REV1, CITY_EDITION_REV1_V6) 
-418  REGION_EDITIONS = (REGION_EDITION_REV0, REGION_EDITION_REV1) 
-419  REGION_CITY_EDITIONS = REGION_EDITIONS + CITY_EDITIONS 
-420   
-421  SEGMENT_RECORD_LENGTH = 3 
-422  STANDARD_RECORD_LENGTH = 3 
-423  ORG_RECORD_LENGTH = 4 
-424  MAX_RECORD_LENGTH = 4 
-425  MAX_ORG_RECORD_LENGTH = 300 
-426  FULL_RECORD_LENGTH = 50 
-427   
-428  US_OFFSET = 1 
-429  CANADA_OFFSET = 677 
-430  WORLD_OFFSET = 1353 
-431  FIPS_RANGE = 360 
-432  ENCODING = 'iso-8859-1' 
-433   
-
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip.timezone-module.html b/apidocs/html/pygeoip.timezone-module.html deleted file mode 100644 index ed3b445..0000000 --- a/apidocs/html/pygeoip.timezone-module.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - pygeoip.timezone - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Module timezone - - - - - -
[frames] | no frames]
-
- -

Module timezone

source code

-

Time zone data and lookup function

- -
-
Authors:
-
- Jennifer Ennis <zaylea@gmail.com>, - William Tisäter <william@defunct.cc> -
-
-

License: - Copyright(C) 2004 MaxMind LLC -

This program 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 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 Lesser General Public - License along with this program. If not, see - <http://www.gnu.org/licenses/lgpl.txt>.

-

-
- - - - - - - - -
- Functions
- str - - - - - - -
time_zone_by_country_and_region(country_code, - region_code=None)
- Get time zone from country code and region code.
- source code - -
- -
- - - - - - - - - - - - -
- Variables
-   - - country_dict = {'AD': 'Europe/Andorra', 'AE': 'Asia/Dubai', 'A... -
-   - - __package__ = None -
- - - - - - -
- Function Details
- -
- -
- - -
-

time_zone_by_country_and_region(country_code, - region_code=None) -

-
source code  -
- -

Get time zone from country code and region code.

-
-
Parameters:
-
    -
  • country_code (str) - Country code
  • -
  • region_code (str) - Region code
  • -
-
Returns: str
-
Time zone
-
-
-
-
- - - - - - -
- Variables Details
- -
- -
-

country_dict

- -
-
-
-
Value:
-
-{'AD': 'Europe/Andorra',
- 'AE': 'Asia/Dubai',
- 'AF': 'Asia/Kabul',
- 'AG': 'America/Antigua',
- 'AI': 'America/Anguilla',
- 'AL': 'Europe/Tirane',
- 'AM': 'Asia/Yerevan',
- 'AN': 'America/Curacao',
-...
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip.timezone-pysrc.html b/apidocs/html/pygeoip.timezone-pysrc.html deleted file mode 100644 index 68d8401..0000000 --- a/apidocs/html/pygeoip.timezone-pysrc.html +++ /dev/null @@ -1,883 +0,0 @@ - - - - - pygeoip.timezone - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Module timezone - - - - - -
[frames] | no frames]
-
-

Source Code for Module pygeoip.timezone

-
-  1  # -*- coding: utf-8 -*- 
-  2  """ 
-  3  Time zone data and lookup function 
-  4   
-  5  @author: Jennifer Ennis <zaylea@gmail.com> 
-  6  @author: William Tisäter <william@defunct.cc> 
-  7   
-  8  @license: Copyright(C) 2004 MaxMind LLC 
-  9   
- 10  This program is free software: you can redistribute it and/or modify 
- 11  it under the terms of the GNU Lesser General Public License as published by 
- 12  the Free Software Foundation, either version 3 of the License, or 
- 13  (at your option) any later version. 
- 14   
- 15  This program is distributed in the hope that it will be useful, 
- 16  but WITHOUT ANY WARRANTY; without even the implied warranty of 
- 17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- 18  GNU General Public License for more details. 
- 19   
- 20  You should have received a copy of the GNU Lesser General Public License 
- 21  along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>. 
- 22  """ 
- 23   
- 24   
-
25 -def time_zone_by_country_and_region(country_code, region_code=None): -
26 """ - 27 Get time zone from country code and region code. - 28 - 29 @param country_code: Country code - 30 @type country_code: str - 31 @param region_code: Region code - 32 @type region_code: str - 33 @return: Time zone - 34 @rtype: str - 35 """ - 36 timezone = country_dict.get(country_code) - 37 if not timezone: - 38 return None - 39 - 40 if isinstance(timezone, str): - 41 return timezone - 42 - 43 return timezone.get(region_code) -
44 - 45 - 46 country_dict = { - 47 'AD': 'Europe/Andorra', - 48 'AE': 'Asia/Dubai', - 49 'AF': 'Asia/Kabul', - 50 'AG': 'America/Antigua', - 51 'AI': 'America/Anguilla', - 52 'AL': 'Europe/Tirane', - 53 'AM': 'Asia/Yerevan', - 54 'AN': 'America/Curacao', - 55 'AO': 'Africa/Luanda', - 56 'AR': { - 57 '01': 'America/Argentina/Buenos_Aires', - 58 '02': 'America/Argentina/Catamarca', - 59 '03': 'America/Argentina/Tucuman', - 60 '04': 'America/Argentina/Rio_Gallegos', - 61 '05': 'America/Argentina/Cordoba', - 62 '06': 'America/Argentina/Tucuman', - 63 '07': 'America/Argentina/Buenos_Aires', - 64 '08': 'America/Argentina/Buenos_Aires', - 65 '09': 'America/Argentina/Tucuman', - 66 '10': 'America/Argentina/Jujuy', - 67 '11': 'America/Argentina/San_Luis', - 68 '12': 'America/Argentina/La_Rioja', - 69 '13': 'America/Argentina/Mendoza', - 70 '14': 'America/Argentina/Buenos_Aires', - 71 '15': 'America/Argentina/San_Luis', - 72 '16': 'America/Argentina/Buenos_Aires', - 73 '17': 'America/Argentina/Salta', - 74 '18': 'America/Argentina/San_Juan', - 75 '19': 'America/Argentina/San_Luis', - 76 '20': 'America/Argentina/Rio_Gallegos', - 77 '21': 'America/Argentina/Buenos_Aires', - 78 '22': 'America/Argentina/Catamarca', - 79 '23': 'America/Argentina/Ushuaia', - 80 '24': 'America/Argentina/Tucuman' - 81 }, - 82 'AS': 'US/Samoa', - 83 'AT': 'Europe/Vienna', - 84 'AU': { - 85 '01': 'Australia/Canberra', - 86 '02': 'Australia/NSW', - 87 '03': 'Australia/North', - 88 '04': 'Australia/Queensland', - 89 '05': 'Australia/South', - 90 '06': 'Australia/Tasmania', - 91 '07': 'Australia/Victoria', - 92 '08': 'Australia/West' - 93 }, - 94 'AW': 'America/Aruba', - 95 'AX': 'Europe/Mariehamn', - 96 'AZ': 'Asia/Baku', - 97 'BA': 'Europe/Sarajevo', - 98 'BB': 'America/Barbados', - 99 'BD': 'Asia/Dhaka', -100 'BE': 'Europe/Brussels', -101 'BF': 'Africa/Ouagadougou', -102 'BG': 'Europe/Sofia', -103 'BH': 'Asia/Bahrain', -104 'BI': 'Africa/Bujumbura', -105 'BJ': 'Africa/Porto-Novo', -106 'BL': 'America/St_Barthelemy', -107 'BM': 'Atlantic/Bermuda', -108 'BN': 'Asia/Brunei', -109 'BO': 'America/La_Paz', -110 'BQ': 'America/Curacao', -111 'BR': { -112 '01': 'America/Rio_Branco', -113 '02': 'America/Maceio', -114 '03': 'America/Sao_Paulo', -115 '04': 'America/Manaus', -116 '05': 'America/Bahia', -117 '06': 'America/Fortaleza', -118 '07': 'America/Sao_Paulo', -119 '08': 'America/Sao_Paulo', -120 '11': 'America/Campo_Grande', -121 '13': 'America/Belem', -122 '14': 'America/Cuiaba', -123 '15': 'America/Sao_Paulo', -124 '16': 'America/Belem', -125 '17': 'America/Recife', -126 '18': 'America/Sao_Paulo', -127 '20': 'America/Fortaleza', -128 '21': 'America/Sao_Paulo', -129 '22': 'America/Recife', -130 '23': 'America/Sao_Paulo', -131 '24': 'America/Porto_Velho', -132 '25': 'America/Boa_Vista', -133 '26': 'America/Sao_Paulo', -134 '27': 'America/Sao_Paulo', -135 '28': 'America/Maceio', -136 '29': 'America/Sao_Paulo', -137 '30': 'America/Recife', -138 '31': 'America/Araguaina' -139 }, -140 'BS': 'America/Nassau', -141 'BT': 'Asia/Thimphu', -142 'BW': 'Africa/Gaborone', -143 'BY': 'Europe/Minsk', -144 'BZ': 'America/Belize', -145 'CA': { -146 'AB': 'America/Edmonton', -147 'BC': 'America/Vancouver', -148 'MB': 'America/Winnipeg', -149 'NB': 'America/Halifax', -150 'NL': 'America/St_Johns', -151 'NS': 'America/Halifax', -152 'NT': 'America/Yellowknife', -153 'NU': 'America/Rankin_Inlet', -154 'ON': 'America/Toronto', -155 'PE': 'America/Halifax', -156 'QC': 'America/Montreal', -157 'SK': 'America/Regina', -158 'YT': 'America/Whitehorse' -159 }, -160 'CC': 'Indian/Cocos', -161 'CD': { -162 '02': 'Africa/Kinshasa', -163 '05': 'Africa/Lubumbashi', -164 '06': 'Africa/Kinshasa', -165 '08': 'Africa/Kinshasa', -166 '10': 'Africa/Lubumbashi', -167 '11': 'Africa/Lubumbashi', -168 '12': 'Africa/Lubumbashi' -169 }, -170 'CF': 'Africa/Bangui', -171 'CG': 'Africa/Brazzaville', -172 'CH': 'Europe/Zurich', -173 'CI': 'Africa/Abidjan', -174 'CK': 'Pacific/Rarotonga', -175 'CL': 'Chile/Continental', -176 'CM': 'Africa/Lagos', -177 'CN': { -178 '01': 'Asia/Shanghai', -179 '02': 'Asia/Shanghai', -180 '03': 'Asia/Shanghai', -181 '04': 'Asia/Shanghai', -182 '05': 'Asia/Harbin', -183 '06': 'Asia/Chongqing', -184 '07': 'Asia/Shanghai', -185 '08': 'Asia/Harbin', -186 '09': 'Asia/Shanghai', -187 '10': 'Asia/Shanghai', -188 '11': 'Asia/Chongqing', -189 '12': 'Asia/Shanghai', -190 '13': 'Asia/Urumqi', -191 '14': 'Asia/Chongqing', -192 '15': 'Asia/Chongqing', -193 '16': 'Asia/Chongqing', -194 '18': 'Asia/Chongqing', -195 '19': 'Asia/Harbin', -196 '20': 'Asia/Harbin', -197 '21': 'Asia/Chongqing', -198 '22': 'Asia/Harbin', -199 '23': 'Asia/Shanghai', -200 '24': 'Asia/Chongqing', -201 '25': 'Asia/Shanghai', -202 '26': 'Asia/Chongqing', -203 '28': 'Asia/Shanghai', -204 '29': 'Asia/Chongqing', -205 '30': 'Asia/Chongqing', -206 '31': 'Asia/Chongqing', -207 '32': 'Asia/Chongqing', -208 '33': 'Asia/Chongqing' -209 }, -210 'CO': 'America/Bogota', -211 'CR': 'America/Costa_Rica', -212 'CU': 'America/Havana', -213 'CV': 'Atlantic/Cape_Verde', -214 'CW': 'America/Curacao', -215 'CX': 'Indian/Christmas', -216 'CY': 'Asia/Nicosia', -217 'CZ': 'Europe/Prague', -218 'DE': 'Europe/Berlin', -219 'DJ': 'Africa/Djibouti', -220 'DK': 'Europe/Copenhagen', -221 'DM': 'America/Dominica', -222 'DO': 'America/Santo_Domingo', -223 'DZ': 'Africa/Algiers', -224 'EC': { -225 '01': 'Pacific/Galapagos', -226 '02': 'America/Guayaquil', -227 '03': 'America/Guayaquil', -228 '04': 'America/Guayaquil', -229 '05': 'America/Guayaquil', -230 '06': 'America/Guayaquil', -231 '07': 'America/Guayaquil', -232 '08': 'America/Guayaquil', -233 '09': 'America/Guayaquil', -234 '10': 'America/Guayaquil', -235 '11': 'America/Guayaquil', -236 '12': 'America/Guayaquil', -237 '13': 'America/Guayaquil', -238 '14': 'America/Guayaquil', -239 '15': 'America/Guayaquil', -240 '17': 'America/Guayaquil', -241 '18': 'America/Guayaquil', -242 '19': 'America/Guayaquil', -243 '20': 'America/Guayaquil', -244 '22': 'America/Guayaquil' -245 }, -246 'EE': 'Europe/Tallinn', -247 'EG': 'Africa/Cairo', -248 'EH': 'Africa/El_Aaiun', -249 'ER': 'Africa/Asmera', -250 'ES': { -251 '07': 'Europe/Madrid', -252 '27': 'Europe/Madrid', -253 '29': 'Europe/Madrid', -254 '31': 'Europe/Madrid', -255 '32': 'Europe/Madrid', -256 '34': 'Europe/Madrid', -257 '39': 'Europe/Madrid', -258 '51': 'Africa/Ceuta', -259 '52': 'Europe/Madrid', -260 '53': 'Atlantic/Canary', -261 '54': 'Europe/Madrid', -262 '55': 'Europe/Madrid', -263 '56': 'Europe/Madrid', -264 '57': 'Europe/Madrid', -265 '58': 'Europe/Madrid', -266 '59': 'Europe/Madrid', -267 '60': 'Europe/Madrid' -268 }, -269 'ET': 'Africa/Addis_Ababa', -270 'FI': 'Europe/Helsinki', -271 'FJ': 'Pacific/Fiji', -272 'FK': 'Atlantic/Stanley', -273 'FO': 'Atlantic/Faeroe', -274 'FR': 'Europe/Paris', -275 'FX': 'Europe/Paris', -276 'GA': 'Africa/Libreville', -277 'GB': 'Europe/London', -278 'GD': 'America/Grenada', -279 'GE': 'Asia/Tbilisi', -280 'GF': 'America/Cayenne', -281 'GG': 'Europe/Guernsey', -282 'GH': 'Africa/Accra', -283 'GI': 'Europe/Gibraltar', -284 'GL': { -285 '01': 'America/Thule', -286 '02': 'America/Godthab', -287 '03': 'America/Godthab' -288 }, -289 'GM': 'Africa/Banjul', -290 'GN': 'Africa/Conakry', -291 'GP': 'America/Guadeloupe', -292 'GQ': 'Africa/Malabo', -293 'GR': 'Europe/Athens', -294 'GS': 'Atlantic/South_Georgia', -295 'GT': 'America/Guatemala', -296 'GU': 'Pacific/Guam', -297 'GW': 'Africa/Bissau', -298 'GY': 'America/Guyana', -299 'HK': 'Asia/Hong_Kong', -300 'HN': 'America/Tegucigalpa', -301 'HR': 'Europe/Zagreb', -302 'HT': 'America/Port-au-Prince', -303 'HU': 'Europe/Budapest', -304 'ID': { -305 '01': 'Asia/Pontianak', -306 '02': 'Asia/Makassar', -307 '03': 'Asia/Jakarta', -308 '04': 'Asia/Jakarta', -309 '05': 'Asia/Jakarta', -310 '06': 'Asia/Jakarta', -311 '07': 'Asia/Jakarta', -312 '08': 'Asia/Jakarta', -313 '09': 'Asia/Jayapura', -314 '10': 'Asia/Jakarta', -315 '11': 'Asia/Pontianak', -316 '12': 'Asia/Makassar', -317 '13': 'Asia/Makassar', -318 '14': 'Asia/Makassar', -319 '15': 'Asia/Jakarta', -320 '16': 'Asia/Makassar', -321 '17': 'Asia/Makassar', -322 '18': 'Asia/Makassar', -323 '19': 'Asia/Pontianak', -324 '20': 'Asia/Makassar', -325 '21': 'Asia/Makassar', -326 '22': 'Asia/Makassar', -327 '23': 'Asia/Makassar', -328 '24': 'Asia/Jakarta', -329 '25': 'Asia/Pontianak', -330 '26': 'Asia/Pontianak', -331 '30': 'Asia/Jakarta', -332 '31': 'Asia/Makassar', -333 '33': 'Asia/Jakarta' -334 }, -335 'IE': 'Europe/Dublin', -336 'IL': 'Asia/Jerusalem', -337 'IM': 'Europe/Isle_of_Man', -338 'IN': 'Asia/Calcutta', -339 'IO': 'Indian/Chagos', -340 'IQ': 'Asia/Baghdad', -341 'IR': 'Asia/Tehran', -342 'IS': 'Atlantic/Reykjavik', -343 'IT': 'Europe/Rome', -344 'JE': 'Europe/Jersey', -345 'JM': 'America/Jamaica', -346 'JO': 'Asia/Amman', -347 'JP': 'Asia/Tokyo', -348 'KE': 'Africa/Nairobi', -349 'KG': 'Asia/Bishkek', -350 'KH': 'Asia/Phnom_Penh', -351 'KI': 'Pacific/Tarawa', -352 'KM': 'Indian/Comoro', -353 'KN': 'America/St_Kitts', -354 'KP': 'Asia/Pyongyang', -355 'KR': 'Asia/Seoul', -356 'KW': 'Asia/Kuwait', -357 'KY': 'America/Cayman', -358 'KZ': { -359 '01': 'Asia/Almaty', -360 '02': 'Asia/Almaty', -361 '03': 'Asia/Qyzylorda', -362 '04': 'Asia/Aqtobe', -363 '05': 'Asia/Qyzylorda', -364 '06': 'Asia/Aqtau', -365 '07': 'Asia/Oral', -366 '08': 'Asia/Qyzylorda', -367 '09': 'Asia/Aqtau', -368 '10': 'Asia/Qyzylorda', -369 '11': 'Asia/Almaty', -370 '12': 'Asia/Qyzylorda', -371 '13': 'Asia/Aqtobe', -372 '14': 'Asia/Qyzylorda', -373 '15': 'Asia/Almaty', -374 '16': 'Asia/Aqtobe', -375 '17': 'Asia/Almaty' -376 }, -377 'LA': 'Asia/Vientiane', -378 'LB': 'Asia/Beirut', -379 'LC': 'America/St_Lucia', -380 'LI': 'Europe/Vaduz', -381 'LK': 'Asia/Colombo', -382 'LR': 'Africa/Monrovia', -383 'LS': 'Africa/Maseru', -384 'LT': 'Europe/Vilnius', -385 'LU': 'Europe/Luxembourg', -386 'LV': 'Europe/Riga', -387 'LY': 'Africa/Tripoli', -388 'MA': 'Africa/Casablanca', -389 'MC': 'Europe/Monaco', -390 'MD': 'Europe/Chisinau', -391 'ME': 'Europe/Podgorica', -392 'MF': 'America/Marigot', -393 'MG': 'Indian/Antananarivo', -394 'MK': 'Europe/Skopje', -395 'ML': 'Africa/Bamako', -396 'MM': 'Asia/Rangoon', -397 'MN': 'Asia/Choibalsan', -398 'MO': 'Asia/Macao', -399 'MP': 'Pacific/Saipan', -400 'MQ': 'America/Martinique', -401 'MR': 'Africa/Nouakchott', -402 'MS': 'America/Montserrat', -403 'MT': 'Europe/Malta', -404 'MU': 'Indian/Mauritius', -405 'MV': 'Indian/Maldives', -406 'MW': 'Africa/Blantyre', -407 'MX': { -408 '01': 'America/Mexico_City', -409 '02': 'America/Tijuana', -410 '03': 'America/Hermosillo', -411 '04': 'America/Merida', -412 '05': 'America/Mexico_City', -413 '06': 'America/Chihuahua', -414 '07': 'America/Monterrey', -415 '08': 'America/Mexico_City', -416 '09': 'America/Mexico_City', -417 '10': 'America/Mazatlan', -418 '11': 'America/Mexico_City', -419 '12': 'America/Mexico_City', -420 '13': 'America/Mexico_City', -421 '14': 'America/Mazatlan', -422 '15': 'America/Chihuahua', -423 '16': 'America/Mexico_City', -424 '17': 'America/Mexico_City', -425 '18': 'America/Mazatlan', -426 '19': 'America/Monterrey', -427 '20': 'America/Mexico_City', -428 '21': 'America/Mexico_City', -429 '22': 'America/Mexico_City', -430 '23': 'America/Cancun', -431 '24': 'America/Mexico_City', -432 '25': 'America/Mazatlan', -433 '26': 'America/Hermosillo', -434 '27': 'America/Merida', -435 '28': 'America/Monterrey', -436 '29': 'America/Mexico_City', -437 '30': 'America/Mexico_City', -438 '31': 'America/Merida', -439 '32': 'America/Monterrey' -440 }, -441 'MY': { -442 '01': 'Asia/Kuala_Lumpur', -443 '02': 'Asia/Kuala_Lumpur', -444 '03': 'Asia/Kuala_Lumpur', -445 '04': 'Asia/Kuala_Lumpur', -446 '05': 'Asia/Kuala_Lumpur', -447 '06': 'Asia/Kuala_Lumpur', -448 '07': 'Asia/Kuala_Lumpur', -449 '08': 'Asia/Kuala_Lumpur', -450 '09': 'Asia/Kuala_Lumpur', -451 '11': 'Asia/Kuching', -452 '12': 'Asia/Kuala_Lumpur', -453 '13': 'Asia/Kuala_Lumpur', -454 '14': 'Asia/Kuala_Lumpur', -455 '15': 'Asia/Kuching', -456 '16': 'Asia/Kuching' -457 }, -458 'MZ': 'Africa/Maputo', -459 'NA': 'Africa/Windhoek', -460 'NC': 'Pacific/Noumea', -461 'NE': 'Africa/Niamey', -462 'NF': 'Pacific/Norfolk', -463 'NG': 'Africa/Lagos', -464 'NI': 'America/Managua', -465 'NL': 'Europe/Amsterdam', -466 'NO': 'Europe/Oslo', -467 'NP': 'Asia/Katmandu', -468 'NR': 'Pacific/Nauru', -469 'NU': 'Pacific/Niue', -470 'NZ': { -471 '85': 'Pacific/Auckland', -472 'E7': 'Pacific/Auckland', -473 'E8': 'Pacific/Auckland', -474 'E9': 'Pacific/Auckland', -475 'F1': 'Pacific/Auckland', -476 'F2': 'Pacific/Auckland', -477 'F3': 'Pacific/Auckland', -478 'F4': 'Pacific/Auckland', -479 'F5': 'Pacific/Auckland', -480 'F7': 'Pacific/Chatham', -481 'F8': 'Pacific/Auckland', -482 'F9': 'Pacific/Auckland', -483 'G1': 'Pacific/Auckland', -484 'G2': 'Pacific/Auckland', -485 'G3': 'Pacific/Auckland' -486 }, -487 'OM': 'Asia/Muscat', -488 'PA': 'America/Panama', -489 'PE': 'America/Lima', -490 'PF': 'Pacific/Marquesas', -491 'PG': 'Pacific/Port_Moresby', -492 'PH': 'Asia/Manila', -493 'PK': 'Asia/Karachi', -494 'PL': 'Europe/Warsaw', -495 'PM': 'America/Miquelon', -496 'PN': 'Pacific/Pitcairn', -497 'PR': 'America/Puerto_Rico', -498 'PS': 'Asia/Gaza', -499 'PT': { -500 '02': 'Europe/Lisbon', -501 '03': 'Europe/Lisbon', -502 '04': 'Europe/Lisbon', -503 '05': 'Europe/Lisbon', -504 '06': 'Europe/Lisbon', -505 '07': 'Europe/Lisbon', -506 '08': 'Europe/Lisbon', -507 '09': 'Europe/Lisbon', -508 '10': 'Atlantic/Madeira', -509 '11': 'Europe/Lisbon', -510 '13': 'Europe/Lisbon', -511 '14': 'Europe/Lisbon', -512 '16': 'Europe/Lisbon', -513 '17': 'Europe/Lisbon', -514 '18': 'Europe/Lisbon', -515 '19': 'Europe/Lisbon', -516 '20': 'Europe/Lisbon', -517 '21': 'Europe/Lisbon', -518 '22': 'Europe/Lisbon' -519 }, -520 'PW': 'Pacific/Palau', -521 'PY': 'America/Asuncion', -522 'QA': 'Asia/Qatar', -523 'RE': 'Indian/Reunion', -524 'RO': 'Europe/Bucharest', -525 'RS': 'Europe/Belgrade', -526 'RU': { -527 '01': 'Europe/Volgograd', -528 '02': 'Asia/Irkutsk', -529 '03': 'Asia/Novokuznetsk', -530 '04': 'Asia/Novosibirsk', -531 '05': 'Asia/Vladivostok', -532 '06': 'Europe/Moscow', -533 '07': 'Europe/Volgograd', -534 '08': 'Europe/Samara', -535 '09': 'Europe/Moscow', -536 '10': 'Europe/Moscow', -537 '11': 'Asia/Irkutsk', -538 '13': 'Asia/Yekaterinburg', -539 '14': 'Asia/Irkutsk', -540 '15': 'Asia/Anadyr', -541 '16': 'Europe/Samara', -542 '17': 'Europe/Volgograd', -543 '18': 'Asia/Krasnoyarsk', -544 '20': 'Asia/Irkutsk', -545 '21': 'Europe/Moscow', -546 '22': 'Europe/Volgograd', -547 '23': 'Europe/Kaliningrad', -548 '24': 'Europe/Volgograd', -549 '25': 'Europe/Moscow', -550 '26': 'Asia/Kamchatka', -551 '27': 'Europe/Volgograd', -552 '28': 'Europe/Moscow', -553 '29': 'Asia/Novokuznetsk', -554 '30': 'Asia/Vladivostok', -555 '31': 'Asia/Krasnoyarsk', -556 '32': 'Asia/Omsk', -557 '33': 'Asia/Yekaterinburg', -558 '34': 'Asia/Yekaterinburg', -559 '35': 'Asia/Yekaterinburg', -560 '36': 'Asia/Anadyr', -561 '37': 'Europe/Moscow', -562 '38': 'Europe/Volgograd', -563 '39': 'Asia/Krasnoyarsk', -564 '40': 'Asia/Yekaterinburg', -565 '41': 'Europe/Moscow', -566 '42': 'Europe/Moscow', -567 '43': 'Europe/Moscow', -568 '44': 'Asia/Magadan', -569 '45': 'Europe/Samara', -570 '46': 'Europe/Samara', -571 '47': 'Europe/Moscow', -572 '48': 'Europe/Moscow', -573 '49': 'Europe/Moscow', -574 '50': 'Asia/Yekaterinburg', -575 '51': 'Europe/Moscow', -576 '52': 'Europe/Moscow', -577 '53': 'Asia/Novosibirsk', -578 '54': 'Asia/Omsk', -579 '55': 'Europe/Samara', -580 '56': 'Europe/Moscow', -581 '57': 'Europe/Samara', -582 '58': 'Asia/Yekaterinburg', -583 '59': 'Asia/Vladivostok', -584 '60': 'Europe/Kaliningrad', -585 '61': 'Europe/Volgograd', -586 '62': 'Europe/Moscow', -587 '63': 'Asia/Yakutsk', -588 '64': 'Asia/Sakhalin', -589 '65': 'Europe/Samara', -590 '66': 'Europe/Moscow', -591 '67': 'Europe/Samara', -592 '68': 'Europe/Volgograd', -593 '69': 'Europe/Moscow', -594 '70': 'Europe/Volgograd', -595 '71': 'Asia/Yekaterinburg', -596 '72': 'Europe/Moscow', -597 '73': 'Europe/Samara', -598 '74': 'Asia/Krasnoyarsk', -599 '75': 'Asia/Novosibirsk', -600 '76': 'Europe/Moscow', -601 '77': 'Europe/Moscow', -602 '78': 'Asia/Yekaterinburg', -603 '79': 'Asia/Irkutsk', -604 '80': 'Asia/Yekaterinburg', -605 '81': 'Europe/Samara', -606 '82': 'Asia/Irkutsk', -607 '83': 'Europe/Moscow', -608 '84': 'Europe/Volgograd', -609 '85': 'Europe/Moscow', -610 '86': 'Europe/Moscow', -611 '87': 'Asia/Novosibirsk', -612 '88': 'Europe/Moscow', -613 '89': 'Asia/Vladivostok' -614 }, -615 'RW': 'Africa/Kigali', -616 'SA': 'Asia/Riyadh', -617 'SB': 'Pacific/Guadalcanal', -618 'SC': 'Indian/Mahe', -619 'SD': 'Africa/Khartoum', -620 'SE': 'Europe/Stockholm', -621 'SG': 'Asia/Singapore', -622 'SH': 'Atlantic/St_Helena', -623 'SI': 'Europe/Ljubljana', -624 'SJ': 'Arctic/Longyearbyen', -625 'SK': 'Europe/Bratislava', -626 'SL': 'Africa/Freetown', -627 'SM': 'Europe/San_Marino', -628 'SN': 'Africa/Dakar', -629 'SO': 'Africa/Mogadishu', -630 'SR': 'America/Paramaribo', -631 'SS': 'Africa/Juba', -632 'ST': 'Africa/Sao_Tome', -633 'SV': 'America/El_Salvador', -634 'SX': 'America/Curacao', -635 'SY': 'Asia/Damascus', -636 'SZ': 'Africa/Mbabane', -637 'TC': 'America/Grand_Turk', -638 'TD': 'Africa/Ndjamena', -639 'TF': 'Indian/Kerguelen', -640 'TG': 'Africa/Lome', -641 'TH': 'Asia/Bangkok', -642 'TJ': 'Asia/Dushanbe', -643 'TK': 'Pacific/Fakaofo', -644 'TL': 'Asia/Dili', -645 'TM': 'Asia/Ashgabat', -646 'TN': 'Africa/Tunis', -647 'TO': 'Pacific/Tongatapu', -648 'TR': 'Asia/Istanbul', -649 'TT': 'America/Port_of_Spain', -650 'TV': 'Pacific/Funafuti', -651 'TW': 'Asia/Taipei', -652 'TZ': 'Africa/Dar_es_Salaam', -653 'UA': { -654 '01': 'Europe/Kiev', -655 '02': 'Europe/Kiev', -656 '03': 'Europe/Uzhgorod', -657 '04': 'Europe/Zaporozhye', -658 '05': 'Europe/Zaporozhye', -659 '06': 'Europe/Uzhgorod', -660 '07': 'Europe/Zaporozhye', -661 '08': 'Europe/Simferopol', -662 '09': 'Europe/Kiev', -663 '10': 'Europe/Zaporozhye', -664 '11': 'Europe/Simferopol', -665 '13': 'Europe/Kiev', -666 '14': 'Europe/Zaporozhye', -667 '15': 'Europe/Uzhgorod', -668 '16': 'Europe/Zaporozhye', -669 '17': 'Europe/Simferopol', -670 '18': 'Europe/Zaporozhye', -671 '19': 'Europe/Kiev', -672 '20': 'Europe/Simferopol', -673 '21': 'Europe/Kiev', -674 '22': 'Europe/Uzhgorod', -675 '23': 'Europe/Kiev', -676 '24': 'Europe/Uzhgorod', -677 '25': 'Europe/Uzhgorod', -678 '26': 'Europe/Zaporozhye', -679 '27': 'Europe/Kiev' -680 }, -681 'UG': 'Africa/Kampala', -682 'US': { -683 'AK': 'America/Anchorage', -684 'AL': 'America/Chicago', -685 'AR': 'America/Chicago', -686 'AZ': 'America/Phoenix', -687 'CA': 'America/Los_Angeles', -688 'CO': 'America/Denver', -689 'CT': 'America/New_York', -690 'DC': 'America/New_York', -691 'DE': 'America/New_York', -692 'FL': 'America/New_York', -693 'GA': 'America/New_York', -694 'HI': 'Pacific/Honolulu', -695 'IA': 'America/Chicago', -696 'ID': 'America/Denver', -697 'IL': 'America/Chicago', -698 'IN': 'America/Indianapolis', -699 'KS': 'America/Chicago', -700 'KY': 'America/New_York', -701 'LA': 'America/Chicago', -702 'MA': 'America/New_York', -703 'MD': 'America/New_York', -704 'ME': 'America/New_York', -705 'MI': 'America/New_York', -706 'MN': 'America/Chicago', -707 'MO': 'America/Chicago', -708 'MS': 'America/Chicago', -709 'MT': 'America/Denver', -710 'NC': 'America/New_York', -711 'ND': 'America/Chicago', -712 'NE': 'America/Chicago', -713 'NH': 'America/New_York', -714 'NJ': 'America/New_York', -715 'NM': 'America/Denver', -716 'NV': 'America/Los_Angeles', -717 'NY': 'America/New_York', -718 'OH': 'America/New_York', -719 'OK': 'America/Chicago', -720 'OR': 'America/Los_Angeles', -721 'PA': 'America/New_York', -722 'RI': 'America/New_York', -723 'SC': 'America/New_York', -724 'SD': 'America/Chicago', -725 'TN': 'America/Chicago', -726 'TX': 'America/Chicago', -727 'UT': 'America/Denver', -728 'VA': 'America/New_York', -729 'VT': 'America/New_York', -730 'WA': 'America/Los_Angeles', -731 'WI': 'America/Chicago', -732 'WV': 'America/New_York', -733 'WY': 'America/Denver' -734 }, -735 'UY': 'America/Montevideo', -736 'UZ': { -737 '01': 'Asia/Tashkent', -738 '02': 'Asia/Samarkand', -739 '03': 'Asia/Tashkent', -740 '06': 'Asia/Tashkent', -741 '07': 'Asia/Samarkand', -742 '08': 'Asia/Samarkand', -743 '09': 'Asia/Samarkand', -744 '10': 'Asia/Samarkand', -745 '12': 'Asia/Samarkand', -746 '13': 'Asia/Tashkent', -747 '14': 'Asia/Tashkent' -748 }, -749 'VA': 'Europe/Vatican', -750 'VC': 'America/St_Vincent', -751 'VE': 'America/Caracas', -752 'VG': 'America/Tortola', -753 'VI': 'America/St_Thomas', -754 'VN': 'Asia/Phnom_Penh', -755 'VU': 'Pacific/Efate', -756 'WF': 'Pacific/Wallis', -757 'WS': 'Pacific/Samoa', -758 'YE': 'Asia/Aden', -759 'YT': 'Indian/Mayotte', -760 'YU': 'Europe/Belgrade', -761 'ZA': 'Africa/Johannesburg', -762 'ZM': 'Africa/Lusaka', -763 'ZW': 'Africa/Harare' -764 } -765 -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip.util-module.html b/apidocs/html/pygeoip.util-module.html deleted file mode 100644 index f2f9a74..0000000 --- a/apidocs/html/pygeoip.util-module.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - pygeoip.util - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Module util - - - - - -
[frames] | no frames]
-
- -

Module util

source code

-

Utility function for address translation

- -
-
Authors:
-
- Jennifer Ennis <zaylea@gmail.com>, - William Tisäter <william@defunct.cc> -
-
-

License: - Copyright(C) 2004 MaxMind LLC -

This program 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 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 Lesser General Public - License along with this program. If not, see - <http://www.gnu.org/licenses/lgpl.txt>.

-

-
- - - - - - - - -
- Functions
-   - - - - - - -
ip2long(ip)
- Wrapper function for IPv4 and IPv6 converters
- source code - -
- -
- - - - - - - - - -
- Variables
-   - - __package__ = 'pygeoip' -
- - - - - - -
- Function Details
- -
- -
- - -
-

ip2long(ip) -

-
source code  -
- -

Wrapper function for IPv4 and IPv6 converters

-
-
Parameters:
-
    -
  • ip (str) - IPv4 or IPv6 address
  • -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/pygeoip.util-pysrc.html b/apidocs/html/pygeoip.util-pysrc.html deleted file mode 100644 index b4dfdcc..0000000 --- a/apidocs/html/pygeoip.util-pysrc.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - pygeoip.util - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package pygeoip :: - Module util - - - - - -
[frames] | no frames]
-
-

Source Code for Module pygeoip.util

-
- 1  # -*- coding: utf-8 -*- 
- 2  """ 
- 3  Utility function for address translation 
- 4   
- 5  @author: Jennifer Ennis <zaylea@gmail.com> 
- 6  @author: William Tisäter <william@defunct.cc> 
- 7   
- 8  @license: Copyright(C) 2004 MaxMind LLC 
- 9   
-10  This program is free software: you can redistribute it and/or modify 
-11  it under the terms of the GNU Lesser General Public License as published by 
-12  the Free Software Foundation, either version 3 of the License, or 
-13  (at your option) any later version. 
-14   
-15  This program is distributed in the hope that it will be useful, 
-16  but WITHOUT ANY WARRANTY; without even the implied warranty of 
-17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
-18  GNU General Public License for more details. 
-19   
-20  You should have received a copy of the GNU Lesser General Public License 
-21  along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>. 
-22  """ 
-23   
-24  import socket 
-25  import binascii 
-26   
-27   
-
28 -def ip2long(ip): -
29 """ -30 Wrapper function for IPv4 and IPv6 converters -31 @param ip: IPv4 or IPv6 address -32 @type ip: str -33 """ -34 try: -35 return int(binascii.hexlify(socket.inet_aton(ip)), 16) -36 except socket.error: -37 return int(binascii.hexlify(socket.inet_pton(socket.AF_INET6, ip)), 16) -
38 -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/apidocs/html/redirect.html b/apidocs/html/redirect.html deleted file mode 100644 index 3014e98..0000000 --- a/apidocs/html/redirect.html +++ /dev/null @@ -1,38 +0,0 @@ -Epydoc Redirect Page - - - - - - - - -

Epydoc Auto-redirect page

- -

When javascript is enabled, this page will redirect URLs of -the form redirect.html#dotted.name to the -documentation for the object with the given fully-qualified -dotted name.

-

 

- - - - - diff --git a/apidocs/html/toc-everything.html b/apidocs/html/toc-everything.html deleted file mode 100644 index d4fe474..0000000 --- a/apidocs/html/toc-everything.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - Everything - - - - - -

Everything

-
-

All Classes

- pygeoip.GeoIP
pygeoip.GeoIPError

All Functions

- pygeoip.timezone.time_zone_by_country_and_region
pygeoip.util.ip2long

All Variables

- pygeoip.ENCODING
pygeoip.MEMORY_CACHE
pygeoip.MMAP_CACHE
pygeoip.STANDARD
pygeoip.__package__
pygeoip.const.ASNUM_EDITION
pygeoip.const.ASNUM_EDITION_V6
pygeoip.const.CANADA_OFFSET
pygeoip.const.CITY_EDITIONS
pygeoip.const.CITY_EDITION_REV0
pygeoip.const.CITY_EDITION_REV1
pygeoip.const.CITY_EDITION_REV1_V6
pygeoip.const.CONTINENT_NAMES
pygeoip.const.COUNTRY_BEGIN
pygeoip.const.COUNTRY_CODES
pygeoip.const.COUNTRY_CODES3
pygeoip.const.COUNTRY_EDITION
pygeoip.const.COUNTRY_EDITION_V6
pygeoip.const.COUNTRY_NAMES
pygeoip.const.DATABASE_INFO_MAX_SIZE
pygeoip.const.DMA_MAP
pygeoip.const.ENCODING
pygeoip.const.FIPS_RANGE
pygeoip.const.FULL_RECORD_LENGTH
pygeoip.const.GEOIP_MEMORY_CACHE
pygeoip.const.GEOIP_STANDARD
pygeoip.const.IPV6_EDITIONS
pygeoip.const.ISP_EDITION
pygeoip.const.MAX_ORG_RECORD_LENGTH
pygeoip.const.MAX_RECORD_LENGTH
pygeoip.const.MEMORY_CACHE
pygeoip.const.MMAP_CACHE
pygeoip.const.NETSPEED_EDITION
pygeoip.const.ORG_EDITION
pygeoip.const.ORG_RECORD_LENGTH
pygeoip.const.PROXY_EDITION
pygeoip.const.PY2
pygeoip.const.PY3
pygeoip.const.REGION_CITY_EDITIONS
pygeoip.const.REGION_EDITIONS
pygeoip.const.REGION_EDITION_REV0
pygeoip.const.REGION_EDITION_REV1
pygeoip.const.SEGMENT_RECORD_LENGTH
pygeoip.const.STANDARD
pygeoip.const.STANDARD_RECORD_LENGTH
pygeoip.const.STATE_BEGIN_REV0
pygeoip.const.STATE_BEGIN_REV1
pygeoip.const.STRUCTURE_INFO_MAX_SIZE
pygeoip.const.US_OFFSET
pygeoip.const.WORLD_OFFSET
pygeoip.const.__package__
pygeoip.timezone.__package__
pygeoip.timezone.country_dict
pygeoip.util.__package__

- - - - diff --git a/apidocs/html/toc-pygeoip-module.html b/apidocs/html/toc-pygeoip-module.html deleted file mode 100644 index a1fd3ef..0000000 --- a/apidocs/html/toc-pygeoip-module.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - pygeoip - - - - - -

Module pygeoip

-
-

Classes

- GeoIP
GeoIPError

Variables

- ENCODING
MEMORY_CACHE
MMAP_CACHE
STANDARD
__package__

- - - - diff --git a/apidocs/html/toc-pygeoip.const-module.html b/apidocs/html/toc-pygeoip.const-module.html deleted file mode 100644 index 72862b1..0000000 --- a/apidocs/html/toc-pygeoip.const-module.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - const - - - - - -

Module const

-
-

Variables

- ASNUM_EDITION
ASNUM_EDITION_V6
CANADA_OFFSET
CITY_EDITIONS
CITY_EDITION_REV0
CITY_EDITION_REV1
CITY_EDITION_REV1_V6
CONTINENT_NAMES
COUNTRY_BEGIN
COUNTRY_CODES
COUNTRY_CODES3
COUNTRY_EDITION
COUNTRY_EDITION_V6
COUNTRY_NAMES
DATABASE_INFO_MAX_SIZE
DMA_MAP
ENCODING
FIPS_RANGE
FULL_RECORD_LENGTH
GEOIP_MEMORY_CACHE
GEOIP_STANDARD
IPV6_EDITIONS
ISP_EDITION
MAX_ORG_RECORD_LENGTH
MAX_RECORD_LENGTH
MEMORY_CACHE
MMAP_CACHE
NETSPEED_EDITION
ORG_EDITION
ORG_RECORD_LENGTH
PROXY_EDITION
PY2
PY3
REGION_CITY_EDITIONS
REGION_EDITIONS
REGION_EDITION_REV0
REGION_EDITION_REV1
SEGMENT_RECORD_LENGTH
STANDARD
STANDARD_RECORD_LENGTH
STATE_BEGIN_REV0
STATE_BEGIN_REV1
STRUCTURE_INFO_MAX_SIZE
US_OFFSET
WORLD_OFFSET
__package__

- - - - diff --git a/apidocs/html/toc-pygeoip.timezone-module.html b/apidocs/html/toc-pygeoip.timezone-module.html deleted file mode 100644 index ac9a33d..0000000 --- a/apidocs/html/toc-pygeoip.timezone-module.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - timezone - - - - - -

Module timezone

-
-

Functions

- time_zone_by_country_and_region

Variables

- __package__
country_dict

- - - - diff --git a/apidocs/html/toc-pygeoip.util-module.html b/apidocs/html/toc-pygeoip.util-module.html deleted file mode 100644 index a76bd16..0000000 --- a/apidocs/html/toc-pygeoip.util-module.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - util - - - - - -

Module util

-
-

Functions

- ip2long

Variables

- __package__

- - - - diff --git a/apidocs/html/toc.html b/apidocs/html/toc.html deleted file mode 100644 index 9852f74..0000000 --- a/apidocs/html/toc.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Table of Contents - - - - - -

Table of Contents

-
- Everything -
-

Modules

- pygeoip
pygeoip.const
pygeoip.timezone
pygeoip.util

- - - - diff --git a/build.sh b/build.sh index 2f34776..40bb054 100755 --- a/build.sh +++ b/build.sh @@ -10,7 +10,7 @@ pushd $(dirname $0) if [ ! -d venv ]; then virtualenv venv || error "virtualenv failed" - venv/bin/pip install tox nose epydoc || error "pip failed" + venv/bin/pip install tox nose || error "pip failed" fi if [ ! -d tests/data ]; then @@ -22,7 +22,6 @@ pushd $(dirname $0) fi venv/bin/tox || error "tox failed" - venv/bin/epydoc --config=epydoc.ini --no-private || error "epydoc failed" perl -pi -e 's/Generated by Epydoc (\d+\.\d+\.\d+) .*/Generated by Epydoc $1/' apidocs/html/*.html if [ -z "$(pandoc --version)" ]; then diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..666885b --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pygeoip.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pygeoip.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/pygeoip" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pygeoip" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..6ace4bf9e6b562cb74d25d4a7e5191d9938ac282 GIT binary patch literal 4093 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css new file mode 100644 index 0000000..a04c8e1 --- /dev/null +++ b/docs/_build/html/_static/basic.css @@ -0,0 +1,540 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2013 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; +} + +/* -- 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; +} + +.refcount { + color: #060; +} + +.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 0000000000000000000000000000000000000000..551517b8c83b76f734ff791f847829a760ad1903 GIT binary patch literal 3500 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 A2LJ#7 literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/comment.png b/docs/_build/html/_static/comment.png new file mode 100644 index 0000000000000000000000000000000000000000..92feb52b8824c6b0f59b658b1196c61de9162a95 GIT binary patch literal 3445 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 Xn!ZpXD%P(H00000NkvXXu0mjf= 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'); + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .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 0000000000000000000000000000000000000000..6f7ad782782e4f8e39b0c6e15c7344700cdd2527 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}Z23@f-Ava~9&<9T!#}JFtXD=!G zGdl{fK6ro2OGiOl+hKvH6i=D3%%Y^j`yIkRn!8O>@bG)IQR0{Kf+mxNd=_WScA8u_ z3;8(7x2){m9`nt+U(Nab&1G)!{`SPVpDX$w8McLTzAJ39wprG3p4XLq$06M`%}2Yk zRPPsbES*dnYm1wkGL;iioAUB*Or2kz6(-M_r_#Me-`{mj$Z%( literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/down.png b/docs/_build/html/_static/down.png new file mode 100644 index 0000000000000000000000000000000000000000..3003a88770de3977d47a2ba69893436a2860f9e7 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}xaV3tUZ$qnrLa#kt978NlpS`ru z&)HFc^}^>{UOEce+71h5nn>6&w6A!ieNbu1wh)UGh{8~et^#oZ1# z>T7oM=FZ~xXWnTo{qnXm$ZLOlqGswI_m2{XwVK)IJmBjW{J3-B3x@C=M{ShWt#fYS9M?R;8K$~YwlIqwf>VA7q=YKcwf2DS4Zj5inDKXXB1zl=(YO3ST6~rDq)&z z*o>z)=hxrfG-cDBW0G$!?6{M<$@{_4{m1o%Ub!naEtn|@^frU1tDnm{r-UW|!^@B8 literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..d18082e397e7e54f20721af768c4c2983258f1b4 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$HyOL$D9)yc9|lc|nKf<9@eUiWd>3GuTC!a5vdfWYEazjncPj5ZQX%+1 zt8B*4=d)!cdDz4wr^#OMYfqGz$1LDFF>|#>*O?AGil(WEs?wLLy{Gj2J_@opDm%`dlax3yA*@*N$G&*ukFv>P8+2CBWO(qz zD0k1@kN>hhb1_6`&wrCswzINE(evt-5C1B^STi2@PmdKI;Vst0PQB6!2kdN literal 0 HcmV?d00001 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(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="
t
",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="
",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;ti.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="
",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="

",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t0)for(i=r;i=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*\s*$/g,Nt={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X
","
"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1>");try{for(;r1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]===""&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("
").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..da1c5620d10c047525a467a425abe9ff5269cfc2 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1SHkYJtzcHoCO|{#XvD(5N2eUHAey{$X?>< z>&kweokM_|(Po{+Q=kw>iEBiObAE1aYF-J$w=>iB1I2R$WLpMkF=>bh=@O1TaS?83{1OVknK< z>&kweokM`jkU7Va11Q8%;u=xnoS&PUnpeW`?aZ|OK(QcC7sn8Z%gHvy&v=;Q4jejg zV8NnAO`-4Z@2~&zopr02WF_WB>pF literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css new file mode 100644 index 0000000..d79caa1 --- /dev/null +++ b/docs/_build/html/_static/pygments.css @@ -0,0 +1,62 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js new file mode 100644 index 0000000..cbafbed --- /dev/null +++ b/docs/_build/html/_static/searchtools.js @@ -0,0 +1,622 @@ +/* + * searchtools.js_t + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilties for the full-text search. + * + * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + + + +/** + * Simple result scoring code. + */ +var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [filename, title, anchor, descr, score] + // and returns the new score. + /* + score: function(result) { + return result[4]; + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: {0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5}, // used to be unimportantResults + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + // query found in terms + term: 5 +}; + + +/** + * Search Module + */ +var Search = { + + _index : null, + _queued_query : null, + _pulse_status : -1, + + init : function() { + var params = $.getQueryParameters(); + if (params.q) { + var query = params.q[0]; + $('input[name="q"]')[0].value = query; + this.performSearch(query); + } + }, + + loadIndex : function(url) { + $.ajax({type: "GET", url: url, data: null, + dataType: "script", cache: true, + complete: function(jqxhr, textstatus) { + if (textstatus != "success") { + document.getElementById("searchindexloader").src = url; + } + }}); + }, + + setIndex : function(index) { + var q; + this._index = index; + if ((q = this._queued_query) !== null) { + this._queued_query = null; + Search.query(q); + } + }, + + hasIndex : function() { + return this._index !== null; + }, + + deferQuery : function(query) { + this._queued_query = query; + }, + + stopPulse : function() { + this._pulse_status = 0; + }, + + startPulse : function() { + if (this._pulse_status >= 0) + return; + function pulse() { + var i; + Search._pulse_status = (Search._pulse_status + 1) % 4; + var dotString = ''; + for (i = 0; i < Search._pulse_status; i++) + dotString += '.'; + Search.dots.text(dotString); + if (Search._pulse_status > -1) + window.setTimeout(pulse, 500); + } + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch : function(query) { + // create the required interface elements + this.out = $('#search-results'); + this.title = $('

' + _('Searching') + '

').appendTo(this.out); + this.dots = $('').appendTo(this.title); + this.status = $('

').appendTo(this.out); + this.output = $('
'); + } + // Prettify the comment rating. + comment.pretty_rating = comment.rating + ' point' + + (comment.rating == 1 ? '' : 's'); + // Make a class (for displaying not yet moderated comments differently) + comment.css_class = comment.displayed ? '' : ' moderate'; + // Create a div for this comment. + var context = $.extend({}, opts, comment); + var div = $(renderTemplate(commentTemplate, context)); + + // If the user has voted on this comment, highlight the correct arrow. + if (comment.vote) { + var direction = (comment.vote == 1) ? 'u' : 'd'; + div.find('#' + direction + 'v' + comment.id).hide(); + div.find('#' + direction + 'u' + comment.id).show(); + } + + if (opts.moderator || comment.text != '[deleted]') { + div.find('a.reply').show(); + if (comment.proposal_diff) + div.find('#sp' + comment.id).show(); + if (opts.moderator && !comment.displayed) + div.find('#cm' + comment.id).show(); + if (opts.moderator || (opts.username == comment.username)) + div.find('#dc' + comment.id).show(); + } + return div; + } + + /** + * A simple template renderer. Placeholders such as <%id%> are replaced + * by context['id'] with items being escaped. Placeholders such as <#id#> + * are not escaped. + */ + function renderTemplate(template, context) { + var esc = $(document.createElement('div')); + + function handle(ph, escape) { + var cur = context; + $.each(ph.split('.'), function() { + cur = cur[this]; + }); + return escape ? esc.text(cur || "").html() : cur; + } + + return template.replace(/<([%#])([\w\.]*)\1>/g, function() { + return handle(arguments[2], arguments[1] == '%' ? true : false); + }); + } + + /** Flash an error message briefly. */ + function showError(message) { + $(document.createElement('div')).attr({'class': 'popup-error'}) + .append($(document.createElement('div')) + .attr({'class': 'error-message'}).text(message)) + .appendTo('body') + .fadeIn("slow") + .delay(2000) + .fadeOut("slow"); + } + + /** Add a link the user uses to open the comments popup. */ + $.fn.comment = function() { + return this.each(function() { + var id = $(this).attr('id').substring(1); + var count = COMMENT_METADATA[id]; + var title = count + ' comment' + (count == 1 ? '' : 's'); + var image = count > 0 ? opts.commentBrightImage : opts.commentImage; + var addcls = count == 0 ? ' nocomment' : ''; + $(this) + .append( + $(document.createElement('a')).attr({ + href: '#', + 'class': 'sphinx-comment-open' + addcls, + id: 'ao' + id + }) + .append($(document.createElement('img')).attr({ + src: image, + alt: 'comment', + title: title + })) + .click(function(event) { + event.preventDefault(); + show($(this).attr('id').substring(2)); + }) + ) + .append( + $(document.createElement('a')).attr({ + href: '#', + 'class': 'sphinx-comment-close hidden', + id: 'ah' + id + }) + .append($(document.createElement('img')).attr({ + src: opts.closeCommentImage, + alt: 'close', + title: 'close' + })) + .click(function(event) { + event.preventDefault(); + hide($(this).attr('id').substring(2)); + }) + ); + }); + }; + + var opts = { + processVoteURL: '/_process_vote', + addCommentURL: '/_add_comment', + getCommentsURL: '/_get_comments', + acceptCommentURL: '/_accept_comment', + deleteCommentURL: '/_delete_comment', + commentImage: '/static/_static/comment.png', + closeCommentImage: '/static/_static/comment-close.png', + loadingImage: '/static/_static/ajax-loader.gif', + commentBrightImage: '/static/_static/comment-bright.png', + upArrow: '/static/_static/up.png', + downArrow: '/static/_static/down.png', + upArrowPressed: '/static/_static/up-pressed.png', + downArrowPressed: '/static/_static/down-pressed.png', + voting: false, + moderator: false + }; + + if (typeof COMMENT_OPTIONS != "undefined") { + opts = jQuery.extend(opts, COMMENT_OPTIONS); + } + + var popupTemplate = '\ +
\ +

\ + Sort by:\ + best rated\ + newest\ + oldest\ +

\ +
Comments
\ +
\ + loading comments...
\ +
    \ +
    \ +

    Add a comment\ + (markup):

    \ +
    \ + reStructured text markup: *emph*, **strong**, \ + ``code``, \ + code blocks: :: and an indented block after blank line
    \ +
    \ + \ +

    \ + \ + Propose a change ▹\ + \ + \ + Propose a change ▿\ + \ +

    \ + \ + \ + \ + \ + \ +
    \ +
    '; + + var commentTemplate = '\ +
    \ +
    \ +
    \ + \ + \ + \ + \ + \ + \ +
    \ +
    \ + \ + \ + \ + \ + \ + \ +
    \ +
    \ +
    \ +

    \ + <%username%>\ + <%pretty_rating%>\ + <%time.delta%>\ +

    \ +
    <#text#>
    \ +

    \ + \ + reply ▿\ + proposal ▹\ + proposal ▿\ + \ + \ +

    \ +
    \
    +<#proposal_diff#>\
    +        
    \ +
      \ +
      \ +
      \ +
      \ + '; + + var replyTemplate = '\ +
    • \ +
      \ +
      \ + \ + \ + \ + \ + \ + \ +
      \ +
    • '; + + $(document).ready(function() { + init(); + }); +})(jQuery); + +$(document).ready(function() { + // add comment anchors for all paragraphs that are commentable + $('.sphinx-has-comment').comment(); + + // highlight search words in search results + $("div.context").each(function() { + var params = $.getQueryParameters(); + var terms = (params.q) ? params.q[0].split(/\s+/) : []; + var result = $(this); + $.each(terms, function() { + result.highlightText(this.toLowerCase(), 'highlighted'); + }); + }); + + // directly open comment window if requested + var anchor = document.location.hash; + if (anchor.substring(0, 9) == '#comment-') { + $('#ao' + anchor.substring(9)).click(); + document.location.hash = '#s' + anchor.substring(9); + } +}); diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html new file mode 100644 index 0000000..a01cc19 --- /dev/null +++ b/docs/_build/html/genindex.html @@ -0,0 +1,92 @@ + + + + + + + + + Index — pygeoip 0.3.0 documentation + + + + + + + + + + + + + +
      +
      +
      +
      + + +

      Index

      + +
      + +
      + + +
      +
      +
      +
      +
      + + + + + +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html new file mode 100644 index 0000000..ac82f62 --- /dev/null +++ b/docs/_build/html/index.html @@ -0,0 +1,111 @@ + + + + + + + + Welcome to pygeoip’s documentation! — pygeoip 0.3.0 documentation + + + + + + + + + + + + + +
      +
      +
      +
      + +
      +

      Welcome to pygeoip’s documentation!

      +

      Contents:

      +
      +
        +
      +
      +
      +
      +

      Indices and tables

      + +
      + + +
      +
      +
      +
      +
      +

      Table Of Contents

      + + +

      This Page

      + + + +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..730ee3ee8a3b65d3519a0dfef62749401ab162bc GIT binary patch literal 205 zcmY#Z2rkIT%&Sny%qvUHE6FdaR47X=D$dN$Q!wIERtPA{&q_@$u~I0gOi#_vEC33H zL8Pq|4D^ik41fY58L0|Iskw=nc`2zy3i)XYB^jB;3Tc@+sR}?kIX}0cD7CmaHASJc zI5RI@p(-acNsp`I*6FkUC(n3$t_{%8^W1pK)5q&<;04nVjTKkUwtBrto$} + + + + + + + Search — pygeoip 0.3.0 documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + +

      Search

      +
      + +

      + 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. +

      +
      + + + + + +
      + +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js new file mode 100644 index 0000000..54707dd --- /dev/null +++ b/docs/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({envversion:42,terms:{content:0,index:0,modul:0,search:0,page:0},objtypes:{},objnames:{},filenames:["index"],titles:["Welcome to pygeoip’s documentation!"],objects:{},titleterms:{pygeoip:0,document:0,welcom:0,indic:0,tabl:0}}) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..602668d --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- +# +# pygeoip documentation build configuration file, created by +# sphinx-quickstart on Thu Nov 14 10:52:22 2013. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.txt' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'pygeoip' +copyright = u'2013, Jennifer Ennis, William Tisäter' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.3.0' +# The full version, including alpha/beta/rc tags. +release = '0.3.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'nature' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'pygeoipdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'pygeoip.tex', u'pygeoip Documentation', + u'Jennifer Ennis, William Tisäter', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'pygeoip', u'pygeoip Documentation', + [u'Jennifer Ennis, William Tisäter'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'pygeoip', u'pygeoip Documentation', + u'Jennifer Ennis, William Tisäter', 'pygeoip', + 'Pure Python API for Maxmind\'s binary GeoIP databases.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/docs/index.txt b/docs/index.txt new file mode 100644 index 0000000..3cb0708 --- /dev/null +++ b/docs/index.txt @@ -0,0 +1,22 @@ +.. pygeoip documentation master file, created by + sphinx-quickstart on Thu Nov 14 10:52:22 2013. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to pygeoip's documentation! +=================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/epydoc.ini b/epydoc.ini deleted file mode 100644 index 8b4b41e..0000000 --- a/epydoc.ini +++ /dev/null @@ -1,6 +0,0 @@ -[epydoc] -name: pygeoip -url: https://github.com/appliedsec/pygeoip -modules: pygeoip -output: html -target: apidocs/html/ From 22be6554d852c1c8f4a8747f75e774776dbffbea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Sat, 1 Feb 2014 18:02:54 +0100 Subject: [PATCH 02/18] Drop oen more Epydoc reference --- build.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/build.sh b/build.sh index 40bb054..71d1ce3 100755 --- a/build.sh +++ b/build.sh @@ -22,7 +22,6 @@ pushd $(dirname $0) fi venv/bin/tox || error "tox failed" - perl -pi -e 's/Generated by Epydoc (\d+\.\d+\.\d+) .*/Generated by Epydoc $1/' apidocs/html/*.html if [ -z "$(pandoc --version)" ]; then warning "Skipping Markdown to reStructuredText translation" From 5827af794b1eb934feb19c9c7a68250116d12e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Sun, 2 Feb 2014 00:05:33 +0100 Subject: [PATCH 03/18] Update docs --- docs/_build/doctrees/environment.pickle | Bin 4093 -> 3705 bytes docs/_build/doctrees/index.doctree | Bin 6088 -> 5464 bytes docs/_build/html/.buildinfo | 2 +- docs/_build/html/_static/basic.css | 5 +- docs/_build/html/_static/default.css | 256 ------------------------ docs/_build/html/_static/doctools.js | 3 + docs/_build/html/_static/searchtools.js | 4 +- docs/_build/html/_static/sidebar.js | 159 --------------- docs/_build/html/genindex.html | 2 +- docs/_build/html/index.html | 6 +- docs/_build/html/search.html | 2 +- 11 files changed, 11 insertions(+), 428 deletions(-) delete mode 100644 docs/_build/html/_static/default.css delete mode 100644 docs/_build/html/_static/sidebar.js diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 6ace4bf9e6b562cb74d25d4a7e5191d9938ac282..9a517a09888d3a9b86766fdfa90e5f1a6d85863e 100644 GIT binary patch literal 3705 zcmb7H`JWV55not#cDG@6Spp;)BZFud2)n}(6ywRU;AUl67b>iVw)3X@&Af)5?yi2X z*;(b8pe|v(?;{@Zz$4zq+h|Zx<9){azK!>vV7>0%2}1G-{xs9o)%B{r^{wOGvbgHX zSomRkgonrdBnn$RRMxK454_Ry1h^=|#TvV-(CY;aKj0FVEPR+MKd|d?*N82cxn-|H7=X( z>FVn8Lyxzy?0S)F&XFTwEk0uIBwnTQkySBt$=|Gj zQq0H!g%vTF)*19F)-(>{TIk7;z(=KZ36>YN7y-r%$|OHi_51`6PVXQ()<9CqYcqZj@YQ5l#Ahz#KYzA%XJQMVMYVmS#v@fI=Y{Raw9)X}Xv2~b)mAV>B=N&W zpRUlm>vMCbBVxQcfd8>Q4y|IK_?$^lTp4HnJHdRX^7!s-#2p+_a!7uA`$H6Lmr(BEmf_fb_2p*b-CUM4w<>njm zl~U^F$h2*oh2BDh&tYI?DoW5n_*^K3Oi?oN1oRUK^huKf*ET+{L!X-k6LlMJ5iT2F zr0^tJXfa6v8)WhM;%4ZfftJSjf{C0_hoD*d&VW21?VoqqRpVBZ$_3VUc z%OPkJpJcacJT1!OizSr&R_4RJFoW|&d0D@>4nw3~r;_*X?*%W(U%nKqMwEu0@kipz zNQf^NWk%!m6<`HX*equ0D>c4Kl*OQgWgd??b<)r^XTMs*@}j>uewd|H;%hX%R+McC z{f1Lc7SZc8EFndSuh;knanUTUr_^AS6Zn!Q;Ty^M+cdt3<{Nch8oh6>ij}rlWsB9e zxZD;rQ3cJ>w^T12q~>$Sr$a4#E7`bR3!uOJyJ2bwpW9I!;Gf7<$C5EN6 zc9cjvO?*O|LZyK7$giL!!w*fVu;6qmD&mYe=>y`@w}ubW*6<;XAEuMV8ZvMPZ2@8} zEj{Y2#f` zE(C?L0rE})l5prPT*S}iC@ejXlKA;fhh;I(=Z2Fe0sb7;2&LldYPFe}nUOdf+#^xata43xBmx6y^?6TtN=!DhD$S3x7>%|Bc4q($Y;a;qTmp zwp~+=bTP8<_i)XTYIV=(F4%WsY+~<$6Nh(BO^i+KJ25&nbzthm!O^`Z{-`KbaxZO?Nc>v!L2Y8g4cnvnc-pR~AvKD55Kp&s8If(oDP> z{uNf68loOg`=D9mX!;n|d3fJx7%Z0U%vEZe__xzA;D>RlNXs>Mf+qeQ`cu^y-Z3m` zUHeB0%d?WCc|?Jl+ntC1q>X`U(4j=-{XpWsXxcfUuVUXl=J?GpB2fOF53c{D^^yMq D?QLCc literal 4093 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
      + +
      + +
      __init__() (pygeoip.GeoIP method) +
      + +
      + +

      C

      + + + +
      + +
      country_code_by_addr() (pygeoip.GeoIP method) +
      + +
      + +
      country_code_by_name() (pygeoip.GeoIP method) +
      + +
      + @@ -81,11 +109,11 @@

      Navigation

    • index
    • -
    • pygeoip 0.3.0 documentation »
    • +
    • pygeoip 0.3.1 documentation »
    • diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index 2fb581f..afcb9be 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -6,15 +6,15 @@ - Welcome to pygeoip’s documentation! — pygeoip 0.3.0 documentation + Pure Python API for Maxmind’s binary GeoIP databases — pygeoip 0.3.1 documentation - + - + @@ -41,21 +41,52 @@

      Navigation

      -
      -

      Welcome to pygeoip’s documentation!

      -

      Contents:

      -
      -
        -
      +
      +

      Pure Python API for Maxmind’s binary GeoIP databases

      +

      Work in progress!

      +
      +

      GeoIP methods

      +
      +
      +GeoIP.__init__(filename, flags=0, cache=True)
      +

      Initialize the class.

      +

      @param filename: Path to a geoip database. +@type filename: str +@param flags: Flags that affect how the database is processed. +Currently supported flags are STANDARD (the default), +MEMORY_CACHE (preload the whole file into memory) and +MMAP_CACHE (access the file via mmap). +@type flags: int +@param cache: Used in tests to skip instance caching +@type cache: bool

      +
      + +
      +

      Country lookup

      +
      +
      +GeoIP.country_code_by_addr(addr)
      +

      Returns 2-letter country code (e.g. ‘US’) for specified IP address. +Use this method if you have a Country, Region, or City database.

      +

      @param addr: IP address +@type addr: str +@return: 2-letter country code +@rtype: str

      +
      + +
      +
      +GeoIP.country_code_by_name(hostname)
      +

      Returns 2-letter country code (e.g. ‘US’) for specified hostname. +Use this method if you have a Country, Region, or City database.

      +

      @param hostname: Hostname +@type hostname: str +@return: 2-letter country code +@rtype: str

      +
      +
      -
      -

      Indices and tables

      -
      @@ -66,8 +97,13 @@

      Indices and tables

      Table Of Contents

      This Page

      @@ -98,11 +134,11 @@

      Navigation

    • index
    • -
    • pygeoip 0.3.0 documentation »
    • +
    • pygeoip 0.3.1 documentation »
    • diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 730ee3ee8a3b65d3519a0dfef62749401ab162bc..58702478334ba779009112fe1da4c4ac1b16eafb 100644 GIT binary patch delta 159 zcmV;Q0AT;k0gM8WKLIh3KstY&jzJ2-Fc3xeJ;i`-8|bzdkS>IR2N=@K&<2uBNK-Jk zS4jmGapCsOd;IZ2HV|K7&D1+Rv4ggQSX#dy)RMhBz*%T>48sF8GlwtHlkP=TSJufa z?_y=UcB#UsXKrGdS!`4%mSI$gHrR}K|EBkx7a{22W#I_zM`2_OITaH$LX1e9OG&LzC@x8{%1KO0%~8-bR4Ay_&4o(nWt8OR zC@c8pr2gor_v1w#}BB&Mfw0RZ3TF&RA5 BD#HK( diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index d4355f1..ab3610a 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -6,15 +6,15 @@ - Search — pygeoip 0.3.0 documentation + Search — pygeoip 0.3.1 documentation - + - + @@ -40,7 +40,7 @@

      Navigation

    • index
    • -
    • pygeoip 0.3.0 documentation »
    • +
    • pygeoip 0.3.1 documentation »
    • @@ -88,11 +88,11 @@

      Navigation

    • index
    • -
    • pygeoip 0.3.0 documentation »
    • +
    • pygeoip 0.3.1 documentation »
    • diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index 54707dd..0be6483 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:42,terms:{content:0,index:0,modul:0,search:0,page:0},objtypes:{},objnames:{},filenames:["index"],titles:["Welcome to pygeoip’s documentation!"],objects:{},titleterms:{pygeoip:0,document:0,welcom:0,indic:0,tabl:0}}) \ No newline at end of file +Search.setIndex({envversion:42,terms:{country_code_by_addr:0,via:0,have:0,process:0,skip:0,filenam:0,code:0,file:0,toctre:[],"__init__":0,current:0,thi:0,addr:0,memori:0,mmap_cach:0,mmap:0,support:0,param:0,"class":0,access:0,citi:0,bool:0,memory_cach:0,test:0,progress:0,you:0,type:0,preload:0,"return":0,hostnam:0,country_code_by_nam:0,initi:0,standard:0,how:0,flag:0,specifi:0,letter:0,address:0,affect:0,"true":0,cach:0,rtype:0,"default":0,region:0,work:0,"int":0,instanc:0,str:0,path:0,whole:0},objtypes:{"0":"py:method"},objnames:{"0":["py","method","Python method"]},filenames:["index"],titles:["Pure Python API for Maxmind’s binary GeoIP databases"],objects:{"pygeoip.GeoIP":{country_code_by_addr:[0,0,1,""],country_code_by_name:[0,0,1,""],"__init__":[0,0,1,""]}},titleterms:{pygeoip:[],python:0,geoip:0,binari:0,api:0,lookup:0,pure:0,databas:0,maxmind:0,countri:0,method:0}}) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 602668d..70ce4af 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,11 +14,13 @@ import sys import os +from datetime import date # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +sys.path.insert(0, os.path.join('..')) +import pygeoip # -- General configuration ------------------------------------------------ @@ -28,7 +30,7 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [] +extensions = ['sphinx.ext.autodoc'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -44,16 +46,16 @@ # General information about the project. project = u'pygeoip' -copyright = u'2013, Jennifer Ennis, William Tisäter' +copyright = u'%s, Jennifer Ennis, William Tisäter' % date.today().year # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '0.3.0' +version = pygeoip.__version__ # The full version, including alpha/beta/rc tags. -release = '0.3.0' +release = pygeoip.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -98,7 +100,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'nature' +html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the diff --git a/docs/index.txt b/docs/index.txt index 3cb0708..9b5ba2d 100644 --- a/docs/index.txt +++ b/docs/index.txt @@ -1,22 +1,20 @@ -.. pygeoip documentation master file, created by - sphinx-quickstart on Thu Nov 14 10:52:22 2013. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. +==================================================== +Pure Python API for Maxmind's binary GeoIP databases +==================================================== -Welcome to pygeoip's documentation! -=================================== +.. currentmodule:: pygeoip -Contents: +Work in progress! -.. toctree:: - :maxdepth: 2 +:class:`GeoIP` methods +---------------------- +.. automethod:: GeoIP.__init__ +Country lookup +'''''''''''''' -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +.. automethod:: GeoIP.country_code_by_addr +.. automethod:: GeoIP.country_code_by_name +.. toctree \ No newline at end of file From a0ecee4a69da5a7aa1c6a689d07ec8defa8d7783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Sun, 2 Feb 2014 00:55:24 +0100 Subject: [PATCH 08/18] Change extension of doc index --- docs/{index.txt => index.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{index.txt => index.rst} (100%) diff --git a/docs/index.txt b/docs/index.rst similarity index 100% rename from docs/index.txt rename to docs/index.rst From 5a578f7cd3a9931cd25a377b5d08d7b0be74373d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Sun, 2 Feb 2014 01:04:04 +0100 Subject: [PATCH 09/18] Don't keep doc build files revisioned --- .gitignore | 2 +- docs/_build/doctrees/environment.pickle | Bin 4355 -> 0 bytes docs/_build/doctrees/index.doctree | Bin 10502 -> 0 bytes docs/_build/html/.buildinfo | 4 - docs/_build/html/_sources/index.txt | 20 - docs/_build/html/_static/ajax-loader.gif | Bin 673 -> 0 bytes docs/_build/html/_static/basic.css | 537 ------------- docs/_build/html/_static/comment-bright.png | Bin 3500 -> 0 bytes docs/_build/html/_static/comment-close.png | Bin 3578 -> 0 bytes docs/_build/html/_static/comment.png | Bin 3445 -> 0 bytes docs/_build/html/_static/default.css | 256 ------- docs/_build/html/_static/doctools.js | 238 ------ docs/_build/html/_static/down-pressed.png | Bin 368 -> 0 bytes docs/_build/html/_static/down.png | Bin 363 -> 0 bytes docs/_build/html/_static/file.png | Bin 392 -> 0 bytes docs/_build/html/_static/jquery.js | 2 - docs/_build/html/_static/minus.png | Bin 199 -> 0 bytes docs/_build/html/_static/plus.png | Bin 199 -> 0 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 372 -> 0 bytes docs/_build/html/_static/up.png | Bin 363 -> 0 bytes docs/_build/html/_static/websupport.js | 808 -------------------- docs/_build/html/genindex.html | 120 --- docs/_build/html/index.html | 145 ---- docs/_build/html/objects.inv | 6 - docs/_build/html/search.html | 99 --- docs/_build/html/searchindex.js | 1 - 30 files changed, 1 insertion(+), 3111 deletions(-) delete mode 100644 docs/_build/doctrees/environment.pickle delete mode 100644 docs/_build/doctrees/index.doctree delete mode 100644 docs/_build/html/.buildinfo delete mode 100644 docs/_build/html/_sources/index.txt delete mode 100644 docs/_build/html/_static/ajax-loader.gif delete mode 100644 docs/_build/html/_static/basic.css delete mode 100644 docs/_build/html/_static/comment-bright.png delete mode 100644 docs/_build/html/_static/comment-close.png delete mode 100644 docs/_build/html/_static/comment.png delete mode 100644 docs/_build/html/_static/default.css delete mode 100644 docs/_build/html/_static/doctools.js delete mode 100644 docs/_build/html/_static/down-pressed.png delete mode 100644 docs/_build/html/_static/down.png delete mode 100644 docs/_build/html/_static/file.png delete mode 100644 docs/_build/html/_static/jquery.js delete mode 100644 docs/_build/html/_static/minus.png delete mode 100644 docs/_build/html/_static/plus.png delete mode 100644 docs/_build/html/_static/pygments.css delete mode 100644 docs/_build/html/_static/searchtools.js delete mode 100644 docs/_build/html/_static/sidebar.js delete mode 100644 docs/_build/html/_static/underscore.js delete mode 100644 docs/_build/html/_static/up-pressed.png delete mode 100644 docs/_build/html/_static/up.png delete mode 100644 docs/_build/html/_static/websupport.js delete mode 100644 docs/_build/html/genindex.html delete mode 100644 docs/_build/html/index.html delete mode 100644 docs/_build/html/objects.inv delete mode 100644 docs/_build/html/search.html delete mode 100644 docs/_build/html/searchindex.js diff --git a/.gitignore b/.gitignore index 8c4b3bf..5a6d27d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,4 @@ pygeoip-* cover .coverage .coveralls.yml -apidocs/html/.* +docs/_build/* diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle deleted file mode 100644 index a1139028a12a6000b22910a17042b149de1c32c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4355 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 T_-9Hr{zZDNb~yjWaPt2FcC$Gs diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree deleted file mode 100644 index 2ad371a84cf0772df0bae9e8ca615d3c57b4d2c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10502 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 diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css deleted file mode 100644 index c959cf0..0000000 --- a/docs/_build/html/_static/basic.css +++ /dev/null @@ -1,537 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2013 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 deleted file mode 100644 index 551517b8c83b76f734ff791f847829a760ad1903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3500 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 A2LJ#7 diff --git a/docs/_build/html/_static/comment.png b/docs/_build/html/_static/comment.png deleted file mode 100644 index 92feb52b8824c6b0f59b658b1196c61de9162a95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3445 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 Xn!ZpXD%P(H00000NkvXXu0mjf= 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); - $('') - .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 deleted file mode 100644 index 6f7ad782782e4f8e39b0c6e15c7344700cdd2527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}Z23@f-Ava~9&<9T!#}JFtXD=!G zGdl{fK6ro2OGiOl+hKvH6i=D3%%Y^j`yIkRn!8O>@bG)IQR0{Kf+mxNd=_WScA8u_ z3;8(7x2){m9`nt+U(Nab&1G)!{`SPVpDX$w8McLTzAJ39wprG3p4XLq$06M`%}2Yk zRPPsbES*dnYm1wkGL;iioAUB*Or2kz6(-M_r_#Me-`{mj$Z%( diff --git a/docs/_build/html/_static/down.png b/docs/_build/html/_static/down.png deleted file mode 100644 index 3003a88770de3977d47a2ba69893436a2860f9e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}xaV3tUZ$qnrLa#kt978NlpS`ru z&)HFc^}^>{UOEce+71h5nn>6&w6A!ieNbu1wh)UGh{8~et^#oZ1# z>T7oM=FZ~xXWnTo{qnXm$ZLOlqGswI_m2{XwVK)IJmBjW{J3-B3x@C=M{ShWt#fYS9M?R;8K$~YwlIqwf>VA7q=YKcwf2DS4Zj5inDKXXB1zl=(YO3ST6~rDq)&z z*o>z)=hxrfG-cDBW0G$!?6{M<$@{_4{m1o%Ub!naEtn|@^frU1tDnm{r-UW|!^@B8 diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png deleted file mode 100644 index d18082e397e7e54f20721af768c4c2983258f1b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$HyOL$D9)yc9|lc|nKf<9@eUiWd>3GuTC!a5vdfWYEazjncPj5ZQX%+1 zt8B*4=d)!cdDz4wr^#OMYfqGz$1LDFF>|#>*O?AGil(WEs?wLLy{Gj2J_@opDm%`dlax3yA*@*N$G&*ukFv>P8+2CBWO(qz zD0k1@kN>hhb1_6`&wrCswzINE(evt-5C1B^STi2@PmdKI;Vst0PQB6!2kdN diff --git a/docs/_build/html/_static/jquery.js b/docs/_build/html/_static/jquery.js deleted file mode 100644 index 83589da..0000000 --- a/docs/_build/html/_static/jquery.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! 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(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
      a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="
      t
      ",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="
      ",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;ti.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="
      ",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="

      ",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t0)for(i=r;i=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*\s*$/g,Nt={option:[1,""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X
      ","
      "]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1>");try{for(;r1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]===""&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("
      ").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png deleted file mode 100644 index da1c5620d10c047525a467a425abe9ff5269cfc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1SHkYJtzcHoCO|{#XvD(5N2eUHAey{$X?>< z>&kweokM_|(Po{+Q=kw>iEBiObAE1aYF-J$w=>iB1I2R$WLpMkF=>bh=@O1TaS?83{1OVknK< z>&kweokM`jkU7Va11Q8%;u=xnoS&PUnpeW`?aZ|OK(QcC7sn8Z%gHvy&v=;Q4jejg zV8NnAO`-4Z@2~&zopr02WF_WB>pF diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css deleted file mode 100644 index d79caa1..0000000 --- a/docs/_build/html/_static/pygments.css +++ /dev/null @@ -1,62 +0,0 @@ -.highlight .hll { background-color: #ffffcc } -.highlight { background: #eeffcc; } -.highlight .c { color: #408090; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #007020; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #007020 } /* Comment.Preproc */ -.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #333333 } /* Generic.Output */ -.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0044DD } /* Generic.Traceback */ -.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #007020 } /* Keyword.Pseudo */ -.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #902000 } /* Keyword.Type */ -.highlight .m { color: #208050 } /* Literal.Number */ -.highlight .s { color: #4070a0 } /* Literal.String */ -.highlight .na { color: #4070a0 } /* Name.Attribute */ -.highlight .nb { color: #007020 } /* Name.Builtin */ -.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ -.highlight .no { color: #60add5 } /* Name.Constant */ -.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #007020 } /* Name.Exception */ -.highlight .nf { color: #06287e } /* Name.Function */ -.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ -.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #bb60d5 } /* Name.Variable */ -.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mf { color: #208050 } /* Literal.Number.Float */ -.highlight .mh { color: #208050 } /* Literal.Number.Hex */ -.highlight .mi { color: #208050 } /* Literal.Number.Integer */ -.highlight .mo { color: #208050 } /* Literal.Number.Oct */ -.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ -.highlight .sc { color: #4070a0 } /* Literal.String.Char */ -.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ -.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ -.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ -.highlight .sx { color: #c65d09 } /* Literal.String.Other */ -.highlight .sr { color: #235388 } /* Literal.String.Regex */ -.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ -.highlight .ss { color: #517918 } /* Literal.String.Symbol */ -.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ -.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ -.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ -.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js deleted file mode 100644 index f5c7e5f..0000000 --- a/docs/_build/html/_static/searchtools.js +++ /dev/null @@ -1,622 +0,0 @@ -/* - * searchtools.js_t - * ~~~~~~~~~~~~~~~~ - * - * Sphinx JavaScript utilties for the full-text search. - * - * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - - -/** - * Porter Stemmer - */ -var Stemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' - }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} - - - -/** - * Simple result scoring code. - */ -var Scorer = { - // Implement the following function to further tweak the score for each result - // The function takes a result array [filename, title, anchor, descr, score] - // and returns the new score. - /* - score: function(result) { - return result[4]; - }, - */ - - // query matches the full name of an object - objNameMatch: 11, - // or matches in the last dotted part of the object name - objPartialMatch: 6, - // Additive scores depending on the priority of the object - objPrio: {0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5}, // used to be unimportantResults - // Used when the priority is not in the mapping. - objPrioDefault: 0, - - // query found in title - title: 15, - // query found in terms - term: 5 -}; - - -/** - * Search Module - */ -var Search = { - - _index : null, - _queued_query : null, - _pulse_status : -1, - - init : function() { - var params = $.getQueryParameters(); - if (params.q) { - var query = params.q[0]; - $('input[name="q"]')[0].value = query; - this.performSearch(query); - } - }, - - loadIndex : function(url) { - $.ajax({type: "GET", url: url, data: null, - dataType: "script", cache: true, - complete: function(jqxhr, textstatus) { - if (textstatus != "success") { - document.getElementById("searchindexloader").src = url; - } - }}); - }, - - setIndex : function(index) { - var q; - this._index = index; - if ((q = this._queued_query) !== null) { - this._queued_query = null; - Search.query(q); - } - }, - - hasIndex : function() { - return this._index !== null; - }, - - deferQuery : function(query) { - this._queued_query = query; - }, - - stopPulse : function() { - this._pulse_status = 0; - }, - - startPulse : function() { - if (this._pulse_status >= 0) - return; - function pulse() { - var i; - Search._pulse_status = (Search._pulse_status + 1) % 4; - var dotString = ''; - for (i = 0; i < Search._pulse_status; i++) - dotString += '.'; - Search.dots.text(dotString); - if (Search._pulse_status > -1) - window.setTimeout(pulse, 500); - } - pulse(); - }, - - /** - * perform a search for something (or wait until index is loaded) - */ - performSearch : function(query) { - // create the required interface elements - this.out = $('#search-results'); - this.title = $('

      ' + _('Searching') + '

      ').appendTo(this.out); - this.dots = $('').appendTo(this.title); - this.status = $('

      ').appendTo(this.out); - this.output = $('
      '); - } - // Prettify the comment rating. - comment.pretty_rating = comment.rating + ' point' + - (comment.rating == 1 ? '' : 's'); - // Make a class (for displaying not yet moderated comments differently) - comment.css_class = comment.displayed ? '' : ' moderate'; - // Create a div for this comment. - var context = $.extend({}, opts, comment); - var div = $(renderTemplate(commentTemplate, context)); - - // If the user has voted on this comment, highlight the correct arrow. - if (comment.vote) { - var direction = (comment.vote == 1) ? 'u' : 'd'; - div.find('#' + direction + 'v' + comment.id).hide(); - div.find('#' + direction + 'u' + comment.id).show(); - } - - if (opts.moderator || comment.text != '[deleted]') { - div.find('a.reply').show(); - if (comment.proposal_diff) - div.find('#sp' + comment.id).show(); - if (opts.moderator && !comment.displayed) - div.find('#cm' + comment.id).show(); - if (opts.moderator || (opts.username == comment.username)) - div.find('#dc' + comment.id).show(); - } - return div; - } - - /** - * A simple template renderer. Placeholders such as <%id%> are replaced - * by context['id'] with items being escaped. Placeholders such as <#id#> - * are not escaped. - */ - function renderTemplate(template, context) { - var esc = $(document.createElement('div')); - - function handle(ph, escape) { - var cur = context; - $.each(ph.split('.'), function() { - cur = cur[this]; - }); - return escape ? esc.text(cur || "").html() : cur; - } - - return template.replace(/<([%#])([\w\.]*)\1>/g, function() { - return handle(arguments[2], arguments[1] == '%' ? true : false); - }); - } - - /** Flash an error message briefly. */ - function showError(message) { - $(document.createElement('div')).attr({'class': 'popup-error'}) - .append($(document.createElement('div')) - .attr({'class': 'error-message'}).text(message)) - .appendTo('body') - .fadeIn("slow") - .delay(2000) - .fadeOut("slow"); - } - - /** Add a link the user uses to open the comments popup. */ - $.fn.comment = function() { - return this.each(function() { - var id = $(this).attr('id').substring(1); - var count = COMMENT_METADATA[id]; - var title = count + ' comment' + (count == 1 ? '' : 's'); - var image = count > 0 ? opts.commentBrightImage : opts.commentImage; - var addcls = count == 0 ? ' nocomment' : ''; - $(this) - .append( - $(document.createElement('a')).attr({ - href: '#', - 'class': 'sphinx-comment-open' + addcls, - id: 'ao' + id - }) - .append($(document.createElement('img')).attr({ - src: image, - alt: 'comment', - title: title - })) - .click(function(event) { - event.preventDefault(); - show($(this).attr('id').substring(2)); - }) - ) - .append( - $(document.createElement('a')).attr({ - href: '#', - 'class': 'sphinx-comment-close hidden', - id: 'ah' + id - }) - .append($(document.createElement('img')).attr({ - src: opts.closeCommentImage, - alt: 'close', - title: 'close' - })) - .click(function(event) { - event.preventDefault(); - hide($(this).attr('id').substring(2)); - }) - ); - }); - }; - - var opts = { - processVoteURL: '/_process_vote', - addCommentURL: '/_add_comment', - getCommentsURL: '/_get_comments', - acceptCommentURL: '/_accept_comment', - deleteCommentURL: '/_delete_comment', - commentImage: '/static/_static/comment.png', - closeCommentImage: '/static/_static/comment-close.png', - loadingImage: '/static/_static/ajax-loader.gif', - commentBrightImage: '/static/_static/comment-bright.png', - upArrow: '/static/_static/up.png', - downArrow: '/static/_static/down.png', - upArrowPressed: '/static/_static/up-pressed.png', - downArrowPressed: '/static/_static/down-pressed.png', - voting: false, - moderator: false - }; - - if (typeof COMMENT_OPTIONS != "undefined") { - opts = jQuery.extend(opts, COMMENT_OPTIONS); - } - - var popupTemplate = '\ -
      \ -

      \ - Sort by:\ - best rated\ - newest\ - oldest\ -

      \ -
      Comments
      \ -
      \ - loading comments...
      \ -
        \ -
        \ -

        Add a comment\ - (markup):

        \ -
        \ - reStructured text markup: *emph*, **strong**, \ - ``code``, \ - code blocks: :: and an indented block after blank line
        \ -
        \ - \ -

        \ - \ - Propose a change ▹\ - \ - \ - Propose a change ▿\ - \ -

        \ - \ - \ - \ - \ - \ -
        \ -
        '; - - var commentTemplate = '\ -
        \ -
        \ -
        \ - \ - \ - \ - \ - \ - \ -
        \ -
        \ - \ - \ - \ - \ - \ - \ -
        \ -
        \ -
        \ -

        \ - <%username%>\ - <%pretty_rating%>\ - <%time.delta%>\ -

        \ -
        <#text#>
        \ -

        \ - \ - reply ▿\ - proposal ▹\ - proposal ▿\ - \ - \ -

        \ -
        \
        -<#proposal_diff#>\
        -        
        \ -
          \ -
          \ -
          \ -
          \ - '; - - var replyTemplate = '\ -
        • \ -
          \ -
          \ - \ - \ - \ - \ - \ - \ -
          \ -
        • '; - - $(document).ready(function() { - init(); - }); -})(jQuery); - -$(document).ready(function() { - // add comment anchors for all paragraphs that are commentable - $('.sphinx-has-comment').comment(); - - // highlight search words in search results - $("div.context").each(function() { - var params = $.getQueryParameters(); - var terms = (params.q) ? params.q[0].split(/\s+/) : []; - var result = $(this); - $.each(terms, function() { - result.highlightText(this.toLowerCase(), 'highlighted'); - }); - }); - - // directly open comment window if requested - var anchor = document.location.hash; - if (anchor.substring(0, 9) == '#comment-') { - $('#ao' + anchor.substring(9)).click(); - document.location.hash = '#s' + anchor.substring(9); - } -}); diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html deleted file mode 100644 index e50514e..0000000 --- a/docs/_build/html/genindex.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - Index — pygeoip 0.3.1 documentation - - - - - - - - - - - - - -
          -
          -
          -
          - - -

          Index

          - -
          - _ - | C - -
          -

          _

          -
          - -
          - -
          __init__() (pygeoip.GeoIP method) -
          - -
          - -

          C

          - - - -
          - -
          country_code_by_addr() (pygeoip.GeoIP method) -
          - -
          - -
          country_code_by_name() (pygeoip.GeoIP method) -
          - -
          - - - -
          -
          - -
          -
          - - - - - -
          -
          -
          - - - - - \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html deleted file mode 100644 index afcb9be..0000000 --- a/docs/_build/html/index.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - Pure Python API for Maxmind’s binary GeoIP databases — pygeoip 0.3.1 documentation - - - - - - - - - - - - - -
          -
          -
          -
          - -
          -

          Pure Python API for Maxmind’s binary GeoIP databases

          -

          Work in progress!

          -
          -

          GeoIP methods

          -
          -
          -GeoIP.__init__(filename, flags=0, cache=True)
          -

          Initialize the class.

          -

          @param filename: Path to a geoip database. -@type filename: str -@param flags: Flags that affect how the database is processed. -Currently supported flags are STANDARD (the default), -MEMORY_CACHE (preload the whole file into memory) and -MMAP_CACHE (access the file via mmap). -@type flags: int -@param cache: Used in tests to skip instance caching -@type cache: bool

          -
          - -
          -

          Country lookup

          -
          -
          -GeoIP.country_code_by_addr(addr)
          -

          Returns 2-letter country code (e.g. ‘US’) for specified IP address. -Use this method if you have a Country, Region, or City database.

          -

          @param addr: IP address -@type addr: str -@return: 2-letter country code -@rtype: str

          -
          - -
          -
          -GeoIP.country_code_by_name(hostname)
          -

          Returns 2-letter country code (e.g. ‘US’) for specified hostname. -Use this method if you have a Country, Region, or City database.

          -

          @param hostname: Hostname -@type hostname: str -@return: 2-letter country code -@rtype: str

          -
          - -
          -
          -
          - - -
          -
          -
          -
          -
          -

          Table Of Contents

          - - -

          This Page

          - - - -
          -
          -
          -
          - - - - \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv deleted file mode 100644 index 5870247..0000000 --- a/docs/_build/html/objects.inv +++ /dev/null @@ -1,6 +0,0 @@ -# Sphinx inventory version 2 -# Project: pygeoip -# Version: 0.3.1 -# The remainder of this file is compressed using zlib. -xڝA -0E=ŀn.LHS0WIq{B6_a;=XZԒ;Yhs 53/ѓEUW,bev¨gnbYlT'aT6،x!eGad 94BS=_k|and \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html deleted file mode 100644 index ab3610a..0000000 --- a/docs/_build/html/search.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - Search — pygeoip 0.3.1 documentation - - - - - - - - - - - - - - - - - - - -
          -
          -
          -
          - -

          Search

          -
          - -

          - 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. -

          -
          - - - -
          - -
          - -
          - -
          -
          -
          -
          -
          -
          -
          -
          -
          - - - - \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js deleted file mode 100644 index 0be6483..0000000 --- a/docs/_build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({envversion:42,terms:{country_code_by_addr:0,via:0,have:0,process:0,skip:0,filenam:0,code:0,file:0,toctre:[],"__init__":0,current:0,thi:0,addr:0,memori:0,mmap_cach:0,mmap:0,support:0,param:0,"class":0,access:0,citi:0,bool:0,memory_cach:0,test:0,progress:0,you:0,type:0,preload:0,"return":0,hostnam:0,country_code_by_nam:0,initi:0,standard:0,how:0,flag:0,specifi:0,letter:0,address:0,affect:0,"true":0,cach:0,rtype:0,"default":0,region:0,work:0,"int":0,instanc:0,str:0,path:0,whole:0},objtypes:{"0":"py:method"},objnames:{"0":["py","method","Python method"]},filenames:["index"],titles:["Pure Python API for Maxmind’s binary GeoIP databases"],objects:{"pygeoip.GeoIP":{country_code_by_addr:[0,0,1,""],country_code_by_name:[0,0,1,""],"__init__":[0,0,1,""]}},titleterms:{pygeoip:[],python:0,geoip:0,binari:0,api:0,lookup:0,pure:0,databas:0,maxmind:0,countri:0,method:0}}) \ No newline at end of file From 5e9ad257a55e102c9107e010c253577f883eba21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Sun, 2 Feb 2014 01:04:22 +0100 Subject: [PATCH 10/18] Use sphinx_rtd_theme for Sphinx --- docs/conf.py | 12 +++++++----- requirements.txt | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 70ce4af..90ef2db 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -36,7 +36,7 @@ templates_path = ['_templates'] # The suffix of source filenames. -source_suffix = '.txt' +source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' @@ -98,18 +98,20 @@ # -- Options for HTML output ---------------------------------------------- +import sphinx_rtd_theme + # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = "sphinx_rtd_theme" + +# Add any paths that contain custom themes here, relative to this directory. +html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None diff --git a/requirements.txt b/requirements.txt index 756516f..ea8f4c6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ tox nose Sphinx +sphinx_rtd_theme From 1e0868746345b3ba04f665db257f9a7f4364e691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Sun, 2 Feb 2014 01:07:07 +0100 Subject: [PATCH 11/18] Only use sphinx_rtd_theme locally --- docs/conf.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 90ef2db..18c021f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -98,14 +98,17 @@ # -- Options for HTML output ---------------------------------------------- -import sphinx_rtd_theme +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = "sphinx_rtd_theme" +if not on_rtd: + import sphinx_rtd_theme -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + # The theme to use for HTML and HTML Help pages. See the documentation for + # a list of builtin themes. + html_theme = "sphinx_rtd_theme" + + # Add any paths that contain custom themes here, relative to this directory. + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the From ac10b6a9201e3a9b85c75ecba794ad722fe7e7b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Sun, 2 Feb 2014 01:42:37 +0100 Subject: [PATCH 12/18] Port docstrings to Sphinx syntax --- pygeoip/__init__.py | 91 +++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 65 deletions(-) diff --git a/pygeoip/__init__.py b/pygeoip/__init__.py index 00cf5b1..4007e03 100644 --- a/pygeoip/__init__.py +++ b/pygeoip/__init__.py @@ -55,7 +55,8 @@ class _GeoIPMetaclass(type): _instance_lock = Lock() def __call__(cls, *args, **kwargs): - """ Singleton method to gets an instance without reparsing + """ + Singleton method to gets an instance without reparsing the database, the filename is being used as cache key. """ if len(args) > 0: @@ -83,17 +84,14 @@ class GeoIP(object): def __init__(self, filename, flags=0, cache=True): """ - Initialize the class. + Create and return an GeoIP instance. - @param filename: Path to a geoip database. - @type filename: str - @param flags: Flags that affect how the database is processed. - Currently supported flags are STANDARD (the default), + :arg filename: File path to a GeoIP database + :arg flags: Flags that affect how the database is processed. + Currently supported flags are STANDARD (default), MEMORY_CACHE (preload the whole file into memory) and - MMAP_CACHE (access the file via mmap). - @type flags: int - @param cache: Used in tests to skip instance caching - @type cache: bool + MMAP_CACHE (access the file via mmap) + :arg cache: Used in tests to skip instance caching """ self._lock = Lock() self._flags = flags @@ -131,22 +129,6 @@ def _setup_segments(self): Parses the database file to determine what kind of database is being used and setup segment sizes and start points that will be used by the seek*() methods later. - - Supported databases: - - * COUNTRY_EDITION - * COUNTRY_EDITION_V6 - * REGION_EDITION_REV0 - * REGION_EDITION_REV1 - * CITY_EDITION_REV0 - * CITY_EDITION_REV1 - * CITY_EDITION_REV1_V6 - * ORG_EDITION - * ISP_EDITION - * ASNUM_EDITION - * ASNUM_EDITION_V6 - * NETSPEED_EDITION - """ self._databaseType = const.COUNTRY_EDITION self._recordLength = const.STANDARD_RECORD_LENGTH @@ -210,11 +192,9 @@ def _seek_country(self, ipnum): """ Using the record length and appropriate start points, seek to the country that corresponds to the converted IP address integer. + Return offset of record. - @param ipnum: result of ip2long conversion - @type ipnum: int - @return: offset of start of record - @rtype: int + :arg ipnum: Result of ip2long conversion """ try: offset = 0 @@ -261,10 +241,9 @@ def _seek_country(self, ipnum): def _get_org(self, ipnum): """ Seek and return organization or ISP name for ipnum. - @param ipnum: Converted IP address - @type ipnum: int - @return: org/isp name - @rtype: str + Return org/isp name. + + :arg ipnum: Result of ip2long conversion """ seek_org = self._seek_country(ipnum) if seek_org == self._databaseSegments: @@ -286,11 +265,9 @@ def _get_org(self, ipnum): def _get_region(self, ipnum): """ Seek and return the region information. + Returns dict containing country_code and region_code. - @param ipnum: Converted IP address - @type ipnum: int - @return: dict containing country_code and region_code - @rtype: dict + :arg ipnum: Result of ip2long conversion """ region_code = None country_code = None @@ -332,13 +309,9 @@ def get_region_code(offset): def _get_record(self, ipnum): """ Populate location dict for converted IP. + Returns dict with numerous location properties. - @param ipnum: Converted IP address - @type ipnum: int - @return: dict with city, region_code, area_code, time_zone, - dma_code, metro_code, country_code3, latitude, postal_code, - longitude, country_code, country_name, continent - @rtype: dict + :arg ipnum: Result of ip2long conversion """ seek_country = self._seek_country(ipnum) if seek_country == self._databaseSegments: @@ -407,6 +380,9 @@ def read_data(buf, pos): return record def _gethostbyname(self, hostname): + """ + Hostname lookup method, supports both IPv4 and IPv6. + """ if self._databaseType in const.IPV6_EDITIONS: response = socket.getaddrinfo(hostname, 0, socket.AF_INET6) family, socktype, proto, canonname, sockaddr = response[0] @@ -417,26 +393,20 @@ def _gethostbyname(self, hostname): def id_by_name(self, hostname): """ - Returns the database id for specified hostname. + Returns the database ID for specified hostname. The id might be useful as array index. 0 is unknown. - @param hostname: Hostname - @type hostname: str - @return: network byte order 32-bit integer - @rtype: int + :arg hostname: Hostname to get ID from. """ addr = self._gethostbyname(hostname) return self.id_by_addr(addr) def id_by_addr(self, addr): """ - Returns the database id for specified address. + Returns the database ID for specified address. The id might be useful as array index. 0 is unknown. - @param addr: IPv4 or IPv6 address - @type addr: str - @return: network byte order 32-bit integer - @rtype: int + :arg addr: IPv4 or IPv6 address (eg. 127.0.0.1) """ ipv = 6 if addr.find(':') >= 0 else 4 if ipv == 4 and self._databaseType not in (const.COUNTRY_EDITION, const.NETSPEED_EDITION): @@ -450,9 +420,6 @@ def id_by_addr(self, addr): def last_netmask(self): """ Return the netmask depth of the last lookup. - - @return: network depth - @rtype: int """ return self._netmask @@ -461,10 +428,7 @@ def country_code_by_addr(self, addr): Returns 2-letter country code (e.g. 'US') for specified IP address. Use this method if you have a Country, Region, or City database. - @param addr: IP address - @type addr: str - @return: 2-letter country code - @rtype: str + :arg addr: IP address (eg. 127.0.0.1) """ VALID_EDITIONS = (const.COUNTRY_EDITION, const.COUNTRY_EDITION_V6) if self._databaseType in VALID_EDITIONS: @@ -480,10 +444,7 @@ def country_code_by_name(self, hostname): Returns 2-letter country code (e.g. 'US') for specified hostname. Use this method if you have a Country, Region, or City database. - @param hostname: Hostname - @type hostname: str - @return: 2-letter country code - @rtype: str + :arg hostname: Hostname (eg. example.com) """ addr = self._gethostbyname(hostname) return self.country_code_by_addr(addr) From 42c6bf8dd91264bce7a054996fb4919f2295d634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Mon, 3 Feb 2014 02:27:43 +0100 Subject: [PATCH 13/18] Setup Sphinx pages and re-use our README as index --- README.rst | 136 ++++------------------------------- docs/api-reference.rst | 15 ++++ docs/getting-started.rst | 94 ++++++++++++++++++++++++ docs/index.rst | 21 +----- docs/supported-databases.rst | 20 ++++++ pygeoip/__init__.py | 119 ++++++++++-------------------- 6 files changed, 180 insertions(+), 225 deletions(-) create mode 100644 docs/api-reference.rst create mode 100644 docs/getting-started.rst mode change 100644 => 120000 docs/index.rst create mode 100644 docs/supported-databases.rst diff --git a/README.rst b/README.rst index ca0bb6d..565dde4 100644 --- a/README.rst +++ b/README.rst @@ -1,8 +1,7 @@ Pure Python GeoIP API ===================== -This library is based on `Maxmind's GeoIP C -API `__. +This library is based on `Maxmind's GeoIP C API `__. Tested with Python version 2.6, 2.7, 3.2 and 3.3. @@ -26,132 +25,21 @@ contribute you can always `create a pull request `__ for discussion and code submission. -Getting Started ---------------- +Documentation +------------- -Create your GeoIP instance with appropriate access flag. ``STANDARD`` -reads data from disk when needed, ``MEMORY_CACHE`` loads database into -memory on instantiation and ``MMAP_CACHE`` loads database into memory -using mmap. +.. toctree:: + :maxdepth: 1 -.. code:: python + getting-started + supported-databases + api-reference - >>> import pygeoip - >>> gi = pygeoip.GeoIP('/path/to/GeoIP.dat') - >>> gi.country_name_by_addr('64.233.161.99') - 'United States' - -Country Lookup -~~~~~~~~~~~~~~ - -.. code:: python - - >>> gi = pygeoip.GeoIP('/path/to/GeoIP.dat') - >>> gi.country_code_by_name('google.com') - 'US' - >>> gi.country_code_by_addr('64.233.161.99') - 'US' - >>> gi.country_name_by_addr('64.233.161.99') - 'United States' - -.. code:: python - - >>> gi = pygeoip.GeoIP('/path/to/GeoIPv6.dat') - >>> gi.country_code_by_name('google.com') - 'IE' - >>> gi.country_code_by_addr('2001:7fd::1') - 'EU' - >>> gi.country_name_by_addr('2001:7fd::1') - 'Europe' - -Region Lookup -~~~~~~~~~~~~~ - -.. code:: python - - >>> gi = pygeoip.GeoIP('/path/to/GeoIPRegion.dat') - >>> gi.region_by_name('apple.com') - {'region_code': 'CA', 'country_code': 'US'} - -City Lookup -~~~~~~~~~~~ - -.. code:: python - - >>> gi = pygeoip.GeoIP('/path/to/GeoIPCity.dat') - >>> gi.record_by_addr('64.233.161.99') - { - 'city': u'Mountain View', - 'region_code': u'CA', - 'area_code': 650, - 'time_zone': 'America/Los_Angeles', - 'dma_code': 807, - 'metro_code': 'San Francisco, CA', - 'country_code3': 'USA', - 'latitude': 37.41919999999999, - 'postal_code': u'94043', - 'longitude': -122.0574, - 'country_code': 'US', - 'country_name': 'United States', - 'continent': 'NA' - } - >>> gi.time_zone_by_addr('64.233.161.99') - 'America/Los_Angeles' - -Organization Lookup -~~~~~~~~~~~~~~~~~~~ - -.. code:: python - - >>> gi = pygeoip.GeoIP('/path/to/GeoIPOrg.dat') - >>> gi.org_by_name('dell.com') - 'Dell Computer Corporation' - -ISP Lookup -~~~~~~~~~~ - -.. code:: python - - >>> gi = pygeoip.GeoIP('/path/to/GeoIPISP.dat') - >>> gi.isp_by_name('cnn.com') - 'Turner Broadcasting System' - -ASN Lookup -~~~~~~~~~~ - -.. code:: python - - >>> gi = pygeoip.GeoIP('/path/to/GeoIPASNum.dat') - >>> gi.asn_by_name('cnn.com') - 'AS5662 Turner Broadcasting' - -For more information, `check out the full API -documentation `__. - -Supported Databases -------------------- - -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| Type | IPv4 | IPv6 | Details | -+================+========+========+===================================================================================+ -| Country | ✓ | ✓ | `MaxMind Country product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| City | ✓ | ✓ | `MaxMind City product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| Organization | ✓ | | `MaxMind Organization product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| ISP | ✓ | | `MaxMind ISP product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| Region | ✓ | | `MaxMind Region product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| ASN | ✓ | ✓ | `MaxMind ASN product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| Netspeed | ✓ | | `MaxMind Netspeed product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ +For more information, `check out the documentation `__ over at Read the Docs. .. |Build Status| image:: https://api.travis-ci.org/appliedsec/pygeoip.png?branch=master - :target: https://travis-ci.org/appliedsec/pygeoip + :target: https://travis-ci.org/appliedsec/pygeoip .. |Coverage Status| image:: https://coveralls.io/repos/appliedsec/pygeoip/badge.png - :target: https://coveralls.io/r/appliedsec/pygeoip + :target: https://coveralls.io/r/appliedsec/pygeoip .. |Downloads| image:: https://pypip.in/d/pygeoip/badge.png - :target: https://crate.io/packages/pygeoip + :target: https://crate.io/packages/pygeoip diff --git a/docs/api-reference.rst b/docs/api-reference.rst new file mode 100644 index 0000000..6bf3bcb --- /dev/null +++ b/docs/api-reference.rst @@ -0,0 +1,15 @@ +API Reference +============= + +.. currentmodule:: pygeoip + +GeoIP +----- + +.. autoclass:: GeoIP + :members: __init__, country_code_by_addr, country_code_by_name, country_name_by_addr, country_name_by_name, org_by_addr, org_by_name, record_by_addr, record_by_name, region_by_addr, region_by_name, time_zone_by_addr, time_zone_by_name, netspeed_by_addr, netspeed_by_name, id_by_addr, last_netmask + +GeoIPError +---------- + +.. autoexception:: GeoIPError diff --git a/docs/getting-started.rst b/docs/getting-started.rst new file mode 100644 index 0000000..722ee4f --- /dev/null +++ b/docs/getting-started.rst @@ -0,0 +1,94 @@ +Getting Started +=============== + +Create your GeoIP instance with appropriate access flag. ``STANDARD`` +reads data from disk when needed, ``MEMORY_CACHE`` loads database into +memory on instantiation and ``MMAP_CACHE`` loads database into memory +using mmap. + +.. code:: python + + >>> import pygeoip + >>> gi = pygeoip.GeoIP('GeoIP.dat') + >>> gi.country_name_by_addr('64.233.161.99') + 'United States' + +Country Lookup +-------------- + +.. code:: python + + >>> gi = pygeoip.GeoIP('GeoIP.dat') + >>> gi.country_code_by_name('google.com') + 'US' + >>> gi.country_code_by_addr('64.233.161.99') + 'US' + >>> gi.country_name_by_addr('64.233.161.99') + 'United States' + +.. code:: python + + >>> gi = pygeoip.GeoIP('GeoIPv6.dat') + >>> gi.country_code_by_addr('2a00:1450:400f:802::1006') + 'IE' + +Region Lookup +------------- + +.. code:: python + + >>> gi = pygeoip.GeoIP('GeoIPRegion.dat') + >>> gi.region_by_name('apple.com') + {'region_code': 'CA', 'country_code': 'US'} + +City Lookup +----------- + +.. code:: python + + >>> gi = pygeoip.GeoIP('GeoIPCity.dat') + >>> gi.record_by_addr('64.233.161.99') + { + 'city': u'Mountain View', + 'region_code': u'CA', + 'area_code': 650, + 'time_zone': 'America/Los_Angeles', + 'dma_code': 807, + 'metro_code': 'San Francisco, CA', + 'country_code3': 'USA', + 'latitude': 37.41919999999999, + 'postal_code': u'94043', + 'longitude': -122.0574, + 'country_code': 'US', + 'country_name': 'United States', + 'continent': 'NA' + } + >>> gi.time_zone_by_addr('64.233.161.99') + 'America/Los_Angeles' + +Organization Lookup +------------------- + +.. code:: python + + >>> gi = pygeoip.GeoIP('GeoIPOrg.dat') + >>> gi.org_by_name('dell.com') + 'Dell Computer Corporation' + +ISP Lookup +---------- + +.. code:: python + + >>> gi = pygeoip.GeoIP('GeoIPISP.dat') + >>> gi.isp_by_name('cnn.com') + 'Turner Broadcasting System' + +ASN Lookup +---------- + +.. code:: python + + >>> gi = pygeoip.GeoIP('GeoIPASNum.dat') + >>> gi.asn_by_name('cnn.com') + 'AS5662 Turner Broadcasting' diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 9b5ba2d..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -==================================================== -Pure Python API for Maxmind's binary GeoIP databases -==================================================== - -.. currentmodule:: pygeoip - -Work in progress! - -:class:`GeoIP` methods ----------------------- - -.. automethod:: GeoIP.__init__ - -Country lookup -'''''''''''''' - -.. automethod:: GeoIP.country_code_by_addr -.. automethod:: GeoIP.country_code_by_name - -.. toctree \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst new file mode 120000 index 0000000..89a0106 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1 @@ +../README.rst \ No newline at end of file diff --git a/docs/supported-databases.rst b/docs/supported-databases.rst new file mode 100644 index 0000000..225bd88 --- /dev/null +++ b/docs/supported-databases.rst @@ -0,0 +1,20 @@ +Supported Databases +=================== + ++----------------+--------+--------+-----------------------------------------------------------------------------------+ +| Type | IPv4 | IPv6 | Details | ++================+========+========+===================================================================================+ +| Country | ✓ | ✓ | `MaxMind Country product page `__ | ++----------------+--------+--------+-----------------------------------------------------------------------------------+ +| City | ✓ | ✓ | `MaxMind City product page `__ | ++----------------+--------+--------+-----------------------------------------------------------------------------------+ +| Organization | ✓ | | `MaxMind Organization product page `__ | ++----------------+--------+--------+-----------------------------------------------------------------------------------+ +| ISP | ✓ | | `MaxMind ISP product page `__ | ++----------------+--------+--------+-----------------------------------------------------------------------------------+ +| Region | ✓ | | `MaxMind Region product page `__ | ++----------------+--------+--------+-----------------------------------------------------------------------------------+ +| ASN | ✓ | ✓ | `MaxMind ASN product page `__ | ++----------------+--------+--------+-----------------------------------------------------------------------------------+ +| Netspeed | ✓ | | `MaxMind Netspeed product page `__ | ++----------------+--------+--------+-----------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/pygeoip/__init__.py b/pygeoip/__init__.py index 4007e03..45e8b3a 100644 --- a/pygeoip/__init__.py +++ b/pygeoip/__init__.py @@ -47,6 +47,10 @@ class GeoIPError(Exception): + """ + Thin wrapper of `Exception`, will be thrown in case of an + unrecoverable error. + """ pass @@ -82,7 +86,7 @@ def __call__(cls, *args, **kwargs): class GeoIP(object): __metaclass__ = _GeoIPMetaclass - def __init__(self, filename, flags=0, cache=True): + def __init__(self, filename, flags=STANDARD, cache=True): """ Create and return an GeoIP instance. @@ -404,9 +408,9 @@ def id_by_name(self, hostname): def id_by_addr(self, addr): """ Returns the database ID for specified address. - The id might be useful as array index. 0 is unknown. + The ID might be useful as array index. 0 is unknown. - :arg addr: IPv4 or IPv6 address (eg. 127.0.0.1) + :arg addr: IPv4 or IPv6 address (eg. 203.0.113.30) """ ipv = 6 if addr.find(':') >= 0 else 4 if ipv == 4 and self._databaseType not in (const.COUNTRY_EDITION, const.NETSPEED_EDITION): @@ -419,16 +423,15 @@ def id_by_addr(self, addr): def last_netmask(self): """ - Return the netmask depth of the last lookup. + Returns the netmask depth of the last lookup. """ return self._netmask def country_code_by_addr(self, addr): """ - Returns 2-letter country code (e.g. 'US') for specified IP address. - Use this method if you have a Country, Region, or City database. + Returns 2-letter country code (e.g. US) from IP address. - :arg addr: IP address (eg. 127.0.0.1) + :arg addr: IP address (e.g. 203.0.113.30) """ VALID_EDITIONS = (const.COUNTRY_EDITION, const.COUNTRY_EDITION_V6) if self._databaseType in VALID_EDITIONS: @@ -441,10 +444,9 @@ def country_code_by_addr(self, addr): def country_code_by_name(self, hostname): """ - Returns 2-letter country code (e.g. 'US') for specified hostname. - Use this method if you have a Country, Region, or City database. + Returns 2-letter country code (e.g. US) from hostname. - :arg hostname: Hostname (eg. example.com) + :arg hostname: Hostname (e.g. example.com) """ addr = self._gethostbyname(hostname) return self.country_code_by_addr(addr) @@ -453,21 +455,16 @@ def netspeed_by_addr(self, addr): """ Returns NetSpeed name from address. - @param hostname: IP address - @type hostname: str - @return: netspeed name - @rtype: str + :arg addr: IP address (e.g. 203.0.113.30) """ return const.NETSPEED_NAMES[self.id_by_addr(addr)] def netspeed_by_name(self, hostname): """ - Returns NetSpeed name from hostname. + Returns NetSpeed name from hostname. Can be Unknown, Dial-up, + Cable, or Corporate. - @param hostname: Hostname - @type hostname: str - @return: netspeed name - @rtype: str + :arg hostname: Hostname (e.g. example.com) """ addr = self._gethostbyname(hostname) return self.netspeed_by_addr(addr) @@ -475,12 +472,8 @@ def netspeed_by_name(self, hostname): def country_name_by_addr(self, addr): """ Returns full country name for specified IP address. - Use this method if you have a Country or City database. - @param addr: IP address - @type addr: str - @return: country name - @rtype: str + :arg addr: IP address (e.g. 203.0.113.30) """ VALID_EDITIONS = (const.COUNTRY_EDITION, const.COUNTRY_EDITION_V6) if self._databaseType in VALID_EDITIONS: @@ -495,25 +488,17 @@ def country_name_by_addr(self, addr): def country_name_by_name(self, hostname): """ Returns full country name for specified hostname. - Use this method if you have a Country database. - @param hostname: Hostname - @type hostname: str - @return: country name - @rtype: str + :arg hostname: Hostname (e.g. example.com) """ addr = self._gethostbyname(hostname) return self.country_name_by_addr(addr) def org_by_addr(self, addr): """ - Lookup Organization, ISP or ASNum for given IP address. - Use this method if you have an Organization, ISP or ASNum database. + Returns Organization, ISP, or ASNum name for given IP address. - @param addr: IP address - @type addr: str - @return: organization or ISP name - @rtype: str + :arg addr: IP address (e.g. 203.0.113.30) """ valid = (const.ORG_EDITION, const.ISP_EDITION, const.ASNUM_EDITION, const.ASNUM_EDITION_V6) if self._databaseType not in valid: @@ -525,13 +510,9 @@ def org_by_addr(self, addr): def org_by_name(self, hostname): """ - Lookup the organization (or ISP) for hostname. - Use this method if you have an Organization/ISP database. + Returns Organization, ISP, or ASNum name for given hostname. - @param hostname: Hostname - @type hostname: str - @return: Organization or ISP name - @rtype: str + :arg hostname: Hostname (e.g. example.com) """ addr = self._gethostbyname(hostname) return self.org_by_addr(addr) @@ -543,15 +524,11 @@ def org_by_name(self, hostname): def record_by_addr(self, addr): """ - Look up the record for a given IP address. - Use this method if you have a City database. + Returns dictionary with city data containing `country_code`, `country_name`, + `region`, `city`, `postal_code`, `latitude`, `longitude`, `dma_code`, + `metro_code`, `area_code`, `region_code` and `time_zone`. - @param addr: IP address - @type addr: str - @return: Dictionary with country_code, country_code3, country_name, - region, city, postal_code, latitude, longitude, dma_code, - metro_code, area_code, region_code, time_zone - @rtype: dict + :arg addr: IP address (e.g. 203.0.113.30) """ if self._databaseType not in const.CITY_EDITIONS: message = 'Invalid database type, expected City' @@ -566,28 +543,20 @@ def record_by_addr(self, addr): def record_by_name(self, hostname): """ - Look up the record for a given hostname. - Use this method if you have a City database. + Returns dictionary with city data containing `country_code`, `country_name`, + `region`, `city`, `postal_code`, `latitude`, `longitude`, `dma_code`, + `metro_code`, `area_code`, `region_code` and `time_zone`. - @param hostname: Hostname - @type hostname: str - @return: Dictionary with country_code, country_code3, country_name, - region, city, postal_code, latitude, longitude, dma_code, - metro_code, area_code, region_code, time_zone - @rtype: dict + :arg hostname: Hostname (e.g. example.com) """ addr = self._gethostbyname(hostname) return self.record_by_addr(addr) def region_by_addr(self, addr): """ - Lookup the region for given IP address. - Use this method if you have a Region database. + Returns dictionary containing `country_code` and `region_code`. - @param addr: IP address - @type addr: str - @return: Dictionary containing country_code and region_code - @rtype: dict + :arg addr: IP address (e.g. 203.0.113.30) """ if self._databaseType not in const.REGION_CITY_EDITIONS: message = 'Invalid database type, expected Region or City' @@ -598,26 +567,18 @@ def region_by_addr(self, addr): def region_by_name(self, hostname): """ - Lookup the region for given hostname. - Use this method if you have a Region database. + Returns dictionary containing `country_code` and `region_code`. - @param hostname: Hostname - @type hostname: str - @return: Dictionary containing country_code, region_code and region - @rtype: dict + :arg hostname: Hostname (e.g. example.com) """ addr = self._gethostbyname(hostname) return self.region_by_addr(addr) def time_zone_by_addr(self, addr): """ - Look up the time zone for a given IP address. - Use this method if you have a Region or City database. + Returns timezone in tzdata format (e.g. America/New_York or Europe/Paris) - @param addr: IP address - @type addr: str - @return: Time zone - @rtype: str + :arg addr: IP address (e.g. 203.0.113.30) """ if self._databaseType not in const.CITY_EDITIONS: message = 'Invalid database type, expected City' @@ -628,13 +589,9 @@ def time_zone_by_addr(self, addr): def time_zone_by_name(self, hostname): """ - Look up the time zone for a given hostname. - Use this method if you have a Region or City database. + Returns timezone in tzdata format (e.g. America/New_York or Europe/Paris) - @param hostname: Hostname - @type hostname: str - @return: Time zone - @rtype: str + :arg hostname: Hostname (e.g. example.com) """ addr = self._gethostbyname(hostname) return self.time_zone_by_addr(addr) From edf6330a19ecb59415d8efe6f68e97a92384f16f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Mon, 3 Feb 2014 02:40:23 +0100 Subject: [PATCH 14/18] Remove unicode characters form supported databases --- docs/supported-databases.rst | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/supported-databases.rst b/docs/supported-databases.rst index 225bd88..34f8d16 100644 --- a/docs/supported-databases.rst +++ b/docs/supported-databases.rst @@ -1,20 +1,20 @@ Supported Databases =================== -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| Type | IPv4 | IPv6 | Details | -+================+========+========+===================================================================================+ -| Country | ✓ | ✓ | `MaxMind Country product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| City | ✓ | ✓ | `MaxMind City product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| Organization | ✓ | | `MaxMind Organization product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| ISP | ✓ | | `MaxMind ISP product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| Region | ✓ | | `MaxMind Region product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| ASN | ✓ | ✓ | `MaxMind ASN product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ -| Netspeed | ✓ | | `MaxMind Netspeed product page `__ | -+----------------+--------+--------+-----------------------------------------------------------------------------------+ \ No newline at end of file ++----------------+------+------+-----------------------------------------------------------------------------------+ +| Type | IPv4 | IPv6 | Details | ++================+======+======+===================================================================================+ +| Country | Yes | Yes | `MaxMind Country product page `__ | ++----------------+------+------+-----------------------------------------------------------------------------------+ +| City | Yes | Yes | `MaxMind City product page `__ | ++----------------+------+------+-----------------------------------------------------------------------------------+ +| Organization | Yes | | `MaxMind Organization product page `__ | ++----------------+------+------+-----------------------------------------------------------------------------------+ +| ISP | Yes | | `MaxMind ISP product page `__ | ++----------------+------+------+-----------------------------------------------------------------------------------+ +| Region | Yes | | `MaxMind Region product page `__ | ++----------------+------+------+-----------------------------------------------------------------------------------+ +| ASN | Yes | Yes | `MaxMind ASN product page `__ | ++----------------+------+------+-----------------------------------------------------------------------------------+ +| Netspeed | Yes | | `MaxMind Netspeed product page `__ | ++----------------+------+------+-----------------------------------------------------------------------------------+ \ No newline at end of file From fc3dd163aac4f9b137479af84b44e26bee2ad1db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Mon, 3 Feb 2014 02:46:03 +0100 Subject: [PATCH 15/18] Change syntax language to get box border --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 565dde4..103c56e 100644 --- a/README.rst +++ b/README.rst @@ -12,7 +12,7 @@ Installation You can easily install pygeoip from PyPi. -.. code:: bash +.. code:: python pip install pygeoip From 1bafc985300db83faa3c6044e5b7620ccf7eaa1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Mon, 3 Feb 2014 03:02:39 +0100 Subject: [PATCH 16/18] Remove Epydoc strings --- pygeoip/__init__.py | 12 ++++-------- pygeoip/const.py | 7 +------ pygeoip/timezone.py | 18 ++++-------------- pygeoip/util.py | 20 ++++++-------------- setup.py | 7 +------ 5 files changed, 16 insertions(+), 48 deletions(-) diff --git a/pygeoip/__init__.py b/pygeoip/__init__.py index 45e8b3a..cf15b46 100644 --- a/pygeoip/__init__.py +++ b/pygeoip/__init__.py @@ -1,11 +1,6 @@ # -*- coding: utf-8 -*- """ -Pure Python GeoIP API - -@author: Jennifer Ennis -@author: William Tisäter - -@license: Copyright(C) 2004 MaxMind LLC +Copyright (c) 2010-2014 Jennifer Ennis, William Tisäter. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -20,6 +15,7 @@ You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . """ + __version__ = "0.3.1" import os @@ -576,7 +572,7 @@ def region_by_name(self, hostname): def time_zone_by_addr(self, addr): """ - Returns timezone in tzdata format (e.g. America/New_York or Europe/Paris) + Returns time zone in tzdata format (e.g. America/New_York or Europe/Paris) :arg addr: IP address (e.g. 203.0.113.30) """ @@ -589,7 +585,7 @@ def time_zone_by_addr(self, addr): def time_zone_by_name(self, hostname): """ - Returns timezone in tzdata format (e.g. America/New_York or Europe/Paris) + Returns time zone in tzdata format (e.g. America/New_York or Europe/Paris) :arg hostname: Hostname (e.g. example.com) """ diff --git a/pygeoip/const.py b/pygeoip/const.py index 9bfef0e..3cb4bb4 100644 --- a/pygeoip/const.py +++ b/pygeoip/const.py @@ -1,11 +1,6 @@ # -*- coding: utf-8 -*- """ -Constants for the database parser - -@author: Jennifer Ennis -@author: William Tisäter - -@license: Copyright(C) 2004 MaxMind LLC +Copyright (c) 2010-2014 Jennifer Ennis, William Tisäter. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by diff --git a/pygeoip/timezone.py b/pygeoip/timezone.py index 18ef1b4..a22df1d 100644 --- a/pygeoip/timezone.py +++ b/pygeoip/timezone.py @@ -1,11 +1,6 @@ # -*- coding: utf-8 -*- """ -Time zone data and lookup function - -@author: Jennifer Ennis -@author: William Tisäter - -@license: Copyright(C) 2004 MaxMind LLC +Copyright (c) 2010-2014 Jennifer Ennis, William Tisäter. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -21,17 +16,12 @@ along with this program. If not, see . """ - def time_zone_by_country_and_region(country_code, region_code=None): """ - Get time zone from country code and region code. + Returns time zone from country and region code. - @param country_code: Country code - @type country_code: str - @param region_code: Region code - @type region_code: str - @return: Time zone - @rtype: str + :arg country_code: Country code + :arg region_code: Region code """ timezone = country_dict.get(country_code) if not timezone: diff --git a/pygeoip/util.py b/pygeoip/util.py index 7067b8d..a8065c8 100644 --- a/pygeoip/util.py +++ b/pygeoip/util.py @@ -1,11 +1,6 @@ # -*- coding: utf-8 -*- """ -Utility function for address translation - -@author: Jennifer Ennis -@author: William Tisäter - -@license: Copyright(C) 2004 MaxMind LLC +Copyright (c) 2010-2014 Jennifer Ennis, William Tisäter. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -34,9 +29,9 @@ def ip2long(ip): """ - Wrapper function for IPv4 and IPv6 converters - @param ip: IPv4 or IPv6 address - @type ip: str + Wrapper function for IPv4 and IPv6 converters. + + :arg ip: IPv4 or IPv6 address """ try: return int(binascii.hexlify(socket.inet_aton(ip)), 16) @@ -46,11 +41,8 @@ def ip2long(ip): def str2fp(data): """ - Convert bytes data to file handle object + Convert bytes data to file handle object (StringIO or BytesIO). - @param data: string data - @type data: str - @return: file handle object - @rtype: StringIO or BytesIO + :arg data: String data to transform """ return BytesIO(bytearray(data, const.ENCODING)) if const.PY3 else StringIO(data) diff --git a/setup.py b/setup.py index b76bd76..fcab474 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- """ -Setup file for pygeoip package. - -@author: Jennifer Ennis - -@license: -Copyright(C) 2004 MaxMind LLC +Copyright (c) 2010-2014 Jennifer Ennis, William Tisäter. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by From 532951a1b58912bf4c6316cf724bd2545215f800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Mon, 3 Feb 2014 03:07:08 +0100 Subject: [PATCH 17/18] Update README files --- CHANGELOG.md | 1 + DEVELOPER.md | 11 +++-------- Makefile | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e606354..f8661bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### Release 0.3.1 +* New: Documentation now available on readthedocs.org * New: MaxMind Netspeed database support * Fix: Release thread lock on exceptions diff --git a/DEVELOPER.md b/DEVELOPER.md index e27cb39..745cd89 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -16,15 +16,10 @@ https://www.defunct.cc/maxmind-geoip-samples.tar.gz (17 MB) Extract the tarball in the tests directory and run `tox` from the root directory. -This requires a machine with Python 2.5 - 3.3 installed and all dependencies mention in the header. - -### Documentation - -For converting Markdown to reStructuredText used by PyPi we use pandoc. -[Read pandoc's install instructions](http://johnmacfarlane.net/pandoc/installing.html). +This requires a machine with Python 2.6 - 3.3 installed and all dependencies mention in the header. ### TL;DR -There's a shell script doing all this for you. +There's a Makefile doing all this for you. - ./build.sh + make test diff --git a/Makefile b/Makefile index 5484f36..42ba497 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .PHONY: docs -all: test docs +all: test test: @echo "Downloading test databases" From fb7e8fb2c4e4684b9073c8c75b48553d7b346028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Tis=C3=A4ter?= Date: Mon, 3 Feb 2014 03:07:18 +0100 Subject: [PATCH 18/18] Update MANIFEST.in --- MANIFEST.in | 1 - 1 file changed, 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index b18eecd..8d5d163 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,3 @@ -recursive-include apidocs * recursive-include tests * include README.rst include LICENSE.md