diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 02:50:01 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-30 02:50:01 +0000 |
commit | 91275eb478ceb58083426099b6da3f4c7e189f19 (patch) | |
tree | 260f7d2fa77408b38c5cea96b320b9b0b6713ff2 /debian/vendor-h2o/doc | |
parent | Merging upstream version 1.9.4. (diff) | |
download | dnsdist-91275eb478ceb58083426099b6da3f4c7e189f19.tar.xz dnsdist-91275eb478ceb58083426099b6da3f4c7e189f19.zip |
Merging debian version 1.9.4-1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'debian/vendor-h2o/doc')
41 files changed, 0 insertions, 16347 deletions
diff --git a/debian/vendor-h2o/doc/Makefile b/debian/vendor-h2o/doc/Makefile deleted file mode 100644 index 5cd5f29..0000000 --- a/debian/vendor-h2o/doc/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -VPATH=../srcdoc -OUTPUT=\ - index.html \ - install.html \ - benchmarks.html \ - configure.html \ - configure/quick_start.html \ - configure/command_options.html \ - configure/syntax_and_structure.html \ - configure/base_directives.html \ - configure/compress_directives.html \ - configure/http1_directives.html \ - configure/http2_directives.html \ - configure/access_log_directives.html \ - configure/errordoc_directives.html \ - configure/expires_directives.html \ - configure/fastcgi_directives.html \ - configure/file_directives.html \ - configure/headers_directives.html \ - configure/mruby_directives.html \ - configure/proxy_directives.html \ - configure/redirect_directives.html \ - configure/reproxy_directives.html \ - configure/status_directives.html \ - configure/throttle_response_directives.html \ - configure/basic_auth.html \ - configure/cgi.html \ - configure/mruby.html \ - configure/dos_detection.html \ - configure/access_control.html \ - faq.html \ - -%.html: %.mt snippets/directive.mt snippets/wrapper.mt - ../misc/makedoc.pl $< $@ - -all: mkdir html search/searchindex.js - -mkdir: - mkdir -p doc/configure - -html: $(OUTPUT) - -search/searchindex.js: html - ../misc/oktavia/bin/oktavia-mkindex $(patsubst %,-i %,$(OUTPUT)) -m html -u h2 -c 10 -t js -s english - -publish: all - @if [ -z "$$PUBLISH" ] ; then \ - echo "environment variable PUBLISH not set" >&2 ; \ - exit 1; \ - fi - tar cf - `git ls-files` | (cd $$PUBLISH && tar xf -) - -clean: - rm -f $(OUTPUT) search/searchindex.js - -.PHONY: mkdir html publish publish-check do-publish diff --git a/debian/vendor-h2o/doc/README.md b/debian/vendor-h2o/doc/README.md deleted file mode 100644 index 12500b0..0000000 --- a/debian/vendor-h2o/doc/README.md +++ /dev/null @@ -1,11 +0,0 @@ -H2O DOCS -======== - -Open index.html for documentation. - -Updating the docs ------------------ - -The contents are automatically generated from https://github.com/h2o/h2o by running `cd doc && make`. - -Please submit changes to the aforementioned repository. diff --git a/debian/vendor-h2o/doc/assets/8mbps100msec-nginx195-h2o150.png b/debian/vendor-h2o/doc/assets/8mbps100msec-nginx195-h2o150.png Binary files differdeleted file mode 100644 index 0a73185..0000000 --- a/debian/vendor-h2o/doc/assets/8mbps100msec-nginx195-h2o150.png +++ /dev/null diff --git a/debian/vendor-h2o/doc/assets/firstpaintbench.png b/debian/vendor-h2o/doc/assets/firstpaintbench.png Binary files differdeleted file mode 100644 index 82d8def..0000000 --- a/debian/vendor-h2o/doc/assets/firstpaintbench.png +++ /dev/null diff --git a/debian/vendor-h2o/doc/assets/remotebench.png b/debian/vendor-h2o/doc/assets/remotebench.png Binary files differdeleted file mode 100644 index 5ed9261..0000000 --- a/debian/vendor-h2o/doc/assets/remotebench.png +++ /dev/null diff --git a/debian/vendor-h2o/doc/assets/searchstyle.css b/debian/vendor-h2o/doc/assets/searchstyle.css deleted file mode 100644 index e0a5b6f..0000000 --- a/debian/vendor-h2o/doc/assets/searchstyle.css +++ /dev/null @@ -1,125 +0,0 @@ -.search { - position: absolute; - right: 10px; - bottom: 20px; - width: 240px; -} - -#searchresult_box { - display: none; - position: absolute; - top: 135px; - right: 0px; - max-width: 500px; - padding: 10px; - background-color: #ffffff; - -moz-border-radius: 8px; - border-radius: 8px; - -moz-box-shadow: 3px 3px 5px 5px #b5b2b2; - box-shadow: 3px 3px 5px 5px #b5b2b2; - opacity: 0.95; - z-index: 100000; -} - -#close_search_box { - position: absolute; - top: 10px; - right: 10px; - width: 20px; - height: 20px; - text-align: center; - vertical-align: middle; - color: #666; -} - -#close_search_box:hover { - background-color: #d1e8ff; - border: 1px solid gray; -} - -#close_search_box:active { - background-color: #b4c8db; - border: 1px solid gray; -} - - -#searchresult_summary { - color: #444; -} - -#searchresult .entry { - margin: 10px 10px 10px 10px; - color: black; -} - -#searchresult .entry .title { - font-size: normal; -} - -#searchresult .entry .url { - font-size: 14px!important; - color: #093; - font-style: normal; - font-family: arial,sans-serif; -} - -#searchresult .entry .content { - font-size: small; - font-family: arial,sans-serif; - color: #222; -} - -#searchresult .entry .content .hit { - font-weight: bolder; - text-decoration: underline; -} - -#searchresult .proposal { - margin: 10px 10px 10px 10px; - color: #222; - font-size: small; - font-family: arial,sans-serif; -} -#searchresult .proposal .option { - background-color: #e8f4ff; - border-bottom: 1px solid blue; -} - -#searchresult .proposal .option:hover { - background-color: #d1e8ff; -} - -#searchresult .proposal .option:active { - background-color: #b4c8db; -} - -#searchresult_nav .selected { - background-color: #b4c8db; - border: 1px solid #6c83db; -} - -#searchresult_nav span { - background-color: #ffffff; - border: 1px solid #888888; - padding: 5px; - margin: 5px; - color: #222; -} - -#searchresult_nav span:hover { - background-color: #d1e8ff; - border: 1px solid #7d98ff; -} - -#searchresult_nav span:active { - background-color: #b4c8db; - border: 1px solid #6c83db; -} - -#searchresult_box span.pr { - position: absolute; - right: 10px; - bottom: 10px; - font-size: x-small; - color: #555; -} diff --git a/debian/vendor-h2o/doc/assets/staticfile612-nginx1910-h2o170.png b/debian/vendor-h2o/doc/assets/staticfile612-nginx1910-h2o170.png Binary files differdeleted file mode 100644 index 63ec693..0000000 --- a/debian/vendor-h2o/doc/assets/staticfile612-nginx1910-h2o170.png +++ /dev/null diff --git a/debian/vendor-h2o/doc/assets/style.css b/debian/vendor-h2o/doc/assets/style.css deleted file mode 100644 index fec08c3..0000000 --- a/debian/vendor-h2o/doc/assets/style.css +++ /dev/null @@ -1,367 +0,0 @@ -body { - background: #f2f2f2; - margin: 0; - padding: 0; - color: black; - font-family: Arial, sans-serif; - line-height: 1.3em; -} - -a { - color: #009; -} - -#body { - background: #fff; - margin: 0 auto; - padding: 0; - width: 100%; - max-width: 800px; - text-align: justify; -} - -#top { - background: #336; - color: #eee; - width: 100%; - padding: 0 0; - margin: 0 0; - position: relative; -} - -#top h1 { - font-size: 60px; - padding: 35px 10px 0 50px; - margin: 0 0; - line-height: 1em; -} - -#top h1 a { - color: #fff; - text-decoration: none; -} - -#top .description { - padding: 0 10px 20px 50px; - margin: 0 0; -} - -@media screen and (max-width: 800px) { - #top .description { - padding-bottom: 45px; - } -} - -#top ul { - float: right; - margin: 20px 0 0 0; - padding: 0 50px 0 0; -} - -#top ul li { - display: inline; - font-weight: bold; - margin: 0; - padding: 0 0 0 1em; -} - -#top ul li a { - color: #600; -} - -#menu { - width: 100%; - background: #fff; - padding: 0; - border-collapse: collapse; - table-layout: fixed; -} - -#menu td { - text-align: center; - border: 1px solid #aaa; - background: #ddd; -} - -@media screen and (max-width: 800px) { - #menu td { - word-break: break-word; - } - - #menu td:first-child, - #menu td:last-child { - border-left: none; - border-right: none; - } -} - -#menu td a { - display: block; - padding: 0.4em; - color: #333; - font-weight: bold; - text-decoration: none; -} - -@media screen and (max-width: 800px) { - #menu td a { - padding-left: 0; - padding-right: 0; - } -} - -#menu .selected { - background: white; - font-weight: bold; -} - -#menu .selected a { - color: black; -} - -#breadcrumb { - margin: 0; - padding: 2em 50px 0 50px; - font-weight: bold; -} - -#main { - margin: 0; - width: 698px; - padding: 0 50px 1em 50px; - display: inline-block; - border: 1px solid #aaa; - border-top: none; -} - -@media screen and (max-width: 800px) { - #main { - width: 100%; - padding-left: 0; - padding-right: 0; - border-left: none; - border-right: none; - } -} - -#main h2 { - font-size: 120%; - margin: 2em 0 1em 0; -} - -#main h2 a { - color: black; - text-decoration: none; -} - -#main h3 { - font-size: 100%; - margin: 2em 0 1em 0; -} - -#main div { - margin: 1em 0; -} - -#main dt { - margin-top: 0.5em; - font-weight: bold; -} - -#main ul li { - margin-top: 0.2em; - margin-bottom: 0.2em; -} - -#main ul li ul li { - margin-top: 0.1em; - margin-bottom: 0.1em; -} - -#main pre { - border: 1px solid gray; - margin: 0.2em 0; - padding: 0.5em; - background: #f6f6f6; - overflow-x: auto; -} - -#main .example .caption { - text-align: center; - margin-bottom: 0.2em; -} - -#main table { - margin: 1em auto; - border: 1px solid #ccc; - border-collapse: collapse; -} - -#main table td,th { - border: 1px solid #ccc; - padding: 0.3em 0.5em; -} - -#main table th { - background-color: #eee; - text-align: center; -} - -#main table caption { - caption-side: top; - font-size: 100%; - font-weight: normal; - padding: 0.3em; -} - -#main .notes { - margin: 3em 0 1em 0; - font-size: 70%; -} - -#main .notes h3 { - margin: 1em 0 0.2em 0; - font-weight: bold; -} - -#main .notes ol { - margin: 0; - padding-left: 0.5em; - list-style: inside decimal; -} - -#main .doc-image { - display: block; - margin: 1em auto; - border: 0; -} - -#main sup a { - text-decoration: none; -} - -#main img { - height: auto; - max-width: 100%; -} - -#main .section-head { - border-bottom: 1px solid gray; -} - -#main .directive-head { - margin: 2em 0 1em 0; - border-bottom: 1px solid #999; -} - -#main .directive-head h3 { - margin: 0; - font-size: 120%; -} - -#main .directive-head h3 a { - color: black; - text-decoration: none; -} - -#main .directive-since { - margin: 0; - font-size: 80%; - float: right; -} - -#main .directive-desc dt { - margin: 0.5em 0 0.3em 0; -} - -#main .directive-desc dd { - margin: 0.5em 0 1em 0; -} - -#main .directive-desc dd :first-child { - margin-top: 0.3em; -} - -#main .mruby-method-head { - margin: 2em 0 1em 0; - border-bottom: 1px solid #999; -} - -#main .mruby-method-head h3 { - margin: 0; - font-size: 120%; -} - -#main .mruby-method-head h3 a { - color: black; - text-decoration: none; -} - -#main .mruby-method-since { - margin: 0; - font-size: 80%; - float: right; -} - -#main .mruby-method-desc dt { - margin: 0.5em 0 0.3em 0; -} - -#main .mruby-method-desc dd { - margin: 0.5em 0 1em 0; -} - -#main .mruby-method-desc dd :first-child { - margin-top: 0.3em; -} - -#main .mruby-method-parameters { - margin-left: 1.5em; -} - -@media screen and (max-width: 800px) { - #main h2, - #main h3, - #main h4, - #main div, - #main p, - #main dt, - #main ul, - #main pre, - #main table, - #main .notes, - #main .directive-head, - #main .directive-desc { - margin-left: 25px; - margin-right: 25px - } - #main .mruby-method-head, - #main .mruby-method-desc { - margin-left: 25px; - margin-right: 25px - } - - #main * div, - #main * p, - #main * table, - #main * ul, - #main * pre { - margin-left: 0; - margin-right: 0; - } -} - -#footer { - border-width: 0 1px 1px 1px; - border-style: solid; - border-color: #aaa; - padding: 1em 50px 1em 50px; - text-align: center; -} - -@media screen and (max-width: 800px) { - #footer { - border-right: none; - border-left: none; - } -} diff --git a/debian/vendor-h2o/doc/benchmarks.html b/debian/vendor-h2o/doc/benchmarks.html deleted file mode 100644 index 2b90b80..0000000 --- a/debian/vendor-h2o/doc/benchmarks.html +++ /dev/null @@ -1,124 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Benchmarks - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td><a href="configure.html">Configure</a></td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -Benchmarks -</h2> - - -<h3 id="download-timings">Download Timings</h3> - -<div> -<p> -Providing quick response to user is more important than anything else in web performance tuning. -According to a research conducted by Microsoft, 500msec slowdown in Bing causes their revenue go down by 1.2%<sup><a href="#note_1" id="#cite_1" title="Velocity and the Bottom Line - O'Reilly Radar">1</sup></a></sup>. -</p> -<p> -The chart below compares the first-paint times and download completion times of different web browsers / HTTP servers on a simulated network of 8Mbps bandwidth with 100ms latency, which is typical for today's mobile networks<sup><a href="#note_2" id="#cite_2" title="A fork of http2rulez.com was used as the target website; bandwidth and latency were induced to local network using qdisc, specifically by running tc qdisc replace dev eth1 root handle 1:0 tbf rate 8192kbit burst 2048 latency 100ms; sudo tc qdisc add dev eth1 parent 1:1 netem delay 100ms, and sysctl -w net.ipv4.tcp_no_metrics_save=1.">2</sup></a></sup>. -</p> -<div align="center"> -<a href="assets/8mbps100msec-nginx195-h2o150.png" target="_blank"><img src="assets/8mbps100msec-nginx195-h2o150.png" height="300"></a> -</div> -<p> -It is clear in the case of this benchmark that the visitors of the web site would be more satisfied, if H2O was used as the HTTP server. -</p> -</div> - -<h3 id="static-file">Static-File Serving</h3> - -<div> -<p> -Below chart shows the scores recorded on Amazon EC2 running two c3.8xlarge instances (server and client) on a single network placement, serving a 612-byte file<sup><a href="#note_3" id="#cite_3" title="Configuration files used: nginx.conf, h2o.conf.">3</sup></a></sup>. -For each measurement, 250 concurrent clients were used<sup><a href="#note_4" id="#cite_4" title="Wrk was used for HTTP/1 tests. h2load was used for HTTP/2.">4</sup></a></sup>. -<code>open_file_cache</code> was used for Nginx. -H2O implements a open-file-cache that gets updated immediately when the files are replaced. -</p> -<div align="center"> -<a href="assets/staticfile612-nginx1910-h2o170.png" target="_blank"><img src="assets/staticfile612-nginx1910-h2o170.png" height="300"></a> -</div> -</div> - -<h3 id="reverse-proxy">Reverse Proxy</h3> - -<div> -<p> -Presented below is an old chart showing the scores recorded on Amazon EC2 running two c3.8xlarge instances (server and client) on a single network placement<sup><a href="#note_5" id="#cite_5" title="For reverse-proxy tests, another H2O process running on the same host was used as the upstream server">5</sup></a></sup><sup><a href="#note_6" id="#cite_6" title="open-file-cache was not used in the static-file benchmark">6</sup></a></sup>. -</p> -<div align="center"> -<a href="assets/remotebench.png" target="_blank"><img src="assets/remotebench.png" width="400"></a> -</div> -</div> - - - -<div class="notes"> -<h3>Notes:</h3> -<ol> -<li id="note_1"><a href="http://radar.oreilly.com/2009/07/velocity-making-your-site-fast.html">Velocity and the Bottom Line - O'Reilly Radar</a></li> -<li id="note_2"><a href="https://github.com/kazuho/http2rulez.com">A fork of http2rulez.com</a> was used as the target website; bandwidth and latency were induced to local network using <a href="http://linux-ip.net/articles/Traffic-Control-HOWTO/components.html">qdisc</a>, specifically by running <code>tc qdisc replace dev eth1 root handle 1:0 tbf rate 8192kbit burst 2048 latency 100ms; sudo tc qdisc add dev eth1 parent 1:1 netem delay 100ms</code>, and <code>sysctl -w net.ipv4.tcp_no_metrics_save=1</code>.</li> -<li id="note_3">Configuration files used: <a href="https://gist.github.com/kazuho/def1e71281ed4ae07b95">nginx.conf</a>, <a href="https://gist.github.com/kazuho/969bb99bae31d67e01c4">h2o.conf</a>.</li> -<li id="note_4"><a href="https://github.com/wg/wrk">Wrk</a> was used for HTTP/1 tests. <a href="https://nghttp2.org/documentation/h2load-howto.html">h2load</a> was used for HTTP/2.</li> -<li id="note_5">For reverse-proxy tests, another H2O process running on the same host was used as the upstream server</li> -<li id="note_6">open-file-cache was not used in the static-file benchmark</li> -</ol> -</div> - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure.html b/debian/vendor-h2o/doc/configure.html deleted file mode 100644 index 230310b..0000000 --- a/debian/vendor-h2o/doc/configure.html +++ /dev/null @@ -1,109 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -Configure -</h2> - - -<ul style="list-style: none; font-weight: bold;"> -<li><a href="configure/quick_start.html">Quick Start</a> -<li><a href="configure/command_options.html">Command Options</a> -<li>Configuration File -<ul> -<li><a href="configure/syntax_and_structure.html">Syntax and Structure</a> -</ul> -<li>Configuration Directives -<ul> -<li><a href="configure/base_directives.html">Base</a> -<li><a href="configure/http1_directives.html">HTTP/1</a> -<li><a href="configure/http2_directives.html">HTTP/2</a> -<li><a href="configure/access_log_directives.html">Access Log</a> -<li><a href="configure/compress_directives.html">Compress</a> -<li><a href="configure/errordoc_directives.html">Errordoc</a> -<li><a href="configure/expires_directives.html">Expires</a> -<li><a href="configure/fastcgi_directives.html">FastCGI</a> -<li><a href="configure/file_directives.html">File</a> -<li><a href="configure/headers_directives.html">Headers</a> -<li><a href="configure/mruby_directives.html">Mruby</a> -<li><a href="configure/proxy_directives.html">Proxy</a> -<li><a href="configure/redirect_directives.html">Redirect</a> -<li><a href="configure/reproxy_directives.html">Reproxy</a> -<li><a href="configure/status_directives.html">Status</a> -<li><a href="configure/throttle_response_directives.html">Throttle Response</a> -</ul> -</li> -<li>How-To -<ul> -<li><a href="configure/basic_auth.html">Using Basic Authentication</a></li> -<li><a href="configure/cgi.html">Using CGI</a></li> -<li><a href="configure/mruby.html">Using Mruby</a></li> -<li><a href="configure/dos_detection.html">Using DoS Detection</a></li> -<li><a href="configure/access_control.html">Access Control</a></li> -</ul> -</li> -<li><a href="https://github.com/h2o/h2o/wiki#configuration-examples" target="_blank">Configuration Examples (Wiki)</a> -</ul> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/access_control.html b/debian/vendor-h2o/doc/configure/access_control.html deleted file mode 100644 index 74f4ced..0000000 --- a/debian/vendor-h2o/doc/configure/access_control.html +++ /dev/null @@ -1,444 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Access Control - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Access Control -</h2> - - -<p> -Starting from version 2.1, H2O comes with a DSL-like mruby library which makes it easy to write access control list (ACL). -</p> - -<h2 id="example" class="section-head">Example</h2> - -<p> -Below example uses this Access Control feature to write various access control. -</p> - -<div class="example"> -<div class="caption">Example. Access Control</div> -<pre><code>paths: - "/": - mruby.handler: | - acl { - allow { addr == "127.0.0.1" } - deny { user_agent.match(/curl/i) && ! addr.start_with?("192.168.") } - respond(503, {}, ["Service Unavailable"]) { addr == malicious_ip } - redirect("https://example.com/", 301) { path =~ /moved/ } - use Htpasswd.new("/path/to/.htpasswd", "realm") { path.start_with?("/admin") } - } - file.dir: /path/to/doc_root -</code></pre> -</div> - - -<p> -In the example, the handler you get by calling <code>acl</code> method will do the following: -<ul> - <li> - if the remote IP address is exactly equal to "127.0.0.1", the request will be delegated to the next handler (i.e. serve files under /path/to/doc_root) and all following acl settings are ignored - </li> - <li> - otherwise, if the user agent string includes "curl" and the remote IP address doesn't start with "192.168.", this handler immediately returns <code>403 Forbidden</code> response - </li> - <li> - otherwise, if the remote IP address is exactly equal to the <code>malicious_ip</code> variable, this handler immediately returns <code>503 Service Unavailable</code> response - </li> - <li> - otherwise, if the request path matches with the pattern <code>/moved/i</code>, this handler immediately redirects the client to <code>"https://example.com"</code> with <code>301</code> status code - </li> - <li> - otherwise, if the request path starts with <code>/admin</code>, apply Basic Authentication to the request (for details of Basic Authentication, see <a href="configure/basic_auth.html">here</a>). - </li> - <li> - otherwise, the request will be delegated to the next handler (i.e. serve files under /path/to/doc_root) - </li> - -</ul> - -<h2 id="acl-methods" class="section-head">ACL Methods</h2> - -<p> -An ACL handler is built by calling ACL methods, which can be used like directives. -ACL methods can only be used in <code>acl</code> block. -</p> - -<p> -Each ACL method adds a filter to the handler, which checks whether the request matches the provided condition or not. -Every ACL method can be accompanied by a condition block, which should return boolean value. -</p> - -<p> -The filter defined by the method that first matched the accompanying condition gets applied (e.g. response <code>403 Forbidden</code>, redirect to somewhere). -If a condition block is omitted, all requests matches. -If none of the conditions matches the request, the handler returns <code>399</code> and the request will be delegated to the next handler. -</p> - -<div id="allow" class="mruby-method-head"> -<h3><a href="configure/access_control.html#allow"><code>"allow"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Adds a filter which delegates the request to the next handler if the request matches the provided condition. -</p> - -<pre><code>allow { ..condition.. }</code></pre> - -</dd> -</dl> - -<div id="deny" class="mruby-method-head"> -<h3><a href="configure/access_control.html#deny"><code>"deny"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Adds a filter which returns <code>403 Forbidden</code> if the request matches the provided condition. -</p> - -<pre><code>deny { ..condition.. }</code></pre> - -</dd> -</dl> - -<div id="redirect" class="mruby-method-head"> -<h3><a href="configure/access_control.html#redirect"><code>"redirect"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Adds a filter which redirects the client if the request matches the provided condition. -</p> - -<pre><code>redirect(location, status) { ..condition.. }</code></pre> - -</dd> -<dt>Parameters:</dt> -<dd> -<dl class="mruby-method-parameters"> - <dt>location</dt> - <dd>Location to which the client will be redirected. Required.</dd> - <dt>status</dt> - <dd>Status code of the response. Default value: 302</dd> -</dl> -</dd> -</dl> - -<div id="respond" class="mruby-method-head"> -<h3><a href="configure/access_control.html#respond"><code>"respond"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Adds a filter which returns arbitrary response if the request matches the provided condition. -</p> - -<pre><code>respond(status, header, body) { ..condition.. }</code></pre> - -</dd> -<dt>Parameters:</dt> -<dd> -<dl class="mruby-method-parameters"> - <dt>status</dt> - <dd>Status code of the response. Required.</dd> - <dt>header</dt> - <dd>Header key-value pairs of the response. Default value: {}</dd> - <dt>body</dt> - <dd>Body array of the response. Default value: []</dd> -</dl> -</dd> -</dl> - -<div id="use" class="mruby-method-head"> -<h3><a href="configure/access_control.html#use"><code>"use"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Adds a filter which applies the provided handler (callable object) if the request matches the provided condition. -</p> - -<pre><code>use(proc) { ..condition.. }</code></pre> - -</dd> -<dt>Parameters:</dt> -<dd> -<dl class="mruby-method-parameters"> - <dt>proc</dt> - <dd>Callable object that should be applied</dd> -</dl> -</dd> -</dl> - -<h2 id="matching-methods" class="section-head">Matching Methods</h2> - -<p> -In a condition block, you can use helpful methods which return particular properties of the request as string values. -Matching methods can only be used in a condition block of the ACL methods. -</p> - -<div id="addr" class="mruby-method-head"> -<h3><a href="configure/access_control.html#addr"><code>"addr"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Returns the remote IP address of the request. -</p> - -<pre><code>addr(forwarded)</code></pre> - -</dd> -<dt>Parameters:</dt> -<dd> -<dl class="mruby-method-parameters"> - <dt>forwarded</dt> - <dd>If true, returns the value of X-Forwarded-For header if it exists. Default value: true</dd> -</dl> -</dd> -</dl> - -<div id="path" class="mruby-method-head"> -<h3><a href="configure/access_control.html#path"><code>"path"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Returns the requested path string of the request. -</p> - -<pre><code>path()</code></pre> - -</dd> -</dl> - -<div id="method" class="mruby-method-head"> -<h3><a href="configure/access_control.html#method"><code>"method"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Returns the HTTP method of the request. -</p> - -<pre><code>method()</code></pre> - -</dd> -</dl> - -<div id="header" class="mruby-method-head"> -<h3><a href="configure/access_control.html#header"><code>"header"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Returns the header value of the request associated with the provided name. -</p> - -<pre><code>header(name)</code></pre> - -</dd> -<dt>Parameters:</dt> -<dd> -<dl class="mruby-method-parameters"> - <dt>name</dt> - <dd>Case-insensitive header name. Required.</dd> -</dl> -</dd> -</dl> - -<div id="user_agent" class="mruby-method-head"> -<h3><a href="configure/access_control.html#user_agent"><code>"user_agent"</code></a></h3> -</div> - -<dl class="mruby-method-desc"> -<dt>Description:</dt> -<dd> -<p> - Shortcut for header("user-agent"). -</p> - -<pre><code>user_agent()</code></pre> - -</dd> -</dl> - -<h2 id="caution" class="section-head">Caution</h2> - -<p> -Several restrictions are introduced to avoid misconfiguration when using <code>acl</code> method. -<ul> -<li><code>acl</code> method can be called only once in each handler configuration</li> -<li>If <code>acl</code> method is used, the handler returned by the configuration directive must be the one returned by the <code>acl</code> method</li> -</ul> -If a configuration violates these restrictions, the server will detect it and refuse to launch with error message. -</p> - -<p> -For example, both of the following examples violate the restrictions above, so the server will refuse to start up. -</p> - -<div class="example"> -<div class="caption">Example. Misconfiguration Example 1</div> -<pre><code>paths: - "/": - mruby.handler: | - acl { # this block will be ignored! - allow { addr == "127.0.0.1" } - } - acl { - deny - } - file.dir: /path/to/doc_root -</code></pre> -</div> - - -<div class="example"> -<div class="caption">Example. Misconfiguration Example 2</div> -<pre><code>paths: - "/": - mruby.handler: | - acl { # this block will be ignored! - allow { addr == "127.0.0.1" } - deny - } - proc {|env| [399, {}, []} - file.dir: /path/to/doc_root -</code></pre> -</div> - - -<p> -You can correct these like the following: -</p> - -<div class="example"> -<div class="caption">Example. Valid Configuration Example</div> -<pre><code>paths: - "/": - mruby.handler: | - acl { - allow { addr == "127.0.0.1" } - deny - } - file.dir: /path/to/doc_root -</code></pre> -</div> - - -<h2 id="how-to" class="section-head">How-To</h2> - -<h3 id="matching-ip-address-blocks">Matching IP Address Blocks</h3> - -<p> -You can match an IP address against predefined list of address blocks using a script named <a href="">trie_addr.rb</a>. -</p> -<p> -Below is an example. -</p> - -<div class="example"> -<div class="caption">Example. Address Block Matching Example</div> -<pre><code>paths: - "/": - mruby.handler: | - require "trie_addr.rb" - trie = TrieAddr.new.add(["192.168.0.0/16", "172.16.0.0/12"]) - acl { - allow { trie.match?(addr) } - deny - } - file.dir: /path/to/doc_root -</code></pre> -</div> - - -<p> -This library currently supports only IPv4 addresses. <code>TrieAddr#match?</code> returns <code>false</code> when it receives an invalid IPv4 address (including an IPv6 address) as an argument.. -</p> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/access_log_directives.html b/debian/vendor-h2o/doc/configure/access_log_directives.html deleted file mode 100644 index c609604..0000000 --- a/debian/vendor-h2o/doc/configure/access_log_directives.html +++ /dev/null @@ -1,222 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Access Log Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Access Log Directives -</h2> - - -<p> -This document describes the configuration directives of the access_log handler. -</p> - -<div id="access-log" class="directive-head"> -<h3><a href="configure/access_log_directives.html#access-log"><code>"access-log"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -The directive sets the path and optionally the format of the access log. -</p> - -<p> -If the supplied argument is a scalar, it is treated as the path of the log file, or if the value starts with a <code>|</code>, it is treated as a command to which the log should be emitted. -</p> -<div class="example"> -<div class="caption">Example. Emit access log to file</div> -<pre><code>access-log: /path/to/access-log-file -</code></pre> -</div> - -<div class="example"> -<div class="caption">Example. Emit access log through pipe</div> -<pre><code>access-log: "| rotatelogs /path/to/access-log-file.%Y%m%d 86400" -</code></pre> -</div> - - -<p> -If the supplied argument is a mapping, its <code>path</code> property is considered as the path of the log file or the pipe command, and the <code>format</code> property is treated as the format of the log file. -Starting from version 2.2, <code>escape</code> property can be used to specify the escape sequence that should be used to emit unsafe octets. -</p> - -<p> -Two forms of escape sequences are supported. -If <code>apache</code> is specified as the value of the <code>escape</code> property, unsafe octets are emitted in the form of <code>\xNN</code>, where N is a hexadecimal number in lower case. -If <code>json</code> is specified, unsafe octets are emitted in the form of <code>\u00NN</code>. -<code>apache</code> is the default escape method. -</p> - -<div class="example"> -<div class="caption">Example. Emit access log to file using Common Log Format</div> -<pre><code>access-log: - path: /path/to/access-log-file - format: "%h %l %u %t \"%r\" %s %b" - escape: apache -</code></pre> -</div> - - -<p> -The list of format strings recognized by H2O is as follows. -</p> - -<table> -<tr><th>Format String<th>Description -<tr><td><code>%%</code><td>the percent sign -<tr><td><code>%A</code><td>local address (e.g. <code>4.5.6.7</code>) -<tr><td><code>%b</code><td>size of the response body in bytes -<tr><td><code>%H</code><td>request protocol as sent by the client (e.g. <code>HTTP/1.1</code>) -<tr><td><code>%h</code><td>remote address (e.g. <code>1.2.3.4</code>) -<tr><td><code>%l</code><td>remote logname (always <code>-</code>) -<tr><td><code>%m</code><td>request method (e.g. <code>GET</code>, <code>POST</code>) -<tr><td><code>%p</code><td>local port (<code>%{local}p</code> is a synonym that is supported since version 2.2) -<tr><td><code>%{remote}p</code><td>remote port (since version 2.2) -<tr><td><code>%q</code><td>query string (<code>?</code> is prepended if exists, otherwise an empty string) -<tr><td><code>%r</code><td>request line (e.g. <code>GET / HTTP/1.1</code>) -<tr><td><code>%s</code><td>status code sent to client (e.g. <code>200</code>) -<tr><td><code>%<s</code><td>status code received from upstream (or initially generated) -<tr><td><code>%t</code><td>time when the request was received in format: <code>[02/Jan/2006:15:04:05 -0700]</code> -<tr><td><code>%{<i>FORMAT</i>}t</code><td>time when the request was received using the specified format. <code>FORMAT</code> should be an argument to <code>strftime</code>, or one of: -<table> -<tr><td><code>sec</code><td>number of seconds since Epoch -<tr><td><code>msec</code><td>number of milliseconds since Epoch -<tr><td><code>usec</code><td>number of microseconds since Epoch -<tr><td><code>msec_frac</code><td>millisecond fraction -<tr><td><code>usec_frac</code><td>microsecond fraction -</table> -As an example, it is possible to log timestamps in millisecond resolution using <code>%{%Y/%m/%d:%H:%M:%S}t.%{msec_frac}t</code>, which results in a timestamp like <code>2006-01-02:15:04:05.000</code>. -<tr><td><code>%U</code><td>requested URL path, not including the query string -<tr><td><code>%u</code><td>remote user if the request was authenticated (always <code>-</code>) -<tr><td><code>%V</code><td>requested server name (or the default server name if not specified by the client) -<tr><td><code>%v</code><td>canonical server name -<tr><td><code>%{<i>VARNAME</i>}e</code><td>request environment variable (since version 2.3; see <a href="configure/mruby.html#logging-arbitrary-variable">Logging Arbitrary Variable</a>) -<tr><td><code>%{<i>HEADERNAME</i>}i</code><td>value of the given request header (e.g. <code>%{user-agent}i</code>) -<tr><td><code>%{<i>HEADERNAME</i>}o</code><td>value of the given response header sent to client (e.g. <code>%{set-cookie}o</code>) -<tr><td><code>%<{<i>HEADERNAME</i>}o</code><td>value of the response header received from upstream (or initially generated) -<tr><td><code>%{<i>NAME</i>}x</code><td>various extensions. <code>NAME</code> must be one listed in the following tables. A dash (<code>-</code>) is emitted if the directive is not applicable to the request being logged. -<table> -<caption>Access Timings</caption> -<tr><th>Name<th>Description -<tr><td><code>connect-time</code><td>time spent to establish the connection (i.e. since connection gets <code>accept(2)</code>-ed until first octet of the request is received) -<tr><td><code>request-header-time</code><td>time spent receiving request headers -<tr><td><code>request-body-time</code><td>time spent receiving request body -<tr><td><code>request-total-time</code><td>sum of <code>request-header-time</code> and <code>request-body-time</code> -<tr><td><code>process-time</code><td>time spent after receiving request, before starting to send response -<tr><td><code>response-time</code><td>time spent sending response -<tr><td><code>duration</code><td>sum of <code>request-total-time</code>, <code>process-time</code>, <code>response-time</code> -</table> -<table> -<caption>Connection (since v2.0)</caption> -<tr><th>Name<th>Description -<tr><td><code>connection-id</code><td>64-bit internal ID assigned to every client connection -<tr><td><code>ssl.protocol-version</code><td>SSL protocol version obtained from <a href="https://www.openssl.org/docs/manmaster/ssl/SSL_get_version.html"><code>SSL_get_version</code></a> -<tr><td><code>ssl.session-reused</code><td><code>1</code> if the <a href="configure/base_directives.html#ssl-session-resumption">SSL session was reused</a>, or <code>0</code> if not<sup><a href="#note_1" id="#cite_1" title="A single SSL connection may transfer more than one HTTP request.">1</sup></a></sup> -<tr><td><code>ssl.session-id</code><td>base64-encoded value of the session id used for resuming the session (since v2.2) -<tr><td><code>ssl.cipher</code><td>name of the <a href="https://tools.ietf.org/html/rfc5246#appendix-A.5">cipher suite</a> being used, obtained from <a href="https://www.openssl.org/docs/manmaster/ssl/SSL_CIPHER_get_name.html">SSL_CIPHER_get_name</a> -<tr><td><code>ssl.cipher-bits</code><td>strength of the cipher suite in bits -</table> -<table> -<caption>HTTP/2 (since v2.0)</caption> -<tr><th>Name<th>Description -<tr><td><code>http2.stream-id</code><td>stream ID -<tr><td><code>http2.priority.received</code><td>colon-concatenated values of <i>exclusive</i>, <i>parent</i>, <i>weight</i> -<tr><td><code>http2.priority.received.exclusive</code><td>exclusive bit of the most recent priority specified by the client -<tr><td><code>http2.priority.received.parent</code><td>parent stream ID of the most recent priority specified by the client -<tr><td><code>http2.priority.received.weight</code><td>weight of the most recent priority specified by the client -</table> -<table> -<caption>Miscellaneous</caption> -<tr><th>Name<th>Description -<tr><td><code>error</code><td>request-level errors. Unless specified otherwise by using the <a href="configure/base_directives.html#error-log.emit-request-errors"><code>error-log.emit-request-errors</code></a> directive, the same messages are emitted to the <a href="configure/base_directives.html#error-log">error-log</a>. (since v2.1) -</table> -</table> - -<p> -The default format is <code>%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"</code>, a.k.a. the <a href="http://httpd.apache.org/docs/2.4/mod/mod_log_config.html.en#examples" target="_blank">NCSA extended/combined log format</a>. -</p> -<p> -Note that you may need to quote (and escape) the format string as required by YAML (see <a href="http://www.yaml.org/YAML_for_ruby.html#single-quoted_strings">Yaml Cookbook</a>). -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>See also:</dt> -<dd><a href="configure/base_directives.html#error-log"><code>error-log</code></a> -<a href="configure/base_directives.html#error-log.emit-request-errors"><code>error-log.emit-request-errors</code></a> -</dd> -</dl> - - - -<div class="notes"> -<h3>Notes:</h3> -<ol> -<li id="note_1">A single SSL connection may transfer more than one HTTP request.</li> -</ol> -</div> - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/base_directives.html b/debian/vendor-h2o/doc/configure/base_directives.html deleted file mode 100644 index 38f8ea0..0000000 --- a/debian/vendor-h2o/doc/configure/base_directives.html +++ /dev/null @@ -1,975 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Base Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Base Directives -</h2> - - -<p> -This document describes the configuration directives common to all the protocols and handlers. -</p> - -<div id="hosts" class="directive-head"> -<h3><a href="configure/base_directives.html#hosts"><code>"hosts"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Maps <code>host:port</code> to the mappings of per-host configs. -</p> - -<p> -The directive specifies the mapping between the authorities (the host or <code>host:port</code> section of an URL) and their configurations. -The directive is mandatory, and must at least contain one entry. -</p> -<p> -When <code>port</code> is omitted, the entry will match the requests targetting the default ports (i.e. port 80 for HTTP, port 443 for HTTPS) with given hostname. -Otherwise, the entry will match the requests targetting the specified port. -</p> -<p> -Since version 1.7, a wildcard character <code>*</code> can be used as the first component of the hostname. -If used, they are matched using the rule defined in <a href="https://tools.ietf.org/html/rfc2818#section-3.1" target="_blank">RFC 2818 Section 3.1</a>. -For example, <code>*.example.com</code> will match HTTP requests for both <code>foo.example.com</code> and <code>bar.example.com</code>. -Note that an exact match is preferred over host definitions using wildcard characters. -</p> - - -<div class="example"> -<div class="caption">Example. A host redirecting all HTTP requests to HTTPS</div> -<pre><code>hosts: - "www.example.com:80": - listen: - port: 80 - paths: - "/": - redirect: https://www.example.com/ - "www.example.com:443": - listen: - port: 443 - ssl: - key-file: /path/to/ssl-key-file - certificate-file: /path/to/ssl-certificate-file - paths: - "/": - file.dir: /path/to/doc-root -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -</dl> - -<div id="paths" class="directive-head"> -<h3><a href="configure/base_directives.html#paths"><code>"paths"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Mapping of paths and their configurations. -</p> - -</p> -<p> -The mapping is searched using prefix-match. -The entry with the longest path is chosen when more than one matching paths were found. -An <code>404 Not Found</code> error is returned if no matching paths were found. -</p> -<div class="example"> -<div class="caption">Example. Configuration with two paths</div> -<pre><code>hosts: - "www.example.com": - listen: - port: 80 - paths: - "/": - file.dir: /path/to/doc-root - "/assets": - file.dir: /path/to/assets -</code></pre> -</div> - -<p> -In releases prior to version 2.0, all the path entries are considered as directories. -When H2O receives a request that exactly matches to an entry in paths that does not end with a slash, the server always returns a 301 redirect that appends a slash. -</p> -<p> -Since 2.0, it depends on the handler of the path whether if a 301 redirect that appends a slash is returned. -Server administrators can take advantage of this change to define per-path configurations (see the examples in <a href="configure/file_directives.html#file.file"><code>file.file</code></a> and the <a href="configure/fastcgi_directives.html">FastCGI handler</a>). -<a href="configure/file_directives.html#file.dir"><code>file.dir</code></a> is an exception that continues to perform the redirection; in case of the example above, access to <code>/assets</code> is redirected to <code>/assets/</code>. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>host</dd> -</dl> - -<div id="listen" class="directive-head"> -<h3><a href="configure/base_directives.html#listen"><code>"listen"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Specifies the port at which the server should listen to. -</p> - -</p> -<p> -In addition to specifying the port number, it is also possible to designate the bind address or the SSL configuration. -</p> -<div class="example"> -<div class="caption">Example. Various ways of using the Listen Directive</div> -<pre><code># accept HTTP on port 80 on default address (both IPv4 and IPv6) -listen: 80 - -# accept HTTP on 127.0.0.1:8080 -listen: - host: 127.0.0.1 - port: 8080 - -# accept HTTPS on port 443 -listen: - port: 443 - ssl: - key-file: /path/to/key-file - certificate-file: /path/to/certificate-file - -# accept HTTPS on port 443 (using PROXY protocol) -listen: - port: 443 - ssl: - key-file: /path/to/key-file - certificate-file: /path/to/certificate-file - proxy-protocol: ON -</code></pre> -</div> - -<h4 id="listen-configuration-levels">Configuration Levels</h4> -<p> -The directive can be used either at global-level or at host-level. -At least one <code>listen</code> directive must exist at the global level, or every <i>host</i>-level configuration must have at least one <code>listen</code> directive. -</p> -<p> -Incoming connections accepted by global-level listeners will be dispatched to one of the host-level contexts with the corresponding <code>host:port</code>, or to the first host-level context if none of the contexts were given <code>host:port</code> corresponding to the request. -</p> -<p> -Host-level listeners specify bind addresses specific to the host-level context. -However it is permitted to specify the same bind address for more than one host-level contexts, in which case hostname-based lookup will be performed between the host contexts that share the address. -The feature is useful for setting up a HTTPS virtual host using <a href="https://tools.ietf.org/html/rfc6066">Server-Name Indication (RFC 6066)</a>. -</p> -<div class="example"> -<div class="caption">Example. Using host-level listeners for HTTPS virtual-hosting</div> -<pre><code>hosts: - "www.example.com:443": - listen: - port: 443 - ssl: - key-file: /path/to/www_example_com.key - certificate-file: /path/to/www_example_com.crt - paths: - "/": - file.dir: /path/to/doc-root_of_www_example_com - "www.example.jp:443": - listen: - port: 443 - ssl: - key-file: /path/to/www_example_jp.key - certificate-file: /path/to/www_example_jp.crt - paths: - "/": - file.dir: /path/to/doc-root_of_www_example_jp -</code></pre> -</div> - -<h4 id="listen-ssl">SSL Attribute</h4> -<p> -The <code style="font-weight: bold;">ssl</code> attribute must be defined as a mapping, and recognizes the following attributes. -</p> -<dl> -<dt id="certificate-file">certificate-file:</dt> -<dd>path of the SSL certificate file (mandatory)</dd> -<dt id="key-file">key-file:</dt> -<dd>path of the SSL private key file (mandatory)</dd> -<dt id="minimum-version">minimum-version:</dt> -<dd> -minimum protocol version, should be one of: <code>SSLv2</code>, <code>SSLv3</code>, <code>TLSv1</code>, <code>TLSv1.1</code>, <code>TLSv1.2</code>. -Default is <code>TLSv1</code> -</dd> -<dt id="min-version">min-verison:</dt> -<dd> -synonym of <code>minimum-version</code> (introduced in version 2.2) -</dd> -<dt id="maximum-version">maximum-version:</dt> -<dd> -maximum protocol version. -Introduced in version 2.2. -Default is the maximum protocol version supported by the server. -</dd> -<dt id="maximum-version">max-version:</dt> -<dd> -synonym of <code>maximum-version</code>. -</dd> -<dt id="cipher-suite">cipher-suite:</dt> -<dd>list of cipher suites to be passed to OpenSSL via SSL_CTX_set_cipher_list (optional)</dd> -<dt id="cipher-preferences">cipher-preference:</dt> -<dd> -side of the list that should be used for selecting the cipher-suite; should be either of: <code>client</code>, <code>server</code>. -Default is <code>client</code>. -</dd> -<dt id="dh-file">dh-file:</dt> -<dd> -path of a PEM file containing the Diffie-Hellman parameters to be used. -Use of the file is recommended for servers using Diffie-Hellman key agreement. -(optional) -</dd> -<dt id="ocsp-update-interval">ocsp-update-interval:</dt> -<dd> -interval for updating the OCSP stapling data (in seconds), or set to zero to disable OCSP stapling. -Default is <code>14400</code> (4 hours). -</dd> -<dt id="ocsp-max-failures">ocsp-max-failures:</dt> -<dd> -number of consecutive OCSP query failures before stopping to send OCSP stapling data to the client. -Default is 3. -</dd> -<dt id="neverbleed">neverbleed:</dt> -<dd> -unless set to <code>OFF</code>, H2O isolates RSA private key operations to an isolated process by using <a href="https://github.com/h2o/neverbleed">Neverbleed</a>. -Default is <code>ON</code>. -</dl> -<p> -<a href="configure/base_directives.html#ssl-session-resumption"><code>ssl-session-resumption</code></a> directive is provided for tuning parameters related to session resumption and session tickets. -</p> -<h4 id="listen-proxy-protocol">The Proxy-Protocol Attribute</h4> -<p> -The <code>proxy-protocol</code> attribute (i.e. the value of the attribute must be either <code>ON</code> or <code>OFF</code>) specifies if the server should recognize the information passed via <a href="http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt">"the PROXY protocol</a> in the incoming connections. -The protocol is used by L4 gateways such as <a href="http://aws.amazon.com/jp/elasticloadbalancing/">AWS Elastic Load Balancing</a> to send peer address to the servers behind the gateways. -</p> -<p> -When set to <code>ON</code>, H2O standalone server tries to parse the first octets of the incoming connections as defined in version 1 of the specification, and if successful, passes the addresses obtained from the protocol to the web applications and the logging handlers. -If the first octets do not accord with the specification, it is considered as the start of the SSL handshake or as the beginning of an HTTP request depending on whether if the <code>ssl</code> attribute has been used. -</p> -<p> -Default is <code>OFF</code>. -</p> -<h4 id="listen-unix-socket">Listening to a Unix Socket</h4> -<p> -If the <code>type</code> attribute is set to <code>unix</code>, then the <code>port</code> attribute is assumed to specify the path of the unix socket to which the standalone server should bound. -Also following attributes are recognized. -</p> -<dl> -<dt>owner</dt> -<dd> -username of the owner of the socket file. -If omitted, the socket file will be owned by the launching user. -</dd> -<dt>permission</dt> -<dd> -an octal number specifying the permission of the socket file. -Many operating systems require write permission for connecting to the socket file. -If omitted, the permission of the socket file will reflect the umask of the calling process. -</dd> -</dl> -<div class="example"> -<div class="caption">Example. Listening to a Unix Socket accessible only by www-data</div> -<pre><code>listen: - type: unix - port: /tmp/h2o.sock - owner: www-data - permission: 600 -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host</dd> -</dl> - -<div id="error-log" class="directive-head"> -<h3><a href="configure/base_directives.html#error-log"><code>"error-log"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Path of the file to which error logs should be appended. -</p> - -<p> -Default is stderr. -</p> -<p> -If the path starts with <code>|</code>, the rest of the path is considered as a command to which the logs should be piped. -</p> -<div class="example"> -<div class="caption">Example. Log errors to file</div> -<pre><code>error-log: /path/to/error-log-file -</code></pre> -</div> - -<div class="example"> -<div class="caption">Example. Log errors through pipe</div> -<pre><code>error-log: "| rotatelogs /path/to/error-log-file.%Y%m%d 86400" -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>See also:</dt> -<dd><a href="configure/base_directives.html#error-log.emit-request-errors"><code>error-log.emit-request-errors</code></a> -</dd> -</dl> - -<div id="error-log.emit-request-errors" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/base_directives.html#error-log.emit-request-errors"><code>"error-log.emit-request-errors"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets whether if request-level errors should be emitted to the error log. -</p> - -By setting the value to <code>OFF</code> and by using the <code>%{error}x</code> specifier of the <a href="configure/access_log_directives.html">access-log</a> directive, it is possible to log request-level errors only to the access log. - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>error-log.emit-request-errors: ON</pre></code> -<dt>See also:</dt> -<dd><a href="configure/access_log_directives.html#access-log"><code>access-log</code></a> -<a href="configure/base_directives.html#error-log"><code>error-log</code></a> -</dd> -</dl> - -<div id="handshake-timeout" class="directive-head"> -<h3><a href="configure/base_directives.html#handshake-timeout"><code>"handshake-timeout"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Maximum time (in seconds) that can be spent by a connection before it becomes ready to accept an HTTP request. -</p> - -Times spent for receiving <a href="configure/base_directives.html#listen-proxy-protocol">the PROXY protocol</a> and TLS handshake are counted. - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>handshake-timeout: 10</pre></code> -</dl> - -<div id="limit-request-body" class="directive-head"> -<h3><a href="configure/base_directives.html#limit-request-body"><code>"limit-request-body"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Maximum size of request body in bytes (e.g. content of POST). -</p> - -<p> -Default is 1073741824 (1GB). -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -</dl> - -<div id="max-connections" class="directive-head"> -<h3><a href="configure/base_directives.html#max-connections"><code>"max-connections"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Number of connections to handle at once at maximum. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>max-connections: 1024</pre></code> -</dl> -<div id="max-delegations" class="directive-head"> -<h3><a href="configure/base_directives.html#max-delegations"><code>"max-delegations"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Limits the number of delegations (i.e. internal redirects using the <code>X-Reproxy-URL</code> header). -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>max-delegations: 5</pre></code> -</dl> -<div id="num-name-resolution-threads" class="directive-head"> -<h3><a href="configure/base_directives.html#num-name-resolution-threads"><code>"num-name-resolution-threads"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Maximum number of threads to run for name resolution. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>num-name-resolution-threads: 32</pre></code> -</dl> - - -<div id="num-ocsp-updaters" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/base_directives.html#num-ocsp-updaters"><code>"num-ocsp-updaters"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Maximum number of OCSP updaters. -</p> - -<p> -<a href="https://en.wikipedia.org/wiki/OCSP_stapling">OSCP Stapling</a> is an optimization that speeds up the time spent for establishing a TLS connection. -In order to <i>staple</i> OCSP information, a HTTP server is required to periodically contact the certificate authority. -This directive caps the number of the processes spawn for collecting the information. -</p> -<p> -The use and the update interval of OCSP can be configured using the <a href="configure/base_directives.html#listen-ssl">SSL attributes</a> of the <a href="configure/base_directives.html#listen"><code>listen</code></a> configuration directive. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>num-ocsp-updaters: 10</pre></code> -</dl> - -<div id="num-threads" class="directive-head"> -<h3><a href="configure/base_directives.html#num-threads"><code>"num-threads"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Number of worker threads. -</p> - -<p> -Default is the number of the processors connected to the system as obtained by <code>getconf NPROCESSORS_ONLN</code>. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -</dl> - -<div id="pid-file" class="directive-head"> -<h3><a href="configure/base_directives.html#pid-file"><code>"pid-file"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Name of the file to which the process id of the server should be written. -</p> - -<p> -Default is none. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -</dl> - -<div id="tcp-fastopen" class="directive-head"> -<h3><a href="configure/base_directives.html#tcp-fastopen"><code>"tcp-fastopen"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Size of the queue used for TCP Fast Open. -</p> - -<p> -<a href="https://en.wikipedia.org/wiki/TCP_Fast_Open">TCP Fast Open</a> is an extension to the TCP/IP protocol that reduces the time spent for establishing a connection. -On Linux that support the feature, the default value is <code>4,096</code>. -On other platforms the default value is <code>0</code> (disabled). -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -</dl> - -<div id="send-server-name" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/base_directives.html#send-server-name"><code>"send-server-name"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) indicating whether if the <code>server</code> response header should be sent. -</p> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>send-server-name: ON</pre></code> -<dt>See also:</dt> -<dd><a href="configure/base_directives.html#server-name"><code>server-name</code></a> -</dd> -</dl> - -<div id="server-name" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/base_directives.html#server-name"><code>"server-name"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Lets the user override the value of the <code>server</code> response header. -</p> - -The default value is <code>h2o/VERSION-NUMBER</code>. - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>See also:</dt> -<dd><a href="configure/base_directives.html#send-server-name"><code>send-server-name</code></a> -</dd> -</dl> - -<div id="setenv" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/base_directives.html#setenv"><code>"setenv"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets one or more environment variables. -</p> - -<p> -Environment variables are a set of key-value pairs containing arbitrary strings, that can be read from applications invoked by the standalone server (e.g. <a href="configure/fastcgi_directives.html">fastcgi handler</a>, <a href="configure/mruby_directives.html">mruby handler</a>) and the access logger. -</p> -<p> -The directive is applied from outer-level to inner-level. -At each level, the directive is applied after the <a href="configure/base_directives.html#unsetenv"><code>unsetenv</code></a> directive at the corresponding level is applied. -</p> -<p> -Environment variables are retained through internal redirections. -</p> -<div class="example"> -<div class="caption">Example. Setting an environment variable named <code>FOO</code></div> -<pre><code>setenv: - FOO: "value_of_FOO" -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>See also:</dt> -<dd><a href="configure/base_directives.html#unsetenv"><code>unsetenv</code></a> -</dd> -</dl> - -<div id="unsetenv" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/base_directives.html#unsetenv"><code>"unsetenv"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Unsets one or more environment variables. -</p> - -<p> -The directive can be used to have an exception for the paths that have an environment variable set, or can be used to reset variables after an internal redirection. -</p> -<div class="example"> -<div class="caption">Example. Setting environment variable for <code>example.com</code> excluding <code>/specific-path</code></div> -<pre><code>hosts: - example.com: - setenv: - FOO: "value_of_FOO" - paths: - /specific-path: - unsetenv: - - FOO - ... -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>See also:</dt> -<dd><a href="configure/base_directives.html#setenv"><code>setenv</code></a> -</dd> -</dl> - -<div id="ssl-session-resumption" class="directive-head"> -<h3><a href="configure/base_directives.html#ssl-session-resumption"><code>"ssl-session-resumption"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Configures cache-based and ticket-based session resumption. -</p> - -<p> -To reduce the latency introduced by the TLS (SSL) handshake, two methods to resume a previous encrypted session are defined by the Internet Engineering Task Force. -H2O supports both of the methods: cache-based session resumption (defined in <a href="https://tools.ietf.org/html/rfc5246">RFC 5246</a>) and ticket-based session resumption (defined in <a href="https://tools.ietf.org/html/rfc5077">RFC 5077</a>). -</p> -<div class="example"> -<div class="caption">Example. Various session-resumption configurations</div> -<pre><code># use both methods (storing data on internal memory) -ssl-session-resumption: - mode: all - -# use both methods (storing data on memcached running at 192.168.0.4:11211) -ssl-session-resumption: - mode: all - cache-store: memcached - ticket-store: memcached - cache-memcached-num-threads: 8 - memcached: - host: 192.168.0.4 - port: 11211 - -# use ticket-based resumption only (with secrets used for encrypting the tickets stored in a file) -ssl-session-resumption: - mode: ticket - ticket-store: file - ticket-file: /path/to/ticket-secrets.yaml -</code></pre> -</div> - -<h4 id="ssl-session-resumption-methods">Defining the Methods Used</h4> -<p> -The <code>mode</code> attribute defines which methods should be used for resuming the TLS sessions. -The value can be either of: <code>off</code>, <code>cache</code>, <code>ticket</code>, <code>all</code>. -Default is <code>all</code>. -</p> -<p> -If set to <code>off</code>, session resumption will be disabled, and all TLS connections will be established via full handshakes. -If set to <code>all</code>, both session-based and ticket-based resumptions will be used, with the preference given to the ticket-based resumption for clients supporting both the methods. -</p> -<p> -For each method, additional attributes can be used to customize their behaviors. -Attributes that modify the behavior of the disabled method are ignored. -</p> -<h4 id="ssl-session-resumption-cache-based">Attributes for Cache-based Resumption</h4> -<p> -Following attributes are recognized if the cache-based session resumption is enabled. -Note that <code>memcached</code> attribute must be defined as well in case the <code>memcached</code> cache-store is used. -</p> -<dl> -<dt>cache-store:</dt> -<dd> -<p> -defines where the cache should be stored, must be one of: <code>internal</code>, <code>memcached</code>. -Default is <code>internal</code>. -</p> -<p> -Please note that if you compiled h2o with OpenSSL 1.1.0 ~ 1.1.0f, session resumption with external cache store would fail due to bug of OpenSSL. -</p> -</dd> -<dt>cache-memcached-num-threads:</dt> -<dd>defines the maximum number of threads used for communicating with the memcached server. -Default is <code>1</code>. -</dd> -<dt>cache-memcached-prefix:</dt> -<dd> -for the <code>memcached</code> store specifies the key prefix used to store the secrets on memcached. -Default is <code>h2o:ssl-session-cache:</code>. -</dd> -</dl> -<h4 id="ssl-session-resumption-ticket-based">Attributes for Ticket-based Resumption</h4> -<p> -Ticket-based session resumption uses master secret(s) to encrypt the keys used for encrypting the data transmitted over TLS connections. -To achieve <a href="https://en.wikipedia.org/wiki/Forward_secrecy" target="_blank">forward-secrecy</a> (i.e. protect past communications from being decrypted in case a master secret gets obtained by a third party), it is essential to periodically change the secret and remove the old ones. -</p> -<p> -Among the three types of stores supported for ticket-based session resumption, the <code>internal</code> store and <code>memcached</code> store implement automatic roll-over of the secrets. -A new master secret is created every 1/4 of the session lifetime (defined by the <code>lifetime</code> attribute), and they expire (and gets removed) after 5/4 of the session lifetime elapse. -</p> -<p> -For the <code>file</code> store, it is the responsibility of the web-site administrator to periodically update the secrets. H2O monitors the file and reloads the secrets when the file is altered. -</p> -<p> -Following attributes are recognized if the ticket-based resumption is enabled. -</p> -<dl> -<dt>ticket-store:</dt> -<dd>defines where the secrets for ticket-based resumption should be / is stored, must be one of: <code>internal</code>, <code>file</code>, <code>memcached</code>. -Default is <code>internal</code>. -<dt>ticket-cipher:</dt> -<dd> -for stores that implement automatic roll-over, specifies the cipher used for encrypting the tickets. -The value must be one recognizable by <code>EVP_get_cipherbyname</code>. -Default is <code>aes-256-cbc</code>. -<dt>ticket-hash:</dt> -<dd> -for stores that implement automatic roll-over, specifies the cipher used for digitally-signing the tickets. -The value must be one recognizable by <code>EVP_get_digestbyname</code>. -Default is <code>sha-256</code>. -</dd> -<dt>ticket-file:</dt> -<dd>for the <code>file</code> store specifies the file in which the secrets are stored</dd> -<dt>ticket-memcached-key:</dt> -<dd> -for the <code>memcached</code> store specifies the key used to store the secrets on memcached. -Default is <code>h2o:ssl-session-ticket</code>. -</dd> -</dl> -<h4 id="ssl-session-resumption-other">Other Attributes</h4> -<p> -Following attributes are common to cache-based and ticket-based session resumption. -</p> -<dl> -<dt>lifetime:</dt> -<dd> -defines the lifetime of a TLS session; when it expires the session cache entry is purged, and establishing a new connection will require a full TLS handshake. -Default value is <code>3600</code> (in seconds). -</dd> -<dt>memcached:</dt> -<dd> -specifies the location of memcached used by the <code>memcached</code> stores. -The value must be a mapping with <code>host</code> attribute specifying the address of the memcached server, and optionally a <code>port</code> attribute specifying the port number (default is <code>11211</code>). -By default, the memcached client uses the <a href="https://github.com/memcached/memcached/blob/master/doc/protocol-binary.xml">BINARY protocol</a>. -Users can opt-in to using the legacy <a href="https://github.com/memcached/memcached/blob/master/doc/protocol.txt">ASCII protocol</a> by adding a <code>protocol</code> attribute set to <code>ASCII</code>. -</dd> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -</dl> - -<div id="temp-buffer-path" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/base_directives.html#temp-buffer-path"><code>"temp-buffer-path"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Directory in which temporary buffer files are created. -</p> - -<p> -H2O uses an internal structure called <code>h2o_buffer_t</code> for buffering various kinds of data (e.g. POST content, response from upstream HTTP or FastCGI server). -When amount of the data allocated in the buffer exceeds 32MB, it starts allocating storage from the directory pointed to by the directive. -</p> -<p> -By using the directive, users can set the directory to one within a memory-backed file system (e.g. <a href="https://en.wikipedia.org/wiki/Tmpfs">tmpfs</a>) for speed, or specify a disk-based file system to avoid memory pressure. -</p> -<p> -Note that the directory must be writable by the running user of the server. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>temp-buffer-path: "/tmp"</pre></code> -<dt>See also:</dt> -<dd><a href="configure/base_directives.html#user"><code>user</code></a> -</dd> -</dl> - -<div id="user" class="directive-head"> -<h3><a href="configure/base_directives.html#user"><code>"user"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Username under which the server should handle incoming requests. -</p> - -<p> -If the directive is omitted and if the server is started under root privileges, the server will attempt to <code>setuid</code> to <code>nobody</code>. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -</dl> - -<div id="crash-handler" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/base_directives.html#crash-handler"><code>"crash-handler"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Script to invoke if <code>h2o</code> receives a fatal signal. -</p> - -<p>Note: this feature is only available when linking to the GNU libc.</p> - -<p>The script is invoked if one of the <code>SIGABRT</code>, -<code>SIGBUS</code>, <code>SIGFPE</code>, <code>SIGILL</code> or -<code>SIGSEGV</code> signals is received by <code>h2o</code>.</p> - -<p><code>h2o</code> writes the backtrace as provided by -<code>backtrace()</code> and <code>backtrace_symbols_fd</code> to the -standard input of the program.</p> - -<p>If the path is not absolute, it is prefixed with <code>${H2O_ROOT}/</code>.</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>crash-handler: "${H2O_ROOT}/share/h2o/annotate-backtrace-symbols"</pre></code> -</dl> - -<div id="crash-handler.wait-pipe-close" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/base_directives.html#crash-handler.wait-pipe-close"><code>"crash-handler.wait-pipe-close"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Whether <code>h2o</code> should wait for the crash handler pipe to close before exiting. -</p> - -<p>When this setting is <code>ON</code>, <code>h2o</code> will wait -for the pipe to the crash handler to be closed before exiting. -This can be useful if you use a custom handler that inspects the dying -process.</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>crash-handler.wait-pipe-close: OFF</pre></code> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/basic_auth.html b/debian/vendor-h2o/doc/configure/basic_auth.html deleted file mode 100644 index 7c3825c..0000000 --- a/debian/vendor-h2o/doc/configure/basic_auth.html +++ /dev/null @@ -1,101 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Using Basic Authentication - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Using Basic Authentication -</h2> - - -<p> -Starting from version 1.7, H2O comes with a mruby script named <a href="https://github.com/h2o/h2o/blob/master/share/h2o/mruby/htpasswd.rb">htpasswd.rb</a> that implements <a href="https://tools.ietf.org/html/rfc2617" target="_blank">Basic Authentication</a>. -The script provides a Rack handler that implements Basic Authentication using password files generated by the <a href="https://httpd.apache.org/docs/2.4/programs/htpasswd.html">htpasswd</a> command. -</p> - -<p> -Below example uses the mruby script to restrict access to the path. -If authentication fails, the mruby handler returns a <code>401 Unauthorized</code> response. -If authentication succeeds, the handler returns a <code>399</code> response, and the request is <a href="configure/mruby.html#delegating-request">delegated</a> internally to the next handler (i.e. <code>file.dir</code>). -</p> - -<div class="example"> -<div class="caption">Example. Configuring HTTP authentication using htpasswd.rb</div> -<pre><code>paths: - "/": - mruby.handler: | - require "htpasswd.rb" - Htpasswd.new("/path/to/.htpasswd", "realm-name") - file.dir: /path/to/doc_root -</code></pre> -</div> - - -<p> -In H2O versions prior to 2.0, you should specify <code>"#{$H2O_ROOT}/share/h2o/mruby/htpasswd.rb"</code> as the argument to <code>require</code>, since the directory is not registered as part of <code>$LOAD_PATH</code>. -</p> - -For convenience, the mruby script also forbids access to files or directories that start with <code>.ht</code>. - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/cgi.html b/debian/vendor-h2o/doc/configure/cgi.html deleted file mode 100644 index 983a674..0000000 --- a/debian/vendor-h2o/doc/configure/cgi.html +++ /dev/null @@ -1,112 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Using CGI - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Using CGI -</h2> - - -<p> -Starting from version 1.7, H2O comes with a FastCGI-to-CGI gateway (<code>fastcgi-cgi</code>), which can be found under <code>share/h2o</code> directory of the installation path. -The gateway can be used for running CGI scripts through the FastCGI handler. -</p> - -<p> -The example below maps <code>.cgi</code> files to be executed by the gateway. -It is also possible to run CGI scripts under different privileges by specifying the <code>user</code> attribute of the directive. -</p> - -<div class="example"> -<div class="caption">Example. Execute <code>.cgi</code> files using FastCGI-to-CGI gateway</div> -<pre><code>file.custom-handler: - extension: .cgi - fastcgi.spawn: - command: "exec $H2O_ROOT/share/h2o/fastcgi-cgi" -</code></pre> -</div> - - -The gateway also provides options to for tuning the behavior. A full list of options can be obtained by running the gateway directly with <code>--help</code> option. - -<div class="example"> -<div class="caption">Example. Output of <code>share/h2o/fastcgi-cgi --help</code></div> -<pre><code>$ share/h2o/fastcgi-cgi --help -Usage: - share/h2o/fastcgi-cgi [options] - -Options: - --listen=sockfn path to the UNIX socket. If specified, the program will - create a UNIX socket at given path replacing the existing - file (should it exist). If not, file descriptor zero (0) - will be used as the UNIX socket for accepting new - connections. - --max-workers=nnn maximum number of CGI processes (default: unlimited) - --pass-authz if set, preserves HTTP_AUTHORIZATION parameter -</code></pre> -</div> - - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/command_options.html b/debian/vendor-h2o/doc/configure/command_options.html deleted file mode 100644 index 3ece2a7..0000000 --- a/debian/vendor-h2o/doc/configure/command_options.html +++ /dev/null @@ -1,102 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Command Options - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Command Options -</h2> - - -<p> -Full list of command options can be viewed by running <code>h2o --help</code>. -Following is the output of <code>--help</code> as of version 1.2.0. -</p> - -<pre><code>Options: - -c, --conf FILE configuration file (default: h2o.conf) - -m, --mode <mode> specifies one of the following mode - - worker: invoked process handles incoming connections - (default) - - daemon: spawns a master process and exits. `error-log` - must be configured when using this mode, as all - the errors are logged to the file instead of - being emitted to STDERR - - master: invoked process becomes a master process (using - the `share/h2o/start_server` command) and spawns - a worker process for handling incoming - connections. Users may send SIGHUP to the master - process to reconfigure or upgrade the server. - - test: tests the configuration and exits - -t, --test synonym of `--mode=test` - -v, --version prints the version number - -h, --help print this help -</code></pre> - -<p> -The default path of the configuration file may differ depending on the distribution. -Please run <code>h2o --help</code> to find out the location. -</p> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/compress_directives.html b/debian/vendor-h2o/doc/configure/compress_directives.html deleted file mode 100644 index 04336e1..0000000 --- a/debian/vendor-h2o/doc/configure/compress_directives.html +++ /dev/null @@ -1,177 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Compress Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Compress Directives -</h2> - - -<p> -The compress handler performs on-the-fly compression - it compresses the contents of an HTTP response as it is being sent, if the client indicates itself to be capable of decompressing the response transparently with the use of <a href="https://tools.ietf.org/html/rfc7231#section-5.3.4"><code>Accept-Encoding</code></a> header</li>, and if the response is deemed compressible according to the following rules. -</p> -<p> -If <code>x-compress-hint</code> response header does not exist or the value is <code>auto</code>, then whether if the response is considered compressible depends on the <code>is_compressible</code> attribute assigned to the content type (see <a href="configure/file_directives.html#file.mime.addtypes"><code>file.mime.addtypes</code></a>). -If <code>x-compress-hint</code> response header exists and the value is <code>on</code>, the response is always considered to be compressible. -If the value of the response header is set to <code>off</code>, then the response never gets compressed. -</p> - -<p> -The following are the configuration directives recognized by the handler. -</p> - -<div id="compress" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/compress_directives.html#compress"><code>"compress"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Enables on-the-fly compression of HTTP response. - -</p> - -<p> -If the argument is <code>ON</code>, both <a href="https://datatracker.ietf.org/doc/draft-alakuijala-brotli/">brotli</a> and <a href="https://tools.ietf.org/html/rfc1952">gzip</a> compression are enabled. -If the argument is <code>OFF</code>, on-the-fly compression is disabled. -If the argument is a sequence, the elements are the list of compression algorithms to be enabled. -If the argument is a mapping, each key specifies the compression algorithm to be enabled, and the values specify the quality of the algorithms. -</p> -<p> -When both brotli and gzip are enabled and if the client supports both, H2O is hard-coded to prefer brotli. -</p> -<div class="example"> -<div class="caption">Example. Enabling on-the-fly compression</div> -<pre><code># enable all algorithms -compress: ON - -# enable by name -compress: [ gzip, br ] - -# enable gzip only -compress: [ gzip ] -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>compress: OFF</pre></code> -<dt>See also:</dt> -<dd><a href="configure/file_directives.html#file.send-compressed"><code>file.send-compressed</code></a>, <a href="configure/file_directives.html#file.mime.addtypes"><code>file.mime.addtypes</code></a> -</dd> -</dl> - -<div id="compress-minimum-size" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/compress_directives.html#compress-minimum-size"><code>"compress-minimum-size"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Defines the minimum size a files needs to have in order for H2O to compress the request. - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>compress-minimum-size: 100</pre></code> -</dl> - - -<div id="gzip" class="directive-head"> -<div class="directive-since">since v1.5</div> -<h3><a href="configure/compress_directives.html#gzip"><code>"gzip"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Enables on-the-fly compression of HTTP response using gzip. - -</p> - -Equivalent to <code>compress: [ gzip ]</code>. - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>gzip: OFF</pre></code> -<dt>See also:</dt> -<dd><a href="configure/compress_directives.html#compress"><code>compress</code></a> -</dd> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/dos_detection.html b/debian/vendor-h2o/doc/configure/dos_detection.html deleted file mode 100644 index e7153af..0000000 --- a/debian/vendor-h2o/doc/configure/dos_detection.html +++ /dev/null @@ -1,173 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Using DoS Detection - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Using DoS Detection -</h2> - - -<p> -Starting from version 2.1, H2O comes with a mruby script named <a href="https://github.com/h2o/h2o/blob/master/share/h2o/mruby/dos_detector.rb">dos_detector.rb</a> that implements DoS Detection feature. -The script provides a Rack handler that detects HTTP flooding attacks based on the client's IP address. -</p> - -<h3 id="basic-usage">Basic Usage</h3> - -<p> -Below example uses the mruby script to detect DoS attacks. -The default detecting strategy is simply counting requests within configured period. -If the count exceeds configured threshold, the handler returns a <code>403 Forbidden</code> response. -Otherwise, the handler returns a <code>399</code> response, and the request is <a href="configure/mruby.html#delegating-request">delegated</a> internally to the next handler. -</p> - -<div class="example"> -<div class="caption">Example. Configuring DoS Detection</div> -<pre><code>paths: - "/": - mruby.handler: | - require "dos_detector.rb" - DoSDetector.new({ - :strategy => DoSDetector::CountingStrategy.new({ - :period => 10, # default - :threshold => 100, # default - :ban_period => 300, # default - }), - }) - file.dir: /path/to/doc_root -</code></pre> -</div> - - -<p> -In the example above, the handler countup the requests within 10 seconds for each IP address, and when the count exceeds 100, -it returns a <code>403 Forbidden</code> response for the request and marks the client as "Banned" for 300 seconds. While marked as "Banned", the handler returns a <code>403 Forbidden</code> to all requests from the same IP address. -</p> - -<h3 id="configuring-details">Configuring Details</h3> - -<p> -You can pass the following parameters to <code>DoSDetector.new</code> . -<ul> -<li><code>:strategy</code> - <p>The algorithm to detect DoS attacks. You can write and pass your own strategies if needed. The default strategy is <code>DoSDetector.CountingStrategy</code> which takes the following parameters:</p> - <ul> - <li><code>:period</code> - <p>Time window in seconds to count requests. The default value is 10.</p> - </li> - <li><code>:threshold</code> - <p>Threshold count of request. The default value is 100.</p> - </li> - <li><code>:ban_period</code> - <p>Duration in seconds in which "Banned" client continues to be restricted. The default value is 300.</p> - </li> - </ul> -</li> -<li><code>:callback</code> - <p>The callback which is called by the handler with detecting result. You can define your own callback to return arbitrary response, set response headers, etc. The default callback returns <code>403 Forbidden</code> if DoS detected, otherwise delegate the request to the next handler.</p> -</li> -<li><code>:forwarded</code> - <p> - If set true, the handler uses X-HTTP-Forwarded-For header to get client's IP address if the header exists. The default value is true. - </p> -</li> -<li><code>:cache_size</code> - <p> - The capacity of the LRU cache which preserves client's IP address and associated request count. The default value is 128. - </p> -</li> -</ul> -<div class="example"> -<div class="caption">Example. Configuring Details</div> -<pre><code>paths: - "/": - mruby.handler: | - require "dos_detector.rb" - DoSDetector.new({ - :strategy => DoSDetector::CountingStrategy.new, - :forwarded => false, - :cache_size => 2048, - :callback => proc {|env, detected, ip| - if detected && ! ip.start_with?("192.168.") - [503, {}, ["Service Unavailable"]] - else - [399, {}, []] - end - } - }) - file.dir: /path/to/doc_root -</code></pre> -</div> - -</p> - -<h3 id="points-to-notice">Points to Notice</h3> -<ul> -<li> - For now, counting requests is "per-thread" and not shared between multiple threads. -</li> -</ul> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/errordoc_directives.html b/debian/vendor-h2o/doc/configure/errordoc_directives.html deleted file mode 100644 index 77e635f..0000000 --- a/debian/vendor-h2o/doc/configure/errordoc_directives.html +++ /dev/null @@ -1,133 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Errordoc Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Errordoc Directives -</h2> - - -<p> -This document describes the configuration directives of the errordoc handler. -</p> - -<div id="error-doc" class="directive-head"> -<h3><a href="configure/errordoc_directives.html#error-doc"><code>"error-doc"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Specifies the content to be sent when returning an error response (i.e. a response with 4xx or 5xx status code). - -</p> - -<p> -The argument must be a mapping containing following attributes, or if it is a sequence, every element must be a mapping with the following attributes. -<ul> -<li><code>status</code> - three-digit number indicating the status code (or sequence of that from version 2.3) -<li><code>url</code> - URL of the document to be served -</ul> -</p> -<p> -URL can either be absolute or relative. -Only <code>content-type</code>, <code>content-language</code>, <code>set-cookie</code> headers obtained from the specified URL are served to the client. -</p> -<p> -<div class="example"> -<div class="caption">Example. Set error document for 404 status</div> -<pre><code>error-doc: - status: 404 - url: /404.html -</code></pre> -</div> - -<div class="example"> -<div class="caption">Example. Set error document for 500 and 503 status</div> -<pre><code>error-doc: - - status: 500 - url: /internal-error.html - - status: 503 - url: /service-unavailable.html -</code></pre> -</div> - -<div class="example"> -<div class="caption">Example. Set error document for 50x statuses (From version 2.3)</div> -<pre><code>error-doc: - status: [500, 502, 503, 504] - url: /50x.html -</code></pre> -</div> - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/expires_directives.html b/debian/vendor-h2o/doc/configure/expires_directives.html deleted file mode 100644 index 7ca6ad6..0000000 --- a/debian/vendor-h2o/doc/configure/expires_directives.html +++ /dev/null @@ -1,109 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Expires Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Expires Directives -</h2> - - -<p> -This document describes the configuration directives of the expires handler. -</p> - -<div id="expires" class="directive-head"> -<h3><a href="configure/expires_directives.html#expires"><code>"expires"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -An optional directive for setting the <code>Cache-Control: max-age=</code> header. - -</p> - -<ul> -<li>if the argument is <code>OFF</code> the feature is not used -<li>if the value is <code><i>NUMBER</i> <i>UNIT</i></code> then the header is set -<li>the units recognized are: <code>second</code>, <code>minute</code>, <code>hour</code>, <code>day</code>, <code>month</code>, <code>year</code> -<li> the units can also be in plural forms -</ul> -<div class="example"> -<div class="caption">Example. Set <code>Cache-Control: max-age=86400</code></div> -<pre><code>expires: 1 day -</code></pre> -</div> - -<p> -You can also find an example that conditionally sets the header depending on the aspects of a request in <a href="configure/mruby.html#modifying-response">Modifying the Response section of the Mruby directives documentation</a>. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/fastcgi_directives.html b/debian/vendor-h2o/doc/configure/fastcgi_directives.html deleted file mode 100644 index a2e895a..0000000 --- a/debian/vendor-h2o/doc/configure/fastcgi_directives.html +++ /dev/null @@ -1,232 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>FastCGI Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -FastCGI Directives -</h2> - - -<p> -This document describes the configuration directives of the FastCGI handler. -</p> -<p> -The configuration directives of the FastCGI handler can be categorized into two groups. -<code>Fastcgi.connect</code> and <code>fastcgi.spawn</code> define the address (or the process) to which the requests should be sent. -Other directives customize how the connections to the FastCGI processes should be maintained. -</p> - -<div id="fastcgi.connect" class="directive-head"> -<h3><a href="configure/fastcgi_directives.html#fastcgi.connect"><code>"fastcgi.connect"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -The directive specifies the address at where the FastCGI daemon is running. -</p> - -<p> -If the argument is a mapping, following properties are recognized. -<dl> -<dt><code>host</code> -<dd>name (or IP address) of the server running the FastCGI daemon (ignored if <code>type</code> is <code>unix</code>) -<dt><code>port</code> -<dd>TCP port number or path to the unix socket -<dt><code>type</code> -<dd>either <code>tcp</code> (default) or <code>unix</code> -</dl> -</p> -<p> -If the argument is a scalar, the value is considered as a TCP port number and the host is assumed to be <code>127.0.0.1</code>. -</p> -<div class="example"> -<div class="caption">Example. Map <code>/app</code> to FastCGI daemon listening to <code>/tmp/fcgi.sock</code></div> -<pre><code>hosts: - "example.com:80": - paths: - "/app": - fastcgi.connect: - port: /tmp/fcgi.sock - type: unix -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path, extension</dd> -</dl> - -<div id="fastcgi.spawn" class="directive-head"> -<h3><a href="configure/fastcgi_directives.html#fastcgi.spawn"><code>"fastcgi.spawn"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -The directive specifies the command to start the FastCGI process manager. -</p> - -<p> -In contrast to <code>fastcgi.connect</code> that connects to a FastCGI server running externally, this directive launches a FastCGI process manager under the control of H2O, and terminates it when H2O quits. -The argument is a <code>/bin/sh -c</code> expression to be executed when H2O boots up. -The HTTP server records the process id of the expression, and sends <code>SIGTERM</code> to the id when it exits. -</p> -<div class="example"> -<div class="caption">Example. Map <code>.php</code> files to 10 worker processes of <code>/usr/local/bin/php-cgi</code></div> -<pre><code>file.custom-handler: - extension: .php - fastcgi.spawn: "PHP_FCGI_CHILDREN=10 exec /usr/local/bin/php-cgi" -</code></pre> -</div> - -<p> -As of version 1.4.0, the spawned process is run under the privileges of user specified by the <a href="configure/base_directives.html#user"><code>user</code></a> directive (in version 1.3.x, the FastCGI process was spawned under the privileges that spawned the H2O standalone server). -It is possible to specify a different user for running the FastCGI process, by providing a mapping that contains an attribute named <code>user</code> together with an attribute named <code>command</code>. -</p> -<div class="example"> -<div class="caption">Example. Running FastCGI processes under user <code>fastcgi</code></div> -<pre><code>file.custom-handler: - extension: .php - fastcgi.spawn: - command: "PHP_FCGI_CHILDREN=10 exec /usr/local/bin/php-cgi" - user: fastcgi -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path, extension</dd> -</dl> - -<div id="fastcgi.timeout.io" class="directive-head"> -<h3><a href="configure/fastcgi_directives.html#fastcgi.timeout.io"><code>"fastcgi.timeout.io"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets the I/O timeout of connections to the FastCGI process in milliseconds. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>fastcgi.timeout.io: 30000</pre></code> -</dl> - - -<div id="fastcgi.timeout.keepalive" class="directive-head"> -<h3><a href="configure/fastcgi_directives.html#fastcgi.timeout.keepalive"><code>"fastcgi.timeout.keepalive"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets the keepl-alive timeout for idle connections in milliseconds. -</p> - -<p> -FastCGI connections will not be persistent if the value is set to zero (default). -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>fastcgi.timeout.keepalive: 0</pre></code> -</dl> - -<div id="fastcgi.send-delegated-uri" class="directive-head"> -<h3><a href="configure/fastcgi_directives.html#fastcgi.send-delegated-uri"><code>"fastcgi.send-delegated-uri"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Send the modified <code>HTTP_HOST</code> and <code>REQUEST_URI</code> being rewritten in case of internal redirect. -</p> - -<p> -In H2O, it is possible to perform internal redirects (a.k.a. delegations or URL rewrites) using <a href="configure/redirect_directives.html">the <code>redirect</code> directive</a> or <a href="configure/reproxy_directives.html">by returning <code>X-Reproxy-URL</code> headers</a> from web applications. -The directive specifies whether to send the original values to the FastCGI process (default), or if the rewritten values should be sent. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>fastcgi.send-delegated-uri: OFF</pre></code> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/file_directives.html b/debian/vendor-h2o/doc/configure/file_directives.html deleted file mode 100644 index a5ec2c6..0000000 --- a/debian/vendor-h2o/doc/configure/file_directives.html +++ /dev/null @@ -1,427 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>File Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -File Directives -</h2> - - -<p> -This document describes the configuration directives of the file handler - a handler that for serving static files. -</p> -<p> -Two directives: <a href="configure/file_directives.html#file.dir"><code>file.dir</code></a> and <a href="configure/file_directives.html#file.file"><code>file.file</code></a> are used to define the mapping. -Other directives modify the behavior of the mappings defined by the two. -</p> - -<div id="file.custom-handler" class="directive-head"> -<h3><a href="configure/file_directives.html#file.custom-handler"><code>"file.custom-handler"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -The directive maps extensions to a custom handler (e.g. FastCGI). -</p> - -<p> -The directive accepts a mapping containing configuration directives that can be used at the <code>extension</code> level, together with a property named <code>extension</code> specifying a extension (starting with <code>.</code>) or a sequence of extensions to which the directives should be applied. -Only one handler must exist within the directives. -</p> -<div class="example"> -<div class="caption">Example. Mapping PHP files to FastCGI</div> -<pre><code>file.custom-handler: - extension: .php - fastcgi.connect: - port: /tmp/fcgi.sock - type: unix - -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -</dl> - -<div id="file.dir" class="directive-head"> -<h3><a href="configure/file_directives.html#file.dir"><code>"file.dir"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -The directive specifies the directory under which should be served for the corresponding path. -</p> - -<div class="example"> -<div class="caption">Example. Serving files under different paths</div> -<pre><code>paths: - "/": - file.dir: /path/to/doc-root - "/icons": - file.dir: /path/to/icons-dir -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path</dd> -<dt>See also:</dt> -<dd><a href="configure/file_directives.html#file.dirlisting"><code>file.dirlisting</code></a>, -<a href="configure/file_directives.html#file.file"><code>file.file</code></a>, -<a href="configure/file_directives.html#file.index"><code>file.index</code></a> -</dd> -</dl> - -<div id="file.dirlisting" class="directive-head"> -<h3><a href="configure/file_directives.html#file.dirlisting"><code>"file.dirlisting"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>OFF</code>, or <code>ON</code>) specifying whether or not to send the directory listing in case none of the index files exist. - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -<dt>Default:</dt> -<dd><code><pre>file.dirlisting: OFF</pre></code> -<dt>See also:</dt> -<dd><a href="configure/file_directives.html#file.dir"><code>file.dir</code></a> -</dd> -</dl> -<div id="file.etag" class="directive-head"> -<h3><a href="configure/file_directives.html#file.etag"><code>"file.etag"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>OFF</code>, or <code>ON</code>) specifying whether or not to send etags. - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -<dt>Default:</dt> -<dd><code><pre>file.etag: ON</pre></code> -</dl> - - -<div id="file.file" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/file_directives.html#file.file"><code>"file.file"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -The directive maps a path to a specific file. -</p> - -<div class="example"> -<div class="caption">Example. Mapping a path to a specific file</div> -<pre><code>paths: - /robots.txt: - file.file: /path/to/robots.txt -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path</dd> -<dt>See also:</dt> -<dd><a href="configure/file_directives.html#file.dir"><code>file.dir</code></a> -</dd> -</dl> - -<div id="file.index" class="directive-head"> -<h3><a href="configure/file_directives.html#file.index"><code>"file.index"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Specifies the names of the files that should be served when the client sends a request against the directory. -</p> - -<p> -The sequence of filenames are searched from left to right, and the first file that existed is sent to the client. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -<dt>Default:</dt> -<dd><code><pre>file.index: [ 'index.html', 'index.htm', 'index.txt' ]</pre></code> -<dt>See also:</dt> -<dd><a href="configure/file_directives.html#file.dir"><code>file.dir</code></a> -</dd> -</dl> - -<div id="file.mime.addtypes" class="directive-head"> -<h3><a href="configure/file_directives.html#file.mime.addtypes"><code>"file.mime.addtypes"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -The directive modifies the MIME mappings by adding the specified MIME type mappings. -</p> - -<div class="example"> -<div class="caption">Example. Adding MIME mappings</div> -<pre><code>file.mime.addtypes: - "application/javascript": ".js" - "image/jpeg": [ ".jpg", ".jpeg" ] -</code></pre> -</div> - -<p> -The default mappings is hard-coded in <a href="https://github.com/h2o/h2o/blob/master/lib/handler/mimemap/defaults.c.h">lib/handler/mimemap/defaults.c.h</a>. -</p> -<p> -It is also possible to set certain attributes for a MIME type. -The example below maps <code>.css</code> files to <code>text/css</code> type, setting <code>is_compressible</code> flag to <code>ON</code> and <code>priority</code> to highest. -</p> - -<div class="example"> -<div class="caption">Example. Setting MIME attributes</div> -<pre><code>file.mime.settypes: - "text/css": - extensions: [".css"] - is_compressible: yes - priority: highest -</code></pre> -</div> - - -<p> -Following attributes are recognized. -</p> - -<table> -<tr><th>Attribute<th>Possible Values<th>Description -<tr><td><code>is_compressible</code><td><code>ON</code>, <code>OFF</code><td>if content is compressible -<tr><td><code>priority</code><td><code>highest<code>, <code>normal</code><td>send priority of the content -</table> - -<p> -The <code>priority</code> attribute affects how the HTTP/2 protocol implementation handles the request. -For detail, please refer to the HTTP/2 directives listed in the <i>see also</i> section below. -By default, mime-types for CSS and JavaScript files are the only ones that are given <code>highest</code> priority. -</p> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -<dt>See also:</dt> -<dd><a href="configure/compress_directives.html#compress"><code>compress</code></a>, -<a href="configure/http2_directives.html#http2-casper"><code>http2-casper</code></a>, -<a href="configure/http2_directives.html#http2-reprioritize-blocking-assets"><code>http2-reprioritize-blocking-assets</code></a> -</dd> -</dl> - -<div id="file.mime.removetypes" class="directive-head"> -<h3><a href="configure/file_directives.html#file.mime.removetypes"><code>"file.mime.removetypes"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Removes the MIME mappings for specified extensions supplied as a sequence of extensions. -</p> - -<div class="example"> -<div class="caption">Example. Removing MIME mappings</div> -<pre><code>file.mime.removetypes: [ ".jpg", ".jpeg" ] -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -</dl> - -<div id="file.mime.setdefaulttype" class="directive-head"> -<h3><a href="configure/file_directives.html#file.mime.setdefaulttype"><code>"file.mime.setdefaulttype"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets the default MIME-type that is used when an extension does not exist in the MIME mappings -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -<dt>Default:</dt> -<dd><code><pre>file.mime.setdefaulttype: "application/octet-stream"</pre></code> -</dl> - - -<div id="file.mime.settypes" class="directive-head"> -<h3><a href="configure/file_directives.html#file.mime.settypes"><code>"file.mime.settypes"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Resets the MIME mappings to given mapping. -</p> - -<div class="example"> -<div class="caption">Example. Resetting the MIME mappings to minimum</div> -<pre><code>file.mime.settypes: - "text/html": [ ".html", ".htm" ] - "text/plain": ".txt" -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -</dl> - -<div id="file.send-compressed" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/file_directives.html#file.send-compressed"><code>"file.send-compressed"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A flag indicating how a pre-compressed file should be served. - -</p> - -<p> -If set to <code>ON</code>, the handler looks for a file with <code>.br</code> or <code>.gz</code> appended and sends the file, if the client is capable of transparently decoding a <a href="https://datatracker.ietf.org/doc/draft-alakuijala-brotli/">brotli</a> or <a href="https://tools.ietf.org/html/rfc1952">gzip</a>-encoded response. -For example, if a client requests a file named <code>index.html</code> with <code>Accept-Encoding: gzip</code> header and if <code>index.html.gz</code> exists, the <code>.gz</code> file is sent as a response together with a <code>Content-Encoding: gzip</code> response header. -</p> -<p> -If set to <code>OFF</code>, the handler always serves the file specified by the client. -</p> -<p> -Starting from version 2.2, <code>gunzip</code> is also supported. -If set, the handler acts identical to when the value was set to <code>ON</code>. -In addition, the handler will send an uncompressed response by dynamically decompressing the <code>.gz</code> file if the client and the server failed to agree on using a pre-compressed file as the response and if a non-compressed file was not found. -The option is useful when conserving disk space is important; it is possible to remove the uncompressed files in place for gzipped ones. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -<dt>Default:</dt> -<dd><code><pre>file.send-compressed: OFF</pre></code> -<dt>See also:</dt> -<dd><a href="configure/compress_directives.html#compress"><code>compress</code></a> -</dd> -</dl> - -<div id="file.send-gzip" class="directive-head"> -<h3><a href="configure/file_directives.html#file.send-gzip"><code>"file.send-gzip"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Obsoleted in 2.0. -Synonym of <a href="configure/file_directives.html#file.send-compressed"><code>file.send-compressed</code></a>. - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path</dd> -</dl> - - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/headers_directives.html b/debian/vendor-h2o/doc/configure/headers_directives.html deleted file mode 100644 index 0783310..0000000 --- a/debian/vendor-h2o/doc/configure/headers_directives.html +++ /dev/null @@ -1,204 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Headers Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Headers Directives -</h2> - - -<p> -This document describes the configuration directives of the headers handler. -</p> - -<div id="header.add" class="directive-head"> -<h3><a href="configure/headers_directives.html#header.add"><code>"header.add"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Adds a new header line to the response headers, regardless if a header with the same name already exists. -</p> - -<div class="example"> -<div class="caption">Example. Setting the <code>Set-Cookie</code> header</div> -<pre><code>header.add: "Set-Cookie: test=1"</code></pre> -</div> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -</dl> - -<div id="header.append" class="directive-head"> -<h3><a href="configure/headers_directives.html#header.append"><code>"header.append"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Adds a new header line, or appends the value to the existing header with the same name, separated by <code>,</code>. - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -</dl> - - -<div id="header.merge" class="directive-head"> -<h3><a href="configure/headers_directives.html#header.merge"><code>"header.merge"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Adds a new header line, or merges the value to the existing header of comma-separated values. - -</p> - -<p> -The following example sets the <code>must-revalidate</code> attribute of the <code>Cache-Control</code> header when and only when the attribute is not yet being set. -</p> -<div class="example"> -<div class="caption">Example. Setting the <code>must-revalidate</code> attribute</div> -<pre><code>header.merge: "Cache-Control: must-revalidate" -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -</dl> - -<div id="header.set" class="directive-head"> -<h3><a href="configure/headers_directives.html#header.set"><code>"header.set"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets a header line, removing headers with the same name if exists. -</p> - -<div class="example"> -<div class="caption">Example. Setting the <code>X-Content-Type-Options: nosniff</code> header</div> -<pre><code>header.set: "X-Content-Type-Options: nosniff" -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -</dl> - -<div id="header.setifempty" class="directive-head"> -<h3><a href="configure/headers_directives.html#header.setifempty"><code>"header.setifempty"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets a header line when and only when a header with the same name does not already exist. - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -</dl> -<div id="header.unset" class="directive-head"> -<h3><a href="configure/headers_directives.html#header.unset"><code>"header.unset"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Removes headers with given name. -</p> - -<div class="example"> -<div class="caption">Example. Removing the <code>X-Powered-By</code> header</div> -<pre><code>header.unset: "X-Powered-By" -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/http1_directives.html b/debian/vendor-h2o/doc/configure/http1_directives.html deleted file mode 100644 index f7768d5..0000000 --- a/debian/vendor-h2o/doc/configure/http1_directives.html +++ /dev/null @@ -1,112 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>HTTP/1 Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -HTTP/1 Directives -</h2> - - -<p> -This document describes the configuration directives for controlling the HTTP/1 protocol handler. -</p> - -<div id="http1-request-timeout" class="directive-head"> -<h3><a href="configure/http1_directives.html#http1-request-timeout"><code>"http1-request-timeout"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Timeout for incoming requests in seconds. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http1-request-timeout: 10</pre></code> -</dl> -<div id="http1-upgrade-to-http2" class="directive-head"> -<h3><a href="configure/http1_directives.html#http1-upgrade-to-http2"><code>"http1-upgrade-to-http2"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Boolean flag (<code>ON</code> or <code>OFF</code>) indicating whether or not to allow upgrade to HTTP/2. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http1-upgrade-to-http2: ON</pre></code> -</dl> - - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/http2_directives.html b/debian/vendor-h2o/doc/configure/http2_directives.html deleted file mode 100644 index 2d92aaf..0000000 --- a/debian/vendor-h2o/doc/configure/http2_directives.html +++ /dev/null @@ -1,510 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>HTTP/2 Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -HTTP/2 Directives -</h2> - - -<p> -H2O provides one of the world's most sophisticated HTTP/2 protocol implementation, including following features. -</p> - -<h3 id="prioritization">Prioritization</h3> - -<p> -H2O is one of the few servers that fully implement prioritization of HTTP responses conformant to what is defined in the <a href="https://tools.ietf.org/html/rfc7540">HTTP/2 specification</a>. -The server implements a O(1) scheduler that determines which HTTP response should be sent to the client, per every 16KB chunk. -</p> -<p> -Unfortunately, some web browsers fail to specify response priorities that lead to best end-user experience. -H2O is capable of detecting such web browsers, and if it does, uses server-driven prioritization; i.e. send responses with certain MIME-types before others. -</p> -<p> -It is possible to tune or turn off server-driven prioritization using directives: <a href="configure/file_directives.html#file.mime.addtypes"><code>file.mime.addtypes</code></a>, <a href="configure/http2_directives.html#http2-reprioritize-blocking-assets"><code>http2-reprioritize-blocking-assets</code></a>. -</p> -<p> -See also: -<ul> -<li><a href="benchmarks.html#download-timings">Download Timings Benchmark</a> -<li><a href="http://blog.kazuhooku.com/2015/06/http2-and-h2o-improves-user-experience.html">HTTP/2 (and H2O) improves user experience over HTTP/1.1 or SPDY</a> -</ul> -</p> - -<h3 id="server-push">Server push</h3> - -<p> -H2O recognizes <code>link</code> headers with <a href="https://w3c.github.io/preload/">preload</a> keyword sent by a backend application server (reverse proxy or FastCGI) or an mruby handler, and pushes the designated resource to a client. -</p> -<div class="example"> -<div class="caption">Example. A link response header triggering HTTP/2 push</div> -<pre><code>link: </assets/jquery.js>; rel=preload; as=script -</code></pre> -</div> - - -<p>When the HTTP/2 driver of H2O recognizes a <code>link</code> response header with <code>rel=preload</code> attribute set, and if all of the following conditions are met, the specified resource is pushed to the client. -</p> -<ul> -<li>configuration directive <a href="configure/http2_directives.html#http2-push-preload">http2-push-preload</a> is not set to <code>OFF</code></li> -<li>the <code>link</code> header does not have the <code>nopush</code> attribute set</li> -<li>the <code>link</code> header is <i>not</i> part of a pushed response</li> -<li>the client does not disable HTTP/2 push</li> -<li>number of the pushed responses in-flight is below the negotiated threshold</li> -<li>authority of the resource specified is equivalent to the request that tried to trigger the push</li> -<li>(for handlers that return the status code synchronously) the status code of the response to be pushed does not indicate an error (i.e. 4xx or 5xx)</li> -</ul> -<p> -The server also provides a mechanism to track the clients' cache state via cookies, and to push the resources specified with the <code>link</code> header only when it does not exist within the clients' cache. For details, please refer to the documentation of <a href="configure/http2_directives.html#http2-casper"><code>http2-casper</code></a> configuration directive. -</p> -<p> -When a resource is pushed, the priority is determined using the <a href="configure/file_directives.html#file.mime.addtypes"><code>priority</code> attribute</a> of the MIME-type configuration. If the priority is set to <code>highest</code> then the resource will be sent to the client before anything else; otherwise the resource will be sent to client after the main content, as per defined by the HTTP/2 specification. -</p> -<p> -HTTP/1.1 allows a server to send an informational response (see <a href="https://tools.ietf.org/html/rfc7231#section-6.2" target="_blank">RFC 7230 section 6.2</a>) before sending the final response. -Starting from version 2.1, web applications can take advantage of the informational response to initiate HTTP/2 pushes before starting to process the request. -The following example shows how such responses would look like. -</p> -<div class="example"> -<div class="caption">Example. 100 response with link headers</div> -<pre><code>HTTP/1.1 100 Continue -Link: </assets/style.css>; rel=preload; as=style -Link: </assets/jquery.js>; rel=preload; as=script - -HTTP/1.1 200 OK -Content-Type: text/html; charset=utf-8 - -<!doctype html> -<html> -<head> -<link rel="stylesheet" type="text/css" href="/assets/style.css"> -<script type="text/javascript" src="/assets/jquery.js"></scrrpt> -... -</code></pre> -</div> - -<p> -Pushed responses will have <code>x-http2-push: pushed</code> header set; by looking for the header, it is possible to determine if a resource has been pushed. -It is also possible to log the value in the <a href="configure/access_log_directives.html#access-log">access log</a> by specifying <code>%{x-http2-push}o</code>, push responses but cancelled by CASPER will have the value of the header logged as <code>cancelled</code>. -</p> -<p> -See also: -<ul> -<li><a href="http://blog.kazuhooku.com/2015/12/optimizing-performance-of-multi-tiered.html">Optimizing performance of multi-tier web applications using HTTP/2 push</a> -</ul> -</p> - -<h3 id="latency-optimization">Latency Optimization</h3> - -<p> -When using HTTP/2, a client often issues high-priority requests (e.g. requests for CSS and JavaScript files that block the rendering) while a lower-priority response (e.g. HTML) is in flight. -In such case, it is desirable for a server to switch to sending the response of the high-priority requests as soon as it observes the requests. -</p> -<p> -In order to do so, send buffer of the TCP/IP stack should be kept empty except for the packets in-flight, and size of the TLS records must be small enough to avoid head-of-line blocking. -The downside is that obeying the requirement increases the interaction between the server process and kernel, which result in consumption of more CPU cycles and slightly increased latency. -</p> -<p> -Starting from version 2.1, H2O provides directives that lets the users tune how the TCP/IP stack is used depending on the observed RTT, CWND, and the additional latency imposed by the interaction between the server and the OS. -</p> -<p> -For TCP/IP connections with greater RTT and smaller CWND than the configured threshold, the server will try to keep the size of HTTP/2 frames unsent as small as possible so that it can switch to sending a higher-priority response. -Benchmarks suggest that users can expect in average 1 RTT reduction when this optimization is enabled. -For connections that do not meet the criteria, the server will utilize the TCP/IP stack in ordinary ways. -</p> -<p> -The default values of the thresholds have been chosen that the optimization will come into action for mobile and long-distance networks but not when a proxy exists on the network. -</p> -<p> -The optimization is supported only on Linux and OS X. The two are the operating systems that provide access to <code>TCP_INFO</code> and an interface to adjust the size of the unsent buffer (<code>TCP_NOTSENT_LOWAT</code>). -</p> -<p> -Please refer to the documentation of the directives below to configure the optimization: -<ul> -<li><a href="configure/http2_directives.html#http2-latency-optimization-min-rtt"><code>http2-latency-optimization-min-rtt</code></a></li> -<li><a href="configure/http2_directives.html#http2-latency-optimization-max-additional-delay"><code>http2-latency-optimization-max-additional-delay</code></a></li> -<li><a href="configure/http2_directives.html#http2-latency-optimization-max-cwnd"><code>http2-latency-optimization-max-cwnd</code></a></li> -</ul> -</p> -<p> -See also: -<ul> -<li><a href="http://www.slideshare.net/kazuho/reorganizing-website-architecture-for-http2-and-beyond">Reorganizing Website Architecture for HTTP/2 and Beyond</a> pp.14-21</li> -</ul> -</p> - -<p> -The following describes the configuration directives for controlling the HTTP/2 protocol handler. -</p> - -<div id="http2-casper" class="directive-head"> -<h3><a href="configure/http2_directives.html#http2-casper"><code>"http2-casper"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Configures CASPer (cache-aware server-push). - -</p> - -<p> -When enabled, H2O maintains a fingerprint of the web browser cache, and cancels server-push suggested by the handlers if the client is known to be in possession of the content. -The fingerprint is stored in a cookie named <code>h2o_casper</code> using <a href="https://www.imperialviolet.org/2011/04/29/filters.html">Golomb-compressed sets</a> (a compressed encoding of <a href="https://en.wikipedia.org/wiki/Bloom_filter">Bloom filter</a>). -</p> -<p> -If the value is <code>OFF</code>, the feature is disabled. -Push requests (made by the handlers through the use of <code>Link: rel=preload</code> header) are processed regardless of whether if client already has the responses in its cache. -If the value is <code>ON</code>, the feature is enabled with the defaults value specified below. -If the value is mapping, the feature is enabled, recognizing the following attributes. -<dl> -<dt>capacity-bits: -<dd>number of bits used for the fingerprinting. -Roughly speaking, the number of bits should be <code>log2(1/P * number-of-assets-to-track)</code> where P being the probability of false positives. -Default is <code>13</code>, enough for tracking about 100 asset files with 1/100 chance of false positives (i.e. <code>log2(100 * 100) =~ 13</code>). -<dt>tracking-types: -<dd>specifies the types of the content tracked by casper. -If omitted or set to <code>blocking-assets</code>, maintains fingerprint (and cancels server push) for resources with mime-type of <a href="configure/file_directives.html#file.mime.addtypes"><code>highest</code></a> priority. -If set to <code>all</code>, tracks all responses. -</dl> -</p> -It should be noted that the size of the cookie will be <code>log2(P) * number-of-assets-being-tracked</code> bits multiplied by the overhead of Base 64 encoding (<code>4/3</code>). -Therefore with current cookie-based implementation, it is necessary in many cases to restrict the resources being tracked to those have significant effect to user-perceived response time. -</p> - -<div class="example"> -<div class="caption">Example. Enabling CASPer</div> -<pre><code>http2-casper: ON - -# `ON` is equivalent to: -# http2-casper: -# capacity-bits: 13 -# tracking-types: blocking-assets -</code></pre> -</div> - - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host</dd> -<dt>Default:</dt> -<dd><code><pre>http2-casper: OFF</pre></code> -<dt>See also:</dt> -<dd><a href="configure/file_directives.html#file.mime.addtypes"><code>file.mime.addtypes</code></a>, -<a href="https://github.com/h2o/h2o/issues/421">issue #421</a> -</dd> -</dl> - -<div id="http2-debug-state" class="directive-head"> -<h3><a href="configure/http2_directives.html#http2-debug-state"><code>"http2-debug-state"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A directive to turn on the <a href="https://tools.ietf.org/html/draft-benfield-http2-debug-state-01">HTTP/2 Implementation Debug State</a>. - -</p> - - -<p> -This experimental feature serves a JSON document at the fixed path <code>/.well-known/h2/state</code>, which describes an internal HTTP/2 state of the H2O server. -To know the details about the response fields, please see <a href="https://tools.ietf.org/html/draft-benfield-http2-debug-state-01">the spec</a>. -This feature is only for developing and debugging use, so it's highly recommended that you disable this setting in the production environment. -</p> - -<p> -The value of this directive specifies the property set contained in the response. Available values are <code>minimum</code> or <code>hpack</code>. -If <code>hpack</code> is specified, the response will contain the internal hpack state of the same connection. -If <code>minimum</code> is specified, the response doesn't contain the internal hpack state. -</p> - -<p> -In some circumstances, there may be a risk of information leakage on providing an internal hpack state. For example, the case that some proxies exist between the client and the server, and they share the connections among the clients. -Therefore, you should specify <code>hpack</code> only when the server runs in the environments you can completely control. -</p> - -<p> -This feature is considered experimental yet. -For now, the implementation conforms to the version draft-01 of the specification. -</p> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>host</dd> -<dt>See also:</dt> -<dd><a href="https://tools.ietf.org/html/draft-benfield-http2-debug-state-01">HTTP/2 Implementation Debug State (draft-01)</a> -</dd> -</dl> - -<div id="http2-idle-timeout" class="directive-head"> -<h3><a href="configure/http2_directives.html#http2-idle-timeout"><code>"http2-idle-timeout"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Timeout for idle connections in seconds. - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http2-idle-timeout: 10</pre></code> -</dl> -<div id="http2-max-concurrent-requests-per-connection" class="directive-head"> -<h3><a href="configure/http2_directives.html#http2-max-concurrent-requests-per-connection"><code>"http2-max-concurrent-requests-per-connection"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Maximum number of requests to be handled concurrently within a single HTTP/2 connection. - -</p> - -<p> -The value cannot exceed 256. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http2-max-concurrent-requests-per-connection: 100</pre></code> -</dl> - -<div id="http2-latency-optimization-min-rtt" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/http2_directives.html#http2-latency-optimization-min-rtt"><code>"http2-latency-optimization-min-rtt"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Minimum RTT (in milliseconds) to enable <a href="configure/http2_directives.html#latency-optimization">latency optimization</a>. - -</p> - -<p> -Latency optimization is disabled for TCP connections with smaller RTT (round-trip time) than the specified value. -Otherwise, whether if the optimization is used depends on other parameters. -</p> -<p> -Setting this value to 4294967295 (i.e. <code>UINT_MAX</code>) effectively disables the optimization. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http2-latency-optimization-min-rtt: 50</pre></code> -</dl> - -<div id="http2-latency-optimization-max-additional-delay" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/http2_directives.html#http2-latency-optimization-max-additional-delay"><code>"http2-latency-optimization-max-additional-delay"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Maximum additional delay (as the ratio to RTT) permitted to get <a href="configure/http2_directives.html#latency-optimization">latency optimization</a> activated. - -</p> - -<p> -Latency optimization is disabled if the additional delay imposed by the interaction between the OS and the TCP/IP stack is estimated to be greater than the given threshold. -Otherwise, whether if the optimization is used depends on other parameters. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http2-latency-optimization-max-additional-delay: 0.1</pre></code> -</dl> - -<div id="http2-latency-optimization-max-cwnd" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/http2_directives.html#http2-latency-optimization-max-cwnd"><code>"http2-latency-optimization-max-cwnd"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Maximum size (in octets) of CWND to get <a href="configure/http2_directives.html#latency-optimization">latency optimization</a> activated. - -</p> - -<p> -CWND is a per-TCP-connection variable that represents the number of bytes that can be sent within 1 RTT. -</p> -<p> -The server will not use or stop using latency optimization mode if CWND becomes greater than the configured value. -In such case, average size of HTTP/2 frames buffered unsent will be slightly above the <a href="https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt" target="_blank"><code>tcp_notsent_lowat</code></a> sysctl value. -</p> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http2-latency-optimization-max-cwnd: 65535</pre></code> -</dl> - -<div id="http2-push-preload" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/http2_directives.html#http2-push-preload"><code>"http2-push-preload"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) indicating whether if the server should push resources when observing a <code>link: rel=preload</code> header. - -</p> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host</dd> -<dt>Default:</dt> -<dd><code><pre>http2-push-preload: ON</pre></code> -</dl> - -<div id="http2-reprioritize-blocking-assets" class="directive-head"> -<h3><a href="configure/http2_directives.html#http2-reprioritize-blocking-assets"><code>"http2-reprioritize-blocking-assets"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) indicating if the server should send contents with <code>highest</code> priority before anything else. - -</p> - -<p> -To maximize the user-perceived responsiveness of a web page, it is essential for the web server to send blocking assets (i.e. CSS and JavaScript files in <code><HEAD></code>) before any other files such as images. -HTTP/2 provides a way for web browsers to specify such priorities to the web server. -However, as of Sep. 2015, no major web browsers except Mozilla Firefox take advantage of the feature. -</p> -<p> -This option, when enabled, works as a workaround for such web browsers, thereby improving experience of users using the web browsers. -</p> -<p> -Technically speaking, it does the following: -<ul> -<li>if the client uses dependency-based prioritization, do not reprioritize -<li>if the client does not use dependency-based prioritization, send the contents of which their types are given <a href="configure/file_directives.html#file.mime.addtypes"><code>highest</code></a> priority before any other responses -</ul> -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http2-reprioritize-blocking-assets: ON</pre></code> -<dt>See also:</dt> -<dd><a href="configure/file_directives.html#file.mime.addtypes"><code>file.mime.addtypes</code></a>, -<a href="http://blog.kazuhooku.com/2015/06/http2-and-h2o-improves-user-experience.html">HTTP/2 (and H2O) improves user experience over HTTP/1.1 or SPDY</a> -</dd> -</dl> - -<div id="http2-graceful-shutdown-timeout" class="directive-head"> -<h3><a href="configure/http2_directives.html#http2-graceful-shutdown-timeout"><code>"http2-graceful-shutdown-timeout"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A timeout in seconds. How long to wait before closing the connection on graceful shutdown. Setting the timeout to <code>0</code> deactivates the feature: H2O will wait for the peer to close the connections. - -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>http2-graceful-shutdown-timeout: 0</pre></code> -</dl> - - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/mruby.html b/debian/vendor-h2o/doc/configure/mruby.html deleted file mode 100644 index d424351..0000000 --- a/debian/vendor-h2o/doc/configure/mruby.html +++ /dev/null @@ -1,281 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Using Mruby - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Using Mruby -</h2> - - -<p> -<a href="https://github.com/mruby/mruby">mruby</a> is a lightweight implementation of the Ruby programming language. -With H2O, users can implement their own request handling logic using mruby, either to generate responses or to fix-up the request / response. -</p> - -<h3 id="programming-interface">Rack-based Programming Interface</h3> - -<p> -The interface between the mruby program and the H2O server is based on <a href="http://www.rubydoc.info/github/rack/rack/master/file/SPEC">Rack interface specification</a>. -Below is a simple configuration that returns <i>hello world</i>. -</p> - -<div class="example"> -<div class="caption">Example. Hello-world in mruby</div> -<pre><code>paths: - "/": - mruby.handler: | - Proc.new do |env| - [200, {'content-type' => 'text/plain'}, ["Hello world\n"]] - end -</code></pre> -</div> - - -<p> -It should be noted that as of H2O version 1.7.0, there are limitations when compared to ordinary web application server with support for Rack such as Unicorn: -<ul> -<li>no libraries provided as part of Rack is available (only the interface is compatible) -</ul> -</p> - -<p> -In addition to the Rack interface specification, H2O recognizes status code <code>399</code> which can be used to delegate request to the next handler. -The feature can be used to implement access control and response header modifiers. -</p> - -<h3 id="access-control">Access Control</h3> - -<p> -By using the <code>399</code> status code, it is possible to implement access control using mruby. -The example below restricts access to requests from <code>192.168.</code> private address. -</p> - -<div class="example"> -<div class="caption">Example. Restricting access to 192.168.</div> -<pre><code>paths: - "/": - mruby.handler: | - lambda do |env| - if /\A192\.168\./.match(env["REMOTE_ADDR"]) - return [399, {}, []] - end - [403, {'content-type' => 'text/plain'}, ["access forbidden\n"]] - end -</code></pre> -</div> - - -<p> -Support for <a href="configure/basic_auth.html">Basic Authentication</a> is also provided by an mruby script. -</p> - -<h3 id="delegating-request">Delegating the Request</h3> - -<p> -When enabled using the <a href="configure/reproxy_directives.html#reproxy"><code>reproxy</code></a> directive, it is possible to delegate the request from the mruby handler to any other handler. -</p> -<p> -<div class="example"> -<div class="caption">Example. Rewriting URL with delegation</div> -<pre><code>paths: - "/": - mruby.handler: | - lambda do |env| - if /\/user\/([^\/]+)/.match(env["PATH_INFO"]) - return [307, {"x-reproxy-url" => "/user.php?user=#{$1}"}, []] - end - return [399, {}, []] - end -</code></pre> -</div> - - -<h3 id="modifying-response">Modifying the Response</h3> - -<p> -When the mruby handler returns status code <code>399</code>, H2O delegates the request to the next handler while preserving the headers emitted by the handler. -The feature can be used to add extra headers to the response. -</p> -<p> -For example, the following example sets <code>cache-control</code> header for requests against <code>.css</code> and <code>.js</code> files. -</p> - -<div class="example"> -<div class="caption">Example. Setting cache-control header for certain types of files</div> -<pre><code>paths: - "/": - mruby.handler: | - Proc.new do |env| - headers = {} - if /\.(css|js)\z/.match(env["PATH_INFO"]) - headers["cache-control"] = "max-age=86400" - end - [399, headers, []] - end - file.dir: /path/to/doc-root -</code></pre> -</div> - - -<p> -Or in the example below, the handler triggers <a href="configure/http2_directives.html#server-push">HTTP/2 server push</a> with the use of <code>Link: rel=preload</code> headers, and then requests a FastCGI application to process the request. -</p> - -<div class="example"> -<div class="caption">Example. Pushing asset files</div> -<pre><code>paths: - "/": - mruby.handler: | - Proc.new do |env| - push_paths = [] - # push css and js when request is to dir root or HTML - if /(\/|\.html)\z/.match(env["PATH_INFO"]) - push_paths << ["/css/style.css", "style"] - push_paths << ["/js/app.js", "script"] - end - [399, push_paths.empty? ? {} : {"link" => push_paths.map{|p| "<#{p[0]}>; rel=preload; as=#{p[1]}"}.join("\n")}, []] - end - fastcgi.connect: ... -</code></pre> -</div> - - -<h3 id="http-client">Using the HTTP Client</h3> - -<p> -Starting from version 1.7, a HTTP client API is provided. -HTTP requests issued through the API will be handled asynchronously; the client does not block the event loop of the HTTP server. -</p> - -<div class="example"> -<div class="caption">Example. Mruby handler returning the response of http://example.com</div> -<pre><code>paths: - "/": - mruby.handler: | - Proc.new do |env| - req = http_request("http://example.com") - status, headers, body = req.join - [status, headers, body] - end -</code></pre> -</div> - - -<p> -<code>http_request</code> is the method that issues a HTTP request. -</p> -<p> -The method takes two arguments. -First argument is the target URI. -Second argument is an optional hash; <code>method</code> (defaults to <code>GET</code>), <code>header</code>, <code>body</code> attributes are recognized. -</p> -<p> -The method returns a promise object. -When <code>#join</code> method of the promise is invoked, a three-argument array containing the status code, response headers, and the body is returned. -The response body is also a promise. -Applications can choose from three ways when dealing with the body: a) call <code>#each</code> method to receive the contents, b) call <code>#join</code> to retrieve the body as a string, c) return the object as the response body of the mruby handler. -</p> -<p> -The header and the body object passed to <code>http_request</code> should conform to the requirements laid out by the Rack specification for request header and request body. -The response header and the response body object returned by the <code>#join</code> method of the promise returned by <code>http_request</code> conforms to the requirements of the Rack specification. -</p> -<p> -Since the API provides an asynchronous HTTP client, it is possible to effectively issue multiple HTTP requests concurrently and merge them into a single response. -</p> -<p> -When HTTPS is used, servers are verified using the properties of <a href="configure/proxy_directives.html#proxy.ssl.cafile"><code>proxy.ssl.cafile</code></a> and <a href="configure/proxy_directives.html#proxy.ssl.verify-peer"><code>proxy.ssl.verify-peer</code></a> specified at the global level. -</p> - -<h3 id="logging-arbitrary-variable">Logging Arbitrary Variable</h3> - -<p> -In version 2.3, it is possible from mruby to set and log an arbitrary-named variable that is associated to a HTTP request. -A HTTP response header that starts with <code>x-fallthru-set-</code> is handled specially by the H2O server. Instead of sending the header downstream, the server accepts the value as a request environment variable, taking the suffix of the header name as the name of the variable. -</p> -<p> -This example shows how to read request data, parse json and then log data from mruby. -</p> - -<div class="example"> -<div class="caption">Example. Logging the content of a POST request via request environment variable</div> -<pre><code>paths: - "/": - mruby.handler: | - Proc.new do |env| - input = env["rack.input"] ? env["rack.input"].read : '{"default": "true"}' - parsed_json = JSON.parse(input) - parsed_json["time"] = Time.now.to_i - logdata = parsed_json.to_s - [204, {"x-fallthru-set-POSTDATA" => logdata}, []] - end - access-log: - path: /path/to/access-log.json - escape: json - format: '{"POST": %{POSTDATA}e}' -</code></pre> -</div> - - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/mruby_directives.html b/debian/vendor-h2o/doc/configure/mruby_directives.html deleted file mode 100644 index 2a188a5..0000000 --- a/debian/vendor-h2o/doc/configure/mruby_directives.html +++ /dev/null @@ -1,144 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Mruby Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Mruby Directives -</h2> - - -<p> -The following are the configuration directives of the mruby handler. -Please refer to <a href="configure/mruby.html">Using mruby</a> to find out how to write handlers using mruby. -</p> - -<div id="mruby.handler" class="directive-head"> -<h3><a href="configure/mruby_directives.html#mruby.handler"><code>"mruby.handler"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Upon start-up evaluates given mruby expression, and uses the returned mruby object to handle the incoming requests. - -</p> - - -<div class="example"> -<div class="caption">Example. Hello-world in mruby</div> -<pre><code>mruby.handler: | - Proc.new do |env| - [200, {'content-type' => 'text/plain'}, ["Hello world\n"]] - end -</code></pre> -</div> - - -<p> -Note that the provided expression is evaluated more than once (typically for every thread that accepts incoming connections). -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path</dd> -<dt>See also:</dt> -<dd><a href="configure/mruby_directives.html#mruby.handler-file"><code>mruby.handler-file</code></a> -</dd> -</dl> - -<div id="mruby.handler-file" class="directive-head"> -<h3><a href="configure/mruby_directives.html#mruby.handler-file"><code>"mruby.handler-file"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Upon start-up evaluates given mruby file, and uses the returned mruby object to handle the incoming requests. - -</p> - - -<div class="example"> -<div class="caption">Example. Hello-world in mruby</div> -<pre><code>mruby.handler-file: /path/to/my-mruby-handler.rb -</code></pre> -</div> - - -<p> -Note that the provided expression is evaluated more than once (typically for every thread that accepts incoming connections). -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path</dd> -<dt>See also:</dt> -<dd><a href="configure/mruby_directives.html#mruby.handler"><code>mruby.handler</code></a> -</dd> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/proxy_directives.html b/debian/vendor-h2o/doc/configure/proxy_directives.html deleted file mode 100644 index 6b8bb7e..0000000 --- a/debian/vendor-h2o/doc/configure/proxy_directives.html +++ /dev/null @@ -1,535 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Proxy Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Proxy Directives -</h2> - - -<p> -Proxy module is the reverse proxy implementation for H2O - it implements a HTTP client that forwards a HTTP request to an upstream server. -</p> -<p> -When forwarding the requests, the module sets following request headers: -<ul> -<li><a href="https://tools.ietf.org/html/rfc7230#section-5.7.1">via</a></li> -<li><a href="http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/x-forwarded-headers.html#x-forwarded-for">x-forwarded-for</a></li> -<li><a href="http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/x-forwarded-headers.html#x-forwarded-proto">x-forwarded-proto</a></li> -</ul> -</p> -<p> -The HTTP client only supports HTTP/1. -Support for HTTPS has been introduced in version 2.0. -</p> -<p> -Following sections describe the configuration directives defined for the module. -</p> - -<div id="proxy.reverse.url" class="directive-head"> -<h3><a href="configure/proxy_directives.html#proxy.reverse.url"><code>"proxy.reverse.url"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Forwards the requests to the specified URL, and proxies the response. -</p> - -<div class="example"> -<div class="caption">Example. Forwarding the requests to application server running on <code>127.0.0.1:8080</code></div> -<pre><code>proxy.reverse.url: "http://127.0.0.1:8080/" -</code></pre> -</div> - -<p> -If you want load balancing multiple backends, replace 127.0.0.1 with hostname which returns IP addresses via DNS or /etc/hosts. -</p> -<p> -In addition to TCP/IP over IPv4 and IPv6, the proxy handler can also connect to an HTTP server listening to a Unix socket. -Path to the unix socket should be surrounded by square brackets, and prefixed with <code>unix:</code> (e.g. <code>http://[unix:/path/to/socket]/path</code>). -</p> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path</dd> -</dl> - -<div id="proxy.preserve-host" class="directive-head"> -<h3><a href="configure/proxy_directives.html#proxy.preserve-host"><code>"proxy.preserve-host"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) designating whether or not to pass <code>Host</code> header from incoming request to upstream. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.preserve-host: OFF</pre></code> -</dl> - - -<div id="proxy.preserve-x-forwarded-proto" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/proxy_directives.html#proxy.preserve-x-forwarded-proto"><code>"proxy.preserve-x-forwarded-proto"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag(<code>ON</code> or <code>OFF</code>) indicating if the server preserve the received <code>x-forwarded-proto</code> request header. -</p> - -<p> -By default, when transmitting a HTTP request to an upstream HTTP server, H2O removes the received <code>x-forwarded-proto</code> request header and sends its own, as a precaution measure to prevent an attacker connecting through HTTP to lie that they are connected via HTTPS. -However in case H2O is run behind a trusted HTTPS proxy, such protection might not be desirable, and this configuration directive can be used to modify the behaviour. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.preserve-x-forwarded-proto: OFF</pre></code> -</dl> - -<div id="proxy.proxy-protocol" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/proxy_directives.html#proxy.proxy-protocol"><code>"proxy.proxy-protocol"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) indicating if <a href="http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt" target="_blank">PROXY protocol</a> should be used when connecting to the application server. -</p> - -<p> -When using the PROXY protocol, connections to the application server cannot be persistent (i.e. <a href="configure/proxy_directives.html#proxy.timeout.keepalive"><code>proxy.timeout.keepalive</code></a> must be set to zero). -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.proxy-protocol: OFF</pre></code> -<dt>See also:</dt> -<dd><a href="configure/proxy_directives.html#proxy.timeout.keepalive"><code>proxy.timeout.keepalive</code></a> -</dd> -</dl> - -<div id="proxy.emit-x-forwarded-headers" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/proxy_directives.html#proxy.emit-x-forwarded-headers"><code>"proxy.emit-x-forwarded-headers"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag(<code>ON</code> or <code>OFF</code>) indicating if the server will append or add the <code>x-forwarded-proto</code> and <code>x-forwarded-for</code> request headers. -</p> - -<p> -By default, when forwarding an HTTP request H2O sends its own <code>x-forwarded-proto</code> and <code>x-forwarded-for</code> request headers (or might append its value in the <code>x-forwarded-proto</code> case, see <code>proxy.preserve-x-forwarded-proto</code>). This might not be always desirable. Please keep in mind security implications when setting this of <code>OFF</code>, since it might allow an attacker to spoof the originator or the protocol of a request. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.emit-x-forwarded-headers: ON</pre></code> -<dt>See also:</dt> -<dd><a href="configure/proxy_directives.html#proxy.emit-via-header"><code>proxy.emit-via-header</code></a> -</dd> -</dl> - -<div id="proxy.emit-via-header" class="directive-head"> -<div class="directive-since">since v2.2</div> -<h3><a href="configure/proxy_directives.html#proxy.emit-via-header"><code>"proxy.emit-via-header"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) indicating if the server adds or appends an entry to the <code>via</code> request header. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.emit-via-header: ON</pre></code> -<dt>See also:</dt> -<dd><a href="configure/proxy_directives.html#proxy.emit-x-forwarded-headers"><code>proxy.emit-x-forwarded-headers</code></a> -</dd> -</dl> - - -<div id="proxy.header.add" class="directive-head"> -<div class="directive-since">since v2.2</div> -<h3><a href="configure/proxy_directives.html#proxy.header.add"><code>"proxy.header.add"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Modifies the request headers sent to the application server. -</p> - -<p> -The behavior is identical to <a href="configure/headers_directives.html#header.add"><code>header.add</code></a> except for the fact that it affects the request sent to the application server. -Please refer to the documentation of the <a href="configure/headers_directives.html">headers handler</a> to see how the directives can be used to mangle the headers. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extensions</dd> -</dl> -<div id="proxy.header.append" class="directive-head"> -<div class="directive-since">since v2.2</div> -<h3><a href="configure/proxy_directives.html#proxy.header.append"><code>"proxy.header.append"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Modifies the request headers sent to the application server. -</p> - -<p> -The behavior is identical to <a href="configure/headers_directives.html#header.append"><code>header.append</code></a> except for the fact that it affects the request sent to the application server. -Please refer to the documentation of the <a href="configure/headers_directives.html">headers handler</a> to see how the directives can be used to mangle the headers. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extensions</dd> -</dl> -<div id="proxy.header.merge" class="directive-head"> -<div class="directive-since">since v2.2</div> -<h3><a href="configure/proxy_directives.html#proxy.header.merge"><code>"proxy.header.merge"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Modifies the request headers sent to the application server. -</p> - -<p> -The behavior is identical to <a href="configure/headers_directives.html#header.merge"><code>header.merge</code></a> except for the fact that it affects the request sent to the application server. -Please refer to the documentation of the <a href="configure/headers_directives.html">headers handler</a> to see how the directives can be used to mangle the headers. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extensions</dd> -</dl> -<div id="proxy.header.set" class="directive-head"> -<div class="directive-since">since v2.2</div> -<h3><a href="configure/proxy_directives.html#proxy.header.set"><code>"proxy.header.set"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Modifies the request headers sent to the application server. -</p> - -<p> -The behavior is identical to <a href="configure/headers_directives.html#header.set"><code>header.set</code></a> except for the fact that it affects the request sent to the application server. -Please refer to the documentation of the <a href="configure/headers_directives.html">headers handler</a> to see how the directives can be used to mangle the headers. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extensions</dd> -</dl> -<div id="proxy.header.setifempty" class="directive-head"> -<div class="directive-since">since v2.2</div> -<h3><a href="configure/proxy_directives.html#proxy.header.setifempty"><code>"proxy.header.setifempty"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Modifies the request headers sent to the application server. -</p> - -<p> -The behavior is identical to <a href="configure/headers_directives.html#header.setifempty"><code>header.setifempty</code></a> except for the fact that it affects the request sent to the application server. -Please refer to the documentation of the <a href="configure/headers_directives.html">headers handler</a> to see how the directives can be used to mangle the headers. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extensions</dd> -</dl> -<div id="proxy.header.unset" class="directive-head"> -<div class="directive-since">since v2.2</div> -<h3><a href="configure/proxy_directives.html#proxy.header.unset"><code>"proxy.header.unset"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Modifies the request headers sent to the application server. -</p> - -<p> -The behavior is identical to <a href="configure/headers_directives.html#header.unset"><code>header.unset</code></a> except for the fact that it affects the request sent to the application server. -Please refer to the documentation of the <a href="configure/headers_directives.html">headers handler</a> to see how the directives can be used to mangle the headers. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extensions</dd> -</dl> - - -<div id="proxy.ssl.cafile" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/proxy_directives.html#proxy.ssl.cafile"><code>"proxy.ssl.cafile"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Specifies the file storing the list of trusted root certificates. -</p> - -<p> -By default, H2O uses <code>share/h2o/ca-bundle.crt</code>. The file contains a set of trusted root certificates maintained by Mozilla, downloaded and converted using <a href="https://curl.haxx.se/docs/mk-ca-bundle.html">mk-ca-bundle.pl</a>. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>See also:</dt> -<dd><a href="configure/proxy_directives.html#proxy.ssl.verify-peer"><code>proxy.ssl.verify-peer</code></a> -</dd> -</dl> - -<div id="proxy.ssl.session-cache" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/proxy_directives.html#proxy.ssl.session-cache"><code>"proxy.ssl.session-cache"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Specifies whether if and how a session cache should be used for TLS connections to the application server. -</p> - -<p> -Since version 2.1, result of the TLS handshakes to the application server is memoized and later used to resume the connection, unless set to <code>OFF</code> using this directive. -If the value is a mapping, then the following two attributes must be specified: -<dl> -<dt>lifetime:</dt> -<dd>validity of session cache entries in seconds</dd> -<dt>capacity:</dt> -<dd>maxmum number of entries to be kept in the session cache</dd> -</dl> -If set to <code>ON</code>, <code>lifetime</code> and <code>capacity</code> will be set to 86,400 (one day) and 4,096. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.ssl.session-cache: ON</pre></code> -</dl> - -<div id="proxy.ssl.verify-peer" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/proxy_directives.html#proxy.ssl.verify-peer"><code>"proxy.ssl.verify-peer"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) indicating if the server certificate and hostname should be verified. -</p> - -<p> -If set to <code>ON</code>, the HTTP client implementation of H2O verifies the peer's certificate using the list of trusted certificates as well as compares the hostname presented in the certificate against the connecting hostname. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.ssl.verify-peer: ON</pre></code> -<dt>See also:</dt> -<dd><a href="configure/proxy_directives.html#proxy.ssl.cafile"><code>proxy.ssl.cafile</code></a> -</dd> -</dl> - -<div id="proxy.timeout.io" class="directive-head"> -<h3><a href="configure/proxy_directives.html#proxy.timeout.io"><code>"proxy.timeout.io"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets the upstream I/O timeout in milliseconds. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.timeout.io: 30000</pre></code> -</dl> - - -<div id="proxy.timeout.keepalive" class="directive-head"> -<h3><a href="configure/proxy_directives.html#proxy.timeout.keepalive"><code>"proxy.timeout.keepalive"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets the upstream timeout for idle connections in milliseconds. -</p> - -<p> -Upstream connection becomes non-persistent if the value is set to zero. -The value should be set to something smaller than that being set at the upstream server. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.timeout.keepalive: 2000</pre></code> -</dl> - -<div id="proxy.websocket" class="directive-head"> -<h3><a href="configure/proxy_directives.html#proxy.websocket"><code>"proxy.websocket"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) indicating whether or not to allow upgrading the proxied connection to <a href="https://tools.ietf.org/html/rfc6455">the WebSocket protocol</a>. -</p> - -<p> -When set to <code>ON</code>, the proxied connection will be upgraded to a bi-directional tunnel stream if upgrading to WebSocket connection is permitted by the backend server (i.e. if the backend server responds to a WebSocket handshake with <code>101</code> status code). -</p> -<p> -Support for WebSocket is considered experimental for the time being and therefore is not yet turned on by default. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.websocket: OFF</pre></code> -</dl> - -<div id="proxy.websocket.timeout" class="directive-head"> -<h3><a href="configure/proxy_directives.html#proxy.websocket.timeout"><code>"proxy.websocket.timeout"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Sets idle timeout of a WebSocket connection being proxied. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>proxy.websocket.timeout: 300000</pre></code> -</dl> - - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/quick_start.html b/debian/vendor-h2o/doc/configure/quick_start.html deleted file mode 100644 index e74f704..0000000 --- a/debian/vendor-h2o/doc/configure/quick_start.html +++ /dev/null @@ -1,128 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Quick Start - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Quick Start -</h2> - - -<p> -In order to run the H2O standalone HTTP server, you need to write a configuration file. -The minimal configuration file looks like as follows. -</p> - -<pre><code>listen: - port: 8080 -user: nobody -hosts: - "myhost.example.com": - paths: - /: - file.dir: /path/to/the/public-files -access-log: /path/to/the/access-log -error-log: /path/to/the/error-log -pid-file: /path/to/the/pid-file -</code></pre> - -<p> -The configuration instructs the server to: -<ol> -<li>listen to port 8080</li> -<li>under the privileges of <code>nobody</code></li> -<li>serve files under <code>/path/to/the/public-files</code></li> -<li>emit access logs to file: <code>/path/to/the/access-log</code></li> -<li>emit error logs to <code>/path/to/the/error-log</code></li> -<li>store the process id of the server in <code>/path/to/the/pid-file</code> -</ol> -</p> - -<p> -Enter the command below to start the server. -</p> - -<pre><code>% sudo h2o -m daemon -c /path/to/the/configuration-file -</code></pre> - -<p> -The command instructs the server to read the configuration file, and start in <code>daemon</code> mode, which dispatches a pair of master and worker processes that serves the HTTP requests. -</p> - -<p> -To stop the server, send <code>SIGTERM</code> to the server. -</p> - -<pre><code>% sudo kill -TERM `cat /path/to/the/pid-file` -</code></pre> - -<h3>Next Step</h3> - -<p> -Now that you know how to start and stop the server, the next step is to learn the <a href="configure.html">configuration directives and their structure</a>, or see <a href="https://github.com/h2o/h2o/wiki#configuration-examples">the configuration examples</a>. -</p> - -</p> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/redirect_directives.html b/debian/vendor-h2o/doc/configure/redirect_directives.html deleted file mode 100644 index 81ffb36..0000000 --- a/debian/vendor-h2o/doc/configure/redirect_directives.html +++ /dev/null @@ -1,125 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Redirect Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Redirect Directives -</h2> - - -<p> -This document describes the configuration directives of the redirect handler. -</p> - -<div id="redirect" class="directive-head"> -<h3><a href="configure/redirect_directives.html#redirect"><code>"redirect"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Redirects the requests to given URL. -</p> - -<p> -The directive rewrites the URL by replacing the host and path part of the URL at which the directive is used with the given URL. For example, when using the configuration below, requests to <code>http://example.com/abc.html</code> will be redirected to <code>https://example.com/abc.html</code>. -</p> -<p> -If the argument is a scalar, the value is considered as the URL to where the requests should be redirected. -</p> -<p> -Following properties are recognized if the argument is a mapping. -<dl> -<dt><code>url</code> -<dd>URL to redirect to -<dt><code>status</code> -<dd>the three-digit status code to use (e.g. <code>301</code>) -<dt><code>internal</code> -<dd>either <code>YES</code> or <code>NO</code> (default); if set to <code>YES</code>, then the server performs an internal redirect and return the content at the redirected URL -</dl> -</p> -<div class="example"> -<div class="caption">Example. Redirect all HTTP to HTTPS permanently (except for the files under <code>RSS</code>)</div> -<pre><code>hosts: - "example.com:80": - paths: - "/": - redirect: - status: 301 - url: "https://example.com/" - "/rss": - file.dir: /path/to/rss -</code></pre> -</div> - - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path</dd> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/reproxy_directives.html b/debian/vendor-h2o/doc/configure/reproxy_directives.html deleted file mode 100644 index 760770c..0000000 --- a/debian/vendor-h2o/doc/configure/reproxy_directives.html +++ /dev/null @@ -1,105 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Reproxy Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Reproxy Directives -</h2> - - -<p> -This document describes the configuration directives of the reproxy handler. -</p> - -<div id="reproxy" class="directive-head"> -<h3><a href="configure/reproxy_directives.html#reproxy"><code>"reproxy"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -A boolean flag (<code>ON</code> or <code>OFF</code>) indicating if the server should recognize the <code>X-Reproxy-URL</code> header sent from <a href="configure/proxy_directives.html#proxy.reverse.url">upstream servers</a>. - -</p> - -<p> -If H2O recognizes the header, it fetches the contents of the resource specified by the header, and sends the contents as the response to the client. -If the status code associated with the <code>X-Reproxy-URL</code> header is 307 or 308, then the method of the original request is used to obtain the specified resource. -Otherwise, the request method is changed to <code>GET</code>. -</p> -<p> -For example, an upstream server may send an URL pointing to a large image using the <code>X-Reproxy-URL</code> header stored on a distributed file system, and let H2O fetch and return the content to the client, instead of fetching the image by itself. -Doing so would reduce the load on the application server. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>reproxy: OFF</pre></code> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/status_directives.html b/debian/vendor-h2o/doc/configure/status_directives.html deleted file mode 100644 index 2558106..0000000 --- a/debian/vendor-h2o/doc/configure/status_directives.html +++ /dev/null @@ -1,149 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Status Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Status Directives -</h2> - - -<p> -The status handler exposes the current states of the HTTP server. -This document describes the configuration directives of the handler. -</p> - -<div id="status" class="directive-head"> -<div class="directive-since">since v2.0</div> -<h3><a href="configure/status_directives.html#status"><code>"status"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -If the argument is <code>ON</code>, the directive registers the status handler to the current path. - -</p> - -<p> -Access to the handler should be <a href="configure/mruby.html#access-control">restricted</a>, considering the fact that the status includes the details of in-flight HTTP requests. -The example below uses <a href="configure/basic_auth.html">Basic authentication</a>. -</p> -<div class="example"> -<div class="caption">Example. Exposing status with Basic authentication</div> -<pre><code>paths: - /server-status: - mruby.handler: | - require "htpasswd.rb" - Htpasswd.new("/path/to/.htpasswd", "status") - status: ON -</code></pre> -</div> - -<p> -The information returned by the <code>/json</code> handler can be filtered out using the optional <code>show=module1,module2</code> parameter. -There are currently three modules defined: -<ul> -<li><code>requests</code>: displays the requests currently in-flight.</li> -<li><code>durations</code>: displays durations statistics for requests since server start time in seconds (returns all zeros unless <code>duration-stats</code> is <code>ON</code>).</li> -<li><code>errors</code>: displays counters for internally generated errors.</li> -<li><code>main</code>: displays general daemon-wide stats.</li> -</ul> -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>path</dd> -</dl> - -<div id="duration-stats" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/status_directives.html#duration-stats"><code>"duration-stats"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Gather timing stats for requests. -</p> - -</p> -<p> -If the argument is <code>ON</code>, this directive populates duration statistics in seconds, to be consumed by status handlers. -Enabling this feature has a noticeable CPU and memory impact. -</p> -<p> -Note that the time spent while processing a request in a blocking manner (such as opening a file or a mruby handler that does invoke a network operation) will not be reflected to the <code>process_time</code> element of the duration stats due to the fact that the timer being used for measuring the time spent is updated only once per loop. -</p> - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global</dd> -<dt>Default:</dt> -<dd><code><pre>duration-stats: OFF</pre></code> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/syntax_and_structure.html b/debian/vendor-h2o/doc/configure/syntax_and_structure.html deleted file mode 100644 index 0d0fd7a..0000000 --- a/debian/vendor-h2o/doc/configure/syntax_and_structure.html +++ /dev/null @@ -1,284 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Syntax and Structure - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Syntax and Structure -</h2> - - -<h3>Syntax</h3> - -<p> -H2O uses <a href="http://www.yaml.org/">YAML</a> 1.1 as the syntax of its configuration file. -</p> - -<h3 id="config_levels">Levels of Configuration</h3> - -<p> -When using the configuration directives of H2O, it is important to understand that there are four configuration levels: global, host, path, extension. -</p> - -<p> -Global-level configurations affect the entire server. -Host-level configurations affect the configuration for the specific hostname (i.e. corresponds to the <a href="http://httpd.apache.org/docs/2.4/vhosts/"><VirtualHost></a> directive of the Apache HTTP Server). -Path-level configurations only affect the behavior of resources specific to the path. -</p> - -<p> -Extension-level configuration affect how files with certain extensions are being served. -For example, it is possible to map files with <code>.php</code> extension to the FastCGI handler running the <code>php-cgi</code> command. -</p> - -<p> -Consider the following example. -</p> - -<pre><code>hosts: - "example.com": - listen: - port: 443 - ssl: - certificate-file: etc/site1.crt - key-file: etc/site1.key - paths: - "/": - file.dir: htdocs/site1 - "/icons": - file.dir: icons - expires: 1 day - "example.com:80": - listen: - port: 80 - paths: - "/": - redirect: "https://example.com/" -</code></pre> - -<p> -In the example, two host-level configurations exist (under the <code>hosts</code> mapping), each of them listening to different ports. -The first host listens to port 443 using TLS (i.e. HTTPS) using the specified server certificate and key. -It has two path-level configurations, one for <code>/</code> and the other for <code>/icons</code>, each of them pointing to different local directories containing the files to be served. -The latter also has the <code>expires</code> directive set, so that <code>Cache-Control: max-age=86400</code><sup><a href="#note_1" id="#cite_1" title="1 day is equivalent to 86400 seconds">1</sup></a></sup> header would be sent. -The second host accepts connections on port 80 (via the plain-text HTTP protocol), and redirects all the requests to the first host using HTTPS. -</p> - -<p> -Certain configuration directives can be used in more than one levels. For example, the <a href="configure/base_directives.html#listen"><code>listen</code></a> can be used either at the global level or at the host level. -<a href="configure/expires_directives.html#expires"><code>Expires</code></a> can be used at all levels. -On the other hand <a href="configure/file_directives.html#file.dir"><code>file.dir</code></a> can only be used at the path level. -</p> - -<h3 id="path-level">Path-level configuration</h3> - -<p> -Values of the path-level configuration define the action(s) to be taken when the server processes a request that prefix-matches to the configured paths. -Each entry of the mapping associated to the paths is evaluated in the order they appear. -</p> - -<p> -Consider the following example. -When receiving a request for <code>https://example.com/foo</code>, <a href="configure/file_directives.html">the file handler</a> is first executed trying to serve a file named <code>/path/to/doc-root/foo</code> as the response. -In case the file does not exist, then <a href="configure/fastcgi_directives.html">the FastCGI handler</a> is invoked. -</p> - -<pre><code>hosts: - "example.com": - listen: - port: 443 - ssl: - certificate-file: etc/site1.crt - key-file: etc/site1.key - paths: - "/": - file.dir: /path/to/doc-root - fastcgi.connect: - port: /path/to/fcgi.sock - type: unix -</code></pre> - -<p> -Starting from version 2.1, it is also possible to define the path-level configuration as a sequence of mappings instead of a single mapping. -The following example is identical to the previous one. -Notice the dashes placed before the handler directives. -</p> - -<pre><code>hosts: - "example.com": - listen: - port: 443 - ssl: - certificate-file: etc/site1.crt - key-file: etc/site1.key - paths: - "/": - - file.dir: /path/to/doc-root - - fastcgi.connect: - port: /path/to/fcgi.sock - type: unix -</code></pre> - -<h3 id="yaml_alias">Using YAML Alias</h3> - -<p> -H2O resolves <a href="http://yaml.org/YAML_for_ruby.html#aliases_and_anchors">YAML aliases</a> before processing the configuration file. -Therefore, it is possible to use an alias to reduce the redundancy of the configuration file. -For example, the following configuration reuses the first <code>paths</code> element (that is given an anchor named <code>default_paths</code>) in the following definitions. - -<pre><code>hosts: - "example.com": - listen: - port: 443 - ssl: - certificate-file: /path/to/example.com.crt - key-file: /path/to/example.com.crt - paths: &default_paths - "/": - file.dir: /path/to/doc-root - "example.org": - listen: - port: 443 - ssl: - certificate-file: /path/to/example.org.crt - key-file: /path/to/example.org.crt - paths: *default_paths -</code></pre> - -<h3 id="yaml_merge">Using YAML Merge</h3> - -<p> -Since version 2.0, H2O recognizes <a href="http://yaml.org/type/merge.html">Merge Key Language-Independent Type for YAML™ Version 1.1</a>. -Users can use the feature to merge an existing mapping against another. -The following example reuses the TLS configuration of <code>example.com</code> in <code>example.org</code>. -</p> - -<pre><code>hosts: - "example.com": - listen: - port: 443 - ssl: &default_ssl - minimum-version: TLSv1.2 - cipher-suite: ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 - certificate-file: /path/to/example.com.crt - key-file: /path/to/example.com.crt - paths: - ... - "example.org": - listen: - port: 443 - ssl: - <<: *default_ssl - certificate-file: /path/to/example.org.crt - key-file: /path/to/example.org.crt - paths: - ... -</code></pre> - -<h3 id="including_files">Including Files</h3> - -<p> -Starting from version 2.1, it is possible to include a YAML file from the configuration file using <code>!file</code> custom YAML tag. -The following example extracts the TLS configuration into <code>default_ssl.conf</code> and include it multiple times in <code>h2o.conf</code>. -</p> - -<div class="example"> -<div class="caption">Example. default_ssl.conf</div> -<pre><code>minimum-version: TLSv1.2 -cipher-suite: ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 -certificate-file: /path/to/example.com.crt -key-file: /path/to/example.com.crt -</code></pre> -</div> - - -<div class="example"> -<div class="caption">Example. h2o.conf</div> -<pre><code>hosts: - "example.com": - listen: - port: 443 - ssl: !file default_ssl.conf - paths: - ... - "example.org": - listen: - port: 443 - ssl: - <<: !file default_ssl.conf - certificate-file: /path/to/example.org.crt - key-file: /path/to/example.org.crt - paths: - ... -</code></pre> -</div> - - - - -<div class="notes"> -<h3>Notes:</h3> -<ol> -<li id="note_1">1 day is equivalent to 86400 seconds</li> -</ol> -</div> - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/configure/throttle_response_directives.html b/debian/vendor-h2o/doc/configure/throttle_response_directives.html deleted file mode 100644 index a61c767..0000000 --- a/debian/vendor-h2o/doc/configure/throttle_response_directives.html +++ /dev/null @@ -1,122 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> -<base href="../" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Throttle Response Directives - Configure - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td class="selected">Configure</td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -<a href="configure.html">Configure</a> > -Throttle Response Directives -</h2> - - -<p> -The throttle response handler performs per response traffic throttling, when an <code>X-Traffic</code> header exists in the response headers. -</p> -<p> -The value of <code>X-Traffic</code> header should be an integer that represents the speed you want in bytes per second. This header CAN be set with <a href="configure/headers_directives.html#header.add"><code>header.add</code></a> so that traffic for static assets can also be easily throttled. -</p> -<p> -The following are the configuration directives recognized by the handler. -</p> - -<div id="throttle-response" class="directive-head"> -<div class="directive-since">since v2.1</div> -<h3><a href="configure/throttle_response_directives.html#throttle-response"><code>"throttle-response"</code></a></h3> -</div> - -<dl class="directive-desc"> -<dt>Description:</dt> -<dd> -<p> -Enables traffic throttle per HTTP response. - -</p> - -<p> -If the argument is <code>ON</code>, the traffic per response is throttled as long as a legal <code>X-Traffic</code> header exists. -If the argument is <code>OFF</code>, traffic throttle per response is disabled. -</p> -<div class="example"> -<div class="caption">Example. Enabling traffic throttle per response with static file configuration</div> -<pre><code># enable throttle -throttle-response: ON - -# an example host configuration that throttle traffic to ~100KB/s -hosts: - default: - paths: - /: - file.dir: /path/to/assets - header.add: "X-Traffic: 100000" -</code></pre> -</div> - - -</dd> -<dt><a href="configure/syntax_and_structure.html#config_levels">Level</a>:</dt> -<dd>global, host, path, extension</dd> -<dt>Default:</dt> -<dd><code><pre>throttle-response: OFF</pre></code> -</dl> - - - - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/faq.html b/debian/vendor-h2o/doc/faq.html deleted file mode 100644 index 8ea1f17..0000000 --- a/debian/vendor-h2o/doc/faq.html +++ /dev/null @@ -1,126 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Frequently Asked Questions - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td><a href="install.html">Install</a></td> -<td><a href="configure.html">Configure</a></td> -<td class="selected">FAQ</td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -Frequently Asked Questions -</h2> - - -<h3 id="license">What are the license terms?</h3> - -<div> -H2O is licensed under <a href="http://opensource.org/licenses/MIT">the MIT license</a>. -</div> -<div> -Portions of the software use following libraries that are also licensed under the MIT license: <a href="https://github.com/h2o/h2o/blob/master/deps/klib/khash.h">khash.h</a>, <a href="https://github.com/h2o/h2o/blob/master/deps/picohttpparser/">PicoHTTPParser</a>, <a href="https://github.com/h2o/h2o/blob/master/deps/yaml/">libyaml</a>. -</div> - -<div> -Depending on how H2O is configured, the software links against OpenSSL or LibreSSL, both of which are <a href="https://www.openssl.org/source/license.html">dual-licensed under the OpenSSL License and the original SSLeay license</a>. -</div> - -<h3 id="design-docs">Are there any design documents?</h3> - -<div> -Please refer to the main developer's <a href="http://www.slideshare.net/kazuho/h2o-20141103pptx" target="_blank">presentation slides</a> at the HTTP/2 conference, and <a href="http://blog.kazuhooku.com" target="_blank">his weblog</a>. -</div> - -<h3 id="libh2o">How do I use H2O as a library?</h3> - -<div> -<p> -Aside from the standalone server, H2O can also be used as a software library. -The name of the library is <code>libh2o</code>. -</p> -<p> -To build H2O as a library you will need to install the following dependencies: -<ul> -<li><a href="https://github.com/libuv/libuv/">libuv</a> version 1.0 or above</li> -<li><a href="https://www.openssl.org/">OpenSSL</a> version 1.0.2 or above<sup><a href="#note_1" id="#cite_1" title="libh2o cannot be linked against the bundled LibreSSL; see issue #290">1</sup></a></sup></li> -</ul> -In case the dependencies are installed under a non-standard path, <code>PKG_CONFIG_PATH</code> configuration variable can be used for specifying their paths. For example, the following snippet builds <code>libh2o</code> using the libraries installed in their respective paths. -</p> - -<pre><code>% PKG_CONFIG_PATH=/usr/local/libuv-1.4/lib/pkgconfig:/usr/local/openssl-1.0.2a/lib/pkgconfig cmake . -% make libh2o -</code></pre> - -<p> -For more information, please refer to the <a href="https://github.com/h2o/h2o/labels/libh2o">GitHub issues tagged as libh2o</a>. -</p> -</div> - -<h3 id="issues">I have a problem. Where should I look for answers?</h3> - -<div> -Please refer to the <a href="https://github.com/h2o/h2o/labels/FAQ">GitHub issues tagged as FAQ</a>. -</div> - - - -<div class="notes"> -<h3>Notes:</h3> -<ol> -<li id="note_1">libh2o cannot be linked against the bundled LibreSSL; see <a href="https://github.com/h2o/h2o/issues/290">issue #290</a></li> -</ol> -</div> - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/index.html b/debian/vendor-h2o/doc/index.html deleted file mode 100644 index f71f712..0000000 --- a/debian/vendor-h2o/doc/index.html +++ /dev/null @@ -1,114 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td class="selected">Top</td> -<td><a href="install.html">Install</a></td> -<td><a href="configure.html">Configure</a></td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - - - -<div style="margin-top: 3em;"> -<p> -H2O is a new generation HTTP server that <b>provides quicker response to users with less CPU utilization</b> when compared to older generation of web servers. -Designed from ground-up, the server takes full advantage of <a href="https://tools.ietf.org/html/rfc7540">HTTP/2</a> features including <a href="configure/http2_directives.html#prioritization">prioritized content serving</a> and <a href="configure/http2_directives.html#server-push">server push</a>, promising outstanding experience to the visitors of your web site. -<div align="center"> -<a href="assets/8mbps100msec-nginx195-h2o150.png" target="_blank"><img src="assets/8mbps100msec-nginx195-h2o150.png" width="333" height="250"></a> -<a href="assets/staticfile612-nginx1910-h2o170.png" target="_blank"><img src="assets/staticfile612-nginx1910-h2o170.png" width="200" height="250"></a> -</div> -Explanation of the benchmark charts can be found in the <a href="benchmarks.html">benchmarks</a> page. -<p> - -</p> -</div> - -<h3>Key Features</h3> - -<ul> -<li>HTTP/1.0, HTTP/1.1 -<li><a href="configure/http2_directives.html">HTTP/2</a> -<ul> -<li>full support for dependency and weight-based prioritization with <a href="configure/http2_directives.html#http2-reprioritize-blocking-assets">server-side tweaks</a></li> -<li><a href="configure/http2_directives.html#http2-casper">cache-aware server push</a></li> -</ul> -</li> -<li>TCP Fast Open -<li><a href="configure/base_directives.html#listen-ssl">TLS</a> -<ul> -<li>session resumption (standalone & memcached) -<li>session tickets with automatic key rollover -<li>automatic OCSP stapling -<li>forward secrecy & fast AEAD ciphers<sup><a href="#note_1" id="#cite_1" title="chacha20-poly1305: see Do the ChaCha: better mobile performance with cryptography">1</sup></a></sup></li> -<li><a href="configure/base_directives.html#neverbleed">private key protection using privilege separation</a> -</ul> -</li> -<li><a href="configure/file_directives.html">static file serving</a> -<li><a href="configure/fastcgi_directives.html">FastCGI</a> -<li><a href="configure/proxy_directives.html">reverse proxy</a> -<li><a href="configure/mruby.html">scriptable using mruby</a> (Rack-based) -<li>graceful restart and self-upgrade -</ul> - - - -<div class="notes"> -<h3>Notes:</h3> -<ol> -<li id="note_1">chacha20-poly1305: see <a href="https://blog.cloudflare.com/do-the-chacha-better-mobile-performance-with-cryptography/">Do the ChaCha: better mobile performance with cryptography</a></li> -</ol> -</div> - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/install.html b/debian/vendor-h2o/doc/install.html deleted file mode 100644 index a42acef..0000000 --- a/debian/vendor-h2o/doc/install.html +++ /dev/null @@ -1,188 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> - -<!-- oktavia --> -<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" /> -<script src="search/jquery-1.9.1.min.js"></script> -<script src="search/oktavia-jquery-ui.js"></script> -<script src="search/oktavia-english-search.js"></script> -<!-- /oktavia --> - -<link rel="stylesheet" href="assets/style.css" type="text/css" /> - -<title>Install - H2O - the optimized HTTP/2 server</title> -</head> -<body> -<div id="body"> -<div id="top"> - -<h1> -<a href="index.html">H2O</a> -</h1> -<p class="description">the optimized HTTP/1.x, HTTP/2 server</p> - -<!-- oktavia --> -<form id="searchform"> -<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" /> -<div id="searchresult_box"> -<div id="close_search_box">×</div> -<div id="searchresult_summary"></div> -<div id="searchresult"></div> -<div id="searchresult_nav"></div> -<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span> -</div> -</form> -<!-- /oktavia --> - -</div> - -<table id="menu"> -<tr> -<td><a href="index.html">Top</a></td> -<td class="selected">Install</td> -<td><a href="configure.html">Configure</a></td> -<td><a href="faq.html">FAQ</a></td> -<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td> -<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td> -</tr> -</table> - -<div id="main"> - -<h2> -Install -</h2> - - -<h3 id="binary">Installing a Binary Package</h3> - -<p> -Thanks to others, H2O is provided as a binary package on some environments. -Therefore you may try to at first install the software using your favorite packaging system, and then resort to installing from source as described below. -</p> - -<p> -At the time being, following packages are known to be actively maintained<sup><a href="#note_1" id="#cite_1" title="Please open a new issue on Github if you want a new package to get added.">1</sup></a></sup>: -<ul> -<li><a href="http://portsmon.freebsd.org/portoverview.py?category=www&portname=h2o">FreeBSD</a></li> -<li><a href="http://brewformulas.org/H2o">Homebrew (OS X)</a></li> -<li><a href="https://github.com/tatsushid/h2o-rpm">RPM (Fedora, RHEL/CentOS, OpenSUSE)</a></li> -<li><a href="https://hub.docker.com/r/lkwg82/h2o-http2-server/">Docker Image</a></li> -</ul> -</p> - -<h3 id="from-source">Installing from Source</h3> - -<p> -Download a release version from <a href="https://github.com/h2o/h2o/releases">the releases page</a> or clone the master branch from <a href="https://github.com/h2o/h2o/">the source repository</a>, and build it using <a href="http://www.cmake.org/">CMake</a><sup><a href="#note_2" id="#cite_2" title="CMake is a popular build tool that can be found as a binary package on most operating systems.">2</sup></a></sup>. -</p> - -<pre><code>% cmake -DWITH_BUNDLED_SSL=on . -% make -% sudo make install -</code></pre> - -<p> -When complete, H2O will be installed under <code>/usr/local</code>. -</p> - -<p> -Start the installed server using the example configuration to confirm that it actually works (note: without the use of <code>-m</code> option the server runs as a foreground process; press <code>Ctrl-C</code> to stop). -</p> - -<pre><code>% /usr/local/bin/h2o -c examples/h2o/h2o.conf -</code></pre> - -<p> -The example configuration starts a server that listens to port 8080 (HTTP) and port 8081 (HTTPS). Try to access the ports using the protocols respectively (note: when accessing via HTTPS it is likely that you would see hostname mismatch errors reported by the web browsers). -</p> - -<p> -When complete, proceed to <a href="configure.html">Configure</a> section for how to setup the server. -</p> - -<h4>CMake Options</h4> - -<p> -Following list shows the interesting arguments recognized by CMake. - -<dl> -<dt><code>-DCMAKE_INSTALL_PREFIX=<i>directory</i></code></dt> -<dd> -This option specifies the directory to which H2O will be installed (default: <code>/usr/local</code>). -</dd> -<dt><code>-DWITH_BUNDLED_SSL=<i>on</i>|<i>off</i></code></dt> -<dd> -This option instructs whether or not to use <a href="http://www.libressl.org/">LibreSSL</a> being bundled (default: <code>off</code> if <a href="https://www.openssl.org/">OpenSSL</a> version >= 1.0.2 is found, <code>on</code> if otherwise). Read the section below for comparison between OpenSSL and LibreSSL. -</dd> -<dt><code>-DWITH_MRUBY=<i>on</i>|<i>off</i></code></dt> -<dd> -This option instructs whether or not to build the standalone server with support for <a href="configure/mruby.html">scripting using mruby</a>. -It is turned on by default if the prerequisites (<a href="https://www.gnu.org/software/bison/">bison</a>, <a href="https://www.ruby-lang.org/">ruby</a> and the development files<sup><a href="#note_3" id="#cite_3" title="mkmf - a program for building ruby extensions is required. In many distributions, the program is packaged as part of ruby-dev or ruby-devel package.">3</sup></a></sup>) are found. -</dl> -</p> - -<h3>Installing from Source, using OpenSSL</h3> - -<p> -Generally speaking, we believe that using LibreSSL is a better choice for running H2O, since LibreSSL not only is considered to be more secure than OpenSSL but also provides support for new ciphersuites such as <code>chacha20-poly1305</code> which is the preferred method of Google Chrome<sup><a href="#note_4" id="#cite_4" title="ref: Do the ChaCha: better mobile performance with cryptography">4</sup></a></sup>. However, it is also true that LibreSSL is slower than OpenSSL on some benchmarks. So if you are interested in benchmark numbers, using OpenSSL is a reasonable choice. -</p> - -<p> -The difficulty in using OpenSSL is that the HTTP/2 specification requires the use of an extension to the TLS protocol named ALPN, which has only been supported since OpenSSL 1.0.2<sup><a href="#note_5" id="#cite_5" title="It is possible to build H2O using prior versions of OpenSSL, but some (if not all) web browsers are known for not using HTTP/2 when connecting to servers configured as such.">5</sup></a></sup>. Therefore it is highly likely that you would need to manually install or upgrade OpenSSL on your system. -</p> - -<p> -Once you have installed OpenSSL 1.0.2, it is possible to build H2O that links against the library. As an safeguard it is advised to use <code>-DWITH_BUNDLED_SSL</code> set to <code>off</code>, so that the server would not accidentally link against the bundled LibreSSL. -CMake will search for OpenSSL by looking at the default search paths. -</p> - -<pre><code>% cmake -DWITH_BUNDLED_SSL=off -% make -% sudo make install -</code></pre> - -<p> -Two ways exist to specify the directory in which CMake should search for OpenSSL. -The preferred approach is to use the <code>PKG_CONFIG_PATH</code> environment variable. -</p> - -<pre><code>% PKG_CONFIG_PATH=/usr/local/openssl-1.0.2/lib/pkgconfig cmake -DWITH_BUNDLED_SSL=off -% make -% sudo make install -</code></pre> - -<p> -In case your OpenSSL installation does not have the <code>lib/pkgconfig</code> directory, you may use <code>OPENSSL_ROOT_DIR</code> environment variable to specify the root directory of the OpenSSL being installed. However, it is likely that CMake version 3.1.2 or above is be required when using this approach<sup><a href="#note_6" id="#cite_6" title="ref: h2o issue #277, CMake issue 0015386">6</sup></a></sup>. -</p> - -<pre><code>% OPENSSL_ROOT_DIR=/usr/local/openssl-1.0.2 cmake -DWITH_BUNDLED_SSL=off -% make -% sudo make install -</code></pre> - - - -<div class="notes"> -<h3>Notes:</h3> -<ol> -<li id="note_1">Please open a new issue on <a href="https://github.com/h2o/h2o">Github</a> if you want a new package to get added.</li> -<li id="note_2">CMake is a popular build tool that can be found as a binary package on most operating systems.</li> -<li id="note_3"><code>mkmf</code> - a program for building ruby extensions is required. In many distributions, the program is packaged as part of <code>ruby-dev<code> or <code>ruby-devel</code> package.</li> -<li id="note_4">ref: <a href="https://blog.cloudflare.com/do-the-chacha-better-mobile-performance-with-cryptography/">Do the ChaCha: better mobile performance with cryptography</a></li> -<li id="note_5">It is possible to build H2O using prior versions of OpenSSL, but some (if not all) web browsers are known for not using HTTP/2 when connecting to servers configured as such.</li> -<li id="note_6">ref: <a href="https://github.com/h2o/h2o/issues/277">h2o issue #277</a>, <a href="http://public.kitware.com/Bug/view.php?id=15386">CMake issue 0015386</a></li> -</ol> -</div> - -</div> -<div id="footer"> -<p> -Copyright © 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al. -</p> -</div> -</body> -</html> diff --git a/debian/vendor-h2o/doc/search/jquery-1.9.1.min.js b/debian/vendor-h2o/doc/search/jquery-1.9.1.min.js deleted file mode 100644 index 006e953..0000000 --- a/debian/vendor-h2o/doc/search/jquery-1.9.1.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license -//@ sourceMappingURL=jquery.min.map -*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)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(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.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=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.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,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; -return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(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 mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) -}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.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=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
\ No newline at end of file diff --git a/debian/vendor-h2o/doc/search/oktavia-english-search.js b/debian/vendor-h2o/doc/search/oktavia-english-search.js deleted file mode 100644 index 5911991..0000000 --- a/debian/vendor-h2o/doc/search/oktavia-english-search.js +++ /dev/null @@ -1,9039 +0,0 @@ -// generatedy by JSX compiler 0.9.10 (2013-02-22 10:18:33 +0900; e3a1f2a04656dbfd626086b3c68606d0c9697212) -var JSX = {}; -(function (JSX) { -/** - * copies the implementations from source interface to target - */ -function $__jsx_merge_interface(target, source) { - for (var k in source.prototype) - if (source.prototype.hasOwnProperty(k)) - target.prototype[k] = source.prototype[k]; -} - -/** - * defers the initialization of the property - */ -function $__jsx_lazy_init(obj, prop, func) { - function reset(obj, prop, value) { - delete obj[prop]; - obj[prop] = value; - return value; - } - - Object.defineProperty(obj, prop, { - get: function () { - return reset(obj, prop, func()); - }, - set: function (v) { - reset(obj, prop, v); - }, - enumerable: true, - configurable: true - }); -} - -/** - * sideeffect().a /= b - */ -function $__jsx_div_assign(obj, prop, divisor) { - return obj[prop] = (obj[prop] / divisor) | 0; -} - -/* - * global functions, renamed to avoid conflict with local variable names - */ -var $__jsx_parseInt = parseInt; -var $__jsx_parseFloat = parseFloat; -var $__jsx_isNaN = isNaN; -var $__jsx_isFinite = isFinite; - -var $__jsx_encodeURIComponent = encodeURIComponent; -var $__jsx_decodeURIComponent = decodeURIComponent; -var $__jsx_encodeURI = encodeURI; -var $__jsx_decodeURI = decodeURI; - -var $__jsx_ObjectToString = Object.prototype.toString; -var $__jsx_ObjectHasOwnProperty = Object.prototype.hasOwnProperty; - -/* - * profiler object, initialized afterwards - */ -function $__jsx_profiler() { -} - -/* - * public interface to JSX code - */ -JSX.require = function (path) { - var m = $__jsx_classMap[path]; - return m !== undefined ? m : null; -}; - -JSX.profilerIsRunning = function () { - return $__jsx_profiler.getResults != null; -}; - -JSX.getProfileResults = function () { - return ($__jsx_profiler.getResults || function () { return {}; })(); -}; - -JSX.postProfileResults = function (url) { - if ($__jsx_profiler.postResults == null) - throw new Error("profiler has not been turned on"); - return $__jsx_profiler.postResults(url); -}; - -JSX.resetProfileResults = function () { - if ($__jsx_profiler.resetResults == null) - throw new Error("profiler has not been turned on"); - return $__jsx_profiler.resetResults(); -}; -JSX.DEBUG = true; -/** - * class _Main extends Object - * @constructor - */ -function _Main() { -} - -/** - * @constructor - */ -function _Main$() { -}; - -_Main$.prototype = new _Main; - -/** - * @param {Array.<undefined|!string>} args - */ -_Main.main$AS = function (args) { - OktaviaSearch$setStemmer$LStemmer$(new EnglishStemmer$()); -}; - -var _Main$main$AS = _Main.main$AS; - -/** - * class _Result extends Object - * @constructor - */ -function _Result() { -} - -/** - * @constructor - * @param {!string} title - * @param {!string} url - * @param {!string} content - * @param {!number} score - */ -function _Result$SSSI(title, url, content, score) { - this.title = title; - this.url = url; - this.content = content; - this.score = score; -}; - -_Result$SSSI.prototype = new _Result; - -/** - * class _Proposal extends Object - * @constructor - */ -function _Proposal() { -} - -/** - * @constructor - * @param {!string} options - * @param {!string} label - * @param {!number} count - */ -function _Proposal$SSI(options, label, count) { - this.options = options; - this.label = label; - this.count = count; -}; - -_Proposal$SSI.prototype = new _Proposal; - -/** - * class OktaviaSearch extends Object - * @constructor - */ -function OktaviaSearch() { -} - -/** - * @constructor - * @param {!number} entriesPerPage - */ -function OktaviaSearch$I(entriesPerPage) { - this._queries = null; - this._result = null; - this._proposals = null; - this._currentFolderDepth = 0; - this._oktavia = new Oktavia$(); - this._entriesPerPage = entriesPerPage; - this._currentPage = 1; - this._queryString = null; - this._callback = null; - OktaviaSearch._instance = this; -}; - -OktaviaSearch$I.prototype = new OktaviaSearch; - -/** - * @param {Stemmer} stemmer - */ -OktaviaSearch.setStemmer$LStemmer$ = function (stemmer) { - if (OktaviaSearch._instance) { - OktaviaSearch._instance._oktavia.setStemmer$LStemmer$(stemmer); - } else { - OktaviaSearch._stemmer = stemmer; - } -}; - -var OktaviaSearch$setStemmer$LStemmer$ = OktaviaSearch.setStemmer$LStemmer$; - -/** - * @param {!string} index - */ -OktaviaSearch.prototype.loadIndex$S = function (index) { - if (OktaviaSearch._stemmer) { - this._oktavia.setStemmer$LStemmer$(OktaviaSearch._stemmer); - } - this._oktavia.load$S(Binary$base64decode$S(index)); - if (this._queryString) { - this.search$SF$IIV$((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[tool/web/oktavia-search.jsx:84:28] null access\n this.search(this._queryString, this._callback);\n ^\n"); - } - return v; - }(this._queryString)), this._callback); - this._queryString = null; - this._callback = null; - } -}; - -/** - * @param {!string} queryString - * @param {*} callback - */ -OktaviaSearch.prototype.search$SF$IIV$ = function (queryString, callback) { - /** @type {QueryStringParser} */ - var queryParser; - /** @type {SearchSummary} */ - var summary; - if (this._oktavia) { - queryParser = new QueryStringParser$(); - queryParser.parse$S(queryString); - this._queries = queryParser.queries; - summary = this._oktavia.search$ALQuery$(queryParser.queries); - console.log(summary); - if (summary.size$() > 0) { - this._result = this._sortResult$LSearchSummary$(summary); - this._proposals = [ ]; - this._currentPage = 1; - } else { - this._result = [ ]; - if (this._queries.length > 1) { - this._proposals = summary.getProposal$(); - } else { - this._proposals = [ ]; - } - this._currentPage = 1; - } - callback(this.resultSize$(), this.totalPages$()); - } else { - this._queryString = queryString; - this._callback = callback; - } -}; - -/** - * @return {!number} - */ -OktaviaSearch.prototype.resultSize$ = function () { - return (this._result.length | 0); -}; - -/** - * @return {!number} - */ -OktaviaSearch.prototype.totalPages$ = function () { - console.log(this._result.length); - console.log(this._entriesPerPage); - console.log(Math.ceil(this._result.length / this._entriesPerPage)); - return (Math.ceil(this._result.length / this._entriesPerPage) | 0); -}; - -/** - * @return {!number} - */ -OktaviaSearch.prototype.currentPage$ = function () { - return this._currentPage; -}; - -/** - * @param {!number} page - */ -OktaviaSearch.prototype.setCurrentPage$I = function (page) { - this._currentPage = page; -}; - -/** - * @return {!boolean} - */ -OktaviaSearch.prototype.hasPrevPage$ = function () { - return this._currentPage !== 1; -}; - -/** - * @return {!boolean} - */ -OktaviaSearch.prototype.hasNextPage$ = function () { - return this._currentPage !== this.totalPages$(); -}; - -/** - * @return {Array.<undefined|_Result>} - */ -OktaviaSearch.prototype.getResult$ = function () { - /** @type {Style} */ - var style; - /** @type {!number} */ - var start; - /** @type {!number} */ - var last; - /** @type {Metadata} */ - var metadata; - /** @type {!number} */ - var num; - /** @type {Array.<undefined|_Result>} */ - var results; - /** @type {!number} */ - var i; - /** @type {SearchUnit} */ - var unit; - /** @type {Array.<undefined|!string>} */ - var info; - /** @type {!number} */ - var offset; - /** @type {!string} */ - var content; - /** @type {Array.<undefined|Position>} */ - var positions; - /** @type {!number} */ - var end; - /** @type {!boolean} */ - var split; - /** @type {!number} */ - var j; - /** @type {Position} */ - var pos; - /** @type {!string} */ - var text; - style = new Style$S('html'); - start = (this._currentPage - 1) * this._entriesPerPage; - last = Math.min(this._currentPage * this._entriesPerPage, this._result.length); - metadata = this._oktavia.getPrimaryMetadata$(); - num = 250; - results = [ ]; - for (i = start; i < last; i++) { - unit = this._result[i]; - info = metadata.getInformation$I(unit.id).split(Oktavia.eob); - offset = info[0].length + 1; - content = metadata.getContent$I(unit.id); - start = 0; - positions = unit.getPositions$(); - if (content.indexOf((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[tool/web/oktavia-search.jsx:179:36] null access\n if (content.indexOf(info[0]) == 1)\n ^\n"); - } - return v; - }(info[0]))) === 1) { - content = content.slice(info[0].length + 2, content.length); - start += info[0].length + 2; - } - end = start + num; - split = false; - if (positions[0].position > end - positions[0].word.length) { - end = positions[0].position + Math.floor(num / 2); - split = true; - } - for (j = positions.length - 1; j > - 1; j--) { - pos = positions[j]; - if (pos.position + pos.word.length < end) { - content = [ content.slice(0, pos.position - start), style.convert$S('<hit>*</hit>').replace('*', content.slice(pos.position - start, pos.position + pos.word.length - start)), content.slice(pos.position + pos.word.length - start, content.length) ].join(''); - } - } - if (split) { - text = [ content.slice(0, Math.floor(num / 2)) + ' ...', content.slice(- Math.floor(num / 2), end - start) ].join('<br/>'); - } else { - text = content.slice(0, end - start) + ' ...<br/>'; - } - text = text.replace(Oktavia.eob, ' ').replace(/(<br\/>)(<br\/>)+/, '<br/><br/>'); - results.push(new _Result$SSSI((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[tool/web/oktavia-search.jsx:215:41] null access\n results.push(new _Result(info[0], info[1], text, unit.score));\n ^\n"); - } - return v; - }(info[0])), (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[tool/web/oktavia-search.jsx:215:50] null access\n results.push(new _Result(info[0], info[1], text, unit.score));\n ^\n"); - } - return v; - }(info[1])), text, unit.score)); - } - return results; -}; - -/** - * @return {Array.<undefined|_Proposal>} - */ -OktaviaSearch.prototype.getProposals$ = function () { - /** @type {Style} */ - var style; - /** @type {Array.<undefined|_Proposal>} */ - var results; - /** @type {!number} */ - var i; - /** @type {Proposal} */ - var proposal; - /** @type {Array.<undefined|!string>} */ - var label; - /** @type {Array.<undefined|!string>} */ - var option; - /** @type {!number} */ - var j; - style = new Style$S('html'); - results = [ ]; - if (this._queries.length > 1) { - for (i = 0; i < this._proposals.length; i++) { - proposal = this._proposals[i]; - label = [ ]; - option = [ ]; - for (j = 0; j < this._queries.length; j++) { - if (j !== proposal.omit) { - label.push(style.convert$S('<hit>' + this._queries[j].toString() + '</hit>')); - option.push(this._queries[j].toString()); - } else { - label.push(style.convert$S('<del>' + this._queries[j].toString() + '</del>')); - } - } - results.push(new _Proposal$SSI(option.join(' '), label.join(' '), proposal.expect)); - } - } - return results; -}; - -/** - * @param {SearchSummary} summary - * @return {Array.<undefined|SearchUnit>} - */ -OktaviaSearch.prototype._sortResult$LSearchSummary$ = function (summary) { - /** @type {!number} */ - var i; - /** @type {!number} */ - var score; - /** @type {SearchUnit} */ - var unit; - /** @type {!string} */ - var pos; - /** @type {Position} */ - var position; - for (i = 0; i < summary.result.units.length; i++) { - score = 0; - unit = summary.result.units[i]; - for (pos in unit.positions) { - position = unit.positions[pos]; - if (this._oktavia.wordPositionType$I(position.position)) { - score += 10; - } else { - score += 1; - } - if (! position.stemmed) { - score += 2; - } - } - unit.score = (score | 0); - } - return summary.getSortedResult$(); -}; - -/** - * class _Main$0 extends Object - * @constructor - */ -function _Main$0() { -} - -/** - * @constructor - */ -function _Main$0$() { -}; - -_Main$0$.prototype = new _Main$0; - -/** - * @param {Array.<undefined|!string>} args - */ -_Main$0.main$AS = function (args) { -}; - -var _Main$0$main$AS = _Main$0.main$AS; - -/** - * class Oktavia extends Object - * @constructor - */ -function Oktavia() { -} - -/** - * @constructor - */ -function Oktavia$() { - this._compressCode2utf16 = null; - this._fmindex = new FMIndex$(); - this._metadatas = ({ }); - this._metadataLabels = [ ]; - this._stemmer = null; - this._stemmingResult = ({ }); - this._utf162compressCode = [ Oktavia.eof, Oktavia.eob, Oktavia.unknown ]; - this._utf162compressCode.length = 65536; - this._compressCode2utf16 = [ Oktavia.eof, Oktavia.eob, Oktavia.unknown ]; -}; - -Oktavia$.prototype = new Oktavia; - -/** - * @param {Stemmer} stemmer - */ -Oktavia.prototype.setStemmer$LStemmer$ = function (stemmer) { - this._stemmer = stemmer; -}; - -/** - * @return {Metadata} - */ -Oktavia.prototype.getPrimaryMetadata$ = function () { - return this._metadatas[this._metadataLabels[0]]; -}; - -/** - * @param {!string} key - * @return {Section} - */ -Oktavia.prototype.addSection$S = function (key) { - /** @type {Section} */ - var section; - if (this._metadataLabels.indexOf(key) !== - 1) { - throw new Error('Metadata name ' + key + ' is already exists'); - } - this._metadataLabels.push(key); - section = new Section$LOktavia$(this); - this._metadatas[key] = section; - return section; -}; - -/** - * @param {!string} key - * @return {Section} - */ -Oktavia.prototype.getSection$S = function (key) { - if (this._metadataLabels.indexOf(key) === - 1) { - throw new Error('Metadata name ' + key + " does't exists"); - } - return (function (v) { - if (! (v == null || v instanceof Section)) { - debugger; - throw new Error("[src/oktavia.jsx:67:36] detected invalid cast, value is not an instance of the designated type or null\n return this._metadatas[key] as Section;\n ^^\n"); - } - return v; - }(this._metadatas[key])); -}; - -/** - * @param {!string} key - * @return {Splitter} - */ -Oktavia.prototype.addSplitter$S = function (key) { - /** @type {Splitter} */ - var splitter; - if (this._metadataLabels.indexOf(key) !== - 1) { - throw new Error('Metadata name ' + key + ' is already exists'); - } - this._metadataLabels.push(key); - splitter = new Splitter$LOktavia$(this); - this._metadatas[key] = splitter; - return splitter; -}; - -/** - * @param {!string} key - * @return {Splitter} - */ -Oktavia.prototype.getSplitter$S = function (key) { - if (this._metadataLabels.indexOf(key) === - 1) { - throw new Error('Metadata name ' + key + " does't exists"); - } - return (function (v) { - if (! (v == null || v instanceof Splitter)) { - debugger; - throw new Error("[src/oktavia.jsx:88:36] detected invalid cast, value is not an instance of the designated type or null\n return this._metadatas[key] as Splitter;\n ^^\n"); - } - return v; - }(this._metadatas[key])); -}; - -/** - * @param {!string} key - * @param {Array.<undefined|!string>} headers - * @return {Table} - */ -Oktavia.prototype.addTable$SAS = function (key, headers) { - /** @type {Table} */ - var table; - if (this._metadataLabels.indexOf(key) !== - 1) { - throw new Error('Metadata name ' + key + ' is already exists'); - } - this._metadataLabels.push(key); - table = new Table$LOktavia$AS(this, headers); - this._metadatas[key] = table; - return table; -}; - -/** - * @param {!string} key - * @return {Table} - */ -Oktavia.prototype.getTable$S = function (key) { - if (this._metadataLabels.indexOf(key) === - 1) { - throw new Error('Metadata name ' + key + " does't exists"); - } - return (function (v) { - if (! (v == null || v instanceof Table)) { - debugger; - throw new Error("[src/oktavia.jsx:109:36] detected invalid cast, value is not an instance of the designated type or null\n return this._metadatas[key] as Table;\n ^^\n"); - } - return v; - }(this._metadatas[key])); -}; - -/** - * @param {!string} key - * @return {Block} - */ -Oktavia.prototype.addBlock$S = function (key) { - /** @type {Block} */ - var block; - if (this._metadataLabels.indexOf(key) !== - 1) { - throw new Error('Metadata name ' + key + ' is already exists'); - } - this._metadataLabels.push(key); - block = new Block$LOktavia$(this); - this._metadatas[key] = block; - return block; -}; - -/** - * @param {!string} key - * @return {Block} - */ -Oktavia.prototype.getBlock$S = function (key) { - if (this._metadataLabels.indexOf(key) === - 1) { - throw new Error('Metadata name ' + key + " does't exists"); - } - return (function (v) { - if (! (v == null || v instanceof Block)) { - debugger; - throw new Error("[src/oktavia.jsx:130:36] detected invalid cast, value is not an instance of the designated type or null\n return this._metadatas[key] as Block;\n ^^\n"); - } - return v; - }(this._metadatas[key])); -}; - -/** - */ -Oktavia.prototype.addEndOfBlock$ = function () { - this._fmindex.push$S(Oktavia.eob); -}; - -/** - * @param {!string} words - */ -Oktavia.prototype.addWord$S = function (words) { - /** @type {Array.<undefined|!string>} */ - var str; - /** @type {!number} */ - var i; - /** @type {!number} */ - var charCode; - /** @type {undefined|!string} */ - var newCharCode; - str = [ ]; - str.length = words.length; - for (i = 0; i < words.length; i++) { - charCode = words.charCodeAt(i); - newCharCode = this._utf162compressCode[charCode]; - if (newCharCode == null) { - newCharCode = String.fromCharCode(this._compressCode2utf16.length); - this._utf162compressCode[charCode] = newCharCode; - this._compressCode2utf16.push(String.fromCharCode(charCode)); - } - str.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/oktavia.jsx:152:21] null access\n str.push(newCharCode);\n ^^^^^^^^^^^\n"); - } - return v; - }(newCharCode))); - } - this._fmindex.push$S(str.join('')); -}; - -/** - * @param {!string} words - * @param {!boolean} stemming - */ -Oktavia.prototype.addWord$SB = function (words, stemming) { - /** @type {Array.<undefined|!string>} */ - var wordList; - /** @type {!number} */ - var i; - /** @type {undefined|!string} */ - var originalWord; - /** @type {!string} */ - var headSmall; - /** @type {!string} */ - var baseWord; - /** @type {!string} */ - var compressedCodeWord; - /** @type {Array.<undefined|!string>} */ - var stemmedList; - this.addWord$S(words); - if (stemming && this._stemmer) { - wordList = words.split(/\s+/); - for (i = 0; i < wordList.length; i++) { - originalWord = wordList[i]; - headSmall = originalWord.slice(0, 1).toLowerCase() + originalWord.slice(1); - baseWord = this._stemmer.stemWord$S(originalWord.toLowerCase()); - if (originalWord.indexOf(baseWord) === - 1 && headSmall.indexOf(baseWord) === - 1) { - compressedCodeWord = this._convertToCompressionCode$S((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/oktavia.jsx:170:76] null access\n var compressedCodeWord = this._convertToCompressionCode(originalWord);\n ^^^^^^^^^^^^\n"); - } - return v; - }(originalWord))); - stemmedList = this._stemmingResult[baseWord]; - if (! stemmedList) { - stemmedList = [ compressedCodeWord ]; - this._stemmingResult[baseWord] = stemmedList; - } else { - if (stemmedList.indexOf(compressedCodeWord) === - 1) { - stemmedList.push(compressedCodeWord); - } - } - } - } - } -}; - -/** - * @param {!string} keyword - * @return {!string} - */ -Oktavia.prototype._convertToCompressionCode$S = function (keyword) { - /** @type {Array.<undefined|!string>} */ - var resultChars; - /** @type {!number} */ - var i; - /** @type {undefined|!string} */ - var chr; - resultChars = [ ]; - for (i = 0; i < keyword.length; i++) { - chr = this._utf162compressCode[keyword.charCodeAt(i)]; - if (chr == null) { - resultChars.push(Oktavia.unknown); - } else { - resultChars.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/oktavia.jsx:198:33] null access\n resultChars.push(chr);\n ^^^\n"); - } - return v; - }(chr))); - } - } - return resultChars.join(''); -}; - -/** - * @param {!string} keyword - * @param {!boolean} stemming - * @return {Array.<undefined|!number>} - */ -Oktavia.prototype.rawSearch$SB = function (keyword, stemming) { - /** @type {Array.<undefined|!number>} */ - var result; - /** @type {!string} */ - var baseWord; - /** @type {Array.<undefined|!string>} */ - var stemmedList; - /** @type {!number} */ - var i; - /** @type {undefined|!string} */ - var word; - if (stemming) { - result = [ ]; - if (this._stemmer) { - baseWord = this._stemmer.stemWord$S(keyword.toLowerCase()); - stemmedList = this._stemmingResult[baseWord]; - if (stemmedList) { - for (i = 0; i < stemmedList.length; i++) { - word = stemmedList[i]; - result = result.concat(this._fmindex.search$S((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/oktavia.jsx:219:68] null access\n result = result.concat(this._fmindex.search(word));\n ^^^^\n"); - } - return v; - }(word)))); - } - } - } - } else { - result = this._fmindex.search$S(this._convertToCompressionCode$S(keyword)); - } - return result; -}; - -/** - * @param {Array.<undefined|Query>} queries - * @return {SearchSummary} - */ -Oktavia.prototype.search$ALQuery$ = function (queries) { - /** @type {SearchSummary} */ - var summary; - /** @type {!number} */ - var i; - summary = new SearchSummary$LOktavia$(this); - for (i = 0; i < queries.length; i++) { - summary.addQuery$LSingleResult$(this._searchQuery$LQuery$(queries[i])); - } - summary.mergeResult$(); - return summary; -}; - -/** - * @param {Query} query - * @return {SingleResult} - */ -Oktavia.prototype._searchQuery$LQuery$ = function (query) { - /** @type {SingleResult} */ - var result; - /** @type {Array.<undefined|!number>} */ - var positions; - result = new SingleResult$SBB(query.word, query.or, query.not); - if (query.raw) { - positions = this.rawSearch$SB(query.word, false); - } else { - positions = this.rawSearch$SB(query.word, false).concat(this.rawSearch$SB(query.word, true)); - } - this.getPrimaryMetadata$().grouping$LSingleResult$AISB(result, positions, query.word, ! query.raw); - return result; -}; - -/** - */ -Oktavia.prototype.build$ = function () { - this.build$IB(5, false); -}; - -/** - * @param {!number} cacheDensity - * @param {!boolean} verbose - */ -Oktavia.prototype.build$IB = function (cacheDensity, verbose) { - /** @type {!string} */ - var key; - /** @type {!number} */ - var cacheRange; - /** @type {!number} */ - var maxChar; - for (key in this._metadatas) { - this._metadatas[key]._build$(); - } - cacheRange = Math.round(Math.max(1, 100 / Math.min(100, Math.max(0.01, cacheDensity)))); - maxChar = this._compressCode2utf16.length; - this._fmindex.build$SIIB(Oktavia.eof, maxChar, cacheRange, verbose); -}; - -/** - * @return {!string} - */ -Oktavia.prototype.dump$ = function () { - return this.dump$B(false); -}; - -/** - * @param {!boolean} verbose - * @return {!string} - */ -Oktavia.prototype.dump$B = function (verbose) { - /** @type {!string} */ - var headerSource; - /** @type {!string} */ - var header; - /** @type {!string} */ - var fmdata; - /** @type {Array.<undefined|!string>} */ - var result; - /** @type {!number} */ - var i; - /** @type {CompressionReport} */ - var report; - /** @type {undefined|!string} */ - var name; - /** @type {!string} */ - var data; - headerSource = "oktavia-01"; - header = Binary$dumpString$S(headerSource).slice(1); - if (verbose) { - console.log("Source text size: " + (this._fmindex.size$() * 2 + "") + ' bytes'); - } - fmdata = this._fmindex.dump$B(verbose); - result = [ header, fmdata ]; - result.push(Binary$dump16bitNumber$I(this._compressCode2utf16.length)); - for (i = 3; i < this._compressCode2utf16.length; i++) { - result.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/oktavia.jsx:296:48] null access\n result.push(this._compressCode2utf16[i]);\n ^\n"); - } - return v; - }(this._compressCode2utf16[i]))); - } - if (verbose) { - console.log('Char Code Map: ' + (this._compressCode2utf16.length * 2 - 2 + "") + ' bytes'); - } - report = new CompressionReport$(); - result.push(Binary$dumpStringListMap$HASLCompressionReport$(this._stemmingResult, report)); - if (verbose) { - console.log('Stemmed Word Table: ' + (result[result.length - 1].length + "") + ' bytes (' + (report.rate$() + "") + '%)'); - console.log(this._stemmingResult); - } - result.push(Binary$dump16bitNumber$I(this._metadataLabels.length)); - for (i = 0; i < this._metadataLabels.length; i++) { - report = new CompressionReport$(); - name = this._metadataLabels[i]; - data = this._metadatas[name]._dump$LCompressionReport$(report); - result.push(Binary$dumpString$SLCompressionReport$((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/oktavia.jsx:317:42] null access\n result.push(Binary.dumpString(name, report), data);\n ^^^^\n"); - } - return v; - }(name)), report), data); - if (verbose) { - console.log('Meta Data ' + (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/oktavia.jsx:320:43] null access\n console.log(\'Meta Data \' + name + \': \' + (data.length * 2) as string + \' bytes (\' + report.rate() as string + \'%)\');\n ^^^^\n"); - } - return v; - }(name)) + ': ' + (data.length * 2 + "") + ' bytes (' + (report.rate$() + "") + '%)'); - } - } - return result.join(''); -}; - -/** - * @param {!string} data - */ -Oktavia.prototype.load$S = function (data) { - /** @type {!string} */ - var headerSource; - /** @type {!string} */ - var header; - /** @type {!number} */ - var offset; - /** @type {!number} */ - var charCodeCount; - /** @type {!number} */ - var i; - /** @type {!number} */ - var charCode; - /** @type {LoadedStringListMapResult} */ - var stemmedWords; - /** @type {!number} */ - var metadataCount; - /** @type {LoadedStringResult} */ - var nameResult; - /** @type {!string} */ - var name; - /** @type {!number} */ - var type; - headerSource = "oktavia-01"; - header = Binary$dumpString$S(headerSource).slice(1); - if (data.slice(0, 5) !== header) { - throw new Error('Invalid data file'); - } - this._metadatas = ({ }); - this._metadataLabels = [ ]; - offset = 5; - offset = this._fmindex.load$SI(data, offset); - charCodeCount = Binary$load16bitNumber$SI(data, offset++); - this._compressCode2utf16 = [ Oktavia.eof, Oktavia.eob, Oktavia.unknown ]; - this._utf162compressCode = [ Oktavia.eof, Oktavia.eob, Oktavia.unknown ]; - for (i = 3; i < charCodeCount; i++) { - charCode = Binary$load16bitNumber$SI(data, offset++); - this._compressCode2utf16.push(String.fromCharCode(charCode)); - this._utf162compressCode[charCode] = String.fromCharCode(i); - } - stemmedWords = Binary$loadStringListMap$SI(data, offset); - this._stemmingResult = stemmedWords.result; - offset = stemmedWords.offset; - metadataCount = Binary$load16bitNumber$SI(data, offset++); - for (i = 0; i < metadataCount; i++) { - nameResult = Binary$loadString$SI(data, offset); - name = nameResult.result; - offset = nameResult.offset; - type = Binary$load16bitNumber$SI(data, offset++); - switch (type) { - case 0: - offset = Section$_load$LOktavia$SSI(this, name, data, offset); - break; - case 1: - offset = Splitter$_load$LOktavia$SSI(this, name, data, offset); - break; - case 2: - offset = Table$_load$LOktavia$SSI(this, name, data, offset); - break; - case 3: - offset = Block$_load$LOktavia$SSI(this, name, data, offset); - break; - } - } -}; - -/** - * @return {!number} - */ -Oktavia.prototype.contentSize$ = function () { - return this._fmindex.contentSize$(); -}; - -/** - * @param {!number} position - * @return {!number} - */ -Oktavia.prototype.wordPositionType$I = function (position) { - /** @type {!number} */ - var result; - /** @type {!string} */ - var ahead; - result = 0; - if (position === 0) { - result = 4; - } else { - ahead = this._fmindex.getSubstring$II(position - 1, 1); - if (/\s/.test(ahead)) { - result = 2; - } else { - if (/\W/.test(ahead)) { - result = 1; - } else { - if (Oktavia.eob === ahead) { - result = 3; - } - } - } - } - return (result | 0); -}; - -/** - * @param {!number} position - * @param {!number} length - * @return {!string} - */ -Oktavia.prototype._getSubstring$II = function (position, length) { - /** @type {!string} */ - var result; - /** @type {Array.<undefined|!string>} */ - var str; - /** @type {!number} */ - var i; - result = this._fmindex.getSubstring$II(position, length); - str = [ ]; - for (i = 0; i < result.length; i++) { - str.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/oktavia.jsx:415:45] null access\n str.push(this._compressCode2utf16[result.charCodeAt(i)]);\n ^\n"); - } - return v; - }(this._compressCode2utf16[result.charCodeAt(i)]))); - } - return str.join(''); -}; - -/** - * class Binary extends Object - * @constructor - */ -function Binary() { -} - -/** - * @constructor - */ -function Binary$() { -}; - -Binary$.prototype = new Binary; - -/** - * @param {!number} num - * @return {!string} - */ -Binary.dump32bitNumber$N = function (num) { - /** @type {Array.<undefined|!string>} */ - var result; - result = [ String.fromCharCode(Math.floor(num / 65536)) ]; - result.push(String.fromCharCode(num % 65536)); - return result.join(""); -}; - -var Binary$dump32bitNumber$N = Binary.dump32bitNumber$N; - -/** - * @param {!string} buffer - * @param {!number} offset - * @return {!number} - */ -Binary.load32bitNumber$SI = function (buffer, offset) { - /** @type {!number} */ - var result; - result = buffer.charCodeAt(offset) * 65536 + buffer.charCodeAt(offset + 1); - return result; -}; - -var Binary$load32bitNumber$SI = Binary.load32bitNumber$SI; - -/** - * @param {!number} num - * @return {!string} - */ -Binary.dump16bitNumber$I = function (num) { - return String.fromCharCode(num % 65536); -}; - -var Binary$dump16bitNumber$I = Binary.dump16bitNumber$I; - -/** - * @param {!string} buffer - * @param {!number} offset - * @return {!number} - */ -Binary.load16bitNumber$SI = function (buffer, offset) { - return (buffer.charCodeAt(offset) | 0); -}; - -var Binary$load16bitNumber$SI = Binary.load16bitNumber$SI; - -/** - * @param {!string} str - * @return {!string} - */ -Binary.dumpString$S = function (str) { - return Binary$dumpString$SLCompressionReport$(str, null); -}; - -var Binary$dumpString$S = Binary.dumpString$S; - -/** - * @param {!string} str - * @param {CompressionReport} report - * @return {!string} - */ -Binary.dumpString$SLCompressionReport$ = function (str, report) { - /** @type {!number} */ - var length; - /** @type {!boolean} */ - var compress; - /** @type {Array.<undefined|!number>} */ - var charCodes; - /** @type {!number} */ - var i; - /** @type {!number} */ - var charCode; - /** @type {Array.<undefined|!string>} */ - var result; - /** @type {undefined|!number} */ - var bytes; - if (str.length > 32768) { - str = str.slice(0, 32768); - } - length = str.length; - compress = true; - charCodes = [ ]; - for (i = 0; i < length; i++) { - charCode = str.charCodeAt(i); - if (charCode > 255) { - compress = false; - break; - } - charCodes.push(charCode); - } - if (compress) { - result = [ Binary$dump16bitNumber$I(length + 32768) ]; - for (i = 0; i < length; i += 2) { - bytes = charCodes[i]; - if (i !== length - 1) { - bytes += (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:58:38] null access\n bytes += charCodes[i + 1] << 8;\n ^\n"); - } - return v; - }(charCodes[i + 1])) << 8; - } - result.push(Binary$dump16bitNumber$I((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:60:51] null access\n result.push(Binary.dump16bitNumber(bytes));\n ^^^^^\n"); - } - return v; - }(bytes)))); - } - if (report) { - report.add$II(length, Math.ceil(length / 2)); - } - } else { - result = [ Binary$dump16bitNumber$I(length), str ]; - if (report) { - report.add$II(length, length); - } - } - return result.join(''); -}; - -var Binary$dumpString$SLCompressionReport$ = Binary.dumpString$SLCompressionReport$; - -/** - * @param {!string} buffer - * @param {!number} offset - * @return {LoadedStringResult} - */ -Binary.loadString$SI = function (buffer, offset) { - return new LoadedStringResult$SI(buffer, offset); -}; - -var Binary$loadString$SI = Binary.loadString$SI; - -/** - * @param {Array.<undefined|!string>} strList - * @return {!string} - */ -Binary.dumpStringList$AS = function (strList) { - return Binary$dumpStringList$ASLCompressionReport$(strList, null); -}; - -var Binary$dumpStringList$AS = Binary.dumpStringList$AS; - -/** - * @param {Array.<undefined|!string>} strList - * @param {CompressionReport} report - * @return {!string} - */ -Binary.dumpStringList$ASLCompressionReport$ = function (strList, report) { - /** @type {Array.<undefined|!string>} */ - var result; - /** @type {!number} */ - var i; - result = [ Binary$dump32bitNumber$N(strList.length) ]; - for (i = 0; i < strList.length; i++) { - result.push(Binary$dumpString$SLCompressionReport$((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:93:49] null access\n result.push(Binary.dumpString(strList[i], report));\n ^\n"); - } - return v; - }(strList[i])), report)); - } - return result.join(''); -}; - -var Binary$dumpStringList$ASLCompressionReport$ = Binary.dumpStringList$ASLCompressionReport$; - -/** - * @param {!string} buffer - * @param {!number} offset - * @return {LoadedStringListResult} - */ -Binary.loadStringList$SI = function (buffer, offset) { - return new LoadedStringListResult$SI(buffer, offset); -}; - -var Binary$loadStringList$SI = Binary.loadStringList$SI; - -/** - * @param {Object.<string, undefined|Array.<undefined|!string>>} strMap - * @return {!string} - */ -Binary.dumpStringListMap$HAS = function (strMap) { - return Binary$dumpStringListMap$HASLCompressionReport$(strMap, null); -}; - -var Binary$dumpStringListMap$HAS = Binary.dumpStringListMap$HAS; - -/** - * @param {Object.<string, undefined|Array.<undefined|!string>>} strMap - * @param {CompressionReport} report - * @return {!string} - */ -Binary.dumpStringListMap$HASLCompressionReport$ = function (strMap, report) { - /** @type {Array.<undefined|!string>} */ - var result; - /** @type {!number} */ - var counter; - /** @type {!string} */ - var key; - result = [ ]; - counter = 0; - for (key in strMap) { - result.push(Binary$dumpString$SLCompressionReport$(key, report)); - result.push(Binary$dumpStringList$ASLCompressionReport$(strMap[key], report)); - counter++; - } - return Binary$dump32bitNumber$N(counter) + result.join(''); -}; - -var Binary$dumpStringListMap$HASLCompressionReport$ = Binary.dumpStringListMap$HASLCompressionReport$; - -/** - * @param {!string} buffer - * @param {!number} offset - * @return {LoadedStringListMapResult} - */ -Binary.loadStringListMap$SI = function (buffer, offset) { - return new LoadedStringListMapResult$SI(buffer, offset); -}; - -var Binary$loadStringListMap$SI = Binary.loadStringListMap$SI; - -/** - * @param {Array.<undefined|!number>} array - * @return {!string} - */ -Binary.dump32bitNumberList$AN = function (array) { - return Binary$dump32bitNumberList$ANLCompressionReport$(array, null); -}; - -var Binary$dump32bitNumberList$AN = Binary.dump32bitNumberList$AN; - -/** - * @param {Array.<undefined|!number>} array - * @param {CompressionReport} report - * @return {!string} - */ -Binary.dump32bitNumberList$ANLCompressionReport$ = function (array, report) { - /** @type {Array.<undefined|!string>} */ - var result; - /** @type {!number} */ - var index; - /** @type {!number} */ - var inputLength; - /** @type {!number} */ - var length; - /** @type {!string} */ - var resultString; - result = [ Binary$dump32bitNumber$N(array.length) ]; - index = 0; - inputLength = array.length; - while (index < inputLength) { - if (array[index] == 0) { - length = Binary$_countZero$ANI(array, index); - result.push(Binary$_zeroBlock$I(length)); - index += length; - } else { - if (Binary$_shouldZebraCode$ANI(array, index)) { - result.push(Binary$_createZebraCode$ANI(array, index)); - index = Math.min(array.length, index + 15); - } else { - length = Binary$_searchDoubleZero$ANI(array, index); - result.push(Binary$_nonZeroBlock$ANII(array, index, length)); - if (length === 0) { - throw new Error(''); - } - index += length; - } - } - } - resultString = result.join(''); - if (report) { - report.add$II(array.length * 2 + 2, resultString.length); - } - return resultString; -}; - -var Binary$dump32bitNumberList$ANLCompressionReport$ = Binary.dump32bitNumberList$ANLCompressionReport$; - -/** - * @param {!string} buffer - * @param {!number} offset - * @return {LoadedNumberListResult} - */ -Binary.load32bitNumberList$SI = function (buffer, offset) { - return new LoadedNumberListResult$SI(buffer, offset); -}; - -var Binary$load32bitNumberList$SI = Binary.load32bitNumberList$SI; - -/** - * @param {Array.<undefined|!number>} array - * @param {!number} offset - * @return {!number} - */ -Binary._countZero$ANI = function (array, offset) { - /** @type {!number} */ - var i; - for (i = offset; i < array.length; i++) { - if (array[i] != 0) { - return (i - offset | 0); - } - } - return (array.length - offset | 0); -}; - -var Binary$_countZero$ANI = Binary._countZero$ANI; - -/** - * @param {!number} length - * @return {!string} - */ -Binary._zeroBlock$I = function (length) { - /** @type {Array.<undefined|!string>} */ - var result; - result = [ ]; - while (length > 0) { - if (length > 16384) { - result.push(Binary$dump16bitNumber$I(16384 - 1)); - length -= 16384; - } else { - result.push(Binary$dump16bitNumber$I(length - 1)); - length = 0; - } - } - return result.join(''); -}; - -var Binary$_zeroBlock$I = Binary._zeroBlock$I; - -/** - * @param {Array.<undefined|!number>} array - * @param {!number} offset - * @return {!boolean} - */ -Binary._shouldZebraCode$ANI = function (array, offset) { - /** @type {!number} */ - var change; - /** @type {!boolean} */ - var isLastZero; - /** @type {!number} */ - var i; - if (array.length - offset < 16) { - return true; - } - change = 0; - isLastZero = false; - for (i = offset; i < offset + 15; i++) { - if (array[i] == 0) { - if (! isLastZero) { - isLastZero = true; - change++; - } - } else { - if (isLastZero) { - isLastZero = false; - change++; - } - } - } - return change > 2; -}; - -var Binary$_shouldZebraCode$ANI = Binary._shouldZebraCode$ANI; - -/** - * @param {Array.<undefined|!number>} array - * @param {!number} offset - * @return {!number} - */ -Binary._searchDoubleZero$ANI = function (array, offset) { - /** @type {!boolean} */ - var isLastZero; - /** @type {!number} */ - var i; - isLastZero = false; - for (i = offset; i < array.length; i++) { - if (array[i] == 0) { - if (isLastZero) { - return (i - offset - 1 | 0); - } - isLastZero = true; - } else { - isLastZero = false; - } - } - return (array.length - offset | 0); -}; - -var Binary$_searchDoubleZero$ANI = Binary._searchDoubleZero$ANI; - -/** - * @param {Array.<undefined|!number>} array - * @param {!number} offset - * @param {!number} length - * @return {!string} - */ -Binary._nonZeroBlock$ANII = function (array, offset, length) { - /** @type {Array.<undefined|!string>} */ - var result; - /** @type {!number} */ - var blockLength; - /** @type {!number} */ - var i; - result = [ ]; - while (length > 0) { - if (length > 16384) { - blockLength = 16384; - length -= 16384; - } else { - blockLength = length; - length = 0; - } - result.push(Binary$dump16bitNumber$I(blockLength - 1 + 0x4000)); - for (i = offset; i < offset + blockLength; i++) { - result.push(Binary$dump32bitNumber$N((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:274:56] null access\n result.push(Binary.dump32bitNumber(array[i]));\n ^\n"); - } - return v; - }(array[i])))); - } - offset += blockLength; - } - return result.join(''); -}; - -var Binary$_nonZeroBlock$ANII = Binary._nonZeroBlock$ANII; - -/** - * @param {Array.<undefined|!number>} array - * @param {!number} offset - * @return {!string} - */ -Binary._createZebraCode$ANI = function (array, offset) { - /** @type {!number} */ - var last; - /** @type {!number} */ - var code; - /** @type {Array.<undefined|!string>} */ - var result; - /** @type {!number} */ - var i; - last = Math.min(offset + 15, array.length); - code = 0x8000; - result = [ ]; - for (i = offset; i < last; i++) { - if (array[i] != 0) { - result.push(Binary$dump32bitNumber$N((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:290:56] null access\n result.push(Binary.dump32bitNumber(array[i]));\n ^\n"); - } - return v; - }(array[i])))); - code = code + (0x1 << i - offset); - } - } - return String.fromCharCode(code) + result.join(''); -}; - -var Binary$_createZebraCode$ANI = Binary._createZebraCode$ANI; - -/** - * @param {!string} str - * @return {!string} - */ -Binary.base64encode$S = function (str) { - /** @type {Array.<undefined|!string>} */ - var out; - /** @type {Array.<undefined|!number>} */ - var source; - /** @type {!number} */ - var i; - /** @type {!number} */ - var code; - /** @type {!number} */ - var len; - /** @type {!number} */ - var c1; - /** @type {undefined|!number} */ - var c2; - /** @type {undefined|!number} */ - var c3; - out = [ ]; - source = [ ]; - for (i = 0; i < str.length; i++) { - code = str.charCodeAt(i); - source.push(code & 0x00ff, code >>> 8); - } - len = str.length * 2; - i = 0; - while (i < len) { - c1 = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:319:23] null access\n var c1 = source[i++] & 0xff;\n ^\n"); - } - return v; - }(source[i++])) & 0xff; - if (i === len) { - out.push(Binary._base64EncodeChars.charAt(c1 >> 2)); - out.push(Binary._base64EncodeChars.charAt((c1 & 0x3) << 4)); - out.push("=="); - break; - } - c2 = source[i++]; - if (i === len) { - out.push(Binary._base64EncodeChars.charAt(c1 >> 2)); - out.push(Binary._base64EncodeChars.charAt((c1 & 0x3) << 4 | ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:331:75] null access\n out.push(Binary._base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)));\n ^^\n"); - } - return v; - }(c2)) & 0xF0) >> 4)); - out.push(Binary._base64EncodeChars.charAt(((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:332:55] null access\n out.push(Binary._base64EncodeChars.charAt((c2 & 0xF) << 2));\n ^^\n"); - } - return v; - }(c2)) & 0xF) << 2)); - out.push("="); - break; - } - c3 = source[i++]; - out.push(Binary._base64EncodeChars.charAt(c1 >> 2)); - out.push(Binary._base64EncodeChars.charAt((c1 & 0x3) << 4 | ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:338:71] null access\n out.push(Binary._base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)));\n ^^\n"); - } - return v; - }(c2)) & 0xF0) >> 4)); - out.push(Binary._base64EncodeChars.charAt(((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:339:52] null access\n out.push(Binary._base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)));\n ^^\n"); - } - return v; - }(c2)) & 0xF) << 2 | ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:339:72] null access\n out.push(Binary._base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)));\n ^^\n"); - } - return v; - }(c3)) & 0xC0) >> 6)); - out.push(Binary._base64EncodeChars.charAt((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:340:50] null access\n out.push(Binary._base64EncodeChars.charAt(c3 & 0x3F));\n ^^\n"); - } - return v; - }(c3)) & 0x3F)); - } - return out.join(''); -}; - -var Binary$base64encode$S = Binary.base64encode$S; - -/** - * @param {Array.<undefined|!number>} source - * @return {!string} - */ -Binary._mergeCharCode$AI = function (source) { - /** @type {Array.<undefined|!string>} */ - var result; - /** @type {!number} */ - var i; - result = [ ]; - for (i = 0; i < source.length; i += 2) { - result.push(String.fromCharCode((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:360:50] null access\n result.push(String.fromCharCode(source[i] + (source[i + 1] << 8)));\n ^\n"); - } - return v; - }(source[i])) + ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:360:63] null access\n result.push(String.fromCharCode(source[i] + (source[i + 1] << 8)));\n ^\n"); - } - return v; - }(source[i + 1])) << 8))); - } - return result.join(''); -}; - -var Binary$_mergeCharCode$AI = Binary._mergeCharCode$AI; - -/** - * @param {!string} str - * @return {!string} - */ -Binary.base64decode$S = function (str) { - /** @type {!number} */ - var len; - /** @type {!number} */ - var i; - /** @type {Array.<undefined|!number>} */ - var out; - /** @type {undefined|!number} */ - var c1; - /** @type {undefined|!number} */ - var c2; - /** @type {!number} */ - var c3; - /** @type {!number} */ - var c4; - len = str.length; - i = 0; - out = [ ]; - while (i < len) { - do { - c1 = Binary._base64DecodeChars[str.charCodeAt(i++) & 0xff]; - } while (i < len && c1 == - 1); - if (c1 == - 1) { - break; - } - do { - c2 = Binary._base64DecodeChars[str.charCodeAt(i++) & 0xff]; - } while (i < len && c2 == - 1); - if (c2 == - 1) { - break; - } - out.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:391:18] null access\n out.push((c1 << 2) | ((c2 & 0x30) >> 4));\n ^^\n"); - } - return v; - }(c1)) << 2 | ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:391:31] null access\n out.push((c1 << 2) | ((c2 & 0x30) >> 4));\n ^^\n"); - } - return v; - }(c2)) & 0x30) >> 4); - do { - c3 = str.charCodeAt(i++) & 0xff; - if (c3 === 61) { - return Binary$_mergeCharCode$AI(out); - } - c3 = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:399:42] null access\n c3 = Binary._base64DecodeChars[c3];\n ^\n"); - } - return v; - }(Binary._base64DecodeChars[c3])); - } while (i < len && c3 === - 1); - if (c3 === - 1) { - break; - } - out.push(((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:405:19] null access\n out.push(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));\n ^^\n"); - } - return v; - }(c2)) & 0XF) << 4 | (c3 & 0x3C) >> 2); - do { - c4 = str.charCodeAt(i++) & 0xff; - if (c4 === 61) { - return Binary$_mergeCharCode$AI(out); - } - c4 = ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/binary-util.jsx:414:42] null access\n c4 = Binary._base64DecodeChars[c4];\n ^\n"); - } - return v; - }(Binary._base64DecodeChars[c4])) | 0); - } while (i < len && c4 === - 1); - if (c4 === - 1) { - break; - } - out.push((c3 & 0x03) << 6 | c4); - } - return Binary$_mergeCharCode$AI(out); -}; - -var Binary$base64decode$S = Binary.base64decode$S; - -/** - * class LoadedStringResult extends Object - * @constructor - */ -function LoadedStringResult() { -} - -/** - * @constructor - * @param {!string} data - * @param {!number} offset - */ -function LoadedStringResult$SI(data, offset) { - /** @type {!number} */ - var strLength; - /** @type {Array.<undefined|!string>} */ - var bytes; - /** @type {!number} */ - var i; - /** @type {!number} */ - var code; - this.result = ""; - this.offset = 0; - strLength = Binary$load16bitNumber$SI(data, offset++); - if (strLength > 32767) { - strLength = strLength - 32768; - bytes = [ ]; - for (i = 0; i < strLength; i += 2) { - code = data.charCodeAt(offset); - bytes.push(String.fromCharCode(code & 0x00ff)); - if (i !== strLength - 1) { - bytes.push(String.fromCharCode(code >>> 8)); - } - offset++; - } - this.result = bytes.join(''); - this.offset = offset; - } else { - this.result = data.slice(offset, offset + strLength); - this.offset = (offset + strLength | 0); - } -}; - -LoadedStringResult$SI.prototype = new LoadedStringResult; - -/** - * class LoadedStringListResult extends Object - * @constructor - */ -function LoadedStringListResult() { -} - -/** - * @constructor - * @param {!string} data - * @param {!number} offset - */ -function LoadedStringListResult$SI(data, offset) { - /** @type {!number} */ - var length; - /** @type {!number} */ - var i; - /** @type {!number} */ - var strLength; - /** @type {!string} */ - var resultStr; - /** @type {Array.<undefined|!string>} */ - var bytes; - /** @type {!number} */ - var j; - /** @type {!number} */ - var code; - this.offset = 0; - this.result = [ ]; - length = Binary$load32bitNumber$SI(data, offset); - offset += 2; - for (i = 0; i < length; i++) { - strLength = Binary$load16bitNumber$SI(data, offset++); - if (strLength > 32767) { - strLength = strLength - 32768; - bytes = [ ]; - for (j = 0; j < strLength; j += 2) { - code = data.charCodeAt(offset); - bytes.push(String.fromCharCode(code & 0x00ff)); - if (j !== strLength - 1) { - bytes.push(String.fromCharCode(code >>> 8)); - } - offset++; - } - resultStr = bytes.join(''); - } else { - resultStr = data.slice(offset, offset + strLength); - offset = (offset + strLength | 0); - } - this.result.push(resultStr); - } - this.offset = offset; -}; - -LoadedStringListResult$SI.prototype = new LoadedStringListResult; - -/** - * class LoadedStringListMapResult extends Object - * @constructor - */ -function LoadedStringListMapResult() { -} - -/** - * @constructor - * @param {!string} data - * @param {!number} offset - */ -function LoadedStringListMapResult$SI(data, offset) { - /** @type {!number} */ - var length; - /** @type {!number} */ - var i; - /** @type {LoadedStringResult} */ - var keyResult; - /** @type {LoadedStringListResult} */ - var valueResult; - this.offset = 0; - this.result = ({ }); - length = Binary$load32bitNumber$SI(data, offset); - offset += 2; - for (i = 0; i < length; i++) { - keyResult = Binary$loadString$SI(data, offset); - valueResult = Binary$loadStringList$SI(data, keyResult.offset); - this.result[keyResult.result] = valueResult.result; - offset = valueResult.offset; - } - this.offset = offset; -}; - -LoadedStringListMapResult$SI.prototype = new LoadedStringListMapResult; - -/** - * class LoadedNumberListResult extends Object - * @constructor - */ -function LoadedNumberListResult() { -} - -/** - * @constructor - * @param {!string} data - * @param {!number} offset - */ -function LoadedNumberListResult$SI(data, offset) { - /** @type {!number} */ - var resultLength; - /** @type {!number} */ - var originalOffset; - /** @type {Array.<undefined|!number>} */ - var result; - /** @type {!number} */ - var tag; - /** @type {!number} */ - var length; - /** @type {!number} */ - var i; - this.result = null; - this.offset = 0; - resultLength = Binary$load32bitNumber$SI(data, offset); - originalOffset = offset; - offset += 2; - result = [ ]; - while (result.length < resultLength) { - tag = data.charCodeAt(offset++); - if (tag >>> 15 === 1) { - length = Math.min(resultLength - result.length, 15); - for (i = 0; i < length; i++) { - if (tag >>> i & 0x1) { - result.push(Binary$load32bitNumber$SI(data, offset)); - offset += 2; - } else { - result.push(0); - } - } - } else { - if (tag >>> 14 === 1) { - length = tag - 0x4000 + 1; - for (i = 0; i < length; i++) { - result.push(Binary$load32bitNumber$SI(data, offset)); - offset += 2; - } - } else { - length = tag + 1; - for (i = 0; i < length; i++) { - result.push(0); - } - } - } - } - this.result = result; - this.offset = offset; -}; - -LoadedNumberListResult$SI.prototype = new LoadedNumberListResult; - -/** - * class CompressionReport extends Object - * @constructor - */ -function CompressionReport() { -} - -/** - * @constructor - */ -function CompressionReport$() { - this.source = 0; - this.result = 0; -}; - -CompressionReport$.prototype = new CompressionReport; - -/** - * @param {!number} source - * @param {!number} result - */ -CompressionReport.prototype.add$II = function (source, result) { - this.source += source; - this.result += result; -}; - -/** - * @return {!number} - */ -CompressionReport.prototype.rate$ = function () { - return (Math.round(this.result * 100.0 / this.source) | 0); -}; - -/** - * class Query extends Object - * @constructor - */ -function Query() { -} - -/** - * @constructor - */ -function Query$() { - this.word = ''; - this.or = false; - this.not = false; - this.raw = false; -}; - -Query$.prototype = new Query; - -/** - * @return {!string} - */ -Query.prototype.toString = function () { - /** @type {Array.<undefined|!string>} */ - var result; - result = [ ]; - if (this.or) { - result.push("OR "); - } - if (this.not) { - result.push("-"); - } - if (this.raw) { - result.push('"', this.word, '"'); - } else { - result.push(this.word); - } - return result.join(''); -}; - -/** - * class QueryStringParser extends Object - * @constructor - */ -function QueryStringParser() { -} - -/** - * @constructor - */ -function QueryStringParser$() { - this.queries = [ ]; -}; - -QueryStringParser$.prototype = new QueryStringParser; - -/** - * @param {!string} queryString - */ -QueryStringParser.prototype.parse$S = function (queryString) { - /** @type {!boolean} */ - var nextOr; - /** @type {!boolean} */ - var nextNot; - /** @type {!number} */ - var currentWordStart; - /** @type {!number} */ - var status; - /** @type {RegExp} */ - var isSpace; - /** @type {!number} */ - var i; - /** @type {!string} */ - var ch; - /** @type {!string} */ - var word; - /** @type {Query} */ - var query; - nextOr = false; - nextNot = false; - currentWordStart = 0; - status = 0; - isSpace = /[\s\u3000]/; - for (i = 0; i < queryString.length; i++) { - ch = queryString.charAt(i); - switch (status) { - case 0: - if (! isSpace.test(ch)) { - if (ch === '-') { - nextNot = true; - } else { - if (ch === '"') { - currentWordStart = i + 1; - status = 2; - } else { - currentWordStart = i; - status = 1; - } - } - } else { - nextNot = false; - } - break; - case 1: - if (isSpace.test(ch)) { - word = queryString.slice(currentWordStart, i); - if (word === 'OR') { - nextOr = true; - } else { - query = new Query$(); - query.word = word; - query.or = nextOr; - query.not = nextNot; - this.queries.push(query); - nextOr = false; - nextNot = false; - } - status = 0; - } - break; - case 2: - if (ch === '"') { - word = queryString.slice(currentWordStart, i); - query = new Query$(); - query.word = word; - query.or = nextOr; - query.not = nextNot; - query.raw = true; - this.queries.push(query); - nextOr = false; - nextNot = false; - status = 0; - } - break; - } - } - switch (status) { - case 0: - break; - case 1: - query = new Query$(); - word = queryString.slice(currentWordStart, queryString.length); - if (word !== 'OR') { - query.word = word; - query.or = nextOr; - query.not = nextNot; - this.queries.push(query); - } - break; - case 2: - query = new Query$(); - query.word = queryString.slice(currentWordStart, queryString.length); - query.or = nextOr; - query.not = nextNot; - query.raw = true; - this.queries.push(query); - break; - } -}; - -/** - * class Proposal extends Object - * @constructor - */ -function Proposal() { -} - -/** - * @constructor - * @param {!number} omit - * @param {!number} expect - */ -function Proposal$II(omit, expect) { - this.omit = omit; - this.expect = expect; -}; - -Proposal$II.prototype = new Proposal; - -/** - * class Position extends Object - * @constructor - */ -function Position() { -} - -/** - * @constructor - * @param {!string} word - * @param {!number} position - * @param {!boolean} stemmed - */ -function Position$SIB(word, position, stemmed) { - this.word = word; - this.position = position; - this.stemmed = stemmed; -}; - -Position$SIB.prototype = new Position; - -/** - * class SearchUnit extends Object - * @constructor - */ -function SearchUnit() { -} - -/** - * @constructor - * @param {!number} id - */ -function SearchUnit$I(id) { - this.positions = ({ }); - this.id = id; - this._size = 0; - this.score = 0; - this.startPosition = (- 1 | 0); -}; - -SearchUnit$I.prototype = new SearchUnit; - -/** - * @param {!string} word - * @param {!number} position - * @param {!boolean} stemmed - */ -SearchUnit.prototype.addPosition$SIB = function (word, position, stemmed) { - /** @type {Position} */ - var positionObj; - positionObj = this.positions[position + ""]; - if (! positionObj) { - this._size++; - this.positions[position + ""] = new Position$SIB(word, position, stemmed); - } else { - if (positionObj.word.length < word.length) { - positionObj.word = word; - } - positionObj.stemmed = positionObj.stemmed && stemmed; - } -}; - -/** - * @param {!number} position - * @return {Position} - */ -SearchUnit.prototype.get$I = function (position) { - return this.positions[position + ""]; -}; - -/** - * @return {!number} - */ -SearchUnit.prototype.size$ = function () { - return this._size; -}; - -/** - * @param {SearchUnit} rhs - */ -SearchUnit.prototype.merge$LSearchUnit$ = function (rhs) { - /** @type {!string} */ - var position; - /** @type {Position} */ - var pos; - for (position in rhs.positions) { - pos = rhs.positions[position]; - this.addPosition$SIB(pos.word, pos.position, pos.stemmed); - } -}; - -/** - * @return {Array.<undefined|Position>} - */ -SearchUnit.prototype.getPositions$ = function () { - var $this = this; - /** @type {Array.<undefined|Position>} */ - var result; - /** @type {!string} */ - var pos; - result = [ ]; - for (pos in this.positions) { - result.push(this.positions[pos]); - } - result.sort((function (a, b) { - return a.position - b.position; - })); - return result; -}; - -/** - * class SingleResult extends Object - * @constructor - */ -function SingleResult() { -} - -/** - * @constructor - */ -function SingleResult$() { - this.units = [ ]; - this.unitIds = [ ]; - this.or = false; - this.not = false; - this.searchWord = ''; -}; - -SingleResult$.prototype = new SingleResult; - -/** - * @constructor - * @param {!string} searchWord - * @param {!boolean} or - * @param {!boolean} not - */ -function SingleResult$SBB(searchWord, or, not) { - this.units = [ ]; - this.unitIds = [ ]; - this.or = or; - this.not = not; - this.searchWord = searchWord; -}; - -SingleResult$SBB.prototype = new SingleResult; - -/** - * @param {!number} unitId - * @return {SearchUnit} - */ -SingleResult.prototype.getSearchUnit$I = function (unitId) { - /** @type {!number} */ - var existing; - /** @type {SearchUnit} */ - var result; - existing = this.unitIds.indexOf(unitId); - if (existing === - 1) { - result = new SearchUnit$I(unitId); - this.units.push(result); - this.unitIds.push(unitId); - } else { - result = this.units[existing]; - } - return result; -}; - -/** - * @param {SingleResult} rhs - * @return {SingleResult} - */ -SingleResult.prototype.merge$LSingleResult$ = function (rhs) { - /** @type {SingleResult} */ - var result; - result = new SingleResult$(); - if (rhs.or) { - this._orMerge$LSingleResult$LSingleResult$(result, rhs); - } else { - if (rhs.not) { - this._notMerge$LSingleResult$LSingleResult$(result, rhs); - } else { - this._andMerge$LSingleResult$LSingleResult$(result, rhs); - } - } - return result; -}; - -/** - * @return {!number} - */ -SingleResult.prototype.size$ = function () { - return (this.units.length | 0); -}; - -/** - * @param {SingleResult} result - * @param {SingleResult} rhs - */ -SingleResult.prototype._andMerge$LSingleResult$LSingleResult$ = function (result, rhs) { - /** @type {!number} */ - var i; - /** @type {undefined|!number} */ - var id; - /** @type {SearchUnit} */ - var lhsSection; - for (i = 0; i < this.unitIds.length; i++) { - id = this.unitIds[i]; - if (rhs.unitIds.indexOf(id) !== - 1) { - lhsSection = this.units[i]; - result.unitIds.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/search-result.jsx:168:36] null access\n result.unitIds.push(id);\n ^^\n"); - } - return v; - }(id))); - result.units.push(lhsSection); - } - } -}; - -/** - * @param {SingleResult} result - * @param {SingleResult} rhs - */ -SingleResult.prototype._orMerge$LSingleResult$LSingleResult$ = function (result, rhs) { - /** @type {!number} */ - var i; - /** @type {undefined|!number} */ - var id; - /** @type {SearchUnit} */ - var rhsSection; - /** @type {SearchUnit} */ - var lhsSection; - result.unitIds = this.unitIds.slice(0, this.unitIds.length); - result.units = this.units.slice(0, this.units.length); - for (i = 0; i < rhs.unitIds.length; i++) { - id = rhs.unitIds[i]; - rhsSection = rhs.units[i]; - if (result.unitIds.indexOf(id) !== - 1) { - lhsSection = result.units[result.unitIds.indexOf(id)]; - lhsSection.merge$LSearchUnit$(rhsSection); - } else { - result.unitIds.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/search-result.jsx:190:36] null access\n result.unitIds.push(id);\n ^^\n"); - } - return v; - }(id))); - result.units.push(rhsSection); - } - } -}; - -/** - * @param {SingleResult} result - * @param {SingleResult} rhs - */ -SingleResult.prototype._notMerge$LSingleResult$LSingleResult$ = function (result, rhs) { - /** @type {!number} */ - var i; - /** @type {undefined|!number} */ - var id; - /** @type {SearchUnit} */ - var lhsSection; - for (i = 0; i < this.unitIds.length; i++) { - id = this.unitIds[i]; - if (rhs.unitIds.indexOf(id) === - 1) { - lhsSection = this.units[i]; - result.unitIds.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/search-result.jsx:204:36] null access\n result.unitIds.push(id);\n ^^\n"); - } - return v; - }(id))); - result.units.push(lhsSection); - } - } -}; - -/** - * class SearchSummary extends Object - * @constructor - */ -function SearchSummary() { -} - -/** - * @constructor - */ -function SearchSummary$() { - this.sourceResults = [ ]; - this.result = null; - this.oktavia = null; -}; - -SearchSummary$.prototype = new SearchSummary; - -/** - * @constructor - * @param {Oktavia} oktavia - */ -function SearchSummary$LOktavia$(oktavia) { - this.sourceResults = [ ]; - this.result = null; - this.oktavia = oktavia; -}; - -SearchSummary$LOktavia$.prototype = new SearchSummary; - -/** - * @param {SingleResult} result - */ -SearchSummary.prototype.addQuery$LSingleResult$ = function (result) { - this.sourceResults.push(result); -}; - -/** - */ -SearchSummary.prototype.mergeResult$ = function () { - this.result = this.mergeResult$ALSingleResult$(this.sourceResults); -}; - -/** - * @param {Array.<undefined|SingleResult>} results - * @return {SingleResult} - */ -SearchSummary.prototype.mergeResult$ALSingleResult$ = function (results) { - /** @type {SingleResult} */ - var rhs; - /** @type {!number} */ - var i; - rhs = results[0]; - for (i = 1; i < results.length; i++) { - rhs = rhs.merge$LSingleResult$(results[i]); - } - return rhs; -}; - -/** - * @return {Array.<undefined|Proposal>} - */ -SearchSummary.prototype.getProposal$ = function () { - var $this = this; - /** @type {Array.<undefined|Proposal>} */ - var proposals; - /** @type {!number} */ - var i; - /** @type {Array.<undefined|SingleResult>} */ - var tmpSource; - /** @type {!number} */ - var j; - /** @type {SingleResult} */ - var result; - proposals = [ ]; - for (i = 0; i < this.sourceResults.length; i++) { - tmpSource = [ ]; - for (j = 0; j < this.sourceResults.length; j++) { - if (i !== j) { - tmpSource.push(this.sourceResults[j]); - } - } - result = this.mergeResult$ALSingleResult$(tmpSource); - proposals.push(new Proposal$II(i, result.size$())); - } - proposals.sort((function (a, b) { - return b.expect - a.expect; - })); - return proposals; -}; - -/** - * @return {Array.<undefined|SearchUnit>} - */ -SearchSummary.prototype.getSortedResult$ = function () { - var $this = this; - /** @type {Array.<undefined|SearchUnit>} */ - var result; - result = this.result.units.slice(0, this.result.units.length); - result.sort((function (a, b) { - return b.score - a.score; - })); - return result; -}; - -/** - * @return {!number} - */ -SearchSummary.prototype.size$ = function () { - return this.result.size$(); -}; - -/** - * @param {SingleResult} result - */ -SearchSummary.prototype.add$LSingleResult$ = function (result) { - this.sourceResults.push(result); -}; - -/** - * class Style extends Object - * @constructor - */ -function Style() { -} - -/** - * @constructor - * @param {!string} mode - */ -function Style$S(mode) { - this.styles = null; - this.escapeHTML = false; - switch (mode) { - case 'console': - this.styles = Style.console; - break; - case 'html': - this.styles = Style.html; - break; - case 'ignore': - this.styles = Style.ignore; - break; - default: - this.styles = Style.ignore; - break; - } - this.escapeHTML = mode === 'html'; -}; - -Style$S.prototype = new Style; - -/** - * @param {!string} source - * @return {!string} - */ -Style.prototype.convert$S = function (source) { - /** @type {_HTMLHandler} */ - var handler; - /** @type {SAXParser} */ - var parser; - handler = new _HTMLHandler$HASB(this.styles, this.escapeHTML); - parser = new SAXParser$LSAXHandler$(handler); - parser.parse$S(source); - return handler.result$(); -}; - -/** - * class Stemmer - * @constructor - */ -function Stemmer() { -} - -Stemmer.prototype.$__jsx_implements_Stemmer = true; - -/** - * @constructor - */ -function Stemmer$() { -}; - -Stemmer$.prototype = new Stemmer; - -/** - * class BaseStemmer extends Object - * @constructor - */ -function BaseStemmer() { -} - -$__jsx_merge_interface(BaseStemmer, Stemmer); - -/** - * @constructor - */ -function BaseStemmer$() { - Stemmer$.call(this); - this.current = ""; - this.cursor = 0; - this.limit = 0; - this.limit_backward = 0; - this.bra = 0; - this.ket = 0; - this.cache = ({ }); - this.setCurrent$S(""); -}; - -BaseStemmer$.prototype = new BaseStemmer; - -/** - * @param {!string} value - */ -BaseStemmer.prototype.setCurrent$S = function (value) { - this.current = value; - this.cursor = 0; - this.limit = this.current.length; - this.limit_backward = 0; - this.bra = this.cursor; - this.ket = this.limit; -}; - -/** - * @return {!string} - */ -BaseStemmer.prototype.getCurrent$ = function () { - return this.current; -}; - -/** - * @param {BaseStemmer} other - */ -BaseStemmer.prototype.copy_from$LBaseStemmer$ = function (other) { - this.current = other.current; - this.cursor = other.cursor; - this.limit = other.limit; - this.limit_backward = other.limit_backward; - this.bra = other.bra; - this.ket = other.ket; -}; - -/** - * @param {Array.<undefined|!number>} s - * @param {!number} min - * @param {!number} max - * @return {!boolean} - */ -BaseStemmer.prototype.in_grouping$AIII = function (s, min, max) { - /** @type {!number} */ - var ch; - if (this.cursor >= this.limit) { - return false; - } - ch = this.current.charCodeAt(this.cursor); - if (ch > max || ch < min) { - return false; - } - ch -= min; - if (((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:59:10] null access\n if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;\n ^\n"); - } - return v; - }(s[ch >>> 3])) & 0x1 << (ch & 0x7)) === 0) { - return false; - } - this.cursor++; - return true; -}; - -/** - * @param {Array.<undefined|!number>} s - * @param {!number} min - * @param {!number} max - * @return {!boolean} - */ -BaseStemmer.prototype.in_grouping_b$AIII = function (s, min, max) { - /** @type {!number} */ - var ch; - if (this.cursor <= this.limit_backward) { - return false; - } - ch = this.current.charCodeAt(this.cursor - 1); - if (ch > max || ch < min) { - return false; - } - ch -= min; - if (((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:70:10] null access\n if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;\n ^\n"); - } - return v; - }(s[ch >>> 3])) & 0x1 << (ch & 0x7)) === 0) { - return false; - } - this.cursor--; - return true; -}; - -/** - * @param {Array.<undefined|!number>} s - * @param {!number} min - * @param {!number} max - * @return {!boolean} - */ -BaseStemmer.prototype.out_grouping$AIII = function (s, min, max) { - /** @type {!number} */ - var ch; - if (this.cursor >= this.limit) { - return false; - } - ch = this.current.charCodeAt(this.cursor); - if (ch > max || ch < min) { - this.cursor++; - return true; - } - ch -= min; - if (((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:84:10] null access\n if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {\n ^\n"); - } - return v; - }(s[ch >>> 3])) & 0X1 << (ch & 0x7)) === 0) { - this.cursor++; - return true; - } - return false; -}; - -/** - * @param {Array.<undefined|!number>} s - * @param {!number} min - * @param {!number} max - * @return {!boolean} - */ -BaseStemmer.prototype.out_grouping_b$AIII = function (s, min, max) { - /** @type {!number} */ - var ch; - if (this.cursor <= this.limit_backward) { - return false; - } - ch = this.current.charCodeAt(this.cursor - 1); - if (ch > max || ch < min) { - this.cursor--; - return true; - } - ch -= min; - if (((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:100:10] null access\n if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {\n ^\n"); - } - return v; - }(s[ch >>> 3])) & 0x1 << (ch & 0x7)) === 0) { - this.cursor--; - return true; - } - return false; -}; - -/** - * @param {!number} min - * @param {!number} max - * @return {!boolean} - */ -BaseStemmer.prototype.in_range$II = function (min, max) { - /** @type {!number} */ - var ch; - if (this.cursor >= this.limit) { - return false; - } - ch = this.current.charCodeAt(this.cursor); - if (ch > max || ch < min) { - return false; - } - this.cursor++; - return true; -}; - -/** - * @param {!number} min - * @param {!number} max - * @return {!boolean} - */ -BaseStemmer.prototype.in_range_b$II = function (min, max) { - /** @type {!number} */ - var ch; - if (this.cursor <= this.limit_backward) { - return false; - } - ch = this.current.charCodeAt(this.cursor - 1); - if (ch > max || ch < min) { - return false; - } - this.cursor--; - return true; -}; - -/** - * @param {!number} min - * @param {!number} max - * @return {!boolean} - */ -BaseStemmer.prototype.out_range$II = function (min, max) { - /** @type {!number} */ - var ch; - if (this.cursor >= this.limit) { - return false; - } - ch = this.current.charCodeAt(this.cursor); - if (! (ch > max || ch < min)) { - return false; - } - this.cursor++; - return true; -}; - -/** - * @param {!number} min - * @param {!number} max - * @return {!boolean} - */ -BaseStemmer.prototype.out_range_b$II = function (min, max) { - /** @type {!number} */ - var ch; - if (this.cursor <= this.limit_backward) { - return false; - } - ch = this.current.charCodeAt(this.cursor - 1); - if (! (ch > max || ch < min)) { - return false; - } - this.cursor--; - return true; -}; - -/** - * @param {!number} s_size - * @param {!string} s - * @return {!boolean} - */ -BaseStemmer.prototype.eq_s$IS = function (s_size, s) { - if (this.limit - this.cursor < s_size) { - return false; - } - if (this.current.slice(this.cursor, this.cursor + s_size) !== s) { - return false; - } - this.cursor += s_size; - return true; -}; - -/** - * @param {!number} s_size - * @param {!string} s - * @return {!boolean} - */ -BaseStemmer.prototype.eq_s_b$IS = function (s_size, s) { - if (this.cursor - this.limit_backward < s_size) { - return false; - } - if (this.current.slice(this.cursor - s_size, this.cursor) !== s) { - return false; - } - this.cursor -= s_size; - return true; -}; - -/** - * @param {!string} s - * @return {!boolean} - */ -BaseStemmer.prototype.eq_v$S = function (s) { - return this.eq_s$IS(s.length, s); -}; - -/** - * @param {!string} s - * @return {!boolean} - */ -BaseStemmer.prototype.eq_v_b$S = function (s) { - return this.eq_s_b$IS(s.length, s); -}; - -/** - * @param {Array.<undefined|Among>} v - * @param {!number} v_size - * @return {!number} - */ -BaseStemmer.prototype.find_among$ALAmong$I = function (v, v_size) { - /** @type {!number} */ - var i; - /** @type {!number} */ - var j; - /** @type {!number} */ - var c; - /** @type {!number} */ - var l; - /** @type {!number} */ - var common_i; - /** @type {!number} */ - var common_j; - /** @type {!boolean} */ - var first_key_inspected; - /** @type {!number} */ - var k; - /** @type {!number} */ - var diff; - /** @type {!number} */ - var common; - /** @type {Among} */ - var w; - /** @type {!number} */ - var i2; - /** @type {!boolean} */ - var res; - i = 0; - j = v_size; - c = this.cursor; - l = this.limit; - common_i = 0; - common_j = 0; - first_key_inspected = false; - while (true) { - k = i + (j - i >>> 1); - diff = 0; - common = (common_i < common_j ? common_i : common_j); - w = v[k]; - for (i2 = common; i2 < w.s_size; i2++) { - if (c + common === l) { - diff = - 1; - break; - } - diff = this.current.charCodeAt(c + common) - w.s.charCodeAt(i2); - if (diff !== 0) { - break; - } - common++; - } - if (diff < 0) { - j = k; - common_j = common; - } else { - i = k; - common_i = common; - } - if (j - i <= 1) { - if (i > 0) { - break; - } - if (j === i) { - break; - } - if (first_key_inspected) { - break; - } - first_key_inspected = true; - } - } - while (true) { - w = v[i]; - if (common_i >= w.s_size) { - this.cursor = (c + w.s_size | 0); - if (w.method == null) { - return w.result; - } - res = w.method(w.instance); - this.cursor = (c + w.s_size | 0); - if (res) { - return w.result; - } - } - i = w.substring_i; - if (i < 0) { - return 0; - } - } - return (- 1 | 0); -}; - -/** - * @param {Array.<undefined|Among>} v - * @param {!number} v_size - * @return {!number} - */ -BaseStemmer.prototype.find_among_b$ALAmong$I = function (v, v_size) { - /** @type {!number} */ - var i; - /** @type {!number} */ - var j; - /** @type {!number} */ - var c; - /** @type {!number} */ - var lb; - /** @type {!number} */ - var common_i; - /** @type {!number} */ - var common_j; - /** @type {!boolean} */ - var first_key_inspected; - /** @type {!number} */ - var k; - /** @type {!number} */ - var diff; - /** @type {!number} */ - var common; - /** @type {Among} */ - var w; - /** @type {!number} */ - var i2; - /** @type {!boolean} */ - var res; - i = 0; - j = v_size; - c = this.cursor; - lb = this.limit_backward; - common_i = 0; - common_j = 0; - first_key_inspected = false; - while (true) { - k = i + (j - i >> 1); - diff = 0; - common = (common_i < common_j ? common_i : common_j); - w = v[k]; - for (i2 = w.s_size - 1 - common; i2 >= 0; i2--) { - if (c - common === lb) { - diff = - 1; - break; - } - diff = this.current.charCodeAt(c - 1 - common) - w.s.charCodeAt(i2); - if (diff !== 0) { - break; - } - common++; - } - if (diff < 0) { - j = k; - common_j = common; - } else { - i = k; - common_i = common; - } - if (j - i <= 1) { - if (i > 0) { - break; - } - if (j === i) { - break; - } - if (first_key_inspected) { - break; - } - first_key_inspected = true; - } - } - while (true) { - w = v[i]; - if (common_i >= w.s_size) { - this.cursor = (c - w.s_size | 0); - if (w.method == null) { - return w.result; - } - res = w.method(this); - this.cursor = (c - w.s_size | 0); - if (res) { - return w.result; - } - } - i = w.substring_i; - if (i < 0) { - return 0; - } - } - return (- 1 | 0); -}; - -/** - * @param {!number} c_bra - * @param {!number} c_ket - * @param {!string} s - * @return {!number} - */ -BaseStemmer.prototype.replace_s$IIS = function (c_bra, c_ket, s) { - /** @type {!number} */ - var adjustment; - adjustment = s.length - (c_ket - c_bra); - this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket); - this.limit += (adjustment | 0); - if (this.cursor >= c_ket) { - this.cursor += (adjustment | 0); - } else { - if (this.cursor > c_bra) { - this.cursor = c_bra; - } - } - return (adjustment | 0); -}; - -/** - * @return {!boolean} - */ -BaseStemmer.prototype.slice_check$ = function () { - if (this.bra < 0 || this.bra > this.ket || this.ket > this.limit || this.limit > this.current.length) { - return false; - } - return true; -}; - -/** - * @param {!string} s - * @return {!boolean} - */ -BaseStemmer.prototype.slice_from$S = function (s) { - /** @type {!boolean} */ - var result; - result = false; - if (this.slice_check$()) { - this.replace_s$IIS(this.bra, this.ket, s); - result = true; - } - return result; -}; - -/** - * @return {!boolean} - */ -BaseStemmer.prototype.slice_del$ = function () { - return this.slice_from$S(""); -}; - -/** - * @param {!number} c_bra - * @param {!number} c_ket - * @param {!string} s - */ -BaseStemmer.prototype.insert$IIS = function (c_bra, c_ket, s) { - /** @type {!number} */ - var adjustment; - adjustment = this.replace_s$IIS(c_bra, c_ket, s); - if (c_bra <= this.bra) { - this.bra += (adjustment | 0); - } - if (c_bra <= this.ket) { - this.ket += (adjustment | 0); - } -}; - -/** - * @param {!string} s - * @return {!string} - */ -BaseStemmer.prototype.slice_to$S = function (s) { - /** @type {!string} */ - var result; - result = ''; - if (this.slice_check$()) { - result = this.current.slice(this.bra, this.ket); - } - return result; -}; - -/** - * @param {!string} s - * @return {!string} - */ -BaseStemmer.prototype.assign_to$S = function (s) { - return this.current.slice(0, this.limit); -}; - -/** - * @return {!boolean} - */ -BaseStemmer.prototype.stem$ = function () { - return false; -}; - -/** - * @param {!string} word - * @return {!string} - */ -BaseStemmer.prototype.stemWord$S = function (word) { - /** @type {undefined|!string} */ - var result; - result = this.cache['.' + word]; - if (result == null) { - this.setCurrent$S(word); - this.stem$(); - result = this.getCurrent$(); - this.cache['.' + word] = result; - } - return (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:398:15] null access\n return result;\n ^^^^^^\n"); - } - return v; - }(result)); -}; - -/** - * @param {Array.<undefined|!string>} words - * @return {Array.<undefined|!string>} - */ -BaseStemmer.prototype.stemWords$AS = function (words) { - /** @type {Array.<undefined|!string>} */ - var results; - /** @type {!number} */ - var i; - /** @type {undefined|!string} */ - var word; - /** @type {undefined|!string} */ - var result; - results = [ ]; - for (i = 0; i < words.length; i++) { - word = words[i]; - result = this.cache['.' + (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:407:42] null access\n var result = this.cache[\'.\' + word];\n ^^^^\n"); - } - return v; - }(word))]; - if (result == null) { - this.setCurrent$S((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:410:32] null access\n this.setCurrent(word);\n ^^^^\n"); - } - return v; - }(word))); - this.stem$(); - result = this.getCurrent$(); - this.cache['.' + (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:413:33] null access\n this.cache[\'.\' + word] = result;\n ^^^^\n"); - } - return v; - }(word))] = result; - } - results.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/stemmer/base-stemmer.jsx:415:25] null access\n results.push(result);\n ^^^^^^\n"); - } - return v; - }(result))); - } - return results; -}; - -/** - * class EnglishStemmer extends BaseStemmer - * @constructor - */ -function EnglishStemmer() { -} - -EnglishStemmer.prototype = new BaseStemmer; -/** - * @constructor - */ -function EnglishStemmer$() { - BaseStemmer$.call(this); - this.B_Y_found = false; - this.I_p2 = 0; - this.I_p1 = 0; -}; - -EnglishStemmer$.prototype = new EnglishStemmer; - -/** - * @param {EnglishStemmer} other - */ -EnglishStemmer.prototype.copy_from$LEnglishStemmer$ = function (other) { - this.B_Y_found = other.B_Y_found; - this.I_p2 = other.I_p2; - this.I_p1 = other.I_p1; - BaseStemmer.prototype.copy_from$LBaseStemmer$.call(this, other); -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_prelude$ = function () { - /** @type {!number} */ - var v_1; - /** @type {!number} */ - var v_2; - /** @type {!number} */ - var v_3; - /** @type {!number} */ - var v_4; - /** @type {!number} */ - var v_5; - /** @type {!boolean} */ - var lab0; - /** @type {!boolean} */ - var lab1; - /** @type {!boolean} */ - var lab2; - /** @type {!boolean} */ - var lab4; - /** @type {!boolean} */ - var lab6; - this.B_Y_found = false; - v_1 = this.cursor; - lab0 = true; -lab0: - while (lab0 === true) { - lab0 = false; - this.bra = this.cursor; - if (! this.eq_s$IS(1, "'")) { - break lab0; - } - this.ket = this.cursor; - if (! this.slice_del$()) { - return false; - } - } - this.cursor = v_1; - v_2 = this.cursor; - lab1 = true; -lab1: - while (lab1 === true) { - lab1 = false; - this.bra = this.cursor; - if (! this.eq_s$IS(1, "y")) { - break lab1; - } - this.ket = this.cursor; - if (! this.slice_from$S("Y")) { - return false; - } - this.B_Y_found = true; - } - this.cursor = v_2; - v_3 = this.cursor; - lab2 = true; -lab2: - while (lab2 === true) { - lab2 = false; - replab3: - while (true) { - v_4 = this.cursor; - lab4 = true; - lab4: - while (lab4 === true) { - lab4 = false; - golab5: - while (true) { - v_5 = this.cursor; - lab6 = true; - lab6: - while (lab6 === true) { - lab6 = false; - if (! this.in_grouping$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab6; - } - this.bra = this.cursor; - if (! this.eq_s$IS(1, "y")) { - break lab6; - } - this.ket = this.cursor; - this.cursor = v_5; - break golab5; - } - this.cursor = v_5; - if (this.cursor >= this.limit) { - break lab4; - } - this.cursor++; - } - if (! this.slice_from$S("Y")) { - return false; - } - this.B_Y_found = true; - continue replab3; - } - this.cursor = v_4; - break replab3; - } - } - this.cursor = v_3; - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_mark_regions$ = function () { - /** @type {!number} */ - var v_1; - /** @type {!number} */ - var v_2; - /** @type {!boolean} */ - var lab0; - /** @type {!boolean} */ - var lab1; - /** @type {!boolean} */ - var lab2; - /** @type {!boolean} */ - var lab4; - /** @type {!boolean} */ - var lab6; - /** @type {!boolean} */ - var lab8; - /** @type {!boolean} */ - var lab10; - this.I_p1 = this.limit; - this.I_p2 = this.limit; - v_1 = this.cursor; - lab0 = true; -lab0: - while (lab0 === true) { - lab0 = false; - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - v_2 = this.cursor; - lab2 = true; - lab2: - while (lab2 === true) { - lab2 = false; - if (this.find_among$ALAmong$I(EnglishStemmer.a_0, 3) === 0) { - break lab2; - } - break lab1; - } - this.cursor = v_2; - golab3: - while (true) { - lab4 = true; - lab4: - while (lab4 === true) { - lab4 = false; - if (! this.in_grouping$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab4; - } - break golab3; - } - if (this.cursor >= this.limit) { - break lab0; - } - this.cursor++; - } - golab5: - while (true) { - lab6 = true; - lab6: - while (lab6 === true) { - lab6 = false; - if (! this.out_grouping$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab6; - } - break golab5; - } - if (this.cursor >= this.limit) { - break lab0; - } - this.cursor++; - } - } - this.I_p1 = this.cursor; - golab7: - while (true) { - lab8 = true; - lab8: - while (lab8 === true) { - lab8 = false; - if (! this.in_grouping$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab8; - } - break golab7; - } - if (this.cursor >= this.limit) { - break lab0; - } - this.cursor++; - } - golab9: - while (true) { - lab10 = true; - lab10: - while (lab10 === true) { - lab10 = false; - if (! this.out_grouping$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab10; - } - break golab9; - } - if (this.cursor >= this.limit) { - break lab0; - } - this.cursor++; - } - this.I_p2 = this.cursor; - } - this.cursor = v_1; - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_shortv$ = function () { - /** @type {!number} */ - var v_1; - /** @type {!boolean} */ - var lab0; - /** @type {!boolean} */ - var lab1; - lab0 = true; -lab0: - while (lab0 === true) { - lab0 = false; - v_1 = this.limit - this.cursor; - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - if (! this.out_grouping_b$AIII(EnglishStemmer.g_v_WXY, 89, 121)) { - break lab1; - } - if (! this.in_grouping_b$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab1; - } - if (! this.out_grouping_b$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab1; - } - break lab0; - } - this.cursor = this.limit - v_1; - if (! this.out_grouping_b$AIII(EnglishStemmer.g_v, 97, 121)) { - return false; - } - if (! this.in_grouping_b$AIII(EnglishStemmer.g_v, 97, 121)) { - return false; - } - if (this.cursor > this.limit_backward) { - return false; - } - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_R1$ = function () { - if (! (this.I_p1 <= this.cursor)) { - return false; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_R2$ = function () { - if (! (this.I_p2 <= this.cursor)) { - return false; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_Step_1a$ = function () { - /** @type {!number} */ - var among_var; - /** @type {!number} */ - var v_1; - /** @type {!number} */ - var v_2; - /** @type {!boolean} */ - var lab0; - /** @type {!boolean} */ - var lab1; - /** @type {!boolean} */ - var lab2; - /** @type {!number} */ - var c; - /** @type {!boolean} */ - var lab4; - v_1 = this.limit - this.cursor; - lab0 = true; -lab0: - while (lab0 === true) { - lab0 = false; - this.ket = this.cursor; - among_var = this.find_among_b$ALAmong$I(EnglishStemmer.a_1, 3); - if (among_var === 0) { - this.cursor = this.limit - v_1; - break lab0; - } - this.bra = this.cursor; - switch (among_var) { - case 0: - this.cursor = this.limit - v_1; - break lab0; - case 1: - if (! this.slice_del$()) { - return false; - } - break; - } - } - this.ket = this.cursor; - among_var = this.find_among_b$ALAmong$I(EnglishStemmer.a_2, 6); - if (among_var === 0) { - return false; - } - this.bra = this.cursor; - switch (among_var) { - case 0: - return false; - case 1: - if (! this.slice_from$S("ss")) { - return false; - } - break; - case 2: - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - v_2 = this.limit - this.cursor; - lab2 = true; - lab2: - while (lab2 === true) { - lab2 = false; - c = (this.cursor - 2 | 0); - if (this.limit_backward > c || c > this.limit) { - break lab2; - } - this.cursor = c; - if (! this.slice_from$S("i")) { - return false; - } - break lab1; - } - this.cursor = this.limit - v_2; - if (! this.slice_from$S("ie")) { - return false; - } - } - break; - case 3: - if (this.cursor <= this.limit_backward) { - return false; - } - this.cursor--; - golab3: - while (true) { - lab4 = true; - lab4: - while (lab4 === true) { - lab4 = false; - if (! this.in_grouping_b$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab4; - } - break golab3; - } - if (this.cursor <= this.limit_backward) { - return false; - } - this.cursor--; - } - if (! this.slice_del$()) { - return false; - } - break; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_Step_1b$ = function () { - /** @type {!number} */ - var among_var; - /** @type {!number} */ - var v_1; - /** @type {!number} */ - var v_3; - /** @type {!number} */ - var v_4; - /** @type {!boolean} */ - var lab1; - /** @type {!number} */ - var c; - this.ket = this.cursor; - among_var = this.find_among_b$ALAmong$I(EnglishStemmer.a_4, 6); - if (among_var === 0) { - return false; - } - this.bra = this.cursor; - switch (among_var) { - case 0: - return false; - case 1: - if (! this.r_R1$()) { - return false; - } - if (! this.slice_from$S("ee")) { - return false; - } - break; - case 2: - v_1 = this.limit - this.cursor; - golab0: - while (true) { - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - if (! this.in_grouping_b$AIII(EnglishStemmer.g_v, 97, 121)) { - break lab1; - } - break golab0; - } - if (this.cursor <= this.limit_backward) { - return false; - } - this.cursor--; - } - this.cursor = this.limit - v_1; - if (! this.slice_del$()) { - return false; - } - v_3 = this.limit - this.cursor; - among_var = this.find_among_b$ALAmong$I(EnglishStemmer.a_3, 13); - if (among_var === 0) { - return false; - } - this.cursor = this.limit - v_3; - switch (among_var) { - case 0: - return false; - case 1: - c = this.cursor; - this.insert$IIS(this.cursor, this.cursor, "e"); - this.cursor = c; - break; - case 2: - this.ket = this.cursor; - if (this.cursor <= this.limit_backward) { - return false; - } - this.cursor--; - this.bra = this.cursor; - if (! this.slice_del$()) { - return false; - } - break; - case 3: - if (this.cursor !== this.I_p1) { - return false; - } - v_4 = this.limit - this.cursor; - if (! this.r_shortv$()) { - return false; - } - this.cursor = this.limit - v_4; - c = this.cursor; - this.insert$IIS(this.cursor, this.cursor, "e"); - this.cursor = c; - break; - } - break; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_Step_1c$ = function () { - /** @type {!number} */ - var v_1; - /** @type {!number} */ - var v_2; - /** @type {!boolean} */ - var lab0; - /** @type {!boolean} */ - var lab1; - /** @type {!boolean} */ - var lab2; - this.ket = this.cursor; - lab0 = true; -lab0: - while (lab0 === true) { - lab0 = false; - v_1 = this.limit - this.cursor; - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - if (! this.eq_s_b$IS(1, "y")) { - break lab1; - } - break lab0; - } - this.cursor = this.limit - v_1; - if (! this.eq_s_b$IS(1, "Y")) { - return false; - } - } - this.bra = this.cursor; - if (! this.out_grouping_b$AIII(EnglishStemmer.g_v, 97, 121)) { - return false; - } - v_2 = this.limit - this.cursor; - lab2 = true; -lab2: - while (lab2 === true) { - lab2 = false; - if (this.cursor > this.limit_backward) { - break lab2; - } - return false; - } - this.cursor = this.limit - v_2; - if (! this.slice_from$S("i")) { - return false; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_Step_2$ = function () { - /** @type {!number} */ - var among_var; - this.ket = this.cursor; - among_var = this.find_among_b$ALAmong$I(EnglishStemmer.a_5, 24); - if (among_var === 0) { - return false; - } - this.bra = this.cursor; - if (! this.r_R1$()) { - return false; - } - switch (among_var) { - case 0: - return false; - case 1: - if (! this.slice_from$S("tion")) { - return false; - } - break; - case 2: - if (! this.slice_from$S("ence")) { - return false; - } - break; - case 3: - if (! this.slice_from$S("ance")) { - return false; - } - break; - case 4: - if (! this.slice_from$S("able")) { - return false; - } - break; - case 5: - if (! this.slice_from$S("ent")) { - return false; - } - break; - case 6: - if (! this.slice_from$S("ize")) { - return false; - } - break; - case 7: - if (! this.slice_from$S("ate")) { - return false; - } - break; - case 8: - if (! this.slice_from$S("al")) { - return false; - } - break; - case 9: - if (! this.slice_from$S("ful")) { - return false; - } - break; - case 10: - if (! this.slice_from$S("ous")) { - return false; - } - break; - case 11: - if (! this.slice_from$S("ive")) { - return false; - } - break; - case 12: - if (! this.slice_from$S("ble")) { - return false; - } - break; - case 13: - if (! this.eq_s_b$IS(1, "l")) { - return false; - } - if (! this.slice_from$S("og")) { - return false; - } - break; - case 14: - if (! this.slice_from$S("ful")) { - return false; - } - break; - case 15: - if (! this.slice_from$S("less")) { - return false; - } - break; - case 16: - if (! this.in_grouping_b$AIII(EnglishStemmer.g_valid_LI, 99, 116)) { - return false; - } - if (! this.slice_del$()) { - return false; - } - break; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_Step_3$ = function () { - /** @type {!number} */ - var among_var; - this.ket = this.cursor; - among_var = this.find_among_b$ALAmong$I(EnglishStemmer.a_6, 9); - if (among_var === 0) { - return false; - } - this.bra = this.cursor; - if (! this.r_R1$()) { - return false; - } - switch (among_var) { - case 0: - return false; - case 1: - if (! this.slice_from$S("tion")) { - return false; - } - break; - case 2: - if (! this.slice_from$S("ate")) { - return false; - } - break; - case 3: - if (! this.slice_from$S("al")) { - return false; - } - break; - case 4: - if (! this.slice_from$S("ic")) { - return false; - } - break; - case 5: - if (! this.slice_del$()) { - return false; - } - break; - case 6: - if (! this.r_R2$()) { - return false; - } - if (! this.slice_del$()) { - return false; - } - break; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_Step_4$ = function () { - /** @type {!number} */ - var among_var; - /** @type {!number} */ - var v_1; - /** @type {!boolean} */ - var lab0; - /** @type {!boolean} */ - var lab1; - this.ket = this.cursor; - among_var = this.find_among_b$ALAmong$I(EnglishStemmer.a_7, 18); - if (among_var === 0) { - return false; - } - this.bra = this.cursor; - if (! this.r_R2$()) { - return false; - } - switch (among_var) { - case 0: - return false; - case 1: - if (! this.slice_del$()) { - return false; - } - break; - case 2: - lab0 = true; - lab0: - while (lab0 === true) { - lab0 = false; - v_1 = this.limit - this.cursor; - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - if (! this.eq_s_b$IS(1, "s")) { - break lab1; - } - break lab0; - } - this.cursor = this.limit - v_1; - if (! this.eq_s_b$IS(1, "t")) { - return false; - } - } - if (! this.slice_del$()) { - return false; - } - break; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_Step_5$ = function () { - /** @type {!number} */ - var among_var; - /** @type {!number} */ - var v_1; - /** @type {!number} */ - var v_2; - /** @type {!boolean} */ - var lab0; - /** @type {!boolean} */ - var lab1; - /** @type {!boolean} */ - var lab2; - this.ket = this.cursor; - among_var = this.find_among_b$ALAmong$I(EnglishStemmer.a_8, 2); - if (among_var === 0) { - return false; - } - this.bra = this.cursor; - switch (among_var) { - case 0: - return false; - case 1: - lab0 = true; - lab0: - while (lab0 === true) { - lab0 = false; - v_1 = this.limit - this.cursor; - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - if (! this.r_R2$()) { - break lab1; - } - break lab0; - } - this.cursor = this.limit - v_1; - if (! this.r_R1$()) { - return false; - } - v_2 = this.limit - this.cursor; - lab2 = true; - lab2: - while (lab2 === true) { - lab2 = false; - if (! this.r_shortv$()) { - break lab2; - } - return false; - } - this.cursor = this.limit - v_2; - } - if (! this.slice_del$()) { - return false; - } - break; - case 2: - if (! this.r_R2$()) { - return false; - } - if (! this.eq_s_b$IS(1, "l")) { - return false; - } - if (! this.slice_del$()) { - return false; - } - break; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_exception2$ = function () { - this.ket = this.cursor; - if (this.find_among_b$ALAmong$I(EnglishStemmer.a_9, 8) === 0) { - return false; - } - this.bra = this.cursor; - if (this.cursor > this.limit_backward) { - return false; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_exception1$ = function () { - /** @type {!number} */ - var among_var; - this.bra = this.cursor; - among_var = this.find_among$ALAmong$I(EnglishStemmer.a_10, 18); - if (among_var === 0) { - return false; - } - this.ket = this.cursor; - if (this.cursor < this.limit) { - return false; - } - switch (among_var) { - case 0: - return false; - case 1: - if (! this.slice_from$S("ski")) { - return false; - } - break; - case 2: - if (! this.slice_from$S("sky")) { - return false; - } - break; - case 3: - if (! this.slice_from$S("die")) { - return false; - } - break; - case 4: - if (! this.slice_from$S("lie")) { - return false; - } - break; - case 5: - if (! this.slice_from$S("tie")) { - return false; - } - break; - case 6: - if (! this.slice_from$S("idl")) { - return false; - } - break; - case 7: - if (! this.slice_from$S("gentl")) { - return false; - } - break; - case 8: - if (! this.slice_from$S("ugli")) { - return false; - } - break; - case 9: - if (! this.slice_from$S("earli")) { - return false; - } - break; - case 10: - if (! this.slice_from$S("onli")) { - return false; - } - break; - case 11: - if (! this.slice_from$S("singl")) { - return false; - } - break; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.r_postlude$ = function () { - /** @type {!number} */ - var v_1; - /** @type {!number} */ - var v_2; - /** @type {!boolean} */ - var lab1; - /** @type {!boolean} */ - var lab3; - if (! this.B_Y_found) { - return false; - } -replab0: - while (true) { - v_1 = this.cursor; - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - golab2: - while (true) { - v_2 = this.cursor; - lab3 = true; - lab3: - while (lab3 === true) { - lab3 = false; - this.bra = this.cursor; - if (! this.eq_s$IS(1, "Y")) { - break lab3; - } - this.ket = this.cursor; - this.cursor = v_2; - break golab2; - } - this.cursor = v_2; - if (this.cursor >= this.limit) { - break lab1; - } - this.cursor++; - } - if (! this.slice_from$S("y")) { - return false; - } - continue replab0; - } - this.cursor = v_1; - break replab0; - } - return true; -}; - -/** - * @return {!boolean} - */ -EnglishStemmer.prototype.stem$ = function () { - /** @type {!number} */ - var v_1; - /** @type {!number} */ - var v_2; - /** @type {!number} */ - var v_3; - /** @type {!number} */ - var v_4; - /** @type {!number} */ - var v_5; - /** @type {!number} */ - var v_6; - /** @type {!number} */ - var v_7; - /** @type {!number} */ - var v_8; - /** @type {!number} */ - var v_9; - /** @type {!number} */ - var v_10; - /** @type {!number} */ - var v_11; - /** @type {!number} */ - var v_12; - /** @type {!number} */ - var v_13; - /** @type {!boolean} */ - var lab0; - /** @type {!boolean} */ - var lab1; - /** @type {!boolean} */ - var lab2; - /** @type {!boolean} */ - var lab3; - /** @type {!number} */ - var c; - /** @type {!boolean} */ - var lab4; - /** @type {!boolean} */ - var lab5; - /** @type {!boolean} */ - var lab6; - /** @type {!boolean} */ - var lab7; - /** @type {!boolean} */ - var lab8; - /** @type {!boolean} */ - var lab9; - /** @type {!boolean} */ - var lab10; - /** @type {!boolean} */ - var lab11; - /** @type {!boolean} */ - var lab12; - /** @type {!boolean} */ - var lab13; - /** @type {!boolean} */ - var lab14; - /** @type {!boolean} */ - var lab15; - lab0 = true; -lab0: - while (lab0 === true) { - lab0 = false; - v_1 = this.cursor; - lab1 = true; - lab1: - while (lab1 === true) { - lab1 = false; - if (! this.r_exception1$()) { - break lab1; - } - break lab0; - } - this.cursor = v_1; - lab2 = true; - lab2: - while (lab2 === true) { - lab2 = false; - v_2 = this.cursor; - lab3 = true; - lab3: - while (lab3 === true) { - lab3 = false; - c = (this.cursor + 3 | 0); - if (0 > c || c > this.limit) { - break lab3; - } - this.cursor = c; - break lab2; - } - this.cursor = v_2; - break lab0; - } - this.cursor = v_1; - v_3 = this.cursor; - lab4 = true; - lab4: - while (lab4 === true) { - lab4 = false; - if (! this.r_prelude$()) { - break lab4; - } - } - this.cursor = v_3; - v_4 = this.cursor; - lab5 = true; - lab5: - while (lab5 === true) { - lab5 = false; - if (! this.r_mark_regions$()) { - break lab5; - } - } - this.cursor = v_4; - this.limit_backward = this.cursor; - this.cursor = this.limit; - v_5 = this.limit - this.cursor; - lab6 = true; - lab6: - while (lab6 === true) { - lab6 = false; - if (! this.r_Step_1a$()) { - break lab6; - } - } - this.cursor = this.limit - v_5; - lab7 = true; - lab7: - while (lab7 === true) { - lab7 = false; - v_6 = this.limit - this.cursor; - lab8 = true; - lab8: - while (lab8 === true) { - lab8 = false; - if (! this.r_exception2$()) { - break lab8; - } - break lab7; - } - this.cursor = this.limit - v_6; - v_7 = this.limit - this.cursor; - lab9 = true; - lab9: - while (lab9 === true) { - lab9 = false; - if (! this.r_Step_1b$()) { - break lab9; - } - } - this.cursor = this.limit - v_7; - v_8 = this.limit - this.cursor; - lab10 = true; - lab10: - while (lab10 === true) { - lab10 = false; - if (! this.r_Step_1c$()) { - break lab10; - } - } - this.cursor = this.limit - v_8; - v_9 = this.limit - this.cursor; - lab11 = true; - lab11: - while (lab11 === true) { - lab11 = false; - if (! this.r_Step_2$()) { - break lab11; - } - } - this.cursor = this.limit - v_9; - v_10 = this.limit - this.cursor; - lab12 = true; - lab12: - while (lab12 === true) { - lab12 = false; - if (! this.r_Step_3$()) { - break lab12; - } - } - this.cursor = this.limit - v_10; - v_11 = this.limit - this.cursor; - lab13 = true; - lab13: - while (lab13 === true) { - lab13 = false; - if (! this.r_Step_4$()) { - break lab13; - } - } - this.cursor = this.limit - v_11; - v_12 = this.limit - this.cursor; - lab14 = true; - lab14: - while (lab14 === true) { - lab14 = false; - if (! this.r_Step_5$()) { - break lab14; - } - } - this.cursor = this.limit - v_12; - } - this.cursor = this.limit_backward; - v_13 = this.cursor; - lab15 = true; - lab15: - while (lab15 === true) { - lab15 = false; - if (! this.r_postlude$()) { - break lab15; - } - } - this.cursor = v_13; - } - return true; -}; - -/** - * @param {*} o - * @return {!boolean} - */ -EnglishStemmer.prototype.equals$X = function (o) { - return o instanceof EnglishStemmer; -}; - -/** - * @return {!number} - */ -EnglishStemmer.prototype.hashCode$ = function () { - /** @type {!string} */ - var classname; - /** @type {!number} */ - var hash; - /** @type {!number} */ - var i; - /** @type {!number} */ - var char; - classname = "EnglishStemmer"; - hash = 0; - if (classname.length === 0) { - return (hash | 0); - } - for (i = 0; i < classname.length; i++) { - char = classname.charCodeAt(i); - hash = (hash << 5) - hash + char; - hash = hash & hash; - } - return (hash | 0); -}; - -/** - * class Among extends Object - * @constructor - */ -function Among() { -} - -/** - * @constructor - * @param {!string} s - * @param {!number} substring_i - * @param {!number} result - */ -function Among$SII(s, substring_i, result) { - this.s_size = s.length; - this.s = s; - this.substring_i = substring_i; - this.result = result; - this.method = null; - this.instance = null; -}; - -Among$SII.prototype = new Among; - -/** - * @constructor - * @param {!string} s - * @param {!number} substring_i - * @param {!number} result - * @param {*} method - * @param {BaseStemmer} instance - */ -function Among$SIIF$LBaseStemmer$B$LBaseStemmer$(s, substring_i, result, method, instance) { - this.s_size = s.length; - this.s = s; - this.substring_i = substring_i; - this.result = result; - this.method = method; - this.instance = instance; -}; - -Among$SIIF$LBaseStemmer$B$LBaseStemmer$.prototype = new Among; - -/** - * class Metadata extends Object - * @constructor - */ -function Metadata() { -} - -/** - * @constructor - * @param {Oktavia} parent - */ -function Metadata$LOktavia$(parent) { - this._parent = parent; - this._bitVector = new BitVector$(); -}; - -Metadata$LOktavia$.prototype = new Metadata; - -/** - * @return {!number} - */ -Metadata.prototype._size$ = function () { - return this._bitVector.rank$I(this._bitVector.size$()); -}; - -/** - * @param {!number} index - * @return {!string} - */ -Metadata.prototype.getContent$I = function (index) { - /** @type {!number} */ - var startPosition; - /** @type {!number} */ - var length; - if (index < 0 || this._size$() <= index) { - throw new Error("Section.getContent() : range error " + (index + "")); - } - startPosition = 0; - if (index > 0) { - startPosition = this._bitVector.select$I(index - 1) + 1; - } - console.log(startPosition); - length = this._bitVector.select$I(index) - startPosition + 1; - console.log(length); - return this._parent._getSubstring$II(startPosition, length); -}; - -/** - * @param {!number} index - * @return {!number} - */ -Metadata.prototype.getStartPosition$I = function (index) { - /** @type {!number} */ - var startPosition; - if (index < 0 || this._size$() <= index) { - throw new Error("Section.getContent() : range error " + (index + "")); - } - startPosition = 0; - if (index > 0) { - startPosition = this._bitVector.select$I(index - 1) + 1; - } - return (startPosition | 0); -}; - -/** - * @param {SingleResult} result - * @param {Array.<undefined|!number>} positions - * @param {!string} word - * @param {!boolean} stemmed - */ -Metadata.prototype.grouping$LSingleResult$AISB = function (result, positions, word, stemmed) { -}; - -/** - * @param {!number} index - * @return {!string} - */ -Metadata.prototype.getInformation$I = function (index) { - return ''; -}; - -/** - */ -Metadata.prototype._build$ = function () { - this._bitVector.build$(); -}; - -/** - * @param {!string} name - * @param {!string} data - * @param {!number} offset - * @return {!number} - */ -Metadata.prototype._load$SSI = function (name, data, offset) { - offset = this._bitVector.load$SI(data, offset); - this._parent._metadataLabels.push(name); - this._parent._metadatas[name] = this; - return offset; -}; - -/** - * @return {!string} - */ -Metadata.prototype._dump$ = function () { - return this._bitVector.dump$(); -}; - -/** - * @param {CompressionReport} report - * @return {!string} - */ -Metadata.prototype._dump$LCompressionReport$ = function (report) { - return this._bitVector.dump$LCompressionReport$(report); -}; - -/** - * class Section extends Metadata - * @constructor - */ -function Section() { -} - -Section.prototype = new Metadata; -/** - * @constructor - * @param {Oktavia} parent - */ -function Section$LOktavia$(parent) { - Metadata$LOktavia$.call(this, parent); - this._names = [ ]; -}; - -Section$LOktavia$.prototype = new Section; - -/** - * @param {!string} name - */ -Section.prototype.setTail$S = function (name) { - this.setTail$SI(name, this._parent.contentSize$()); -}; - -/** - * @param {!string} name - * @param {!number} index - */ -Section.prototype.setTail$SI = function (name, index) { - this._names.push(name); - this._bitVector.set$I(index - 1); -}; - -/** - * @return {!number} - */ -Section.prototype.size$ = function () { - return (this._names.length | 0); -}; - -/** - * @param {!number} position - * @return {!number} - */ -Section.prototype.getSectionIndex$I = function (position) { - if (position < 0 || this._bitVector.size$() <= position) { - throw new Error("Section.getSectionIndex() : range error " + (position + "")); - } - return this._bitVector.rank$I(position); -}; - -/** - * @param {!number} index - * @return {!string} - */ -Section.prototype.getName$I = function (index) { - if (index < 0 || this.size$() <= index) { - throw new Error("Section.getName() : range error"); - } - return (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/metadata.jsx:129:26] null access\n return this._names[index];\n ^\n"); - } - return v; - }(this._names[index])); -}; - -/** - * @param {SingleResult} result - * @param {Array.<undefined|!number>} positions - * @param {!string} word - * @param {!boolean} stemmed - */ -Section.prototype.grouping$LSingleResult$AISB = function (result, positions, word, stemmed) { - /** @type {!number} */ - var i; - /** @type {undefined|!number} */ - var position; - /** @type {!number} */ - var index; - /** @type {SearchUnit} */ - var unit; - for (i = 0; i < positions.length; i++) { - position = positions[i]; - index = this.getSectionIndex$I((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/metadata.jsx:137:45] null access\n var index = this.getSectionIndex(position);\n ^^^^^^^^\n"); - } - return v; - }(position))); - unit = result.getSearchUnit$I(index); - if (unit.startPosition < 0) { - unit.startPosition = this.getStartPosition$I(index); - } - unit.addPosition$SIB(word, (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/metadata.jsx:143:35] null access\n unit.addPosition(word, position - unit.startPosition, stemmed);\n ^^^^^^^^\n"); - } - return v; - }(position)) - unit.startPosition, stemmed); - } -}; - -/** - * @param {!number} index - * @return {!string} - */ -Section.prototype.getInformation$I = function (index) { - return this.getName$I(index); -}; - -/** - * @param {Oktavia} parent - * @param {!string} name - * @param {!string} data - * @param {!number} offset - * @return {!number} - */ -Section._load$LOktavia$SSI = function (parent, name, data, offset) { - /** @type {LoadedStringListResult} */ - var strs; - /** @type {Section} */ - var section; - strs = Binary$loadStringList$SI(data, offset); - section = new Section$LOktavia$(parent); - section._names = strs.result; - return section._load$SSI(name, data, strs.offset); -}; - -var Section$_load$LOktavia$SSI = Section._load$LOktavia$SSI; - -/** - * @return {!string} - */ -Section.prototype._dump$ = function () { - return [ Binary$dump16bitNumber$I(0), Binary$dumpStringList$AS(this._names), Metadata.prototype._dump$.call(this) ].join(''); -}; - -/** - * @param {CompressionReport} report - * @return {!string} - */ -Section.prototype._dump$LCompressionReport$ = function (report) { - report.add$II(1, 1); - return [ Binary$dump16bitNumber$I(0), Binary$dumpStringList$ASLCompressionReport$(this._names, report), Metadata.prototype._dump$LCompressionReport$.call(this, report) ].join(''); -}; - -/** - * class Splitter extends Metadata - * @constructor - */ -function Splitter() { -} - -Splitter.prototype = new Metadata; -/** - * @constructor - * @param {Oktavia} parent - */ -function Splitter$LOktavia$(parent) { - Metadata$LOktavia$.call(this, parent); - this.name = null; -}; - -Splitter$LOktavia$.prototype = new Splitter; - -/** - * @constructor - * @param {Oktavia} parent - * @param {!string} name - */ -function Splitter$LOktavia$S(parent, name) { - Metadata$LOktavia$.call(this, parent); - this.name = name; -}; - -Splitter$LOktavia$S.prototype = new Splitter; - -/** - * @return {!number} - */ -Splitter.prototype.size$ = function () { - return this._size$(); -}; - -/** - */ -Splitter.prototype.split$ = function () { - this.split$I(this._parent.contentSize$()); -}; - -/** - * @param {!number} index - */ -Splitter.prototype.split$I = function (index) { - this._bitVector.set$I(index - 1); -}; - -/** - * @param {!number} position - * @return {!number} - */ -Splitter.prototype.getIndex$I = function (position) { - if (position < 0 || this._bitVector.size$() <= position) { - throw new Error("Section.getSectionIndex() : range error"); - } - return this._bitVector.rank$I(position); -}; - -/** - * @param {SingleResult} result - * @param {Array.<undefined|!number>} positions - * @param {!string} word - * @param {!boolean} stemmed - */ -Splitter.prototype.grouping$LSingleResult$AISB = function (result, positions, word, stemmed) { -}; - -/** - * @param {!number} index - * @return {!string} - */ -Splitter.prototype.getInformation$I = function (index) { - if (this.name != null) { - return (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/metadata.jsx:221:23] null access\n return this.name + ((index + 1) as string);\n ^\n"); - } - return v; - }(this.name)) + (index + 1 + ""); - } - return ''; -}; - -/** - * @param {Oktavia} parent - * @param {!string} name - * @param {!string} data - * @param {!number} offset - * @return {!number} - */ -Splitter._load$LOktavia$SSI = function (parent, name, data, offset) { - /** @type {Splitter} */ - var section; - section = new Splitter$LOktavia$(parent); - return section._load$SSI(name, data, offset); -}; - -var Splitter$_load$LOktavia$SSI = Splitter._load$LOktavia$SSI; - -/** - * @return {!string} - */ -Splitter.prototype._dump$ = function () { - return [ Binary$dump16bitNumber$I(1), Metadata.prototype._dump$.call(this) ].join(''); -}; - -/** - * @param {CompressionReport} report - * @return {!string} - */ -Splitter.prototype._dump$LCompressionReport$ = function (report) { - report.add$II(1, 1); - return [ Binary$dump16bitNumber$I(1), Metadata.prototype._dump$LCompressionReport$.call(this, report) ].join(''); -}; - -/** - * class Table extends Metadata - * @constructor - */ -function Table() { -} - -Table.prototype = new Metadata; -/** - * @constructor - * @param {Oktavia} parent - * @param {Array.<undefined|!string>} headers - */ -function Table$LOktavia$AS(parent, headers) { - Metadata$LOktavia$.call(this, parent); - this._headers = headers; - this._columnTails = new BitVector$(); -}; - -Table$LOktavia$AS.prototype = new Table; - -/** - * @return {!number} - */ -Table.prototype.rowSize$ = function () { - return this._size$(); -}; - -/** - * @return {!number} - */ -Table.prototype.columnSize$ = function () { - return (this._headers.length | 0); -}; - -/** - */ -Table.prototype.setColumnTail$ = function () { - /** @type {!number} */ - var index; - index = this._parent.contentSize$(); - this._parent.addEndOfBlock$(); - this._columnTails.set$I(index - 1); -}; - -/** - */ -Table.prototype.setRowTail$ = function () { - /** @type {!number} */ - var index; - index = this._parent.contentSize$(); - this._bitVector.set$I(index - 1); -}; - -/** - * @param {!number} position - * @return {Array.<undefined|!number>} - */ -Table.prototype.getCell$I = function (position) { - /** @type {!number} */ - var row; - /** @type {!number} */ - var currentColumn; - /** @type {!number} */ - var lastRowColumn; - /** @type {!number} */ - var startPosition; - /** @type {Array.<undefined|!number>} */ - var result; - if (position < 0 || this._bitVector.size$() <= position) { - throw new Error("Section.getSectionIndex() : range error " + (position + "")); - } - row = this._bitVector.rank$I(position); - currentColumn = this._columnTails.rank$I(position); - lastRowColumn = 0; - if (row > 0) { - startPosition = this._bitVector.select$I(row - 1) + 1; - lastRowColumn = this._columnTails.rank$I(startPosition); - } - result = [ row, currentColumn - lastRowColumn ]; - return result; -}; - -/** - * @param {!number} rowIndex - * @return {Object.<string, undefined|!string>} - */ -Table.prototype.getRowContent$I = function (rowIndex) { - /** @type {!string} */ - var content; - /** @type {Array.<undefined|!string>} */ - var values; - /** @type {Object.<string, undefined|!string>} */ - var result; - /** @type {!number} */ - var i; - content = this.getContent$I(rowIndex); - values = content.split(Oktavia.eob, this._headers.length); - result = ({ }); - for (i in this._headers) { - if (i < values.length) { - result[this._headers[i]] = values[i]; - } else { - result[this._headers[i]] = ''; - } - } - return result; -}; - -/** - * @param {SingleResult} result - * @param {Array.<undefined|!number>} positions - * @param {!string} word - * @param {!boolean} stemmed - */ -Table.prototype.grouping$LSingleResult$AISB = function (result, positions, word, stemmed) { -}; - -/** - * @param {!number} index - * @return {!string} - */ -Table.prototype.getInformation$I = function (index) { - return ''; -}; - -/** - */ -Table.prototype._build$ = function () { - this._bitVector.build$(); - this._columnTails.build$(); -}; - -/** - * @param {Oktavia} parent - * @param {!string} name - * @param {!string} data - * @param {!number} offset - * @return {!number} - */ -Table._load$LOktavia$SSI = function (parent, name, data, offset) { - /** @type {LoadedStringListResult} */ - var strs; - /** @type {Table} */ - var table; - strs = Binary$loadStringList$SI(data, offset); - table = new Table$LOktavia$AS(parent, strs.result); - offset = table._load$SSI(name, data, strs.offset); - return table._columnTails.load$SI(data, offset); -}; - -var Table$_load$LOktavia$SSI = Table._load$LOktavia$SSI; - -/** - * @return {!string} - */ -Table.prototype._dump$ = function () { - return [ Binary$dump16bitNumber$I(2), Binary$dumpStringList$AS(this._headers), Metadata.prototype._dump$.call(this), this._columnTails.dump$() ].join(''); -}; - -/** - * @param {CompressionReport} report - * @return {!string} - */ -Table.prototype._dump$LCompressionReport$ = function (report) { - report.add$II(1, 1); - return [ Binary$dump16bitNumber$I(2), Binary$dumpStringList$ASLCompressionReport$(this._headers, report), Metadata.prototype._dump$LCompressionReport$.call(this, report), this._columnTails.dump$LCompressionReport$(report) ].join(''); -}; - -/** - * class Block extends Metadata - * @constructor - */ -function Block() { -} - -Block.prototype = new Metadata; -/** - * @constructor - * @param {Oktavia} parent - */ -function Block$LOktavia$(parent) { - Metadata$LOktavia$.call(this, parent); - this._names = [ ]; - this._start = false; -}; - -Block$LOktavia$.prototype = new Block; - -/** - * @param {!string} blockName - */ -Block.prototype.startBlock$S = function (blockName) { - this.startBlock$SI(blockName, this._parent.contentSize$()); -}; - -/** - * @param {!string} blockName - * @param {!number} index - */ -Block.prototype.startBlock$SI = function (blockName, index) { - if (this._start) { - throw new Error('Splitter `' + (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/metadata.jsx:380:54] null access\n throw new Error(\'Splitter `\' + this._names[this._names.length - 1] + \'` is not closed\');\n ^\n"); - } - return v; - }(this._names[this._names.length - 1])) + '` is not closed'); - } - this._start = true; - this._names.push(blockName); - this._bitVector.set$I(index - 1); -}; - -/** - */ -Block.prototype.endBlock$ = function () { - this.endBlock$I(this._parent.contentSize$()); -}; - -/** - * @param {!number} index - */ -Block.prototype.endBlock$I = function (index) { - if (! this._start) { - throw new Error('Splitter is not started'); - } - this._start = false; - this._bitVector.set$I(index - 1); -}; - -/** - * @return {!number} - */ -Block.prototype.size$ = function () { - return (this._names.length | 0); -}; - -/** - * @param {!number} position - * @return {!number} - */ -Block.prototype.blockIndex$I = function (position) { - /** @type {!number} */ - var result; - if (position < 0 || this._parent._fmindex.size$() - 1 <= position) { - throw new Error("Block.blockIndex() : range error " + (position + "")); - } - if (position >= this._bitVector.size$()) { - position = (this._bitVector.size$() - 1 | 0); - result = (this._bitVector.rank$I(position) + 1 | 0); - } else { - result = this._bitVector.rank$I(position); - } - return result; -}; - -/** - * @param {!number} position - * @return {!boolean} - */ -Block.prototype.inBlock$I = function (position) { - /** @type {!number} */ - var blockIndex; - blockIndex = this.blockIndex$I(position); - return blockIndex % 2 !== 0; -}; - -/** - * @param {!number} position - * @return {!string} - */ -Block.prototype.getBlockContent$I = function (position) { - /** @type {!number} */ - var blockIndex; - /** @type {!string} */ - var result; - blockIndex = this.blockIndex$I(position); - if (blockIndex % 2 !== 0) { - result = this.getContent$I(blockIndex); - } else { - result = ''; - } - return result; -}; - -/** - * @param {!number} position - * @return {!string} - */ -Block.prototype.getBlockName$I = function (position) { - /** @type {!number} */ - var blockIndex; - /** @type {!string} */ - var result; - blockIndex = this.blockIndex$I(position); - if (blockIndex % 2 !== 0) { - result = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/metadata.jsx:453:32] null access\n result = this._names[blockIndex >>> 1];\n ^\n"); - } - return v; - }(this._names[blockIndex >>> 1])); - } else { - result = ''; - } - return result; -}; - -/** - * @param {SingleResult} result - * @param {Array.<undefined|!number>} positions - * @param {!string} word - * @param {!boolean} stemmed - */ -Block.prototype.grouping$LSingleResult$AISB = function (result, positions, word, stemmed) { -}; - -/** - * @param {!number} index - * @return {!string} - */ -Block.prototype.getInformation$I = function (index) { - return ''; -}; - -/** - * @param {Oktavia} parent - * @param {!string} name - * @param {!string} data - * @param {!number} offset - * @return {!number} - */ -Block._load$LOktavia$SSI = function (parent, name, data, offset) { - /** @type {LoadedStringListResult} */ - var strs; - /** @type {Block} */ - var block; - strs = Binary$loadStringList$SI(data, offset); - block = new Block$LOktavia$(parent); - block._names = strs.result; - return block._load$SSI(name, data, strs.offset); -}; - -var Block$_load$LOktavia$SSI = Block._load$LOktavia$SSI; - -/** - * @return {!string} - */ -Block.prototype._dump$ = function () { - return [ Binary$dump16bitNumber$I(3), Binary$dumpStringList$AS(this._names), Metadata.prototype._dump$.call(this) ].join(''); -}; - -/** - * @param {CompressionReport} report - * @return {!string} - */ -Block.prototype._dump$LCompressionReport$ = function (report) { - report.add$II(1, 1); - return [ Binary$dump16bitNumber$I(3), Binary$dumpStringList$ASLCompressionReport$(this._names, report), Metadata.prototype._dump$LCompressionReport$.call(this, report) ].join(''); -}; - -/** - * class FMIndex extends Object - * @constructor - */ -function FMIndex() { -} - -/** - * @constructor - */ -function FMIndex$() { - this._ssize = 0; - (this._ddic = 0, this._head = 0); - this._substr = ""; - this._sv = new WaveletMatrix$(); - this._posdic = [ ]; - this._idic = [ ]; - this._rlt = [ ]; - this._rlt.length = 65536; -}; - -FMIndex$.prototype = new FMIndex; - -/** - */ -FMIndex.prototype.clear$ = function () { - this._sv.clear$(); - this._posdic.length = 0; - this._idic.length = 0; - this._ddic = 0; - this._head = 0; - this._substr = ""; -}; - -/** - * @return {!number} - */ -FMIndex.prototype.size$ = function () { - return this._sv.size$(); -}; - -/** - * @return {!number} - */ -FMIndex.prototype.contentSize$ = function () { - return this._substr.length; -}; - -/** - * @param {!string} key - * @return {!number} - */ -FMIndex.prototype.getRows$S = function (key) { - /** @type {Array.<undefined|!number>} */ - var pos; - pos = [ ]; - return this.getRows$SAI(key, pos); -}; - -/** - * @param {!string} key - * @param {Array.<undefined|!number>} pos - * @return {!number} - */ -FMIndex.prototype.getRows$SAI = function (key, pos) { - /** @type {!number} */ - var i; - /** @type {!number} */ - var code; - /** @type {!number} */ - var first; - /** @type {undefined|!number} */ - var last; - /** @type {!number} */ - var c; - i = key.length - 1; - code = key.charCodeAt(i); - first = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:67:29] null access\n var first = this._rlt[code] + 1;\n ^\n"); - } - return v; - }(this._rlt[code])) + 1; - last = this._rlt[code + 1]; - while (first <= (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:69:24] null access\n while (first <= last)\n ^^^^\n"); - } - return v; - }(last))) { - if (i === 0) { - pos[0] = (-- first | 0); - pos[1] = -- last; - return ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:75:24] null access\n return (last - first + 1);\n ^^^^\n"); - } - return v; - }(last)) - first + 1 | 0); - } - i--; - c = key.charCodeAt(i); - first = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:79:29] null access\n first = this._rlt[c] + this._sv.rank(first - 1, c) + 1;\n ^\n"); - } - return v; - }(this._rlt[c])) + this._sv.rank$II(first - 1, c) + 1; - last = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:80:29] null access\n last = this._rlt[c] + this._sv.rank(last, c);\n ^\n"); - } - return v; - }(this._rlt[c])) + this._sv.rank$II((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:80:49] null access\n last = this._rlt[c] + this._sv.rank(last, c);\n ^^^^\n"); - } - return v; - }(last)), c); - } - return 0; -}; - -/** - * @param {!number} i - * @return {!number} - */ -FMIndex.prototype.getPosition$I = function (i) { - /** @type {!number} */ - var pos; - /** @type {!number} */ - var c; - if (i >= this.size$()) { - throw new Error("FMIndex.getPosition() : range error"); - } - pos = 0; - while (i !== this._head) { - if (i % this._ddic === 0) { - pos += (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:96:36] null access\n pos += (this._posdic[i / this._ddic] + 1);\n ^\n"); - } - return v; - }(this._posdic[i / this._ddic])) + 1; - break; - } - c = this._sv.get$I(i); - i = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:100:25] null access\n i = this._rlt[c] + this._sv.rank(i, c); //LF\n ^\n"); - } - return v; - }(this._rlt[c])) + this._sv.rank$II(i, c); - pos++; - } - return (pos % this.size$() | 0); -}; - -/** - * @param {!number} pos - * @param {!number} len - * @return {!string} - */ -FMIndex.prototype.getSubstring$II = function (pos, len) { - /** @type {!number} */ - var pos_end; - /** @type {!number} */ - var pos_tmp; - /** @type {!number} */ - var i; - /** @type {!number} */ - var pos_idic; - /** @type {!string} */ - var substr; - /** @type {!number} */ - var c; - if (pos >= this.size$()) { - throw new Error("FMIndex.getSubstring() : range error"); - } - pos_end = Math.min(pos + len, this.size$()); - pos_tmp = this.size$() - 1; - i = this._head; - pos_idic = Math.floor((pos_end + this._ddic - 2) / this._ddic); - if (pos_idic < this._idic.length) { - pos_tmp = pos_idic * this._ddic; - i = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:119:32] null access\n i = this._idic[pos_idic];\n ^\n"); - } - return v; - }(this._idic[pos_idic])); - } - substr = ""; - while (pos_tmp >= pos) { - c = this._sv.get$I(i); - i = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:126:25] null access\n i = this._rlt[c] + this._sv.rank(i, c); //LF\n ^\n"); - } - return v; - }(this._rlt[c])) + this._sv.rank$II(i, c); - if (pos_tmp < pos_end) { - substr = String.fromCharCode(c) + substr; - } - if (pos_tmp === 0) { - break; - } - pos_tmp--; - } - return substr; -}; - -/** - */ -FMIndex.prototype.build$ = function () { - this.build$SIIB(String.fromCharCode(0), 65535, 20, false); -}; - -/** - * @param {!string} end_marker - * @param {!number} ddic - * @param {!boolean} verbose - */ -FMIndex.prototype.build$SIB = function (end_marker, ddic, verbose) { - this.build$SIIB(end_marker, 65535, ddic, verbose); -}; - -/** - * @param {!string} end_marker - * @param {!number} maxChar - * @param {!number} ddic - * @param {!boolean} verbose - */ -FMIndex.prototype.build$SIIB = function (end_marker, maxChar, ddic, verbose) { - /** @type {BurrowsWheelerTransform} */ - var b; - /** @type {!string} */ - var s; - /** @type {!number} */ - var c; - if (verbose) { - console.time("building burrows-wheeler transform"); - } - this._substr += end_marker; - b = new BurrowsWheelerTransform$(); - b.build$S(this._substr); - s = b.get$(); - this._ssize = s.length; - this._head = b.head$(); - b.clear$(); - this._substr = ""; - if (verbose) { - console.timeEnd("building burrows-wheeler transform"); - } - if (verbose) { - console.time("building wavelet matrix"); - } - this._sv.setMaxCharCode$I(maxChar); - if (verbose) { - console.log(" maxCharCode: ", maxChar); - console.log(" bitSize: ", this._sv.bitsize$()); - } - this._sv.build$S(s); - if (verbose) { - console.timeEnd("building wavelet matrix"); - } - if (verbose) { - console.time("caching rank less than"); - } - for (c = 0; c < maxChar; c++) { - this._rlt[c] = this._sv.rank_less_than$II(this._sv.size$(), c); - } - if (verbose) { - console.timeEnd("caching rank less than"); - } - this._ddic = ddic; - if (verbose) { - console.time("building dictionaries"); - } - this._buildDictionaries$(); - if (verbose) { - console.timeEnd("building dictionaries"); - console.log(''); - } -}; - -/** - */ -FMIndex.prototype._buildDictionaries$ = function () { - /** @type {!number} */ - var i; - /** @type {!number} */ - var pos; - /** @type {!number} */ - var c; - for (i = 0; i < this._ssize / this._ddic + 1; i++) { - this._posdic.push(0); - this._idic.push(0); - } - i = this._head; - pos = this.size$() - 1; - do { - if (i % this._ddic === 0) { - this._posdic[Math.floor(i / this._ddic)] = (pos | 0); - } - if (pos % this._ddic === 0) { - this._idic[Math.floor(pos / this._ddic)] = (i | 0); - } - c = this._sv.get$I(i); - i = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:228:25] null access\n i = this._rlt[c] + this._sv.rank(i, c); //LF\n ^\n"); - } - return v; - }(this._rlt[c])) + this._sv.rank$II(i, c); - pos--; - } while (i !== this._head); -}; - -/** - * @param {!string} doc - */ -FMIndex.prototype.push$S = function (doc) { - if (doc.length <= 0) { - throw new Error("FMIndex::push(): empty string"); - } - this._substr += doc; -}; - -/** - * @param {!string} keyword - * @return {Array.<undefined|!number>} - */ -FMIndex.prototype.search$S = function (keyword) { - /** @type {Object.<string, undefined|!number>} */ - var result_map; - /** @type {Array.<undefined|!number>} */ - var result; - /** @type {Array.<undefined|!number>} */ - var position; - /** @type {!number} */ - var rows; - /** @type {undefined|!number} */ - var first; - /** @type {undefined|!number} */ - var last; - /** @type {undefined|!number} */ - var i; - result_map = ({ }); - result = [ ]; - position = [ ]; - rows = this.getRows$SAI(keyword, position); - if (rows > 0) { - first = position[0]; - last = position[1]; - for (i = first; (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:252:32] null access\n for (var i = first; i <= last; i++)\n ^\n"); - } - return v; - }(i)) <= (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:252:37] null access\n for (var i = first; i <= last; i++)\n ^^^^\n"); - } - return v; - }(last)); i++) { - result.push(this.getPosition$I((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:254:45] null access\n result.push(this.getPosition(i));\n ^\n"); - } - return v; - }(i)))); - } - } - return result; -}; - -/** - * @return {!string} - */ -FMIndex.prototype.dump$ = function () { - return this.dump$B(false); -}; - -/** - * @param {!boolean} verbose - * @return {!string} - */ -FMIndex.prototype.dump$B = function (verbose) { - /** @type {Array.<undefined|!string>} */ - var contents; - /** @type {CompressionReport} */ - var report; - /** @type {!number} */ - var i; - contents = [ ]; - report = new CompressionReport$(); - contents.push(Binary$dump32bitNumber$N(this._ddic)); - contents.push(Binary$dump32bitNumber$N(this._ssize)); - contents.push(Binary$dump32bitNumber$N(this._head)); - report.add$II(6, 6); - contents.push(this._sv.dump$LCompressionReport$(report)); - if (verbose) { - console.log("Serializing FM-index"); - console.log(' Wavelet Matrix: ' + (contents[3].length * 2 + "") + ' bytes (' + (report.rate$() + "") + '%)'); - } - contents.push(Binary$dump32bitNumber$N(this._posdic.length)); - for (i in this._posdic) { - contents.push(Binary$dump32bitNumber$N((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:282:61] null access\n contents.push(Binary.dump32bitNumber(this._posdic[i]));\n ^\n"); - } - return v; - }(this._posdic[i])))); - } - for (i in this._idic) { - contents.push(Binary$dump32bitNumber$N((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/fm-index.jsx:286:59] null access\n contents.push(Binary.dump32bitNumber(this._idic[i]));\n ^\n"); - } - return v; - }(this._idic[i])))); - } - if (verbose) { - console.log(' Dictionary Cache: ' + (this._idic.length * 16 + "") + ' bytes'); - } - return contents.join(""); -}; - -/** - * @param {!string} data - * @return {!number} - */ -FMIndex.prototype.load$S = function (data) { - return this.load$SI(data, 0); -}; - -/** - * @param {!string} data - * @param {!number} offset - * @return {!number} - */ -FMIndex.prototype.load$SI = function (data, offset) { - /** @type {!number} */ - var maxChar; - /** @type {!number} */ - var c; - /** @type {!number} */ - var size; - /** @type {!number} */ - var i; - this._ddic = (Binary$load32bitNumber$SI(data, offset) | 0); - this._ssize = (Binary$load32bitNumber$SI(data, offset + 2) | 0); - this._head = (Binary$load32bitNumber$SI(data, offset + 4) | 0); - offset = this._sv.load$SI(data, offset + 6); - maxChar = Math.pow(2, this._sv.bitsize$()); - for (c = 0; c < maxChar; c++) { - this._rlt[c] = this._sv.rank_less_than$II(this._sv.size$(), c); - } - size = Binary$load32bitNumber$SI(data, offset); - offset += 2; - for (i = 0; i < size; (i++, offset += 2)) { - this._posdic.push(Binary$load32bitNumber$SI(data, offset)); - } - for (i = 0; i < size; (i++, offset += 2)) { - this._idic.push(Binary$load32bitNumber$SI(data, offset)); - } - return offset; -}; - -/** - * class Tag extends Object - * @constructor - */ -function Tag() { -} - -/** - * @constructor - * @param {!string} name - */ -function Tag$S(name) { - this.name = name; - this.attributes = ({ }); - this.isSelfClosing = false; -}; - -Tag$S.prototype = new Tag; - -/** - * class _Common extends Object - * @constructor - */ -function _Common() { -} - -/** - * @constructor - */ -function _Common$() { -}; - -_Common$.prototype = new _Common; - -/** - * class _State extends Object - * @constructor - */ -function _State() { -} - -/** - * @constructor - */ -function _State$() { -}; - -_State$.prototype = new _State; - -/** - * class SAXHandler extends Object - * @constructor - */ -function SAXHandler() { -} - -/** - * @constructor - */ -function SAXHandler$() { - this.position = 0; - this.column = 0; - this.line = 0; -}; - -SAXHandler$.prototype = new SAXHandler; - -/** - * @param {Error} error - */ -SAXHandler.prototype.onerror$LError$ = function (error) { -}; - -/** - * @param {!string} text - */ -SAXHandler.prototype.ontext$S = function (text) { -}; - -/** - * @param {!string} doctype - */ -SAXHandler.prototype.ondoctype$S = function (doctype) { -}; - -/** - * @param {!string} name - * @param {!string} body - */ -SAXHandler.prototype.onprocessinginstruction$SS = function (name, body) { -}; - -/** - * @param {!string} sgmlDecl - */ -SAXHandler.prototype.onsgmldeclaration$S = function (sgmlDecl) { -}; - -/** - * @param {!string} tagname - * @param {Object.<string, undefined|!string>} attributes - */ -SAXHandler.prototype.onopentag$SHS = function (tagname, attributes) { -}; - -/** - * @param {!string} tagname - */ -SAXHandler.prototype.onclosetag$S = function (tagname) { -}; - -/** - * @param {!string} name - * @param {!string} value - */ -SAXHandler.prototype.onattribute$SS = function (name, value) { -}; - -/** - * @param {!string} comment - */ -SAXHandler.prototype.oncomment$S = function (comment) { -}; - -/** - */ -SAXHandler.prototype.onopencdata$ = function () { -}; - -/** - * @param {!string} cdata - */ -SAXHandler.prototype.oncdata$S = function (cdata) { -}; - -/** - */ -SAXHandler.prototype.onclosecdata$ = function () { -}; - -/** - */ -SAXHandler.prototype.onend$ = function () { -}; - -/** - */ -SAXHandler.prototype.onready$ = function () { -}; - -/** - * @param {!string} script - */ -SAXHandler.prototype.onscript$S = function (script) { -}; - -/** - * class _HTMLHandler extends SAXHandler - * @constructor - */ -function _HTMLHandler() { -} - -_HTMLHandler.prototype = new SAXHandler; -/** - * @constructor - * @param {Object.<string, undefined|Array.<undefined|!string>>} styles - * @param {!boolean} escape - */ -function _HTMLHandler$HASB(styles, escape) { - SAXHandler$.call(this); - this.text = [ ]; - this.escape = escape; - this.styles = styles; -}; - -_HTMLHandler$HASB.prototype = new _HTMLHandler; - -/** - * @param {!string} str - * @return {!string} - */ -_HTMLHandler.escapeHTML$S = function (str) { - return str.replace(/\n/g, "<br/>").replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">"); -}; - -var _HTMLHandler$escapeHTML$S = _HTMLHandler.escapeHTML$S; - -/** - * @param {!string} tagname - * @param {Object.<string, undefined|!string>} attributes - */ -_HTMLHandler.prototype.onopentag$SHS = function (tagname, attributes) { - this.text.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/style.jsx:23:43] null access\n this.text.push(this.styles[tagname][0]);\n ^\n"); - } - return v; - }(this.styles[tagname][0]))); -}; - -/** - * @param {!string} tagname - */ -_HTMLHandler.prototype.onclosetag$S = function (tagname) { - this.text.push((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/style.jsx:28:43] null access\n this.text.push(this.styles[tagname][1]);\n ^\n"); - } - return v; - }(this.styles[tagname][1]))); -}; - -/** - * @param {!string} text - */ -_HTMLHandler.prototype.ontext$S = function (text) { - if (this.escape) { - this.text.push(_HTMLHandler$escapeHTML$S(text)); - } else { - this.text.push(text); - } -}; - -/** - * @return {!string} - */ -_HTMLHandler.prototype.result$ = function () { - return this.text.join(''); -}; - -/** - * class SAXParser extends Object - * @constructor - */ -function SAXParser() { -} - -/** - * @constructor - * @param {SAXHandler} handler - */ -function SAXParser$LSAXHandler$(handler) { - this.q = ""; - this.c = ""; - this.bufferCheckPosition = 0; - this.looseCase = ""; - this.tags = [ ]; - this.closed = false; - this.closedRoot = false; - this.sawRoot = false; - this.tag = null; - this.error = null; - this.handler = null; - this.ENTITIES = null; - this.strict = false; - this.tagName = ""; - this.state = 0; - this.line = 0; - this.column = 0; - this.position = 0; - this.startTagPosition = 0; - this.attribName = ""; - this.attribValue = ""; - this.script = ""; - this.textNode = ""; - this.attribList = null; - this.noscript = false; - this.cdata = ""; - this.procInstBody = ""; - this.procInstName = ""; - this.doctype = ""; - this.entity = ""; - this.sgmlDecl = ""; - this.comment = ""; - this.preTags = 0; - this._init$LSAXHandler$B(handler, false); -}; - -SAXParser$LSAXHandler$.prototype = new SAXParser; - -/** - * @constructor - * @param {SAXHandler} handler - * @param {!boolean} strict - */ -function SAXParser$LSAXHandler$B(handler, strict) { - this.q = ""; - this.c = ""; - this.bufferCheckPosition = 0; - this.looseCase = ""; - this.tags = [ ]; - this.closed = false; - this.closedRoot = false; - this.sawRoot = false; - this.tag = null; - this.error = null; - this.handler = null; - this.ENTITIES = null; - this.strict = false; - this.tagName = ""; - this.state = 0; - this.line = 0; - this.column = 0; - this.position = 0; - this.startTagPosition = 0; - this.attribName = ""; - this.attribValue = ""; - this.script = ""; - this.textNode = ""; - this.attribList = null; - this.noscript = false; - this.cdata = ""; - this.procInstBody = ""; - this.procInstName = ""; - this.doctype = ""; - this.entity = ""; - this.sgmlDecl = ""; - this.comment = ""; - this.preTags = 0; - this._init$LSAXHandler$B(handler, strict); -}; - -SAXParser$LSAXHandler$B.prototype = new SAXParser; - -/** - * @param {SAXHandler} handler - * @param {!boolean} strict - */ -SAXParser.prototype._init$LSAXHandler$B = function (handler, strict) { - this.handler = handler; - this.clearBuffers$(); - this.q = ""; - this.bufferCheckPosition = (_Common.MAX_BUFFER_LENGTH | 0); - this.looseCase = 'toLowerCase'; - this.tags = [ ]; - this.closed = this.closedRoot = this.sawRoot = false; - this.tag = null; - this.error = null; - this.strict = strict; - this.noscript = strict; - this.state = (_State.BEGIN | 0); - this.ENTITIES = _Entities$entity_list$(); - this.attribList = [ ]; - this.noscript = false; - this.preTags = 0; - this.handler.onready$(); -}; - -/** - * @param {!boolean} flag - */ -SAXParser.prototype.set_noscript$B = function (flag) { - this.noscript = flag; -}; - -/** - * @return {SAXParser} - */ -SAXParser.prototype.resume$ = function () { - this.error = null; - return this; -}; - -/** - * @return {SAXParser} - */ -SAXParser.prototype.close$ = function () { - return this.parse$S(''); -}; - -/** - * @param {!string} chunk - * @return {SAXParser} - */ -SAXParser.prototype.parse$S = function (chunk) { - /** @type {Char} */ - var _; - /** @type {!number} */ - var i; - /** @type {!string} */ - var c; - /** @type {!number} */ - var starti; - /** @type {!number} */ - var pad; - /** @type {!number} */ - var returnState; - _ = new Char$(); - if (this.error) { - throw this.error; - } - if (this.closed) { - return this.emiterror$S("Cannot write after close. Assign an onready handler."); - } - (i = 0, c = ""); - while (this.c = c = chunk.charAt(i++)) { - this.position++; - if (c === "\n") { - this.handler.line++; - this.handler.column = 0; - } else { - this.handler.column++; - } - switch (this.state) { - case _State.BEGIN: - if (c === "<") { - this.state = (_State.OPEN_WAKA | 0); - this.startTagPosition = this.position; - } else { - if (_.not$HBS(_.whitespace, c)) { - this.strictFail$S("Non-whitespace before first tag."); - this.textNode = c; - this.state = (_State.TEXT | 0); - } - } - continue; - case _State.TEXT: - if (this.sawRoot && ! this.closedRoot) { - starti = i - 1; - while (c && c !== "<" && c !== "&") { - c = chunk.charAt(i++); - if (c) { - this.position++; - if (c === "\n") { - this.handler.line++; - this.handler.column = 0; - } else { - this.handler.column++; - } - } - } - this.textNode += chunk.substring(starti, i - 1); - } - if (c === "<") { - this.state = (_State.OPEN_WAKA | 0); - this.startTagPosition = this.position; - } else { - if (_.not$HBS(_.whitespace, c) && (! this.sawRoot || this.closedRoot)) { - this.strictFail$S("Text data outside of root node."); - } - if (c === "&") { - this.state = (_State.TEXT_ENTITY | 0); - } else { - this.textNode += c; - } - } - continue; - case _State.SCRIPT: - if (c === "<") { - this.state = (_State.SCRIPT_ENDING | 0); - } else { - this.script += c; - } - continue; - case _State.SCRIPT_ENDING: - if (c === "/") { - this.state = (_State.CLOSE_TAG | 0); - } else { - this.script += "<" + c; - this.state = (_State.SCRIPT | 0); - } - continue; - case _State.OPEN_WAKA: - if (c === "!") { - this.state = (_State.SGML_DECL | 0); - this.sgmlDecl = ""; - } else { - if (_.is$HBS(_.whitespace, c)) { - } else { - if (_.is$LRegExp$S(_.nameStart, c)) { - this.state = (_State.OPEN_TAG | 0); - this.tagName = c; - } else { - if (c === "/") { - this.state = (_State.CLOSE_TAG | 0); - this.tagName = ""; - } else { - if (c === "?") { - this.state = (_State.PROC_INST | 0); - this.procInstName = this.procInstBody = ""; - } else { - this.strictFail$S("Unencoded <"); - if (this.startTagPosition + 1 < this.position) { - pad = this.position - this.startTagPosition; - for (i = 0; i < pad; i++) { - c = " " + c; - } - } - this.textNode += "<" + c; - this.state = (_State.TEXT | 0); - } - } - } - } - } - continue; - case _State.SGML_DECL: - if ((this.sgmlDecl + c).toUpperCase() === _.CDATA) { - this.closetext_if_exist$(); - this.handler.onopencdata$(); - this.state = (_State.CDATA | 0); - this.sgmlDecl = ""; - this.cdata = ""; - } else { - if (this.sgmlDecl + c === "--") { - this.state = (_State.COMMENT | 0); - this.comment = ""; - this.sgmlDecl = ""; - } else { - if ((this.sgmlDecl + c).toUpperCase() === _.DOCTYPE) { - this.state = (_State.DOCTYPE | 0); - if (this.doctype || this.sawRoot) { - this.strictFail$S("Inappropriately located doctype declaration"); - } - this.doctype = ""; - this.sgmlDecl = ""; - } else { - if (c === ">") { - this.closetext_if_exist$(); - this.handler.onsgmldeclaration$S(this.sgmlDecl); - this.sgmlDecl = ""; - this.state = (_State.TEXT | 0); - } else { - if (_.is$HBS(_.quote, c)) { - this.state = (_State.SGML_DECL_QUOTED | 0); - this.sgmlDecl += c; - } else { - this.sgmlDecl += c; - } - } - } - } - } - continue; - case _State.SGML_DECL_QUOTED: - if (c === this.q) { - this.state = (_State.SGML_DECL | 0); - this.q = ""; - } - this.sgmlDecl += c; - continue; - case _State.DOCTYPE: - if (c === ">") { - this.state = (_State.TEXT | 0); - this.closetext_if_exist$(); - this.handler.ondoctype$S(this.doctype); - } else { - this.doctype += c; - if (c === "[") { - this.state = (_State.DOCTYPE_DTD | 0); - } else { - if (_.is$HBS(_.quote, c)) { - this.state = (_State.DOCTYPE_QUOTED | 0); - this.q = c; - } - } - } - continue; - case _State.DOCTYPE_QUOTED: - this.doctype += c; - if (c === this.q) { - this.q = ""; - this.state = (_State.DOCTYPE | 0); - } - continue; - case _State.DOCTYPE_DTD: - this.doctype += c; - if (c === "]") { - this.state = (_State.DOCTYPE | 0); - } else { - if (_.is$HBS(_.quote, c)) { - this.state = (_State.DOCTYPE_DTD_QUOTED | 0); - this.q = c; - } - } - continue; - case _State.DOCTYPE_DTD_QUOTED: - this.doctype += c; - if (c === this.q) { - this.state = (_State.DOCTYPE_DTD | 0); - this.q = ""; - } - continue; - case _State.COMMENT: - if (c === "-") { - this.state = (_State.COMMENT_ENDING | 0); - } else { - this.comment += c; - } - continue; - case _State.COMMENT_ENDING: - if (c === "-") { - this.state = (_State.COMMENT_ENDED | 0); - this.comment = this.textopts$S(this.comment); - if (this.comment) { - this.closetext_if_exist$(); - this.handler.oncomment$S(this.comment); - } - this.comment = ""; - } else { - this.comment += "-" + c; - this.state = (_State.COMMENT | 0); - } - continue; - case _State.COMMENT_ENDED: - if (c !== ">") { - this.strictFail$S("Malformed comment"); - this.comment += "--" + c; - this.state = (_State.COMMENT | 0); - } else { - this.state = (_State.TEXT | 0); - } - continue; - case _State.CDATA: - if (c === "]") { - this.state = (_State.CDATA_ENDING | 0); - } else { - this.cdata += c; - } - continue; - case _State.CDATA_ENDING: - if (c === "]") { - this.state = (_State.CDATA_ENDING_2 | 0); - } else { - this.cdata += "]" + c; - this.state = (_State.CDATA | 0); - } - continue; - case _State.CDATA_ENDING_2: - if (c === ">") { - if (this.cdata) { - this.closetext_if_exist$(); - } - this.handler.oncdata$S(this.cdata); - this.handler.onclosecdata$(); - this.cdata = ""; - this.state = (_State.TEXT | 0); - } else { - if (c === "]") { - this.cdata += "]"; - } else { - this.cdata += "]]" + c; - this.state = (_State.CDATA | 0); - } - } - continue; - case _State.PROC_INST: - if (c === "?") { - this.state = (_State.PROC_INST_ENDING | 0); - } else { - if (_.is$HBS(_.whitespace, c)) { - this.state = (_State.PROC_INST_BODY | 0); - } else { - this.procInstName += c; - } - } - continue; - case _State.PROC_INST_BODY: - if (! this.procInstBody && _.is$HBS(_.whitespace, c)) { - continue; - } else { - if (c === "?") { - this.state = (_State.PROC_INST_ENDING | 0); - } else { - this.procInstBody += c; - } - } - continue; - case _State.PROC_INST_ENDING: - if (c === ">") { - this.closetext_if_exist$(); - this.handler.onprocessinginstruction$SS(this.procInstName, this.procInstBody); - this.procInstName = this.procInstBody = ""; - this.state = (_State.TEXT | 0); - } else { - this.procInstBody += "?" + c; - this.state = (_State.PROC_INST_BODY | 0); - } - continue; - case _State.OPEN_TAG: - if (_.is$LRegExp$S(_.nameBody, c)) { - this.tagName += c; - } else { - this.newTag$(); - if (c === ">") { - this.openTag$(); - } else { - if (c === "/") { - this.state = (_State.OPEN_TAG_SLASH | 0); - } else { - if (_.not$HBS(_.whitespace, c)) { - this.strictFail$S("Invalid character in tag name"); - } - this.state = (_State.ATTRIB | 0); - } - } - } - continue; - case _State.OPEN_TAG_SLASH: - if (c === ">") { - this.openTag$B(true); - this.closeTag$(); - } else { - this.strictFail$S("Forward-slash in opening tag not followed by >"); - this.state = (_State.ATTRIB | 0); - } - continue; - case _State.ATTRIB: - if (_.is$HBS(_.whitespace, c)) { - continue; - } else { - if (c === ">") { - this.openTag$(); - } else { - if (c === "/") { - this.state = (_State.OPEN_TAG_SLASH | 0); - } else { - if (_.is$LRegExp$S(_.nameStart, c)) { - this.attribName = c; - this.attribValue = ""; - this.state = (_State.ATTRIB_NAME | 0); - } else { - this.strictFail$S("Invalid attribute name"); - } - } - } - } - continue; - case _State.ATTRIB_NAME: - if (c === "=") { - this.state = (_State.ATTRIB_VALUE | 0); - } else { - if (c === ">") { - this.strictFail$S("Attribute without value"); - this.attribValue = this.attribName; - this.attrib$(); - this.openTag$(); - } else { - if (_.is$HBS(_.whitespace, c)) { - this.state = (_State.ATTRIB_NAME_SAW_WHITE | 0); - } else { - if (_.is$LRegExp$S(_.nameBody, c)) { - this.attribName += c; - } else { - this.strictFail$S("Invalid attribute name"); - } - } - } - } - continue; - case _State.ATTRIB_NAME_SAW_WHITE: - if (c === "=") { - this.state = (_State.ATTRIB_VALUE | 0); - } else { - if (_.is$HBS(_.whitespace, c)) { - continue; - } else { - this.strictFail$S("Attribute without value"); - this.tag.attributes[this.attribName] = ""; - this.attribValue = ""; - this.closetext_if_exist$(); - this.handler.onattribute$SS(this.attribName, ""); - this.attribName = ""; - if (c === ">") { - this.openTag$(); - } else { - if (_.is$LRegExp$S(_.nameStart, c)) { - this.attribName = c; - this.state = (_State.ATTRIB_NAME | 0); - } else { - this.strictFail$S("Invalid attribute name"); - this.state = (_State.ATTRIB | 0); - } - } - } - } - continue; - case _State.ATTRIB_VALUE: - if (_.is$HBS(_.whitespace, c)) { - continue; - } else { - if (_.is$HBS(_.quote, c)) { - this.q = c; - this.state = (_State.ATTRIB_VALUE_QUOTED | 0); - } else { - this.strictFail$S("Unquoted attribute value"); - this.state = (_State.ATTRIB_VALUE_UNQUOTED | 0); - this.attribValue = c; - } - } - continue; - case _State.ATTRIB_VALUE_QUOTED: - if (c !== this.q) { - if (c === "&") { - this.state = (_State.ATTRIB_VALUE_ENTITY_Q | 0); - } else { - this.attribValue += c; - } - continue; - } - this.attrib$(); - this.q = ""; - this.state = (_State.ATTRIB | 0); - continue; - case _State.ATTRIB_VALUE_UNQUOTED: - if (_.not$HBS(_.attribEnd, c)) { - if (c === "&") { - this.state = (_State.ATTRIB_VALUE_ENTITY_U | 0); - } else { - this.attribValue += c; - } - continue; - } - this.attrib$(); - if (c === ">") { - this.openTag$(); - } else { - this.state = (_State.ATTRIB | 0); - } - continue; - case _State.CLOSE_TAG: - if (! this.tagName) { - if (_.is$HBS(_.whitespace, c)) { - continue; - } else { - if (_.not$LRegExp$S(_.nameStart, c)) { - if (this.script) { - this.script += "</" + c; - this.state = (_State.SCRIPT | 0); - } else { - this.strictFail$S("Invalid tagname in closing tag."); - } - } else { - this.tagName = c; - } - } - } else { - if (c === ">") { - this.closeTag$(); - } else { - if (_.is$LRegExp$S(_.nameBody, c)) { - this.tagName += c; - } else { - if (this.script) { - this.script += "</" + this.tagName; - this.tagName = ""; - this.state = (_State.SCRIPT | 0); - } else { - if (_.not$HBS(_.whitespace, c)) { - this.strictFail$S("Invalid tagname in closing tag"); - } - this.state = (_State.CLOSE_TAG_SAW_WHITE | 0); - } - } - } - } - continue; - case _State.CLOSE_TAG_SAW_WHITE: - if (_.is$HBS(_.whitespace, c)) { - continue; - } - if (c === ">") { - this.closeTag$(); - } else { - this.strictFail$S("Invalid characters in closing tag"); - } - continue; - case _State.TEXT_ENTITY: - if (c === ";") { - this.textNode += this.parseEntity$(); - this.entity = ""; - this.state = (_State.TEXT | 0); - } else { - if (_.is$HBS(_.entity, c)) { - this.entity += c; - } else { - this.strictFail$S("Invalid character entity"); - this.textNode += "&" + this.entity + c; - this.entity = ""; - this.state = (_State.TEXT | 0); - } - } - continue; - case _State.ATTRIB_VALUE_ENTITY_Q: - case _State.ATTRIB_VALUE_ENTITY_U: - if (this.state === _State.ATTRIB_VALUE_ENTITY_Q) { - returnState = _State.ATTRIB_VALUE_QUOTED; - } else { - returnState = _State.ATTRIB_VALUE_UNQUOTED; - } - if (c === ";") { - this.attribValue += this.parseEntity$(); - this.entity = ""; - this.state = (returnState | 0); - } else { - if (_.is$HBS(_.entity, c)) { - this.entity += c; - } else { - this.strictFail$S("Invalid character entity"); - this.attribValue += "&" + this.entity + c; - this.entity = ""; - this.state = (returnState | 0); - } - } - continue; - default: - throw new Error("Unknown state: " + (this.state + "")); - } - } - this.end$(); - return this; -}; - -/** - */ -SAXParser.prototype.clearBuffers$ = function () { - this.comment = ''; - this.sgmlDecl = ''; - this.textNode = ''; - this.tagName = ''; - this.doctype = ''; - this.procInstName = ''; - this.procInstBody = ''; - this.entity = ''; - this.attribName = ''; - this.attribValue = ''; - this.cdata = ''; - this.script = ''; -}; - -/** - */ -SAXParser.prototype.closetext_if_exist$ = function () { - if (this.textNode !== '') { - this.closetext$(); - } -}; - -/** - */ -SAXParser.prototype.closetext$ = function () { - /** @type {!string} */ - var text; - if (this.preTags === 0) { - text = this.textopts$S(this.textNode); - if (text) { - this.handler.ontext$S(text); - } - } else { - if (this.textNode) { - this.handler.ontext$S(this.textNode); - } - } - this.textNode = ""; -}; - -/** - * @param {!string} text - * @return {!string} - */ -SAXParser.prototype.textopts$S = function (text) { - text = text.replace(/[\n\t]/g, ' '); - text = text.replace(/\s\s+/g, " "); - return text; -}; - -/** - * @param {!string} er - * @return {SAXParser} - */ -SAXParser.prototype.emiterror$S = function (er) { - /** @type {Error} */ - var error; - this.closetext$(); - er += "\nLine: " + (this.line + "") + "\nColumn: " + (this.column + "") + "\nChar: " + this.c; - error = new Error(er); - this.error = error; - this.handler.onerror$LError$(error); - return this; -}; - -/** - */ -SAXParser.prototype.end$ = function () { - if (! this.closedRoot) { - this.strictFail$S("Unclosed root tag"); - } - if (this.state !== _State.TEXT) { - this.emiterror$S("Unexpected end"); - } - this.closetext$(); - this.c = ""; - this.closed = true; - this.handler.onend$(); -}; - -/** - * @param {!string} message - */ -SAXParser.prototype.strictFail$S = function (message) { - if (this.strict) { - this.emiterror$S(message); - } -}; - -/** - */ -SAXParser.prototype.newTag$ = function () { - /** @type {!boolean} */ - var parent; - /** @type {Tag} */ - var tag; - if (! this.strict) { - this.tagName = this.tagName.toLowerCase(); - } - parent = !! (this.tags[this.tags.length - 1] || this); - tag = this.tag = new Tag$S(this.tagName); - this.attribList.length = 0; -}; - -/** - */ -SAXParser.prototype.attrib$ = function () { - if (! this.strict) { - this.attribName = this.attribName.toLowerCase(); - } - if ($__jsx_ObjectHasOwnProperty.call(this.tag.attributes, this.attribName)) { - this.attribName = this.attribValue = ""; - return; - } - this.tag.attributes[this.attribName] = this.attribValue; - this.closetext_if_exist$(); - this.handler.onattribute$SS(this.attribName, this.attribValue); - this.attribName = this.attribValue = ""; -}; - -/** - */ -SAXParser.prototype.openTag$ = function () { - this.openTag$B(false); -}; - -/** - * @param {!boolean} selfClosing - */ -SAXParser.prototype.openTag$B = function (selfClosing) { - this.tag.isSelfClosing = selfClosing; - this.sawRoot = true; - this.tags.push(this.tag); - this.closetext_if_exist$(); - this.handler.onopentag$SHS(this.tag.name, this.tag.attributes); - if (this.tag.name === 'pre') { - this.preTags++; - } - if (! selfClosing) { - if (! this.noscript && this.tagName.toLowerCase() === "script") { - this.state = (_State.SCRIPT | 0); - } else { - this.state = (_State.TEXT | 0); - } - this.tag = null; - this.tagName = ""; - } - this.attribName = this.attribValue = ""; - this.attribList.length = 0; -}; - -/** - */ -SAXParser.prototype.closeTag$ = function () { - /** @type {!number} */ - var t; - /** @type {!string} */ - var tagName; - /** @type {!string} */ - var closeTo; - /** @type {Tag} */ - var close; - /** @type {!number} */ - var s; - /** @type {Tag} */ - var tag; - /** @type {Tag} */ - var parent; - if (! this.tagName) { - this.strictFail$S("Weird empty close tag."); - this.textNode += "</>"; - this.state = (_State.TEXT | 0); - return; - } - if (this.script) { - if (this.tagName !== "script") { - this.script += "</" + this.tagName + ">"; - this.tagName = ""; - this.state = (_State.SCRIPT | 0); - return; - } - this.closetext_if_exist$(); - this.handler.onscript$S(this.script); - this.script = ""; - } - t = this.tags.length; - tagName = this.tagName; - if (! this.strict) { - tagName = tagName.toLowerCase(); - } - closeTo = tagName; - while (t--) { - close = this.tags[t]; - if (close.name !== closeTo) { - this.strictFail$S("Unexpected close tag"); - } else { - break; - } - } - if (t < 0) { - this.strictFail$S("Unmatched closing tag: " + this.tagName); - this.textNode += "</" + this.tagName + ">"; - this.state = (_State.TEXT | 0); - return; - } - this.tagName = tagName; - s = this.tags.length; - while (s-- > t) { - tag = this.tag = this.tags.pop(); - this.tagName = this.tag.name; - this.closetext_if_exist$(); - this.handler.onclosetag$S(this.tagName); - parent = this.tags[this.tags.length - 1]; - if (this.tagName === 'pre') { - this.preTags--; - } - } - if (t === 0) { - this.closedRoot = true; - } - this.tagName = this.attribValue = this.attribName = ""; - this.attribList.length = 0; - this.state = (_State.TEXT | 0); -}; - -/** - * @return {!string} - */ -SAXParser.prototype.parseEntity$ = function () { - /** @type {!string} */ - var entity; - /** @type {!string} */ - var entityLC; - /** @type {!number} */ - var num; - /** @type {!string} */ - var numStr; - entity = this.entity; - entityLC = entity.toLowerCase(); - num = 0; - numStr = ""; - if (this.ENTITIES[entity]) { - return (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sax.jsx:977:32] null access\n return this.ENTITIES[entity];\n ^\n"); - } - return v; - }(this.ENTITIES[entity])); - } - if (this.ENTITIES[entityLC]) { - return (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sax.jsx:981:32] null access\n return this.ENTITIES[entityLC];\n ^\n"); - } - return v; - }(this.ENTITIES[entityLC])); - } - entity = entityLC; - if (entity.charAt(0) === "#") { - if (entity.charAt(1) === "x") { - entity = entity.slice(2); - num = $__jsx_parseInt(entity, 16); - numStr = num.toString(16); - } else { - entity = entity.slice(1); - num = $__jsx_parseInt(entity, 10); - numStr = num.toString(10); - } - } - entity = entity.replace(/^0+/, ""); - if (numStr.toLowerCase() !== entity) { - this.strictFail$S("Invalid character entity"); - return "&" + this.entity + ";"; - } - return String.fromCharCode(num); -}; - -/** - * class Char extends Object - * @constructor - */ -function Char() { -} - -/** - * @constructor - */ -function Char$() { - /** @type {!string} */ - var whitespace; - /** @type {!string} */ - var number; - /** @type {!string} */ - var letter; - /** @type {!string} */ - var quote; - /** @type {!string} */ - var entity; - /** @type {!string} */ - var attribEnd; - whitespace = "\r\n\t "; - number = "0124356789"; - letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - quote = "'\""; - entity = number + letter + "#"; - attribEnd = whitespace + ">"; - this.CDATA = "[CDATA["; - this.DOCTYPE = "DOCTYPE"; - this.XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"; - this.whitespace = this._charClass$S(whitespace); - this.number = this._charClass$S(number); - this.letter = this._charClass$S(letter); - this.quote = this._charClass$S(quote); - this.entity = this._charClass$S(entity); - this.attribEnd = this._charClass$S(attribEnd); - this.nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/; - this.nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/; -}; - -Char$.prototype = new Char; - -/** - * @param {!string} str - * @return {Object.<string, undefined|!boolean>} - */ -Char.prototype._charClass$S = function (str) { - /** @type {Object.<string, undefined|!boolean>} */ - var result; - /** @type {!number} */ - var i; - result = ({ }); - for (i = 0; i < str.length; i++) { - result[str.slice(i, i + 1)] = true; - } - return result; -}; - -/** - * @param {RegExp} charclass - * @param {!string} c - * @return {!boolean} - */ -Char.prototype.is$LRegExp$S = function (charclass, c) { - return charclass.test(c); -}; - -/** - * @param {Object.<string, undefined|!boolean>} charclass - * @param {!string} c - * @return {!boolean} - */ -Char.prototype.is$HBS = function (charclass, c) { - return $__jsx_ObjectHasOwnProperty.call(charclass, c); -}; - -/** - * @param {RegExp} charclass - * @param {!string} c - * @return {!boolean} - */ -Char.prototype.not$LRegExp$S = function (charclass, c) { - return ! this.is$LRegExp$S(charclass, c); -}; - -/** - * @param {Object.<string, undefined|!boolean>} charclass - * @param {!string} c - * @return {!boolean} - */ -Char.prototype.not$HBS = function (charclass, c) { - return ! this.is$HBS(charclass, c); -}; - -/** - * class _Entities extends Object - * @constructor - */ -function _Entities() { -} - -/** - * @constructor - */ -function _Entities$() { -}; - -_Entities$.prototype = new _Entities; - -/** - * @return {Object.<string, undefined|!string>} - */ -_Entities.entity_list$ = function () { - /** @type {Object.<string, undefined|!string>} */ - var result; - /** @type {!string} */ - var key; - /** @type {*} */ - var value; - result = ({ }); - for (key in _Entities._entities) { - value = _Entities._entities[key]; - if (typeof value === 'string') { - result[key] = value + ""; - } else { - if (typeof value === 'number') { - result[key] = String.fromCharCode(value | 0); - } - } - } - return result; -}; - -var _Entities$entity_list$ = _Entities.entity_list$; - -/** - * class BitVector extends Object - * @constructor - */ -function BitVector() { -} - -/** - * @constructor - */ -function BitVector$() { - this._size = 0; - this._size1 = 0; - this._r = [ ]; - this._v = [ ]; - this.clear$(); -}; - -BitVector$.prototype = new BitVector; - -/** - */ -BitVector.prototype.build$ = function () { - /** @type {!number} */ - var i; - this._size1 = 0; - for (i = 0; i < this._v.length; i++) { - if (i % BitVector.BLOCK_RATE === 0) { - this._r.push(this.size$B(true)); - } - this._size1 += this._rank32$IIB((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:37:47] null access\n this._size1 += this._rank32(this._v[i], BitVector.SMALL_BLOCK_SIZE, true);\n ^\n"); - } - return v; - }(this._v[i])), BitVector.SMALL_BLOCK_SIZE, true); - } -}; - -/** - */ -BitVector.prototype.clear$ = function () { - this._v.length = 0; - this._r.length = 0; - this._size = 0; - this._size1 = 0; -}; - -/** - * @return {!number} - */ -BitVector.prototype.size$ = function () { - return this._size; -}; - -/** - * @param {!boolean} b - * @return {!number} - */ -BitVector.prototype.size$B = function (b) { - return (b ? this._size1 : this._size - this._size1); -}; - -/** - * @param {!number} value - */ -BitVector.prototype.set$I = function (value) { - this.set$IB(value, true); -}; - -/** - * @param {!number} value - * @param {!boolean} flag - */ -BitVector.prototype.set$IB = function (value, flag) { - /** @type {!number} */ - var q; - /** @type {!number} */ - var r; - /** @type {!number} */ - var m; - if (value >= this.size$()) { - this._size = (value + 1 | 0); - } - q = (value / BitVector.SMALL_BLOCK_SIZE | 0); - r = (value % BitVector.SMALL_BLOCK_SIZE | 0); - while (q >= this._v.length) { - this._v.push(0); - } - m = 0x1 << r; - if (flag) { - this._v[q] |= m; - } else { - this._v[q] &= ~ m; - } -}; - -/** - * @param {!number} value - * @return {!boolean} - */ -BitVector.prototype.get$I = function (value) { - /** @type {!number} */ - var q; - /** @type {!number} */ - var r; - /** @type {!number} */ - var m; - if (value >= this.size$()) { - throw new Error("BitVector.get() : range error"); - } - q = (value / BitVector.SMALL_BLOCK_SIZE | 0); - r = (value % BitVector.SMALL_BLOCK_SIZE | 0); - m = 0x1 << r; - return !! ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:96:23] null access\n return (this._v[q] & m) as boolean;\n ^\n"); - } - return v; - }(this._v[q])) & m); -}; - -/** - * @param {!number} i - * @return {!number} - */ -BitVector.prototype.rank$I = function (i) { - return this.rank$IB(i, true); -}; - -/** - * @param {!number} i - * @param {!boolean} b - * @return {!number} - */ -BitVector.prototype.rank$IB = function (i, b) { - /** @type {!number} */ - var q_large; - /** @type {!number} */ - var q_small; - /** @type {!number} */ - var r; - /** @type {!number} */ - var rank; - /** @type {!number} */ - var begin; - /** @type {!number} */ - var j; - if (i > this.size$()) { - throw new Error("BitVector.rank() : range error"); - } - if (i === 0) { - return 0; - } - i--; - q_large = (Math.floor(i / BitVector.LARGE_BLOCK_SIZE) | 0); - q_small = (Math.floor(i / BitVector.SMALL_BLOCK_SIZE) | 0); - r = (Math.floor(i % BitVector.SMALL_BLOCK_SIZE) | 0); - rank = ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:118:32] null access\n var rank : int = this._r[q_large];\n ^\n"); - } - return v; - }(this._r[q_large])) | 0); - if (! b) { - rank = q_large * BitVector.LARGE_BLOCK_SIZE - rank; - } - begin = q_large * BitVector.BLOCK_RATE; - for (j = begin; j < q_small; j++) { - rank += this._rank32$IIB((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:126:40] null access\n rank += this._rank32(this._v[j], BitVector.SMALL_BLOCK_SIZE, b);\n ^\n"); - } - return v; - }(this._v[j])), BitVector.SMALL_BLOCK_SIZE, b); - } - rank += this._rank32$IIB((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:128:36] null access\n rank += this._rank32(this._v[q_small], r + 1, b);\n ^\n"); - } - return v; - }(this._v[q_small])), r + 1, b); - return rank; -}; - -/** - * @param {!number} i - * @return {!number} - */ -BitVector.prototype.select$I = function (i) { - return this.select$IB(i, true); -}; - -/** - * @param {!number} i - * @param {!boolean} b - * @return {!number} - */ -BitVector.prototype.select$IB = function (i, b) { - /** @type {!number} */ - var left; - /** @type {!number} */ - var right; - /** @type {!number} */ - var pivot; - /** @type {undefined|!number} */ - var rank; - /** @type {!number} */ - var j; - if (i >= this.size$B(b)) { - throw new Error("BitVector.select() : range error"); - } - left = 0; - right = this._r.length; - while (left < right) { - pivot = Math.floor((left + right) / 2); - rank = this._r[pivot]; - if (! b) { - rank = pivot * BitVector.LARGE_BLOCK_SIZE - (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:152:60] null access\n rank = pivot * BitVector.LARGE_BLOCK_SIZE - rank;\n ^^^^\n"); - } - return v; - }(rank)); - } - if (i < (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:154:20] null access\n if (i < rank)\n ^^^^\n"); - } - return v; - }(rank))) { - right = pivot; - } else { - left = pivot + 1; - } - } - right--; - if (b) { - i -= ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:167:24] null access\n i -= this._r[right];\n ^\n"); - } - return v; - }(this._r[right])) | 0); - } else { - i -= (right * BitVector.LARGE_BLOCK_SIZE - (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:171:61] null access\n i -= right * BitVector.LARGE_BLOCK_SIZE - this._r[right];\n ^\n"); - } - return v; - }(this._r[right])) | 0); - } - j = right * BitVector.BLOCK_RATE; - while (1) { - rank = this._rank32$IIB((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:176:43] null access\n var rank = this._rank32(this._v[j], BitVector.SMALL_BLOCK_SIZE, b);\n ^\n"); - } - return v; - }(this._v[j])), BitVector.SMALL_BLOCK_SIZE, b); - if (i < (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:177:20] null access\n if (i < rank)\n ^^^^\n"); - } - return v; - }(rank))) { - break; - } - j++; - i -= ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:182:17] null access\n i -= rank;\n ^^^^\n"); - } - return v; - }(rank)) | 0); - } - return (j * BitVector.SMALL_BLOCK_SIZE + this._select32$IIB((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/bit-vector.jsx:184:70] null access\n return j * BitVector.SMALL_BLOCK_SIZE + this._select32(this._v[j], i, b);\n ^\n"); - } - return v; - }(this._v[j])), i, b) | 0); -}; - -/** - * @param {!number} x - * @param {!number} i - * @param {!boolean} b - * @return {!number} - */ -BitVector.prototype._rank32$IIB = function (x, i, b) { - if (! b) { - x = ~ x; - } - x <<= BitVector.SMALL_BLOCK_SIZE - i; - x = ((x & 0xaaaaaaaa) >>> 1) + (x & 0x55555555); - x = ((x & 0xcccccccc) >>> 2) + (x & 0x33333333); - x = ((x & 0xf0f0f0f0) >>> 4) + (x & 0x0f0f0f0f); - x = ((x & 0xff00ff00) >>> 8) + (x & 0x00ff00ff); - x = ((x & 0xffff0000) >>> 16) + (x & 0x0000ffff); - return x; -}; - -/** - * @param {!number} x - * @param {!number} i - * @param {!boolean} b - * @return {!number} - */ -BitVector.prototype._select32$IIB = function (x, i, b) { - /** @type {!number} */ - var x1; - /** @type {!number} */ - var x2; - /** @type {!number} */ - var x3; - /** @type {!number} */ - var x4; - /** @type {!number} */ - var x5; - /** @type {!number} */ - var pos; - /** @type {!number} */ - var v5; - /** @type {!number} */ - var v4; - /** @type {!number} */ - var v3; - /** @type {!number} */ - var v2; - /** @type {!number} */ - var v1; - /** @type {!number} */ - var v0; - if (! b) { - x = ~ x; - } - x1 = ((x & 0xaaaaaaaa) >>> 1) + (x & 0x55555555); - x2 = ((x1 & 0xcccccccc) >>> 2) + (x1 & 0x33333333); - x3 = ((x2 & 0xf0f0f0f0) >>> 4) + (x2 & 0x0f0f0f0f); - x4 = ((x3 & 0xff00ff00) >>> 8) + (x3 & 0x00ff00ff); - x5 = ((x4 & 0xffff0000) >>> 16) + (x4 & 0x0000ffff); - i++; - pos = 0; - v5 = x5 & 0xffffffff; - if (i > v5) { - i -= (v5 | 0); - pos += 32; - } - v4 = x4 >>> pos & 0x0000ffff; - if (i > v4) { - i -= (v4 | 0); - pos += 16; - } - v3 = x3 >>> pos & 0x000000ff; - if (i > v3) { - i -= (v3 | 0); - pos += 8; - } - v2 = x2 >>> pos & 0x0000000f; - if (i > v2) { - i -= (v2 | 0); - pos += 4; - } - v1 = x1 >>> pos & 0x00000003; - if (i > v1) { - i -= (v1 | 0); - pos += 2; - } - v0 = x >>> pos & 0x00000001; - if (i > v0) { - i -= (v0 | 0); - pos += 1; - } - return (pos | 0); -}; - -/** - * @return {!string} - */ -BitVector.prototype.dump$ = function () { - /** @type {Array.<undefined|!string>} */ - var contents; - contents = [ ]; - contents.push(Binary$dump32bitNumber$N(this._size)); - contents.push(Binary$dump32bitNumberList$AN(this._v)); - return contents.join(''); -}; - -/** - * @param {CompressionReport} report - * @return {!string} - */ -BitVector.prototype.dump$LCompressionReport$ = function (report) { - /** @type {Array.<undefined|!string>} */ - var contents; - contents = [ ]; - contents.push(Binary$dump32bitNumber$N(this._size)); - report.add$II(2, 2); - contents.push(Binary$dump32bitNumberList$ANLCompressionReport$(this._v, report)); - return contents.join(''); -}; - -/** - * @param {!string} data - * @return {!number} - */ -BitVector.prototype.load$S = function (data) { - return this.load$SI(data, 0); -}; - -/** - * @param {!string} data - * @param {!number} offset - * @return {!number} - */ -BitVector.prototype.load$SI = function (data, offset) { - /** @type {LoadedNumberListResult} */ - var result; - this.clear$(); - this._size = (Binary$load32bitNumber$SI(data, offset) | 0); - result = Binary$load32bitNumberList$SI(data, offset + 2); - this._v = result.result; - this.build$(); - return result.offset; -}; - -/** - * class WaveletMatrix extends Object - * @constructor - */ -function WaveletMatrix() { -} - -/** - * @constructor - */ -function WaveletMatrix$() { - this._size = 0; - this._range = ({ }); - this._bv = [ ]; - this._seps = [ ]; - this._bitsize = 16; - this.clear$(); -}; - -WaveletMatrix$.prototype = new WaveletMatrix; - -/** - * @return {!number} - */ -WaveletMatrix.prototype.bitsize$ = function () { - return this._bitsize; -}; - -/** - * @param {!number} charCode - */ -WaveletMatrix.prototype.setMaxCharCode$I = function (charCode) { - this._bitsize = (Math.ceil(Math.log(charCode) / Math.LN2) | 0); -}; - -/** - */ -WaveletMatrix.prototype.clear$ = function () { - this._bv.length = 0; - this._seps.length = 0; - this._size = 0; -}; - -/** - * @param {!string} v - */ -WaveletMatrix.prototype.build$S = function (v) { - /** @type {!number} */ - var size; - /** @type {!number} */ - var bitsize; - /** @type {!number} */ - var i; - /** @type {!number} */ - var depth; - /** @type {Object.<string, undefined|!number>} */ - var range_tmp; - /** @type {!number} */ - var code; - /** @type {!boolean} */ - var bit; - /** @type {!number} */ - var key; - /** @type {Object.<string, undefined|!number>} */ - var range_rev; - /** @type {!string} */ - var range_key; - /** @type {!number} */ - var value; - /** @type {!number} */ - var pos0; - /** @type {undefined|!number} */ - var pos1; - /** @type {!string} */ - var range_rev_key; - /** @type {!number} */ - var begin; - /** @type {undefined|!number} */ - var end; - /** @type {!number} */ - var num0; - /** @type {!number} */ - var num1; - this.clear$(); - size = v.length; - bitsize = this.bitsize$(); - for (i = 0; i < bitsize; i++) { - this._bv.push(new BitVector$()); - this._seps.push(0); - } - this._size = (size | 0); - for (i = 0; i < size; i++) { - this._bv[0].set$IB(i, this._uint2bit$II(v.charCodeAt(i), 0)); - } - this._bv[0].build$(); - this._seps[0] = this._bv[0].size$B(false); - this._range[0 + ""] = 0; - this._range[1 + ""] = this._seps[0]; - depth = 1; - while (depth < bitsize) { - range_tmp = WaveletMatrix$_shallow_copy$HI(this._range); - for (i = 0; i < size; i++) { - code = v.charCodeAt(i); - bit = this._uint2bit$II(code, depth); - key = code >>> bitsize - depth; - this._bv[depth].set$IB((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:76:45] null access\n this._bv[depth].set(range_tmp[key as string], bit);\n ^\n"); - } - return v; - }(range_tmp[key + ""])), bit); - range_tmp[key + ""]++; - } - this._bv[depth].build$(); - this._seps[depth] = this._bv[depth].size$B(false); - range_rev = ({ }); - for (range_key in this._range) { - value = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:85:45] null access\n var value : int = this._range[range_key];\n ^\n"); - } - return v; - }(this._range[range_key])); - if (value != range_tmp[range_key]) { - range_rev[value + ""] = range_key | 0; - } - } - this._range = ({ }); - pos0 = 0; - pos1 = this._seps[depth]; - for (range_rev_key in range_rev) { - begin = range_rev_key | 0; - value = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:97:37] null access\n var value = range_rev[range_rev_key];\n ^\n"); - } - return v; - }(range_rev[range_rev_key])); - end = range_tmp[value + ""]; - num0 = this._bv[depth].rank$IB((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:99:49] null access\n var num0 = this._bv[depth].rank(end , false) -\n ^^^\n"); - } - return v; - }(end)), false) - this._bv[depth].rank$IB(begin, false); - num1 = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:101:28] null access\n var num1 = end - begin - num0;\n ^^^\n"); - } - return v; - }(end)) - begin - num0; - if (num0 > 0) { - this._range[(value << 1) + ""] = (pos0 | 0); - pos0 += num0; - } - if (num1 > 0) { - this._range[(value << 1) + 1 + ""] = pos1; - pos1 += (num1 | 0); - } - } - depth++; - } -}; - -/** - * @return {!number} - */ -WaveletMatrix.prototype.size$ = function () { - return this._size; -}; - -/** - * @param {!number} c - * @return {!number} - */ -WaveletMatrix.prototype.size$I = function (c) { - return this.rank$II(this.size$(), c); -}; - -/** - * @param {!number} i - * @return {!number} - */ -WaveletMatrix.prototype.get$I = function (i) { - /** @type {!number} */ - var value; - /** @type {!number} */ - var depth; - /** @type {!boolean} */ - var bit; - if (i >= this.size$()) { - throw new Error("WaveletMatrix.get() : range error"); - } - value = 0; - depth = 0; - while (depth < this.bitsize$()) { - bit = this._bv[depth].get$I(i); - i = this._bv[depth].rank$IB(i, bit); - value <<= 1; - if (bit) { - i += (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:142:31] null access\n i += this._seps[depth];\n ^\n"); - } - return v; - }(this._seps[depth])); - value += 1; - } - depth++; - } - return (value | 0); -}; - -/** - * @param {!number} i - * @param {!number} c - * @return {!number} - */ -WaveletMatrix.prototype.rank$II = function (i, c) { - /** @type {undefined|!number} */ - var begin; - /** @type {!number} */ - var end; - /** @type {!number} */ - var depth; - /** @type {!boolean} */ - var bit; - if (i > this.size$()) { - throw new Error("WaveletMatrix.rank(): range error"); - } - if (i === 0) { - return 0; - } - begin = this._range[c + ""]; - if (begin == null) { - return 0; - } - end = i; - depth = 0; - while (depth < this.bitsize$()) { - bit = this._uint2bit$II(c, depth); - end = this._bv[depth].rank$IB(end, bit); - if (bit) { - end += (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:174:33] null access\n end += this._seps[depth];\n ^\n"); - } - return v; - }(this._seps[depth])); - } - depth++; - } - return (end - (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:178:21] null access\n return end - begin;\n ^^^^^\n"); - } - return v; - }(begin)) | 0); -}; - -/** - * @param {!number} i - * @param {!number} c - * @return {!number} - */ -WaveletMatrix.prototype.rank_less_than$II = function (i, c) { - /** @type {!number} */ - var begin; - /** @type {!number} */ - var end; - /** @type {!number} */ - var depth; - /** @type {!number} */ - var rlt; - /** @type {!number} */ - var rank0_begin; - /** @type {!number} */ - var rank0_end; - if (i > this.size$()) { - throw new Error("WaveletMatrix.rank_less_than(): range error"); - } - if (i === 0) { - return 0; - } - begin = 0; - end = i; - depth = 0; - rlt = 0; - while (depth < this.bitsize$()) { - rank0_begin = this._bv[depth].rank$IB(begin, false); - rank0_end = this._bv[depth].rank$IB(end, false); - if (this._uint2bit$II(c, depth)) { - rlt += rank0_end - rank0_begin; - begin += (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:203:36] null access\n begin += (this._seps[depth] - rank0_begin);\n ^\n"); - } - return v; - }(this._seps[depth])) - rank0_begin; - end += (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:204:36] null access\n end += (this._seps[depth] - rank0_end);\n ^\n"); - } - return v; - }(this._seps[depth])) - rank0_end; - } else { - begin = rank0_begin; - end = rank0_end; - } - depth++; - } - return (rlt | 0); -}; - -/** - * @return {!string} - */ -WaveletMatrix.prototype.dump$ = function () { - /** @type {Array.<undefined|!string>} */ - var contents; - /** @type {!number} */ - var i; - /** @type {Array.<undefined|!string>} */ - var range_contents; - /** @type {!number} */ - var counter; - /** @type {!string} */ - var key; - contents = [ Binary$dump16bitNumber$I(this._bitsize), Binary$dump32bitNumber$N(this._size) ]; - for (i = 0; i < this.bitsize$(); i++) { - contents.push(this._bv[i].dump$()); - } - for (i = 0; i < this.bitsize$(); i++) { - contents.push(Binary$dump32bitNumber$N((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:228:59] null access\n contents.push(Binary.dump32bitNumber(this._seps[i]));\n ^\n"); - } - return v; - }(this._seps[i])))); - } - range_contents = [ ]; - counter = 0; - for (key in this._range) { - range_contents.push(Binary$dump32bitNumber$N(key | 0)); - range_contents.push(Binary$dump32bitNumber$N((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:235:66] null access\n range_contents.push(Binary.dump32bitNumber(this._range[key]));\n ^\n"); - } - return v; - }(this._range[key])))); - counter++; - } - contents.push(Binary$dump32bitNumber$N(counter)); - return contents.join('') + range_contents.join(''); -}; - -/** - * @param {CompressionReport} report - * @return {!string} - */ -WaveletMatrix.prototype.dump$LCompressionReport$ = function (report) { - /** @type {Array.<undefined|!string>} */ - var contents; - /** @type {!number} */ - var i; - /** @type {Array.<undefined|!string>} */ - var range_contents; - /** @type {!number} */ - var counter; - /** @type {!string} */ - var key; - contents = [ Binary$dump16bitNumber$I(this._bitsize), Binary$dump32bitNumber$N(this._size) ]; - report.add$II(3, 3); - for (i = 0; i < this.bitsize$(); i++) { - contents.push(this._bv[i].dump$LCompressionReport$(report)); - } - for (i = 0; i < this.bitsize$(); i++) { - contents.push(Binary$dump32bitNumber$N((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:255:59] null access\n contents.push(Binary.dump32bitNumber(this._seps[i]));\n ^\n"); - } - return v; - }(this._seps[i])))); - report.add$II(2, 2); - } - range_contents = [ ]; - counter = 0; - for (key in this._range) { - range_contents.push(Binary$dump32bitNumber$N(key | 0)); - range_contents.push(Binary$dump32bitNumber$N((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/wavelet-matrix.jsx:263:66] null access\n range_contents.push(Binary.dump32bitNumber(this._range[key]));\n ^\n"); - } - return v; - }(this._range[key])))); - report.add$II(4, 4); - counter++; - } - report.add$II(2, 2); - contents.push(Binary$dump32bitNumber$N(counter)); - return contents.join('') + range_contents.join(''); -}; - -/** - * @param {!string} data - * @return {!number} - */ -WaveletMatrix.prototype.load$S = function (data) { - return this.load$SI(data, 0); -}; - -/** - * @param {!string} data - * @param {!number} offset - * @return {!number} - */ -WaveletMatrix.prototype.load$SI = function (data, offset) { - /** @type {!number} */ - var i; - /** @type {BitVector} */ - var bit_vector; - /** @type {!number} */ - var sep; - /** @type {!number} */ - var range_size; - /** @type {!number} */ - var key; - /** @type {!number} */ - var value; - this.clear$(); - this._bitsize = Binary$load16bitNumber$SI(data, offset++); - this._size = (Binary$load32bitNumber$SI(data, offset) | 0); - offset += 2; - for (i = 0; i < this.bitsize$(); i++) { - bit_vector = new BitVector$(); - offset = bit_vector.load$SI(data, offset); - this._bv.push(bit_vector); - } - sep = 0; - for (i = 0; i < this.bitsize$(); (i++, offset += 2)) { - this._seps.push(Binary$load32bitNumber$SI(data, offset)); - } - range_size = Binary$load32bitNumber$SI(data, offset); - offset += 2; - for (i = 0; i < range_size; (i++, offset += 4)) { - key = Binary$load32bitNumber$SI(data, offset); - value = Binary$load32bitNumber$SI(data, offset + 2); - this._range[key + ""] = (value | 0); - } - return offset; -}; - -/** - * @param {Object.<string, undefined|!number>} input - * @return {Object.<string, undefined|!number>} - */ -WaveletMatrix._shallow_copy$HI = function (input) { - /** @type {Object.<string, undefined|!number>} */ - var result; - /** @type {!string} */ - var key; - result = ({ }); - for (key in input) { - result[key] = input[key]; - } - return result; -}; - -var WaveletMatrix$_shallow_copy$HI = WaveletMatrix._shallow_copy$HI; - -/** - * @param {!number} c - * @param {!number} i - * @return {!boolean} - */ -WaveletMatrix.prototype._uint2bit$II = function (c, i) { - return (c >>> this._bitsize - 1 - i & 0x1) === 0x1; -}; - -/** - * class BurrowsWheelerTransform extends Object - * @constructor - */ -function BurrowsWheelerTransform() { -} - -/** - * @constructor - */ -function BurrowsWheelerTransform$() { - this._str = ""; - this._size = 0; - this._head = 0; - this._suffixarray = [ ]; -}; - -BurrowsWheelerTransform$.prototype = new BurrowsWheelerTransform; - -/** - * @return {!number} - */ -BurrowsWheelerTransform.prototype.size$ = function () { - return this._size; -}; - -/** - * @return {!number} - */ -BurrowsWheelerTransform.prototype.head$ = function () { - return this._head; -}; - -/** - */ -BurrowsWheelerTransform.prototype.clear$ = function () { - this._str = ""; - this._size = 0; - this._head = 0; - this._suffixarray.length = 0; -}; - -/** - * @param {!string} str - */ -BurrowsWheelerTransform.prototype.build$S = function (str) { - this._str = str; - this._size = this._str.length; - this._suffixarray = SAIS$make$S(str); - this._head = (this._suffixarray.indexOf(0) | 0); -}; - -/** - * @param {!number} i - * @return {!string} - */ -BurrowsWheelerTransform.prototype.get$I = function (i) { - /** @type {!number} */ - var size; - /** @type {!number} */ - var index; - size = this.size$(); - if (i >= size) { - throw new Error("BurrowsWheelerTransform.get() : range error"); - } - index = ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/burrows-wheeler-transform.jsx:52:38] null access\n var index = (this._suffixarray[i] + size - 1) % size;\n ^\n"); - } - return v; - }(this._suffixarray[i])) + size - 1) % size; - return this._str.charAt(index); -}; - -/** - * @return {!string} - */ -BurrowsWheelerTransform.prototype.get$ = function () { - /** @type {Array.<undefined|!string>} */ - var str; - /** @type {!number} */ - var size; - /** @type {!number} */ - var i; - str = [ ]; - size = this.size$(); - for (i = 0; i < size; i++) { - str.push(this.get$I(i)); - } - return str.join(""); -}; - -/** - * @param {!string} replace - * @return {!string} - */ -BurrowsWheelerTransform.prototype.get$S = function (replace) { - /** @type {!string} */ - var result; - result = this.get$(); - return result.replace(BurrowsWheelerTransform.END_MARKER, replace); -}; - -/** - * class OArray extends Object - * @constructor - */ -function OArray() { -} - -/** - * @constructor - * @param {Array.<undefined|!number>} array - */ -function OArray$AI(array) { - this.array = array; - this.offset = 0; -}; - -OArray$AI.prototype = new OArray; - -/** - * @constructor - * @param {Array.<undefined|!number>} array - * @param {!number} offset - */ -function OArray$AII(array, offset) { - this.array = array; - this.offset = offset; -}; - -OArray$AII.prototype = new OArray; - -/** - * @param {!number} index - * @return {!number} - */ -OArray.prototype.get$I = function (index) { - return (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:27:25] null access\n return this.array[index + this.offset];\n ^\n"); - } - return v; - }(this.array[index + this.offset])); -}; - -/** - * @param {!number} index - * @param {!number} value - */ -OArray.prototype.set$II = function (index, value) { - this.array[index + this.offset] = value; -}; - -/** - * @param {!number} index - * @return {!boolean} - */ -OArray.prototype.isS$I = function (index) { - return (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:37:25] null access\n return this.array[index + this.offset] < this.array[index + this.offset + 1];\n ^\n"); - } - return v; - }(this.array[index + this.offset])) < (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:37:59] null access\n return this.array[index + this.offset] < this.array[index + this.offset + 1];\n ^\n"); - } - return v; - }(this.array[index + this.offset + 1])); -}; - -/** - * @param {!number} index1 - * @param {!number} index2 - * @return {!boolean} - */ -OArray.prototype.compare$II = function (index1, index2) { - return this.array[index1 + this.offset] == this.array[index2 + this.offset]; -}; - -/** - * class SAIS extends Object - * @constructor - */ -function SAIS() { -} - -/** - * @constructor - */ -function SAIS$() { -}; - -SAIS$.prototype = new SAIS; - -/** - * @param {BitVector} t - * @param {!number} i - * @return {!boolean} - */ -SAIS._isLMS$LBitVector$I = function (t, i) { - return i > 0 && t.get$I(i) && ! t.get$I(i - 1); -}; - -var SAIS$_isLMS$LBitVector$I = SAIS._isLMS$LBitVector$I; - -/** - * @param {OArray} s - * @param {Array.<undefined|!number>} bkt - * @param {!number} n - * @param {!number} K - * @param {!boolean} end - */ -SAIS._getBuckets$LOArray$AIIIB = function (s, bkt, n, K, end) { - /** @type {!number} */ - var sum; - /** @type {!number} */ - var i; - sum = 0; - for (i = 0; i <= K; i++) { - bkt[i] = 0; - } - for (i = 0; i < n; i++) { - bkt[s.get$I(i)]++; - } - for (i = 0; i <= K; i++) { - sum += (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:68:22] null access\n sum += bkt[i];\n ^\n"); - } - return v; - }(bkt[i])); - bkt[i] = ((end ? sum : sum - (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:69:42] null access\n bkt[i] = end ? sum : sum - bkt[i];\n ^\n"); - } - return v; - }(bkt[i]))) | 0); - } -}; - -var SAIS$_getBuckets$LOArray$AIIIB = SAIS._getBuckets$LOArray$AIIIB; - -/** - * @param {BitVector} t - * @param {Array.<undefined|!number>} SA - * @param {OArray} s - * @param {Array.<undefined|!number>} bkt - * @param {!number} n - * @param {!number} K - * @param {!boolean} end - */ -SAIS._induceSAl$LBitVector$AILOArray$AIIIB = function (t, SA, s, bkt, n, K, end) { - /** @type {!number} */ - var i; - /** @type {!number} */ - var j; - SAIS$_getBuckets$LOArray$AIIIB(s, bkt, n, K, end); - for (i = 0; i < n; i++) { - j = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:79:22] null access\n var j = SA[i] - 1;\n ^\n"); - } - return v; - }(SA[i])) - 1; - if (j >= 0 && ! t.get$I(j)) { - SA[bkt[s.get$I(j)]++] = (j | 0); - } - } -}; - -var SAIS$_induceSAl$LBitVector$AILOArray$AIIIB = SAIS._induceSAl$LBitVector$AILOArray$AIIIB; - -/** - * @param {BitVector} t - * @param {Array.<undefined|!number>} SA - * @param {OArray} s - * @param {Array.<undefined|!number>} bkt - * @param {!number} n - * @param {!number} K - * @param {!boolean} end - */ -SAIS._induceSAs$LBitVector$AILOArray$AIIIB = function (t, SA, s, bkt, n, K, end) { - /** @type {!number} */ - var i; - /** @type {!number} */ - var j; - SAIS$_getBuckets$LOArray$AIIIB(s, bkt, n, K, end); - for (i = n - 1; i >= 0; i--) { - j = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:93:22] null access\n var j = SA[i] - 1;\n ^\n"); - } - return v; - }(SA[i])) - 1; - if (j >= 0 && t.get$I(j)) { - SA[-- bkt[s.get$I(j)]] = (j | 0); - } - } -}; - -var SAIS$_induceSAs$LBitVector$AILOArray$AIIIB = SAIS._induceSAs$LBitVector$AILOArray$AIIIB; - -/** - * @param {!string} source - * @return {Array.<undefined|!number>} - */ -SAIS.make$S = function (source) { - /** @type {Array.<undefined|!number>} */ - var charCodes; - /** @type {!number} */ - var maxCode; - /** @type {!number} */ - var i; - /** @type {!number} */ - var code; - /** @type {Array.<undefined|!number>} */ - var SA; - /** @type {OArray} */ - var s; - charCodes = [ ]; - charCodes.length = source.length; - maxCode = 0; - for (i = 0; i < source.length; i++) { - code = source.charCodeAt(i); - charCodes[i] = (code | 0); - maxCode = (code > maxCode ? code : maxCode); - } - SA = [ ]; - SA.length = source.length; - s = new OArray$AI(charCodes); - SAIS$_make$LOArray$AIII(s, SA, source.length, maxCode); - return SA; -}; - -var SAIS$make$S = SAIS.make$S; - -/** - * @param {OArray} s - * @param {Array.<undefined|!number>} SA - * @param {!number} n - * @param {!number} K - */ -SAIS._make$LOArray$AIII = function (s, SA, n, K) { - /** @type {BitVector} */ - var t; - /** @type {!number} */ - var i; - /** @type {Array.<undefined|!number>} */ - var bkt; - /** @type {!number} */ - var n1; - /** @type {!number} */ - var name; - /** @type {!number} */ - var prev; - /** @type {undefined|!number} */ - var pos; - /** @type {!boolean} */ - var diff; - /** @type {!number} */ - var d; - /** @type {!number} */ - var j; - /** @type {Array.<undefined|!number>} */ - var SA1; - /** @type {OArray} */ - var s1; - t = new BitVector$(); - t.set$IB(n - 2, false); - t.set$IB(n - 1, true); - for (i = n - 3; i >= 0; i--) { - t.set$IB(i, s.isS$I(i) || s.compare$II(i, i + 1) && t.get$I(i + 1)); - } - bkt = [ ]; - bkt.length = K + 1; - SAIS$_getBuckets$LOArray$AIIIB(s, bkt, n, K, true); - for (i = 0; i < n; i++) { - SA[i] = (- 1 | 0); - } - for (i = 1; i < n; i++) { - if (SAIS$_isLMS$LBitVector$I(t, i)) { - SA[-- bkt[s.get$I(i)]] = (i | 0); - } - } - SAIS$_induceSAl$LBitVector$AILOArray$AIIIB(t, SA, s, bkt, n, K, false); - SAIS$_induceSAs$LBitVector$AILOArray$AIIIB(t, SA, s, bkt, n, K, true); - n1 = 0; - for (i = 0; i < n; i++) { - if (SAIS$_isLMS$LBitVector$I(t, (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:157:33] null access\n if (SAIS._isLMS(t, SA[i]))\n ^\n"); - } - return v; - }(SA[i])))) { - SA[n1++] = SA[i]; - } - } - for (i = n1; i < n; i++) { - SA[i] = (- 1 | 0); - } - name = 0; - prev = - 1; - for (i = 0; i < n1; i++) { - pos = SA[i]; - diff = false; - for (d = 0; d < n; d++) { - if (prev === - 1 || ! s.compare$II((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:176:45] null access\n if (prev == -1 || !s.compare(pos + d, prev + d) || t.get(pos + d) != t.get(prev + d))\n ^^^\n"); - } - return v; - }(pos)) + d, prev + d) || t.get$I((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:176:73] null access\n if (prev == -1 || !s.compare(pos + d, prev + d) || t.get(pos + d) != t.get(prev + d))\n ^^^\n"); - } - return v; - }(pos)) + d) !== t.get$I(prev + d)) { - diff = true; - break; - } else { - if (d > 0 && (SAIS$_isLMS$LBitVector$I(t, (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:181:50] null access\n else if (d > 0 && (SAIS._isLMS(t, pos+d) || SAIS._isLMS(t, prev + d)))\n ^^^\n"); - } - return v; - }(pos)) + d) || SAIS$_isLMS$LBitVector$I(t, prev + d))) { - break; - } - } - } - if (diff) { - name++; - prev = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:189:23] null access\n prev = pos;\n ^^^\n"); - } - return v; - }(pos)); - } - pos = (((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:191:19] null access\n pos = (pos % 2 == 0) ? pos / 2 : (pos - 1) / 2;\n ^^^\n"); - } - return v; - }(pos)) % 2 === 0 ? (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:191:35] null access\n pos = (pos % 2 == 0) ? pos / 2 : (pos - 1) / 2;\n ^^^\n"); - } - return v; - }(pos)) / 2 : ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:191:46] null access\n pos = (pos % 2 == 0) ? pos / 2 : (pos - 1) / 2;\n ^^^\n"); - } - return v; - }(pos)) - 1) / 2) | 0); - SA[n1 + (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:192:20] null access\n SA[n1 + pos] = name - 1;\n ^^^\n"); - } - return v; - }(pos))] = (name - 1 | 0); - } - for ((i = n - 1, j = n - 1); i >= n1; i--) { - if ((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:196:18] null access\n if (SA[i] >= 0)\n ^\n"); - } - return v; - }(SA[i])) >= 0) { - SA[j--] = SA[i]; - } - } - SA1 = SA; - s1 = new OArray$AII(SA, n - n1); - if (name < n1) { - SAIS$_make$LOArray$AIII(s1, SA1, n1, name - 1); - } else { - for (i = 0; i < n1; i++) { - SA1[s1.get$I(i)] = (i | 0); - } - } - bkt = [ ]; - bkt.length = K + 1; - SAIS$_getBuckets$LOArray$AIIIB(s, bkt, n, K, true); - for ((i = 1, j = 0); i < n; i++) { - if (SAIS$_isLMS$LBitVector$I(t, i)) { - s1.set$II(j++, i); - } - } - for (i = 0; i < n1; i++) { - SA1[i] = s1.get$I((function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:235:31] null access\n SA1[i] = s1.get(SA1[i]); // get index in s\n ^\n"); - } - return v; - }(SA1[i]))); - } - for (i = n1; i < n; i++) { - SA[i] = (- 1 | 0); - } - for (i = n1 - 1; i >= 0; i--) { - j = (function (v) { - if (! (v != null)) { - debugger; - throw new Error("[src/sais.jsx:243:18] null access\n j = SA[i];\n ^\n"); - } - return v; - }(SA[i])); - SA[i] = (- 1 | 0); - SA[-- bkt[s.get$I(j)]] = (j | 0); - } - SAIS$_induceSAl$LBitVector$AILOArray$AIIIB(t, SA, s, bkt, n, K, false); - SAIS$_induceSAs$LBitVector$AILOArray$AIIIB(t, SA, s, bkt, n, K, true); -}; - -var SAIS$_make$LOArray$AIII = SAIS._make$LOArray$AIII; - -OktaviaSearch._stemmer = null; -OktaviaSearch._instance = null; -$__jsx_lazy_init(Oktavia, "eof", function () { - return String.fromCharCode(0); -}); -$__jsx_lazy_init(Oktavia, "eob", function () { - return String.fromCharCode(1); -}); -$__jsx_lazy_init(Oktavia, "unknown", function () { - return String.fromCharCode(3); -}); -Binary._base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -$__jsx_lazy_init(Binary, "_base64DecodeChars", function () { - return [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, 62, - 1, - 1, - 1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 1, - 1, - 1, - 1, - 1, - 1, - 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 1, - 1, - 1, - 1, - 1, - 1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 1, - 1, - 1, - 1, - 1 ]; -}); -$__jsx_lazy_init(Style, "console", function () { - return ({ 'title': [ '\x1B[32m\x1b[4m', '\x1B[39m\x1b[0m' ], 'url': [ '\x1B[34m', '\x1B[39m' ], 'hit': [ '\x1B[4m', '\x1B[0m' ], 'del': [ '\x1B[9m', '\x1B[0m' ], 'summary': [ '\x1B[90m', '\x1B[39m' ] }); -}); -$__jsx_lazy_init(Style, "html", function () { - return ({ 'title': [ '<span class="title">', '</span>' ], 'url': [ '<span class="url">', '</span>' ], 'hit': [ '<span class="hit">', '</span>' ], 'del': [ '<del>', '</del>' ], 'summary': [ '<span class="reuslt">', '</span>' ] }); -}); -$__jsx_lazy_init(Style, "ignore", function () { - return ({ 'tilte': [ '', '' ], 'url': [ '', '' ], 'hit': [ '', '' ], 'del': [ '', '' ], 'summary': [ '', '' ] }); -}); -EnglishStemmer.serialVersionUID = 1; -$__jsx_lazy_init(EnglishStemmer, "methodObject", function () { - return new EnglishStemmer$(); -}); -$__jsx_lazy_init(EnglishStemmer, "a_0", function () { - return [ new Among$SII("arsen", - 1, - 1), new Among$SII("commun", - 1, - 1), new Among$SII("gener", - 1, - 1) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_1", function () { - return [ new Among$SII("'", - 1, 1), new Among$SII("'s'", 0, 1), new Among$SII("'s", - 1, 1) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_2", function () { - return [ new Among$SII("ied", - 1, 2), new Among$SII("s", - 1, 3), new Among$SII("ies", 1, 2), new Among$SII("sses", 1, 1), new Among$SII("ss", 1, - 1), new Among$SII("us", 1, - 1) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_3", function () { - return [ new Among$SII("", - 1, 3), new Among$SII("bb", 0, 2), new Among$SII("dd", 0, 2), new Among$SII("ff", 0, 2), new Among$SII("gg", 0, 2), new Among$SII("bl", 0, 1), new Among$SII("mm", 0, 2), new Among$SII("nn", 0, 2), new Among$SII("pp", 0, 2), new Among$SII("rr", 0, 2), new Among$SII("at", 0, 1), new Among$SII("tt", 0, 2), new Among$SII("iz", 0, 1) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_4", function () { - return [ new Among$SII("ed", - 1, 2), new Among$SII("eed", 0, 1), new Among$SII("ing", - 1, 2), new Among$SII("edly", - 1, 2), new Among$SII("eedly", 3, 1), new Among$SII("ingly", - 1, 2) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_5", function () { - return [ new Among$SII("anci", - 1, 3), new Among$SII("enci", - 1, 2), new Among$SII("ogi", - 1, 13), new Among$SII("li", - 1, 16), new Among$SII("bli", 3, 12), new Among$SII("abli", 4, 4), new Among$SII("alli", 3, 8), new Among$SII("fulli", 3, 14), new Among$SII("lessli", 3, 15), new Among$SII("ousli", 3, 10), new Among$SII("entli", 3, 5), new Among$SII("aliti", - 1, 8), new Among$SII("biliti", - 1, 12), new Among$SII("iviti", - 1, 11), new Among$SII("tional", - 1, 1), new Among$SII("ational", 14, 7), new Among$SII("alism", - 1, 8), new Among$SII("ation", - 1, 7), new Among$SII("ization", 17, 6), new Among$SII("izer", - 1, 6), new Among$SII("ator", - 1, 7), new Among$SII("iveness", - 1, 11), new Among$SII("fulness", - 1, 9), new Among$SII("ousness", - 1, 10) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_6", function () { - return [ new Among$SII("icate", - 1, 4), new Among$SII("ative", - 1, 6), new Among$SII("alize", - 1, 3), new Among$SII("iciti", - 1, 4), new Among$SII("ical", - 1, 4), new Among$SII("tional", - 1, 1), new Among$SII("ational", 5, 2), new Among$SII("ful", - 1, 5), new Among$SII("ness", - 1, 5) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_7", function () { - return [ new Among$SII("ic", - 1, 1), new Among$SII("ance", - 1, 1), new Among$SII("ence", - 1, 1), new Among$SII("able", - 1, 1), new Among$SII("ible", - 1, 1), new Among$SII("ate", - 1, 1), new Among$SII("ive", - 1, 1), new Among$SII("ize", - 1, 1), new Among$SII("iti", - 1, 1), new Among$SII("al", - 1, 1), new Among$SII("ism", - 1, 1), new Among$SII("ion", - 1, 2), new Among$SII("er", - 1, 1), new Among$SII("ous", - 1, 1), new Among$SII("ant", - 1, 1), new Among$SII("ent", - 1, 1), new Among$SII("ment", 15, 1), new Among$SII("ement", 16, 1) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_8", function () { - return [ new Among$SII("e", - 1, 1), new Among$SII("l", - 1, 2) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_9", function () { - return [ new Among$SII("succeed", - 1, - 1), new Among$SII("proceed", - 1, - 1), new Among$SII("exceed", - 1, - 1), new Among$SII("canning", - 1, - 1), new Among$SII("inning", - 1, - 1), new Among$SII("earring", - 1, - 1), new Among$SII("herring", - 1, - 1), new Among$SII("outing", - 1, - 1) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "a_10", function () { - return [ new Among$SII("andes", - 1, - 1), new Among$SII("atlas", - 1, - 1), new Among$SII("bias", - 1, - 1), new Among$SII("cosmos", - 1, - 1), new Among$SII("dying", - 1, 3), new Among$SII("early", - 1, 9), new Among$SII("gently", - 1, 7), new Among$SII("howe", - 1, - 1), new Among$SII("idly", - 1, 6), new Among$SII("lying", - 1, 4), new Among$SII("news", - 1, - 1), new Among$SII("only", - 1, 10), new Among$SII("singly", - 1, 11), new Among$SII("skies", - 1, 2), new Among$SII("skis", - 1, 1), new Among$SII("sky", - 1, - 1), new Among$SII("tying", - 1, 5), new Among$SII("ugly", - 1, 8) ]; -}); -$__jsx_lazy_init(EnglishStemmer, "g_v", function () { - return [ 17, 65, 16, 1 ]; -}); -$__jsx_lazy_init(EnglishStemmer, "g_v_WXY", function () { - return [ 1, 17, 65, 208, 1 ]; -}); -$__jsx_lazy_init(EnglishStemmer, "g_valid_LI", function () { - return [ 55, 141, 2 ]; -}); -$__jsx_lazy_init(_Common, "buffers", function () { - return [ "comment", "sgmlDecl", "textNode", "tagName", "doctype", "procInstName", "procInstBody", "entity", "attribName", "attribValue", "cdata", "script" ]; -}); -$__jsx_lazy_init(_Common, "EVENTS", function () { - return [ "text", "processinginstruction", "sgmldeclaration", "doctype", "comment", "attribute", "opentag", "closetag", "opencdata", "cdata", "clo_State.CDATA", "error", "end", "ready", "script", "opennamespace", "closenamespace" ]; -}); -$__jsx_lazy_init(_Common, "MAX_BUFFER_LENGTH", function () { - return 64 * 1024; -}); -_State.BEGIN = 1; -_State.TEXT = 2; -_State.TEXT_ENTITY = 3; -_State.OPEN_WAKA = 4; -_State.SGML_DECL = 5; -_State.SGML_DECL_QUOTED = 6; -_State.DOCTYPE = 7; -_State.DOCTYPE_QUOTED = 8; -_State.DOCTYPE_DTD = 9; -_State.DOCTYPE_DTD_QUOTED = 10; -_State.COMMENT_STARTING = 11; -_State.COMMENT = 12; -_State.COMMENT_ENDING = 13; -_State.COMMENT_ENDED = 14; -_State.CDATA = 15; -_State.CDATA_ENDING = 16; -_State.CDATA_ENDING_2 = 17; -_State.PROC_INST = 18; -_State.PROC_INST_BODY = 19; -_State.PROC_INST_ENDING = 20; -_State.OPEN_TAG = 21; -_State.OPEN_TAG_SLASH = 22; -_State.ATTRIB = 23; -_State.ATTRIB_NAME = 24; -_State.ATTRIB_NAME_SAW_WHITE = 25; -_State.ATTRIB_VALUE = 26; -_State.ATTRIB_VALUE_QUOTED = 27; -_State.ATTRIB_VALUE_UNQUOTED = 28; -_State.ATTRIB_VALUE_ENTITY_Q = 29; -_State.ATTRIB_VALUE_ENTITY_U = 30; -_State.CLOSE_TAG = 31; -_State.CLOSE_TAG_SAW_WHITE = 32; -_State.SCRIPT = 33; -_State.SCRIPT_ENDING = 34; -$__jsx_lazy_init(_Entities, "_entities", function () { - return ({ "amp": "&", "gt": ">", "lt": "<", "quot": "\"", "apos": "'", "AElig": 198, "Aacute": 193, "Acirc": 194, "Agrave": 192, "Aring": 197, "Atilde": 195, "Auml": 196, "Ccedil": 199, "ETH": 208, "Eacute": 201, "Ecirc": 202, "Egrave": 200, "Euml": 203, "Iacute": 205, "Icirc": 206, "Igrave": 204, "Iuml": 207, "Ntilde": 209, "Oacute": 211, "Ocirc": 212, "Ograve": 210, "Oslash": 216, "Otilde": 213, "Ouml": 214, "THORN": 222, "Uacute": 218, "Ucirc": 219, "Ugrave": 217, "Uuml": 220, "Yacute": 221, "aacute": 225, "acirc": 226, "aelig": 230, "agrave": 224, "aring": 229, "atilde": 227, "auml": 228, "ccedil": 231, "eacute": 233, "ecirc": 234, "egrave": 232, "eth": 240, "euml": 235, "iacute": 237, "icirc": 238, "igrave": 236, "iuml": 239, "ntilde": 241, "oacute": 243, "ocirc": 244, "ograve": 242, "oslash": 248, "otilde": 245, "ouml": 246, "szlig": 223, "thorn": 254, "uacute": 250, "ucirc": 251, "ugrave": 249, "uuml": 252, "yacute": 253, "yuml": 255, "copy": 169, "reg": 174, "nbsp": 160, "iexcl": 161, "cent": 162, "pound": 163, "curren": 164, "yen": 165, "brvbar": 166, "sect": 167, "uml": 168, "ordf": 170, "laquo": 171, "not": 172, "shy": 173, "macr": 175, "deg": 176, "plusmn": 177, "sup1": 185, "sup2": 178, "sup3": 179, "acute": 180, "micro": 181, "para": 182, "middot": 183, "cedil": 184, "ordm": 186, "raquo": 187, "frac14": 188, "frac12": 189, "frac34": 190, "iquest": 191, "times": 215, "divide": 247, "OElig": 338, "oelig": 339, "Scaron": 352, "scaron": 353, "Yuml": 376, "fnof": 402, "circ": 710, "tilde": 732, "Alpha": 913, "Beta": 914, "Gamma": 915, "Delta": 916, "Epsilon": 917, "Zeta": 918, "Eta": 919, "Theta": 920, "Iota": 921, "Kappa": 922, "Lambda": 923, "Mu": 924, "Nu": 925, "Xi": 926, "Omicron": 927, "Pi": 928, "Rho": 929, "Sigma": 931, "Tau": 932, "Upsilon": 933, "Phi": 934, "Chi": 935, "Psi": 936, "Omega": 937, "alpha": 945, "beta": 946, "gamma": 947, "delta": 948, "epsilon": 949, "zeta": 950, "eta": 951, "theta": 952, "iota": 953, "kappa": 954, "lambda": 955, "mu": 956, "nu": 957, "xi": 958, "omicron": 959, "pi": 960, "rho": 961, "sigmaf": 962, "sigma": 963, "tau": 964, "upsilon": 965, "phi": 966, "chi": 967, "psi": 968, "omega": 969, "thetasym": 977, "upsih": 978, "piv": 982, "ensp": 8194, "emsp": 8195, "thinsp": 8201, "zwnj": 8204, "zwj": 8205, "lrm": 8206, "rlm": 8207, "ndash": 8211, "mdash": 8212, "lsquo": 8216, "rsquo": 8217, "sbquo": 8218, "ldquo": 8220, "rdquo": 8221, "bdquo": 8222, "dagger": 8224, "Dagger": 8225, "bull": 8226, "hellip": 8230, "permil": 8240, "prime": 8242, "Prime": 8243, "lsaquo": 8249, "rsaquo": 8250, "oline": 8254, "frasl": 8260, "euro": 8364, "image": 8465, "weierp": 8472, "real": 8476, "trade": 8482, "alefsym": 8501, "larr": 8592, "uarr": 8593, "rarr": 8594, "darr": 8595, "harr": 8596, "crarr": 8629, "lArr": 8656, "uArr": 8657, "rArr": 8658, "dArr": 8659, "hArr": 8660, "forall": 8704, "part": 8706, "exist": 8707, "empty": 8709, "nabla": 8711, "isin": 8712, "notin": 8713, "ni": 8715, "prod": 8719, "sum": 8721, "minus": 8722, "lowast": 8727, "radic": 8730, "prop": 8733, "infin": 8734, "ang": 8736, "and": 8743, "or": 8744, "cap": 8745, "cup": 8746, "int": 8747, "there4": 8756, "sim": 8764, "cong": 8773, "asymp": 8776, "ne": 8800, "equiv": 8801, "le": 8804, "ge": 8805, "sub": 8834, "sup": 8835, "nsub": 8836, "sube": 8838, "supe": 8839, "oplus": 8853, "otimes": 8855, "perp": 8869, "sdot": 8901, "lceil": 8968, "rceil": 8969, "lfloor": 8970, "rfloor": 8971, "lang": 9001, "rang": 9002, "loz": 9674, "spades": 9824, "clubs": 9827, "hearts": 9829, "diams": 9830 }); -}); -BitVector.SMALL_BLOCK_SIZE = 32; -BitVector.LARGE_BLOCK_SIZE = 256; -BitVector.BLOCK_RATE = 8; -$__jsx_lazy_init(BurrowsWheelerTransform, "END_MARKER", function () { - return String.fromCharCode(0); -}); -var $__jsx_classMap = { - "tool/web/oktavia-english-search.jsx": { - _Main: _Main, - _Main$: _Main$ - }, - "tool/web/oktavia-search.jsx": { - _Result: _Result, - _Result$SSSI: _Result$SSSI, - _Proposal: _Proposal, - _Proposal$SSI: _Proposal$SSI, - OktaviaSearch: OktaviaSearch, - OktaviaSearch$I: OktaviaSearch$I, - _Main: _Main$0, - _Main$: _Main$0$ - }, - "src/oktavia.jsx": { - Oktavia: Oktavia, - Oktavia$: Oktavia$ - }, - "src/binary-util.jsx": { - Binary: Binary, - Binary$: Binary$, - LoadedStringResult: LoadedStringResult, - LoadedStringResult$SI: LoadedStringResult$SI, - LoadedStringListResult: LoadedStringListResult, - LoadedStringListResult$SI: LoadedStringListResult$SI, - LoadedStringListMapResult: LoadedStringListMapResult, - LoadedStringListMapResult$SI: LoadedStringListMapResult$SI, - LoadedNumberListResult: LoadedNumberListResult, - LoadedNumberListResult$SI: LoadedNumberListResult$SI, - CompressionReport: CompressionReport, - CompressionReport$: CompressionReport$ - }, - "src/query.jsx": { - Query: Query, - Query$: Query$ - }, - "src/query-string-parser.jsx": { - QueryStringParser: QueryStringParser, - QueryStringParser$: QueryStringParser$ - }, - "src/search-result.jsx": { - Proposal: Proposal, - Proposal$II: Proposal$II, - Position: Position, - Position$SIB: Position$SIB, - SearchUnit: SearchUnit, - SearchUnit$I: SearchUnit$I, - SingleResult: SingleResult, - SingleResult$: SingleResult$, - SingleResult$SBB: SingleResult$SBB, - SearchSummary: SearchSummary, - SearchSummary$: SearchSummary$, - SearchSummary$LOktavia$: SearchSummary$LOktavia$ - }, - "src/style.jsx": { - Style: Style, - Style$S: Style$S, - _HTMLHandler: _HTMLHandler, - _HTMLHandler$HASB: _HTMLHandler$HASB - }, - "src/stemmer/stemmer.jsx": { - Stemmer: Stemmer, - Stemmer$: Stemmer$ - }, - "src/stemmer/base-stemmer.jsx": { - BaseStemmer: BaseStemmer, - BaseStemmer$: BaseStemmer$ - }, - "src/stemmer/english-stemmer.jsx": { - EnglishStemmer: EnglishStemmer, - EnglishStemmer$: EnglishStemmer$ - }, - "src/stemmer/among.jsx": { - Among: Among, - Among$SII: Among$SII, - Among$SIIF$LBaseStemmer$B$LBaseStemmer$: Among$SIIF$LBaseStemmer$B$LBaseStemmer$ - }, - "src/metadata.jsx": { - Metadata: Metadata, - Metadata$LOktavia$: Metadata$LOktavia$, - Section: Section, - Section$LOktavia$: Section$LOktavia$, - Splitter: Splitter, - Splitter$LOktavia$: Splitter$LOktavia$, - Splitter$LOktavia$S: Splitter$LOktavia$S, - Table: Table, - Table$LOktavia$AS: Table$LOktavia$AS, - Block: Block, - Block$LOktavia$: Block$LOktavia$ - }, - "src/fm-index.jsx": { - FMIndex: FMIndex, - FMIndex$: FMIndex$ - }, - "src/sax.jsx": { - Tag: Tag, - Tag$S: Tag$S, - _Common: _Common, - _Common$: _Common$, - _State: _State, - _State$: _State$, - SAXHandler: SAXHandler, - SAXHandler$: SAXHandler$, - SAXParser: SAXParser, - SAXParser$LSAXHandler$: SAXParser$LSAXHandler$, - SAXParser$LSAXHandler$B: SAXParser$LSAXHandler$B, - Char: Char, - Char$: Char$, - _Entities: _Entities, - _Entities$: _Entities$ - }, - "src/bit-vector.jsx": { - BitVector: BitVector, - BitVector$: BitVector$ - }, - "src/wavelet-matrix.jsx": { - WaveletMatrix: WaveletMatrix, - WaveletMatrix$: WaveletMatrix$ - }, - "src/burrows-wheeler-transform.jsx": { - BurrowsWheelerTransform: BurrowsWheelerTransform, - BurrowsWheelerTransform$: BurrowsWheelerTransform$ - }, - "src/sais.jsx": { - OArray: OArray, - OArray$AI: OArray$AI, - OArray$AII: OArray$AII, - SAIS: SAIS, - SAIS$: SAIS$ - } -}; - - -/** - * launches _Main.main(:string[]):void invoked by jsx --run|--executable - */ -JSX.runMain = function (sourceFile, args) { - var module = JSX.require(sourceFile); - if (! module) { - throw new ReferenceError("entry point module not found in " + sourceFile); - } - if (! module._Main) { - throw new ReferenceError("entry point _Main not found in " + sourceFile); - } - if (! module._Main.main$AS) { - throw new ReferenceError("entry point _Main.main(:string[]):void not found in " + sourceFile); - } - module._Main.main$AS(args); -}; - -/** - * launches _Test#test*():void invoked by jsx --test - */ -JSX.runTests = function (sourceFile, tests) { - var module = JSX.require(sourceFile); - var testClass = module._Test$; - - if (!testClass) return; // skip if there's no test class - - if(tests.length === 0) { - var p = testClass.prototype; - for (var m in p) { - if (p[m] instanceof Function - && /^test.*[$]$/.test(m)) { - tests.push(m); - } - } - } - else { // set as process arguments - tests = tests.map(function (name) { - return name + "$"; // mangle for function test*():void - }); - } - - var testCase = new testClass(); - - if (testCase.beforeClass$AS != null) - testCase.beforeClass$AS(tests); - - for (var i = 0; i < tests.length; ++i) { - (function (method) { - if (method in testCase) { - testCase.run$SF$V$(method, function() { testCase[method](); }); - } - else { - throw new ReferenceError("No such test method: " + method); - } - }(tests[i])); - } - - if (testCase.afterClass$ != null) - testCase.afterClass$(); -}; -/** - * call a function on load/DOMContentLoaded - */ -function $__jsx_onload (event) { - window.removeEventListener("load", $__jsx_onload); - document.removeEventListener("DOMContentLoaded", $__jsx_onload); - JSX.runMain("tool/web/oktavia-english-search.jsx", []) -} - -window.addEventListener("load", $__jsx_onload); -document.addEventListener("DOMContentLoaded", $__jsx_onload); - -})(JSX); diff --git a/debian/vendor-h2o/doc/search/oktavia-jquery-ui.js b/debian/vendor-h2o/doc/search/oktavia-jquery-ui.js deleted file mode 100644 index 8bbf898..0000000 --- a/debian/vendor-h2o/doc/search/oktavia-jquery-ui.js +++ /dev/null @@ -1,175 +0,0 @@ -$(document).ready(function () -{ - // it stores search object - var searchInstance; - - function changePage(event) - { - searchInstance.setCurrentPage$I(event.data); - updateResult(); - } - - function clearResult() - { - $('#search').val(''); - $('#searchresult_box').fadeOut(); - } - - // http://os0x.hatenablog.com/entry/20080827/1219815828 - function JavaScriptLoader(src, callback) - { - var sc = document.createElement('script'); - sc.type = 'text/javascript'; - if (window.ActiveXObject) - { - sc.onreadystatechange = function() - { - if (sc.readyState == 'complete' || sc.readyState == 'loaded') - { - callback(sc.readyState); - } - }; - } - else - { - sc.onload = function() - { - callback('onload'); - }; - } - sc.src = src; - document.body.appendChild(sc); - } - - function updateResult() - { - var totalPages = searchInstance.totalPages$(); - var currentPage = searchInstance.currentPage$(); - var nav = $('#searchresult_nav'); - var resultslot = $('#searchresult'); - nav.empty(); - resultslot.empty(); - var i; - for (i = 1; i <= totalPages; i++) - { - var pageItem = $('<span/>').text(i); - if (i !== currentPage) - { - pageItem.bind('click', i, changePage); - } - else - { - pageItem.addClass('selected'); - } - nav.append(pageItem); - } - var results = searchInstance.getResult$(); - for (i = 0; i < results.length; i++) - { - var result = results[i]; - var url = result.url.slice(1); - var entry = $('<div/>', { "class": "entry" }); - var link = $('<a/>', { "href": url }).text(result.title); - link.on('click', clearResult); - entry.append($('<div/>', { "class": "title" }).append(link)); - entry.append($('<div/>', { "class": "url" }).text(url)); - entry.append($('<div/>', { "class": "content" }).html(result.content)); - resultslot.append(entry); - } - } - - function searchProposal(event) - { - $('#search').val(event.data.option); - search(); - } - - function updateProposal() - { - var nav = $('#searchresult_nav'); - var resultslot = $('#searchresult'); - nav.empty(); - resultslot.empty(); - var proposals = searchInstance.getProposals$(); - for (var i = 0; i < proposals.length; i++) - { - var proposal = proposals[i]; - var listitem = $('<div/>', {"class": "proposal"}); - listitem.append('<span>Search with: </span>'); - var option = $('<span/>', {"class": "option"}); - option.html(proposal.label); - option.on('click', {'option': proposal.options}, searchProposal); - listitem.append(option); - listitem.append('<span> → ' + proposal.count + ' results.</span>'); - resultslot.append(listitem); - } - } - - function search () - { - var queryWord = $('#search').val(); - searchInstance.search$SF$IIV$(queryWord, function (total, pages) - { - $('#searchresult_box').fadeIn(); - console.log("Total: ", total); - if (total === 0) - { - $('#searchresult_summary').text("No result."); - updateProposal(); - } - else - { - $('#searchresult_summary').text(total + ' results.'); - updateResult(); - } - }); - } - - // initialize function - function initialize () - { - if (!searchInstance) - { - var OktaviaSearch = JSX.require("tool/web/oktavia-search.jsx").OktaviaSearch$I; - searchInstance = new OktaviaSearch(5); - } - JavaScriptLoader('search/searchindex.js', function () - { - searchInstance.loadIndex$S(searchIndex); - searchIndex = null; - }); - $('#searchform').on('submit', function (event) { - event.stopPropagation(); - setTimeout(search, 10); - return false; - }); - $('#close_search_box').on('click', function (event) { - clearResult(); - }); - } - initialize(); -}); - -/*function keyboardHook(event) -{ - if (event.keyCode === 191 && document.activeElement.id !== searchBoxId) // slash - { - document.getElementById(searchBoxId).focus(); - } -} - -if (window.addEventListener) -{ - window.addEventListener('load', initialize, false); - document.addEventListener("keydown" , keyboardHook); -} -if (window.attachEvent) -{ - window.attachEvent('onload', initialize); - document.attachEvent("onkeydown" , keyboardHook); -} - -})(); -}); -*/ - diff --git a/debian/vendor-h2o/doc/search/searchindex.js b/debian/vendor-h2o/doc/search/searchindex.js deleted file mode 100644 index acebb66..0000000 --- a/debian/vendor-h2o/doc/search/searchindex.js +++ /dev/null @@ -1,2 +0,0 @@ -// Oktavia Search Index -var searchIndex = "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AQABQEsAAQNAAQAQAAQAAAIIAAAAAAABAQAMAAAAAQFg8goACAgAAgQQACAAAQAAAIAQBAAIAABCAACAAFAgAIAEAAAQAAAAAAAQOIAABD4AAAAABAAAIAAA/3/9/yx1QIiAIe0eABAggBBkIygAgIQAAM4AAADoDQAAAQEAAQAQSAAAkDkAAAgwIAAAAYA4EAAAAAgGAAAAABAAARGAfwAkADwDBADAoggABwEBAgAAAAAAAAAAAQQBAQAAWAAAAEAAAAIAAABAIAAYAAACAABAQABABoAAACAAAAAAAAMAAAAAAQAIBAAAABgEEAAAACD+h3NA/0EK8YAhqAAAQAAIAABUAAACAIAIQSACGAIAogIAJkC/f487AAAAAP//AIASYP9vAASAAExQ4IHbYwD85P/6r4nsP398gwZggRtF4v//Qv6///////3//7Db/wNff//f7///9/F/9+/f/+/7/////259//////x///////////////////////////3///v/Oyt/////2v//////gGL79k9mPmgABAgAzQtTe2QQfwEUfS4DJJw2DwAAOIABAEhA//8AwCIA/zdoNxTffkYPwJABIEgG8oQBgIAAQAIIIAIAAyAgAEACZBG3QEAgEloAgABNaAHhsJ0AAB8AYAgAKV4GISUAqwAIxOtLhgEGP8FNyQbdFAoAMEKcAQBrDgcAAIAAAGBi0BR2KxSCAAFASQeXAGbgkL1LgAEAJgMADI8pQP//xP+IAAH+j4IAIB/yBfoYegAAYAC3/ijuO/ApwYIj/28g/71BAwD/AQAAAAAAMAAAAAAAAACAAAAAAAAAAMAAAf//APr8A8E/s/8A/wAA/z8AAAAABAAAAAA8AAAAAAAAABBAAAAAAAD/H1/7AAAAAO3/gh/9f///QAABAADgGAAABP8DAMAAAAAAIgAAABgAYPtAAAAAvzP8gAAAAAADAAoAA0D0AgAA/geUCwAANABeAAACAQAJQDgAAAAAAAAEAQAACAAAAAgGAAAIAAAIAADfAJwZ4vz6AAAjAAACAAABAN/EAADAAAAAIACAAAAQIAAAwQACAMAAAAAIAAABBAAeAgAAAIFAf94AIM4bAQAGDgALAAAAAACAAODQAiAcAwD///i/S+8AhuW/3/wEAAEHAAABAP//8P/f9/////////////////j/AAAAAAEAAgAAAPD/AAAIAA8AABAQABAAAAACAAAAAOAACAAAMABHgAAGAAAAAGJ88AMAAAIAAAAPAAHY4AEAAAAAEABgAAAA4B8AABJA/h8OAggAOAAAgQAAF34A5H8A5/8BAAABAACADQAIAAAAMAAAAQAEgN///v///f/P////////f4D/////////////////////AAD3HwIAx8UAAAACAAAAgAAAABDAfwAAAAATBQAAQAAAAAQAAADAAAAAeZQHAAD4AIAAAAFA9/8PCBDMAAAIAAAAAAEAAAgA0aAEAAAQAEAAAAABAAAAAEAEAAAIAAMAcaMAQgAAAAAAIAAAAAQAABAAAACAAAAAAAIAAwAABAAHg4AAAAC4ABAA5R8BAAAAAKAMAAAgAgAHkAACAAD4cQAAAAB/AP4DAMDPj48AAOAAAGQABAgAEAAAAMAOAACAAAAgAAAAAQAAAAAOAB8AAAIAA1IAAABAAAAAUAsAj4cEBAAA4AEAAgAAMTACAIAAAACA/wBAgAwAAAEsAAB8APmmcAAAAP8EAOAAAAMAABAAAAAAgCIAAAAIAADAAAAAgQcAAAADAgAXowAA4AH/fwCAAACAAAIAAADgAAAAAAAIAAABQAACAAeQAAQAAAAEAAAAAFAIAAAAAgEA9YcCcAAwAQAAAID58D8AAP8HAAAQAP//FPwQgD54//////8A//8BAKfQBADgCAAAAAYEAAAQAAAIAAAAMAAwwAAAgAMAACGCAAAADwAQAAAQAAAABwAHhAAAABAAEAAAAAADAAgAAAADAC3+AEACAAAAAgYDAAAAAAACAAAgAAA4AKAAAMAAAAAA/2f4/wAA/////5/X//////////8PcP///gUJQAECADgA6AAAAIoLAACA4ecMAAd5AwAA+P//4ICP/AKA3wAAAAsAwAAAAAAAGAAAAADA//8AgP////8AAAcAABAAAAAAAAT/5XgAAAD//+D//////////////////////wAA/wAgAAAAAAAGAIAFAAAA+AAAgAD/BzH1AAAJAIAAAgPgAQAAAAEAAAA0AAAAwAAAAABBAAAAAIABAAeDlAAAAAAAIAAAAAAQAAEAAAAAAEAHAHGwCAA2AAcAAAAAgwAgOADxHz/uAAAAAAcAEAAAQAAAACAKAI+GAHgAAAAQAAAAAQAABAAIAAQA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xG4aAAAAAAACAACAAIMA4AAAGD0IQEFAECBCIDEBgHAAACIAAVQBwACAAgBQFgx0B8ZnwAwBA3ZWICIEKBBEAQAMAABACAAgAAB//xCCfsy/GQTlf+9BBPOOyvuAuhAAMKAAUCABggHAgF4QAIApawJI7//2v5TH/jsEjAMOAgC/ngCOAABB556fBAAPAAEchDIRICDg2BjGhBBAAAAAAKDgQAAIAgBRAAACFgEmI0AACAAA+QQAIAD5AAbYAgAAAAAAIICgAAAYAEAgRAFHAgBAAQAHBQD4AAAGAAAAANgQGwAAAHgACABaADCAAAAgAIIACAAAAgACQAQCAAAAAbYBEAAAgiAA/l8JAgEAoKAIAAJKAAAAIOCQAAAAHAb+GQAA2AAAAAAgAAAAAAAEAAAQAAAAAAAAAMAAAP8f+f8BAAVA///8/5cP//HA//j///8//AAA/weACAAABAAsQAMA8PgADwAAAAAABwADAAAAAAAAAABAADgAAAAA8AAABgBROPCBAAAAAf8DKPRABAjwkAH/Xx8AAP/5H//j//zPB///Ffz+/4cA/74ARABwACAAIAAAAQAAMAhg/w9gAAAAAABHAHDgQQAOgOi9YBRQAPtswA4kBwtWkNVsBuAQwBwTYkgAQgBiAgL0CpWM4D9oIMEqAIICHaLeAOZ/ISbg9wf2IMZ/TAAAsAACAAAAQIBwAAEAFUA/wMD/fQiFDP//IPD/////fr1/oAAgJBwBAP7vvf4AAPD/JQT///////////////////////////////8AAP8DDxAAAADwAAT/D7/+gAkAIAAvoMEHAP7/AQACQADAAAAkOH8OAAADsBMAHeGfAwCAfQAGIAAAAD4QAAQA/X8A/Bd0/P+f8Av9EkAAwH+A8AH/P/j7AMA/wf3/APRfbBtA9/7///7/BwD/v/sPBBD//QCAAAAPAID/AACd/4P+BQTHgAD8gAAAIAAAAAIAgAAAAGD/AKD/AwA8QL//APy//////wH3v/A/AAD///z7APh/AAAA/wMAHAAAAMAAAAAAHwAABQAACQBAAFAIQAjAAACABWAAwABAAAAABABAgwAAmAB+AgAEIAAAwQAEgAAAAABAAIABAAACAGAAEAgAMgCAQCAIQAAAAAABBhAQQABMQCwAAAABACAAABAAgAACCAAAAAIgAAQCAOgAAAAAAAEiAABBACAAAIUQQiBQAAAgAAAAAABAAAAAAIAAIABAARgAkAQAACD/fwAgRAQAAACAQAEaADARAAgIQAAAEwLgAAAAgEn//QIQ935/////+/8AAP9AAAAAAAIAAAwDADnjADQAAIABAAAAAAAIAAAACH8U+f8AAACACAEAAAAArhn/jhYIAAYAAImAhYmCCAAIHgIDFA7IxP2BIQEAQOJgAAAAAAAACP+bAOABAP6BAAAAQP0DAPwCABJAj+8vwNs/AP/4/+AIv4n/aQAAADQAABAECQAOBwCqAIAA/sgAACAfEAP4CA8AAwBAAAAACSgAAHcHFvz/AAAAAQCAAED/AwD4AACAAAEAPd/wHwAAAMEAAACAAgAAAP138D8AAAPwAIL//z/w/4P//8H//nIAAP8A///Q/xuQhgDfP3sA/9UA4AAAAAC+XwAA8AAFABBAABgAAAAIAAACBAoAYAMABJIBIGCoCOQBAAAAAAWcAhoAAAECPgAA8SgEYqgx4AAE//8+9BgAPwi7g/j/IGkgEAAAAAECAEVAAAAwAAAAAAAQAAAAAwYAAADwAAACf/8HAAAAQAiAAIEAcAAA/z9wwgDeYAPwfzX4Pzx5+IAmABgAkMAPxIf//8D/JwD/j////88B/wAAeFkAAAAAAAAcAAAAACCEAAAAzwEA+P///v/////////////////v4/////8ZDQHo///3A0MZ/x+G//8f//8ASAAAAOAAADsA//9ggAAAgECbAAAAhDv4PwAYAPw4AP+////+Hf+Ge/88h2///z/Ht9/4///443cREVMAAABiBkAAvEV4QWDf4gh8P/G//P6/HgT4eP4Z/w/2//1EIACnASAo/yOA/wAAGAD//wCA/////////////////////////////////////wEA/8j/////A////z/+D/z//8//AAA/AAD8AABXBEDwAACAAAAQAAAAgL5+7/cAAH9/+P+AAf//////B///BPwA4gAAEwJf+vDxAPwnHBAJV6IXAOL/APiAP///////////BUACAP+fMQE28iXwgA8IAA4AIPIAAAAAzx8BADtAAIMAAAAAAwAAUAAAsADhBwACAAD8/xsTdw3/v6CfB6U9Arv/H/v/vwMJ/5n/f0j777sAgDgMg2ArgMAA+AcEAf5vtA79mehohIDYUgkBEgAAASAA/v8wA0Cc/3S4/0Ly0CP/3wA88GnQzhgFOSAggO8b998AAAAAQP8AAP7/88Pv/z/+/83r/wAAGBwCAoAAAADuA/z/AAABsP9//zPX/+cD+P4AAAAAAOgAAP9//4///3///////37v/j8AAP9fgOMAAP3///99bAcAwgiA4gAAzgCAAAAA98GA////////////HfrD/h9C/98AADgAAwDFgQYAAAAAgAAAAAAQAAACAABAAAAAdf6AAAAAAAAEAABgAAAAAAABSAAAAAAAGD8AABAAAAD8r///AIQAAP8X8EcAAGvz/wD4/wgAUAD4AQAAAHAAAGAAAAAAQAEAAAgggAgCQIAHAAAAAP8AgB/vAGD/P1gADgcAAP9+fyH8/wAAACCA/wAAGAAYIgABDAJAEhgAABAAAAAAGAB5QAA+AG4AAAAAwAcAQP///3f/////////////////////B/j///n/////R/3//xP8/f0J/nc++AIAIAB/A///+v///////////3cB/++ADwA4S+0k/f++6+277/f/P3IGH3vc/r/9h/+z+/6V9v/7/6q/7f5/+j9z+P/r+/n+///7//Tp/1m//zsFjEWTv/3//3fa//8AAP8AH/+A939+/c/n//wfdu+/Zh//v8z//7//e/P//v/f/v//////wAf/H/7fAP1v7667nhfem8wHMB22nxAxB+qNAb4F/Bf/1v/u/y8nPPrD54Rf/3D/////////r/+9/v/9feJ/798PwtZXAY7/f///////m//1P//////K+/////////2j12P//uv/f/f//f8////8v//////v+//f/w///y7v1c/+/r+//99/n///f//9/9756///+33+/y//f+H/////r3zO+6AP7pv48///9//m5xIA+AcA/v/wfx90/wvA//AfeRP/v+4/NLsw/t8ddwj/9+0ZfL4A4IQaMAhL/BPtAKBfsfV99/lQ9/uS8REHUf9/u3n/8Pn//5KGUf5bAAABAIDAAAAE0LcMfyhw/gDgcA////////6v/1///////f/fAfjbwP////8AAQEAAgBCQBAAAACA/wAAL/l/4CnPNd3//wPb/z/t7kAAEID///j/////7/3//3///////1D//wAAgBvf/3zxn2W///7++929f/HPAAA3CAAAAAAvAAD+wP+AAAwg/yHsAP2CCvkQwvwf//AnoIDu/y74//T/wV8AAP8DAiABQQAAAhCjQACAbN4A+AAA3wedAfDJAOsgAP8f//9UAAAAgPcAAH0X/0cAAAEA//8BgODp/wH/v//7/7w//vv//da/Q/j/v////79V///J/+7//9/f8vub/vv/uff7+297////pf8k6/7qsv+/Qf//////l///7wPOfwMEsz4A6QAA7wv7kv////8AAAAA///+/wcA//8DADFAAAgAAIH//3D//+/f/f///r////8f/3/8//78//ye////P53/TQJqNwAAAAAAIAAInx9sMAAADEIAfCYE//8A/wgAfwP///wf/z///wAAAACAswAAf8Zu/uj/C4A7AP//APwAAP//////BwHg//8A/yEADyDAeICn9gEKgGjjAUBiQoEEQAHgHgAbdACAQBAEAA0hrPCjP2C/AQXjOAQEBMMTkAEBACCYzqb04AAAHwDLaAAAhDb5av//Tu4yIPzElgUAbgAAAQAEAD/N/f8AAP//////////AAD//wAwAAAAAwABIAAAAAAIAAAEAABIAIAAACFA/f8zBh4//x8DAP7/4wHA/7z98D3//////////w9g///o/woAWcDn/wD/AwDy////wP////////8AAP9/BgAEoMDBAAD/R//y0dNfBv////P3nc3n//9////////P//////////0////8j/P7AQCf/3+w+H6fuwtR7k/cLwH89usAAAYAAAAIAAMAGEAA/AAA/////+b9/5d/oP7/Y/oAfD/tX+b//x788995r36JGP2//z+vwLn/owD85wf/////AAD/AQAAAAAAgAAAAAABAPj/AAAAAA8AAAgAAG/boocDAPH/HwBg4AAAAACECAAAAwD/+gLgAAAAwIDzAAABAAAAAAUAAAAEBAAAeACIAAAADAAAAAAAIAKAQAAAIAAAAAAEAADQAAG/vYIBAAAAAEAG/wMAAADgAAD/////BgBnGP9/AP8AACAAAOAAAADwAAB//sf8/gMAfGH+hAEAADwAAAAAAAEAzAcgoAcACsAA4ABgCKBtHv9vPP8A1z8II0CIvyFAAFVQCwBgfG9J/wfB8P//f4AGAADIAAAHJA/8JQAABgAAcBkJyv/3sQoIJ5wBABCAHQGf7PIEABAE9gd0WM7CDQiA/Qo/BN6h/d9A4gBiAAB+IPABg/8DzMT/fyD//////z/////+APj/////////////////D///+P+AAQAAAwBsgAAAQVkICAIAgEABABZAgAFAAAAIABA/ECgC/+8C+P/////v////AAA/AABAAAAwOAAA/f+R7wAA/////QDgG14/5IwLxw0PDgD/DgQwA/7/QuAfcP+B///+//////9/////AAA/AAAA4B8CAPvpjwUAADcANv9g/2AdAAAPAA8BAADA4MAHAAA8AOIDQAABAAAAAAAEAAAAAQAEABtAwe8AgA/gB4A/AAcAANjo7/7/AwAABP8/AP8AAB8D4/8AAAAA4Y8AWD//CaiEAA8AENgAAI8ng5///+D/gH//fx8AAMAAAAAA//8A/P///////w/8H4T/////v///Af///PsAAP//////////AAAPAAMA9+8AQAAAvwHhhgAAAOD///z5f/7//z0A//P9Hfyk7wB/////8M8AgP8DAAD/ACCAIAgEAMceS0AAPAAABwD8/wDAACCwGEwA/AucAYgA/AEAAAAAAAYAAAE+AhAGAJBwyQFCASD8AAAZAGkGwAAQCQiIogAAQCAg8BoKAwAAAAAQlPSDAAAJAgYACCBfMgAAAIAIACjAHwAAYd9MKQkAkCABAVEhACQE/5kA+AI+AQAwHQFAAMUABAMAMMAAIAAAsACgAP4BPEDgCAxIygwAhAD/GAD/Af//ABQABDTIOEABABRIAIgAAAAAhk1TR8AIIwCAwAAAUhKHAwDov4CA+D81AF8jnH38+tpg7k8ZcRgQA2AoxCEAYP///f//////////////v+/////9/////3///88AAP8AAAAAHAD+AAYDAP//AAAAAIAEAAAQAFoAgUAFgARD4z8hBYCAgCABAACAAQAAAAMAAwD5sQBMAAAAGAEAAM4QABz/JyAWzyAnI6B58PcDHrAAgAAAAgEfBN/YkP4YAEAAA0BMg0IIgoqASIIBSBgACgAABxzggADAAAAAAAMAAQAAAAEAT8EA/gAA//////////8AAMcEAABgAAAAYAAAABAAAQAIQOIAAGCA/wAAA/z/J/8D//8BIB9YQgAAAARBAAAAHwEACAAAACgAP7gAgP5/zxgAgAYA+EcAYAAAAAAPAABAACB/AwCIAAAAPAAQAADz2wABAAABAIADAOLgCwAAIgB/AcD/MASABIcfIuhAAAEAQAMAQAAAGENgACwkDkDwEgCQAOAAAAPMMMCdfP1f//////iQ/38ABBsAYAf4/Ux8gJ4AAAgAAAAAAAAARACAAAQAOAAHAIAAAAACAAFAAAgAIAAAAAEBAP+vAADAAAAAfAAQAAAA4B8AgP///N9//v/n////+3/9////////9///+wAA/w8AAgAAAgAGANn+AAAEEAACAAAAAAABAIAQAwAIQAAA/AAA////////////////GwD//4ABDAQQQP//AOD//////SD//xD5AAD//////////////+P/////DwD/gwD+AAD/////////////////////AAD/B4AAAAAAAAAIAwD/6wEAAAD/////vv//X/////8fgP//Ph8HGv//POr/////gP8/Pn8A//8AAAQAAUAAACFAAAC/53AbAAABAPajv//A9///////v///AAB4MIIgABAAYAAAAAIUDAIA/QPfB+D/wP8AAB9AAAD/7YfgAMAAEFMAAMAAAP9///9/f/j/v//8/z/w///g/+8AAgAHAAAAiADsZwDc//////z/3oAAAP8AAAEAAAD+AAD/////ABz/APf/AP7/9///Ax37+7o6/v/noUDIAAB0AAD/AAQC/w8A///w//////////////8P/gAABwACAOGHAAACAMDjAAD//////////wcA//+C/wAA70D//8WHAAQAAAAAAHwA/AAA////////////////AAD/HwxAAAAAwPj/AAz/////BACvDwAAAID///7//x///w9y8P8AABAAACAAIAAAGAH//wDwAPD/AwEA9+sEAACAAgQAALAAAABkACgAgAAAAMAAAAAAAABAcAAAAAAAAAQAAAAUDAADAAAAAA4DAA1AAAgsAgMAAPwADGj4FCsA39kAg34DGTyOlsAQAEPFNfMAAPY8EAAAGA9EAGAZBP6fEwAA/AAABAABADP+AQIAgAAAAB4AwAAABwAHgAADAAAgAdiDIAgAAwACQAAAABABAQVAAH++AAACGKAABwAAkAAAwAEAAMAAAD0AAEIBAAAQBABAAACgACIAAAAAID4ACIIQAAAAD0AEhAAAAEAAAP8+AIgIQAAAAgBfewAAAQAAACIACAAEAAAAAEoABAAAAEAAAQAAEGAIAABBAGiAIDtAABwPAADAAQABQP8vAAAAAAAEBAD/iQAcAAAABgAAPgBZAAcAAL2N/8Af8P97PwMAP/gAAPwIAAg4MIANAABx7gCEAAAfADDwAAD8HwAACACAwQAAiBEHAJtKe/b//wD+MOD/P4e/AAD/BwAEAAwMCAAYAPEAAAAIAQIOHj0AAAAAbwDAYAAAAP8fAAAAGgAAfZz8BwAA//8AeP0f//8ABgAAAEAAAAAwAABAAAAAt5sA3P7/3gMAAMf7/3/w/h8AAZAAHgAAAP0ggObfAeAAQAAAAAQAAP/PAP8AAAEABACA/zD4AAAnQP//+/+g/x8AP/z6+///////////////////////+f//vf6u4f/9//8fGPD/PgCwLgDgMAAAAADACgEAAAAAAMgAAAAAERIIAAAMAIQAAAAAgAAWBggAAAAAAAAAEABQEAEAAAAAAAACAAReAACAAAAAAAIAMCAGAAAAIEAAAAAQgP8AAP8P//8AABAAAAAAAEMAAAAAACAAJgQHUB8AgckCAAtAAMAAAAAEAe//AADw91MfEMwwAKBBHAAQEAAEAAAo+QPjAfeSAIAhABAIHwAAgAAABQDzsAQACFAAAAgAHsAAAP//P58/f///AADwB+DNAAAAAHsAAgDrgwAAEBAAJAAAAACAAAQBACBPNwDwAFD/ATAAAAAxAAEkAAAv/P//BP//AP//AQDvXgAAIAQAAADg/8Pg//////8HAP//RACD/gAADAAlQP/9AIAA/B8A//8Hgfn///vJ/ftg//////////////////////////+LH//fwRj//wAAAAAACAAAAQBCDgAAAAAEAAAAgAQAAH//APj8//8T+Qf/d///AMAACP8LAAAAAP+AAMAAAP+HAQD4rQAAAABAAPgBAAAAAADwAAD//////////wAA5wmd/+T/AAABAAAcAAABAPDHAQAn/wQkAAFAAMA+AAAAAgAAAHwIACAMJBAAAAIAABAAABAA+P8AAABg/wcAAIAB84MAAP8HAAAAZCD+AAD/////////vwDA//8A+AAAAQD/fwIAwYNAAgAAYAMAAA8EAPIAYAAAAAADEAMA7/AAAAAH4P8AAH8A/98AAABg+AAAAAAABwAYAIoGAAAAAf7/AAAAAP8HBUAEAAQAMEwAAYgAqH//AID/ADoPAB8AwOABAEVA+P8AAAAABwCd/wAAv7Oh/AawqUeHfz//6PtgdAEAAEAM4wB4/////yd///8AAAMAu/wA/ACc/g//tN/CR0A74vhjHwEHkM/78CAWAMH//Y8AAP///MMAjQAAPwAAwAAAAID7f////////f//APwPAP8B//8AAAAAAAAAFAAAAAD4hwAAAVAx7AzC4T+SYwM6CBwAOADBDoT6Bs8BAGioAgf/wAj///8FAAAAAP///P/////////////////g1dcDL/f/7f/2/55/n+//A/D//gAAfwD//wD8AAD/fy7/AGIAATgGAAAAAAD8fgD/////fwD/9////v///////wf//4AgAAD+/wIM/////wIA/wAAQAAAAACICgEAFkBA/x7A//+f/39J//8AAOMAAAAAAJD/AAACAH8QDAAABQCAAAAAEAEA//8A+P8t//8IAABwMPgAAAAAXkcIAAAABwEAjgAACAAAJQAACSAA8gI4OBrgms/A8hnn/wEAY82ABwAAgOkAAADgAAAAAMf/4AAAAAIAAAAAAAADIP9A6QlA9z/3sPO8///wDD9w/yMA+ILwBgABAAAgBgQAAAAHNAA/AMC/APh+BwEA/70ABMAHgAAAAAgBIIAA5CSg//8PAADwGxwE7H8fiAUvCAIAAADAAAAAAADiAQAAEAABAAAAfZAjAAAAAPoAAP//9/8P////AQL//wDwAAAADAAAEED/HwD4///+/z//P9X///8f//flf+rLG+f8/yfg74X9//r/mH8PcM+/9/88D95//f3//8D/H9u9/3fv/74eoP//AADf/w0AIYMAAAQAAAAAIACCAAAAACcAAQAKQAAAIACAO/AAwF/wAAAAHgDrOwDCACEAAHgcAADA/0B8//7///////8AAP8/BAB78vD/AAADAP//AQAAAOB/AAAAAAAIgcEggAAYAEAAEAAAAIAAAAcxQOAqQAAAwAD7bwCAFQIBhP//8P/wDz8AFABkQAHohQj/0///eUBABgACqABAA0AAABCcDIAwNgwnIACAGcAWALhIdpoREALECEAIQAAACXBEQCxA///w/wgEJwAAACggAGnggAIEcRAAAQYAAR4AgAUCAAD/HAAAAAQAAAAASAEAwHUAAACPQwCAAACXB8EBAQD4DwBgAAAAAAAA//8AwAAA/3cAAAACYP8AAAAA/w8GAChA+n8AAAAQAwAEAPz/kPEDAAAA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BAAJQAA4AAAAIgBAAIAAHgAAAwB/O//hAAD4DwEcAMAiAwAAv//y/98f//8BAAdAAQAAALABAAAAAAABAAAEAAC/YAgcme0vaue2zyRPuUsBAH/9AAIAAAACAAABAACAABkAAP/7BfgCAH8AAAAQMAcAAID8/wAAgjUHIHOqwEJLAicwACQAACfK///c/wAI/z9/CP/6MBAAADMACOAAAOABAEQACEJAQAABCFWAAAj//uv9/x9f/v/////wDd9////s/////38HTOt///+JvwAAAQAA8AAALYhBHMBAQPr/D8D///8A8DzDwxsAAA8AEAAADwAA+AcAKAAEAAACAQAIADDAAARQAAAAAIABAABA0wACCgIURP//C6D//5mA///3/xv4/P8LAP2PAIIAAID/Dlz/3///PzP/3wAAM2MRAKaJ/P9fPgn+//8A4P8f/x/f8MD32jn//+D/3/9/AQRJgfdY1gAQiACXDwMAbDz0HwAAAAAAAP7rBST/A///IG3INBBcPwDw/x8AAgGPEP/+cNMAAgEAAP4gA3gAX+EAAADAcAEcAIBnAABKAGJgAAAAAAEAqJ4AAPYMIQAAQBAAAAAIAARAAG4AAD4AECYAAAEOf9UAwAAATwAIAAGCAgAAAAAQAAAHAGGREAAAAAAYAAAEAAAAHAAAABAAAACp8oAAgAEAAAAEAAAEAAgAAAAkAAAADpQA2AAAAAIAUAAA5UD+zH9t//////3t/////////97z//3/////////f///f///////3//v////3b+//////+/v////vf////////////3/9///////////+7////v7///+398dAP7/A///v///7/9//////7////v////7f////////+/t//+//wPf9////v/v//////////9v////H///v//////////////H//v//////////////////////8///////+//7////P/////v/////////////////////////////////3//v///A///////+P//P/////+///////f/////f///7////P///+8P/////wD+////+/////+/////4Pv/////////////+8///9////33////////////3///////3//////////7////////j/9h/////8H/////////////+/f/////wf//f/8P/vn//9//b/7/f///////////////////////////////////////////+//////////////////////////3//////////9//////////////////////////////////////3//////////////////////////////////////f///4P/////////////593/9/x///////P////z//////////////////////////////////////wAATQAAAAAAAIAAAP8/5//A/wBg//////////7/////3///////v/v/////////////+///////9/6///v//+3////8fv//f/8P//N//gAA//P/u/7////eN/9///P/////+f////f/AIA/AOL/Z///////////////3/////////9/8PP/v//f/v////////77/////v//z7///v///7f//////9///wL/9//n/////////j//////D+f4//8AfH+9/////////z/////v///3////f/j//+W///////////v//wB+/w+A//8An////+f/7v//f///xU///gAAAACA/wAA3+H/N/T/+/////7//6///////P/////x/PcDAPj////////9/7///////7eA/QAA9P//B8v///f////////8/////P+f///3////////v////////////////7////////7/////////5///bwDB/QEACkAAGAAA//Pw/wCx85Jl4AN//z+f///3AABUANKSX/5A/B4A/////wbY30f/7wEAGEAAfgAAAAgA/gD+gH////////z//v//////CPn/6wEAgPP/2PcpAP///38ABwD4AAT83/egAPgDDP////9/gf//A+AG////D/wA/P8D4f/5/3wB/z/2AwAAAPgAAAAx/wAAAAcABAAZjAAAAA4AAAADBwAAwAAACCD4AwAABAASQACAAAD/Of///x/8/wKGABAMAAAAAAABBv4/gD8AvgAA//////////////////////////////////////////////////////8H//8BADtA///0//8B//8g/AAA/////4f/////////AAD/HwECAAD+/wDg4f//D////////////////////////f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8D/I/w////w//////////v/////////////////////////////4///////wcg///8/wAAAQBMQADAAAD/////////////////////9/////////8fAP///078/wPm+f8DeMfvGz/Z/wze3/uf+F+7H37z////4H8f4v//f6YBcABAbzf//w////f/77/pkZ7//w//////j////z///v97t////9//v/////////f8/94f/Nf//8H9/3v//0P/MP4BAM1QNvEQhP9/A+D89+BDmwP//8204L//vwz+Dv+36dHv/+/+/zf/4P//Dx78////Bb+7AAAAAOcPACD///7///////////////////////////f//x8A////////////////////f/v///n//7////////8f//84AAAH///w/w/A//+//wGA///7v+////7/7/+//////wGwAAAAIDABAAB/EAD+AAAEAMdEAgC9/4CfAAD6/+RxAbBvAv/9+f8/AP//7f8AAOED7////vv8/j5////vv3///wj+/+///+P9UwESQP9t/r8AC95zAAAAAAAAQAL//wD8AAD/A+DPAAD4D/ABAADAD///APH//////P///wfI/3t/ALz9gA7gAwAAAAMAAAAADwz8+/8AAAABABxA+/8AwP////////////////95D9AAAAAA//8A/vwD/3///wD///////////+j////NsD/AP/////A//9v//////////////////////////8A0P8P///////////////////h/wAA/wEEAAAAgGIAAAAAAAgBAP+WYAACAP//Avj/////AKCQAAAAcQAACAB+/38A/gEA/+/+fwABAAD0fwAAgABPQH8AgP/78wH8AAAfGAAFAGAAAHgA///+///////+//8fAAB/AP/////////////////////////f/+T///4A/B8AAAAA///w///////AAH+dAAAAAP//wP///////////////////////3///wAAAAAA/AAA/t8BAA8AhfsAAAAA/wD4////4P//fv/9AAAGAAAAAAD4/wAxnjcBAAAAzwf//wD///////////9//v///wA/+P9VAMDn//aGAPv/J3//////+/f/bfAHwP/9/08L/v+9v8H/t+bF13GQ9r+PA/+P9/1/Nuv/+eCmsOcA8/////c7Gv//3n+GfH3wz34fAP///e+8/f//////////AADfH/aDABD5/tv7dQSfVP7/AFkAANcf8P8DAAFyPwCoWpcD//+5//////8AAP8PDQCiQB9+AAwAAAAA4L8AAP////8/9////+//////9///////8f///rf//////3/wAAB/AMM/AND///z//////x8AQQAAAEAAxv+FGP//P4D//w/+jv/v7////////+//////z///////B///f/8A/P8f/////8D8//////////////////////8A//8AHgAADwB+/gAAAADPf8D/H+AA/H8A//8BOAjwgv9maP////3///r///9x/v//////////////////////9+///////////////9///////////////f/////+//////////////////////8PYO//tdue/69dn08gkh5wXf/2uf/+/v7///////////////////z/vwf/////////////////////////////f4D//++//+v///v/4P8fH////////////////wD+/wBvZD9h/3T7//swPMgA/Pty/093UDkAJ+L///h8DwD/f/7/ggL//////////////////+//v/////////f/7/////////////8AAAAA///+/////////////////////////////w///wD+AAD///////////////////3///+f/3/A/////////4AA/f///////93+23///9l+/////+/X////+//////3/v79/+/z19v+///+/98K///d/+/////vz9397/++/wf/////////////////////////////////////////////////////////////////////////////////////////f9j//9+Aw/9/AP/////8////5//j//////////+P////9////////wAA/wMBAP3yAQD+//8DAIAAIAAA/5///8//f////9//AAD/AAAwAAD//+D//n//GxAA838CQPz/AAD/vwHdIAACAQEAGkAAAQAA//8A8P//////////////////////////////////////////////////////9////+f//////////////////wMAD//3/+D/AP////z/AQDfAP//i4D///8f/f8AAIPTAAAAAAAAAPACAAFA//8A8AEA//8BACNA/P8AAP///////f//378f//+/////v//////////v///3//9//////////////1////3/+/////////ef////f/v/////////////3/////////////////9//7///////////wcA//////3/////////3+///////z///////v/73//3/////79A//8AAAEKAgDvswAAAF6H/wDg/////wEA+wD/9gDAAAAPAAAAAFoCAAAAAAgAAAAAAAEAAAAIBABtQND/gB////////////////////////////////9/AMf////A//8B//9/+P7////////////////////////////////////+/wCAfwDw3/8f////o/////////////////////////////////////9/f///AAD/v///gP///7//HzDf/sC/HQD/9+O/7f///3////83/P///3///3fZoPe////////99/////////////////////+////7///////////Tr/+9v//////f/78f///9f3v////////e/P9///////+f/9/9//+f//////f/783//////w////63//+Af+/f///wg4//3///B///OAAAAB8BkJ3//wD///7/+//+////57//ff/ntf+//2P/v//7///b////////x//////w//7//////////x/////34P//13/+H759+Qv67tb/////////////////////////9/+///////v/////////////9/f//f//zwMA///Av/sP4P//bf////8A+P//8P8HAP////9/9QP4//j9//z/AAD/P///AQAH+QAAQAAAAAIAAEAAAAAAEAAA+AAA///4/z/+9vuAEpwFBUAA+PkAROEPBQIAEz7Q/wAA/////wMA//8kADNAAOAAAP4Ef74AAAAAwP8AAP8f//////D/////////////////////4//H/////////z//////4vP///+f/v//f/P///+f/////////6///////////8D///z//+P/8f////////////8ACFUgIH8APv//APP/////////////+////7//3//////////n9///////////+7////////////////////////v////+//v//////////z/8////cP//AAAAAAAABAAAAAAAAAAEAAEAKf4AAAAEAAAAAgCgAAABMgAAHQAAAP9/AAAAgAAAAESAAAABAAAAQAwAPgABAB9AACAAAOd/AADy/xYIAAEDAIAgAADBDSDADwAAwgAAgA/v//j//x//////8P////7//////////////////////wCA/wf//////////wj+DzgAAAcAF3Ae8P9//v///zcPn/////9//////4D//////zz+/////////////78fgf8HAAlAAOAAAATwAwDA/wNM///u///f//7//wvf/////3//////4f//AAAiAAkAe/8gAAAAwA8AAMPHAKD/5///AACBf+EDANwAHgAAXvDAAXBNBgAAAAQOAAAIAHT/AAD/////F0D7////AAA/fgD+AAD//////////0SH/0v/////////8P//////////A+Q/4P////v//////////////////////////wD3DwD///////8B4P///////////wP//wEA+P8CACdA///8P/////////////////j/fwD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////BwD//wIAC0D//wAA/////////////////v////9////v//z/9/////////8BAP//AOwAAAAABwABAA5AAPgAAP/////////P/////////4H///////////////////////////7/Rjj/wP//gP//D4AD938AADQAAwAJQOD//B///+z5AAA/AAAABxj9/wDx//////////94B/9/AACAHgAAAAMDAAJAAAAAeDcEwO8iAPA/AgAmQBkg8JTg/wAA////////////////AEA/AAACAAD//wCA////////+f8AAP8bH1cA/vF+XoD////x//////////////////////////////////+////////////7////////////////b/z//+////////////+///97/////9//////////////////f////wAA/wf/v/76AAD8/wEALkAAAOD///f///D//w//9/7//yf//8X/4AACAMEwQAAAAP//H/D/z////7////////8A/P9//////wAA/wczHgAE//9Q9gAAAwAAAAABAP/AAAAAHwD/AAAGfP8AAPD//w//////8P//Bf//jf////////////////95/////////////////////////////+D/n/////////3/////O8f////3///////////////////////8//8/fwD//wEAAEBASgAAAgAdQP//FMAHAP////8G8ACHAAD///////////////////////////////////////8fMAD+MwDg//8f//////////////////////////////+////////////////z/////ysB//8Y4AADAP/fB///////////HwD//wQAGkAAAAIAAAD/AgAAAOD///D////3/////////+j/AA//f4D/AAD9/3/9/v////////////////////9/////+Bj//7/5/v7/////v///7//9///////////////////+///3/v///////wAA/x8CADFAAwAA4L/x//8AAAABAAMAAAj8AAINPP//MAD8AA0D4P9gAGAAgYkAgIMBaQDZ7xuggP//A//////7////H/L//4OR//////3z/////+/n//87CP//+P8AAAAA/z8AAAAAfzAA8P/v8P/////D8f////3WB/6XY//HAMAHAP//8//v////+////////+8fAP//AAAOAABAYGAfAOf/AABAAP//PP3/////7QF/0vhBUACAwQAAAQDxwwAABWGAAwB4fwD+/x8AAJABABxAAAjAAQAAAAD/DwDA9/+g8//5D/+AAQEAwf8A4P//////////j4P//////P//////cyb//w8YpPEADgEA/f/w9/////9/9////////////////////////////9+//////////////////////////wMA//8CALf3GAAAAP/7gPkAAPoBx/8AgAAAHwAA8AAA/////x4AHwD//sf/AwDwPw/wQCAAAP+HJ0AAAD8AAPwACADzAAAj/QDijg398f//8P98AP9/AAD+PwAAAAD/PwCAAH4AAH5GAwAAAHUAABAAAAD+fA0BAP//n/AIw/8B/9///wDg////////////////+wf//wAAAADw/wAA////zwcAw/8AAAIAAAAAAN//AAABAP//AAAAAAT+AAD/////////////////Af//AABAACAAAAAAAIAAAgD/wgRwAAAA8A4A/////////////////////wEAA8D/H8D/gP8AADfQ//8IQMA/8f0AAAgAAP8AAAAMwAH4//8LAAA9AP//wP/+/38AAAD6DQcA7/MAAAAEAPgAABgAAwAAAIAHf3wA++D9iAD5/3z7v1///xwQBwAMfwAA//v///////8bQP//////////+f//////f///////////////////////////v////9///3////////////8HAP///x/+8///AP8A/z8A/3/j/x+A+P///////AH/c////v//////HwD/vwAAHwAAAAAAAOBuAAAABwAFAENAAIAAgP////z/8v////v/w//7///93//3cvf/Pw/+H4H+/78A/////8/7f/7//////////wD8BwC//x//v/9+///7//3///9/9//7/////////////////////99B4v+2/P9BDwAADwAAAAAAwPeA//ghfwr//zj5/////////////////z///////v//////////////////f///AAT7Q///6P//////////////////////H3z//wD8AAD/////////////////////AAD/EwAAAAQAAAAAAAMAAAAVAgAAAAAhAAQAABAEACqAAImAQAEABMQ9qtD3D/DCAAABDg8AAAAA/AAA+/v//gMA/x8BAMmAADAAACAAAAD7/wDg/wD/3wAAAkDgBwAAAAAAiAAAAOAIAL+vHAAAAC7wAAD+4fUnBAaPAAAAAAIDEAAAAEAAAQb8IAD0/w/I/v//WQcAf/sAwAAAAkAAIAAAAMAIAgcA/38HABRAAMAAAP/n//////////////////////////////99///////////////////////////////////9B5v///88wP///////////7///4ABAQAIAAAAAQAAQAAAABADAAtA/v8AAP////8AHP8PDAAC//8DgD8AgAAAEAABAAACAAAIAAAA+PECAADwDxwAAAYAAwCsQAAAHgD//4D8///+/zcAf/8PAN//Bwf6wwAAAAj+AAAAAQAAAAYAAAAp/ggCAP5BArMGfwUPAOX/U7jAB/gHBx54AAAAAPwAeAAAPwgADBAAfgYOAAAAAAMACAAAAAAA4ADjgAA8MPt/8MCQAu84g7//v///OAgPAADwwgsAH///kA8AAAMA6N8AAAAA/+8E/A8A//8/Agz0wP/8P4CL/2cMwOAB//+f/ff///////////3///////////////////////f//////////////////////v/////////////////////////+///6/v//X/////////////////////////////////////////////////////87/vTm7Of1z/////////////////+P/+P+//r///n7/////////+H7AAD/HwCCAAAAIkAAf/S2fwAAjyLQHwAAEUEBAS3sAABATgUPD0Dn50kEQBcAiAGA5v8AQDDaIzAAAAUIgE8AAAAAAwD+p4B4cBwqEKk6eFn4IBeFv/9DwC2yAAAAAIAAAAAJAIQAiAAAwAAAAIACQQIwAPAAGBAAQjASABIAxwLoAiAIAExgEAEItdf74XoOHwC/bwAIAAQAwAAAQv4AoAwkfw8AAAIARAAAAAAACADuwQDDepQAPx6EP+RiOsl3Lwd7LgIQhBBgYv19PvIACgDwzwAAAMsDQAAAAgQQ+wcAAWQAAAQMAAAiQAFAAACQAIUABARoOAgWIAAAMUoASv//APv//3+A//////////8HAf//B04AsAkgBRD//48mAAD/PwCBAABA+IMAAAA9Bv8DAPjA+wAQEFD9gGABPQBAIAAAhAIwAMARgQUkAxgAAIAACBAAAAAAQAAAB8IoAJ+f//8A4H8ACAAAAP8HAPgDAADwBQDT8AAAAQAAAAEAAAABwAAAGAAAAIAAAOQABP7/HwAABwAAAAD1kPgPAACABwAAHAAAAPz/CAABAP9/AAAOAAwEAAAFAAeQAAAAAwcAMfD8APzfCAEGAD/oAQMAAAAAAgD///////////8f//8CAAAAgAEAAAAAQAD//8D/V/gAAAcAAAQQAAAAAAwAAAEAAPgAAADAAADA/wEADwD//wCAAADf+QAA8Q9jwAAAAAD/QQDEACAAAWCQAAMkAAAAgAD8AQIQ/0+A/0KxwBdAIAEAgIAAALOLAwAhgABAQAEOAAAAAACADgDAAAD/D/////8AwBwAAP8xngABAASAACAAAAgAAAAAcAAAAABABwBAgAAAABD1wgAAAIAiAAAOAOgAAPj/YQRZ0P//ADwDBwAABgAAAAIAE0AAsAAAfvx//v//D/z/+//9f4D//0NA/4H//wP+//////gD/wb/f5D3/2QC8CP/APAA8P8Dv////z9+x/4AAH0AoJDwB///T/7/////BwD//wcAb0BR9+z////+/+Pz/2eg/6c///////9////B/0Djh18A4P//+P+jHP8YCAAAADz+AKr/A///388A+AMAh4DgEwCQ//EA+P3n///g/8t/gH9/AC8A8P//1XD/8wFffx/AAP45GA/wUzcA/vz/kwri//j/X/7//wBA5//v4wf4m/AfP///9///92DfV4MS6AAIAQwA/AAAAIAeDERAuAsCAgDVjcABgAEQBkCQQwQAAIAABhACcgEiRAAAAOAMEALiABgApHANAEAAAIBIAAAAQkAAADAxJA1AG4YAmgCDJxDQvgkgNAC80wGgEwATAEiQQAAQiABsgDYAAIABhwQ5gABIBAwBICTgQED4EQYIBMABAAAgFKIDAABgEIAAAAEAAUACABAMAACAQAAAEEA+AgAAmAEAEDIAA3TxAIHk/r0MiODkD8AFALr+AChIDg4AAABgUQgIAyCMgC0AHAB+wAAAA5A/AP8NeAAAgAZAD2gQcUAiwBrgACEAIkoOiwJDwAMASmEASEGAAwAJwCtK0SAACAgXGAIBAAAAAAAA/v8AAAFA/8AIiQMdBxkDYwDgQH97CAkUHvAAIIH/TwAAAAFgAgASQB8AAMAAAAAAANxgPn/+////////EQD4AAD8/xDfAv/8GkhAAtaInqJQ8wgEAUPT9fUfAAvy/4cA////5//////6/////wEA4MAfsC8DADdAAAjgAQD8AAAAwAAA//+//w8A/+//Acb//0v+/wQAPCCA/wADP4L/7wAA8GcA4AAAAP75P/////+H//+H8P/vP///b/7/P///+D/A//+///8AwCa4HEvcc9vPIQX/l4H+kX+WG3//////////HwD/x3/+AODX/9+////7P///////////P/7//+/t/+eDBH8QHwDw//AAAAQOAMD/AAAAAOD/AAD////3P4D///8///8q4QcBkOGdpwAgCgDHYwAAIwCy/wD8AAD/lP/v/gd/4v//wP//8///w78f/wAAAA4CABFA4P8AAACA9wz33f//AAAfAAABAAAAqADgQQD5/wAAAAzAIAAAACAAAPv/8P////////////////9H4wCA/z/7////7h4AAAsABQAKQMC/AAD/D//78P8AAP////8AEP8f/CHwD////v//7///PP4DAP++wP8DAAHwAQAf9v//AP/L///////47/8//98AABQEAQAAAAAQAAABgAAAAAIAAAAAQAAAANf2AIAAAP8Db/4AAAQBAAAADgD3AAAAAB8AAAAAPwMA/v8gAAAAIAAQAI8AAPwAAHuEAAAGACkB/2D//wD/OPB+fwAAwQ8AAAgAAAEAAAIATEAAIAAAEADfgcXfiaNc/2zVACJ9+CAAED4AAIAIAC4AAAJgAADyHwP4GAAQ4Id/zuolAQAAAEAAHD0A+OkCAwAA/wsAiEAEhE4EAFAAAgAQAAAAAAAAAgAACeQAAP38/78i/299RjrlLvD/wACb/3f+4P8MAP8D//8AgAAAAECfGwAAAAAZAEAChhgAPACQAAAAACAACAAAAAAAIBXgwDwAgICBgHI0GAAMAACAAQAAAAAABgAAJAAAeRAAJAYACCBAEwAIAAAAAIA9AAAAAAAAEgBQdNnDH7CvQAMAD8B23wAAUADA/3od773/H+87MUD+eQD8OQD7JxJp4wgACEj+gAcjAP//8P//////////////D/////9///+H///////9////HQD/35p8QN///wDx/wL//wMAAUAUAAAABAAAAAEAFED/v/z3//75Q++4///A/wEA//3//xBgHQAAAOA/ANAAAPL///kIBP9/EAAKDgBIAAEwAAAEfyACwkOdED8BIAsABgiAmAZQII5dZAIMABAAAEAAABQBABtAAAIBGAAAIADgDwAA///8/wAAA36AfADAAAD/D3AAAAAAHAEAcRAAMOD/BxLG//+PP/h//wA+Pw78/wAA//////n///8ff///j3//////AODsB//5BLTynJ1PyUQGflrgj8++y14PCLrwAwAAAACIAAEAz/0IAACHAwAAAAAcAAAAAIAD//+A+P////8AAD8AAPgAAP/f+b3/+z/en/////////8NQP////////////////8////mAMh/D7wAQG//fGoAgM0D///h/8///19lv+/fD/8TP7L8///wPw/xAgD/1fwAAAAAAIADACAAAN//AMb/B///AEAAAAD+BgAABP88AAIAAAAAAIAAAEAAAACAAQNABAAAAAAAAAI4AADAQEAAAAEADUD//wDw/////////////////v//fxE/AwD///////////8D//////7/b9///wB4gAHp/4DU4AD//wIAv4EAB+AfAbbw/wDIJ2wwAQDgAAQAAJ8BAPz5/wAAAOAPAAEAFED//wCA//////8Of/6A/wDAAAABAAgAAABAAAAAAADAP/s3vP+VQN00jtECCDve//94Uf+/HmCFGQEAgI+9jwCA9LRLiP+PLF7f4f1/Aq7fSQAAnxwBAApAov8AAP///////////////wMA/x/9/wA4ifi7R18+7wA/8Pj/83P//wMf//EBAA5A/P+AAQAA/w8DAADwAAD8f8D34A8AgA88L/Is/yYARAD7/4D1//////+5//9wAP8GQAEAEJDIAAAAAAhcAQAZQID/AAD/+/8fAAD/AQAAAADAAAAA/P8AAP/////////////f////////D/////z///7//z//////////////////////AMD/DwL84ZP///3//+G//+//AOb/////7////wP8//8AAP//AQAXQPwP/wf+/wAAb/rf//8A////AQDQ//+A//5//w8AAAAAgP4AAAAA/z///wDwAAABAPy/AAAAAv8D9/98/v////////////////////////f///////+/////f///AAAgAAEA978AEAAAAEAAAMsDcIADAAD4AABwAAAEAAAA/wCA//////////8AAP9///sA/4AO/3MIABg4AAArQD8AAP///wDg//////4A/3f+v/w/AADlKfj/AAAAAP8PAP4AAP/////zo///APb7HwD4BwBwAH8A/////wAAAAD//xDw//////////////////////////+Bf/95ABAAAD/i+//HTvk3//8Kxv8T//8AAKg8AEgAABABIAAAADBAAAAAAPgDAAAAAMDGAQAAiAAAAAD+/wAAPwD//wAAAAAAAD4M//8A+P////kAAH8AAwASQAD4gANAAB8AAADv/4D4DAAAAPYAACDQ/wAAAX8AAAAA//8A/v9///8AwABAPwD///Sz4AHIMP///yOA8P8P//8AAOA7/zcAgAAYAQABABNA/v8AAN/+/z//5wOc//////+X///+/wXeTe6ZvPwc/3/9vzL2/9X//x+X/z///////wD//wAAAAApACDwAYAOEJIIAAAAgAAAAAAAAECASAABAAFA4wPAeQAgAAACAB9AEPgAAP/////////////////////7/////////zl+/////3/nf3D//z8AwP8AAAAAX84A4L7f3f3/577hAADABYMA5PiAA9AAgIEAAvz/AYz8Eg8A//8A/v9//+8AAP4cAAAAAP9/wP8AoDAA/1////8AAP8AACCAAAAAAIAAAAAFAAJAABBAAAMSAP/ABwA+AQAaQPz/AAAAiP////+///////8AAP8HAGAAAAggAYIJEFCR5v+2QhMM///xD0D9/u8EfwAAOAP//wDF/sf7H//nfoQfON8fAAYA4IYDwCYAwThxAAAAAAFAANj//xD4/x///wsAkSgA/gAAAAAAMAEAMkBwAgAAIBAAAAAAPA4AAHoBAAAAAMj8AADz//7m/x+v/////v8AAN8Byv8AhGz53xNtHgYGAACyAQAA8A/4BwQAAGGoIygGCQwAMPAA///8/4D///DvC////P9ABP//////////AJz/f4MIgPl+/MD/f/6W//8AB8D/QwcAgM0AAALgYYgFAPwHfHDAITdHcvgcwAf4AADpwPAhIAcQAAAABj4IIAAAAQAAABBAQEjAAAAAAOpxAQBI+H8AAA4ABqBX5gAA7/yv/X4Ay/kBAGZAAEAAAINggpCXxR+hAAACAAD4AAB48BtA//8DwH0X/+/APqb///8Z/v/7//////////////8f////9v//s6P97//f////V///BPA8AAjAXwaPVtf////7//////9f3v///wchwPi7bDz2//8PnP/T400AJPAA6gAASTz3/8P/AOCP/////////zfL////dP97/gDj4P//AJD/2P//bw7/90QAjP8AwAABAPL/AQAAAwMwgAAA/w8D8H7/9H985//9HAD/DwQAAAB49gAA/wPvnwH/AFAAABMACPgAMAYA/1/5Qw38/P8ABgcMj/MPAAADQAAAAACAnA0QgAwG4P/1n//////MNv9/AAAiAIH/IIDxY34BsEYAAPYG+8cAAAAQ//9B/MF/Q/z//2j37////3//////////f/4f////5//04f8ffwDw/z3+AOz7/wcQ////9yP8A8wAXQwEQEGsAAAAAADA/QAA7YF/Rv8P///6AQAA/D8A8AAIABCeTQcA+Q/6f//fsLiHMAHA/z+48P3y//94Af8AAACAAAEAqJ4AAPYMLgAAQAAAAQA4APHjIAAAAH8EAPDgcwAA2AMBeAAAACAA/LgGAA4HY4AHAAAAACAAj6MAAPgJEO2ARwAAACAIAMD8AAgIAAAABgABAXgAABgAAgUAB8EAABcAAACAAAAAYAAAAAgA//8AgLuH/////wcA///8/wAA/////wD8/wcDAAD4ABAAAAAABwAAAPAbEQAPQACAAAD/////////////////////////////////////////////////////AAD/AwAAAAD+/xoAAAABAD8A/L8IAN+tAgAAACUwAAD/4xPA/////wAAP0AA8AAA/////4Bj/x0AwA84AQQA4AAGAAABAN+uAADgAQCMAADxAADAAB6DAAAAUAAAACQQAAIAAAIUAAAIAAIAEAAAAAgAAIAIAAHp/wMAgAAAADAAAADg//8AwP//+/4xQP//////////////////////////fwD//+D/AAAAAP8H//8A//j/3wH//////////////////////////////////////////////////////////////////////f////////////////////////8AAAEAAAAAAP//AP//P///AP4AAP///////////////////////x/A/////84BAQD8/wAA9wH//38A8P+AHwAAAADwAAAAAADgAAAA/////wDg/3/gAR8ABAAAQPgBAAAJAP+5/wMAAPj/AAQADh8A///w//////////7/////////////D///AOAAAPz///9/APP/AgBZ/jgAAAAAAA4AAADgAQIAAAAA4AAA//////////////////////8A//8AAA9AAEDgAP8A4P8AgBAA///w//////////////////////8A/wAAAOAfAAcE//9/MNj/BwCT/wMAAPD//wCAAAAfAAsABEAAwAAA//+D//////8PAP//AwAA+CQAJ0AA4AAADwD/gQCAAAAAw/8P/////wD/HwD//////////////2/h///5/f//v0fA//////n///8G////7/7//+H/////+b///vn//3/q////////////////AAABAAD+AAD/////////B////3//////////////////f///AIAAfwAAHwAHAKCA/P8AAP8B//8AAAEAAAAAAD8A8P8EAIABCAA/rPD/AAAAAP////8A/////////////wf//wBQAADgPwAABmAAAPuGH/wAAPD3AAAAgBAA/////////////////x//////APwAAP8fCQDBgQAA8H/A/wAAAwD//wD4AAAAAN/n///8/////////////////wAA/z8AwAAABgD//4EHAAAPAP//AAAAHBBgAAAO/gAAT4MAAP8H8P/wHwAAAwA/AMD/AAAAGB+AAOAAAP8nAgDnvwAAQAD///D/AAv/G+H/AAD///////////8B7/8A8AAA/v8/AAAA/wD5HzjAAwAA4AQAefcAAAgA///4/wAA/////wCAAQD///ATAAA8AIIPPAAAAAAGAAAAAAAGAACAP/+7///8////////////ID9/f///ANj/////////////////////AAD/H///8P//////AAD/PwEA/bv+AwAABAAAAP//APD/////////AzzgPwD//wH+AAAHAAAA4AkAAADA//8A/IsPf44CQP9f//8A/wAAAQD//wEACkD//wCAAAD/f///gMD////8///////////8//8D/////wGA////////AAD/HwUAAa7HAQDw//8A/h+A//8AAAIAEAAAAAAA3/cA+AAAAAD/AAAAAIDgfwAAAAD/AAD/PgD/////////AwMA//8AAD4AABAAAP//+P8/3v//AkAPAAPw///8/78P//8HAM+A/vAAwP1nx/8A/AEAAQA/AOL/QAD+B2UAAgANsAjAIAAAAPAXIAAAHAAAAAP/A8D/AAC5oQAA+CH//wD8ZwD//wBwAAD//8DPfwD/f7wDAAABAOGd4AD3AQAAAgCA/zgAAPgHAAAAfwDCP3gAAAAwAAAAAAEAAP3pABgAAADeAAAAAP8///8AwN8N//8IAAAwAPAAgAAA//8AAPABAAAQAAAAIAD38AD/AAAGAH8ABQAA/wIBAABAAAAA/wcAgAgAAuACAAAA8AcAADwAAAADADtAGPgQ/CfYP88Fk/Y9HYD9/w+AAQD7H///APxA5gAA/wB/fOD/9L/w//4PxUc8+MAMgH8PAP8f///A8BB++AD/A/hx4Bf4/3wHAQDf/wAADgSuyhAAAAL8B4BAHAT+/5uRbn//7yMFlrn+ezD1CnmbIP//aP8PGH//6AVtMgDGAAD/////7f+n2wUml/2+wX4GANyQSAMAEYgAkgC2AQIIgAb+AQAAan8AAAEwiQAHABAiASFnJP3A/2AB/38AAAAAgCsAAMLHAIj///L/v/7/////3//HX/9H7lgJWwARKDS8mZBMDMB4YQAA/wIXBbgBCgAQQAEAAAD//wD4AMD/AAAAPAAAAAAAAOAAAgAAAwCP/vD4/xxP+PrzAADHCP/++/8AA4sA//8AGAAACAAAQAAwAAAAAAAIAwAL+AAGAAACPAcA8AAAAAD/AABwf38EXwENYIyP9AA31BDA3////w/+/wcD/gj/AAAB4CPO/wAAwAAAAAH///D/BUD///////////////////////vf/DAADwAIAHn8GAAAAAAA/wMgAAAAAIDgHQAABwAf/wCAAAA9BoD/AGAAGEMA/+cAAPufAwD8//4HBwDu/zAA4O3/B///PkD/////h///B///////////////8z/8/fQAAP8BBADBQAAcAAAAAP4fAwAAgADgAAD//wDA/+T/4REA/94D/8DvkPj/AJv//P/////////////D///vzwf//99z+AIAdyD//wDAHwD//wIw/x8AAAIAAP4AAAA4BwA//lX6Oej//+ADAQCABwc3AAD/B/9gAABBAOAgAPz5AwAAHwAAAAAA//8AAAAA/wDv/wDA/wH/v/7/AAABgPb/w/8B/wDzDwD///f/d///9wDAAAD///////8A///H/9/BB4D/x/8E9P/u/38PCv//APgAAL8QH/gQAIAAAAABAAigAAAAogACAABAAf//wP+A/wEAf+IfPAEaADx/+Bj8+udCNgABAwAEAAAEAAAAAOPAAIAAgP8///fX+Od//89D+CvgADMAAIHjBpD/Cv//+A8GgD/fAOCpPv7//+8I+P8////x/3rn/wH/vuYi8QFwAEW2NsA6FQ6x3Iv9//r/5vv/573Dh/ZQYAoytj/44ff/y/8AwK6DbPh9B3k+uX0CNPlv7/gIxP//P6P/3////v//+3r9v7sBANU34OIsADAK9PpOrfcBcDIAH/v9bwT5H4fb///u3/w//9HnEV3G/ozjuzA//C2A+CCuPg8JWz/ulvuz/+t9C2Gp+3Z9wB/ogFx6+1+CdGH//K7//v//t/+VxxYfjsl/ZHjx/+/////////+gydh7fbmn6//Ovxytp4BAPwfAP////8AAAE+//8A+AD+/zv/////f///+Xjs/wDt+3z2X/c7/vve7/fvw//////4//////////////////////8AgP8///////8///8/AADAgP8AAAP+////////BPA/D///////////////+wAAAAAAAAAIAAAAAAMA8P8AAAAA4P8AAP//////////4///////gP/////j///w//////////////////////8DAP///8GA/f///////////////////////////v8vfPv///v//////////////+v/////////////////f///4O8AAP7P9/8fAA/gAQABoAEA/48AAAIAGgBZQP//APQYqf/uf///////////n/////////7//wf+//9z///5//////7////////////////////6////////////Xv9/9/8I/v////f////////////37/9////////////+//////////////////8//P//////////////////////////3/////z///9/j/z//3/////X9/3///v////////f/////6cBP2z/sSBDBACA0AD+aAD/H/n////e/P//////////////////////v///vf/f74D//9/v9v/B///7///+////////Pxf/v29g4f9Afv5m31P+AC3/Qcr3Bv8fx/7wv9L+7X/8/f8HHwD80wAAAADb/wAA+///5//////+//f9AAB/gv//gybgH//xOIAOhd//u/z///////r8//f//+Nd2v2f///+xP//z/P//////////78B//+A/wAA/gf/PwIAf8L///7///////8X/////+w/Hf5/pN++//9+Av/9AAwAAAcAAPwB+oABAACDHwDg4H8AAP////8AAP8HAAAYAAZAAPwAAP//////////7/////99v////yD4AAD/AQIA/+v+9wAA///////7//7//////////x/4///V/////7///wAA/xsAAAMAYgAAgD8xgNkgKcoXJkCA/xMZ//8D4P////f//////////////////////P//fwUI//+YgAAA///9//8f//8OAAAAAAMAAAD4AAD/fx/+PwB//sm9SMni/+f/7f///////////////////////7//////////////////////p/3///////////7/AAD/f///AGz//+//////////////////AAB/AP8DAAAGAANAAAAAIA8AAAAAAQAAEAAAAAIAIEDgP4B/8P7+//////8BAMH/AADgAfj/AAD//3/wnx///wDcAACC4EAGHwCJ/ATAgP+Af38A//8IAP////8AAAcAAwAAeP//AOD+3f8Af/j7/xDAAAD//////////////////////////wMA//8AAPAfEAeACvf/IAAAAP8DAAAAAAAGcAABAABAAAQAAAMAF0AAAAB4/P8AAP/////+/4cf/////wEF/3///wCA////////////////////3/////////////////////+/AP//AAAgAAAAAAAAAID5AsAAAAAAAAABYACABwCA/wAAgAALAAFABAAACAgAAAACABFA///8//v///9////O////1yAA3f9w8AAA+f/H/v/P/3/f//+f/////5/f//8BALFvCAAAAOD/AAD//////w///wAAQAEAAAEmAQAWQP7/AAD/////v/8P/wBwfz8AAPACAOAAAIRr/93//wD8hkMA4GB+QADA/L4x/wUHAH9jAPEx8P99IIIvcMAAAAAHAP/8AAD/AD8AAAAAwAAAgDcNAAAAOhCAABwAAQAAQAAAgAEGAA1AD8IAAAADDwBQAAAAMGABAAD8lgf/f///f/Dk/EwA/ngAzAA+D+AAAAAAHwAAcMABMIBgAAAAcAQBAG1BAQCA+B8AAMDxDwiAAFzLCQAAYIH8Afx/+/34/x4A8x8EYJLAAr8AAk8A9/////7/AAD/C///AMAACH9JACAAAAB+AAEAAAAAABIAAAD+AAD/////H2D/v/7//v+eH6f/AECAEaoJkAkABsAGgIJUDcIk4ABbAFhmfkQAgP8jBuDt+WD3/e4rPs/F9qmxtgAs/f+FXYErA7rNqX7ewpAkRAhzFtwIAAIC4BkGAID+YAIAwAEB+ywB+32h938AAAQQ8AMgQJwAYLAAAAAIAAAAwGABAADgCEQAIwBBARRMFDjl5QrBIOGIJIq1HH8AwGOQABQAYOokABAAAgAcBFAQX2AFBBDEQUIMCECAAAQwDADioIhSgcMThufhCGAEZfwkDAFsAC4AQQAQjQAARiP2qw8AvocEFgAgXM7hA0QDhdwAAAcQwEYAYP//4f85Wsf4CFBxOgADQADCgNAfMOoOBgAzAQApeD6P8QscBD7m/CbPXwBZ4xcA5eTc2CCgpQIk4iCnhoglDoBthYBkgBjTAADDH4AIQAEdCqiCIQB4KjDU/gCAAQGh6AAAAQB4AEAIADeQ0z7CABIIAAGA/soAGJAAQRkeR6DQv/lB+n00//dfRU8OUfw6EyTQvw8VHD/rEUycTXzgRLwARKPM2vQJ8/yJ0wNUAShYwgi6pACPap2Q5QQEEGgVCEQLoT0ASHCB9wQI4D4BGCg2tmCg4WzvAWXSfmm+IJgkgDMEActkAoJ0wAgYoQGwfz5vsM3WCF9kcYhJ0wiAWAkCgDBkjzIO4QCRIAAkAwAAiksCKAeAgnQAEMVA2mcpAAMQADSIf3gQgTIPeCgHTAECBAMjAAAAAL8LDJwAABTvBwABsEA+oAIAABAI4grAxQApeGQzgGj8MHACaEicCyYLaDwAAYX6gAYAjhVKzsAJMgCOEQBwgh5nAAEeAAAIAANOABgAAASgAAAEgAokABj8gAgab7n/BwAFJjCA8wAABYBrPTAkAwAgcUABDbQIhAAEUQCBAgAAggAEEiEQBHggFgAyrAFCAGg8AiTUCQAA8dimDmBDAIACAIUEA0AogADAAgIATAtIAAACABAcMACA5gAwAAQHBHhMADlMlAoA4MBLHDAQ7gMQIMEAJhDEL2AHAMABIAwAIB4AH0IBBdFAAGggYBtgCkMABcMAILAA/ws40KhBR59nQ8X+EiFAvwEAEAABAIAA+i4AAAAAfz5GAQAFACEABmYECCAxDImcGJhwMg4DQAEgAADshK8+PgAEQQAKAAGIAADBA0xAiBiA/tA8Jkw/gBRjAESCIwYwIAFqPQBIAAAg0ABcoAAgGf//3/+AyEcDBBsSOCcOge8AQKAHcfr70cfc////A///AD8AAPD9AEhhnof+//b/u7iM9eOdwFMAUFFFLOWYMHYDBld8meD6f0BtgOEPHv2/AAAAAIP/AAD3H/9///8AjgDA/0/+PwEPARyvt////v//////D+D///////wMAB8g+88An/98//99AKb/91+cx/f/5+9//v/////h2X8Avv8DwAD7Dfigvdf/3v/v2/r/////7/f/3//A8P49+f+/v///X////////////wJ9/z///////+D///9///8d///////////////4/xMA///9/////////////////wUA/z4H3Hi+v/+/3///9/9g/jkA/////x8B/8IDPAAI//f/////////////4P4/AH/e/////////x///wDQAAD/D///P7AA8I4Fhksw+IgJegAHkAA0BTwEQAAikDICEAO1AAyACAAAHRmukxSTCBoGQjGWoYoEoQTtQQj8AMAAUQIBQAYBANiAQAAH26OAwkk4DIBBhQBAIQD5yXyAgRI3ACH4EyG0g8BJAAAVEHsDBwAY0nEQQEAowAFxAOEBAKEQ//8wQAAA/D8AAAwFZAAfAAAiBwD1/yAAAAAAAAJAQAAAQAAAAHAAABAA/wEAwAAACAAAABAA4AwAACMgAAAIAAAABAABIAAAAOCHoBAgHAEAAAEAADAAABAAAAAgAAAABQAcQBl3AIrusXeb+uvPlEAGYnznjgAw9Qgl3UXDMagLBNcO/gdMgTGoYnD//////////wAA/z8BAED4///w/8/9/4H//////////8rx/wP////u////7///////////977//8fI///v/93v/////wD4AQADeAcAAwAgQDjAAAAA/v/vB3///wCCoQD/BSf/AIF7YAAACQD/DwDgAHgAAP8DAf8AABCF/f/w/0AAHwAAQABAAAAAAAAGAIDhAIAAEIAgAAAEAAXAAAAAAAAAAI2OAICA0AAMn////wMA5/8AAAAAAAQAIP//af8BAP/vAGAAYAcA//8AAAAAAAQAAAkABYDABwAAAAAAAQBAAAAAiAEANkASAOBzAKAAAAEQAQC+cxjE86L8//9V+X7/C8X/AI4AAM6V/QsAgPkD9/8Z+c0NpF+UGrzVoJtSBADAAADy/wzEe3d/RwUkTd7R/8ijN77///UPT4PFjnitqLrg9On/fV6/Bv7/CAAADv//uP////////////////////////////////////////9fnf//A///f///Nv9jgP///v//////pAD///8wQLhH/vP4fwDf+xiAAAD/////xAD//4APgv//AQDwB2f8+3/sxJ+gA52+f8DQxv+f+f/gAP8fAwA5QOD/AAAcAe/AAACaGHgCAEBnbH/YAAAAiMf/QgH/////PIBFgB4A//3vbf//lg/yK+UfqKMW8Bjv/p2RQv9dAgBDePj1CQAYnFG0QIDN/4NQB/z//4//31TBAXbR///g////////////////////////Af////988bDbHQAAFv8DACBIAP7/oKD////////////7//////b/GAB/N/7/AAAM3/9/8P///4D//1//////+P////8G//8AIlOC/3/w/zD3kBD8//8A/9l9/fuy8f3g/wYA//8P/wD4/wB/8H/+AMC//w8AP8ANAH+BAAAAPgAAABAAhHBGDb0oAIIBN4D/P+D/iB8AAMABAAAGAB+8+bsAYP9/A/7/AADw///8/wMA//8fwMCf//9/4PEAI/8BAOD/AQAHnP//wP/chj9iETgBAv//+P//7///HwD//wIAL8YAAAAg+P8AAAAEHwAAAACAAgAAAAUHAABQACcAAAIAAtffACAAAAAAAAWgAANAADDAAyAAIABAAAAAAEQAAAASAAAJgAAAAAABEwQAAAAAAAAI/5CAAAEAQIUAAAAgGQAICAAAAwcg/1DzgBX/Azf2AADAAwAAgAA/owAwAID/H/z/BAAEAAAAzAGACABAABAATAAAgGkAAOAAfAAAAAAAueeABAAAAAAAAYDAAABAAAEAHAIADBqGUIw8AFbEAEAAAP//AID/Hv//AQAd4AAACAAAAAAwAEAAAACAAAAA/gAA/////8XfHwB//wAA8AAB/gAAAAB/AAABAAAAABAAAIAAAAAAAQCAAAAANzAAfDhADyD8+/8PXv8AIEAH/9/g/3/////f//9///////////5/Yf//////////////////f////8Pg////////+f/9///pf93///3vfz7///8HAP4f8AD4/////////7+v/7fN7/////////8AAH8AgGwAAP//nP//P/////8P///////rH///AAD+PgDwAAD////g/////x8A////PwDg//8A//////8Bfv//9/9w/P////////////////////8AAH8R/AfABQAPAACAIDCAXv+OH3//////////+P8PGP//////D+kBAgBIQACAAAAAAA8A97/At/fp/1/3///3//7/5/f///////z/+f//w////////////////wD8/z////////////////8A+B8A////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x///////3///////////////P4D//////////////////w/8////////AAA/AAAAAAAOxvj//////////9f/////v07//4H/Htj/P////wDg/wAAQAADAAO7AAAAeABAAAABAABA/wEA8AIAAEAIAAAAAAACAAAAAY0AAIAAAAAhAAAAAHAgAAAAAAC5vUsZAAAIQAAAAAABEGAAAAA0gAAAEAAAAAAAACAAgAAA/79g5rwHDAAAAGGTADAAAP//AAAAAP8fhwAAzgMAAAAA4AAAAwANQID/AABH/v//+////48F///9/wAu////////////////////////7//fDv//BgAAAADAAADgAD8AAwA9+v8H/P8A+AAA//////9///8AADAAYQNgGEAAAAAA2ADAgEEhAP9/8f8PAN34AAB4CMfAgK4AQNwL8Aj/D8DvAAABAAcEAEAAAAAAfwDM4IBmLwCBsXvu8AcAAAAAQAAAAEAAAAAABH4EAAMBAAAA/wHg/8DgAAAAAAEA//+A//////8Duv8P//8AAOAeACAAAAABAAAAINj8BSAQAQAAf4QAXgAA4PgAAP/v//8CgP8H/4APgLC9QQDfL///BAAAAAEAAkAA8gAAAOYBAIAB+wcIADf/AADADwAAgAAHCKC5AAYQAD8AgP8AABgA+EHAPGiNThrkAgFg/tiAqgGAH4JnINjgJ0D/CUogzE+AGUTMAMyBhFSwSOCDsYBFszqgABBkEMgA4AKAESJDA0gA4D988L7/4D/gPwEAAAAAKDzwAAAAAAMAEwAA8EAyyIMKpzAQ+R/fzw9kAP5A/gkOk9//R+9g3PH3Xxj8FYN+UkcGAYAA6QFkA8fxiyYGF5cMZDyQkAkMh4ogLMfgGADhQEEQYf//8P8PAv//RUU8e4ABAAC/AP78BgAAQOABAAABABZAy+ff//+PMfXve/3ByisC5QAAPgHw/wAA/////wN+//8AAP4P4E2/ACASLgABAEC48H/AzQRLqG+fDyK3AQAA0LjaAAAFHN/TTbRMPAAAiQYA+AAA/////wAA/wEBAB9AYCYAAAxLAkACMOEBQACIAwBi4HmDC///xf1zCv8v/994Af2AAACnAAQMAB8AAAAAfp3ACScG/5ssRBgA/MFAEOqAznwN4yG2CRoiOM4RnAngHxmmf65OwP8Lvf/AHsA/AgDwfwAQNg8gAQAAAKgACAAAABACAAAAAAAgAf8BAOMPAAGgAAEAAAEAAAABAPH3AAAAOJcFAAABcAEAAADEG+AiAMCBAYKCAIQDEAMYMAgEAAAgAYA56OAMIQAEQCZYgBcgQMAFQACEYUcEEcAFAGAkBgBcQAgAALzJAODCSP8YBv/f//8A/v8BAQD/////AAAfAP//AEYAAP///////////x///wBgAAD//wL4/////f8B///gPwBAAABcAAAAAAAAgAAQAAAPAM/hYACD/2XOAAA/AAAAAAD+/wD8/////xhg//8BYADgAAAcAID/ABD/nCe1AAC/PwAAAACAAAAA//9iAf8n//8BAEz/AAAAAEfpAOD9/wD8/+////7//3/////////////////9P//xgP+AH38b/xngJwi/4P8AEv//////A///3/+A5//////H/wHg+8H7gUlCBiDjAyKT0AACgPiBJgCCACQSmFIAALhUAMyG4StAc0gO/4AHAAAewCKACEIAAIANEAAAAAIIAAAgAPYBAAwJwPyA+gf/PwAACAAAAAAA/4cD+AOpQeDwAfgDAPiABQAAAQAAAAAAeAAAAP5CAAD///j/AP8DAP4AAAAAAAAAAAACDP/94P/+//8dAAADAAIAv5SAWwEEAAAKCAAQAQAAAgAA4A0sYABAAGDgQgAAUQMAAAAAEAAbQIARAACA6AACAMIvAAQAfwAAACAQsIgAAP/nX/9AWGEA/B8QAIA+vwD4YQAAwLBhAZrt+E8AAAMAAAAAQP//wP8AAPff///+/wAADwIAAAAA8P8fEBDHRwAAAKADwBAABv/v//8AEDtAQIAOAAAADgABAL/9AACQRwAIAAAAwCArVIj/ACNcQIgEAAA8wwCgAOh+nAAAKAAACDCADIIIIAAAAAAtOGYAni/sACAAAADyKNgADMAAiQAYBDAAAAAYAAAAABAAAAAAgAP/9wD/z/n/8Z/8//////th//8ABAABEAAAAAAAgD8PAADQ8P+AD///4f8AAP8H//8g+P2PAAD/AAPaAHCloSGVPoQxhwQQAQAA/gAAPxD//4wgEAAAAAQAAAAghM8AgP97gAHjALwAwENAACAAAAADAFAACAIAFQAAZAUADYAwAAAA///w//8P//8DAMG7AQAAABD4AADg/wAAAAADAAAAABAAAGAIBZAAwAIAMPwd/DwgAAA8AICA//9I/gCgDwD+PwAA3wcA4H8fIKH/H///IGD4RdGd5AD5PwMAAAAgAAYAAOAAAAAAAQCA/wAAj////wAA/z8AAABAAAB4AAEADUAAACAAAMEA0P//fwD//////////wAA/w///wDw//////////////////////////97AP8HAAAAEAEA54EA/wAAgIP/HwAAAQD8/QAAAAD/B/7/wP8AAP8BR4AIAgAAAAYAAAAEAAAAAAAQAQBv9wAAAA3C8wAAAAMHABAA/38/AACMAQAAgCDwEAD/e///AAAEAAAYACAAgAAAAOABAG/+//8P+wAO/x/3HwCOgCEAAAABAAAPAAbhAAgAAMAAAAH//whgnv8/AP//////////AEAAAAMAAQAMQAAQAAD///z8ACAfAI8AKfb+AQcAAQQH/wCAmP1wAB25GH/6A+I/3H2u8wT++f8BwAAA/wMEAA/v/v8AAAAA/z8ABAAAgAAAAAAgAAAAAAAI//8gAAAA/18/AACAAABABQEAf/0AAADgfwCD/wAABACAAwAAfiAAAADAAAAAAAEAAQAc/EDgAAAADx8AAMAgngEA/zcA4AAAD0AAAP8BBAAAAACAAAAAAAEAAIIAAGAAAAD//wDQ5wH/5yAAAAAAAADa8AAAAACAAIIAAPwP+C8ACP///v8AAB8AAQCongAA9gxxQP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3////X/////+f/9//BwD/////AAD///////3+/wAA/x8AAACAAAAAABAAADAAAAAAgP8AAP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+////////////////////////////////////////////////////////////////j/////////z/A//9//5b8////////////////AAf/BwEAAkI/4IAf///3///////////3//////9///8AABwAAEAAAP//wH//////3////////////////wP//////P//////ACv/7+H/QID//////////wAA/38ABwAAAmgACAFAAACAAAcADwDw/wAAAQD//4b3////////////////////////v7////////////////v///////////////7////v//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAA8A//+g///////////////////9/////////////////////////////////////7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7/////////p//////////////f////////////////////////////////////////////z////////////////8f//+P////////////////////////////////////////7/////////////////////////////////////////////////////////////////////////////////////7/////////////////f///////////////7///////+//////////////////////////////////////////////////////////////3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////7/f///7//v//////////v/////9//////3/+v/////////////////////////////////////9//+///////////////////////////////////frf///1l///7/s3IDwP//////////////////////////////////PwD/////AP///f///////////////////////////////////////3+7/////2Dy////////////////////////////////////////////v/////////////////////////////////////+//////////////////9//////////////////7////////////////////////////////////////P///////////////////////////////////////////////6////////////////////////////////////7//3///7//////////////////v/////f///v////////////////9z+/////////9////////////////////f//////+/9//////////////f////v///////////////////////2///////v7//wM+e/7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z/////////////n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAP8PAAAAAO//AP7//////////////////////////7/73///////////////////+///////////f//v////79///////////////////////////////////5///9///v////9//////////9/////4/f/////v////9///////7///A//f///+///////////////f//////////z/B/j9//////9//v/f/////////////////////9///48HH///9xnA/wCAfh4AAHMIIAADyP//gP//////////////////7//////////H//8Z9M9/AIAAAAfgP/D/////AAD/LwACAAD8ATDKA/6AD/8/////B///xv/5PwIof0QgQBoACAAACP//AP6QsH8AAACFEAIAAEAAAIAAAQAcQCDCAED//////7///0uC/w8Igw0ah0Bf84D/HAgAwP8f/////////////////////////////////////////////////////////////////9+/87/3////////f7N//39/+f////n4/w///wAAAAAAABg4BQADuD8A+P8AAIAPAPwAGP7//z8HAOHHA4IA/gAAAAD/A38AsP8DQND/AAD///////////////8CAP+7/wcA4AABAAAA4AAg////+P////8fAP/////w////9///f///0D8AAADgAAAfAP/+/wAAxwMA8ecfAAD4AAAAAuD/AAD//z/4//v///7///8PAP//BwAeAPj//j//////g5///////wF/9P9/8P/4AAAAAIAAAP8/6P///wDxAAD/wQEAE0AAACAAmMoAAPz/f3f/////////////////4P//H+D/8/L7/3/wH/8XAHTgDwACAADfBwAAAADAewAAAAAvAAD/AACAAf4AAAAfADjeAAAWAAEAD0AAmAAAAAAJEAADABgCAAEAZgDFgAAAAAQIAAIBAAAAQAEADgYB4EBw//////9///8f+PT//x////////8AAJkfBAAFQP////0PAP////8A8P//////////AAA/ACcAFEAAwAAA//////////8A/98P///+/8/7//////////////////////////////////////////////+//////////////////////////////wAAAQARAIWAAAAQAAQAAAA/AAD/AwAFkWcDAMAAAMA/AAAAgMAfAAAKAEGAAAAABwAAIAARgAAA/z8AAADgCgAn/wAGAAD//zJUAQD//38A/P/+DwDjzB8AAAj+DPQAAHH/uJIAAP//gd1t/AT+FUAA//8///////////////////P//////d89/7/////D////////////////////////v/////////////8/BP/+//+A/7/P/f7533+PgbH/nId4H/j/f/7/CAAEQABgAAAA+AAA/v/+v74rf0D/f+z/AwCrQAAADAAEAAAA/HPIBP/c5n1/Xv/P/8Jl/f////+w/w8Gb9D///////1XuP93vn+sgfk///+fz/iDAKZ6igP4Z/Pf0/j/3/9A9/+z/////+//OHj1/8z/eX7/3f//s/X/yQ7J/3j/Z/rvfF7/kaMfYmNFAPzCkEAIMc4C9gkIEHKAjQOsbDhe06P8CbnrgClAAP/m0f9F//+//+f//fwBV/////z/QNy/L4B+/n8AAP8HH7/A///97P423iPW/y/x/5CAdx+0N0dk3vf3AuvRaX7P52Hw3v19/f//e//6+f//jT+877/+//H///3v9sFvl/8/g9/vM/r/oN8/t0kMBX+k4Vh+f98FHZADbqgnafz8yKS2P+/549vWM16dRQj8OgAETGClnH09wORfCPAPJGBxqD0gxSxjB2n9wpot0sT6+IPToA3sv9H//1b7/38zXDSX5CeV+79+r+8i73YOm3nrP9M7u2v5+P////////9f///t+zG6//8B+nH/0/9/T/z/+dP///+P7xM3/v97/7nyf/Pn9vkXy/+nH/sA8O8Hs8L+Xb/z+rf//7//72c//X9O2i//8f///1IOgL2f3XbnH/7//0d/fnI+ZmP/+A+YAML/H8ePB0wQ/O5d8//7dX7+v4D1t///AGDXCyw1bfn1f+3//v/7a5P8/7q+txnO/AB4t//+vcHj8/4L4P7BO3/+//G/vf57s//z3//5/7G4/vsX54+d9Z0ZKTt+/9r//8H//Q/7/z////v/8ddv33+S/51KnftvnvW/f8N+//8XAGRf//LA0r3/78fP/xfi7XL82TBeM51+b6+G///+//O/5/okpMSgH16/3nD/cQEYBza+AAAAAMM3IOAogv8h0EUBdgIwRL2ABwQEAAAAAAAMAAB7AAD/gPgfAwAADwADAIJA7/wAwAAA/wIAgIAP+P88A/8Dn/gA+AAAs/T//4KJ79+fQfPtjv+sxOH//832//+//x8//3j3/399v6Pneyz9/+N70P++/8///b7/f7du7nvfl/9+XG3z6P//P/AAAA31PQw17/9/f+W1z+En8/9/wAA4DgH/vxDoHgD3//8PwvMAAIAA//8A+/////f7///////P//////8fAP/3/AcAeP73AEH/f///2/P88/8TAwD/3tj/w0F/vfn/oPQA8A8DAAAPAPj/DgDeAN/m//9g/P7n////2///9v///////////5///39/AAAADwAA4AAA///////gf/4ABoP///+4/////////////wD///n/gP//////////////////////AQD8/wAAAADv/bj+bxCf//8lAGB48/x//wB//P//9LH/f///3//jf/////////7///////////////////////////////////////xu/z///97/z37/D90HO9y8rbOACOzvA/D/AAC3f/n3ANz+D0/48+/1AXY2AAAAAPT/AGD8//8f//////8D//9/gPj////+f/////9/BP///+/w///f//f/3//7//9////f/////////////////8P//////////z3///3/f///QAGIAEABPMgAgQAAQAAUAAEACgAD0IABH0D///8BAPADABdA+/+A//0VWMbn//D//z7//f//wPD/z///oPwcGP//APxKA/+IgCcAgNQdDTsAoDwEAnf+Q0zRESAeAQEAAAIHAAAAAAD+DxhwEAAAAAAAAQAAAAAA/////4QjS0R/AADBBABzQAIAoIJAgAAAAAAAAAAAgP/h4wIAARifdkBQAADaQIIE+ACUNH5vBHghaP4NQADgAJ/NwP/3//3/AAD//4QDAAAECAAACPsxAOD/P4AHgH/4+P9fAP///7////////////////9////////////////////////////////////////////////4/38A/v//////PYAAvp8GAACAnv/v+P//////9/3/5+///v////////////////////////////////////////////////v///////v///8C/7+P/wDA//8P/v///////////////+7/vwf/////1+f/7///AMABef8fSmCAACAjQAD/5/vBAPv7f8MD/+PI/wAA/////wAA/wf7/wDA4Mf/P///D97//////////////////////////wAAPwAAAAA4/z///////P/9////3//////////7////ZMH8AOf/Yg7//////6f///+Jgn8xAMAPYwJ4gbnAgVr0/w5/Bw///8zkPgf+P8Cjh//+/38Q+/dRQgAAjZs4An8AqP7wQwAMBxxE/wQxB54AMAyeHQD76XsAABKKAYYfgDgA8AAADwAAAQAABAD/t/7fAAD/K3/68s8sP3/vB/BBPv9eijZrBgsAxf/4/zgDAPD/DwCABwADAP//ggMAAAAPAAgAAA9A7/8A8wAA/38AAAAAILggAP///vq/IP/+AAgBAPj/QAgRAP8D6M8AAAA+/38AAAAE//+A////Af8AAA8c4A8AAAEAXf8AgAAAAPAAAP////3/B///AAAAQIABAAAAADoA/v8AAP////9gAAAARAQAAAD+ABAbQAAA/wO6KgD2+x8sUo8HYPj/+AD/AAC/JwCwAACHGIFp3zv49+DAAAAf/qB3///7/f////8BAP/8/z/+/wAAAAAcAAAA+P8AAGAA/wOI+f8B////+f////////////////8P////P/7/MAAAAAAA/D8CAOfoAAcHAAAAAD8PAPD/AIAAAP////8AAP9/AAABAADgAAAG/YMPHkD////3///////////////3////////9//////7////f///////////3//v5/////v/A/v/x//+///////////////3/f7///+///////////////9f////////7f//////////9/+/+z/o3/4fAP+DMPEJAAC8jyEACAEAAQAAQP8P55cBABNA//8A/P///////////////////////8P//////9///////////8P////v///e7/uH3///////////////////////////////UYAH2AAACSAFAApAAIAAAP////+D/zuf//////////8fIP//9/8+x//////y/v///9n//wAAQE8CACRAAMAAAP///3/9+wfOvxf/+/////+O//////////////+/////P//vv/9f/////6j/j/////7//38nQP//IABiAAAAAAD/9wDAAAD/AAAAAAAABAAAAAAAANP/AP4/z9//AAAXDoD+ABCAAwAJDAggAB8A+PcAAAAA0EMBAAAAAwDwAAAA8P///wD8/wfw//8P/wfP/wEAFUAAAAAKQHJAAAEBAPAAcAAAAAAMAAAAHAADAADAAAAAAP//AOAH+P////////////8fAP//RCD4j/3+WsEAAL8LAP8AAP////8AQP8AAH4AAP/j//8AAB8AAwAPQP//wP///4Ay/f///////////////////8f/////////////////////D///f8D/3/////8AYf8b///A/wJ4/34BAElA4P8AAPr/UHZA9McJaZ3uPzL4F5Q+JtIWNiuTdQCHOsX///7Mvryf+u+n/7//9/f/+f//////////////8f///+7n9z////d//8H3638Auf///+Dz/3///////BvnOP//r7/93D0Hxu9Mdx/o//6oofH//xkfAP/////w//////////////////////////////////0B///4GQBgSHmf0wAAAAL///gfSPqf/zTnZvxG90048f+T3P//D/9QUP+fAQBG2///8P/////////////////w3P9/Hf+2od4z/o//h/7/BgYT9A8A8P96ALADACgAALheu0du/nzf/WXBnhPcCHr8528TAADADP/8//8AAB0o//9m+P///wD/j////////wAA/78YAABAABAAAAwAIYMAAQAAAAAMAACAAAAAAD8BBADf6QBgAACCD+AfAABgAAAAYAABAADwHgAAAP//AvsDAP+BwwEA8P//AMD//wPQAUD/////fwD//wEAI0AQAAAA/w+G////8cGAAQ88Pv6AA///f//dv+ff0w/c//+P9r/9H5///2/+/3f/x7///0yA9fHl////D+7////fP+B/XO///B///////w////v8/P////3/////b///////f///AMAAAAMAAvj///D3D////wMAB/AAAAAAAH8AAMD/AADF3///DgBwHQIAYJMBAKPPAAYAERAAAAAAAAAt/////wcA//8AgAAABDAfnQAPfwD8/4gzfaQeB//4AADAAGD5AEE4AP+/AAAAWAAA9x/zfxj7DwAAwBBAv50AYAAokgX/kL97/r8v//c+eZp/dp/8eQj7oQYAAAMAgQAA+z+c+8fD+f9/MHP/BwDPj6jvAHx9H1ue8AD9RwAQgAQFACBA+/gAwP////9AD/8vP/AP4P///////////////wAA/wH//wD///9/4P///////////////wAA/6Ff/mD87/+//v//34Mh5/+fzv//f3//////////////////////////+6//+///nnv/+f///f7//f//+/u//4/4AAABAMAHAAAAAOABCQDzwQDgAAAABAAA//8A8AgAyUMQ/wAACgo/WAAAAgDApwAA7acgBEAABQDAn/ADAAAAAIABv+MUAP///f9XAP//kPv6Dz8A////AwDgBAAJQMD/AAD///////////////8AAP8H///8/wB/fwAAAOAf/v8AAP8P//8DAJ/oAAAAAv//AOD//////////wAAvwAAAAAQKEIAAEByAAD+/wAABkD//////wv///8PDgH//8D//////2sA////B+CFBwD/urj5AAD////5/v//A/D//z0AAB8AAGAAAP3/5gAAAAEAAAAMAA74AAD//////w///wAA5/zn+wD8/z///4ABAAAAAACACAAAAPwBB2D///n//x///9+f+PjP/wfg///j7gxA/////7iP/xv//tu/H/D///9c///6/ycArv////////////////////8Df//f3wDw4AolAAEAMUAAAAA4/P9gAP/////////////////////////////////+///ff3r2///y//////+/////D/j//8D//wc//rh/3///v/////+3////////////////////BPj/CwEAAPgAAAAAABhAAP8PAP8BAACA3/4AoAAAGgAAAAAA+ec/u//v/8////7////////////////////////////Bg///AAD/DwDr4AP/////HAwBgADAwACL/+G/n/feh8FBz/OXjj++AAAIAAIAbkAM/34w////////////////////////////////////////////////////////////////////////////////////////////+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j/////////////8f//////D//////////////////////////////////////////////9/////////////////////////9/////////////////////////////////////////////////////////////////x//////gP8fCP//////////////////////////////////////////////////////////////////////////////////////////////////////////D+D/////////////AAwfAAAAAwABAE1A4HwAAP//8//////////////////////////////////////////////////////////////////////////////n//////////////////////////////////////////////////////3///////////////////////////////////////////////f//////3///////////////////////////////////////////////////////////////////////////////////////////////////////////////58A/////wD2/wD/DwAAAAAAggAAACuAD///g/8CAA3g//8A8D8A//8AAAAA/0cA/gAIpwT//0D+/////wAAvwEAAD7xxPcAAPrB8/8BAF0AAgB354D/AACH2PyP/wD///8PAvAAAAA4AAAJAXgIAAwAAAAIMAABAIAAAAQAABAAAQCx/wAAADMAAQAABAAAAAYAAABAAAAA//+A/////zL/wf+n54///4gAAQP+//4ZWEBjACv83/8e+///////////////////////////APD/Af//7/8BAPmAAPAAAAAA/yf//97/////////ZwD/////f/D///sfP/ADIACPAAEAEA8EwP/gxAAA////HP////9/Af//fAD/IAH/AMwA8f8A5/8//ngAAQA/APj+AGAAQN8AHgYAAAAAAP8AAACAgwCOAgAAAAAAAMADAAAfwADAAAAHAP7/AIAnYAP8+P//2z/w/////////////wDAww8NAP8fAAAAuAMAAPju//jP/////2O3/0EKpPF+v////////f//b//vj2UPP//PgP+767e+77/8u+vfZ8z/6Lud82/9Pf8r6H32/z9/////c/f///d1PQckDA3oD/X/5Fb+/f//wP/4A9xu+09P/um9//sfz9KH+R//vP9r9xHn5X/9C///+/uf//9////5////////Pwj//w7+ID+/zk3mAwCthAIAFkD/7wAAgKH///b85kRRTX/NwOAAAB+AAcD///////////////////////9////////4/y8AAAB3AAD4AADr////f/r7C+MTf///nwDk4DdH/gAAAAAAAAB0GAAAAAMAy4AAgAAAgAD8AQAAAMAAQAAA/w7//wEAr4EDPwD8ACAGAAAQEAAgAAEAAAQAAAAAABwAEAEAAkAAAACAGAAAojwAAAARAH24AAAEAAAAAgDAAEIAAOsAAGH8AqD/DwPwAIAAAAAACGAAAA4CFEDAfxAAAHwAAAAA/AOUDwRAfvbAPVbf+A8S4P8C9nwu/vD/DQDq7/8/APDfAwCAfwAAAAAA///8/vc/YQD/P8H+/P8AAO8o/wOfv5uB/76DuAAAiAABAP+e//8QnPj/PwD//////////zAA/wMGgACgOQ79AQD4QMAAnwAA/gC/aw4AAIAAAB4aBgABuD8AAMAAABgAPwAAgB8A//8CADH4AAAAHAsA/v8HBAD8/P8AfP////8HAA/AAQAAAAIA378A/wAA/wD//////v///////z//////fv/////////////////////////////PB8AJAB8HBkAAIQAAAJpocP//gf////////////////8AAA8/AQAMQAAAAGAwAAAAAB4AAN//APC/+P///d//f+3v5d/h7+d//0dw8Lvz+AMAAP4PuP4AAGMA//EBAGtA3wPh/4D/AADiDcJ/mwYM+l7jACCAPwYF3zn6j/7/DAz/5///F+fffwAAcgAA/vABBAD//wBgB0QAAAADAAgAAOA/AP8AAgAAAAAAAACA8B//fwDP///+/4AB/xj/AgD8X3/ff/P+9Pf9v///N/+///7/////////7/3/l///914k/////eV3/9N3+/3/397/K5T//0bnFQDe/8nIsf7X7/D/ngc//v/+///9///P/3///f//+P8/PP9fDwCP9vv////+//r1/wP///9uRf5fw37h/3/f9uvvwX+n/P99fu/tP///52/+/v///4hJZf/fzCMHQoShDXiCgH/eR7ozvf3rVM9g+iYI4O/zPt7v//////+///3f///3/eH/d3+///7/C/qyvmvp7z/Lj//7+fi/fjYH/P9Xf93/fP5/x+nC5/5fv/dn/fbN6X9Rn/1rF/h//L3t+/Mi/24Bf/9/////lv/f9+/fvP+3eH7jv4n//wOA0r//yf/////w/x+IeATzD+b/AAAP3P//HQH/+f/GdADv///3GuZ7MP///5/c/+nv///////8////B//3AQAgQQ/+AID///////////////////////////////////////////////////////////////////////////////////////////////////////////////8Ag/8f///////////////////////l//////v//////wAA/x8AgAAA/////////////////////////////////wD//wEoAAD+///73//2/f/3//9977/X///////P/3////3/3+n/7///b///////wP//D//////+q//+/7////n//3/////////////AB/D4+x8A///s////f+D/Af//gP8AAP//3/f//////////8///+fxCf3/OP/wn//////////////////7//7//////////wAA/5dB+Sf+AOwCAAf+///+7//9+wExZv3/AAj+7/nf/v////v//////b/+w9L///f//f9/f/////89/+D3///+9vv7////+/////////////r//////fv//////////////////////73////////7//////////////9/gP////+////g//3//////w//////4P9v/v///9/88/8P////jz4Pp5t/Bv//f/B/w////v8/P/////////+N//7/3//f/////////v//////7////////////////////////////////////////////////////////////////////////v//P///////////AAD/Af3/wNz/f/96zf///z9w//////7//z////9/APD8BwAA//8e/P////8A//8D//////////+A8P8P/z//Af///v///+f/////////l////////////////////////////////////////////////+//////////////////////////////////p///v////////7//////////////////////zf////f/3/////8/7////v////////////////D//z//////AIBzAP/////9/////////////////////////w/w/////////////////////////////////+/////////////////////////////////////////////////////////f+//f/7//+T//////v/////8HAP//AAAAAP//+P///////v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8ATAMEBoBkTP///P///////wdB+///AID/////DwD//wAAAAD///j/8f///////P/////////////////////////////v///////n////7wc4//////7/4f////9+//8BAA1A+P8AAP/////mB///kAEAAA8A/P///wDg//////////////////8f/v//////////UeD//wAA+AcBAI1A//////8//////wAA////////////////b4///+1fsHv+//b//Pr/79/m/f///7hgIf/7B/9/+4Hg/95/Oz/////x////////+P//P//X//+5s//7//+X///P/////+P3/v+//v///9//z////////////////z/////9E/8///l89/IP//9////////8n7r+f//8//////979//z4P//fx923///D/98AADvn///8AUBAPf/AHPYMR/9ir/5ydyj9O//Xf7z/70CAI0AP0Eg8QAA/wD//wDe//////////////8PPwD//wBAAAD4lgAHJuCbO/4BEGJhMPi/2Ug/Ffp+8M8/3oElA9/XAwAAPwAfOwCA/////379O/4Bgse++//39gQA//8A4DYrDxDgvwDsAAD5/+P/AdTvV+jfAzB//+7/////9/+/////n1f//P8AAP//////////////////////////AAD////9wP////////////////////////////8D//9///7/////////HwD/////////////////////////////7///+///////////////////////////////////7///////////f//fCAAMAADwAAD/+P//AAD/AP8f4P8AAOABAAAAAP//3P//////////////z/////////////////////////////////////////////////v//////////wAA/wf//wD+AwD//wEAD0AA/gAAMPgAAAD+/wEDADnvIAAAYAQAAQD//wDgAAD/IwD8AAD/////QPwPQAADDwAAAAAAAABEMAAACAAAAAAAAQCongAA9gwoQP///v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j//////gH/wD/n///fwD//xjAAAAAADkABwAAwAAAAAAAAAMABQA92AAFAAAHAAD+CGIAABAAAAAAAM4HAPAAAB8A//8BAACAgceAAYAI4P8ACP//A/4AAB8AAAA+AMD/AAARQP///////z/k////////+///////+P///////////////////+D/AQDg93oAAgD/g//jM8AA/P8P/v//P8H//z8AAP8fAP8AAAYAGkD//gD8////+TwA/4AAgAAA+f/f//////8PAP///j/4D+D/GAD//////////8//////B3//AAAQAACgAAD//Qjw/u/5//L/9v+///H//wD/9///4P8XxP/w/P0PAAEAAwAAAAAAgAAAAAAJAAABAJG9AAAAFAAAAEABAAAAAAAYAAAEAAAAgGAAAID7/wAA/QMCAABAEAAAACkAIYBAAAAAAAAAcAIABZAAAGAAPAAAAABAAAAEAP33DwAAsAD8AAD/////////////////////////////////////AAD/AP//APz//////////wFA//////8f//8ZAAFAAP8AAAAA/wATAMfvAABgAAHQAMAAACAAAPAAAP8P/P8+AADOABwAAADAeXwAAAcAgABgAPyD9//75////f//B///AIAAAD8A//94/wAAAAAHgPj/YADCf38cwAAAIgAAHwBQOAAAAMABAPPg9wD3/8OBAPgfGgAAAPMADgAAQRD4EzAAAIAAACkAAP7/6AAAABAAAIAAoAFAIN4BAAAAIPA/AAAIhAAAAIAAAQAAAQAAAACAAAABAAAB/fwAAAAIboAAAABPAIAgykIwAOCDDxAAAAYAADAAQAEAAAAAr2ALGmgwQAAMFf9Nngb/089fD5AACEAABAh8BAYGEAC8AAAAAAGAAgPDAACnxAII//+Hw/8A//+AHwAAHwAAgMH+AMCOBwAAABD/HwD+wEgAAP8P3v8B/Hi/V8M/3j888Z/wgQAg/b8AAAAy/wEAwAD+AAD/////////H0PB//8A4AIAuC/f+QDwRn79/z////////z//w9wPP8BAAAUQAPAAMAAAAMA//8A+P///////////////////////7/8////////////////////////////////////////////////////////////////AAB/AAUAAEBAAAAAEgAmQADwAAAAAAcAAAAAAAMA4P///////////////////////////////////////////////////////////x+A/v8HsP///x9gw1/h+OYG4PACALB/MVac//8SAAAK6OYAAiDf+lcbAIA8/gVAEP8J93////z//////////////////////////f//////DQD/hxACACAAgACAAAD+AwEAG0AAAgAAwAMAAP//+P8AgP8f/w/A//j/AAAOUR+m/5f3Pwfw/f8/AP//AAAAAP//AID/f///AMAEAP7/AQD////////////////////////////////////////+//////8A8AEA/3///wAQAAAAACBAAQBhmDgAAAT//wDwPwD//w8AAPwPAPj+AAAAQAAAABwBABdAAIAAAP///////////3//////CP///////////////////////////////////////////wAe/////wCAAAADAADwAAD9/v//3///v///////////AAAAAID/4A8AAPc/AgAqQADgAAB/Hv/////8//////v//////////////////////xv//////v//n99///////////8///////+///////////H////P/////////////////////////////wP///jzAAD///j//z////D/PADA/9+f//////////////////////////////////////+//////7+/////////////////BAB/AAAAQAABAApAUOAAYDAAAAAASAAI+P9AQP//////P/v/4D8ABgEgAAAQgIADAAD/fwAAAMADAChAE4AG8wAAHwQ//+D//////////////////////////////////////////////////////////////3////////////////////////////////////////////////////////////////////////////////////////3////////////////////////////f/////////////////wAAPwAGAABAAAAADgEAEUAA4AAAv////////////////////////////////////8D//0cvCA8AAACAAQABAAcAAAAQQAAAALAAAAAAAAAA+H0AAAAAYAABABNAAAAEAAAAAAC/MQD4//8A//////9nwB//+38H/jfgAGQHwP99f+7x/wAQ/wH8/8A//P8XAP//////////AQD/fwAAAIAAAAAAAPAAAAAA/wAGAAxAQP4PAv///////////4P/////////////ny////////////////////P/v5/8/1//AAADAAEACkAAcAAAgAkAmP2rINNeAIn+//8+/5/x///4//DvBuH/m///////////fwD//wMADEAA+AAA+P//Af/A////3///w+v9f/j/G+L/f///APoAAP////////////////////9+AP8fBAA8QAD4AADAAP8f//8A4AAABwCvv/hXG/T/n///BK7////d//v//9//2+n/////////////////L/P/AAAAAMfPAPv//z/wAAA/AAfg+H9k/Bv8/////////////////////////////////////////////////////9/////////////////////////////////////8/////////////////////////////////////wf//wAACAAAEAAAAAAAwP///v//P//////8//////98AAEA///A///////////////////i//////X//////wAAB0gCAB/6AMAAAAAAHwAAgAAAAAD/Dw8AAJgAAAIAz/+A//7//3////9/CIL/ABdAA/9Xf7zz/1uAgf89DAABAMI/AAAAAP//+P8AAP8B//9/ABCA+AAAAAAAAAAQwAAA/0///wCA/v/hABbgf//g3D8A//0AAAAAAPwAAP//////9v///x8BEP//APgAAAcAAQAlQABgAAD///f/////////////////AIAfAP//////B///mP0AAAPA////////AMD/PwAAAwQHAADwIgAA/4DDAED/AQP4/w8A4P/n/P//9////z/+/////z/////////////v////v///////////////+////////////////////////////393/7/7+///////////////EABx/wQAAAAAAgAAgAcAAMAAAAAAQQAAIAAARgABEIAEgDgEcFAAOACYAgAEAAAQt/8QAhAAEEAABgB0AAT//+D/AAD/Dd5YEDn/Afz/n/8A+AAAfwAATQAA/xH4+AAAgD/gAQAAw/l/AP7/AAAAAu/P/P8DwD//AABXAOD/AAD/////////////////5P////////////////////8A+AcAP4Dz/wAAnwMAAACAAAAAUAAAAQAAEAAABQDT4AAAADgAAAAQAAgAAACAAAAAAAEAAgAAAAAAAQAAAEvDABAAAAAAAAEAAQAAEAAAAIArgAR/AAD+BAQAOAAALEAA4CAAAP7/D/////+/X///8QAABBn8AIA+AP8fAPgAAP8n//8OADzrQAAAAP7/IAD//////////xcA//8BAGSAgO1IAP//H7////////////////8/AP////8AAD3+9////wMA/////////////wf8//f/////////////zp/jqwAA/w///wD+//////////////////////////8BAP//AAAAAAEAAMA1/wAA/////AAAXwYBAAdAAPwAAP///////////////wAA/z///wD4/3////93//8BAGhAADgAAP//wP///3/98P//P/////////////8H9P8+/////77///////////////////////////////////////8p//9FOADgf9B9AAAAAQAAAABEAAAAAACfAAD/L///oP9/Hnx//y8LEGB1AAAAAIADAAAAAAAMAwAAACAAAAAAAAAB///w/wAA/z8BAACP+n8AzL//qv/v/+/3//+//3/8v/////9ffv7/P/9//V/f////3/9/YP////8//v/////+/mP/Aff/8s/f/+///v/33///f///AMDgfwAAPwLA8GCAAAADAAAAAAAA+AAAAAD/RwAAAAD///7/yT//+/8DAPMAAABAmP8AAAcA///8/wAQP0b/D8D/HwDg///vA3D7//7/A/w3AP/gwP8AAAAA/wEfAOD////4/z8AAwgB/AAAAAAHAPAPAAAAAAAAAAAAQP///P+/Af/////g////////////////////////////////////////////v93//f9PB/x7//5P+P/vH98HP+BM/gABB/z/f3//789/AP//AgDvn///ALz/////+P/vGwABfxz///z/0Pf/AP//B/7//////9f//8D/AwDg//8PAAAEAAAAXUIAgCgAAAADABgAAgAAAAAA///A/wAM/wH4/+IQfgD/P9z7AAD//wMoQIT/PwMAKPBW/NAD/C+AhN8PAP///wDw////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////D///8QsAgP8/4P8o/gAAAAAfAAAAAAAEAAAAAQCAAIAhAAABAAFAQAAAIAAAAEAPAANAAMAAAAMA///w/wAAAAB/MAEA/83/////////////////B/+f//+A//////8DAP////8AgAAA/w9+AAAAAAD+fwBAAAACABX/AgAAAAAAAAwAAB4A+Q///58BgP9AAwAAAAwAAEBCAAAA/gAA/3///yJA//8A/P///////////f////8D/////3/w/////////////////////////////////////////////////3/////////////////////////v//////////////////////////////8/AP//fwCAowANBAAAAAAAAPgAAAAAAwD4/8ADEAD/HwFAQAACAJv4AAAAIAACAABAAAAAAAAEAAAAAAT//wDg//////+f////5///ukD//z/////////8//9euICfHvd/cAAA/3///8G5R/pz9/T/39m//v/kzGs/nIfr/vef/33b//v7///7/+8AvO8O9/3/nwD9/x/3/4v+/f/j///f+//9oXP8t+Yx9OXjv37//+/O3P6N59j///9T+Pn7/3P///3//v/3Wv+/6v93eR8e7eb/dt2U9xPe7//xM/H7///+/wF+v//f8Lv/8/f//f///7//f/797/+//83P78fm64f46Xv+Xhv/3fwQYAGRP0tEV3xn68hfnT2c9ypYvxC/PA/Fff+64H/ez/9n/+///0D/Xmaf////+////////8f/13P/Nv/9eP////////3///8vf5/9//5+////+f//+//DL//nbyf//j9eAADv/v7f///x7/8h1f3f+xhu/////6f8v/32vz9C4v/4/tf/9v/39/9/48/rnv//////9//3v1l+fc8X//+n/z/A+W9399yszjf///d/76H/F7/v3v8wfzsr/////8A9vwAAAAAA0P+w+/yfffTPBTwP/OwAwPr/ywfoTDUA0znh/+8T/5//2///j3N3+o/3+/c4fLz/CABSAvn/toT//wH+AAD/gQAAAACbeQDA/+7/9dTrtQcfEf7/er/////pXP//3yzjf/ff////+f///////f/t7X0//7////+H//9u/P7l/6cAAMd/AAAAAAD4AAD///////////////////////////H/////P///QAAGAAAIAAAIvwAAAAB/g2D/AAD////9///B/9///v//////AAD/BP/Bf/j/////////////n/3///////////9//////9/f/////////////////////+r/4RNL3/q2+PSj8/7/8x3/////yJ/8D3/4/P////////////////////////////8P/+8ABAAA/38YAAAAAAAAHgAAgP5AAP////////////////8X///4/z4A///////////9P/9/AQAaQP//wP/////////////////////////////////////////////////////w//////////////////////////////////////z//wQEKf//zC8DAAD4MMkAAP8BCQAA0OJ/PAAAAAB1f0kAgAEAAkAA8ABz/////wAA/wAMAHdAAAAAnP95/P8AAINGAMAAAID9PwD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////TwD//wBAADDQ/yBV5zj///+7JIH44AAADYW54AACAIJyzACwYQC7QAAAAED/YeD//v93Fubc5G8MAO//GACIfwAAAACf+wDgAAAHAPj/OHDw//8/AAAfA///AOD//3/4/////////9v/////gEL9P34AAnI/oN//3Fe5OwAA7BEAAAAgAAAAAPj/AECQA/////4A7P//f/////////////////9/AP//8P8AAP//////////8P//f//v+PAMtv/3QXb3/t//POH8v/8XqfwfuOPa/Nnw4P4j+f/3/////98CAN8K8P8AAP1/eQfxkA3t3h+3f8PCn/8/+M+8/z///f//9/j//v//fh47GwD4Cw//D///AAAAAEAlABACAAAAAAAAAIBfgAQAAAMAAgARQPv1AAD3v//u/5j/88H//4/f77//mP4PDIf/f/z///////////////////////////////8AABMAh/8AwP//////////7wH//wEAH0D/j4D//38OAP//6P//////////////////////////////////////////////////////+BkAAIMfAwAwAEAAAPA4AH////////8P2///l///////F///NJDwDv///v//////////////7/8A+P9/+//f/v//////P////3/+/wMALED/////////////////////3////wHA///A//8f//////+f29//b+//Hf+XV9X/mFf///9///569//////7////////////////////f+Af/ODV7wPHbYDt2f8fwO//P/w/3/G/3q+Y3///7/br3+zP//9x////////////////////////////////////////vv//dBr/4f8fwf+P7x5f///K8QIE/yv//ypb/wf//wAAQAABAA1A/Pt/wv7P/+e/0///COAHAP1pP+97vz7QEwTLx/of8EkIAIGOgRewmdC/AAAAAO8DAAALAAAABgACAF9BAAYAAIAHAAAA8ABg5R/viP3/X/Q87u/n/zd/v/E/t1vz7y/z/f7//////3//////b///N///////////n3b//wDyv1v6//9P/////3/8////////////////v/+Jcv/v//8A/v///////7+8A/j/////+////////7z/gX/fC/f//L7x//////7+//f/3+//v/Df//7///v//fbv////+//v/////wOA//v//3+P/+/98+///9////8A//8eAAAR8P8AAH/u//+l77bzj//7++///////8/////////////////////////////v/6//AAABAP8PwP//////////////H/7/////D/////////////////////////////////////////////////////////////////////////////f////////////////////////v////////////////////////////////////////v9v/////99U/nv////////v/94//////////f///////////f8f///v/+n///////////////8f/f+P/////2P///////////////////////////////3///////+////////////8HAP//////7///7////3////////////////////////////8DAHwAH16AnwDgAAD////H//////////////////////9//v//PwD8AADAfwAAAAADAD7/AIgABsYCAED//8D/////////////////////////////////////////////////////////////////////////////////////////////////v/////////3/3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v//P/////////////////////////////////////////////////////////////////////////////3////////////////////////////////////////////////////////////////////////////////////////////FP/////8/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+D//wf///////////////////////////8H///w/wAA4P//P/////////////n////////////////////////////3//////////////////////////////////////////////////////////////////////////////////////////////////////8H//////D//////////////////////////////////////////////////////////////////////////////////////////v//////////////////////h/7//7sB//8AAAAAQC4AAAAAAAAABAAAAAAAt///APH/////P/7//wAA7X/w/wAA/8P/fwAA/x8AAAAA+P9AHv////////////////////8PAP//HwAA+Pj/AAD///7//////wAADwAAAAAAAPwAAAAA/0EAAPwPAAAAAID/AAAQAH8AAAAAAPGAz/8BAAEA8P8kfv///////wPA//////8e//8GfAAAAAAAEBkAAEAgAAAAIwD5hwDgAAAA/gAA/+H/////////////////////////////QAD/PwMAgf0ACAAA/////wAA/3v/AOD/AACAn////v8PPP/9DwxQElRAAP8vAP9/D4j8///v//////2sD/v/ceVcIOsfEAFkP3PfQfsHBEZ2NpO1wnvP9pHt/W9Oyv//K/8PaP//PschwB99x8NuAAAY/zB9gC0AwNxJPgcGAADUdP8KE/d/lqh3ALz//3/euNfh5/1j++17mALmpycPEO1VE63I44XHDwF24YePQjyd1f//i/yvf33qPc/7//jfzN2Bgr+ALuX8P/c8+bCoHITyg8v3j/6HMib/R1wkf/0Hwl//0f3/+7/+Huf/30nw3vsD6T6vhgBkcv//8P/x+S34AADxB9//vP/ft////38Pz2fgKOeBAFg4AAAAAAAAEAAAAAAA///w/////////////////////////////////////////////////////////////////////////////wP//wAAAAAA/AAA////////////P///AQD+/wIAB0Dg+wAA//9/////Afzz/////////+P/////P////3/+/wEALED/Cwzu/+Ns//3sM/Ps/73li+//f7DNrxz2ZWd4OwC+9QAAAAABggAAkP8BAGsKxxdvZND6CzCl32+t5/3//77/AeD//3o+//////7/ABj/H5D/AAIAQAQAARAAiPh/gGDgny8A/////wMA//PgAwjw+//wPwAA3z/4TQYAAADPAQAAAAB+AACYIAGAE4DZABzvAAfiAOAQCQAkHx2TAN88+EDAEQAAsQH/k15g5eNNXwAAAQABAABAgAOAHAQAFkB+AFgvAAAAD/7/AAD//////////wD+Pv3ffwD5///x/wPw/////w+k////////////f//7BABojAAAAAABAAUA/3ug5877onQfz/+U93+ltgAAAwD53IC6AABzAAQAc/8AAgAAEQBk+wAgAAA/AICMAABwAPgD/AMfAADAAKAAAP+Xmv///wzAiIv/AeABPwD7/eD/AAAPAP////8A/v//+/////////////7//wMAAP8A/f8A8P/vf/8AAP8AAIBAAB8AH/8cQAAABgYA8AAAb3D/z////v/H/////////4P///8PAB+AAAAAIP//4P//////////////////////////v///////////////////////////////////////8///AAD/AQAGAPhZ8PIDf/j//wD/BQABAP+PAQDblwAAAAIADgB4APwAAP8D//+AAQAA74OE4P//////////AAD/H0A/AAACAH1A//8AgP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v//////////////////////////////////////////////////////////////////3/w//8AAP8HAOAgAP//I////x///w8f/gAHnAD///7//////wAA//8AAAAAAIAAAID/AQD/D/////x//wAAf/88/gCA/v//AP//AP4AAD8AAMAAAB+A//8AKIAA+SSAWg5AIIsYGxHg/OqT6wAEDwCFXBj4//8PAP8dfI/8/gDg4MYLAJ9G//+8x3Rc///v/5+m///wq/8B3wgh496AG0T//2CA/3////owgD/B/6Lv/5//3y/Irzv///v/TwP//wAA3AMBAP//33/8//H+Dv53cLvN30o5//4HAAHyDQMG1f/65L//fy74/wkP/////////////////////x88//8AAAMAghgABgAACAL+ACAAAQA+QACAAAD/Q///AP4DAAsAH8D4/wCA/f///v////+f///////////+/z//////AQD//////+f/////////////////////HQAASP//Bv///////////8//////7////f/v/9L9j5BX///9//9z/f//////////////////H/j//////////3fxBf3//4f//////7/+//D/////////////8////////////////////////////////////////////////////////////////////////////////////////f////n///8P////AAD/HP//APz/////AAD/AAEASpcBANJnAQD9KwAAdccBABUTAAAMmwAArZcAAGMAAAAAAAAAAAAAAAEAAACtlwAAAwAAANfbAAAEAAAAzD4AAAUAAADvxgAABgAAAB11AAAHAAEAo2IAAAgAAABnHQAACQAAAP6iAAAKAAAASGAAAAsAAQCjKgAADAAAAFBRAAANAAAAjtQAAA4AAAAXgwAADwABABF7AAAQAAAAMwcAABEAAAAroAAAEgAAADRdAAATAAEAMSYAABQAAADHQwAAFQAAAD/LAAAWAAAAhngAABcAAQC/eQAAGAAAAB42AAAZAAAAWbsAABoAAAAXcwAAGwABAHFTAAAcAAAAFFUAAB0AAAD02gAAHgAAABWXAAAfAAEACpgAACAAAAAdAAAAIQAAAA6cAAAiAAAAMVcAACMAAQDXJAAAJAAAAIZAAAAlAAAAy8gAACYAAABZdgAAJwABAKh3AAAoAAAA6DIAACkAAAAdtQAAKgAAACtyAAArAAEAZ1MAACwAAABJVAAALQAAAN7ZAAAuAAAA25UAAC8AAQDjlgAAMAAAANEbAAAxAAAAOKIAADIAAABAYAAAMwABANopAAA0AAAAXFAAADUAAABR1AAANgAAAL2CAAA3AAEAxHoAADgAAADZPQAAOQAAAGDGAAA6AAAAenQAADsAAQBFXwAAPAAAAHxWAAA9AAAAfdsAAD4AAACQlwAAPwABAGqeAABAAAAAAQAAAEEAAACWmwAAQgAAAOJWAABDAAEApyQAAEQAAADtPwAARQAAAH3IAABGAAAAQXYAAEcAAQBfdwAASAAAALkyAABJAAAA/LQAAEoAAAC4cQAASwABAClTAABMAAAAJ1QAAE0AAADB2QAATgAAALiVAABPAAEA05YAAFAAAACpGwAAUQAAADOiAABSAAAASV4AAFMA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Gg0ZEAogBw0FgHdoZXJlAAAAAQAFgEMUCw4LAAOAZmFxAAAAAQADgCw0UQAJgGxpYnJlc3NsOwAAAAEACYAvByEOCzAwL0YAAgAHgHNlY3Rpb24AAAAAAD4ALYBIMk8gLSB0aGUgb3B0aW1pemVkIEhUVFAvMiBzZXJ2ZXIBL2luZGV4Lmh0bWwAOYBJbnN0YWxsIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9pbnN0YWxsLmh0bWwAGIAgSW5zdGFsbCABL2luc3RhbGwuaHRtbCM/gEJlbmNobWFya3MgLSBIMk8gLSB0aGUgb3B0aW1pemVkIEhUVFAvMiBzZXJ2ZXIBL2JlbmNobWFya3MuaHRtbAAegCBCZW5jaG1hcmtzIAEvYmVuY2htYXJrcy5odG1sIz2AQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUuaHRtbAAcgCBDb25maWd1cmUgAS9jb25maWd1cmUuaHRtbCNXgFF1aWNrIFN0YXJ0IC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvcXVpY2tfc3RhcnQuaHRtbAA2gCBDb25maWd1cmUgPiBRdWljayBTdGFydCABL2NvbmZpZ3VyZS9xdWlja19zdGFydC5odG1sI1+AQ29tbWFuZCBPcHRpb25zIC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvY29tbWFuZF9vcHRpb25zLmh0bWwAPoAgQ29uZmlndXJlID4gQ29tbWFuZCBPcHRpb25zIAEvY29uZmlndXJlL2NvbW1hbmRfb3B0aW9ucy5odG1sI2mAU3ludGF4IGFuZCBTdHJ1Y3R1cmUgLSBDb25maWd1cmUgLSBIMk8gLSB0aGUgb3B0aW1pemVkIEhUVFAvMiBzZXJ2ZXIBL2NvbmZpZ3VyZS9zeW50YXhfYW5kX3N0cnVjdHVyZS5odG1sAEiAIENvbmZpZ3VyZSA+IFN5bnRheCBhbmQgU3RydWN0dXJlIAEvY29uZmlndXJlL3N5bnRheF9hbmRfc3RydWN0dXJlLmh0bWwjX4BCYXNlIERpcmVjdGl2ZXMgLSBDb25maWd1cmUgLSBIMk8gLSB0aGUgb3B0aW1pemVkIEhUVFAvMiBzZXJ2ZXIBL2NvbmZpZ3VyZS9iYXNlX2RpcmVjdGl2ZXMuaHRtbAA+gCBDb25maWd1cmUgPiBCYXNlIERpcmVjdGl2ZXMgAS9jb25maWd1cmUvYmFzZV9kaXJlY3RpdmVzLmh0bWwjZ4BDb21wcmVzcyBEaXJlY3RpdmVzIC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvY29tcHJlc3NfZGlyZWN0aXZlcy5odG1sAEaAIENvbmZpZ3VyZSA+IENvbXByZXNzIERpcmVjdGl2ZXMgAS9jb25maWd1cmUvY29tcHJlc3NfZGlyZWN0aXZlcy5odG1sI2KASFRUUC8xIERpcmVjdGl2ZXMgLSBDb25maWd1cmUgLSBIMk8gLSB0aGUgb3B0aW1pemVkIEhUVFAvMiBzZXJ2ZXIBL2NvbmZpZ3VyZS9odHRwMV9kaXJlY3RpdmVzLmh0bWxBgCBDb25maWd1cmUgPiBIVFRQLzEgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9odHRwMV9kaXJlY3RpdmVzLmh0bWwjAGKASFRUUC8yIERpcmVjdGl2ZXMgLSBDb25maWd1cmUgLSBIMk8gLSB0aGUgb3B0aW1pemVkIEhUVFAvMiBzZXJ2ZXIBL2NvbmZpZ3VyZS9odHRwMl9kaXJlY3RpdmVzLmh0bWxBgCBDb25maWd1cmUgPiBIVFRQLzIgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9odHRwMl9kaXJlY3RpdmVzLmh0bWwjAGuAQWNjZXNzIExvZyBEaXJlY3RpdmVzIC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvYWNjZXNzX2xvZ19kaXJlY3RpdmVzLmh0bWwASoAgQ29uZmlndXJlID4gQWNjZXNzIExvZyBEaXJlY3RpdmVzIAEvY29uZmlndXJlL2FjY2Vzc19sb2dfZGlyZWN0aXZlcy5odG1sI2eARXJyb3Jkb2MgRGlyZWN0aXZlcyAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL2Vycm9yZG9jX2RpcmVjdGl2ZXMuaHRtbABGgCBDb25maWd1cmUgPiBFcnJvcmRvYyBEaXJlY3RpdmVzIAEvY29uZmlndXJlL2Vycm9yZG9jX2RpcmVjdGl2ZXMuaHRtbCNlgEV4cGlyZXMgRGlyZWN0aXZlcyAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL2V4cGlyZXNfZGlyZWN0aXZlcy5odG1sAESAIENvbmZpZ3VyZSA+IEV4cGlyZXMgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9leHBpcmVzX2RpcmVjdGl2ZXMuaHRtbCNlgEZhc3RDR0kgRGlyZWN0aXZlcyAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL2Zhc3RjZ2lfZGlyZWN0aXZlcy5odG1sAESAIENvbmZpZ3VyZSA+IEZhc3RDR0kgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9mYXN0Y2dpX2RpcmVjdGl2ZXMuaHRtbCNfgEZpbGUgRGlyZWN0aXZlcyAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL2ZpbGVfZGlyZWN0aXZlcy5odG1sAD6AIENvbmZpZ3VyZSA+IEZpbGUgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9maWxlX2RpcmVjdGl2ZXMuaHRtbCNlgEhlYWRlcnMgRGlyZWN0aXZlcyAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL2hlYWRlcnNfZGlyZWN0aXZlcy5odG1sAESAIENvbmZpZ3VyZSA+IEhlYWRlcnMgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9oZWFkZXJzX2RpcmVjdGl2ZXMuaHRtbCNhgE1ydWJ5IERpcmVjdGl2ZXMgLSBDb25maWd1cmUgLSBIMk8gLSB0aGUgb3B0aW1pemVkIEhUVFAvMiBzZXJ2ZXIBL2NvbmZpZ3VyZS9tcnVieV9kaXJlY3RpdmVzLmh0bWwAQIAgQ29uZmlndXJlID4gTXJ1YnkgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9tcnVieV9kaXJlY3RpdmVzLmh0bWwjYYBQcm94eSBEaXJlY3RpdmVzIC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvcHJveHlfZGlyZWN0aXZlcy5odG1sAECAIENvbmZpZ3VyZSA+IFByb3h5IERpcmVjdGl2ZXMgAS9jb25maWd1cmUvcHJveHlfZGlyZWN0aXZlcy5odG1sI2eAUmVkaXJlY3QgRGlyZWN0aXZlcyAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL3JlZGlyZWN0X2RpcmVjdGl2ZXMuaHRtbABGgCBDb25maWd1cmUgPiBSZWRpcmVjdCBEaXJlY3RpdmVzIAEvY29uZmlndXJlL3JlZGlyZWN0X2RpcmVjdGl2ZXMuaHRtbCNlgFJlcHJveHkgRGlyZWN0aXZlcyAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL3JlcHJveHlfZGlyZWN0aXZlcy5odG1sAESAIENvbmZpZ3VyZSA+IFJlcHJveHkgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9yZXByb3h5X2RpcmVjdGl2ZXMuaHRtbCNjgFN0YXR1cyBEaXJlY3RpdmVzIC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvc3RhdHVzX2RpcmVjdGl2ZXMuaHRtbABCgCBDb25maWd1cmUgPiBTdGF0dXMgRGlyZWN0aXZlcyABL2NvbmZpZ3VyZS9zdGF0dXNfZGlyZWN0aXZlcy5odG1sI3mAVGhyb3R0bGUgUmVzcG9uc2UgRGlyZWN0aXZlcyAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL3Rocm90dGxlX3Jlc3BvbnNlX2RpcmVjdGl2ZXMuaHRtbABYgCBDb25maWd1cmUgPiBUaHJvdHRsZSBSZXNwb25zZSBEaXJlY3RpdmVzIAEvY29uZmlndXJlL3Rocm90dGxlX3Jlc3BvbnNlX2RpcmVjdGl2ZXMuaHRtbCNlgFVzaW5nIEJhc2ljIEF1dGhlbnRpY2F0aW9uIC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvYmFzaWNfYXV0aC5odG1sAESAIENvbmZpZ3VyZSA+IFVzaW5nIEJhc2ljIEF1dGhlbnRpY2F0aW9uIAEvY29uZmlndXJlL2Jhc2ljX2F1dGguaHRtbCNNgFVzaW5nIENHSSAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL2NnaS5odG1sACyAIENvbmZpZ3VyZSA+IFVzaW5nIENHSSABL2NvbmZpZ3VyZS9jZ2kuaHRtbCNRgFVzaW5nIE1ydWJ5IC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvbXJ1YnkuaHRtbAAwgCBDb25maWd1cmUgPiBVc2luZyBNcnVieSABL2NvbmZpZ3VyZS9tcnVieS5odG1sI2GAVXNpbmcgRG9TIERldGVjdGlvbiAtIENvbmZpZ3VyZSAtIEgyTyAtIHRoZSBvcHRpbWl6ZWQgSFRUUC8yIHNlcnZlcgEvY29uZmlndXJlL2Rvc19kZXRlY3Rpb24uaHRtbABAgCBDb25maWd1cmUgPiBVc2luZyBEb1MgRGV0ZWN0aW9uIAEvY29uZmlndXJlL2Rvc19kZXRlY3Rpb24uaHRtbCNdgEFjY2VzcyBDb250cm9sIC0gQ29uZmlndXJlIC0gSDJPIC0gdGhlIG9wdGltaXplZCBIVFRQLzIgc2VydmVyAS9jb25maWd1cmUvYWNjZXNzX2NvbnRyb2wuaHRtbAA8gCBDb25maWd1cmUgPiBBY2Nlc3MgQ29udHJvbCABL2NvbmZpZ3VyZS9hY2Nlc3NfY29udHJvbC5odG1sIy6ARXhhbXBsZQEvY29uZmlndXJlL2FjY2Vzc19jb250cm9sLmh0bWwjZXhhbXBsZTaAQUNMIE1ldGhvZHMBL2NvbmZpZ3VyZS9hY2Nlc3NfY29udHJvbC5odG1sI2FjbC1tZXRob2RzQIBNYXRjaGluZyBNZXRob2RzAS9jb25maWd1cmUvYWNjZXNzX2NvbnRyb2wuaHRtbCNtYXRjaGluZy1tZXRob2RzLoBDYXV0aW9uAS9jb25maWd1cmUvYWNjZXNzX2NvbnRyb2wuaHRtbCNjYXV0aW9uLIBIb3ctVG8BL2NvbmZpZ3VyZS9hY2Nlc3NfY29udHJvbC5odG1sI2hvdy10b0iARnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgLSBIMk8gLSB0aGUgb3B0aW1pemVkIEhUVFAvMiBzZXJ2ZXIBL2ZhcS5odG1sJ4AgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgAS9mYXEuaHRtbCMAAQCnngAA9gwgAABAADAAAI0AAEAAAAMAOwABoIABAAAAYAAAJwAAQAMAAAAsAABAAADAAMUAAEAAAAAMZAIAQAAwAABFAABAAAAAMA4AAEADAAAAkwEAQAAGAACoAABAMAAAACQAAEAAAAAMFgAAQAAAMABuAABAAAAMAK0AAEAADAAAMgAAQIABAAAhAABAAAwAABEBAEBgAAAAJQAAQAAYAAAfAABAMAAAADgAAEAAYAAAIwAAQAAMAAAiAABAAAAADCsAAEAwAAAAxAAAQADAAABfACGAMAAAAAgAAAAmAABAAgAAADoAAEAAAAAgGgAAQAAAAgAkAABAAgAAABMAAECAAQAALwABgAAAQAADgHRhZwADAAAANgECgGgzAoBoMwKAaDICgGgzAoBoMwOAcHJlAAOAcHJlAAKAaDQCgGgzA4BwcmUAA4BwcmUAA4BwcmUAAoBoMwKAaDICgGgzAoBoMwKAaDMCgGgzAoBoMgKAaDIDgHByZQADgHByZQADgHByZQACgGgzAoBoMgOAcHJlAAKAaDICgGgzAoBoMwOAcHJlAAKAaDMDgHByZQADgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQADgHByZQACgGgzAoBoMgKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDQDgHByZQACgGg0AoBoNAKAaDQDgHByZQACgGgzA4BwcmUAA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMCgGgzAoBoMwKAaDMDgHByZQACgGgzAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoNAKAaDQCgGg0AoBoNAKAaDMDgHByZQACgGgzAoBoMwOAcHJlAAKAaDMDgHByZQACgGgyAoBoMwOAcHJlAAOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMgKAaDMDgHByZQACgGgzA4BwcmUAAoBoMgKAaDMCgGgzA4BwcmUAA4BwcmUAAoBoMwKAaDMDgHByZQADgHByZQACgGgzAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgyAoBoMwOAcHJlAAOAcHJlAAOAcHJlAAKAaDMCgGgyAoBoMwOAcHJlAAOAcHJlAAOAcHJlAAKAaDICgGgzA4BwcmUAAoBoMgKAaDMDgHByZQACgGgzA4BwcmUAA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMgKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQADgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwKAaDICgGgzA4BwcmUAAoBoMwKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwKAaDMDgHByZQACgGgyAoBoMwOAcHJlAAKAaDMDgHByZQACgGgyAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwKAaDMCgGgzAoBoMwKAaDMCgGgzAoBoMwKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDICgGgzA4BwcmUAAoBoMgKAaDMDgHByZQACgGgyAoBoMwOAcHJlAAKAaDMDgHByZQACgGgyAoBoMwOAcHJlAAOAcHJlAAKAaDIDgHByZQACgGgyA4BwcmUAA4BwcmUAAoBoMgKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQADgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDICgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMCgGgyAoBoMgOAcHJlAAKAaDICgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDICgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDMDgHByZQACgGgzA4BwcmUAAoBoMwOAcHJlAAKAaDIDgHByZQADgHByZQADgHByZQACgGgyAoBoMwOAcHJlAAKAaDICgGgzAoBoMwKAaDMDgHByZQACgGgzAoBoMwEAKJ4AAPIMDAABQAABAAAAABAADQBxgAEAAAQAQAAAAACABAAAIAACAMOAAAEAAAAAAEAAAAQAAEAAAAAAA7AAAAEAAAAAgEAAAAAAAAgAEgABQAAAIAAAAAAEIACDhAAABAAAIAAAAAABAAQAAAAEAAmAAAACAAIAQAgIAAFAAgAEQAAAAgARAAGwACAABAAQAAAAAAACAwAAQCAAAIAUAAFAAAIAAAAAEAAKAEOgAIAAAAABAAAAAAAQEAAAAAgABYoAAACAAAAAAQgAAAAAACRAAgAjgAQAAAAAAACAAAAAQBgAwYYAAIAAAAAAAQgAACQgAAAAAAAAEBAAAYgAACAAAAAAgBgAAEAACAgADgABggAEAAAAAAAgAQABggEAAAAAQABIAwAAQAABAAALAAOCAIAAAAQABAAAAACAEAABggBAAJAEAAAABgABzAAQBAAAQAAAAAAgCAAAABAJgAAAAAICAQAAEAABmAAAAEAACBAAAAAEAAUAQYAAgAAAAAAQAAsAAYEIAAAIAAgAAAcAAUAAAACEAAAIABoAAECAAAAADgAAQAgAQgAuAAFAAAQAAEAAAAAYAAFAEAAAAAAAAEASABnwAAAAgAEAAAAAAQAgAgAAACAAAAAAQAAAAAAZ4ABAAAAAAAAIAAAABAAEAAAAEAAAAACB4yAABAAAgAAAIAgAAAAAAIAAAQAAAAAAAgEAw7wAAAAQAAIEAUAQCAAAAgAAAEAAAABAAAACAAAAAAAQAA0Aw4hAEAEA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"; |