Initial built site for asf-staging branch
diff --git a/output/.htaccess b/output/.htaccess
new file mode 100644
index 0000000..0f1face
--- /dev/null
+++ b/output/.htaccess
@@ -0,0 +1,3 @@
+RewriteEngine On
+RewriteCond %{HTTPS} !=on
+RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
diff --git a/output/CONTRIBUTING.md b/output/CONTRIBUTING.md
new file mode 100644
index 0000000..dd30594
--- /dev/null
+++ b/output/CONTRIBUTING.md
@@ -0,0 +1,16 @@
+# Contributing to the Thrift Website
+
+Contributions to the website can be made by creating pull
+requests to this repo on GitHub.
+
+Before creating a pull request, follow the instructions in the
+[README.md] to test your changes by running the website locally.
+
+If you cannot run the website locally, it's OK to submit your
+pull request. A committer will test your changes before merging.
+
+For general information on contributing to Thrift projects, check
+out the [How To Contribute][contribute] page.
+
+[README.md]: README.md
+[contribute]: http://thrift.apache.org/docs/HowToContribute
diff --git a/output/LICENSE b/output/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/output/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/output/NOTICE b/output/NOTICE
new file mode 100644
index 0000000..01cb138
--- /dev/null
+++ b/output/NOTICE
@@ -0,0 +1,5 @@
+Apache Thrift Website
+Copyright 2020 The Apache Software Foundation.
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/output/README.md b/output/README.md
new file mode 100644
index 0000000..48f7dac
--- /dev/null
+++ b/output/README.md
@@ -0,0 +1,140 @@
+# Apache Thrift Website
+
+Apache Thrift's website is generated from Markdown source
+(specifically, [kramdown] style) with [Jekyll], using [Bundler]
+to manage its gem dependencies.
+
+## Development
+
+## Local Builds for Testing
+
+### Setting up Your Jekyll/Bundler Environment
+
+Ruby and RubyGems are required to use [Jekyll] and [Bundler], so
+first make sure you have those on your machine.
+
+If you are using an OS packaged version of Ruby, you may also
+need to install the ruby-dev (Ubuntu) or ruby-devel (Fedora)
+package as well to build any native code for gems that are
+installed later. Installing these will also ensure your system's
+RubyGems package is installed. Depending on your OS, you may also
+need other packages to install/build gems, such as ruby-full,
+make, gcc, nodejs, build-essentials, or patch.
+
+Once Ruby, RubyGems, and any necessary native tools are
+installed, you are ready to install [Bundler] to manage the
+remaining RubyGem dependencies. Bundler is included in Ruby 2.6
+and later as a default gem, so installing it may not be needed.
+
+Because we use [Bundler] to install specific versions of gems, it
+is not recommended to use an OS packaged version of gems other
+than what comes built-in. If you are using an OS packaged version
+of Ruby, it is __strongly__ recommended to avoid `sudo` when
+installing additional gems, in order to avoid conflicting with
+your system's package-managed installation. Instead, you can
+specify a `GEM_HOME` directory for installing gems locally in
+your home directory. You can do this in your `$HOME/.bashrc` file
+or other appropriate place for your environment:
+
+```bash
+# in .bashrc
+export GEM_HOME=$HOME/.gem/ruby
+```
+
+With Ruby installed on your machine, you can install [Bundler]
+using the command below:
+
+```bash
+# not necessary in Ruby >2.6, since it is a default gem since 2.6
+gem install bundler
+```
+
+Next, use [Bundler] to install [Jekyll] and other dependencies
+needed to run the website (this command assumes your current
+working directory is your clone of this repository with the
+`main` branch checked out, because that's where the Gemfile
+dependency list exists).
+
+```bash
+bundle install
+```
+
+### Testing with the Built-in Jekyll Webserver
+
+The command to serve the site contents using Jekyll's built-in
+webserver is as follows (this webserver may behave differently
+than apache.org's servers).
+
+```bash
+bundle exec jekyll serve -w
+```
+
+You do __NOT__ need to execute a `bundle exec jekyll build`
+command first, as the `serve` command is sufficient to both build
+the site and serve its contents. By default, it will also try to
+re-build any pages you change while running the webserver, which
+can be quite useful if trying to get some CSS or HTML styled
+"just right".
+
+Jekyll will print a local URL where the site can be viewed
+(usually, [http://0.0.0.0:4000/](http://0.0.0.0:4000/)).
+
+## Publishing
+
+### Automatic Staging
+
+Changes pushed to our `main` branch will automatically trigger
+Jekyll to build our site from that branch and push the result to
+our `asf-staging` branch, where they will be served on [our
+default staging site][staging].
+
+### Publishing Staging to Production
+
+First, add our repository as a remote in your local clone, if you
+haven't already done so (these commands assume the name of that
+remote is 'upstream').
+
+Example:
+
+```bash
+git clone https://github.com/<yourusername>/thrift-website
+cd thrift-website
+git remote add upstream https://github.com/apache/thrift-website
+```
+
+Next, publish the staging site to production by updating the
+`asf-site` branch to match the contents in the `asf-staging`
+branch:
+
+```bash
+# Step 0: stay in main branch; you never need to switch
+git checkout main
+
+# Step 1: update your upstream remote
+git remote update upstream
+
+# Step 2: push upstream/asf-staging to upstream/asf-site
+# run next command with --dry-run first to see what it will do without making changes
+git push upstream upstream/asf-staging:asf-site
+```
+
+A convenience script can be found that performs these steps for
+you, after asking which remote you want to use. It is located in
+the `main` branch at `_scripts/publish.sh`
+
+Note that Step 2 should always be a fast-forward merge. That is,
+there should never be any reason to force-push it if everything
+is done correctly. If extra commits are ever added to `asf-site`
+that are not present in `asf-staging`, then those branches will
+need to be sync'd back up in order to continue avoiding force
+pushes.
+
+The final site can be viewed [here][production].
+
+
+[Bundler]: https://bundler.io/
+[Jekyll]: https://jekyllrb.com/
+[Liquid]: https://jekyllrb.com/docs/liquid/
+[kramdown]: https://kramdown.gettalong.org/
+[production]: https://thrift.apache.org
+[staging]: https://thrift.staged.apache.org
diff --git a/output/about.html b/output/about.html
new file mode 100644
index 0000000..07a4cb7
--- /dev/null
+++ b/output/about.html
@@ -0,0 +1,454 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - About</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <p>Apache Thrift is a software project spanning a variety of programming languages and use cases. Our goal is to make reliable, performant communication and data serialization across languages as efficient and seamless as possible. Originally developed at Facebook, Thrift was open sourced in April 2007 and entered the Apache Incubator in May, 2008. Thrift became an Apache TLP in October, 2010.</p>
+
+<p>Apache Thrift aims to embody the following values:</p>
+
+<ul>
+  <li>
+    <p><strong>Simplicity</strong>
+Thrift code is simple and approachable, free of unnecessary dependencies.</p>
+  </li>
+  <li>
+    <p><strong>Transparency</strong>
+Thrift conforms to the most common idioms in all languages.</p>
+  </li>
+  <li>
+    <p><strong>Consistency</strong>
+Niche, language-specific features belong in extensions, not the core library.</p>
+  </li>
+  <li>
+    <p><strong>Performance</strong>
+Strive for performance first, elegance second.</p>
+  </li>
+</ul>
+
+<hr />
+
+<h2 id="project-team">Project Team</h2>
+
+<h3 id="committers">Committers</h3>
+
+<div class="committers">
+  <table class="table table-bordered table-striped">
+    <tbody>
+    <tr>
+      <td><b>Apache ID</b></td>
+      <td><b>Full Name</b></td>
+      <td><b>Specialities</b></td>
+      <td><b>Timezone</b></td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=mcslee">mcslee</a></td>
+      <td class="fullname">Mark Slee</td>
+      <td>General vision and implementation</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=dreiss">dreiss</a></td>
+      <td class="fullname">David Reiss</td>
+      <td>Everything, GIT configuration, performance</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=aditya">aditya</a></td>
+      <td class="fullname">Aditya Agarwal</td>
+      <td>C++ servers</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=marck">marck</a></td>
+      <td class="fullname">Marc Kwiatkowski</td>
+      <td>C++ concurrency</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=jwang">jwang</a></td>
+      <td class="fullname">James Wang</td>
+      <td>C++ transports and processors</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=cpiro">cpiro</a></td>
+      <td class="fullname">Chris Piro</td>
+      <td>Erlang</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=bmaurer">bmaurer</a></td>
+      <td class="fullname">Ben Maurer</td>
+      <td>Python data serialization</td>
+      <td align="right">-5</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=kclark">kclark</a></td>
+      <td class="fullname">Kevin Clark</td>
+      <td>Ruby implementation</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=jake">jake</a></td>
+      <td class="fullname">Jake Luciani</td>
+      <td>Perl, JavaScript</td>
+      <td align="right">-5</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=bryanduxbury">bryanduxbury</a></td>
+      <td class="fullname">Bryan Duxbury</td>
+      <td>Compact Protocol, Java, Ruby</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=esteve">esteve</a></td>
+      <td class="fullname">Esteve Fernandez</td>
+      <td>Python, Twisted, async transports</td>
+      <td align="right">1</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=todd">todd</a></td>
+      <td class="fullname">Todd Lipcon</td>
+      <td>Erlang, Java</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=geechorama">geechorama</a></td>
+      <td class="fullname">Andrew McGeachie</td>
+      <td>Cocoa</td>
+      <td align="right">?</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=molinaro">molinaro</a></td>
+      <td class="fullname">Anthony Molinaro</td>
+      <td>Erlang, Perl, autotools</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=roger">roger</a></td>
+      <td class="fullname">Roger Meier</td>
+      <td>Continuous Integration, C++, C#, JavaScript, make cross and other stuff</td>
+      <td align="right">2</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=jfarrell">jfarrell</a></td>
+      <td class="fullname">Jake Farrell</td>
+      <td>Release Manager, Build, Client Publishing, Java, PHP, Ruby</td>
+      <td align="right">-5</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=jensg">jensg</a></td>
+      <td class="fullname">Jens Geyer</td>
+      <td>Delphi, C#/NetStd, Go, Graphviz, Haxe</td>
+      <td align="right">1</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=carl">carl</a></td>
+      <td class="fullname">Carl Yeksigian</td>
+      <td>C#</td>
+      <td align="right">-5</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=ra">ra</a></td>
+      <td class="fullname">Randy Abernethy</td>
+      <td>C++, Python, JavaScript, C#, what have you</td>
+      <td align="right">-8</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=hcorg">hcorg</a></td>
+      <td class="fullname">Konrad Grochowski</td>
+      <td>C++, Python, Git, Continuous Integration</td>
+      <td align="right">1</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=nsuke">nsuke</a></td>
+      <td class="fullname">Nobuaki Sukegawa </td>
+      <td></td>
+      <td align="right">9</td>
+    </tr>
+    
+    <tr class="">
+      <td class="username"><a href="https://people.apache.org/phonebook.html?uid=simonsouth">simonsouth</a></td>
+      <td class="fullname">Simon South</td>
+      <td>C (GLib)</td>
+      <td align="right">-5</td>
+    </tr>
+    
+    </tbody>
+  </table>
+</div>
+
+<h3 id="champion">Champion</h3>
+<ul>
+  <li>Doug Cutting</li>
+</ul>
+
+<h3 id="mentors">Mentors</h3>
+<ul>
+  <li>Paul Querna</li>
+  <li>Upayavira</li>
+  <li>Jason van Zyl</li>
+</ul>
+
+<hr />
+
+<h2 id="powered-by-apache-thrift">Powered by Apache Thrift</h2>
+<p>The following companies are known to employ Apache Thrift in their production services.</p>
+
+<div class="committers">
+    <table class="table table-bordered table-striped">
+        <tbody>
+        <tr>
+            <td><b>Company</b></td>
+            <td><b>Website</b></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Cloudera</td>
+            <td class="website"><a href="http://www.cloudera.com">http://www.cloudera.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Evernote</td>
+            <td class="website"><a href="http://evernote.com">http://evernote.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Facebook</td>
+            <td class="website"><a href="http://www.facebook.com">http://www.facebook.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">last.fm</td>
+            <td class="website"><a href="http://www.last.fm">http://www.last.fm</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Mendeley</td>
+            <td class="website"><a href="http://www.mendeley.com">http://www.mendeley.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">OpenX</td>
+            <td class="website"><a href="http://www.openx.org">http://www.openx.org</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Pinterest</td>
+            <td class="website"><a href="http://www.pinterest.com">http://www.pinterest.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Quora</td>
+            <td class="website"><a href="http://www.quora.com">http://www.quora.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">RapLeaf</td>
+            <td class="website"><a href="http://www.rapleaf.com">http://www.rapleaf.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">reCaptcha</td>
+            <td class="website"><a href="http://www.recaptcha.com">http://www.recaptcha.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Siemens</td>
+            <td class="website"><a href="http://www.siemens.com">http://www.siemens.com</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Uber</td>
+            <td class="website"><a href="http://uber.com">http://uber.com</a></td>
+        </tr>
+        
+        </tbody>
+    </table>
+</div>
+
+<h2 id="open-source-projects-using-apache-thrift">Open source projects using Apache Thrift</h2>
+<p>Apache Thrift is widely used in lots of other Open Source projects. These are some of them, but the list is by no means exhaustive.</p>
+
+<div class="committers">
+    <table class="table table-bordered table-striped">
+        <tbody>
+        <tr>
+            <td><b>Project</b></td>
+            <td><b>Website</b></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Microsoft Robust Distributed System Nucleus (rDSN)</td>
+            <td class="website"><a href="https://github.com/Microsoft/rDSN">https://github.com/Microsoft/rDSN</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Twitter Finagle</td>
+            <td class="website"><a href="http://twitter.github.io/finagle/guide/Protocols.html">http://twitter.github.io/finagle/guide/Protocols.html</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Twitter Scrooge</td>
+            <td class="website"><a href="http://twitter.github.io/scrooge">http://twitter.github.io/scrooge</a></td>
+        </tr>
+        
+        </tbody>
+    </table>
+</div>
+
+<h2 id="other-apache-projects-using-apache-thrift">Other Apache projects using Apache Thrift</h2>
+<p>There’s also plenty of other Apache projects who are using and/or supporting Thrift in some way or another.</p>
+
+<div class="committers">
+    <table class="table table-bordered table-striped">
+        <tbody>
+        <tr>
+            <td><b>Project</b></td>
+            <td><b>Website</b></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Accumulo</td>
+            <td class="website"><a href="https://accumulo.apache.org">https://accumulo.apache.org</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Aurora</td>
+            <td class="website"><a href="http://aurora.apache.org">http://aurora.apache.org</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Camel</td>
+            <td class="website"><a href="http://camel.apache.org/">http://camel.apache.org/</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Hadoop</td>
+            <td class="website"><a href="http://wiki.apache.org/hadoop/HDFS-APIs">http://wiki.apache.org/hadoop/HDFS-APIs</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">HBase</td>
+            <td class="website"><a href="http://wiki.apache.org/hadoop/Hbase/ThriftApi">http://wiki.apache.org/hadoop/Hbase/ThriftApi</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Parquet</td>
+            <td class="website"><a href="https://parquet.apache.org">https://parquet.apache.org</a></td>
+        </tr>
+        
+        <tr class="">
+            <td class="company">Storm</td>
+            <td class="website"><a href="http://storm.apache.org/">http://storm.apache.org/</a></td>
+        </tr>
+        
+        </tbody>
+    </table>
+</div>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/developers.html b/output/developers.html
new file mode 100644
index 0000000..b1cc70e
--- /dev/null
+++ b/output/developers.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Developers</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="contributing">Contributing</h2>
+<p>Anyone interested in contributing to Apache Thrift should read the <a href="/docs/HowToContribute">How to Contribute</a> guide prior to submitting any patches to <a href="http://issues.apache.org/jira/browse/THRIFT">Jira</a>. There’s also a short guide on <a href="/docs/HowToNewLanguage">how to add new language bindings</a>. If you have any questions about this please <a href="/mailing">contact us</a>.</p>
+
+<h2 id="issue-tracking">Issue Tracking</h2>
+<p>Apache Thrift tracks both bugs and enhancements using <a href="http://issues.apache.org/jira/browse/THRIFT">Jira</a>. Before filing new requests, we ask that you first do the following:</p>
+
+<ul>
+  <li>Search the <a href="http://issues.apache.org/jira/browse/THRIFT">Jira</a> database</li>
+  <li>Check the <a href="/mailing">user mailing list</a> via searching the archives or asking a question</li>
+</ul>
+
+<h2 id="source-control">Source Control</h2>
+<p>The Apache Thrift source code resides in <a href="https://github.com/apache/thrift">GitHub</a>.  Three types of access are available:</p>
+
+<ul>
+  <li><strong>Web-Access (read-only)</strong></li>
+</ul>
+
+<p>Source code can be browsed via the Web:</p>
+
+<p><a href="https://github.com/apache/thrift">https://github.com/apache/thrift</a></p>
+
+<ul>
+  <li>
+    <p><strong>Anonymous (read-only) git</strong></p>
+
+    <p>git clone https://github.com/apache/thrift.git</p>
+  </li>
+  <li>
+    <p><strong>Committer Access (read-write)</strong></p>
+  </li>
+</ul>
+
+<p>General instructions for committer access is <a href="https://git-wip-us.apache.org/#committers-getting-started">here</a>.  It is a little stale (especially the netrc file information).</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone git@github.com:apache/thrift.git
+</code></pre></div></div>
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/doc/images/cgrn.png b/output/doc/images/cgrn.png
new file mode 100644
index 0000000..dc0964e
--- /dev/null
+++ b/output/doc/images/cgrn.png
Binary files differ
diff --git a/output/doc/images/cred.png b/output/doc/images/cred.png
new file mode 100644
index 0000000..086a5fb
--- /dev/null
+++ b/output/doc/images/cred.png
Binary files differ
diff --git a/output/docs/BuildingFromSource.html b/output/docs/BuildingFromSource.html
new file mode 100644
index 0000000..edf8296
--- /dev/null
+++ b/output/docs/BuildingFromSource.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Building From Source</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="building-from-source">Building from source</h2>
+<p>First make sure your system meets all necessary <a href="/docs/install">Apache Thrift Requirements</a></p>
+
+<p>If you are building from the first time out of the source repository, you will need to generate the configure scripts.  (This is not necessary if you downloaded a released tarball.)  From the top directory, do:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./bootstrap.sh
+</code></pre></div></div>
+
+<p>Once the configure scripts are generated, thrift can be configured.
+From the top directory, do:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./configure
+</code></pre></div></div>
+
+<p>Disable a language:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./configure --without-java
+</code></pre></div></div>
+
+<p>You may need to specify the location of the boost files explicitly. If you installed boost in /usr/local, you would run configure as follows:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./configure --with-boost=/usr/local
+</code></pre></div></div>
+
+<p>If you want to override the logic of the detection of the Java SDK, use the JAVAC environment variable:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./configure JAVAC=/usb/bin/javac
+</code></pre></div></div>
+
+<p>Note that by default the thrift C++ library is typically built with debugging symbols included. If you want to customize these options you should use the CXXFLAGS option in configure, as such:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./configure CXXFLAGS='-g -O2'
+./configure CFLAGS='-g -O2'
+./configure CPPFLAGS='-DDEBUG_MY_FEATURE'
+</code></pre></div></div>
+
+<p>To see other configuration options run</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./configure --help
+</code></pre></div></div>
+
+<p>Once you have run configure you can build Thrift via make:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make
+</code></pre></div></div>
+
+<p>and run the test suite:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make check
+</code></pre></div></div>
+
+<p>and the cross language test suite:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sh test/test.sh
+</code></pre></div></div>
+
+<h3 id="issues-while-compiling">Issues while compiling</h3>
+
+<ul>
+  <li>“compiler/cpp/thriftl.cc:2190: undefined reference to `yywrap’”</li>
+</ul>
+
+<p>you need to install the <a href="https://github.com/westes/flex">Flex library</a> (See also <a href="/docs/install">Apache Thrift Requirements</a> ) and re-run the configuration script.</p>
+
+<ul>
+  <li>mv: cannot stat “‘.deps/TBinaryProtocol.Tpo’: No such file or directory” while building the Thrift Runtime Library</li>
+</ul>
+
+<p>Re-reun configure with</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>--enable-libtool-lock
+</code></pre></div></div>
+
+<p>or by turning off parallel make by placing <strong>.NOTPARALLEL:</strong> in lib/cpp/Makefile or</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make -j 1
+</code></pre></div></div>
+
+<p>Although the thrift compiler build appears to be compatible with parallel make without libtool lock, the thrift runtime build is not.</p>
+
+<h2 id="installing">Installing</h2>
+
+<p>From the top directory, become superuser and do:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make install
+</code></pre></div></div>
+
+<p>Note that some language packages must be installed manually using build tools
+better suited to those languages (this applies to Java, Ruby, PHP).</p>
+
+<p>Look for the README file in the <code class="language-plaintext highlighter-rouge">lib/&lt;language&gt;/</code> folder for more details on the installation of each language library package.</p>
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/HowToContribute.html b/output/docs/HowToContribute.html
new file mode 100644
index 0000000..659bf6e
--- /dev/null
+++ b/output/docs/HowToContribute.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - How To Contribute</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="how-to-contribute">How to Contribute</h1>
+
+<p>Thank you for your interest in contributing to the Apache Thrift project!  Information on why and how to contribute is available on the Apache Software Foundation (ASF) web site. In particular, we recommend the following to become acquainted with Apache Contributions:</p>
+
+<ul>
+  <li><a href="http://www.apache.org/dev/contributors">Contributors Tech Guide</a></li>
+  <li><a href="http://www.apache.org/foundation/getinvolved.html">Get involved!</a></li>
+  <li><a href="http://www.apache.org/licenses/LICENSE-2.0.html#contributions">Legal aspects on Submission of Contributions (Patches)</a></li>
+</ul>
+
+<h2 id="github-pull-requests">GitHub pull requests</h2>
+
+<p>This is the preferred method of submitting changes.  When you submit a pull request through github,
+it activates the continuous integration (CI) build systems at Appveyor and Travis to build your changesxi
+on a variety of Linux and Windows configurations and run all the test suites.  Follow these requirements 
+for a successful pull request:</p>
+
+<ol>
+  <li>
+    <p>All significant changes require an <a href="http://issues.apache.org/jira/browse/THRIFT">Apache Jira THRIFT Issue</a> ticket.  Trivial changes such as fixing a typo or a compiler warning do not.</p>
+  </li>
+  <li>All pull requests should contain a single commit per issue, or we will ask you to squash it.</li>
+  <li>
+    <p>The pull request title must begin with the Jira THRIFT ticket identifier if it has an associated ticket, for example:</p>
+
+    <pre><code>THRIFT-9999: an example pull request title
+</code></pre>
+  </li>
+  <li>
+    <p>Commit messages must follow this pattern for code changes (deviations will not be merged):</p>
+
+    <pre><code>THRIFT-9999: [summary of fix, one line if possible]
+Client: [language(s) affected, comma separated, for example: "cpp,erl,perl"]
+</code></pre>
+  </li>
+</ol>
+
+<p>Instructions:</p>
+
+<ol>
+  <li>Create a fork in your GitHub account of http://github.com/apache/thrift</li>
+  <li>Clone the fork to your development system.</li>
+  <li>Create a branch for your changes (best practice is issue as branch name, e.g. THRIFT-9999).</li>
+  <li>
+    <p>Modify the source to include the improvement/bugfix, and:</p>
+
+    <ul>
+      <li>Remember to provide <em>tests</em> for all submitted changes!</li>
+      <li>Use test-driven development (TDD): add a test that will isolate the bug <em>before</em> applying the change that fixes it.</li>
+      <li>Verify that you follow <a href="/docs/coding_standards">Thrift Coding Standards</a> (you can run &#8216;make style&#8217;, which ensures proper format for some languages).</li>
+      <li>[<em>optional</em>] Verify that your change works on other platforms by adding a GitHub service hook to <a href="http://docs.travis-ci.com/user/getting-started/#Step-one%3A-Sign-in">Travis CI</a> and <a href="http://www.appveyor.com/docs">AppVeyor</a>.  You can use this technique to run the Thrift CI jobs in your account to check your changes before they are made public.  Every GitHub pull request into Thrift will run the full CI build and test suite on your changes.</li>
+    </ul>
+  </li>
+  <li>Squash your changes to a single commit.  This maintains clean change history.</li>
+  <li>Commit and push changes to your branch (please use issue name and description as commit title, e.g. &#8220;THRIFT-9999: make it perfect&#8221;), with the affected languages on the next line of the description.</li>
+  <li>Use GitHub to create a pull request going from your branch to apache:master.  Ensure that the Jira ticket number is at the beginning of the title of your pull request, same as the commit title.</li>
+  <li>Wait for other contributors or committers to review your new addition, and for a CI build to complete.</li>
+  <li>Wait for a committer to commit your patch.  You can nudge the committers if necessary by sending a message to the <a href="https://thrift.apache.org/mailing">Apache Thrift mailing list</a>.</li>
+</ol>
+
+<h2 id="if-you-want-to-build-the-project-locally">If you want to build the project locally</h2>
+
+<p>For Windows systems, see our detailed instructions on the <a href="/build/cmake/README.md">CMake README</a>.</p>
+
+<p>For Windows Native C++ builds, see our detailed instructions on the <a href="/build/wincpp/README.md">WinCPP README</a>.</p>
+
+<p>For unix systems, see our detailed instructions on the <a href="/build/docker/README.md">Docker README</a>.</p>
+
+<h2 id="if-you-want-to-review-open-issues">If you want to review open issues&#8230;</h2>
+
+<ol>
+  <li>Review the <a href="https://github.com/apache/thrift/pulls">GitHub Pull Request Backlog</a>.  Code reviews are open to all.</li>
+  <li>Review the <a href="http://issues.apache.org/jira/browse/THRIFT">Jira issue tracker</a>.  You can search for tickets relating to languages you are interested in or currently using with thrift, for example a Jira search (Issues -&gt; Search For Issues) query of <code>project = THRIFT AND component in ("Erlang - Library") and status not in (resolved, closed)</code> will locate all the open Erlang Library issues.</li>
+</ol>
+
+<h2 id="if-you-discovered-a-defect">If you discovered a defect&#8230;</h2>
+
+<ol>
+  <li>Check to see if the issue is already in the <a href="http://issues.apache.org/jira/browse/THRIFT">Jira issue tracker</a>.</li>
+  <li>If not, create a ticket describing the change you&#8217;re proposing in the Jira issue tracker.</li>
+  <li>Contribute your code changes using the GitHub pull request method:</li>
+</ol>
+
+<h2 id="contributing-via-patch">Contributing via Patch</h2>
+
+<p>To create a patch from changes in your local directory:</p>
+
+<pre><code>git diff &gt; ../THRIFT-NNNN.patch
+</code></pre>
+
+<p>then wait for contributors or committers to review your changes, and then for a committer to apply your patch.  This is not the preferred way to submit changes and incurs additional overhead for committers who must then create a pull request for you.</p>
+
+<h2 id="github-recipes-for-pull-requests">GitHub recipes for Pull Requests</h2>
+
+<p>Sometimes commmitters may ask you to take actions in your pull requests.  Here are some recipes that will help you accomplish those requests.  These examples assume you are working on Jira issue THRIFT-9999.  You should also be familiar with the <a href="https://help.github.com/articles/syncing-a-fork/">upstream</a> repository concept.</p>
+
+<h3 id="squash-your-changes">Squash your changes</h3>
+
+<p>If you have not submitted a pull request yet, or if you have not yet rebased your existing pull request, you can squash all your commits down to a single commit.  This makes life easier for the committers.  If your pull request on GitHub has more than one commit, you should do this.</p>
+
+<ol>
+  <li>Use the command <code>git log</code> to identify how many commits you made since you began.</li>
+  <li>Use the command <code>git rebase -i HEAD~N</code> where N is the number of commits.</li>
+  <li>Leave &#8220;pull&#8221; in the first line.</li>
+  <li>Change all other lines from &#8220;pull&#8221; to &#8220;fixup&#8221;.</li>
+  <li>All your changes are now in a single commit.</li>
+</ol>
+
+<p>If you already have a pull request outstanding, you will need to do a &#8220;force push&#8221; to overwrite it since you changed your commit history:</p>
+
+<pre><code>git push -u origin THRIFT-9999 --force
+</code></pre>
+
+<p>A more detailed walkthrough of a squash can be found at <a href="http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html">Git Ready</a>.</p>
+
+<h3 id="rebase-your-pull-request">Rebase your pull request</h3>
+
+<p>If your pull request has a conflict with master, it needs to be rebased:</p>
+
+<pre><code>git checkout THRIFT-9999
+git rebase upstream master
+  (resolve any conflicts, make sure it builds)
+git push -u origin THRIFT-9999 --force
+</code></pre>
+
+<h3 id="fix-a-bad-merge">Fix a bad merge</h3>
+
+<p>If your pull request contains commits that are not yours, then you should use the following technique to fix the bad merge in your branch:</p>
+
+<pre><code>git checkout master
+git pull upstream master
+git checkout -b THRIFT-9999-take-2
+git cherry-pick ...
+    (pick only your commits from your original pull request in ascending chronological order)
+squash your changes to a single commit if there is more than one (see above)
+git push -u origin THRIFT-9999-take-2:THRIFT-9999
+</code></pre>
+
+<p>This procedure will apply only your commits in order to the current master, then you will squash them to a single commit, and then you force push your local THRIFT-9999-take-2 into remote THRIFT-9999 which represents your pull request, replacing all the commits with the new one.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=CONTRIBUTING.md">CONTRIBUTING.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/HowToNewLanguage.html b/output/docs/HowToNewLanguage.html
new file mode 100644
index 0000000..4cd4278
--- /dev/null
+++ b/output/docs/HowToNewLanguage.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - How to add new language bindings</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="roadmap-for-adding-new-language-bindings">Roadmap for adding new language bindings</h2>
+
+<p>When considering new language bindings, there are certain points to think about. First, you should find out, if you are about to implement completely new language bindings that are not yet supported with Thrift, or if you just want to add support for a specific “flavour” of an already implemented language.</p>
+
+<h3 id="q-the-language-exists-but-it-lacks-support-for-feature-or-version-what-should-i-do">Q: The language exists, but it lacks support for $feature or $version! What should I do?</h3>
+
+<p>In that case, it is recommended to add the new feature as an option to the existing language. For a good model on how to do this take look at the js/nodejs implementations, or the various options that already exist for Python. <code class="language-plaintext highlighter-rouge">thrift --help</code> gives a great start. Depending on the amount of changes necessary, you will still find the rest of the document useful.</p>
+
+<h2 id="general-workflow">General workflow</h2>
+
+<h3 id="preparation">Preparation</h3>
+
+<p>The good news is, although there is some work required, the process is not as hard as it looks. First, make sure you have a fully functional build environment and are able to <a href="/docs/BuildingFromSource">build the compiler from source</a>. Read the <a href="/docs/HowToContribute">How to Contribute</a> section to understand, how the general contribution process works.</p>
+
+<p>Next, search <a href="http://issues.apache.org/jira/browse/THRIFT">Jira</a> and maybe the mailing list archives. If you do not find anything similar, create a new ticket, shortly describing what you are planning. If you are not quite sure, ask on the <a href="/mailing">developer’s mailing list</a>.</p>
+
+<p>Now fork the <a href="https://thrift.apache.org/developers">Apache Thrift code base</a> on GitHub. Although we accept patch files, especially for comparingly long-living feature branches (such as adding a new language) a GitHub branch is much easier to handle.</p>
+
+<h3 id="implement-a-minimal-feature-set">Implement a minimal feature set</h3>
+
+<ul>
+  <li>
+    <p>Implement the <a href="https://github.com/apache/thrift/tree/master/compiler/cpp/src/generate">code generator</a>, typically by picking one from the existing pool that is close to what you need. There are already plenty of languages supported, and you’ll find oop, procedural and functional styles. If in doubt, which one to choose of the two or three candidates you found, head to the next point</p>
+  </li>
+  <li>
+    <p>Implement the Thrift library for that particular language, again by picking one of the <a href="https://github.com/apache/thrift/tree/master/lib">existing libraries</a> as a starting point. Because the libraries differ largely with regard to the “depth” of their implementations it is recommended to have a closer look on what is implemented, and what is not.</p>
+  </li>
+  <li>
+    <p>Implement the standardized <a href="https://github.com/apache/thrift/tree/master/test">Thrift cross platform test</a> and make sure all tests succeed when run against at least one other language. This ensures interoperability and makes sure that the code does not only work when talking with yourself (= same language). You may also add other tests, but these should be put into <code class="language-plaintext highlighter-rouge">lib/yourlang/test</code> rather than <code class="language-plaintext highlighter-rouge">test/yourlang</code> - the latter is intended to host solely the standardized cross platform test.</p>
+  </li>
+  <li>
+    <p>Implement the <a href="https://github.com/apache/thrift/tree/master/tutorial">Tutorial code</a> and test it against some other language. If you did everything well, this last step is comparingly easy.</p>
+  </li>
+</ul>
+
+<h3 id="the-minimal-feature-set">The minimal feature set</h3>
+
+<p>The minimum required feature set should cover at least:</p>
+
+<ul>
+  <li>Transports: Sockets, Buffered, Framed required, HTTP client recommended</li>
+  <li>Protocols: Binary and Multiplex required, JSON recommended</li>
+  <li>Server types: SimpleServer required</li>
+</ul>
+
+<h3 id="other-recommended-features">Other recommended features</h3>
+
+<p>These are not strictly required in the first run, but are commonly used. Depending on the language, some things may be easier to implement than others. Alternatively, consider adding the features listed below later as additional contributions instead of trying to press them into the initial contribution. <strong>If in doubt, focus on quality rather than quantity</strong>.</p>
+
+<ul>
+  <li>Transports: HTTP server, Pipes, NamedPipes (where it makes sense)</li>
+  <li>Protocols: Compact</li>
+  <li>Server types: Nonblocking, Threaded and/or Threadpool server implementation</li>
+</ul>
+
+<h3 id="final-things">Final things</h3>
+
+<ul>
+  <li>
+    <p>Add a <code class="language-plaintext highlighter-rouge">Readme.md</code> file to your library’s folder, describing requirements, dependencies and what else might be important. Look at the existing Readme files if you are unsure about what to put into that file.</p>
+  </li>
+  <li>
+    <p>Make sure the generator, library, tests and tutorial have proper <code class="language-plaintext highlighter-rouge">makefile.am</code> files. Include everything into the build/test scripts. If you need help with these steps, don’t hesitate to ask on the mailing lists.</p>
+  </li>
+  <li>
+    <p>You’re done, now open a pull request!</p>
+  </li>
+</ul>
+
+<h2 id="remarks">Remarks</h2>
+
+<p>Note that the 4 implementation steps are not really a linear process, it is more kind of an iteration. Even if the code that comes out of the generator finally is compileable and does not spit out any warnings and seems to run fine, you still will run into problems as you move on with implementing library and tests. This is fully normal and expected.</p>
+
+<p>It is a good idea to post your work early on the mailing lists, and to create the JIRA ticket early - that’s why this particular point is on top of the list. This serves not only the purpose of announcing the work you are about to do, it is also a good starting point for other people who might be just looking for exactly that stuff. You will be able not only to get valuable early feedback, but probably also be able to raise some support with implementation and/or testing. Having someone else looking over your code (or reviewing each other) is generally a good thing, especially with regard to the overall quality of the contribution you are about to do.</p>
+
+<p>Happy coding!</p>
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/Languages.html b/output/docs/Languages.html
new file mode 100644
index 0000000..a149389
--- /dev/null
+++ b/output/docs/Languages.html
@@ -0,0 +1,465 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Language and Feature Matrix</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <p><a href="https://github.com/apache/thrift/blob/master/LANGUAGES.md">This page on GitHub</a></p>
+
+<h1 id="apache-thrift-language-support">Apache Thrift Language Support</h1>
+
+<p>Guidance For: 0.13.0 | 
+<a href="https://github.com/apache/thrift/blob/v0.12.0/LANGUAGES.md">0.12.0</a> | 
+<a href="https://github.com/apache/thrift/blob/0.11.0/LANGUAGES.md">0.11.0</a></p>
+
+<p>Thrift supports many programming languages and has an impressive test suite that
+exercises most of the languages, protocols, and transports.  Each build exercises
+a matrix of thousands of possible combinations.  Each language typically has a
+minimum required version as well as support libraries - some mandatory and some
+optional.  The information provided below will help you assess whether you can
+use Apache Thrift with your project.  Obviously this is a complex matrix to
+maintain and may not be correct in all cases - if you spot an error please inform
+the developers using the mailing list, or better yet,
+<a href="https://github.com/apache/thrift/edit/master/LANGUAGES.md">Edit on GitHub</a>.</p>
+
+<p>Apache Thrift currently uses two build systems.  The <code>autoconf</code> build system is
+the most complete and builds all supported languages, however it does not support
+Windows..  The <code>cmake</code> build system works on Linux and Windows, and has been
+designated by the project to replace <code>autoconf</code> however this transition will
+take quite some time to complete.  During that transition, the cmake build will
+not support all languages.</p>
+
+<p>The Language/Library Levels indicate the minimum and maximum versions that are
+used in the <a href="build/docker/README.md">continuous integration environments</a>
+(Appveyor, Travis) for Apache Thrift.  Other language levels may be supported
+for each language, however tested less thoroughly; check the README file inside
+each lib directory for additional details.  Note: while a language may contain
+support for protocols, transports, and servers, the extent to which each is tested
+as part of the overall build process varies.  The definitive integration test for
+the project is called the &#8220;cross&#8221; test which executes a test matrix with clients
+and servers communicating across languages.</p>
+
+<p>Thrift&#8217;s core transport (supported by all languages) is TSocket.
+Thrift&#8217;s core protocol is TBinary, supported by all languages except for JavaScript.</p>
+
+<table style="font-size: 60%; padding: 1px;">
+<thead>
+<tr>
+<th rowspan="2">Language</th>
+<th rowspan="2" align="center">Since</th>
+<th colspan="2" align="center">Build Systems</th>
+<th colspan="2" align="center">Lang/Lib Levels (Tested)</th>
+<th colspan="6" align="center">Low-Level Transports</th>
+<th colspan="4" align="center">Transport Wrappers</th>
+<th colspan="4" align="center">Protocols</th>
+<th colspan="5" align="center">Servers</th>
+<th rowspan="2">Open Issues</th>
+</tr>
+<tr>
+<!-- Build Systems ---------><th>autoconf</th><th>cmake</th>
+<!-- Lang/Lib Levels -------><th>Min</th><th>Max</th>
+<!-- Low-Level Transports --><th><a href="https://en.wikipedia.org/wiki/Unix_domain_socket">Domain</a></th><th>&nbsp;File&nbsp;</th><th>Memory</th><th>&nbsp;Pipe&nbsp;</th><th>Socket</th><th>&nbsp;TLS&nbsp;</th>
+<!-- Transport Wrappers ----><th>Framed</th><th>Header</th><th>&nbsp;http&nbsp;</th><th>&nbsp;zlib&nbsp;</th>
+<!-- Protocols -------------><th><a href="doc/specs/thrift-binary-protocol.md">Binary</a></th><th><a href="doc/specs/thrift-compact-protocol.md">Compact</a></th><th>&nbsp;JSON&nbsp;</th><th>Multiplex</th>
+<!-- Servers ---------------><th>Forking</th><th>Nonblocking</th><th>Simple</th><th>Threaded</th><th>ThreadPool</th>
+</tr>
+</thead>
+<tbody>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/as3/README.md">ActionScript</a></td>
+<!-- Since -----------------><td>0.3.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Language Levels -------><td colspan="2">FLEX SDK 4.6</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22AS3%20-%20Compiler%22%2C%20%22AS3%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">ActionScript</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/c_glib/README.md">C (glib)</a></td>
+<!-- Since -----------------><td>0.6.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Language Levels -------><td>2.48.2</td><td>2.56.4</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22C%20glib%20-%20Compiler%22%2C%20%22C%20glib%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">C (glib)</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/cpp/README.md">C++</a></td>
+<!-- Since -----------------><td>0.2.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Language Levels -------><td colspan="2">C++11</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22C%2B%2B%20-%20Compiler%22%2C%20%22C%2B%2B%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">C++</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/cl/README.md">Common LISP</a></td>
+<!-- Since -----------------><td>0.12.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>SBCL 1.4.x</td><td>SBCL 1.5.3</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Common%20LISP%20-%20Compiler%22%2C%20%22Common%20LISP%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Common LISP</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/d/README.md">Dlang</a></td>
+<!-- Since -----------------><td>0.9.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>2.075.1</td><td>2.087.0</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22D%20-%20Compiler%22%2C%20%22D%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">D</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/dart/README.md">Dart</a></td>
+<!-- Since -----------------><td>0.10.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>2.0.0</td><td>2.4.0</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Dart%20-%20Compiler%22%2C%20%22Dart%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Dart</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/delphi/README.md">Delphi</a></td>
+<!-- Since -----------------><td>0.8.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>2010</td><td>unknown</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Delphi%20-%20Compiler%22%2C%20%22Delphi%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Delphi</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/netstd/README.md">.NET Standard</a></td>
+<!-- Since -----------------><td>0.13.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td colspan="2">.NET 4.5+, .NET Standard 2.x</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22netstd%20-%20Compiler%22%2C%20%22netstd%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">.NET Standard</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/erl/README.md">Erlang</a></td>
+<!-- Since -----------------><td>0.3.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>18.3</td><td>22.0</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Erlang%20-%20Compiler%22%2C%20%22Erlang%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Erlang</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/go/README.md">Go</a></td>
+<!-- Since -----------------><td>0.7.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>1.10.8</td><td>1.13.1</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Go%20-%20Compiler%22%2C%20%22Go%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Go</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/hs/README.md">Haskell</a></td>
+<!-- Since -----------------><td>0.5.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Language Levels -------><td>7.10.3</td><td>8.0.2</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Haskell%20-%20Compiler%22%2C%20%22Haskell%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Haskell</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/haxe/README.md">Haxe</a></td>
+<!-- Since -----------------><td>0.9.3</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>3.2.1</td><td>3.4.4</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Haxe%20-%20Compiler%22%2C%20%22Haxe%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Haxe</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/java/README.md">Java (SE)</a></td>
+<!-- Since -----------------><td>0.2.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Language Levels -------><td>1.8.0_151</td><td>11.0.3</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Java%20-%20Compiler%22%2C%20%22Java%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Java SE</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/javame/README.md">Java (ME)</a></td>
+<!-- Since -----------------><td>0.5.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td colspan="2">unknown</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22JavaME%20-%20Compiler%22%2C%20%22JavaME%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Java ME</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/js/README.md">Javascript</a></td>
+<!-- Since -----------------><td>0.3.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>ES5</td><td>ES6</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Javascript%20-%20Compiler%22%2C%20%22Javascript%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Javascript</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/lua/README.md">Lua</a></td>
+<!-- Since -----------------><td>0.9.2</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>5.1.5</td><td>5.2.4</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Lua%20-%20Compiler%22%2C%20%22Lua%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Lua</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/nodejs/README.md">node.js</a></td>
+<!-- Since -----------------><td>0.6.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>10.x</td><td>10.x</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Node.js%20-%20Compiler%22%2C%20%22Node.js%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">node.js</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/nodets/README.md">node.ts</a></td>
+<!-- Since -----------------><td>0.12.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>3.1.6</td><td></td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22TypeScript%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">node.ts</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/ocaml/README.md">OCaml</a></td>
+<!-- Since -----------------><td>0.2.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td colspan="2">4.04.0</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22OCaml%20-%20Compiler%22%2C%20%22OCaml%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">OCaml</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/perl/README.md">Perl</a></td>
+<!-- Since -----------------><td>0.2.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>5.22.1</td><td>5.26.1</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Perl%20-%20Compiler%22%2C%20%22Perl%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Perl</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/php/README.md">PHP</a></td>
+<!-- Since -----------------><td>0.2.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>7.0.22</td><td>7.2.19</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22PHP%20-%20Compiler%22%2C%20%22PHP%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">PHP</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/py/README.md">Python</a></td>
+<!-- Since -----------------><td>0.2.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Language Levels -------><td>2.7.12, 3.5.2</td><td>2.7.15, 3.6.8</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Python%20-%20Compiler%22%2C%20%22Python%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Python</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/rb/README.md">Ruby</a></td>
+<!-- Since -----------------><td>0.2.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>2.3.1p112</td><td>2.5.1p57</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Ruby%20-%20Compiler%22%2C%20%22Ruby%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Ruby</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/rs/README.md">Rust</a></td>
+<!-- Since -----------------><td>0.11.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td>1.35.0</td><td>1.35.0</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Rust%20-%20Compiler%22%2C%20%22Rust%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Rust</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/st/README.md">Smalltalk</a></td>
+<!-- Since -----------------><td>0.2.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td colspan="2">unknown</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Smalltalk%20-%20Compiler%22%2C%20%22Smalltalk%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Smalltalk</a></td>
+</tr>
+<tr align="center">
+<td align="left"><a href="https://github.com/apache/thrift/blob/master/lib/swift/README.md">Swift</a></td>
+<!-- Since -----------------><td>0.12.0</td>
+<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Language Levels -------><td colspan="2">4.2.1</td>
+<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td>
+<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<!-- Servers ---------------><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cred.png" alt="" /></td><td><img src="doc/images/cgrn.png" alt="Yes" /></td>
+<td align="left"><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Swift%20-%20Compiler%22%2C%20%22Swift%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Swift</a></td>
+</tr>
+</tbody>
+<tfoot>
+<tr>
+<th rowspan="2">Language</th>
+<th rowspan="2" align="center">Since</th>
+<!-- Build Systems ---------><th>autoconf</th><th>cmake</th>
+<!-- Lang/Lib Levels -------><th>Min</th><th>Max</th>
+<!-- Low-Level Transports --><th><a href="https://en.wikipedia.org/wiki/Unix_domain_socket">Domain</a></th>&lt;/th&gt;<th>&nbsp;File&nbsp;</th><th>Memory</th><th>&nbsp;Pipe&nbsp;</th><th>Socket</th><th>&nbsp;TLS&nbsp;</th>
+<!-- Transport Wrappers ----><th>Framed</th><th>Header</th><th>&nbsp;http&nbsp;</th><th>&nbsp;zlib&nbsp;</th>
+<!-- Protocols -------------><th><a href="doc/specs/thrift-binary-protocol.md">Binary</a></th><th><a href="doc/specs/thrift-compact-protocol.md">Compact</a></th><th>&nbsp;JSON&nbsp;</th><th>Multiplex</th>
+<!-- Servers ---------------><th>Forking</th><th>Nonblocking</th><th>Simple</th><th>Threaded</th><th>ThreadPool</th>
+<th rowspan="2">Open Issues</th>
+</tr>
+<tr>
+<th colspan="2" align="center">Build Systems</th>
+<th colspan="2" align="center">Lang/Lib Levels (Tested)</th>
+<th colspan="6" align="center">Low-Level Transports</th>
+<th colspan="4" align="center">Transport Wrappers</th>
+<th colspan="4" align="center">Protocols</th>
+<th colspan="5" align="center">Servers</th>
+</tr>
+</tfoot>
+&lt;/ft
+table&gt;
+</table>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=LANGUAGES.md">LANGUAGES.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/coding_standards.html b/output/docs/coding_standards.html
new file mode 100644
index 0000000..105543a
--- /dev/null
+++ b/output/docs/coding_standards.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Coding standards</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="thrift-coding-standards">Thrift Coding Standards</h1>
+
+<p>Any fool can write code that a computer can understand.
+   Good programmers write code that humans can understand.
+                                  &#8211; Martin Fowler, 1999</p>
+
+<p>The purpose of this document is to make everyone&#8217;s life easier.</p>
+
+<p>It&#8217;s easier when you read good, well formatted, with clearly defined purpose, code.
+But the only way to read clean code is to write such.</p>
+
+<p>This document can help achieve that, but keep in mind that
+those are not silver-bullet, fix-all-at-once rules. Just think about readability while writing code.
+Write code like you would have to read it in ten years from now.</p>
+
+<h2 id="general-coding-standards">General Coding Standards</h2>
+
+<p>Thrift has some history. Not all existing code follows those rules.
+But we want to improve over time.
+When making small change / bugfix - like single line fix - do <em>not</em> refactor whole function.
+That disturbs code repository history.
+Whenever adding something new and / or making bigger refactoring
+ - follow those rules as strictly as you can.</p>
+
+<p>When in doubt - contact other developers (using dev@ mailing list or IRC).
+Code review is the best way to improve readability.</p>
+
+<h3 id="basics">Basics</h3>
+<ul>
+  <li>Use spaces not tabs</li>
+  <li>Use only ASCII characters in file and directory names</li>
+  <li>Commit to repository using Unix-style line endings (LF)
+  On Windows:
+    git config core.autocrlf true</li>
+  <li>Maximum line width - 100 characters</li>
+  <li>If not specified otherwise in language specific standard - use 2 spaces as indent/tab</li>
+</ul>
+
+<h3 id="comments">Comments</h3>
+<ul>
+  <li>Each file has to start with comment containing <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License</a></li>
+  <li>Public API of library should be documented, preferably using format native for language specific documentation generation tools (Javadoc, Doxygen etc.)</li>
+  <li>Other comments are discouraged - comments are lies. When one has to make comment it means one failed to write readable code. Instead of &#8220;I should write a comment here&#8221; think &#8220;I should clean it up&#8221;</li>
+  <li>Do not leave &#8220;TODO/FIXME&#8221; comments - file <a href="http://issues.apache.org/jira/browse/THRIFT">Jira</a> issue instead</li>
+</ul>
+
+<h3 id="naming">Naming</h3>
+<p>Finding proper names is the most important and most difficult task in software development.</p>
+
+<h2 id="language-specific-coding-standards">Language Specific Coding Standards</h2>
+
+<p>For detailed information see <code>lib/LANG/coding_standards.md</code></p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=doc/coding_standards.md">doc/coding_standards.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/committers/AdditionalReading.html b/output/docs/committers/AdditionalReading.html
new file mode 100644
index 0000000..8178c00
--- /dev/null
+++ b/output/docs/committers/AdditionalReading.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - General articles and links for committers</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="useful-articles-for-committers">Useful articles for committers</h2>
+<ul>
+  <li><a href="http://www.apache.org/dev/release.html">ASF Releases FAQ</a></li>
+  <li><a href="http://www.apache.org/dev/release-signing.html">Signing Releases</a></li>
+  <li><a href="http://www.apache.org/dev/publishing-maven-artifacts.html">Publishing Maven Artifacts</a></li>
+</ul>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/committers/HowToCommit.html b/output/docs/committers/HowToCommit.html
new file mode 100644
index 0000000..b55efa3
--- /dev/null
+++ b/output/docs/committers/HowToCommit.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - How To Commit</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="process-used-by-committers-to-review-and-submit-patches">Process used by committers to review and submit patches</h2>
+
+<ol>
+  <li>
+    <p>Make sure that there is an issue for the patch(s) you are about to commit in our <a href="http://issues.apache.org/jira/browse/THRIFT">Jira issue tracker</a></p>
+  </li>
+  <li>
+    <p>Check out the latest version of the source code</p>
+  </li>
+</ol>
+
+<ul>
+  <li>git clone https://github.com/apache/thrift.git thrift</li>
+</ul>
+
+<ol>
+  <li>Apply the patch</li>
+</ol>
+
+<ul>
+  <li>
+    <table>
+      <tbody>
+        <tr>
+          <td>curl https://issues.apache.org/jira/&#8230;</td>
+          <td>git apply &#8211;ignore-space-change</td>
+        </tr>
+      </tbody>
+    </table>
+  </li>
+</ul>
+
+<p>or</p>
+
+<ul>
+  <li>curl https://github.com/<GitHub User="">/thrift/commit/<Commit ID="">.patch |git apply --ignore-space-change</Commit></GitHub></li>
+</ul>
+
+<ol>
+  <li>
+    <p>Inspect the applied patch to ensure that all <a href="http://www.apache.org/licenses/LICENSE-2.0.html#contributions">Legal aspects on Submission of Contributions (Patches)</a> are met</p>
+  </li>
+  <li>
+    <p>Run the necessary unit tests and cross language test cases to verify the patch</p>
+  </li>
+  <li>
+    <p>Commit the patch</p>
+
+    <pre><code> git --config user.name "Your Name"
+ git --config user.email "YourApacheID@apache.org"
+ git add -A
+ git commit
+</code></pre>
+  </li>
+  <li>
+    <p>The commit message should be in the format:</p>
+
+    <pre><code>THRIFT-####:&lt;Jira description&gt;
+Client: &lt;component&gt;
+Patch: &lt;Name of person contributing the patch&gt;
+
+Description of what was fixed or addressed.
+
+If this is a github pull request then add below comment to automaticaly close GitHub request, 
+where #NNNN is the PR number:
+   
+ This closes #NNNN
+</code></pre>
+  </li>
+  <li>
+    <p>Double check the patch committed and that nothing was missed then push the patch</p>
+
+    <pre><code>git status
+git show HEAD
+git push origin master
+</code></pre>
+  </li>
+  <li>
+    <p>Resolve the jira issue and set the following for the changelog</p>
+  </li>
+</ol>
+
+<ul>
+  <li>Component the patch is for</li>
+  <li>fixVersion to the current version on master</li>
+</ul>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=doc/committers.md">doc/committers.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/committers/HowToThriftWebsite.html b/output/docs/committers/HowToThriftWebsite.html
new file mode 100644
index 0000000..f77ce3a
--- /dev/null
+++ b/output/docs/committers/HowToThriftWebsite.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - How to update the website</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="apache-thrift-website">Apache Thrift Website</h2>
+<p>The thrift website is made up of markdown files with YAML headers and templates,
+and uses the <a href="http://www.apache.org/dev/cms">Apache CMS</a>.</p>
+
+<h3 id="website-development">Website Development</h3>
+
+<p>Publishing the staging site is doable through the <a href="https://cms.apache.org/thrift/">CMS webgui</a>
+or via shell command:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>:::shell
+% ssh -t people.apache.org publish.pl thrift
+</code></pre></div></div>
+
+<p>Casual changes to the site are best handled through the <a href="https://cms.apache.org/thrift/#bookmark">javascript
+bookmarklet</a>.  The workflow is to browse the live site
+looking for pages in need of repair, then by clicking on the bookmarklet you will be redirected
+to an editor for the page in question that can ultimately commit your changes back to the site
+and walk you through the publication process through the webgui.</p>
+
+<p>More complex changes can be accomplished by checking out the <a href="https://svn.apache.org/repos/asf/thrift/cms-site">svn
+tree</a> directly.  Commits to that tree will
+trigger builds of the staging site just as if you had committed them by using the CMS webgui.
+If you are still pining for a nanoc-like feature to preview your changes before committing them
+by having a daemon ‘watch’ your filesystem for edits, you really need to wrap your brain around
+the CMS’s ** commit early and commit often ** mantra.  In fact source control systems are far
+more effective at communicating changesets than operating systems are (most of the time), and
+the CMS’s build system is changeset-aware based on the data it receives from svn.  So think of
+committing to the CMS’s svn tree for thrift as just a formal way of notifying the CMS of your
+changes so it can automatically (and efficiently) build them to the staging site, just as if
+you were working locally with a daemon that watches your filesystem for modifications and
+builds them.</p>
+
+<p>Remember most of all that markdown is aimed first at foremost at human readers, so try to
+ensure your source content is easily understood by</p>
+
+<ul>
+  <li>Keeping headings separated from other content with surrounding blank lines,</li>
+  <li>Avoiding long lines of text, wrapping at 80-100 characters on average,</li>
+  <li>Keeping embedded HTML (which includes code snippets) blocks separated from markdown content
+by blank lines,</li>
+  <li>Preferring four-space indents per level over tab characters.</li>
+</ul>
+
+<p>Not only will your readers prefer a clean style, it will result in fewer bugs and a more
+consistent experience with the various markdown parsers deployed by the CMS.</p>
+
+<h3 id="updating-release-versions">Updating Release Versions</h3>
+
+<p>The current release versioning is kept in the YAML <strong>DATA</strong> section of the global “configuration
+file” <a href="https://svn.apache.org/repos/asf/thrift/cms-site/trunk/lib/path.pm">lib/path.pm</a>. Update
+the following values and then following <b>Updating the Website</b> section below</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>current_release: "0.13.0"
+current_release_date: "2019-OCT-16"
+</code></pre></div></div>
+
+<h3 id="updating-the-website">Updating the website</h3>
+
+<p>After you have updated any content or added new markdown files you will need to commit them to
+svn to trigger a <a href="http://ci.apache.org/builders/thrift-site-staging">CMS build</a> of your changes.
+After a few seconds have passed your build will be ready for viewing on the <a href="http://thrift.staging.apache.org/">staging
+site</a>.  See the previous discussion for the various
+approaches to publishing your changes to the live site after you have verified they are
+rendering correctly on the staging site.</p>
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/committers/ReleaseManagement.html b/output/docs/committers/ReleaseManagement.html
new file mode 100644
index 0000000..a01cdad
--- /dev/null
+++ b/output/docs/committers/ReleaseManagement.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Release Management</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <p><a href="https://github.com/apache/thrift/blob/master/doc/ReleaseManagement.md">See it on GitHub</a></p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/committers/index.html b/output/docs/committers/index.html
new file mode 100644
index 0000000..9731fd0
--- /dev/null
+++ b/output/docs/committers/index.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Index of committers/</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/concepts.html b/output/docs/concepts.html
new file mode 100644
index 0000000..2355619
--- /dev/null
+++ b/output/docs/concepts.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Concepts</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="thrift-network-stack">Thrift network stack</h2>
+<p>Simple representation of the Apache Thrift networking stack</p>
+<pre><code>
+  +-------------------------------------------+
+  | Server                                    |
+  | (single-threaded, event-driven etc)       |
+  +-------------------------------------------+
+  | Processor                                 |
+  | (compiler generated)                      |
+  +-------------------------------------------+
+  | Protocol                                  |
+  | (JSON, compact etc)                       |
+  +-------------------------------------------+
+  | Transport                                 |
+  | (raw TCP, HTTP etc)                       |
+  +-------------------------------------------+
+</code></pre>
+
+<h2 id="transport">Transport</h2>
+<p>The Transport layer provides a simple abstraction for reading/writing from/to the network. This enables Thrift to decouple the underlying transport from the rest of the system (serialization/deserialization, for instance).</p>
+
+<p>Here are some of the methods exposed by the <strong>Transport</strong> interface:</p>
+
+<ul>
+  <li>open</li>
+  <li>close</li>
+  <li>read</li>
+  <li>write</li>
+  <li>flush</li>
+</ul>
+
+<p>In addition to the <strong>Transport</strong> interface above, Thrift also uses a <strong>ServerTransport</strong> interface used to accept or create primitive transport objects. As the name suggest, <strong>ServerTransport</strong> is used mainly on the server side to create new  Transport objects for incoming connections.</p>
+
+<ul>
+  <li>open</li>
+  <li>listen</li>
+  <li>accept</li>
+  <li>close</li>
+</ul>
+
+<p>Here are some of the transports available for majority of the Thrift-supported languages:</p>
+
+<ul>
+  <li>file: read/write to/from a file on disk</li>
+  <li>http: as the name suggests</li>
+</ul>
+
+<h2 id="protocol">Protocol</h2>
+
+<p>The Protocol abstraction defines a mechanism to map in-memory data structures to a wire-format. In other words, a protocol specifies how datatypes use the
+underlying Transport to encode/decode themselves.  Thus the protocol implementation governs the encoding scheme and is responsible for (de)serialization. Some examples of protocols in this sense include JSON, XML, plain text, compact binary etc.</p>
+
+<p>Here is the <strong>Protocol</strong> interface:</p>
+
+<pre><code class="language-cpp">
+writeMessageBegin(name, type, seq)
+writeMessageEnd()
+writeStructBegin(name)
+writeStructEnd()
+writeFieldBegin(name, type, id)
+writeFieldEnd()
+writeFieldStop()
+writeMapBegin(ktype, vtype, size)
+writeMapEnd()
+writeListBegin(etype, size)
+writeListEnd()
+writeSetBegin(etype, size)
+writeSetEnd()
+writeBool(bool)
+writeByte(byte)
+writeI16(i16)
+writeI32(i32)
+writeI64(i64)
+writeDouble(double)
+writeString(string)
+
+name, type, seq = readMessageBegin()
+                  readMessageEnd()
+name = readStructBegin()
+       readStructEnd()
+name, type, id = readFieldBegin()
+                 readFieldEnd()
+k, v, size = readMapBegin()
+             readMapEnd()
+etype, size = readListBegin()
+              readListEnd()
+etype, size = readSetBegin()
+              readSetEnd()
+bool = readBool()
+byte = readByte()
+i16 = readI16()
+i32 = readI32()
+i64 = readI64()
+double = readDouble()
+string = readString()
+</code></pre>
+
+<p>Thrift Protocols are stream oriented by design. There is no need for any explicit framing. For instance, it is not necessary to know the length of a
+string or the number of items in a list before we start serializing them. Some of the protocols available for majority of the Thrift-supported
+languages are:</p>
+
+<ul>
+  <li>binary: Fairly simple binary encoding – the length and type of a field are encoded as bytes followed by the actual value of the field.</li>
+  <li>compact: Described in <a href="https://issues.apache.org/jira/browse/THRIFT-110">THRIFT-110</a></li>
+  <li>json</li>
+</ul>
+
+<h2 id="processor">Processor</h2>
+<p>A Processor encapsulates the ability to read data from input streams and write to output streams. The input and output streams are represented by Protocol
+objects. The Processor interface is extremely simple</p>
+
+<pre><code class="language-java">
+interface TProcessor {
+    bool process(TProtocol in, TProtocol out) throws TException
+}
+</code></pre>
+
+<p>Service-specific processor implementations are generated by the compiler. The Processor essentially reads data from the wire (using the input protocol),
+delegates processing to the handler (implemented by the user) and writes the response over the wire (using the output protocol).</p>
+
+<h2 id="server">Server</h2>
+<p>A Server pulls together all of the various features described above:</p>
+
+<ul>
+  <li>Create a transport</li>
+  <li>Create input/output protocols for the transport</li>
+  <li>Create a processor based on the input/output protocols</li>
+  <li>Wait for incoming connections and hand them off to the processor</li>
+</ul>
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/features.html b/output/docs/features.html
new file mode 100644
index 0000000..f84b71d
--- /dev/null
+++ b/output/docs/features.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Features</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="apache-thrift-features">Apache Thrift Features</h2>
+
+<ul>
+  <li>interface description language - Everything is specified in an IDL file from which bindings for many languages can be generated. See <a href="/docs/idl">Thrift IDL</a></li>
+  <li>language bindings - Thrift is supported in many languages and environments
+    <ul>
+      <li>C++</li>
+      <li>C#</li>
+      <li>Cocoa</li>
+      <li>D</li>
+      <li>Delphi</li>
+      <li>Erlang</li>
+      <li>Haskell</li>
+      <li>Java</li>
+      <li>OCaml</li>
+      <li>Perl</li>
+      <li>PHP</li>
+      <li>Python</li>
+      <li>Ruby</li>
+      <li>Smalltalk</li>
+    </ul>
+  </li>
+  <li>namespaces - Each Thrift file is in its own namespace allowing you to use the same identifier in multiple Thrift files</li>
+  <li>language namespaces - Per Thrift file you can specify which namespace should be used for each programming language</li>
+  <li>base types - Thrift has a small set of base types. See <a href="/docs/types">Thrift Types</a></li>
+  <li>constants and enumerations - Constant values can be assigned logical names</li>
+  <li>structs - Use structs to group related data. Structs can have fields of any type. See <a href="/docs/types">Thrift Types</a></li>
+  <li>sparse structs - Optional base fields that have not been set and reference fields that are null will not be sent across the wire</li>
+  <li>struct evolution - The addition and removal of fields is handled without breaking existing clients by using integer identifiers for fields</li>
+  <li>containers - You can use sets, lists and maps of any type: base types, structs and other containers. See <a href="/docs/types">Thrift Types</a></li>
+  <li>type definitions - Any type can be given a name that better describes it</li>
+  <li>services - A service is a group of functions</li>
+  <li>service inheritance - Subservices implement all functions of their base services and can have additional functions</li>
+  <li>asynchronous invocations - Functions that do not return a result can be invoked asynchronously so the client is not blocked until the server has finished processing the request. The server may execute asynchronous invocations of the same client in parallel/out of order</li>
+  <li>exceptions - If an error occurs a function can throw a standard or user-defined exception. See <a href="/docs/types">Thrift Types</a></li>
+  <li>cyclic structs - Starting with version 0.9.2, Thrift supports structs that contain themselves, or other structs to be declared later.</li>
+</ul>
+
+<h2 id="non-features">Non-features</h2>
+<p>The following are not supported by Apache Thrift:</p>
+
+<ul>
+  <li>struct inheritance - Use struct composition instead</li>
+  <li>polymorphism - As there is no inheritance, polymorphism is also not supported</li>
+  <li>overloading - All methods within a service must be uniquely named</li>
+  <li>heterogeneous containers - All items in a container must be of the same type</li>
+  <li>Null return - null cannot be returned directly from a function. Use a wrapper struct or a marker value instead</li>
+</ul>
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/idl.html b/output/docs/idl.html
new file mode 100644
index 0000000..548c1c3
--- /dev/null
+++ b/output/docs/idl.html
@@ -0,0 +1,371 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Interface Description Language (IDL)</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="thrift-interface-description-language">Thrift interface description language</h2>
+
+<p>For Thrift version 0.14.0.</p>
+
+<p>The Thrift interface definition language (IDL) allows for the definition of <a href="/docs/types">Thrift Types</a>. A Thrift IDL file is processed by the Thrift code generator to produce code for the various target languages to support the defined structs and services in the IDL file.</p>
+
+<h2 id="description">Description</h2>
+
+<p>Here is a description of the Thrift IDL.</p>
+
+<h2 id="document">Document</h2>
+
+<p>Every Thrift document contains 0 or more headers followed by 0 or more definitions.</p>
+
+<pre><code>[1]  Document        ::=  Header* Definition*
+</code></pre>
+
+<h2 id="header">Header</h2>
+
+<p>A header is either a Thrift include, a C++ include, or a namespace declaration.</p>
+
+<pre><code>[2]  Header          ::=  Include | CppInclude | Namespace
+</code></pre>
+
+<h3 id="thrift-include">Thrift Include</h3>
+
+<p>An include makes all the symbols from another file visible (with a prefix) and adds corresponding include statements into the code generated for this Thrift document.</p>
+
+<pre><code>[3]  Include         ::=  'include' Literal
+</code></pre>
+
+<h3 id="c-include">C++ Include</h3>
+
+<p>A C++ include adds a custom C++ include to the output of the C++ code generator for this Thrift document.</p>
+
+<pre><code>[4]  CppInclude      ::=  'cpp_include' Literal
+</code></pre>
+
+<h3 id="namespace">Namespace</h3>
+
+<p>A namespace declares which namespaces/package/module/etc. the type definitions in this file will be declared in for the target languages. The namespace scope indicates which language the namespace applies to; a scope of &#8216;*&#8217; indicates that the namespace applies to all target languages.</p>
+
+<pre><code>[5]  Namespace       ::=  ( 'namespace' ( NamespaceScope Identifier ) )
+
+[6]  NamespaceScope  ::=  '*' | 'c_glib' | 'cpp' | 'delphi' | 'haxe' | 'go' | 'java' | 'js' | 'lua' | 'netstd' | 'perl' | 'php' | 'py' | 'py.twisted' | 'rb' | 'st' | 'xsd'
+</code></pre>
+
+<h2 id="definition">Definition</h2>
+
+<pre><code>[7]  Definition      ::=  Const | Typedef | Enum | Senum | Struct | Union | Exception | Service
+</code></pre>
+
+<h3 id="const">Const</h3>
+
+<pre><code>[8]  Const           ::=  'const' FieldType Identifier '=' ConstValue ListSeparator?
+</code></pre>
+
+<h3 id="typedef">Typedef</h3>
+
+<p>A typedef creates an alternate name for a type.</p>
+
+<pre><code>[9]  Typedef         ::=  'typedef' DefinitionType Identifier
+</code></pre>
+
+<h3 id="enum">Enum</h3>
+
+<p>An enum creates an enumerated type, with named values. If no constant value is supplied, the value is either 0 for the first element, or one greater than the preceding value for any subsequent element. Any constant value that is supplied must be non-negative.</p>
+
+<pre><code>[10] Enum            ::=  'enum' Identifier '{' (Identifier ('=' IntConstant)? ListSeparator?)* '}'
+</code></pre>
+
+<h3 id="senum">Senum</h3>
+
+<p>Senum (and Slist) are now deprecated and should both be replaced with String.</p>
+
+<pre><code>[11] Senum           ::=  'senum' Identifier '{' (Literal ListSeparator?)* '}'
+</code></pre>
+
+<h3 id="struct">Struct</h3>
+
+<p>Structs are the fundamental compositional type in Thrift. The name of each field must be unique within the struct.</p>
+
+<pre><code>[12] Struct          ::=  'struct' Identifier 'xsd_all'? '{' Field* '}'
+</code></pre>
+
+<p>N.B.: The <code>xsd_all</code> keyword has some purpose internal to Facebook but serves no purpose in Thrift itself. Use of this feature is strongly discouraged</p>
+
+<h3 id="union">Union</h3>
+
+<p>Unions are similar to structs, except that they provide a means to transport exactly one field of a possible set of fields, just like union {} in C++. Consequently, union members are implicitly considered optional (see requiredness).</p>
+
+<pre><code>[13] Union          ::=  'union' Identifier 'xsd_all'? '{' Field* '}'
+</code></pre>
+
+<p>N.B.: The <code>xsd_all</code> keyword has some purpose internal to Facebook but serves no purpose in Thrift itself. Use of this feature is strongly discouraged</p>
+
+<h3 id="exception">Exception</h3>
+
+<p>Exceptions are similar to structs except that they are intended to integrate with the native exception handling mechanisms in the target languages. The name of each field must be unique within the exception.</p>
+
+<pre><code>[14] Exception       ::=  'exception' Identifier '{' Field* '}'
+</code></pre>
+
+<h3 id="service">Service</h3>
+
+<p>A service provides the interface for a set of functionality provided by a Thrift server. The interface is simply a list of functions. A service can extend another service, which simply means that it provides the functions of the extended service in addition to its own.</p>
+
+<pre><code>[15] Service         ::=  'service' Identifier ( 'extends' Identifier )? '{' Function* '}'
+</code></pre>
+
+<h2 id="field">Field</h2>
+
+<pre><code>[16] Field           ::=  FieldID? FieldReq? FieldType Identifier ('=' ConstValue)? XsdFieldOptions ListSeparator?
+</code></pre>
+
+<h3 id="field-id">Field ID</h3>
+
+<pre><code>[17] FieldID         ::=  IntConstant ':'
+</code></pre>
+
+<h3 id="field-requiredness">Field Requiredness</h3>
+
+<p>There are two explicit requiredness values, and a third one that is applied implicity if neither  <em>required</em> nor <em>optional</em> are given: <em>default</em> requiredness.</p>
+
+<pre><code>[18] FieldReq        ::=  'required' | 'optional' 
+</code></pre>
+
+<p>The general rules for requiredness are as follows:</p>
+
+<h4 id="required">required</h4>
+
+<ul>
+  <li>Write: Required fields are always written and are expected to be set.</li>
+  <li>Read: Required fields are always read and are expected to be contained in the input stream.</li>
+  <li>Defaults values: are always written</li>
+</ul>
+
+<p>If a required field is missing during read, the expected behaviour is to indicate an unsuccessful read operation to the caller, e.g. by throwing an exception or returning an error.</p>
+
+<p>Because of this behaviour, required fields drastically limit the options with regard to soft versioning. Because they must be present on read, the fields cannot be deprecated. If a required field would be removed (or changed to optional), the data are no longer compatible between versions.</p>
+
+<h4 id="optional">optional</h4>
+
+<ul>
+  <li>Write: Optional fields are only written when they are set</li>
+  <li>Read: Optional fields may, or may not be part of the input stream.</li>
+  <li>Default values: are written when the isset flag is set</li>
+</ul>
+
+<p>Most language implementations use the recommended practice of so-called &#8220;isset&#8221; flags to indicate whether a particular optional field is set or not. Only fields with this flag set are written, and conversely the flag is only set when a field value has been read from the input stream.</p>
+
+<h4 id="default-requiredness-implicit">default requiredness (implicit)</h4>
+
+<ul>
+  <li>Write: In theory, the fields are always written. There are some exceptions to that rule, see below.</li>
+  <li>Read: Like optional, the field may, or may not be part of the input stream.</li>
+  <li>Default values: may not be written (see next section)</li>
+</ul>
+
+<p>Default requiredness is a good starting point. The desired behaviour is a mix of optional and required, hence the internal name &#8220;opt-in, req-out&#8221;. Although in theory these fields are supposed to be written (&#8220;req-out&#8221;), in reality unset fields are not always written. This is especially the case, when the field contains a <null> value, which by definition cannot be transported through thrift. The only way to achieve this is by not writing that field at all, and that's what most languages do.</null></p>
+
+<h4 id="semantics-of-default-values">Semantics of Default Values</h4>
+
+<p>There are ongoing discussions about that topic, see JIRA for details. Not all implementations treat default values in the very same way, but the current status quo is more or less that default fields are typically set at initialization time. Therefore, a value that equals the default may not be written, because the read end will set the value implicitly. On the other hand, an implementation is free to write the default value anyways, as there is no hard restriction that prevents this.</p>
+
+<p>The major point to keep in mind here is the fact, that any unwritten default value implicitly becomes part of the interface version. If that default is changed, the interface changes. If, in contrast, the default value is written into the output data, the default in the IDL can change at any time without affecting serialized data.</p>
+
+<h3 id="xsd-options">XSD Options</h3>
+
+<p>N.B.: These have  some internal purpose at Facebook but serve no current purpose in Thrift. Use of these options is strongly discouraged.</p>
+
+<pre><code>[19] XsdFieldOptions ::=  'xsd_optional'? 'xsd_nillable'? XsdAttrs?
+
+[20] XsdAttrs        ::=  'xsd_attrs' '{' Field* '}'
+</code></pre>
+
+<h2 id="functions">Functions</h2>
+
+<pre><code>[21] Function        ::=  'oneway'? FunctionType Identifier '(' Field* ')' Throws? ListSeparator?
+
+[22] FunctionType    ::=  FieldType | 'void'
+
+[23] Throws          ::=  'throws' '(' Field* ')'
+</code></pre>
+
+<h2 id="types">Types</h2>
+
+<pre><code>[24] FieldType       ::=  Identifier | BaseType | ContainerType
+
+[25] DefinitionType  ::=  BaseType | ContainerType
+
+[26] BaseType        ::=  'bool' | 'byte' | 'i8' | 'i16' | 'i32' | 'i64' | 'double' | 'string' | 'binary' | 'slist'
+
+[27] ContainerType   ::=  MapType | SetType | ListType
+
+[28] MapType         ::=  'map' CppType? '&lt;' FieldType ',' FieldType '&gt;'
+
+[29] SetType         ::=  'set' CppType? '&lt;' FieldType '&gt;'
+
+[30] ListType        ::=  'list' '&lt;' FieldType '&gt;' CppType?
+
+[31] CppType         ::=  'cpp_type' Literal
+</code></pre>
+
+<h2 id="constant-values">Constant Values</h2>
+
+<pre><code>[32] ConstValue      ::=  IntConstant | DoubleConstant | Literal | Identifier | ConstList | ConstMap
+
+[33] IntConstant     ::=  ('+' | '-')? Digit+
+
+[34] DoubleConstant  ::=  ('+' | '-')? Digit* ('.' Digit+)? ( ('E' | 'e') IntConstant )?
+
+[35] ConstList       ::=  '[' (ConstValue ListSeparator?)* ']'
+
+[36] ConstMap        ::=  '{' (ConstValue ':' ConstValue ListSeparator?)* '}'
+</code></pre>
+
+<h2 id="basic-definitions">Basic Definitions</h2>
+
+<h3 id="literal">Literal</h3>
+
+<pre><code>[37] Literal         ::=  ('"' [^"]* '"') | ("'" [^']* "'")
+</code></pre>
+
+<h3 id="identifier">Identifier</h3>
+
+<pre><code>[38] Identifier      ::=  ( Letter | '_' ) ( Letter | Digit | '.' | '_' )*
+
+[39] STIdentifier    ::=  ( Letter | '_' ) ( Letter | Digit | '.' | '_' | '-' )*
+</code></pre>
+
+<h3 id="list-separator">List Separator</h3>
+
+<pre><code>[40] ListSeparator   ::=  ',' | ';'
+</code></pre>
+
+<h3 id="letters-and-digits">Letters and Digits</h3>
+
+<pre><code>[41] Letter          ::=  ['A'-'Z'] | ['a'-'z']
+
+[42] Digit           ::=  ['0'-'9']
+</code></pre>
+
+<h2 id="examples">Examples</h2>
+
+<p>Here are some examples of Thrift definitions, using the Thrift IDL:</p>
+
+<ul>
+  <li><a href="https://raw.githubusercontent.com/apache/thrift/master/test/ThriftTest.thrift">ThriftTest.thrift</a> used by the Thrift TestFramework</li>
+  <li>Thrift <a href="/tutorial/">tutorial</a></li>
+  <li>Facebook&#8217;s <a href="https://raw.githubusercontent.com/apache/thrift/master/contrib/fb303/if/fb303.thrift">fb303.thrift</a></li>
+  <li><a href="http://cassandra.apache.org/">Apache Cassandra&#8217;s</a> Thrift IDL: <a href="https://gitbox.apache.org/repos/asf?p=cassandra.git;a=blob_plain;f=interface/cassandra.thrift;hb=refs/heads/cassandra-3.0">cassandra.thrift</a></li>
+  <li><a href="https://github.com/evernote/evernote-thrift">Evernote API</a></li>
+</ul>
+
+<h2 id="to-doquestions">To Do/Questions</h2>
+
+<p>Initialization of Base Types for all Languages?</p>
+
+<ul>
+  <li>Do all Languages initialize them to 0, bool=false and string=&#8221;&#8221;? or null, undefined?</li>
+</ul>
+
+<p>Why does position of <code>CppType</code> vary between <code>SetType</code> and <code>ListType</code>?</p>
+
+<ul>
+  <li>std::set does sort the elements automatically, that&#8217;s the design. see <a href="/docs/types">Thrift Types</a> or the <a href="http://www.cplusplus.com/reference/stl/set/">C++ std:set reference</a> for further details</li>
+  <li>The question is, how other languages are doing that? What about custom objects, do they have a Compare function the set the order correctly?</li>
+</ul>
+
+<p>Why can&#8217;t <code>DefinitionType</code> be the same as <code>FieldType</code> (i.e. include <code>Identifier</code>)?</p>
+
+<p>Examine the <code>smalltalk.prefix</code> and <code>smalltalk.category</code> status (esp <code>smalltalk.category</code>, which takes <code>STIdentifier</code> as its argument)&#8230;</p>
+
+<p>What to do about <code>ListSeparator</code>? Do we really want to be as lax as we currently are?</p>
+
+<p>Should <code>Field*</code> really be <code>Field+</code> in <code>Struct</code>, <code>Enum</code>, etc.?</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=doc/specs/idl.md">doc/specs/idl.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/index.html b/output/docs/index.html
new file mode 100644
index 0000000..549ab4d
--- /dev/null
+++ b/output/docs/index.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Documentation</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h1 id="apache-thrift-documentation">Apache Thrift Documentation</h1>
+
+<h2 id="documentation-topics">Documentation Topics</h2>
+
+<p>Each supported language needs the Apache Thrift Libraries and the generated code made by the Apache Thrift Compiler.</p>
+
+<p>Some language specific documentation is for the Apache Thrift Libraries are generated from lib/${language}/README.md files:</p>
+
+<ul>
+
+
+
+
+  <li><a href="/docs/BuildingFromSource.html">Building From Source</a></li>
+
+
+
+
+
+  <li><a href="/docs/HowToContribute.html">How To Contribute</a></li>
+
+
+
+  <li><a href="/docs/HowToNewLanguage.html">How to add new language bindings</a></li>
+
+
+
+
+
+  <li><a href="/docs/Languages.html">Language and Feature Matrix</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/docs/coding_standards.html">Coding standards</a></li>
+
+
+
+  <li><a href="/docs/concepts.html">Concepts</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/docs/features.html">Features</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/docs/idl.html">Interface Description Language (IDL)</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/docs/types.html">Thrift Type system</a></li>
+
+
+
+
+</ul>
+
+<h2 id="other-resources">Other resources</h2>
+
+<p>For a quick introduction that covers a lot of Thrift knowledge on just one page, we recommended
+Diwaker Gupta’s <a href="https://diwakergupta.github.io/thrift-missing-guide">Thrift: The Missing Guide</a>.</p>
+
+<p>If you want to do a real deep dive into the various language bindings, consider Randy Abernethy’s
+<a href="https://www.manning.com/books/programmers-guide-to-apache-thrift">The Programmer’s Guide to Apache Thrift</a>.
+The book comes with a lot of inside knowlegde and is packed with practical examples.</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/install/centos.html b/output/docs/install/centos.html
new file mode 100644
index 0000000..7a5e8f3
--- /dev/null
+++ b/output/docs/install/centos.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Centos 6.5 Install</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="building-apache-thrift-on-centos-65">Building Apache Thrift on CentOS 6.5</h1>
+
+<p>Starting with a minimal installation, the following steps are required to build Apache Thrift on Centos 6.5. This example builds from source, using the current development master branch. These instructions should also work with Apache Thrift releases beginning with 0.9.2.</p>
+
+<h2 id="update-the-system">Update the System</h2>
+
+<pre><code>sudo yum -y update
+</code></pre>
+
+<h2 id="install-the-platform-development-tools">Install the Platform Development Tools</h2>
+
+<pre><code>sudo yum -y groupinstall "Development Tools"
+</code></pre>
+
+<h2 id="upgrade-autoconfautomakebison">Upgrade autoconf/automake/bison</h2>
+
+<pre><code>sudo yum install -y wget
+</code></pre>
+
+<h3 id="upgrade-autoconf">Upgrade autoconf</h3>
+
+<pre><code>wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
+tar xvf autoconf-2.69.tar.gz
+cd autoconf-2.69
+./configure --prefix=/usr
+make
+sudo make install
+cd ..
+</code></pre>
+
+<h3 id="upgrade-automake">Upgrade automake</h3>
+
+<pre><code>wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
+tar xvf automake-1.14.tar.gz
+cd automake-1.14
+./configure --prefix=/usr
+make
+sudo make install
+cd ..
+</code></pre>
+
+<h3 id="upgrade-bison">Upgrade bison</h3>
+
+<pre><code>wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz
+tar xvf bison-2.5.1.tar.gz
+cd bison-2.5.1
+./configure --prefix=/usr
+make
+sudo make install
+cd ..
+</code></pre>
+
+<h2 id="add-optional-c-language-library-dependencies">Add Optional C++ Language Library Dependencies</h2>
+
+<p>All languages require the Apache Thrift IDL Compiler and at this point everything needed to make the IDL Compiler is installed (if you only need the compiler you can skip to the Build step).</p>
+
+<p>If you will be developing Apache Thrift clients/servers in C++ you will also need additional packages to support the C++ shared library build.</p>
+
+<h3 id="install-c-lib-dependencies">Install C++ Lib Dependencies</h3>
+
+<pre><code>sudo yum -y install libevent-devel zlib-devel openssl-devel
+</code></pre>
+
+<h3 id="upgrade-boost--156">Upgrade Boost &gt;= 1.56</h3>
+
+<pre><code>wget http://sourceforge.net/projects/boost/files/boost/1.56.0/boost_1_56_0.tar.gz
+tar xvf boost_1_56_0.tar.gz
+cd boost_1_56_0
+./bootstrap.sh
+sudo ./b2 install
+</code></pre>
+
+<h2 id="build-and-install-the-apache-thrift-idl-compiler">Build and Install the Apache Thrift IDL Compiler</h2>
+
+<pre><code>git clone https://github.com/apache/thrift.git
+cd thrift
+./bootstrap.sh
+./configure --with-lua=no
+make
+sudo make install
+</code></pre>
+
+<p>This will build the compiler (thrift/compiler/cpp/thrift &#8211;version) and any language libraries supported. The make install step installs the compiler on the path: /usr/local/bin/thrift
+You can use the ./configure &#8211;enable-libs=no switch to build the Apache Thrift IDL Compiler only without lib builds. To run tests use &#8220;make check&#8221;.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=doc/install/centos.md">doc/install/centos.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/install/debian.html b/output/docs/install/debian.html
new file mode 100644
index 0000000..14be297
--- /dev/null
+++ b/output/docs/install/debian.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Debian/Ubuntu install</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="debianubuntu-install">Debian/Ubuntu install</h2>
+<p>The following command will install tools and libraries required to build and install the Apache Thrift compiler and C++ libraries on a Debian/Ubuntu Linux based system.</p>
+
+<pre><code>sudo apt-get install automake bison flex g++ git libboost-all-dev libevent-dev libssl-dev libtool make pkg-config
+</code></pre>
+
+<p>Debian 7/Ubuntu 12 users need to manually install a more recent version of automake and (for C++ library and test support) boost:</p>
+
+<pre><code>wget http://ftp.debian.org/debian/pool/main/a/automake-1.15/automake_1.15-3_all.deb
+sudo dpkg -i automake_1.15-3_all.deb
+
+wget http://sourceforge.net/projects/boost/files/boost/1.60.0/boost_1_60_0.tar.gz                                                                      tar xvf boost_1_60_0.tar.gz
+cd boost_1_60_0
+./bootstrap.sh
+sudo ./b2 install
+</code></pre>
+
+<h2 id="optional-packages">Optional packages</h2>
+
+<p>If you would like to build Apache Thrift libraries for other programming languages you may need to install additional packages. The following languages require the specified additional packages:</p>
+
+<ul>
+  <li>Java
+    <ul>
+      <li>packages: gradle</li>
+      <li>You will also need Java JDK v1.8 or higher. Type <strong>javac</strong> to see a list of available packages, pick the one you prefer and <strong>apt-get install</strong> it (e.g. default-jdk).</li>
+    </ul>
+  </li>
+  <li>Ruby
+    <ul>
+      <li>ruby-full ruby-dev ruby-rspec rake rubygems bundler</li>
+    </ul>
+  </li>
+  <li>Python
+    <ul>
+      <li>python-all python-all-dev python-all-dbg</li>
+    </ul>
+  </li>
+  <li>Perl
+    <ul>
+      <li>libbit-vector-perl libclass-accessor-class-perl</li>
+    </ul>
+  </li>
+  <li>Php, install
+    <ul>
+      <li>php5-dev php5-cli phpunit</li>
+    </ul>
+  </li>
+  <li>C_glib
+    <ul>
+      <li>libglib2.0-dev</li>
+    </ul>
+  </li>
+  <li>Erlang
+    <ul>
+      <li>erlang-base erlang-eunit erlang-dev rebar</li>
+    </ul>
+  </li>
+  <li>NetStd
+    <ul>
+      <li>apt-transport-https dotnet-sdk-3.1 aspnetcore-runtime-3.1</li>
+    </ul>
+  </li>
+  <li>Haskell
+    <ul>
+      <li>ghc cabal-install libghc-binary-dev libghc-network-dev libghc-http-dev</li>
+    </ul>
+  </li>
+  <li>Thrift Compiler for Windows
+    <ul>
+      <li>mingw-w64 mingw-w64-x86-64-dev nsis</li>
+    </ul>
+  </li>
+  <li>Rust
+    <ul>
+      <li>rustc cargo</li>
+    </ul>
+  </li>
+  <li>Haxe
+    <ul>
+      <li>haxe</li>
+    </ul>
+  </li>
+  <li>Lua
+    <ul>
+      <li>lua5.3 liblua5.3-dev</li>
+    </ul>
+  </li>
+  <li>NodeJs
+    <ul>
+      <li>nodejs npm</li>
+    </ul>
+  </li>
+  <li>dotnetcore
+    <ul>
+      <li>https://www.microsoft.com/net/learn/get-started/linuxubuntu</li>
+    </ul>
+  </li>
+  <li>d-lang
+    <ul>
+      <li>
+        <table>
+          <tbody>
+            <tr>
+              <td>curl -fsS https://dlang.org/install.sh</td>
+              <td>bash -s dmd</td>
+            </tr>
+          </tbody>
+        </table>
+      </li>
+    </ul>
+  </li>
+  <li>dart &amp; pub
+    <ul>
+      <li>https://www.dartlang.org/install/linux</li>
+      <li>https://www.dartlang.org/tools/pub/installing</li>
+    </ul>
+  </li>
+</ul>
+
+<h2 id="additional-reading">Additional reading</h2>
+
+<p>For more information on the requirements see: <a href="/docs/install">Apache Thrift Requirements</a></p>
+
+<p>For more information on building and installing Thrift see: <a href="/docs/BuildingFromSource">Building from source</a></p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=doc/install/debian.md">doc/install/debian.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/install/index.html b/output/docs/install/index.html
new file mode 100644
index 0000000..b3fa636
--- /dev/null
+++ b/output/docs/install/index.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Index of install/</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <p>Apache Thrift’s compiler is written in C++ and designed to be portable, but there are some system requirements which must be installed prior to use. Select your os below for a guide on setting up your system to get started</p>
+
+<ul>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/docs/install/centos.html">Centos 6.5 Install</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/docs/install/debian.html">Debian/Ubuntu install</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/docs/install/os_x.html">OS X Install</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/docs/install/windows.html">Windows Install</a></li>
+
+
+</ul>
+
+<hr />
+
+<h2 id="basic-requirements">Basic requirements</h2>
+<ul>
+  <li>A relatively POSIX-compliant *NIX system
+    <ul>
+      <li>Cygwin or MinGW can be used on Windows (but there are better options, see below)</li>
+    </ul>
+  </li>
+  <li>g++ 4.2 (4.8 or later required for thrift compiler plug-in support)</li>
+  <li>boost 1.53.0</li>
+  <li>Runtime libraries for lex and yacc might be needed for the compiler.</li>
+</ul>
+
+<h2 id="requirements-for-building-from-source">Requirements for building from source</h2>
+<ul>
+  <li>GNU build tools:
+    <ul>
+      <li>autoconf 2.65</li>
+      <li>automake 1.13</li>
+      <li>libtool 1.5.24</li>
+    </ul>
+  </li>
+  <li>pkg-config autoconf macros (pkg.m4)</li>
+  <li>lex and yacc (developed primarily with flex and bison)</li>
+  <li>libssl-dev</li>
+</ul>
+
+<h2 id="requirements-for-building-the-compiler-from-source-on-windows">Requirements for building the compiler from source on Windows</h2>
+<ul>
+  <li>Visual Studio C++</li>
+  <li>Flex and Bison (e.g. the WinFlexBison package)</li>
+</ul>
+
+<h2 id="language-requirements">Language requirements</h2>
+<p>These are only required if you choose to build the libraries for the given language</p>
+
+<ul>
+  <li>C++
+    <ul>
+      <li>Boost 1.53.0</li>
+      <li>libevent (optional, to build the nonblocking server)</li>
+      <li>zlib (optional)</li>
+    </ul>
+  </li>
+  <li>Java
+    <ul>
+      <li>Java 1.7</li>
+      <li>Apache Ant</li>
+    </ul>
+  </li>
+  <li>C#: Mono 1.2.4 (and pkg-config to detect it) or Visual Studio 2005+</li>
+  <li>Python 2.6 (including header files for extension modules)</li>
+  <li>PHP 5.0 (optionally including header files for extension modules)</li>
+  <li>Ruby 1.8
+    <ul>
+      <li>bundler gem</li>
+    </ul>
+  </li>
+  <li>Erlang R12 (R11 works but not recommended)</li>
+  <li>Perl 5
+    <ul>
+      <li>Bit::Vector</li>
+      <li>Class::Accessor</li>
+    </ul>
+  </li>
+  <li>Haxe 3.1.3</li>
+  <li>Go 1.4</li>
+  <li>Delphi 2010</li>
+</ul>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/install/os_x.html b/output/docs/install/os_x.html
new file mode 100644
index 0000000..bcd61ad
--- /dev/null
+++ b/output/docs/install/os_x.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - OS X Install</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="os-x-setup">OS X Setup</h2>
+<p>The following command install all the required tools and libraries to build and install the Apache Thrift compiler on a OS X based system.</p>
+
+<h3 id="install-boost">Install Boost</h3>
+<p>Download the boost library from <a href="http://www.boost.org">boost.org</a> untar compile with</p>
+
+<pre><code>./bootstrap.sh
+sudo ./b2 threading=multi address-model=64 variant=release stage install
+</code></pre>
+
+<h3 id="install-libevent">Install libevent</h3>
+<p>Download <a href="http://monkey.org/~provos/libevent">libevent</a>, untar and compile with</p>
+
+<pre><code>./configure --prefix=/usr/local 
+make
+sudo make install
+</code></pre>
+
+<h3 id="building-apache-thrift">Building Apache Thrift</h3>
+<p>Download the latest version of <a href="/download">Apache Thrift</a>, untar and compile with</p>
+
+<pre><code>./configure --prefix=/usr/local/ --with-boost=/usr/local --with-libevent=/usr/local
+</code></pre>
+
+<h2 id="additional-reading">Additional reading</h2>
+
+<p>For more information on the requirements see: <a href="/docs/install">Apache Thrift Requirements</a></p>
+
+<p>For more information on building and installing Thrift see: <a href="/docs/BuildingFromSource">Building from source</a></p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=doc/install/os_x.md">doc/install/os_x.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/install/windows.html b/output/docs/install/windows.html
new file mode 100644
index 0000000..41784c1
--- /dev/null
+++ b/output/docs/install/windows.html
@@ -0,0 +1,299 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Windows Install</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="windows-setup">Windows Setup</h2>
+
+<p>The Thrift environment consists of two main parts: The Thrift compiler EXE and the language-dependent libraries. Most of these libraries will require some kind of build and/or installation. But regarding the Thrift compiler utility there are a number of different alternatives.</p>
+
+<p>The first one of these alternatives is to download the <strong>pre-built Thrift Compiler EXE</strong> and only build the libraries needed from source, following one of the &#8220;Setup from source&#8221; methods outlined below.</p>
+
+<p>The other two options are to build the Thrift compiler from source. The most recommended way to achieve this is by means of the <strong>Visual Studio C++ build project</strong>. Alternatively, the Thrift compiler can also be built via <strong>Cygwin</strong> or <strong>MinGW</strong> build environments, however this method is not only less comfortable, but more time-consuming and requires much more manual effort.</p>
+
+<h2 id="prebuilt-thrift-compiler">Prebuilt Thrift compiler</h2>
+
+<p>The windows Thrift compiler is available as a prebuilt exe available <a href="/download">here</a>. Note that there is no installation tool, rather this EXE file <em>is</em> already the Thrift compiler utility. Download the file and put it into some suitable location of your choice.</p>
+
+<p>Now pick one of the &#8220;Build and install target libraries&#8221; below to continue.</p>
+
+<h2 id="setup-from-source-via-visual-studio-c-recommended">Setup from source via Visual Studio C++ (recommended)</h2>
+
+<h3 id="requirements">Requirements</h3>
+
+<p>Thrift&#8217;s compiler is written in C++ and designed to be portable, but there are some system requirements. Thrift&#8217;s runtime libraries are written in various languages, which are also required for the particular language interface.</p>
+
+<ul>
+  <li>Visual Studio C++, any recent version should do</li>
+  <li>Flex and Bison, e.g. the WinFlexBison package</li>
+  <li><a href="/docs/install">Apache Thrift Requirements</a></li>
+</ul>
+
+<h3 id="build-and-install-the-compiler">Build and install the compiler</h3>
+
+<p>After all requirements are in place, use the <code>compiler/cpp/compiler.vcxproj</code> build project to build the Thrift compiler. Copy the resulting EXE file to a location of your choice.</p>
+
+<h3 id="build-and-install-target-libraries">Build and install target libraries</h3>
+
+<p>A few of the target language libraries also do provide Visual Studio project files, such as C++ and C#. These are located in the <code>lib/&lt;language&gt;/</code> folders.</p>
+
+<p>Most of the language packages must be built and installed manually using build tools better suited to those languages. Typical examples are Java, Ruby, Delphi, or PHP. Look for the <code>README.md</code> file in the <code>lib/&lt;language&gt;/</code> folder for more details on how to build and install each language&#8217;s library package.</p>
+
+<h2 id="setup-from-source-via-cygwin">Setup from source via Cygwin</h2>
+
+<h3 id="requirements-1">Requirements</h3>
+
+<p>Thrift&#8217;s compiler is written in C++ and designed to be portable, but there are some system requirements. Thrift&#8217;s runtime libraries are written in various languages, which are also required for the particular language interface.</p>
+
+<ul>
+  <li>Cygwin or MinGW</li>
+  <li><a href="/docs/install">Apache Thrift Requirements</a></li>
+</ul>
+
+<h3 id="installing-from-source">Installing from source</h3>
+
+<p>If you are building from the first time out of the source repository, you will need to generate the configure scripts.  (This is not necessary if you downloaded a tarball.)  From the top directory, do:</p>
+
+<pre><code>./bootstrap.sh
+</code></pre>
+
+<p>Once the configure scripts are generated, thrift can be configured. From the top directory, do:</p>
+
+<pre><code>export CXXFLAGS="-D PTHREAD_MUTEX_RECURSIVE_NP=PTHREAD_MUTEX_RECURSIVE"
+./configure
+</code></pre>
+
+<p>Setting the CXXFLAGS environmental variable works around compile errors with PTHREAD_MUTEX_RECURSIVE_NP being undeclared, by replacing it with the newer, portable PTHREAD_MUTEX_RECURSIVE. (Tested on cygwin 20100320, Thrift r760184, latest pthread.)</p>
+
+<p><strong>Optional:</strong> You <strong>may not</strong> be able to make from the root  Thrift directory due to errors (see below to resolve). To make the compiler only, change to the compiler directory before running make:</p>
+
+<pre><code>cd compiler/cpp
+</code></pre>
+
+<p>Now make the thrift compiler (&amp; runtime libraries if make is run from the thrift root directory):</p>
+
+<pre><code>make
+make install
+</code></pre>
+
+<h3 id="build-and-install-target-libraries-1">Build and install target libraries</h3>
+
+<p>Some language packages must be installed manually using build tools better suited to those languages. Typical examples are Java, Ruby, or PHP. Look for the README file in the <code>lib/&lt;language&gt;/</code> folder for more details on the installation of each language library package.</p>
+
+<h3 id="possible-issues-with-cygwin-install">Possible issues with Cygwin install</h3>
+
+<p>See also Possible issues with MinGW install.</p>
+
+<h4 id="syntax-error-in-configure">Syntax error in ./configure</h4>
+
+<p>The following error occurs for some users when running ./configure:</p>
+
+<pre><code>./configure: line 21183: syntax error near unexpected token `MONO,'
+./configure: line 21183: `  PKG_CHECK_MODULES(MONO, mono &gt;= 1.2.6, have_mono=yes, have_mono=no)'
+</code></pre>
+
+<p>To resolve this, you&#8217;ll need to find your pkg.m4 (installed by the pkg-config package) file and copy it to the thrift/aclocal directory.  From the top-level thrift directory, you can copy the file by running</p>
+
+<pre><code>cp /usr/share/aclocal/pkg.m4 aclocal
+</code></pre>
+
+<p>Finally, re-run ./bootstrap.sh and ./configure.  (Note that pkg.m4 is created by the pkg-config tool.  If your /usr/share/aclocal directory doesn&#8217;t contain the pkg.m4 file, you may not have pkg-config installed.)</p>
+
+<h4 id="installing-perl-runtime-libraries">Installing perl runtime libraries</h4>
+
+<p>Sometimes, there will be an error during the install of the perl libraries with chmod.</p>
+
+<p>A workaround is to avoid installing the perl libraries if they are not needed.</p>
+
+<p>If you don&#8217;t need perl, run configure with &#8211;without-perl.</p>
+
+<p>If you need perl, and are happy to manually install it, replace the contents of thrift/lib/perl/Makefile with the following, after building thrift:</p>
+
+<pre><code>TODO
+</code></pre>
+
+<h4 id="linking-to-installed-c-runtime-libraries">Linking to installed C++ runtime libraries</h4>
+
+<p>Sometimes, the installed libthrift.a will not link using g++, with linker errors about missing vtables and exceptions for Thrift classes.</p>
+
+<p>A workaround is to link the compiled object files directly from your Thrift build, corresponding to the missing classes.</p>
+
+<p>This can be implemented in a Makefile using the following lines:</p>
+
+<pre><code>THRIFT_O=&lt;path to&gt;/thrift/lib/cpp
+LTHRIFT=$(THRIFT_O)/Thrift.o $(THRIFT_O)/TSocket.o $(THRIFT_O)/TBinaryProtocol.o $(THRIFT_O)/TBufferTransports.o
+</code></pre>
+
+<p>Then linking using $(LTHRIFT) instead of -lthrift.</p>
+
+<pre><code>TODO - diagnose issue further
+</code></pre>
+
+<h4 id="c-runtime-segfault-with-cygwin-175-1-g-434-fork-and-throw">C++ runtime segfault with cygwin 1.7.5-1, g++-4.3.4, fork() and throw</h4>
+
+<p>If your thrift C++ programs segfault on throw after fork()ing, compile them with g++-3.</p>
+
+<p>The issue and patch are described on the Cygwin mailing list at http://cygwin.com/ml/cygwin/2010-05/msg00203.html</p>
+
+<p>This issue should be fixed in Cygwin versions after 1.7.5-1, or g++ 4.5.0.</p>
+
+<h2 id="setup-from-source-via-mingw">Setup from source via MinGW</h2>
+
+<h3 id="requirements-2">Requirements</h3>
+
+<p>To compile the Thrift generator &amp; runtime libraries (untested) without the cygwin.dll dependency you need to install MinGW (www.mingw.org).</p>
+
+<ul>
+  <li>MinGW</li>
+  <li><a href="/docs/install">Apache Thrift Requirements</a></li>
+</ul>
+
+<p>In addition you need to add the following entry to your windows PATH variable.</p>
+
+<pre><code>C:\MINGW\BIN
+</code></pre>
+
+<p>Next, open compiler/cpp/Makefile.am and add the following line to thrift_CXXFLAGS</p>
+
+<pre><code>-DMINGW -mno-cygwin -lfl
+</code></pre>
+
+<p>Run bootstrap.sh:</p>
+
+<pre><code>./bootstrap.sh
+</code></pre>
+
+<p>Make sure you have java in your $PATH variable, if not do(adjust path if necessary):</p>
+
+<pre><code>export PATH=$PATH:"/cygdrive/c/program files/java/jre1.8.0_191/bin"
+</code></pre>
+
+<p>Run configure - using CXXFLAGS to work around an issue with an old pthreads define (untested on MinGW - works on Cygwin):</p>
+
+<pre><code>export CXXFLAGS="-D PTHREAD_MUTEX_RECURSIVE_NP=PTHREAD_MUTEX_RECURSIVE"
+./configure
+</code></pre>
+
+<p>'&#8217;Optional:&#8217;&#8217; To make the compiler only, change to the compiler  directory before running make:</p>
+
+<pre><code>cd compiler/cpp
+</code></pre>
+
+<p>Run make:</p>
+
+<pre><code>mingw32-make.exe
+</code></pre>
+
+<h3 id="possible-issues-with-mingw-install">Possible issues with MinGW install</h3>
+
+<p>See also Possible issues with Cygwin install, including the discussion about PTHREAD_MUTEX_RECURSIVE_NP.</p>
+
+<h4 id="yywrap-is-not-found">yywrap is not found</h4>
+
+<p>Make sure you add -lfl in your cxxflags in Makefile, also try adding -Lc:/cygwin/libs</p>
+
+<h4 id="boost-is-not-found">boost is not found</h4>
+
+<p>Try and change the include dir to use the windows path from c like this: Edit compiler/cpp/Makefile, look for the declaration of BOOST_CPPFLAGS, change that line for</p>
+
+<pre><code>BOOST_CPPFLAGS = -Ic:/cygwin/usr/include/boost-1_53_0
+</code></pre>
+
+<h4 id="realpath-is-not-found">realpath is not found</h4>
+
+<p>add -DMINGW -mno-cygwin to the CXXDEFS variable in Makefile</p>
+
+<h2 id="additional-reading">Additional reading</h2>
+
+<p>For more information on the requirements see: <a href="/docs/install">Apache Thrift Requirements</a></p>
+
+<p>For more information on building and installing Thrift see: <a href="/docs/BuildingFromSource">Building from source</a></p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=doc/install/windows.md">doc/install/windows.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/docs/types.html b/output/docs/types.html
new file mode 100644
index 0000000..fd6c7a4
--- /dev/null
+++ b/output/docs/types.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Thrift Type system</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="thrift-types">Thrift Types</h2>
+<p>The Thrift type system is intended to allow programmers to use native types as much as possible, no matter what programming language they are working in. This information is based on, and supersedes, the information in the <a href="/static/files/thrift-20070401.pdf">Thrift Whitepaper</a>. The <a href="/docs/idl">Thrift IDL</a> provides descriptions of the types which are used to generate code for each target language.</p>
+
+<h3 id="base-types">Base Types</h3>
+<p>The base types were selected with the goal of simplicity and clarity rather than abundance, focusing on the key types available in all programming languages.</p>
+
+<ul>
+  <li>bool: A boolean value (true or false)</li>
+  <li>byte: An 8-bit signed integer</li>
+  <li>i16: A 16-bit signed integer</li>
+  <li>i32: A 32-bit signed integer</li>
+  <li>i64: A 64-bit signed integer</li>
+  <li>double: A 64-bit floating point number</li>
+  <li>string: A text string encoded using UTF-8 encoding</li>
+</ul>
+
+<p>Note the absence of unsigned integer types. This is due to the fact that there are no native unsigned integer types in many programming languages.</p>
+
+<h3 id="special-types">Special Types</h3>
+<p>binary: a sequence of unencoded bytes</p>
+
+<p>N.B.: This is currently a specialized form of the string type above, added to provide better interoperability with Java. The current plan-of-record is to elevate this to a base type at some point.</p>
+
+<h3 id="structs">Structs</h3>
+<p>Thrift structs define a common object – they are essentially equivalent to classes in OOP languages, but without inheritance. A struct has a set of strongly typed fields, each with a unique name identifier. Fields may have various annotations (numeric field IDs, optional default values, etc.) that are described in the  <a href="/docs/idl">Thrift IDL</a>.</p>
+
+<h3 id="containers">Containers</h3>
+<p>Thrift containers are strongly typed containers that map to commonly used and commonly available container types in most programming languages.</p>
+
+<p>There are three container types:</p>
+
+<ul>
+  <li>list<type>: An ordered list of elements. Translates to an STL vector, Java ArrayList, native arrays in scripting languages, etc.</type></li>
+  <li>set<type>: An unordered set of unique elements. Translates to an STL set, Java HashSet, set in Python, etc. Note: PHP does not support sets, so it is treated similar to a List</type></li>
+  <li>map&lt;type1,type2&gt;: A map of strictly unique keys to values. Translates to an STL map, Java HashMap, PHP associative array, Python/Ruby dictionary, etc.
+While defaults are provided, the type mappings are not explicitly fixed. Custom code generator directives have been added to allow substitution of custom types in various destination languages.</li>
+</ul>
+
+<p>Container elements may be of any valid Thrift Type.</p>
+
+<p>N.B.: For maximal compatibility, the key type for map should be a basic type rather than a struct or container type. There are some languages which do not support more complex key types in their native map types. In addition the JSON protocol only supports key types that are base types.</p>
+
+<h3 id="exceptions">Exceptions</h3>
+<p>Exceptions are functionally equivalent to structs, except that they inherit from the native exception base class as appropriate in each target programming language, in order to seamlessly integrate with the native exception handling in any given language.</p>
+
+<h3 id="services">Services</h3>
+<p>Services are defined using Thrift types. Definition of a service is semantically equivalent to defining an interface (or a pure virtual abstract class) in object oriented programming. The Thrift compiler generates fully functional client and server stubs that implement the interface.</p>
+
+<p>A service consists of a set of named functions, each with a list of parameters and a return type.</p>
+
+<p>Note that void is a valid type for a function return, in addition to all other defined Thrift types. Additionally, an oneway modifier keyword may be added to a void function, which will generate code that does not wait for a response. Note that a pure void function will return a response to the client which guarantees that the operation has completed on the server side. With oneway method calls the client will only be guaranteed that the request succeeded at the transport layer. Oneway method calls of the same client may be executed in parallel/out of order by the server.</p>
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/download.html b/output/download.html
new file mode 100644
index 0000000..7852b42
--- /dev/null
+++ b/output/download.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Download</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="release">Release</h2>
+<p>The latest stable release of Thrift is 0.13.0 (released on 2019-OCT-16).</p>
+
+<ul>
+  <li><a href="http://www.apache.org/dyn/closer.cgi?path=/thrift/0.13.0/thrift-0.13.0.tar.gz">thrift-0.13.0.tar.gz</a> [<a href="https://www.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz.asc">PGP</a>]
+[<a href="https://www.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz.md5">MD5</a>]</li>
+  <li><a href="http://www.apache.org/dyn/closer.cgi?path=/thrift/0.13.0/thrift-0.13.0.exe">Thrift compiler for Windows (thrift-0.13.0.exe)</a> [<a href="https://www.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe.asc">PGP</a>] [<a href="https://www.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe.md5">MD5</a>]</li>
+</ul>
+
+<h2 id="maven-artifact">Maven artifact</h2>
+<pre><code>&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.thrift&lt;/groupId&gt;
+  &lt;artifactId&gt;libthrift&lt;/artifactId&gt;
+  &lt;version&gt;0.13.0&lt;/version&gt;
+&lt;/dependency&gt;
+</code></pre>
+
+<p>When downloading from a mirror, please be sure to <a href="http://www.apache.org/info/verification.html">verify</a> the checksums and signature (see the MD5 and PGP links above). The <a href="https://www.apache.org/dist/thrift/KEYS">KEYS</a> file contains the public key(s) used for signing releases.</p>
+
+<hr />
+
+<h2 id="incubator-releases">Incubator Releases</h2>
+<p>Releases from the incubator ( less than 0.6.0 ) are available at the <a href="http://archive.apache.org/dist/incubator/thrift">Thrift Incubator Archive</a></p>
+
+<p>Releases from 0.6.0 up to the current release are available at the <a href="http://archive.apache.org/dist/thrift">Apache Thrift Archive</a></p>
+
+<hr />
+
+<h2 id="git-checkout">Git Checkout</h2>
+<p>For those who would like to participate in Thrift development, you may checkout Thrift from the <a href="https://github.com/apache/thrift">GitHub Repository</a>.</p>
+<pre><code>git clone https://github.com/apache/thrift.git
+cd thrift
+</code></pre>
+<p>We recommend you use our <a href="https://github.com/apache/thrift/tree/master/build/docker">docker development environment</a> - the same environment the CI builds use.</p>
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/index.html b/output/index.html
new file mode 100644
index 0000000..c995803
--- /dev/null
+++ b/output/index.html
@@ -0,0 +1,313 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Home</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <div class="row">
+  <div class="span8">
+    <p>
+      The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.
+    </p>
+    <h3>Getting Started</h3>
+    <p>
+      <ul>
+        <li>
+          <b>Download Apache Thrift</b>
+          <p>To get started, <a href="/download">download</a> a copy of Thrift.</p>
+        </li>
+        <li>
+          <b>Build and Install the Apache Thrift compiler</b>
+          <p>You will then need to <a href="/docs/BuildingFromSource">build</a> the Apache Thrift compiler and install it. See the <a href="/docs/install">installing Thrift</a> guide for any help with this step.</p>
+        </li>
+        <li>
+          <b>Writing a .thrift file</b>
+          <p>After the Thrift compiler is installed you will need to create a thrift file. This file is an <a href="/docs/idl">interface definition</a> made up of <a href="/docs/types">thrift types</a> and Services. The services you define in this file are implemented by the server and are called by any clients. The Thrift compiler is used to generate your Thrift File into source code which is used by the different client libraries and the server you write. To generate the source from a thrift file run</p>
+          <pre><code>thrift --gen &lt;language&gt; &lt;Thrift filename&gt;</code></pre>
+          <p>The sample tutorial.thrift file used for all the client and server tutorials can be found <a href="https://github.com/apache/thrift/tree/master/tutorial">here</a>. </p>
+        </li>
+      </ul>
+    </p>
+    <br />
+    <p>
+      To learn more about Apache Thrift <a href="/static/files/thrift-20070401.pdf">Read the Whitepaper</a>
+    </p>
+  </div>
+  <div class="span3 well center pull-right">
+    <h2>Download</h2>
+    <p>Apache Thrift v0.13.0</p>
+    <p>
+      <a class="btn btn-large" href="http://www.apache.org/dyn/closer.cgi?path=/thrift/0.13.0/thrift-0.13.0.tar.gz">
+          Download <small>v0.13.0</small>
+      </a>
+    </p>
+    <p>
+      <small>
+       <a href="https://www.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz.md5">MD5</a>
+      </small>
+      |
+      <small>
+       <a href="https://www.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz.asc">PGP</a>
+      </small>
+    </p>
+    <p>
+      <h4>[<a href="/download">Other Downloads</a>]</h4>
+    </p>
+  </div>
+</div>
+<hr />
+
+<h3>Example</h3>
+
+<p>Apache Thrift allows you to define data types and service interfaces in a simple definition file. Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages. Instead of writing a load of boilerplate code to serialize and transport your objects and invoke remote methods, you can get right down to business.</p>
+
+<p>The following example is a simple service to store user objects for a web front end.</p>
+
+<div class="tabbable">
+  <ul class="nav nav-tabs">
+    <li class="active"><a href="#1" data-toggle="tab">Thrift Definition File</a></li>
+    <li><a href="#2" data-toggle="tab">Python Client</a></li>
+    <li><a href="#3" data-toggle="tab">Java Server</a></li>
+  </ul>
+  <div class="tab-content">
+    <div class="tab-pane active" id="1">
+      
+<div class="highlight"><pre class="codehilite"><code>/**
+ * Ahh, now onto the cool part, defining a service. Services just need a name
+ * and can optionally inherit from another service using the extends keyword.
+ */
+service Calculator extends shared.SharedService {
+
+  /**
+   * A method definition looks like C code. It has a return type, arguments,
+   * and optionally a list of exceptions that it may throw. Note that argument
+   * lists and exception lists are specified using the exact same syntax as
+   * field lists in struct or exception definitions.
+   */
+
+   void ping(),
+
+   i32 add(1:i32 num1, 2:i32 num2),
+
+   i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
+
+   /**
+    * This method has a oneway modifier. That means the client only makes
+    * a request and does not listen for any response at all. Oneway methods
+    * must be void.
+    */
+   oneway void zip()
+
+}
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/tutorial.thrift">tutorial/tutorial.thrift</a>
+</p>
+      
+    </div>
+    <div class="tab-pane" id="2">
+      
+<div class="highlight"><pre class="codehilite"><code><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+    <span class="c1"># Make socket
+</span>    <span class="n">transport</span> <span class="o">=</span> <span class="n">TSocket</span><span class="p">.</span><span class="n">TSocket</span><span class="p">(</span><span class="s">'localhost'</span><span class="p">,</span> <span class="mi">9090</span><span class="p">)</span>
+
+    <span class="c1"># Buffering is critical. Raw sockets are very slow
+</span>    <span class="n">transport</span> <span class="o">=</span> <span class="n">TTransport</span><span class="p">.</span><span class="n">TBufferedTransport</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
+
+    <span class="c1"># Wrap in a protocol
+</span>    <span class="n">protocol</span> <span class="o">=</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">TBinaryProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
+
+    <span class="c1"># Create a client to use the protocol encoder
+</span>    <span class="n">client</span> <span class="o">=</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">Client</span><span class="p">(</span><span class="n">protocol</span><span class="p">)</span>
+
+    <span class="c1"># Connect!
+</span>    <span class="n">transport</span><span class="p">.</span><span class="nb">open</span><span class="p">()</span>
+
+    <span class="n">client</span><span class="p">.</span><span class="n">ping</span><span class="p">()</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">'ping()'</span><span class="p">)</span>
+
+    <span class="n">sum_</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/py/PythonClient.py">tutorial/py/PythonClient.py</a>
+</p>
+      
+    </div>
+    <div class="tab-pane" id="3">
+    Initialize the Server:
+      
+<div class="highlight"><pre class="codehilite"><code>    <span class="k">try</span> <span class="o">{</span>
+      <span class="nc">TServerTransport</span> <span class="n">serverTransport</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TServerSocket</span><span class="o">(</span><span class="mi">9090</span><span class="o">);</span>
+      <span class="nc">TServer</span> <span class="n">server</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TSimpleServer</span><span class="o">(</span><span class="k">new</span> <span class="nc">Args</span><span class="o">(</span><span class="n">serverTransport</span><span class="o">).</span><span class="na">processor</span><span class="o">(</span><span class="n">processor</span><span class="o">));</span>
+
+      <span class="c1">// Use this for a multithreaded server</span>
+      <span class="c1">// TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));</span>
+
+      <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Starting the simple server..."</span><span class="o">);</span>
+      <span class="n">server</span><span class="o">.</span><span class="na">serve</span><span class="o">();</span>
+    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
+    <span class="o">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/java/src/JavaServer.java">tutorial/java/src/JavaServer.java</a>
+</p>
+      
+
+    The CalculatorHandler:
+      
+<div class="highlight"><pre class="codehilite"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CalculatorHandler</span> <span class="kd">implements</span> <span class="nc">Calculator</span><span class="o">.</span><span class="na">Iface</span> <span class="o">{</span>
+
+  <span class="kd">private</span> <span class="nc">HashMap</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span><span class="nc">SharedStruct</span><span class="o">&gt;</span> <span class="n">log</span><span class="o">;</span>
+
+  <span class="kd">public</span> <span class="nf">CalculatorHandler</span><span class="o">()</span> <span class="o">{</span>
+    <span class="n">log</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashMap</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">SharedStruct</span><span class="o">&gt;();</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">ping</span><span class="o">()</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"ping()"</span><span class="o">);</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kt">int</span> <span class="nf">add</span><span class="o">(</span><span class="kt">int</span> <span class="n">n1</span><span class="o">,</span> <span class="kt">int</span> <span class="n">n2</span><span class="o">)</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"add("</span> <span class="o">+</span> <span class="n">n1</span> <span class="o">+</span> <span class="s">","</span> <span class="o">+</span> <span class="n">n2</span> <span class="o">+</span> <span class="s">")"</span><span class="o">);</span>
+    <span class="k">return</span> <span class="n">n1</span> <span class="o">+</span> <span class="n">n2</span><span class="o">;</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kt">int</span> <span class="nf">calculate</span><span class="o">(</span><span class="kt">int</span> <span class="n">logid</span><span class="o">,</span> <span class="nc">Work</span> <span class="n">work</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">InvalidOperation</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"calculate("</span> <span class="o">+</span> <span class="n">logid</span> <span class="o">+</span> <span class="s">", {"</span> <span class="o">+</span> <span class="n">work</span><span class="o">.</span><span class="na">op</span> <span class="o">+</span> <span class="s">","</span> <span class="o">+</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">+</span> <span class="s">","</span> <span class="o">+</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span> <span class="o">+</span> <span class="s">"})"</span><span class="o">);</span>
+    <span class="kt">int</span> <span class="n">val</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
+    <span class="k">switch</span> <span class="o">(</span><span class="n">work</span><span class="o">.</span><span class="na">op</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">case</span> <span class="nl">ADD:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">+</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span><span class="o">;</span>
+      <span class="k">break</span><span class="o">;</span>
+    <span class="k">case</span> <span class="nl">SUBTRACT:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">-</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span><span class="o">;</span>
+      <span class="k">break</span><span class="o">;</span>
+    <span class="k">case</span> <span class="nl">MULTIPLY:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">*</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span><span class="o">;</span>
+      <span class="k">break</span><span class="o">;</span>
+    <span class="k">case</span> <span class="nl">DIVIDE:</span>
+      <span class="k">if</span> <span class="o">(</span><span class="n">work</span><span class="o">.</span><span class="na">num2</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
+        <span class="nc">InvalidOperation</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InvalidOperation</span><span class="o">();</span>
+        <span class="n">io</span><span class="o">.</span><span class="na">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">op</span><span class="o">.</span><span class="na">getValue</span><span class="o">();</span>
+        <span class="n">io</span><span class="o">.</span><span class="na">why</span> <span class="o">=</span> <span class="s">"Cannot divide by 0"</span><span class="o">;</span>
+        <span class="k">throw</span> <span class="n">io</span><span class="o">;</span>
+      <span class="o">}</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">/</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span><span class="o">;</span>
+      <span class="k">break</span><span class="o">;</span>
+    <span class="k">default</span><span class="o">:</span>
+      <span class="nc">InvalidOperation</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InvalidOperation</span><span class="o">();</span>
+      <span class="n">io</span><span class="o">.</span><span class="na">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">op</span><span class="o">.</span><span class="na">getValue</span><span class="o">();</span>
+      <span class="n">io</span><span class="o">.</span><span class="na">why</span> <span class="o">=</span> <span class="s">"Unknown operation"</span><span class="o">;</span>
+      <span class="k">throw</span> <span class="n">io</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="nc">SharedStruct</span> <span class="n">entry</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SharedStruct</span><span class="o">();</span>
+    <span class="n">entry</span><span class="o">.</span><span class="na">key</span> <span class="o">=</span> <span class="n">logid</span><span class="o">;</span>
+    <span class="n">entry</span><span class="o">.</span><span class="na">value</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">val</span><span class="o">);</span>
+    <span class="n">log</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">logid</span><span class="o">,</span> <span class="n">entry</span><span class="o">);</span>
+
+    <span class="k">return</span> <span class="n">val</span><span class="o">;</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="nc">SharedStruct</span> <span class="nf">getStruct</span><span class="o">(</span><span class="kt">int</span> <span class="n">key</span><span class="o">)</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"getStruct("</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">")"</span><span class="o">);</span>
+    <span class="k">return</span> <span class="n">log</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">key</span><span class="o">);</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">zip</span><span class="o">()</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"zip()"</span><span class="o">);</span>
+  <span class="o">}</span>
+
+<span class="o">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/java/src/CalculatorHandler.java">tutorial/java/src/CalculatorHandler.java</a>
+</p>
+      
+    </div>
+  </div>
+</div>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/c_glib.html b/output/lib/c_glib.html
new file mode 100644
index 0000000..ec9126e
--- /dev/null
+++ b/output/lib/c_glib.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - C GLib</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-c">Using Thrift with C</h1>
+
+<p>The Thrift C libraries are built using the GNU tools.  Follow the instructions
+in the top-level README in order to generate the Makefiles.</p>
+
+<h1 id="dependencies">Dependencies</h1>
+
+<p>GLib
+http://www.gtk.org/</p>
+
+<h1 id="breaking-changes">Breaking Changes</h1>
+
+<h2 id="section">0.12.0</h2>
+
+<p>The compiler&#8217;s handling of namespaces when generating the name of types,
+functions and header files has been improved. This means code written to use
+classes generated by previous versions of the compiler may need to be updated to
+reflect the proper convention for class names, which is</p>
+
+<ul>
+  <li>A lowercase, <a href="https://en.wikipedia.org/wiki/Snake_case">snake-case</a>
+representation of the class&#8217; namespace, followed by</li>
+  <li>An underscore and</li>
+  <li>A lowercase, snake-case representation of the class&#8217; name.</li>
+</ul>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/c_glib/README.md">lib/c_glib/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/cl.html b/output/lib/cl.html
new file mode 100644
index 0000000..1d46add
--- /dev/null
+++ b/output/lib/cl.html
@@ -0,0 +1,318 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Common Lisp Library README</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-common-lisp">Using Thrift with Common Lisp</h1>
+
+<p>Thrift is a protocol and library for language-independent communication between cooperating
+ processes. The communication takes the form of request and response messages, of which the forms
+ are specified in advance throufh a shared interface definition. A Thrift definition file is translated
+ into Lisp source files, which comprise several definitions:</p>
+
+<ul>
+  <li>Three packages, one for the namespace of the implementation operators, and one each for request and
+  response operators.</li>
+  <li>Various type definitions as implementations for Thrift typedef and enum definitions.</li>
+  <li>DEF-STRUCT and DEF-EXCEPTION forms for Thrift struct and exception definitions.</li>
+  <li>DEF-SERVICE forms for thrift service definitions.</li>
+</ul>
+
+<p>Each service definition expands in a collection of generic function definitions. For each <code>op</code>
+ in the service definition, two functions are defined</p>
+
+<ul>
+  <li><code>op</code>-request is defined for use by a client. It accepts an additional initial <code>protocol</code> argument,
+to act as the client proxy for the operation and mediate the interaction with a remote process
+through a Thrift-encoded transport stream.</li>
+  <li><code>op</code>-response is defined for use by a server. It accepts a single <code>protocol</code> argument. A server
+uses it to decode the request message, invoke the base <code>op</code> function with the message arguments,
+encode and send the the result as a response, and handles exceptions.</li>
+</ul>
+
+<p>The client interface is one operator</p>
+
+<ul>
+  <li><code>with-client (variable location) . body</code> : creates a connection in a dynamic context and closes it
+upon exit. The variable is bound to a client proxy stream/protocol instance, which wraps the
+base i/o stream - socket, file, etc, with an operators which implement the Thrift protocol
+and transport mechanisms.</li>
+</ul>
+
+<p>The server interface combines server and service objects</p>
+
+<ul>
+  <li><code>serve (location service)</code> : accepts connections on the designated port and responds to
+requests of the service&#8217;s operations.</li>
+</ul>
+
+<h2 id="building">Building</h2>
+
+<p>The Thrift Common Lisp library is packaged as the ASDF[<a href="www.common-lisp.net/asdf">1</a>] system <code>thrift</code>.
+It depends on the systems</p>
+
+<ul>
+  <li>puri[<a href="http://github.com/lisp/com.b9.puri.ppcre">2</a>] : for the thrift uri class</li>
+  <li>closer-mop[<a href="www.common-lisp.net/closer-mop">3</a>] : for class metadata</li>
+  <li>trivial-utf-8[<a href="trivial-utf-8">4</a>] : for string codecs</li>
+  <li>usocket[<a href="https://github.com/usocket/usocket">5</a>] : for the socket transport</li>
+  <li>ieee-floats[<a href="https://github.com/marijnh/ieee-floats">6</a>] : for conversion between ints and floats</li>
+  <li>trivial-gray-streams[<a href="https://github.com/trivial-gray-streams/trivial-gray-streams">7</a>] : an abstraction layer for gray streams</li>
+  <li>alexandria[<a href="https://gitlab.common-lisp.net/alexandria/alexandria">8</a>] : handy utilities</li>
+</ul>
+
+<p>The dependencies are bundled for local builds of tests and tutorial binaries - 
+it is possible to use those bundles to load the library, too.</p>
+
+<p>In order to build it, register those systems with ASDF and evaluate:</p>
+
+<pre><code>(asdf:load-system :thrift)
+</code></pre>
+
+<p>This will compile and load the Lisp compiler for Thrift definition files, the
+transport and protocol implementations, and the client and server interface
+functions. In order to use Thrift in an application, one must also author and/or
+load the interface definitions for the remote service.[<a href="http://wiki.apache.org/thrift/ThriftGeneration">9</a>] If one is implementing a service,
+one must also define the actual functions to which Thrift is to act as the proxy
+interface. The remainder of this document follows the Thrift tutorial to illustrate how
+to perform the steps</p>
+
+<ul>
+  <li>implement the service</li>
+  <li>translate the Thrift IDL</li>
+  <li>load the Lisp service interfaces</li>
+  <li>run a server for the service</li>
+  <li>use a client to access the service remotely</li>
+</ul>
+
+<p>Note that, if one is to implement a new service, one will also need to author the
+IDL files, as there is no facility to generate them from a service implementation.</p>
+
+<h2 id="implement-the-service">Implement the Service</h2>
+
+<p>The tutorial comprises serveral functions: <code>add</code>, <code>ping</code>, <code>zip</code>, and <code>calculate</code>.
+Each translated IDL file generates three packages for every service. In the case of
+the tutorial file, the relevant packages are:</p>
+
+<ul>
+  <li>tutorial.calculator</li>
+  <li>tutorial.calculator-implementation</li>
+  <li>tutorial.calculator-response</li>
+</ul>
+
+<p>This is to separate the request (generated), response (generated) and implementation
+(meant to be implemented by the programmer) functions for defined Thrift methods.</p>
+
+<p>It is suggested to work in the <code>tutorial-implementation</code> package while implementing
+the services - it imports the <code>common-lisp</code> package, while the service-specific ones
+don&#8217;t (to avoid conflicts between Thrift method names and function names in <code>common-lisp</code>).</p>
+
+<pre><code>;; define the base operations
+
+(in-package :tutorial-implementation)
+
+(defun tutorial.calculator-implementation:add (num1 num2)
+  (format t "~&amp;Asked to add ~A and ~A." num1 num2)
+  (+ num1 num2))
+
+(defun tutorial.calculator-implementation:ping ()
+  (print :ping))
+
+(defun tutorial.calculator-implementation:zip ()
+  (print :zip))
+
+(defun tutorial.calculator-implementation:calculate (logid task)
+  (calculate-op (work-op task) (work-num1 task) (work-num2 task)))
+
+(defgeneric calculate-op (op arg1 arg2)
+  (:method :around (op arg1 arg2)
+    (let ((result (call-next-method)))
+      (format t "~&amp;Asked to calculate: ~d on  ~A and ~A = ~d." op arg1 arg2 result)
+      result))
+
+  (:method ((op (eql operation.add)) arg1 arg2)
+    (+ arg1 arg2))
+  (:method ((op (eql operation.subtract)) arg1 arg2)
+    (- arg1 arg2))
+  (:method ((op (eql operation.multiply)) arg1 arg2)
+    (* arg1 arg2))
+  (:method ((op (eql operation.divide)) arg1 arg2)
+    (/ arg1 arg2)))
+
+(defun zip () (print 'zip))
+</code></pre>
+
+<h2 id="translate-the-thrift-idl">Translate the Thrift IDL</h2>
+
+<p>IDL files employ the file extension <code>thrift</code>. In this case, there are two files to translate
+  * <code>tutorial.thrift</code>
+  * <code>shared.thrift</code>
+As the former includes the latter, one uses it to generate the interfaces:</p>
+
+<pre><code>$THRIFT/bin/thrift -r --gen cl $THRIFT/tutorial/tutorial.thrift
+</code></pre>
+
+<p><code>-r</code> stands for recursion, while <code>--gen</code> lets one choose the language to translate to.</p>
+
+<h2 id="load-the-lisp-translated-service-interfaces">Load the Lisp translated service interfaces</h2>
+
+<p>The translator generates three files for each IDL file. For example <code>tutorial-types.lisp</code>,
+<code>tutorial-vars.lisp</code> and an <code>.asd</code> file that can be used to load them both and pull in
+other includes (like <code>shared</code> within the tutorial) as dependencies.</p>
+
+<h2 id="run-a-server-for-the-service">Run a Server for the Service</h2>
+
+<p>The actual service name, as specified in the <code>def-service</code> form in <code>tutorial.lisp</code>, is <code>calculator</code>. 
+Each service definition defines a global variable with the service name and binds it to a
+service instance whch describes the operations.</p>
+
+<p>In order to start a service, specify a location and the service instance.</p>
+
+<pre><code>(in-package :tutorial)
+(serve #u"thrift://127.0.0.1:9091" calculator)
+</code></pre>
+
+<h2 id="use-a-client-to-access-the-service-remotely">Use a Client to Access the Service Remotely</h2>
+
+<p>[in some other process] run the client</p>
+
+<pre><code>(in-package :cl-user)
+
+(macrolet ((show (form)
+             `(format *trace-output* "~%~s =&gt;~{ ~s~}"
+                      ',form
+                      (multiple-value-list (ignore-errors ,form)))))
+  (with-client (protocol #u"thrift://127.0.0.1:9091")
+    (show (tutorial.calculator:ping protocol))
+    (show (tutorial.calculator:add protocol 1 2))
+    (show (tutorial.calculator:add protocol 1 4))
+
+    (let ((task (make-instance 'tutorial:work
+                  :op operation.subtract :num1 15 :num2 10)))
+      (show (tutorial.calculator:calculate protocol 1 task))
+    
+      (setf (tutorial:work-op task) operation.divide
+            (tutorial:work-num1 task) 1
+            (tutorial:work-num2 task) 0)
+      (show (tutorial.calculator:calculate protocol 1 task)))
+    
+    (show (shared.shared-service:get-struct protocol 1))
+
+    (show (zip protocol))))
+</code></pre>
+
+<h2 id="issues">Issues</h2>
+
+<h3 id="optional-fields">optional fields</h3>
+<p>Where the IDL declares a field options, the def-struct form includes no
+ initform for the slot and the encoding operator skips an unbound slot. This leave some ambiguity
+ with bool fields.</p>
+
+<h3 id="instantiation-protocol-">instantiation protocol :</h3>
+<p>struct classes are standard classes and exception classes are
+ whatever the implementation prescribes. decoders apply make-struct to an initargs list.
+ particularly at the service end, there are advantages to resourcing structs and decoding
+ with direct side-effects on slot-values</p>
+
+<h3 id="maps">maps:</h3>
+<p>Maps are now represented as hash tables. As data through the call/reply interface is all statically
+ typed, it is not necessary for the objects to themselves indicate the coding form. Association lists
+ would be sufficient. As the key type is arbitrary, property lists offer no additional convenience:
+ as <code>getf</code> operates with <code>eq</code> a new access interface would be necessary and they would not be
+ available for function application.</p>
+
+<ul>
+  <li>usocket[<a href="https://github.com/usocket/usocket">5</a>] : for the socket transport</li>
+  <li>ieee-floats[<a href="https://github.com/marijnh/ieee-floats">6</a>] : for conversion between ints and floats</li>
+  <li>trivial-gray-streams[<a href="https://github.com/trivial-gray-streams/trivial-gray-streams">7</a>] : an abstraction layer for gray streams</li>
+  <li>alexandria[<a href="https://gitlab.common-lisp.net/alexandria/alexandria">8</a>] : handy utilities</li>
+</ul>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/cl/README.md">lib/cl/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/cpp.html b/output/lib/cpp.html
new file mode 100644
index 0000000..84f73c6
--- /dev/null
+++ b/output/lib/cpp.html
@@ -0,0 +1,379 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - C++ library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-c">Using Thrift with C++</h1>
+
+<p>The Thrift C++ libraries are built using the GNU tools. Follow the instructions
+in the top-level README.md</p>
+
+<p>In case you do not want to open another README.md file, do this thrift src:</p>
+
+<pre><code>./bootstrap.sh
+./configure (--with-boost=/usr/local)
+make
+sudo make install
+</code></pre>
+
+<p>Thrift is divided into two libraries.</p>
+
+<ul>
+  <li>
+    <p>libthrift - The core Thrift library contains all the core Thrift code.  This requires
+openssl, pthreads, and librt.</p>
+  </li>
+  <li>
+    <p>libthriftnb - This library contains the Thrift nonblocking server, which uses libevent.
+To link this library you will also need to link libevent.</p>
+  </li>
+</ul>
+
+<h2 id="linking-against-thrift">Linking Against Thrift</h2>
+
+<p>After you build and install Thrift the libraries are installed to
+/usr/local/lib by default. Make sure this is in your LDPATH.</p>
+
+<p>On Linux, the best way to do this is to ensure that /usr/local/lib is in
+your /etc/ld.so.conf and then run /sbin/ldconfig.</p>
+
+<p>Depending upon whether you are linking dynamically or statically and how
+your build environment it set up, you may need to include additional
+libraries when linking against thrift, such as librt and/or libpthread. If
+you are using libthriftnb you will also need libevent.</p>
+
+<h2 id="dependencies">Dependencies</h2>
+
+<p>C++11 is required at a minimum.  C++03/C++98 are not supported after version 0.12.0.</p>
+
+<p>Boost is required to run the C++ unit tests.  It is not necessary to link against
+the runtime library.</p>
+
+<p>libevent (for libthriftnb only) - most linux distributions have dev packages for this:
+http://monkey.org/~provos/libevent/</p>
+
+<h1 id="using-thrift-with-c-on-windows">Using Thrift with C++ on Windows</h1>
+
+<p>Both the autoconf and cmake build systems are able to automatically detect many
+system configurations without the need to specify library locations, however if
+you run into problems or want to redirect thrift to build and link against your
+own provided third party libraries:</p>
+
+<p>BOOST_ROOT : For boost, e.g. D:\boost_1_55_0
+OPENSSL_ROOT_DIR : For OpenSSL, e.g. D:\OpenSSL-Win32</p>
+
+<p>only required by libthriftnb:</p>
+
+<p>LIBEVENT_ROOT_DIR : For Libevent e.g. D:\libevent-2.0.21-stable</p>
+
+<p>See /3rdparty.user for more details.</p>
+
+<p>The same linking guidelines described above for libthriftnb apply to windows as well.</p>
+
+<h2 id="linking-against-thrift-1">Linking Against Thrift</h2>
+
+<p>You need to link your project that uses thrift against all the thrift
+dependencies; in the case of libthrift, openssl, pthreads, and librt and for
+libthriftnb, libevent.</p>
+
+<p>In the project properties you must also set HAVE_CONFIG_H as force include
+the config header: &#8220;windows/config.h&#8221;</p>
+
+<h2 id="dependencies-1">Dependencies</h2>
+
+<p>libevent (for libthriftnb only)
+http://monkey.org/~provos/libevent/</p>
+
+<h2 id="windows-version-compatibility">Windows version compatibility</h2>
+
+<p>The Thrift library targets Windows 7 or latter versions. The supports for windows XP and Vista are avaiable until 0.12.0.</p>
+
+<h2 id="thrift-and-the-vcpkg-package-manager">Thrift and the VCPKG Package manager</h2>
+
+<p>You can download and install thrift using the 
+<a href="https://github.com/Microsoft/vcpkg">vcpkg</a> dependency manager:</p>
+
+<pre><code>git clone https://github.com/Microsoft/vcpkg.git
+cd vcpkg
+./bootstrap-vcpkg.sh
+./vcpkg integrate install
+./vcpkg install thrift
+</code></pre>
+
+<p>The thrift port in vcpkg is kept up to date by Microsoft team members 
+and community contributors. The Apache Thrift project is <em>not</em> responsible
+for the vcpkg port. Therefore, if the version is out of date, please 
+<a href="https://github.com/Microsoft/vcpkg">create an issue or pull request</a> 
+on the vcpkg repository.</p>
+
+<h2 id="named-pipes">Named Pipes</h2>
+
+<p>Named Pipe transport has been added in the TPipe and TPipeServer classes. This
+is currently Windows-only. Named pipe transport for *NIX has not been
+implemented. Domain sockets are a better choice for local IPC under non-Windows
+OS&#8217;s. *NIX named pipes only support 1:1 client-server connection.</p>
+
+<h1 id="thriftssl">Thrift/SSL</h1>
+
+<h2 id="scope">Scope</h2>
+
+<p>This SSL only supports blocking mode socket I/O. It can only be used with
+TSimpleServer, TThreadedServer, and TThreadPoolServer.</p>
+
+<h2 id="implementation">Implementation</h2>
+
+<p>There are two main classes TSSLSocketFactory and TSSLSocket. Instances of
+TSSLSocket are always created from TSSLSocketFactory.</p>
+
+<h2 id="how-to-use-ssl-apis">How to use SSL APIs</h2>
+
+<p>See the TestClient.cpp and TestServer.cpp files for examples.</p>
+
+<h3 id="accessmanager-certificate-validation">AccessManager (certificate validation)</h3>
+
+<p>An example of certificate validation can be found in TestServer.cpp.</p>
+
+<p>AccessManager defines a callback interface. It has three callback methods:</p>
+
+<p>(a) Decision verify(const sockaddr_storage&amp; sa);</p>
+
+<p>(b) Decision verify(const string&amp; host, const char* name, int size);</p>
+
+<p>(c) Decision verify(const sockaddr_storage&amp; sa, const char* data, int size);</p>
+
+<p>After SSL handshake completes, additional checks are conducted. Application
+is given the chance to decide whether or not to continue the conversation
+with the remote. Application is queried through the above three &#8220;verify&#8221;
+method. They are called at different points of the verification process.</p>
+
+<p>Decisions can be one of ALLOW, DENY, and SKIP. ALLOW and DENY means the
+conversation should be continued or disconnected, respectively. ALLOW and
+DENY decision stops the verification process. SKIP means there&#8217;s no decision
+based on the given input, continue the verification process.</p>
+
+<p>First, (a) is called with the remote IP. It is called once at the beginning.
+&#8220;sa&#8221; is the IP address of the remote peer.</p>
+
+<p>Then, the certificate of remote peer is loaded. SubjectAltName extensions
+are extracted and sent to application for verification. When a DNS
+subjectAltName field is extracted, (b) is called. When an IP subjectAltName
+field is extracted, (c) is called.</p>
+
+<p>The &#8220;host&#8221; in (b) is the value from TSocket::getHost() if this is a client
+side socket, or TSocket::getPeerHost() if this is a server side socket. The
+reason is client side socket initiates the connection. TSocket::getHost()
+is the remote host name. On server side, the remote host name is unknown
+unless it&#8217;s retrieved through TSocket::getPeerHost(). Either way, &#8220;host&#8221;
+should be the remote host name. Keep in mind, if TSocket::getPeerHost()
+failed, it would return the remote host name in numeric format.</p>
+
+<p>If all subjectAltName extensions were &#8220;skipped&#8221;, the common name field would
+be checked. It is sent to application through (c), where &#8220;sa&#8221; is the remote
+IP address. &#8220;data&#8221; is the IP address extracted from subjectAltName IP
+extension, and &#8220;size&#8221; is the length of the extension data.</p>
+
+<p>If any of the above &#8220;verify&#8221; methods returned a decision ALLOW or DENY, the
+verification process would be stopped.</p>
+
+<p>If any of the above &#8220;verify&#8221; methods returned SKIP, that decision would be
+ignored and the verification process would move on till the last item is
+examined. At that point, if there&#8217;s still no decision, the connection is
+terminated.</p>
+
+<p>Thread safety, an access manager should not store state information if it&#8217;s
+to be used by many SSL sockets.</p>
+
+<h2 id="sigpipe-signal">SIGPIPE signal</h2>
+
+<p>Applications running OpenSSL over network connections may crash if SIGPIPE
+is not ignored. This happens when they receive a connection reset by remote
+peer exception, which somehow triggers a SIGPIPE signal. If not handled,
+this signal would kill the application.</p>
+
+<h2 id="how-to-run-test-clientserver-in-ssl-mode">How to run test client/server in SSL mode</h2>
+
+<p>The server and client expects the followings from the directory /test/</p>
+
+<ul>
+  <li>keys/server.crt</li>
+  <li>keys/server.key</li>
+  <li>keys/CA.pem</li>
+</ul>
+
+<p>The file names are hard coded in the source code. You need to create these
+certificates before you can run the test code in SSL mode. Make sure at least
+one of the followings is included in &#8220;keys/server.crt&#8221;,</p>
+
+<ul>
+  <li>subjectAltName, DNS localhost</li>
+  <li>subjectAltName, IP  127.0.0.1</li>
+  <li>common name,    localhost</li>
+</ul>
+
+<p>Run within /test/ folder,</p>
+
+<pre><code>     ./cpp/TestServer --ssl &amp;
+     ./cpp/TestClient --ssl
+</code></pre>
+
+<p>If &#8220;-h <host>" is used to run client, the above "localhost" in the above
+keys/server.crt has to be replaced with that host name.</host></p>
+
+<h2 id="tsslsocketfactoryrandomize">TSSLSocketFactory::randomize()</h2>
+
+<p>The default implementation of OpenSSLSocketFactory::randomize() simply calls
+OpenSSL&#8217;s RAND_poll() when OpenSSL library is first initialized.</p>
+
+<p>The PRNG seed is key to the application security. This method should be
+overridden if it&#8217;s not strong enough for you.</p>
+
+<h1 id="deprecations">Deprecations</h1>
+
+<h2 id="section">0.12.0</h2>
+
+<p>Support for C++03/C++98 was deprecated.
+Support for Boost at runtime was deprecated.</p>
+
+<h1 id="breaking-changes">Breaking Changes</h1>
+
+<h2 id="section-1">1.0.0</h2>
+
+<p>THRIFT-4720:
+The classes Monitor and TimerManager now use std::chrono::milliseconds for timeout, the methods and functions involving THRIFT_TIMESPEC and timeval have been removed, the related tests have been modified.</p>
+
+<p>Support for Windows XP/Vista has been dropped.</p>
+
+<p>Support for C++03/C++98 has been dropped.  Use version 0.12.0 to support that
+language level.  As a consequence, boost is no longer required as a runtime
+library depenedency, but is is still required to build the runtime library
+and to run the unit tests.  We will work towards removing boost as a
+build dependency for folks who just want to build the runtime and not
+run the tests.  This means the header thrift/stdcxx.h has been removed and
+anything that relied on it has been changed to directly use C++11 concepts.</p>
+
+<p>THRIFT-4730:
+The classes BoostThreadFactory, PosixThreadFactory, StdThreadFactory, and
+PlatformThreadFactory have been removed, and we will use a ThreadFactory
+based on C++11 (essentially StdThreadFactory was renamed ThreadFactory).</p>
+
+<p>THRIFT-4732:
+The CMake build options WITH_SHARED_LIBS and WITH_STATIC_LIBS are deprecated.
+The project no longer performs a side-by-side static and shared build; you
+tell CMake through BUILD_SHARED_LIBS whether to make shared or static
+libraries now.  This is CMake standard behavior.</p>
+
+<p>THRIFT-4735:
+Qt4 support was removed.</p>
+
+<p>THRIFT-4762:
+Added <code>const</code> specifier to <code>TTransport::getOrigin()</code>. This changes its function signature.
+It&#8217;s recommended to add the <code>override</code> specifier in implementations derived from <code>TTransport</code>.</p>
+
+<h2 id="section-2">0.11.0</h2>
+
+<p>Older versions of thrift depended on the &lt;boost/smart_ptr.hpp&gt; classes which
+were used in thrift headers to define interfaces.  Thrift now detects C++11
+at build time and will prefer to use <memory> classes from C++11 instead.
+You can force the library to build with boost memory classes by defining the
+preprocessor macro `FORCE_BOOST_SMART_PTR`.  (THRIFT-2221)</memory></p>
+
+<p>In the pthread mutex implementation, the contention profiling code was enabled
+by default in all builds.  This changed to be disabled by default.  (THRIFT-4151)</p>
+
+<p>In older releases, if a TSSLSocketFactory&#8217;s lifetime was not at least as long
+as the TSSLSockets it created, we silently reverted openssl to unsafe multithread behavior
+and so the results were undefined.  Changes were made in 0.11.0 that cause either an
+assertion or a core instead of undefined behavior.  The lifetime of a TSSLSocketFactory
+<em>must</em> be longer than any TSSLSocket that it creates, otherwise openssl will be cleaned
+up too early.  If the static boolean is set to disable openssl initialization and
+cleanup and leave it up to the consuming application, this requirement is not needed.
+(THRIFT-4164)</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/cpp/README.md">lib/cpp/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/csharp.html b/output/lib/csharp.html
new file mode 100644
index 0000000..489e7de
--- /dev/null
+++ b/output/lib/csharp.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - C# library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/d.html b/output/lib/d.html
new file mode 100644
index 0000000..ee6ea0d
--- /dev/null
+++ b/output/lib/d.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - D library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="testing">Testing</h2>
+
+<p>D support in Thrift is covered by two sets of tests: first,
+the unit test blocks contained in the D source files, and
+second, the more extensive testing applications in the test/
+subdirectory, which also make use of the Thrift compiler.
+Both are built when running &#8220;make check&#8221;, but only the
+unit tests are immediately run, however – the separate test
+cases typically run longer or require manual intervention.
+It might also be prudent to run the independent tests,
+which typically consist of a server and a client part,
+against the other language implementations.</p>
+
+<p>To build the unit tests on Windows, the easiest way might
+be to manually create a file containing an empty main() and
+invoke the compiler by running the following in the src/
+directory (PowerShell syntax):</p>
+
+<p>dmd -ofunittest -unittest -w $(dir -r -filter &#8216;*.d&#8217; -name)</p>
+
+<h2 id="async-and-ssl">Async and SSL</h2>
+<p>Using SSL with async is experimental (always has been) and
+the unit test &#8220;async_test &#8211;ssl&#8221; hangs.  Use at your own
+risk.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/d/README.md">lib/d/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/delphi.html b/output/lib/delphi.html
new file mode 100644
index 0000000..982fdfd
--- /dev/null
+++ b/output/lib/delphi.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Delphi library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-delphi">Using Thrift with Delphi</h1>
+
+<p>The Thrift Delphi Library requires at least Delphi 2010.</p>
+
+<p>Because the Library heavily relies on generics, using it
+with earlier versions (such as Delphi 7) will <em>not</em> work.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/delphi/README.md">lib/delphi/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/erl.html b/output/lib/erl.html
new file mode 100644
index 0000000..9f29e17
--- /dev/null
+++ b/output/lib/erl.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Erlang library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="release-notes">Release Notes</h2>
+
+<h3 id="section">0.9.2</h3>
+
+<p>as of 0.9.2 struct and function naming conventions have changed. to retain the
+old naming conventions (for backwards compatibility) use the compiler option
+<code>legacynames</code></p>
+
+<h2 id="example">Example</h2>
+
+<p>Example session using thrift_client:</p>
+
+<p><code>erl
+1&gt; {ok, C0} = thrift_client_util:new("localhost", 9090, thrift_test_thrift, []), ok.
+ok
+2&gt; {C1, R1} = thrift_client:call(C0, testVoid, []), R1.
+{ok,ok}
+3&gt; {C2, R2} = thrift_client:call(C1, testVoid, [asdf]), R2.
+{error,{bad_args,testVoid,[asdf]}}
+4&gt; {C3, R3} = thrift_client:call(C2, testI32, [123]), R3.
+{ok,123}
+5&gt; {C4, R4} = thrift_client:call(C3, testOneway, [1]), R4.
+{ok,ok}
+6&gt; {C5, R5} = thrift_client:call(C4, testXception, ["foo"]), R5.
+{error,{no_function,testXception}}
+7&gt; {C6, R6} = thrift_client:call(C5, testException, ["foo"]), R6.
+{ok,ok}
+8&gt; {C7, R7} = (catch thrift_client:call(C6, testException, ["Xception"])), R7.
+{exception,{xception,1001,&lt;&lt;"Xception"&gt;&gt;}}
+</code></p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/erl/README.md">lib/erl/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/go.html b/output/lib/go.html
new file mode 100644
index 0000000..b8764a6
--- /dev/null
+++ b/output/lib/go.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Go library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-go">Using Thrift with Go</h1>
+
+<p>Thrift supports Go 1.7+</p>
+
+<p>In following Go conventions, we recommend you use the &#8216;go&#8217; tool to install
+Thrift for go.</p>
+
+<pre><code>$ go get github.com/apache/thrift/lib/go/thrift/...
+</code></pre>
+
+<p>Will retrieve and install the most recent version of the package.</p>
+
+<h1 id="a-note-about-optional-fields">A note about optional fields</h1>
+
+<p>The thrift-to-Go compiler tries to represent thrift IDL structs as Go structs.
+We must be able to distinguish between optional fields that are set to their
+default value and optional values which are actually unset, so the generated
+code represents optional fields via pointers.</p>
+
+<p>This is generally intuitive and works well much of the time, but Go does not
+have a syntax for creating a pointer to a constant in a single expression. That
+is, given a struct like</p>
+
+<pre><code>struct SomeIDLType {
+	OptionalField *int32
+}
+</code></pre>
+
+<p>, the following will not compile:</p>
+
+<pre><code>x := &amp;SomeIDLType{
+	OptionalField: &amp;(3),
+}
+</code></pre>
+
+<p>(Nor is there any other syntax that&#8217;s built in to the language)</p>
+
+<p>As such, we provide some helpers that do just this under lib/go/thrift/. E.g.,</p>
+
+<pre><code>x := &amp;SomeIDLType{
+	OptionalField: thrift.Int32Ptr(3),
+}
+</code></pre>
+
+<p>And so on. The code generator also creates analogous helpers for user-defined
+typedefs and enums.</p>
+
+<h1 id="adding-custom-tags-to-generated-thrift-structs">Adding custom tags to generated Thrift structs</h1>
+
+<p>You can add tags to the auto-generated thrift structs using the following format:</p>
+
+<pre><code>struct foo {
+  1: required string Bar (go.tag = "some_tag:\"some_tag_value\"")
+}
+</code></pre>
+
+<p>which will generate:</p>
+
+<pre><code>type Foo struct {
+  Bar string `thrift:"bar,1,required" some_tag:"some_tag_value"`
+}
+</code></pre>
+
+<h1 id="a-note-about-server-handler-implementations">A note about server handler implementations</h1>
+
+<p>The context object passed into the server handler function will be canceled when
+the client closes the connection (this is a best effort check, not a guarantee
+&#8211; there&#8217;s no guarantee that the context object is always canceled when client
+closes the connection, but when it&#8217;s canceled you can always assume the client
+closed the connection). When implementing Go Thrift server, you can take
+advantage of that to abandon requests that&#8217;s no longer needed:</p>
+
+<pre><code>func MyEndpoint(ctx context.Context, req *thriftRequestType) (*thriftResponseType, error) {
+    ...
+    if ctx.Err() == context.Canceled {
+        return nil, thrift.ErrAbandonRequest
+    }
+    ...
+}
+</code></pre>
+
+<p>This feature would add roughly 1 millisecond of latency overhead to the server
+handlers (along with roughly 2 goroutines per request).
+If that is unacceptable, it can be disabled by having this line early in your
+main function:</p>
+
+<pre><code>thrift.ServerConnectivityCheckInterval = 0
+</code></pre>
+
+<p>Please be advised that due to a
+<a href="https://github.com/golang/go/issues/27707">Go runtime bug</a>, currently
+if this interval is set to a value too low (for example, 1ms), it might cause
+excessive cpu overhead.</p>
+
+<p>This feature is also only enabled on non-oneway endpoints.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/go/README.md">lib/go/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/haxe.html b/output/lib/haxe.html
new file mode 100644
index 0000000..3effdcc
--- /dev/null
+++ b/output/lib/haxe.html
@@ -0,0 +1,245 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Haxe library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-haxe">Using Thrift with Haxe</h1>
+
+<h2 id="haxe-setup">Haxe setup</h2>
+
+<p>Thrift requires Haxe 3.1.3. Installers for Windows and OSX
+platforms are available at <code>http://haxe.org/download</code>.</p>
+
+<p>Depending on the desired targets, you may have to install the appropriate HaxeLibs 
+after installing Haxe itself. For example, if you plan to target C#, Java and C++,
+enter the following commands after installing Haxe:</p>
+
+<pre><code>haxelib install hxcpp
+haxelib install hxjava
+haxelib install hxcs
+</code></pre>
+
+<p>For other targets, please consult the Haxe documentation whether or not any additional
+target libraries need to be installed and how to achieve this.</p>
+
+<h2 id="haxe-on-linux">Haxe on Linux</h2>
+
+<p>For Linux platforms it is recommended to use the distro-specific package
+manager, where possible. More detailed information can be found at the 
+Haxe Linux download section: http://haxe.org/download/linux</p>
+
+<p>If you run into the error message</p>
+
+<pre><code>Uncaught exception - load.c(237) : Failed to load library : /usr/lib/neko/regexp.ndll  
+(libpcre.so.3: cannot open shared object file: No such file or directory)
+</code></pre>
+
+<p>this can be solved depending on your OSes bitness by either</p>
+
+<pre><code>sudo ln -sf /usr/lib/libpcre.so.1 /usr/lib/libpcre.so.3
+sudo ldconfig
+</code></pre>
+
+<p>or</p>
+
+<pre><code>sudo ln -sf /usr/lib64/libpcre.so.1 /usr/lib64/libpcre.so.3
+sudo ldconfig
+</code></pre>
+
+<h2 id="thrift-haxe-bindings">Thrift Haxe bindings</h2>
+
+<p>Thrift Haxe bindings can be set up via the <code>haxelib</code> tool<br />
+either from the official ASF repo, or via the github mirror.</p>
+
+<ul>
+  <li>
+    <p>To set up any <strong>stable version</strong>, choose the appropriate branch (e.g. <code>0.12.0</code>):</p>
+
+    <ul>
+      <li><code>haxelib git thrift https://github.com/apache/thrift.git 0.12.0 lib/haxe</code></li>
+    </ul>
+  </li>
+  <li>
+    <p>To set up the current <strong>development version</strong>, use the <code>master</code> branch:</p>
+
+    <ul>
+      <li><code>haxelib git thrift https://github.com/apache/thrift.git master lib/haxe</code></li>
+    </ul>
+  </li>
+</ul>
+
+<p>As usual, the installed library can be updated using <code>haxelib upgrade</code> 
+or <code>haxelib update thrift</code>.</p>
+
+<p>In order to work with Thrift, you will need to install the Thrift compiler 
+or build from source, depending on your operating system. Appropriate 
+downloads and more information can be found at http://thrift.apache.org</p>
+
+<p>To get started, visit the /tutorial/haxe and /test/haxe dirs for examples. 
+If you are using HIDE or the FlashDevelop IDE, you&#8217;ll find appropriate 
+project files in these folders.</p>
+
+<h1 id="current-status">Current status</h1>
+<ul>
+  <li>tested with Haxe C++ target</li>
+  <li>tested with Haxe PHP target (console/web server, binary protocols)</li>
+  <li>transports: Socket, HTTP (servers run inside PHP server/PHP target only), Stream</li>
+  <li>protocols: Binary, JSON, Multiplex, Compact</li>
+  <li>tutorial client and server available</li>
+  <li>cross-test client and server available</li>
+</ul>
+
+<h1 id="further-developments">Further developments</h1>
+<ul>
+  <li>improve to work with C#, Java and JavaScript Haxe/OpenFL targets</li>
+  <li>improve to work with more (ideally all) Haxe/OpenFL targets</li>
+  <li>add HTTP server, update tutorial and tests accordingly</li>
+</ul>
+
+<h1 id="known-restrictions">Known restrictions</h1>
+
+<p>Although designed with maximum portability in mind, for technical reasons some platforms
+may only support parts of the library, or not be compatible at all.</p>
+
+<p>Javascript:
+- tutorial fails to build because of unsupported Sys.args</p>
+
+<h1 id="php-http-server-notes">PHP HTTP Server notes</h1>
+
+<ul>
+  <li>
+    <p>you have to import PHP files generated by haxe into PHP
+<code>php
+require_once  dirname(__FILE__) . '/bin/php-web-server/Main-debug.php';
+</code></p>
+  </li>
+  <li>
+    <p>trace() by default outputs into stdout (http response), so you have to redirect it to stderr or you own logs, something like
+<code>haxe
+//remap trace to error log
+haxe.Log.trace = function(v:Dynamic, ?infos:haxe.PosInfos) 
+{ 
+  //simulate normal trace https://github.com/HaxeFoundation/haxe/blob/development/std/haxe/Log.hx
+  var newValue : Dynamic;
+  if (infos != null &amp;&amp; infos.customParams!=null) {
+      var extra:String = "";
+      for( v in infos.customParams )
+          extra += "," + v;
+      newValue = v + extra;
+  }
+  else {
+      newValue = v;
+  }
+  var msg = infos != null ? infos.fileName + ':' + infos.lineNumber + ': ' : '';
+  Sys.stderr().writeString('${msg}${newValue}\n');
+}
+</code></p>
+  </li>
+  <li>
+    <p>to allow thrift server to read/write HTTP request/response, it should be pointed out to php streams
+<code>haxe
+transport =	new TWrappingServerTransport(
+              new TStreamTransport(
+                  new TFileStream("php://input", Read),
+                  new TFileStream("php://output", Append)
+                  )
+              );
+</code></p>
+  </li>
+  <li>
+    <p>TSimpleServer doesn&#8217;t stop after first call, so processor.process() should be called instead, or use runOnce property 
+<code>haxe
+var server = new TSimpleServer( processor, transport, transfactory, protfactory);
+server.runOnce = true;
+</code></p>
+  </li>
+</ul>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/haxe/README.md">lib/haxe/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/hs.html b/output/lib/hs.html
new file mode 100644
index 0000000..9ee527c
--- /dev/null
+++ b/output/lib/hs.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Haskell library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="compile">Compile</h1>
+
+<p>Use Cabal to compile and install; ./configure uses Cabal underneath, and that
+path is not yet well tested. Thrift&#8217;s library and generated code should compile
+with pretty much any GHC extensions or warnings you enable (or disable).
+Please report this not being the case as a bug on
+https://issues.apache.org/jira/secure/CreateIssue!default.jspa</p>
+
+<p>Chances you&#8217;ll need to muck a bit with Cabal flags to install Thrift:</p>
+
+<p>CABAL_CONFIGURE_FLAGS=&#8221;&#8211;user&#8221; ./configure</p>
+
+<h1 id="base-types">Base Types</h1>
+
+<p>The mapping from Thrift types to Haskell&#8217;s is:</p>
+
+<ul>
+  <li>double -&gt; Double</li>
+  <li>byte -&gt; Data.Int.Int8</li>
+  <li>i16 -&gt; Data.Int.Int16</li>
+  <li>i32 -&gt; Data.Int.Int32</li>
+  <li>i64 -&gt; Data.Int.Int64</li>
+  <li>string -&gt; Text</li>
+  <li>binary -&gt; Data.ByteString.Lazy</li>
+  <li>bool -&gt; Boolean</li>
+</ul>
+
+<h1 id="enums">Enums</h1>
+
+<p>Become Haskell &#8216;data&#8217; types. Use fromEnum to get out the int value.</p>
+
+<h1 id="lists">Lists</h1>
+
+<p>Become Data.Vector.Vector from the vector package.</p>
+
+<h1 id="maps-and-sets">Maps and Sets</h1>
+
+<p>Become Data.HashMap.Strict.Map and Data.HashSet.Set from the
+unordered-containers package.</p>
+
+<h1 id="structs">Structs</h1>
+
+<p>Become records. Field labels are ugly, of the form f_STRUCTNAME_FIELDNAME. All
+fields are Maybe types.</p>
+
+<h1 id="exceptions">Exceptions</h1>
+
+<p>Identical to structs. Use them with throw and catch from Control.Exception.</p>
+
+<h1 id="client">Client</h1>
+
+<p>Just a bunch of functions. You may have to import a bunch of client files to
+deal with inheritance.</p>
+
+<h1 id="interface">Interface</h1>
+
+<p>You should only have to import the last one in the chain of inheritors. To make
+an interface, declare a label:</p>
+
+<p>data MyIface = MyIface</p>
+
+<p>and then declare it an instance of each iface class, starting with the superest
+class and proceeding down (all the while defining the methods).  Then pass your
+label to process as the handler.</p>
+
+<h1 id="processor">Processor</h1>
+
+<p>Just a function that takes a handler label, protocols. It calls the
+superclasses process if there is a superclass.</p>
+
+<h1 id="releasing-to-hackage">Releasing to Hackage</h1>
+
+<p>Using the <a href="../../build/docker/README.md">Docker Container for Ubuntu Bionic</a>, run:</p>
+
+<pre><code>root@e941f5311545:/thrift/src# ./bootstrap.sh &amp;&amp; ./configure
+root@e941f5311545:/thrift/src# cd lib/hs &amp;&amp; make dist-local
+</code></pre>
+
+<p>This will produce a <code>lib/hs/dist/thrift-&lt;version&gt;.tar.gz</code> file.  Take this
+file and upload it as a Haskell Hackage
+<a href="https://hackage.haskell.org/upload#candidates">package candidate</a> and 
+check to make sure all the information is correct.  Assuming all is satisfactory,
+you can upload the package as official using the link at the top of the page.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/hs/README.md">lib/hs/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/index.html b/output/lib/index.html
new file mode 100644
index 0000000..444e5dc
--- /dev/null
+++ b/output/lib/index.html
@@ -0,0 +1,535 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h1 id="apache-thrift-libraries">Apache Thrift Libraries</h1>
+
+<h2 id="source-tree">Source Tree</h2>
+
+<p>Each supported language needs the Apache Thrift Libraries and the generated code made by the Apache Thrift Compiler.</p>
+
+<p>Some language specific documentation is for the Apache Thrift Libraries are generated from lib/${language}/README.md files:</p>
+
+<ul>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/lib/c_glib.html">C GLib</a></li>
+
+
+
+
+
+
+
+  <li><a href="/lib/cl.html">Common Lisp Library README</a></li>
+
+
+
+
+
+
+
+  <li><a href="/lib/cpp.html">C++ library</a></li>
+
+
+
+
+
+  <li><a href="/lib/csharp.html">C# library</a></li>
+
+
+
+
+
+  <li><a href="/lib/d.html">D library</a></li>
+
+
+
+
+
+
+
+
+
+  <li><a href="/lib/delphi.html">Delphi library</a></li>
+
+
+
+
+
+
+
+
+
+  <li><a href="/lib/erl.html">Erlang library</a></li>
+
+
+
+
+
+  <li><a href="/lib/go.html">Go library</a></li>
+
+
+
+
+
+
+
+  <li><a href="/lib/haxe.html">Haxe library</a></li>
+
+
+
+
+
+  <li><a href="/lib/hs.html">Haskell library</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/lib/java.html">Java library</a></li>
+
+
+
+
+
+  <li><a href="/lib/js.html">JavaScript library</a></li>
+
+
+
+
+
+
+
+
+
+  <li><a href="/lib/netstd.html">.NET Standard library</a></li>
+
+
+
+
+
+  <li><a href="/lib/nodejs.html">node.js library</a></li>
+
+
+
+
+
+  <li><a href="/lib/ocaml.html">OCaml library</a></li>
+
+
+
+
+
+
+
+  <li><a href="/lib/perl.html">Perl library</a></li>
+
+
+
+
+
+  <li><a href="/lib/php.html">PHP library</a></li>
+
+
+
+
+
+  <li><a href="/lib/py.html">Python library</a></li>
+
+
+
+
+
+  <li><a href="/lib/rb.html">Ruby library</a></li>
+
+
+
+
+
+
+
+  <li><a href="/lib/st.html">SmallTalk library</a></li>
+
+
+
+
+
+
+</ul>
+
+<h2 id="package-manager-information-and-references">Package manager information and references</h2>
+
+<!-- place table outside filter/endfilter -->
+<div class="packages">
+    <table class="table table-bordered table-striped">
+        <tbody>
+        <tr>
+            <td><b>Language Bindings</b></td>
+            <td><b>Package Manager</b></td>
+            <td><b>Direct link (URL)</b></td>
+            <td><b>Control file in source tree</b></td>
+            <td><b>Maintainer</b></td>
+            <td><b>Remarks</b></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">(all)</td>
+            <td class="packman">Docker</td>
+            <td class="packurl"><a href="https://hub.docker.com/_/thrift/">https://hub.docker.com/_/thrift/</a></td>
+            <td class="ctrlfile">Dockerfile</td>
+            <td class="maintainer"></td>
+            <td class="remarks">thrift compiler in /usr/local/bin/thrift</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">ActionScript</td>
+            <td class="packman">Maven</td>
+            <td class="packurl"><a href="https://repository.apache.org/#nexus-search;quick~libthrift-as3">https://repository.apache.org/#nexus-search;quick~libthrift-as3</a></td>
+            <td class="ctrlfile">lib/as3/build.xml</td>
+            <td class="maintainer">jking</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">C (glib)</td>
+            <td class="packman"></td>
+            <td class="packurl"><a href=""></a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">language has no package manager</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">C++</td>
+            <td class="packman"></td>
+            <td class="packurl"><a href=""></a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">see THRIFT-4800</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">C#</td>
+            <td class="packman">NuGet</td>
+            <td class="packurl"><a href="https://www.nuget.org/packages/ApacheThrift">https://www.nuget.org/packages/ApacheThrift</a></td>
+            <td class="ctrlfile">ApacheThrift.nuspec</td>
+            <td class="maintainer">jfarrell, codesf, jking</td>
+            <td class="remarks">multi-framework nupkg for csharp and netcore</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Cocoa</td>
+            <td class="packman"></td>
+            <td class="packurl"><a href=""></a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">deprecated on 0.12.0 - use swift</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Common LISP</td>
+            <td class="packman"></td>
+            <td class="packurl"><a href=""></a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">no official ASF package available</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">D</td>
+            <td class="packman">dub</td>
+            <td class="packurl"><a href="https://code.dlang.org/packages/apache-thrift">https://code.dlang.org/packages/apache-thrift</a></td>
+            <td class="ctrlfile">dub.json</td>
+            <td class="maintainer">jking</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Dart</td>
+            <td class="packman">Pub</td>
+            <td class="packurl"><a href="https://pub.dartlang.org/packages/thrift">https://pub.dartlang.org/packages/thrift</a></td>
+            <td class="ctrlfile">lib/dart/pubspec.yaml</td>
+            <td class="maintainer">jking</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">.NET Standard</td>
+            <td class="packman">NuGet</td>
+            <td class="packurl"><a href="https://www.nuget.org/packages/ApacheThrift">https://www.nuget.org/packages/ApacheThrift</a></td>
+            <td class="ctrlfile">ApacheThrift.nuspec</td>
+            <td class="maintainer">jfarrell, codesf, jking</td>
+            <td class="remarks">multi-framework nupkg for csharp and netcore</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Erlang</td>
+            <td class="packman">Hex PM</td>
+            <td class="packurl"><a href="https://hex.pm/packages?search=thrift&amp;sort=downloads">https://hex.pm/packages?search=thrift&amp;sort=downloads</a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">no official ASF package available</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Haskell</td>
+            <td class="packman">Hackage</td>
+            <td class="packurl"><a href="https://hackage.haskell.org/package/thrift">https://hackage.haskell.org/package/thrift</a></td>
+            <td class="ctrlfile">lib/hs/thrift.cabal</td>
+            <td class="maintainer">jfarrell, clavoie, jking</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Haxe</td>
+            <td class="packman">Haxelib</td>
+            <td class="packurl"><a href=""></a></td>
+            <td class="ctrlfile">lib/haxe/haxelib.json</td>
+            <td class="maintainer">jensg</td>
+            <td class="remarks">no package uploaded - see THRIFT-3036</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Go</td>
+            <td class="packman"></td>
+            <td class="packurl"><a href=""></a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">no official ASF package available</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Java</td>
+            <td class="packman">Maven</td>
+            <td class="packurl"><a href="https://repository.apache.org/#nexus-search;quick~org.apache.thrift">https://repository.apache.org/#nexus-search;quick~org.apache.thrift</a></td>
+            <td class="ctrlfile">lib/java/gradle.properties</td>
+            <td class="maintainer">jking</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">JavaScript</td>
+            <td class="packman">Bower</td>
+            <td class="packurl"><a href="https://libraries.io/bower/thrift">https://libraries.io/bower/thrift</a></td>
+            <td class="ctrlfile">bower.json</td>
+            <td class="maintainer"></td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Lua</td>
+            <td class="packman">LuaRocks</td>
+            <td class="packurl"><a href="https://luarocks.org/modules/drauschenbach/thrift">https://luarocks.org/modules/drauschenbach/thrift</a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">not official - stale at 0.10.0 - see THRIFT-4708</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Node.js</td>
+            <td class="packman">npm</td>
+            <td class="packurl"><a href="https://www.npmjs.com/package/thrift">https://www.npmjs.com/package/thrift</a></td>
+            <td class="ctrlfile">package.json</td>
+            <td class="maintainer">jfarrell, wadey, jking</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">OCaml</td>
+            <td class="packman">opam</td>
+            <td class="packurl"><a href="https://opam.ocaml.org/packages/thrift/">https://opam.ocaml.org/packages/thrift/</a></td>
+            <td class="ctrlfile">lib/ocaml/opam</td>
+            <td class="maintainer"></td>
+            <td class="remarks">stale at 0.9.0 (community provided) - see THRIFT-4706</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Perl</td>
+            <td class="packman">CPAN</td>
+            <td class="packurl"><a href="https://metacpan.org/release/Thrift">https://metacpan.org/release/Thrift</a></td>
+            <td class="ctrlfile">lib/perl/Makefile.PL</td>
+            <td class="maintainer">jking</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">PHP</td>
+            <td class="packman">Packagist</td>
+            <td class="packurl"><a href="https://packagist.org/packages/apache/thrift">https://packagist.org/packages/apache/thrift</a></td>
+            <td class="ctrlfile">composer.json</td>
+            <td class="maintainer">jfarrell, bufferoverflow, jking</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Python</td>
+            <td class="packman">pypi</td>
+            <td class="packurl"><a href="https://pypi.python.org/pypi/thrift">https://pypi.python.org/pypi/thrift</a></td>
+            <td class="ctrlfile">lib/py/setup.py</td>
+            <td class="maintainer">jfarrell</td>
+            <td class="remarks">stale at 0.11.0 - see THRIFT-4687</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Ruby</td>
+            <td class="packman">Ruby Gem</td>
+            <td class="packurl"><a href="https://rubygems.org/gems/thrift">https://rubygems.org/gems/thrift</a></td>
+            <td class="ctrlfile">lib/rb/Gemfile</td>
+            <td class="maintainer">jfarrell</td>
+            <td class="remarks">stale at 0.11.0 - see THRIFT-4707</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Rust</td>
+            <td class="packman">Cargo</td>
+            <td class="packurl"><a href="https://crates.io/crates/thrift">https://crates.io/crates/thrift</a></td>
+            <td class="ctrlfile">lib/rs/cargo.toml</td>
+            <td class="maintainer">all thrift committers</td>
+            <td class="remarks"></td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Smalltalk</td>
+            <td class="packman"></td>
+            <td class="packurl"><a href=""></a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">no official ASF package available</td>
+        </tr>
+        
+        <tr class="">
+            <td class="language">Swift</td>
+            <td class="packman"></td>
+            <td class="packurl"><a href=""></a></td>
+            <td class="ctrlfile"></td>
+            <td class="maintainer"></td>
+            <td class="remarks">no official ASF package available</td>
+        </tr>
+        
+        </tbody>
+    </table>
+</div>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/java.html b/output/lib/java.html
new file mode 100644
index 0000000..22e875f
--- /dev/null
+++ b/output/lib/java.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Java library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="building-and-installing-from-source">Building and installing from source</h1>
+
+<p>When using a CMake build from the source distribution on Linux the
+easiest way to build and install is this simple command line:</p>
+
+<pre><code>make all &amp;&amp; sudo make install/fast
+</code></pre>
+
+<p>It is important to use the install/fast option to eliminate
+the automatic rebuild by dependency that causes issues because
+the build tooling is designed to work with cached files in the
+user home directory during the build process. Instead this builds
+the code in the expected local build tree and then uses CMake
+install code to copy to the target destination.</p>
+
+<h1 id="building-thrift-with-gradle-without-cmakeautoconf">Building Thrift with Gradle without CMake/Autoconf</h1>
+
+<p>The Thrift Java source is not build using the GNU tools, but rather uses
+the Gradle build system, which tends to be predominant amongst Java
+developers.</p>
+
+<p>To compile the Java Thrift libraries, simply do the following:</p>
+
+<pre><code>./gradlew
+</code></pre>
+
+<p>Yep, that&#8217;s easy. Look for libthrift-<version>.jar in the build/libs directory.</version></p>
+
+<p>The default build will run the unit tests which expect a usable
+Thrift compiler to exist on the system. You have two choices for
+that.</p>
+
+<ul>
+  <li>Build the Thrift executable from source at the default
+location in the source tree. The project is configured
+to look for it there.</li>
+  <li>
+    <p>Install the published binary distribution to have Thrift
+executable in a known location and add the path to the
+~/.gradle/gradle.properties file using the property name
+&#8220;thrift.compiler&#8221;. For example this would set the path in
+a Windows box if Thrift was installed under C:\Thrift</p>
+
+    <p>thrift.compiler=C:/Thrift/thrift.exe</p>
+  </li>
+</ul>
+
+<p>To just build the library without running unit tests you simply do this.</p>
+
+<pre><code>./gradlew assemble
+</code></pre>
+
+<p>To install the library in the local Maven repository location
+where other Maven or Gradle builds can reference it simply do this.</p>
+
+<pre><code>./gradlew install
+</code></pre>
+
+<p>The library will be placed in your home directory under .m2/repository</p>
+
+<p>To include Thrift in your applications simply add libthrift.jar to your
+classpath, or install if in your default system classpath of choice.</p>
+
+<p>Build Thrift behind a proxy:</p>
+
+<pre><code>./gradlew -Dhttp.proxyHost=myproxyhost -Dhttp.proxyPort=8080 -Dhttp.proxyUser=thriftuser -Dhttp.proxyPassword=topsecret
+</code></pre>
+
+<p>or via</p>
+
+<pre><code>./configure --with-java GRADLE_OPTS='-Dhttp.proxyHost=myproxyhost -Dhttp.proxyPort=8080 -Dhttp.proxyUser=thriftuser -Dhttp.proxyPassword=topsecret'
+</code></pre>
+
+<h1 id="unit-test-html-reports">Unit Test HTML Reports</h1>
+
+<p>The build will automatically generate an HTML Unit Test report. This can be found
+under build/reports/tests/test/index.html. It can be viewed with a browser
+directly from that location.</p>
+
+<h1 id="clover-code-coverage-for-thrift">Clover Code Coverage for Thrift</h1>
+
+<p>The build will optionally generate Clover Code coverage if the Gradle property
+<code>cloverEnabled=true</code> is set in ~/.gradle/gradle.properties or on the command line
+via <code>-PcloverEnabled=true</code>. The generated report can be found under the location
+build/reports/clover/html/index.html. It can be viewed with a browser
+directly from that location. Additionally, a PDF report is generated and is found
+under the location build/reports/clover/clover.pdf.</p>
+
+<p>The following command will build, unit test, and generate Clover reports:</p>
+
+<pre><code>./gradlew -PcloverEnabled=true
+</code></pre>
+
+<h1 id="publishing-maven-artifacts-to-maven-central">Publishing Maven Artifacts to Maven Central</h1>
+
+<p>The Automake build generates a Makefile that provides the correct parameters
+when you run the build provided the configure.ac has been set with the correct
+version number. The Gradle build will receive the correct value for the build.
+The same applies to the CMake build, the value from the configure.ac file will
+be used if you execute these commands:</p>
+
+<pre><code>make maven-publish   -- This is for an Automake Linux build
+make MavenPublish    -- This is for a CMake generated build
+</code></pre>
+
+<p>The uploadArchives task in Gradle is preconfigured with all necessary details
+to sign and publish the artifacts from the build to the Apache Maven staging
+repository. The task requires the following externally provided properties to
+authenticate to the repository and sign the artifacts. The preferred approach
+is to create or edit the ~/.gradle/gradle.properties file and add the following
+properties to it.</p>
+
+<pre><code># Signing key information for artifacts PGP signature (values are examples)
+signing.keyId=24875D73
+signing.password=secret
+signing.secretKeyRingFile=/Users/me/.gnupg/secring.gpg
+
+# Apache Maven staging repository user credentials
+mavenUser=meMyselfAndI
+mavenPassword=MySuperAwesomeSecretPassword
+</code></pre>
+
+<p>NOTE: If you do not have a secring.gpg file, see the
+<a href="https://docs.gradle.org/current/userguide/signing_plugin.html">gradle signing docs</a>
+for instructions on how to generate it.</p>
+
+<p>It is also possible to manually publish using the Gradle build directly.
+With the key information and credentials in place the following will generate
+if needed the build artifacts and proceed to publish the results.</p>
+
+<pre><code>./gradlew -Prelease=true uploadArchives
+</code></pre>
+
+<p>It is also possible to override the target repository for the Maven Publication
+by using a Gradle property, for example you can publish signed JAR files to your
+company internal server if you add this to the command line or in the
+~/.gradle/gradle.properties file. The URL below assumes a Nexus Repository.</p>
+
+<pre><code>maven-repository-url=https://my.company.com/service/local/staging/deploy/maven2
+</code></pre>
+
+<p>Or the same on the command line:</p>
+
+<pre><code>./gradlew -Pmaven-repository-url=https://my.company.com/service/local/staging/deploy/maven2 -Prelease=true -Pthrift.version=0.11.0 uploadArchives
+</code></pre>
+
+<h1 id="dependencies">Dependencies</h1>
+
+<p>Gradle
+http://gradle.org/</p>
+
+<h1 id="breaking-changes">Breaking Changes</h1>
+
+<h2 id="section">0.13.0</h2>
+
+<ul>
+  <li>
+    <p>The signature of the &#8216;process&#8217; method in TAsyncProcessor and TProcessor has
+changed to remove the boolean return type and instead rely on Exceptions.</p>
+  </li>
+  <li>
+    <p>Per THRIFT-4805, TSaslTransportException has been removed. The same condition
+is now covered by TTansportException, where <code>TTransportException.getType() == END_OF_FILE</code>.</p>
+  </li>
+</ul>
+
+<h2 id="section-1">0.12.0</h2>
+
+<p>The access modifier of the AutoExpandingBuffer class has been changed from
+public to default (package) and will no longer be accessible by third-party
+libraries.</p>
+
+<p>The access modifier of the ShortStack class has been changed from
+public to default (package) and will no longer be accessible by third-party
+libraries.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/java/README.md">lib/java/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/js.html b/output/lib/js.html
new file mode 100644
index 0000000..9426437
--- /dev/null
+++ b/output/lib/js.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - JavaScript library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="grunt-build">Grunt Build</h2>
+<p>This is the base directory for the Apache Thrift JavaScript
+library. This directory contains a Gruntfile.js and a
+package.json. Many of the build and test tools used here
+require a recent version of Node.js to be installed. To 
+install the support files for the Grunt build tool execute
+the command:</p>
+
+<pre><code>npm install
+</code></pre>
+
+<p>This reads the package.json and pulls in the appropriate
+sources from the internet. To build the JavaScript branch
+of Apache Thrift execute the command:</p>
+
+<pre><code>npx grunt
+</code></pre>
+
+<p>This runs the grunt build tool (from within <code>./node_modules/.bin/</code>),
+linting all of the source files, setting up and running the
+tests, concatenating and minifying the main libraries and
+generating the html documentation.</p>
+
+<h2 id="tree">Tree</h2>
+<p>The following directories are present (some only after the
+grunt build):
+  /src  - The JavaScript Apache Thrift source
+  /doc  - HTML documentation
+  /dist - Distribution files (thrift.js and thrift.min.js)
+  /test - Various tests, this is a good place to look for
+          example code
+  /node_modules - Build support files installed by npm</p>
+
+<h2 id="example-javascript-client-and-server">Example JavaScript Client and Server</h2>
+<p>The listing below demonstrates a simple browser based JavaScript
+Thrift client and Node.js JavaScript server for the hello_svc 
+service.</p>
+
+<h3 id="hellothrift---service-idl">hello.thrift - Service IDL</h3>
+<p>### build with: $ thrift -gen js -gen js:node hello.thrift
+    service hello_svc {
+      string get_message(1: string name)
+    }</p>
+
+<h3 id="hellohtml---browser-client">hello.html - Browser Client</h3>
+<pre><code>&lt;!DOCTYPE html&gt;
+&lt;html lang="en"&gt;
+  &lt;head&gt;
+    &lt;meta charset="utf-8"&gt;
+    &lt;title&gt;Hello Thrift&lt;/title&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    Name: &lt;input type="text" id="name_in"&gt;
+    &lt;input type="button" id="get_msg" value="Get Message" &gt;
+    &lt;div id="output"&gt;&lt;/div&gt;
+  
+    &lt;script src="thrift.js"&gt;&lt;/script&gt;
+    &lt;script src="gen-js/hello_svc.js"&gt;&lt;/script&gt;
+    &lt;script&gt;
+      (function() {
+        var transport = new Thrift.TXHRTransport("/hello");
+        var protocol  = new Thrift.TJSONProtocol(transport);
+        var client    = new hello_svcClient(protocol);
+        var nameElement = document.getElementById("name_in");
+        var outputElement = document.getElementById("output");
+        document.getElementById("get_msg")
+          .addEventListener("click", function(){
+            client.get_message(nameElement.value, function(result) {
+              outputElement.innerHTML = result;
+            });
+          });
+      })();
+    &lt;/script&gt;
+  &lt;/body&gt;
+&lt;/html&gt;
+</code></pre>
+
+<h3 id="hellojs---node-server">hello.js - Node Server</h3>
+<pre><code>var thrift = require('thrift');
+var hello_svc = require('./gen-nodejs/hello_svc.js');
+
+var hello_handler = {
+  get_message: function(name, result) {
+    var msg = "Hello " + name + "!";
+    result(null, msg);
+  }
+}
+
+var hello_svc_opt = {
+  transport: thrift.TBufferedTransport,
+  protocol: thrift.TJSONProtocol,
+  processor: hello_svc,
+  handler: hello_handler
+};
+
+var server_opt = {
+  staticFilePath: ".",
+  services: {
+    "/hello": hello_svc_opt
+  }
+}
+
+var server = Thrift.createWebServer(server_opt);
+var port = 9099;
+server.listen(port);
+console.log("Http/Thrift Server running on port: " + port);
+</code></pre>
+
+<h2 id="typescript">TypeScript</h2>
+<p>TypeScript definition files can also be generated by running:</p>
+
+<pre><code>thrift --gen js:ts file.thrift
+</code></pre>
+
+<h1 id="breaking-changes">Breaking Changes</h1>
+
+<h2 id="section">0.13.0</h2>
+
+<ol>
+  <li>64-bit integer constants are now generatd using node-int64 e.g.: var x = new Int64(&#8220;7fffffffffffffff&#8221;);</li>
+</ol>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/js/README.md">lib/js/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/netstd.html b/output/lib/netstd.html
new file mode 100644
index 0000000..22e9aee
--- /dev/null
+++ b/output/lib/netstd.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - .NET Standard library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="apache-thrift-netstd">Apache Thrift netstd</h1>
+
+<p>Thrift client library for Microsoft .NET Standard</p>
+
+<h1 id="build-the-library">Build the library</h1>
+
+<h2 id="how-to-build-on-windows">How to build on Windows</h2>
+<ul>
+  <li>Get Thrift IDL compiler executable, add to some folder and add path to this folder into PATH variable</li>
+  <li>Open the Thrift.sln project with Visual Studio and build.
+or</li>
+  <li>Build with scripts</li>
+</ul>
+
+<h2 id="how-to-build-on-unixlinux">How to build on Unix/Linux</h2>
+<ul>
+  <li>Ensure you have .NET Core SDK 3.1 (LTS) installed, or use the <a href="../../build/docker/README.md">Ubuntu docker image</a></li>
+  <li>Follow common automake build practice: <code>./ bootstrap &amp;&amp; ./ configure &amp;&amp; make</code></li>
+</ul>
+
+<h2 id="known-issues">Known issues</h2>
+<ul>
+  <li>In trace logging mode you can see some not important internal exceptions</li>
+</ul>
+
+<h1 id="migration-to-netstd">Migration to netstd</h1>
+
+<h2 id="from-netcore">&#8230; from netcore</h2>
+
+<p>If you are migrating your code from netcore library, you will have to:</p>
+
+<ul>
+  <li>Switch to <code>thrift -gen netstd</code></li>
+  <li>the following compiler flags are no longer needed or supported: <code>hashcode</code> is now standard, while <code>nullable</code> is no longer supported.</li>
+  <li>the <code>Thrift.Transport</code> and <code>Thrift.Protocol</code> namespaces now use the singular form</li>
+  <li>add <code>using Thrift.Processor;</code> in the server code where appropriate</li>
+  <li>rename all <code>T*ClientTransport</code> to <code>T*Transport</code></li>
+  <li>rename all <code>TBaseServer</code> occurrences in your code to <code>TServer</code></li>
+  <li>the <code>SingletonTProcessorFactory</code> is now called <code>TSingletonProcessorFactory</code></li>
+  <li>and the <code>AsyncBaseServer</code> is now the <code>TSimpleAsyncServer</code></li>
+</ul>
+
+<p>You may wonder why we changed so many names. The naming scheme has been revised for two reasons: First, we want to get back the established, well-known naming consistency across the Thrift libraries which the netcore library did not fully respect. Second, by achieving that first objective, we get the additional benefit of making migration at least a bit easier for C# projects.</p>
+
+<h2 id="from-csharp">&#8230; from csharp</h2>
+
+<p>Because of the different environment requirements, migration from C# takes slightly more efforts. While the code changes related to Thrift itself are moderate, you may need to upgrade certain dependencies, components or even modules to more recent versions.</p>
+
+<ol>
+  <li>Client and server applications must use at least framework 4.6.1, any version below will not work.</li>
+  <li>Switch to <code>thrift -gen netstd</code>. The following compiler flags are no longer needed or supported: <code>hashcode</code> and <code>async</code> are now standard, while <code>nullable</code> is no longer supported.</li>
+  <li><a href="https://msdn.microsoft.com/en-us/magazine/jj991977.aspx">Familiarize yourself with the <code>async/await</code> model</a>, if you have not already done so. As netstd does not support <code>ISync</code> anymore, async is mandatory. The synchronous model is simply no longer available (that&#8217;s also the reason why we don&#8217;t need the <code>async</code> flag anymore).</li>
+  <li>Consider proper use of <code>cancellationToken</code> parameters. They are optional but may be quite helpful.</li>
+  <li>As you probably already guessed, there are a few names that have been changed:
+- add <code>using Thrift.Processor;</code> in the server code where appropriate
+- the <code>TServerSocket</code> is now called <code>TServerSocketTransport</code>
+- change <code>IProtocolFactory</code> into <code>ITProtocolFactory</code>
+- if you are looking for <code>TSimpleServer</code>, try <code>TSimpleAsyncServer</code> instead
+- similarly, the <code>TThreadPoolServer</code> is now a <code>TThreadPoolAsyncServer</code> 
+- the server&#8217;s <code>Serve()</code> method does now <code>ServeAsync()</code>
+- In case you are using Thrift server event handlers: the <code>SetEventHandler</code> method now starts with an uppercase letter
+- and you will also have to revise the method names of all <code>TServerEventHandler</code> descendants you have in your code</li>
+</ol>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/netstd/README.md">lib/netstd/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/nodejs.html b/output/lib/nodejs.html
new file mode 100644
index 0000000..73be2c0
--- /dev/null
+++ b/output/lib/nodejs.html
@@ -0,0 +1,214 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - node.js library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h2 id="compatibility">Compatibility</h2>
+
+<p>node version 6 or later is required</p>
+
+<h2 id="install">Install</h2>
+
+<pre><code>npm install thrift 
+</code></pre>
+
+<h2 id="thrift-compiler">Thrift Compiler</h2>
+
+<p>You can compile IDL sources for Node.js with the following command:</p>
+
+<pre><code>thrift --gen js:node thrift_file
+</code></pre>
+
+<h2 id="cassandra-client-example">Cassandra Client Example:</h2>
+
+<p>Here is a Cassandra example:</p>
+
+<p>```js
+var thrift = require(&#8216;thrift&#8217;),
+    Cassandra = require(&#8216;./gen-nodejs/Cassandra&#8217;)
+    ttypes = require(&#8216;./gen-nodejs/cassandra_types&#8217;);</p>
+
+<p>var connection = thrift.createConnection(&#8220;localhost&#8221;, 9160),
+    client = thrift.createClient(Cassandra, connection);</p>
+
+<p>connection.on(&#8216;error&#8217;, function(err) {
+  console.error(err);
+});</p>
+
+<p>client.get_slice(&#8220;Keyspace&#8221;, &#8220;key&#8221;, new ttypes.ColumnParent({column_family: &#8220;ExampleCF&#8221;}), new ttypes.SlicePredicate({slice_range: new ttypes.SliceRange({start: &#8216;&#8217;, finish: &#8216;&#8217;})}), ttypes.ConsistencyLevel.ONE, function(err, data) {
+  if (err) {
+    // handle err
+  } else {
+    // data == [ttypes.ColumnOrSuperColumn, &#8230;]
+  }
+  connection.end();
+});
+```</p>
+
+<p><a name="int64"></a>
+## Int64</p>
+
+<p>Since JavaScript represents all numbers as doubles, int64 values cannot be accurately represented naturally. To solve this, int64 values in responses will be wrapped with Thrift.Int64 objects. The Int64 implementation used is <a href="https://github.com/broofa/node-int64">broofa/node-int64</a>.</p>
+
+<h2 id="client-and-server-examples">Client and server examples</h2>
+
+<p>Several example clients and servers are included in the thrift/lib/nodejs/examples folder and the cross language tutorial thrift/tutorial/nodejs folder.</p>
+
+<h2 id="use-on-browsers">Use on browsers</h2>
+
+<p>You can use code generated with js:node on browsers with Webpack. Here is an example.</p>
+
+<p>thrift &#8211;gen js:node,ts,es6,with_ns</p>
+
+<p>```javascript
+import * as thrift from &#8216;thrift&#8217;;
+import { MyServiceClient } from &#8216;../gen-nodejs/MyService&#8217;;</p>
+
+<p>let host = window.location.hostname;
+let port = 443;
+let opts = {
+  transport: thrift.TBufferedTransport,
+  protocol: thrift.TJSONProtocol, 
+    headers: {
+     &#8216;Content-Type&#8217;: &#8216;application/vnd.apache.thrift.json&#8217;,
+    },
+    https: true,
+    path: &#8216;/url/path&#8217;,
+    useCORS: true,
+};</p>
+
+<p>let connection = thrift.createXHRConnection(host, port, opts);
+let thriftClient = thrift.createXHRClient(MyServiceClient, connection);</p>
+
+<p>connection.on(&#8216;error&#8217;, (err) =&gt; {
+  console.error(err);
+});</p>
+
+<p>thriftClient.myService(param)
+  .then((result) =&gt; {
+    console.log(result);
+  })
+  .catch((err) =&gt; {
+    &#8230;.
+  });
+```</p>
+
+<p>Bundlers, like webpack, will use thrift/browser.js by default because of the 
+<code>"browser": "./lib/nodejs/lib/thrift/browser.js"</code> field in package.json.</p>
+
+<h3 id="browser-example-with-websocket-bufferedtransport-and-binaryprotocol">Browser example with WebSocket, BufferedTransport and BinaryProtocol</h3>
+<p>```javascript
+import thrift from &#8216;thrift&#8217;;
+import { MyServiceClient } from &#8216;../gen-nodejs/MyService&#8217;;</p>
+
+<p>const host = window.location.hostname;
+const port = 9090;
+const opts = {
+  transport: thrift.TBufferedTransport,
+  protocol: thrift.TBinaryProtocol
+}
+const connection = thrift.createWSConnection(host, port, opts);
+connection.open();
+const thriftClient = thrift.createWSClient(MyServiceClient, connection);</p>
+
+<p>connection.on(&#8216;error&#8217;, (err) =&gt; {
+  console.error(err);
+});</p>
+
+<p>thriftClient.myService(param)
+  .then((result) =&gt; {
+    console.log(result);
+  })
+  .catch((err) =&gt; {
+    &#8230;.
+  });
+```</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/nodejs/README.md">lib/nodejs/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/ocaml.html b/output/lib/ocaml.html
new file mode 100644
index 0000000..58bf0f1
--- /dev/null
+++ b/output/lib/ocaml.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - OCaml library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="library">Library</h1>
+
+<p>The library abstract classes, exceptions, and general use functions
+are mostly jammed in Thrift.ml (an exception being
+TServer).</p>
+
+<p>Generally, classes are used, however they are often put in their own
+module along with other relevant types and functions. The classes
+often called t, exceptions are called E.</p>
+
+<p>Implementations live in their own files. There is TBinaryProtocol,
+TSocket, TThreadedServer, TSimpleServer, and TServerSocket.</p>
+
+<p>A note on making the library: Running make should create native, debug
+code libraries, and a toplevel.</p>
+
+<h2 id="struct-format">Struct format</h2>
+<p>Structs are turned into classes. The fields are all option types and
+are initially None. Write is a method, but reading is done by a
+separate function (since there is no such thing as a static
+class). The class type is t and is in a module with the name of the
+struct.</p>
+
+<h2 id="enum-format">enum format</h2>
+<p>Enums are put in their own module along with
+functions to_i and of_i which convert the ocaml types into ints. For
+example:</p>
+
+<p>enum Numberz
+{
+  ONE = 1,
+  TWO,
+  THREE,
+  FIVE = 5,
+  SIX,
+  EIGHT = 8
+}</p>
+
+<p>==&gt;</p>
+
+<p>module Numberz =
+struct
+type t =
+| ONE
+| TWO
+| THREE
+| FIVE
+| SIX
+| EIGHT</p>
+
+<p>let of_i = &#8230;
+let to_i = &#8230;
+end</p>
+
+<h2 id="typedef-format">typedef format</h2>
+<p>Typedef turns into the type declaration:
+typedef i64 UserId</p>
+
+<p>==&gt;</p>
+
+<p>type userid Int64.t</p>
+
+<h2 id="exception-format">exception format</h2>
+<p>The same as structs except that the module also has an exception type
+E of t that is raised/caught.</p>
+
+<p>For example, with an exception Xception,
+raise (Xception.E (new Xception.t))
+and
+try
+  &#8230;
+with Xception.E e -&gt; &#8230;</p>
+
+<h2 id="list-format">list format</h2>
+<p>Lists are turned into OCaml native lists.</p>
+
+<h2 id="mapset-formats">Map/Set formats</h2>
+<p>These are both turned into Hashtbl.t&#8217;s. Set values are bool.</p>
+
+<h2 id="services">Services</h2>
+<p>The client is a class &#8220;client&#8221; parametrized on input and output
+protocols. The processor is a class parametrized on a handler. A
+handler is a class inheriting the iface abstract class. Unlike other
+implementations, client does not implement iface since iface functions
+must take option arguments so as to deal with the case where a client
+does not send all the arguments.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/ocaml/README.md">lib/ocaml/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/perl.html b/output/lib/perl.html
new file mode 100644
index 0000000..73fc4ba
--- /dev/null
+++ b/output/lib/perl.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Perl library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-perl">Using Thrift with Perl</h1>
+
+<p>Thrift requires Perl &gt;= 5.10.0</p>
+
+<p>Unexpected exceptions in a service handler are converted to
+TApplicationException with type INTERNAL ERROR and the string
+of the exception is delivered as the message.</p>
+
+<p>On the client side, exceptions are thrown with die, so be sure
+to wrap eval{} statments around any code that contains exceptions.</p>
+
+<p>Please see tutoral and test dirs for examples.</p>
+
+<p>The Perl ForkingServer ignores SIGCHLD allowing the forks to be
+reaped by the operating system naturally when they exit.  This means
+one cannot use a custom SIGCHLD handler in the consuming perl
+implementation that calls serve().  It is acceptable to use
+a custom SIGCHLD handler within a thrift handler implementation
+as the ForkingServer resets the forked child process to use
+default signal handling.</p>
+
+<h1 id="dependencies">Dependencies</h1>
+
+<p>The following modules are not provided by Perl 5.10.0 but are required
+to use Thrift.</p>
+
+<h2 id="runtime">Runtime</h2>
+
+<ul>
+  <li>Bit::Vector</li>
+  <li>Class::Accessor</li>
+</ul>
+
+<h2 id="test">Test</h2>
+
+<p>This is only required when running tests:</p>
+
+<ul>
+  <li>Test::Exception</li>
+</ul>
+
+<h3 id="httpclient-transport">HttpClient Transport</h3>
+
+<p>These are only required if using Thrift::HttpClient:</p>
+
+<ul>
+  <li>HTTP::Request</li>
+  <li>IO::String</li>
+  <li>LWP::UserAgent</li>
+</ul>
+
+<h3 id="ssltls">SSL/TLS</h3>
+
+<p>These are only required if using Thrift::SSLSocket or Thrift::SSLServerSocket:</p>
+
+<ul>
+  <li>IO::Socket::SSL</li>
+</ul>
+
+<h1 id="breaking-changes">Breaking Changes</h1>
+
+<h2 id="section">0.10.0</h2>
+
+<p>The socket classes were refactored in 0.10.0 so that there is one package per
+file.  This means <code>use Socket;</code> no longer defines SSLSocket.  You can use this
+technique to make your application run against 0.10.0 as well as earlier versions:</p>
+
+<p><code>eval { require Thrift::SSLSocket; } or do { require Thrift::Socket; }</code></p>
+
+<h2 id="section-1">0.11.0</h2>
+
+<ul>
+  <li>Namespaces of packages that were not scoped within Thrift have been fixed.
+  ** TApplicationException is now Thrift::TApplicationException
+  ** TException is now Thrift::TException
+  ** TMessageType is now Thrift::TMessageType
+  ** TProtocolException is now Thrift::TProtocolException
+  ** TProtocolFactory is now Thrift::TProtocolFactory
+  ** TTransportException is now Thrift::TTransportException
+  ** TType is now Thrift::TType</li>
+</ul>
+
+<p>If you need a single version of your code to work with both older and newer thrift
+namespace changes, you can make the new, correct namespaces behave like the old ones
+in your files with this technique to create an alias, which will allow you code to
+run against either version of the perl runtime for thrift:</p>
+
+<p><code>BEGIN {*TType:: = *Thrift::TType::}</code></p>
+
+<ul>
+  <li>Packages found in Thrift.pm were moved into the Thrift/ directory in separate files:
+  ** Thrift::TApplicationException is now in Thrift/Exception.pm
+  ** Thrift::TException is now in Thrift/Exception.pm
+  ** Thrift::TMessageType is now in Thrift/MessageType.pm
+  ** Thrift::TType is now in Thrift/Type.pm</li>
+</ul>
+
+<p>If you need to modify your code to work against both older or newer thrift versions,
+you can deal with these changes in a backwards compatible way in your projects using eval:</p>
+
+<p><code>eval  { require Thrift::Exception; require Thrift::MessageType; require Thrift::Type; }
+ or do { require Thrift; }</code></p>
+
+<h1 id="deprecations">Deprecations</h1>
+
+<h2 id="section-2">0.11.0</h2>
+
+<p>Thrift::HttpClient setRecvTimeout() and setSendTimeout() are deprecated. 
+Use setTimeout instead.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/perl/README.md">lib/perl/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/php.html b/output/lib/php.html
new file mode 100644
index 0000000..b5faf9e
--- /dev/null
+++ b/output/lib/php.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - PHP library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-php">Using Thrift with PHP</h1>
+
+<p>Thrift requires PHP 5. Thrift makes as few assumptions about your PHP
+environment as possible while trying to make some more advanced PHP
+features (i.e. APCu cacheing using asbolute path URLs) as simple as possible.</p>
+
+<p>To use Thrift in your PHP codebase, take the following steps:</p>
+
+<ol>
+  <li>Copy all of thrift/lib/php/lib into your PHP codebase</li>
+  <li>Configure Symfony Autoloader (or whatever you usually use)</li>
+</ol>
+
+<p>After that, you have to manually include the Thrift package
+created by the compiler:</p>
+
+<p><code>
+require_once 'packages/Service/Service.php';
+require_once 'packages/Service/Types.php';
+</code></p>
+
+<h1 id="dependencies">Dependencies</h1>
+
+<p>PHP_INT_SIZE</p>
+
+<pre><code>This built-in signals whether your architecture is 32 or 64 bit and is
+used by the TBinaryProtocol to properly use pack() and unpack() to
+serialize data.
+</code></pre>
+
+<p>apcu_fetch(), apcu_store()</p>
+
+<pre><code>APCu cache is used by the TSocketPool class. If you do not have APCu installed,
+Thrift will fill in null stub function definitions.
+</code></pre>
+
+<h1 id="breaking-changes">Breaking Changes</h1>
+
+<h2 id="section">0.12.0</h2>
+
+<ol>
+  <li>
+    <p><a href="https://www.php-fig.org/psr/psr-4/">PSR-4</a> loader is now the default. If you want to use class maps instead, use <code>-gen php:classmap</code>.</p>
+  </li>
+  <li>
+    <p>If using PSR-4, use <code>$thriftClassLoader-&gt;registerNamespace('namespace', '&lt;path&gt;')</code> instead of <code>$thriftClassLoader-&gt;registerDefinition('namespace', '&lt;path&gt;')</code>.</p>
+  </li>
+</ol>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/php/README.md">lib/php/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/py.html b/output/lib/py.html
new file mode 100644
index 0000000..9855264
--- /dev/null
+++ b/output/lib/py.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Python library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="using-thrift-with-python">Using Thrift with Python</h1>
+
+<p>Thrift is provided as a set of Python packages. The top level package is
+thrift, and there are subpackages for the protocol, transport, and server
+code. Each package contains modules using standard Thrift naming conventions
+(i.e. TProtocol, TTransport) and implementations in corresponding modules
+(i.e. TSocket).  There is also a subpackage reflection, which contains
+the generated code for the reflection structures.</p>
+
+<p>The Python libraries can be installed manually using the provided setup.py
+file, or automatically using the install hook provided via autoconf/automake.
+To use the latter, become superuser and do make install.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/py/README.md">lib/py/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/rb.html b/output/lib/rb.html
new file mode 100644
index 0000000..7db54e9
--- /dev/null
+++ b/output/lib/rb.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Ruby library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<p>== DESCRIPTION:</p>
+
+<p>Thrift is a strongly-typed language-agnostic RPC system.
+This library is the ruby implementation for both clients and servers.</p>
+
+<p>== INSTALL:</p>
+
+<p>$ gem install thrift</p>
+
+<p>== CAVEATS:</p>
+
+<p>This library provides the client and server implementations of thrift.
+It does <em>not</em> provide the compiler for the .thrift files. To compile
+.thrift files into language-specific implementations, please download the full
+thrift software package.</p>
+
+<p>== USAGE:</p>
+
+<p>This section should get written by someone with the time and inclination.
+In the meantime, look at existing code, such as the benchmark or the tutorial
+in the full thrift distribution.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/rb/README.md">lib/rb/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/lib/st.html b/output/lib/st.html
new file mode 100644
index 0000000..cf659b1
--- /dev/null
+++ b/output/lib/st.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - SmallTalk library</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="library">Library</h1>
+
+<p>To get started, just file in thrift.st with Squeak, run thrift -st
+on the tutorial .thrift files (and file in the resulting code), and
+then:</p>
+
+<p>calc := CalculatorClient binaryOnHost: &#8216;localhost&#8217; port: &#8216;9090&#8217;
+calc addNum1: 10 num2: 15</p>
+
+<p>Tested in Squeak 3.7, but should work fine with anything later.</p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=lib/st/README.md">lib/st/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/mailing.html b/output/mailing.html
new file mode 100644
index 0000000..ff00ec2
--- /dev/null
+++ b/output/mailing.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Mailing Lists</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <p>In accordance with the principles of the Apache Software Foundation, Thrift encourages a collaborative and community-based development environment.</p>
+
+<p>All project discussion is carried out publicly, on the following archived lists.</p>
+
+<hr />
+
+<h3 id="user-mailing-list">User Mailing List</h3>
+<p>If you use Apache Thrift, please subscribe to the Thrift user mailing list. This list is for questions about Thrift and announcements from the team relevant to all users</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td><a href="mailto:user-subscribe@thrift.apache.org">Subscribe</a></td>
+      <td><a href="mailto:user-unsubscribe@thrift.apache.org">Unsubscribe</a></td>
+      <td><a href="http://mail-archives.apache.org/mod_mbox/thrift-user">View Archives</a></td>
+      <td><a href="http://mail-archives.apache.org/mod_mbox/incubator-thrift-user">View Archives (Incubator)</a></td>
+    </tr>
+  </tbody>
+</table>
+
+<hr />
+
+<h3 id="developers-mailing-list">Developers Mailing List</h3>
+<p>If you would like to contribute to Apache Thrift, subscribe to the Thrift developer mailing list.</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td><a href="mailto:dev-subscribe@thrift.apache.org">Subscribe</a></td>
+      <td><a href="mailto:dev-unsubscribe@thrift.apache.org">Unsubscribe</a></td>
+      <td><a href="http://mail-archives.apache.org/mod_mbox/thrift-dev">View Archives</a></td>
+      <td><a href="http://mail-archives.apache.org/mod_mbox/incubator-thrift-dev">View Archives (Incubator)</a></td>
+    </tr>
+  </tbody>
+</table>
+
+<hr />
+
+<h3 id="commits-mailing-list">Commits Mailing List</h3>
+<p>This list receives notifications about all code changes made to Apache Thrift.</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td><a href="mailto:commits-subscribe@thrift.apache.org">Subscribe</a></td>
+      <td><a href="mailto:commits-unsubscribe@thrift.apache.org">Unsubscribe</a></td>
+      <td><a href="http://mail-archives.apache.org/mod_mbox/thrift-commits">View Archives</a></td>
+      <td><a href="http://mail-archives.apache.org/mod_mbox/incubator-thrift-commits">View Archives (Incubator)</a></td>
+    </tr>
+  </tbody>
+</table>
+
+<hr />
+
+<p>Note: subscription is required to post to all lists.</p>
+
+<h3 id="irc">IRC</h3>
+<p>Many of the Apache Thrift developers and community members hang out in the #thrift channel on irc.freenode.net.</p>
+
+<p>If you are new to IRC, you can use a client such as <a href="http://www.xchat.org">xchat</a> or <a href="http://www.irssi.org">Irssi</a> or a <a href="http://webchat.freenode.net/?channels=#thrift">web-based client</a>.</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/sitemap.html b/output/sitemap.html
new file mode 100644
index 0000000..88a67aa
--- /dev/null
+++ b/output/sitemap.html
@@ -0,0 +1,374 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Sitemap</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <ul>
+
+
+  <li><a href="/docs/committers/AdditionalReading.html">General articles and links for committers</a></li>
+
+
+
+  <li><a href="/docs/BuildingFromSource.html">Building From Source</a></li>
+
+
+
+  <li><a href="/docs/committers/HowToCommit.html">How To Commit</a></li>
+
+
+
+  <li><a href="/docs/HowToContribute.html">How To Contribute</a></li>
+
+
+
+  <li><a href="/docs/HowToNewLanguage.html">How to add new language bindings</a></li>
+
+
+
+  <li><a href="/docs/committers/HowToThriftWebsite.html">How to update the website</a></li>
+
+
+
+  <li><a href="/docs/Languages.html">Language and Feature Matrix</a></li>
+
+
+
+  <li><a href="/docs/committers/ReleaseManagement.html">Release Management</a></li>
+
+
+
+  <li><a href="/test/ThriftTest.thrift">ThriftTest</a></li>
+
+
+
+  <li><a href="/about.html">About</a></li>
+
+
+
+  <li><a href="/tutorial/as3.html">Actionscript 3.0</a></li>
+
+
+
+  <li><a href="/lib/c_glib.html">C GLib</a></li>
+
+
+
+  <li><a href="/tutorial/c_glib.html">c_glib</a></li>
+
+
+
+  <li><a href="/docs/install/centos.html">Centos 6.5 Install</a></li>
+
+
+
+  <li><a href="/lib/cl.html">Common Lisp Library README</a></li>
+
+
+
+  <li><a href="/docs/coding_standards.html">Coding standards</a></li>
+
+
+
+  <li><a href="/docs/concepts.html">Concepts</a></li>
+
+
+
+  <li><a href="/lib/cpp.html">C++ library</a></li>
+
+
+
+  <li><a href="/tutorial/cpp.html">C++</a></li>
+
+
+
+  <li><a href="/lib/csharp.html">C# library</a></li>
+
+
+
+  <li><a href="/tutorial/csharp.html">CSharp</a></li>
+
+
+
+  <li><a href="/lib/d.html">D library</a></li>
+
+
+
+  <li><a href="/tutorial/d.html">D</a></li>
+
+
+
+  <li><a href="/tutorial/dart.html">Dart</a></li>
+
+
+
+  <li><a href="/docs/install/debian.html">Debian/Ubuntu install</a></li>
+
+
+
+  <li><a href="/lib/delphi.html">Delphi library</a></li>
+
+
+
+  <li><a href="/tutorial/delphi.html">Delphi</a></li>
+
+
+
+  <li><a href="/developers.html">Developers</a></li>
+
+
+
+  <li><a href="/download.html">Download</a></li>
+
+
+
+  <li><a href="/lib/erl.html">Erlang library</a></li>
+
+
+
+  <li><a href="/docs/features.html">Features</a></li>
+
+
+
+  <li><a href="/lib/go.html">Go library</a></li>
+
+
+
+  <li><a href="/tutorial/go.html">Go</a></li>
+
+
+
+  <li><a href="/tutorial/graphviz.html">Graphviz</a></li>
+
+
+
+  <li><a href="/lib/haxe.html">Haxe library</a></li>
+
+
+
+  <li><a href="/tutorial/haxe.html">Haxe Framework</a></li>
+
+
+
+  <li><a href="/lib/hs.html">Haskell library</a></li>
+
+
+
+  <li><a href="/tutorial/hs.html">Haskell</a></li>
+
+
+
+  <li><a href="/docs/idl.html">Interface Description Language (IDL)</a></li>
+
+
+
+  <li><a href="/docs/committers/">Index of committers/</a></li>
+
+
+
+  <li><a href="/docs/install/">Index of install/</a></li>
+
+
+
+  <li><a href="/docs/">Documentation</a></li>
+
+
+
+  <li><a href="/lib/">Library</a></li>
+
+
+
+  <li><a href="/test/">Test Suite</a></li>
+
+
+
+  <li><a href="/tutorial/">Index of tutorial/</a></li>
+
+
+
+  <li><a href="/">Home</a></li>
+
+
+
+  <li><a href="/lib/java.html">Java library</a></li>
+
+
+
+  <li><a href="/tutorial/java.html">Java</a></li>
+
+
+
+  <li><a href="/lib/js.html">JavaScript library</a></li>
+
+
+
+  <li><a href="/tutorial/js.html">Javascript</a></li>
+
+
+
+  <li><a href="/test/keys.html">Keys</a></li>
+
+
+
+  <li><a href="/mailing.html">Mailing Lists</a></li>
+
+
+
+  <li><a href="/lib/netstd.html">.NET Standard library</a></li>
+
+
+
+  <li><a href="/tutorial/netstd.html">.NET Standard</a></li>
+
+
+
+  <li><a href="/lib/nodejs.html">node.js library</a></li>
+
+
+
+  <li><a href="/tutorial/nodejs.html">Node.js</a></li>
+
+
+
+  <li><a href="/lib/ocaml.html">OCaml library</a></li>
+
+
+
+  <li><a href="/tutorial/ocaml.html">OCaml</a></li>
+
+
+
+  <li><a href="/docs/install/os_x.html">OS X Install</a></li>
+
+
+
+  <li><a href="/lib/perl.html">Perl library</a></li>
+
+
+
+  <li><a href="/tutorial/perl.html">Perl</a></li>
+
+
+
+  <li><a href="/lib/php.html">PHP library</a></li>
+
+
+
+  <li><a href="/tutorial/php.html">PHP</a></li>
+
+
+
+  <li><a href="/lib/py.html">Python library</a></li>
+
+
+
+  <li><a href="/tutorial/py.html">Python</a></li>
+
+
+
+  <li><a href="/lib/rb.html">Ruby library</a></li>
+
+
+
+  <li><a href="/tutorial/rb.html">Ruby</a></li>
+
+
+
+
+
+  <li><a href="/lib/st.html">SmallTalk library</a></li>
+
+
+
+  <li><a href="/docs/types.html">Thrift Type system</a></li>
+
+
+
+  <li><a href="/docs/install/windows.html">Windows Install</a></li>
+
+
+</ul>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/static/css/alerts.css b/output/static/css/alerts.css
new file mode 100644
index 0000000..99bc123
--- /dev/null
+++ b/output/static/css/alerts.css
@@ -0,0 +1,70 @@
+// ALERT STYLES
+// ------------
+
+// Base alert styles
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: @baseLineHeight;
+  text-shadow: 0 1px 0 rgba(255,255,255,.5);
+  background-color: @warningBackground;
+  border: 1px solid @warningBorder;
+  .border-radius(4px);
+}
+.alert,
+.alert-heading {
+  color: @warningText;
+}
+
+// Adjust close link position
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 18px;
+}
+
+// Alternate styles
+// ----------------
+
+.alert-success {
+  background-color: @successBackground;
+  border-color: @successBorder;
+}
+.alert-success,
+.alert-success .alert-heading {
+  color: @successText;
+}
+.alert-danger,
+.alert-error {
+  background-color: @errorBackground;
+  border-color: @errorBorder;
+}
+.alert-danger,
+.alert-error,
+.alert-danger .alert-heading,
+.alert-error .alert-heading {
+  color: @errorText;
+}
+.alert-info {
+  background-color: @infoBackground;
+  border-color: @infoBorder;
+}
+.alert-info,
+.alert-info .alert-heading {
+  color: @infoText;
+}
+
+
+// Block alerts
+// ------------------------
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+.alert-block p + p {
+  margin-top: 5px;
+}
diff --git a/output/static/css/bootstrap.css b/output/static/css/bootstrap.css
new file mode 100644
index 0000000..bf7f658
--- /dev/null
+++ b/output/static/css/bootstrap.css
@@ -0,0 +1,3404 @@
+/*!
+ * Bootstrap v2.0.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+audio:not([controls]) {
+  display: none;
+}
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+a:hover,
+a:active {
+  outline: 0;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+img {
+  max-width: 100%;
+  height: auto;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+input[type="search"] {
+  -webkit-appearance: textfield;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+.clearfix {
+  *zoom: 1;
+}
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  content: "";
+}
+.clearfix:after {
+  clear: both;
+}
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  line-height: 18px;
+  color: #333333;
+  background-color: #ffffff;
+}
+a {
+  color: #0088cc;
+  text-decoration: none;
+}
+a:hover {
+  color: #005580;
+  text-decoration: underline;
+}
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+.row:before,
+.row:after {
+  display: table;
+  content: "";
+}
+.row:after {
+  clear: both;
+}
+[class*="span"] {
+  float: left;
+  margin-left: 20px;
+}
+.span1 {
+  width: 60px;
+}
+.span2 {
+  width: 140px;
+}
+.span3 {
+  width: 220px;
+}
+.span4 {
+  width: 300px;
+}
+.span5 {
+  width: 380px;
+}
+.span6 {
+  width: 460px;
+}
+.span7 {
+  width: 540px;
+}
+.span8 {
+  width: 620px;
+}
+.span9 {
+  width: 700px;
+}
+.span10 {
+  width: 780px;
+}
+.span11 {
+  width: 860px;
+}
+.span12,
+.container {
+  width: 940px;
+}
+.offset1 {
+  margin-left: 100px;
+}
+.offset2 {
+  margin-left: 180px;
+}
+.offset3 {
+  margin-left: 260px;
+}
+.offset4 {
+  margin-left: 340px;
+}
+.offset5 {
+  margin-left: 420px;
+}
+.offset6 {
+  margin-left: 500px;
+}
+.offset7 {
+  margin-left: 580px;
+}
+.offset8 {
+  margin-left: 660px;
+}
+.offset9 {
+  margin-left: 740px;
+}
+.offset10 {
+  margin-left: 820px;
+}
+.offset11 {
+  margin-left: 900px;
+}
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  content: "";
+}
+.row-fluid:after {
+  clear: both;
+}
+.row-fluid > [class*="span"] {
+  float: left;
+  margin-left: 2.12765957%;
+}
+.row-fluid > [class*="span"]:first-child {
+  margin-left: 0;
+}
+.row-fluid > .span1 {
+  width: 6.38297872%;
+}
+.row-fluid > .span2 {
+  width: 14.89361702%;
+}
+.row-fluid > .span3 {
+  width: 23.40425532%;
+}
+.row-fluid > .span4 {
+  width: 31.91489361%;
+}
+.row-fluid > .span5 {
+  width: 40.42553191%;
+}
+.row-fluid > .span6 {
+  width: 48.93617021%;
+}
+.row-fluid > .span7 {
+  width: 57.44680851%;
+}
+.row-fluid > .span8 {
+  width: 65.9574468%;
+}
+.row-fluid > .span9 {
+  width: 74.4680851%;
+}
+.row-fluid > .span10 {
+  width: 82.9787234%;
+}
+.row-fluid > .span11 {
+  width: 91.48936169%;
+}
+.row-fluid > .span12 {
+  width: 99.99999999%;
+}
+.container {
+  width: 940px;
+  margin-left: auto;
+  margin-right: auto;
+  *zoom: 1;
+}
+.container:before,
+.container:after {
+  display: table;
+  content: "";
+}
+.container:after {
+  clear: both;
+}
+.container-fluid {
+  padding-left: 20px;
+  padding-right: 20px;
+  *zoom: 1;
+}
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  content: "";
+}
+.container-fluid:after {
+  clear: both;
+}
+p {
+  margin: 0 0 9px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  line-height: 18px;
+}
+p small {
+  font-size: 11px;
+  color: #999999;
+}
+.lead {
+  margin-bottom: 18px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 27px;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 0;
+  font-weight: bold;
+  color: #333333;
+  text-rendering: optimizelegibility;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  color: #999999;
+}
+h1 {
+  font-size: 30px;
+  line-height: 36px;
+}
+h1 small {
+  font-size: 18px;
+}
+h2 {
+  font-size: 24px;
+  line-height: 36px;
+}
+h2 small {
+  font-size: 18px;
+}
+h3 {
+  line-height: 27px;
+  font-size: 18px;
+}
+h3 small {
+  font-size: 14px;
+}
+h4,
+h5,
+h6 {
+  line-height: 18px;
+}
+h4 {
+  font-size: 14px;
+}
+h4 small {
+  font-size: 12px;
+}
+h5 {
+  font-size: 12px;
+}
+h6 {
+  font-size: 11px;
+  color: #999999;
+  text-transform: uppercase;
+}
+.page-header {
+  padding-bottom: 17px;
+  margin: 18px 0;
+  border-bottom: 1px solid #eeeeee;
+}
+.page-header h1 {
+  line-height: 1;
+}
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 9px 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+ul {
+  list-style: disc;
+}
+ol {
+  list-style: decimal;
+}
+li {
+  line-height: 18px;
+}
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+dl {
+  margin-bottom: 18px;
+}
+dt,
+dd {
+  line-height: 18px;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 9px;
+}
+hr {
+  margin: 18px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+strong {
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+}
+.muted {
+  color: #999999;
+}
+abbr {
+  font-size: 90%;
+  text-transform: uppercase;
+  border-bottom: 1px dotted #ddd;
+  cursor: help;
+}
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 18px;
+  border-left: 5px solid #eeeeee;
+}
+blockquote p {
+  margin-bottom: 0;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 22.5px;
+}
+blockquote small {
+  display: block;
+  line-height: 18px;
+  color: #999999;
+}
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+blockquote.pull-right {
+  float: right;
+  padding-left: 0;
+  padding-right: 15px;
+  border-left: 0;
+  border-right: 5px solid #eeeeee;
+}
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+address {
+  display: block;
+  margin-bottom: 18px;
+  line-height: 18px;
+  font-style: normal;
+}
+small {
+  font-size: 100%;
+}
+cite {
+  font-style: normal;
+}
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Menlo, Monaco, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+code {
+  padding: 3px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+pre {
+  display: block;
+  padding: 8.5px;
+  margin: 0 0 9px;
+  font-size: 12px;
+  line-height: 18px;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  white-space: pre;
+  white-space: pre-wrap;
+  word-break: break-all;
+  word-wrap: break-word;
+}
+pre.prettyprint {
+  margin-bottom: 18px;
+}
+pre code {
+  padding: 0;
+  color: inherit;
+  background-color: transparent;
+  border: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+form {
+  margin: 0 0 18px;
+}
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 27px;
+  font-size: 19.5px;
+  line-height: 36px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #eee;
+}
+legend small {
+  font-size: 13.5px;
+  color: #999999;
+}
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 18px;
+}
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+label {
+  display: block;
+  margin-bottom: 5px;
+  color: #333333;
+}
+input,
+textarea,
+select,
+.uneditable-input {
+  display: inline-block;
+  width: 210px;
+  height: 18px;
+  padding: 4px;
+  margin-bottom: 9px;
+  font-size: 13px;
+  line-height: 18px;
+  color: #555555;
+  border: 1px solid #ccc;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+label input,
+label textarea,
+label select {
+  display: block;
+}
+input[type="image"],
+input[type="checkbox"],
+input[type="radio"] {
+  width: auto;
+  height: auto;
+  padding: 0;
+  margin: 3px 0;
+  *margin-top: 0;
+  /* IE7 */
+  line-height: normal;
+  cursor: pointer;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+  border: 0 \9;
+  /* IE9 and down */
+}
+input[type="image"] {
+  border: 0;
+}
+input[type="file"] {
+  width: auto;
+  padding: initial;
+  line-height: initial;
+  border: initial;
+  background-color: #ffffff;
+  background-color: initial;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  width: auto;
+  height: auto;
+}
+select,
+input[type="file"] {
+  height: 28px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+  line-height: 28px;
+}
+input[type="file"] {
+  line-height: 18px \9;
+}
+select {
+  width: 220px;
+  background-color: #ffffff;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="image"] {
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+textarea {
+  height: auto;
+}
+input[type="hidden"] {
+  display: none;
+}
+.radio,
+.checkbox {
+  padding-left: 18px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+input,
+textarea {
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+  transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+input:focus,
+textarea:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus,
+select:focus {
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.input-mini {
+  width: 60px;
+}
+.input-small {
+  width: 90px;
+}
+.input-medium {
+  width: 150px;
+}
+.input-large {
+  width: 210px;
+}
+.input-xlarge {
+  width: 270px;
+}
+.input-xxlarge {
+  width: 530px;
+}
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input {
+  float: none;
+  margin-left: 0;
+}
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 50px;
+}
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 130px;
+}
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 210px;
+}
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 290px;
+}
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 370px;
+}
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 450px;
+}
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 530px;
+}
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 610px;
+}
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 690px;
+}
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 770px;
+}
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 850px;
+}
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 930px;
+}
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  background-color: #f5f5f5;
+  border-color: #ddd;
+  cursor: not-allowed;
+}
+.control-group.warning > label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+  border-color: #c09853;
+}
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: 0 0 6px #dbc59e;
+  -moz-box-shadow: 0 0 6px #dbc59e;
+  box-shadow: 0 0 6px #dbc59e;
+}
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+.control-group.error > label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+  border-color: #b94a48;
+}
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: 0 0 6px #d59392;
+  -moz-box-shadow: 0 0 6px #d59392;
+  box-shadow: 0 0 6px #d59392;
+}
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+.control-group.success > label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+  border-color: #468847;
+}
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: 0 0 6px #7aba7b;
+  -moz-box-shadow: 0 0 6px #7aba7b;
+  box-shadow: 0 0 6px #7aba7b;
+}
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+input:focus:required:invalid:focus,
+textarea:focus:required:invalid:focus,
+select:focus:required:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+.form-actions {
+  padding: 17px 20px 18px;
+  margin-top: 18px;
+  margin-bottom: 18px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+}
+.uneditable-input {
+  display: block;
+  background-color: #ffffff;
+  border-color: #eee;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  cursor: not-allowed;
+}
+:-moz-placeholder {
+  color: #999999;
+}
+::-webkit-input-placeholder {
+  color: #999999;
+}
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 0;
+  color: #999999;
+}
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+  *zoom: 1;
+  margin-bottom: 9px;
+  vertical-align: middle;
+  padding-left: 5px;
+}
+.input-prepend,
+.input-append {
+  margin-bottom: 5px;
+  *zoom: 1;
+}
+.input-prepend:before,
+.input-append:before,
+.input-prepend:after,
+.input-append:after {
+  display: table;
+  content: "";
+}
+.input-prepend:after,
+.input-append:after {
+  clear: both;
+}
+.input-prepend input,
+.input-append input,
+.input-prepend .uneditable-input,
+.input-append .uneditable-input {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-prepend input:focus,
+.input-append input:focus,
+.input-prepend .uneditable-input:focus,
+.input-append .uneditable-input:focus {
+  position: relative;
+  z-index: 2;
+}
+.input-prepend .uneditable-input,
+.input-append .uneditable-input {
+  border-left-color: #ccc;
+}
+.input-prepend .add-on,
+.input-append .add-on {
+  float: left;
+  display: block;
+  width: auto;
+  min-width: 16px;
+  height: 18px;
+  margin-right: -1px;
+  padding: 4px 5px;
+  font-weight: normal;
+  line-height: 18px;
+  color: #999999;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-prepend .active,
+.input-append .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+.input-prepend .add-on {
+  *margin-top: 1px;
+  /* IE6-7 */
+}
+.input-append input,
+.input-append .uneditable-input {
+  float: left;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-append .uneditable-input {
+  border-left-color: #eee;
+  border-right-color: #ccc;
+}
+.input-append .add-on {
+  margin-right: 0;
+  margin-left: -1px;
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-append input:first-child {
+  *margin-left: -160px;
+}
+.input-append input:first-child + .add-on {
+  *margin-left: -21px;
+}
+.search-query {
+  padding-left: 14px;
+  padding-right: 14px;
+  margin-bottom: 0;
+  -webkit-border-radius: 14px;
+  -moz-border-radius: 14px;
+  border-radius: 14px;
+}
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input {
+  display: inline-block;
+  margin-bottom: 0;
+}
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+.form-search label,
+.form-inline label,
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  display: inline-block;
+}
+.form-search .input-append .add-on,
+.form-inline .input-prepend .add-on,
+.form-search .input-append .add-on,
+.form-inline .input-prepend .add-on {
+  vertical-align: middle;
+}
+.form-search .radio,
+.form-inline .radio,
+.form-search .checkbox,
+.form-inline .checkbox {
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.control-group {
+  margin-bottom: 9px;
+}
+legend + .control-group {
+  margin-top: 18px;
+  -webkit-margin-top-collapse: separate;
+}
+.form-horizontal .control-group {
+  margin-bottom: 18px;
+  *zoom: 1;
+}
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  content: "";
+}
+.form-horizontal .control-group:after {
+  clear: both;
+}
+.form-horizontal .control-label {
+  float: left;
+  width: 140px;
+  padding-top: 5px;
+  text-align: right;
+}
+.form-horizontal .controls {
+  margin-left: 160px;
+}
+.form-horizontal .form-actions {
+  padding-left: 160px;
+}
+table {
+  max-width: 100%;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+.table {
+  width: 100%;
+  margin-bottom: 18px;
+}
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 18px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #ddd;
+}
+.table th {
+  font-weight: bold;
+}
+.table thead th {
+  vertical-align: bottom;
+}
+.table thead:first-child tr th,
+.table thead:first-child tr td {
+  border-top: 0;
+}
+.table tbody + tbody {
+  border-top: 2px solid #ddd;
+}
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+.table-bordered {
+  border: 1px solid #ddd;
+  border-collapse: separate;
+  *border-collapse: collapsed;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.table-bordered th + th,
+.table-bordered td + td,
+.table-bordered th + td,
+.table-bordered td + th {
+  border-left: 1px solid #ddd;
+}
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  -webkit-border-radius: 4px 0 0 0;
+  -moz-border-radius: 4px 0 0 0;
+  border-radius: 4px 0 0 0;
+}
+.table-bordered thead:first-child tr:first-child th:last-child,
+.table-bordered tbody:first-child tr:first-child td:last-child {
+  -webkit-border-radius: 0 4px 0 0;
+  -moz-border-radius: 0 4px 0 0;
+  border-radius: 0 4px 0 0;
+}
+.table-bordered thead:last-child tr:last-child th:first-child,
+.table-bordered tbody:last-child tr:last-child td:first-child {
+  -webkit-border-radius: 0 0 0 4px;
+  -moz-border-radius: 0 0 0 4px;
+  border-radius: 0 0 0 4px;
+}
+.table-bordered thead:last-child tr:last-child th:last-child,
+.table-bordered tbody:last-child tr:last-child td:last-child {
+  -webkit-border-radius: 0 0 4px 0;
+  -moz-border-radius: 0 0 4px 0;
+  border-radius: 0 0 4px 0;
+}
+.table-striped tbody tr:nth-child(odd) td,
+.table-striped tbody tr:nth-child(odd) th {
+  background-color: #f9f9f9;
+}
+.table tbody tr:hover td,
+.table tbody tr:hover th {
+  background-color: #f5f5f5;
+}
+table .span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+table .span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+table .span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+table .span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+table .span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+table .span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+table .span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+table .span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+table .span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+table .span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+table .span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+table .span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+  *margin-right: .3em;
+}
+[class^="icon-"]:last-child,
+[class*=" icon-"]:last-child {
+  *margin-left: 0;
+}
+.icon-white {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+.icon-glass {
+  background-position: 0      0;
+}
+.icon-music {
+  background-position: -24px 0;
+}
+.icon-search {
+  background-position: -48px 0;
+}
+.icon-envelope {
+  background-position: -72px 0;
+}
+.icon-heart {
+  background-position: -96px 0;
+}
+.icon-star {
+  background-position: -120px 0;
+}
+.icon-star-empty {
+  background-position: -144px 0;
+}
+.icon-user {
+  background-position: -168px 0;
+}
+.icon-film {
+  background-position: -192px 0;
+}
+.icon-th-large {
+  background-position: -216px 0;
+}
+.icon-th {
+  background-position: -240px 0;
+}
+.icon-th-list {
+  background-position: -264px 0;
+}
+.icon-ok {
+  background-position: -288px 0;
+}
+.icon-remove {
+  background-position: -312px 0;
+}
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+.icon-off {
+  background-position: -384px 0;
+}
+.icon-signal {
+  background-position: -408px 0;
+}
+.icon-cog {
+  background-position: -432px 0;
+}
+.icon-trash {
+  background-position: -456px 0;
+}
+.icon-home {
+  background-position: 0 -24px;
+}
+.icon-file {
+  background-position: -24px -24px;
+}
+.icon-time {
+  background-position: -48px -24px;
+}
+.icon-road {
+  background-position: -72px -24px;
+}
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+.icon-download {
+  background-position: -120px -24px;
+}
+.icon-upload {
+  background-position: -144px -24px;
+}
+.icon-inbox {
+  background-position: -168px -24px;
+}
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+.icon-repeat {
+  background-position: -216px -24px;
+}
+.icon-refresh {
+  background-position: -240px -24px;
+}
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+.icon-lock {
+  background-position: -287px -24px;
+}
+.icon-flag {
+  background-position: -312px -24px;
+}
+.icon-headphones {
+  background-position: -336px -24px;
+}
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+.icon-barcode {
+  background-position: -456px -24px;
+}
+.icon-tag {
+  background-position: 0 -48px;
+}
+.icon-tags {
+  background-position: -25px -48px;
+}
+.icon-book {
+  background-position: -48px -48px;
+}
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+.icon-print {
+  background-position: -96px -48px;
+}
+.icon-camera {
+  background-position: -120px -48px;
+}
+.icon-font {
+  background-position: -144px -48px;
+}
+.icon-bold {
+  background-position: -167px -48px;
+}
+.icon-italic {
+  background-position: -192px -48px;
+}
+.icon-text-height {
+  background-position: -216px -48px;
+}
+.icon-text-width {
+  background-position: -240px -48px;
+}
+.icon-align-left {
+  background-position: -264px -48px;
+}
+.icon-align-center {
+  background-position: -288px -48px;
+}
+.icon-align-right {
+  background-position: -312px -48px;
+}
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+.icon-list {
+  background-position: -360px -48px;
+}
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+.icon-picture {
+  background-position: -456px -48px;
+}
+.icon-pencil {
+  background-position: 0 -72px;
+}
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+.icon-adjust {
+  background-position: -48px -72px;
+}
+.icon-tint {
+  background-position: -72px -72px;
+}
+.icon-edit {
+  background-position: -96px -72px;
+}
+.icon-share {
+  background-position: -120px -72px;
+}
+.icon-check {
+  background-position: -144px -72px;
+}
+.icon-move {
+  background-position: -168px -72px;
+}
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+.icon-backward {
+  background-position: -240px -72px;
+}
+.icon-play {
+  background-position: -264px -72px;
+}
+.icon-pause {
+  background-position: -288px -72px;
+}
+.icon-stop {
+  background-position: -312px -72px;
+}
+.icon-forward {
+  background-position: -336px -72px;
+}
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+.icon-eject {
+  background-position: -408px -72px;
+}
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+.icon-plus {
+  background-position: -408px -96px;
+}
+.icon-minus {
+  background-position: -433px -96px;
+}
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+.icon-gift {
+  background-position: -24px -120px;
+}
+.icon-leaf {
+  background-position: -48px -120px;
+}
+.icon-fire {
+  background-position: -72px -120px;
+}
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+.icon-plane {
+  background-position: -168px -120px;
+}
+.icon-calendar {
+  background-position: -192px -120px;
+}
+.icon-random {
+  background-position: -216px -120px;
+}
+.icon-comment {
+  background-position: -240px -120px;
+}
+.icon-magnet {
+  background-position: -264px -120px;
+}
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+.icon-retweet {
+  background-position: -336px -120px;
+}
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+.icon-folder-close {
+  background-position: -384px -120px;
+}
+.icon-folder-open {
+  background-position: -408px -120px;
+}
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  text-indent: -99999px;
+  *text-indent: 0;
+  vertical-align: top;
+  border-left: 4px solid transparent;
+  border-right: 4px solid transparent;
+  border-top: 4px solid #000000;
+  opacity: 0.3;
+  filter: alpha(opacity=30);
+  content: "\2193";
+}
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+.dropdown:hover .caret,
+.open.dropdown .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  float: left;
+  display: none;
+  min-width: 160px;
+  _width: 160px;
+  padding: 4px 0;
+  margin: 0;
+  list-style: none;
+  background-color: #ffffff;
+  border-color: #ccc;
+  border-color: rgba(0, 0, 0, 0.2);
+  border-style: solid;
+  border-width: 1px;
+  -webkit-border-radius: 0 0 5px 5px;
+  -moz-border-radius: 0 0 5px 5px;
+  border-radius: 0 0 5px 5px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+}
+.dropdown-menu.bottom-up {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 5px 1px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+  *width: 100%;
+  *margin: -5px 0 5px;
+}
+.dropdown-menu a {
+  display: block;
+  padding: 3px 15px;
+  clear: both;
+  font-weight: normal;
+  line-height: 18px;
+  color: #555555;
+  white-space: nowrap;
+}
+.dropdown-menu li > a:hover,
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0088cc;
+}
+.dropdown.open {
+  *z-index: 1000;
+}
+.dropdown.open .dropdown-toggle {
+  color: #ffffff;
+  background: #ccc;
+  background: rgba(0, 0, 0, 0.3);
+}
+.dropdown.open .dropdown-menu {
+  display: block;
+}
+.typeahead {
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #eee;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+.fade {
+  -webkit-transition: opacity 0.15s linear;
+  -moz-transition: opacity 0.15s linear;
+  -ms-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear;
+  opacity: 0;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  -webkit-transition: height 0.35s ease;
+  -moz-transition: height 0.35s ease;
+  -ms-transition: height 0.35s ease;
+  -o-transition: height 0.35s ease;
+  transition: height 0.35s ease;
+  position: relative;
+  overflow: hidden;
+  height: 0;
+}
+.collapse.in {
+  height: auto;
+}
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 18px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+.close:hover {
+  color: #000000;
+  text-decoration: none;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+  cursor: pointer;
+}
+.btn {
+  display: inline-block;
+  padding: 4px 10px 4px;
+  margin-bottom: 0;
+  font-size: 13px;
+  line-height: 18px;
+  color: #333333;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  background-color: #f5f5f5;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(top, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border: 1px solid #ccc;
+  border-bottom-color: #bbb;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  cursor: pointer;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  *margin-left: .3em;
+}
+.btn:hover,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  background-color: #e6e6e6;
+}
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+.btn:first-child {
+  *margin-left: 0;
+}
+.btn:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: #e6e6e6;
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+  -moz-transition: background-position 0.1s linear;
+  -ms-transition: background-position 0.1s linear;
+  -o-transition: background-position 0.1s linear;
+  transition: background-position 0.1s linear;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn.active,
+.btn:active {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  background-color: #e6e6e6;
+  background-color: #d9d9d9 \9;
+  outline: 0;
+}
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-image: none;
+  background-color: #e6e6e6;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.btn-large {
+  padding: 9px 14px;
+  font-size: 15px;
+  line-height: normal;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.btn-large [class^="icon-"] {
+  margin-top: 1px;
+}
+.btn-small {
+  padding: 5px 9px;
+  font-size: 11px;
+  line-height: 16px;
+}
+.btn-small [class^="icon-"] {
+  margin-top: -1px;
+}
+.btn-mini {
+  padding: 2px 6px;
+  font-size: 11px;
+  line-height: 14px;
+}
+.btn-primary,
+.btn-primary:hover,
+.btn-warning,
+.btn-warning:hover,
+.btn-danger,
+.btn-danger:hover,
+.btn-success,
+.btn-success:hover,
+.btn-info,
+.btn-info:hover,
+.btn-inverse,
+.btn-inverse:hover {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  color: #ffffff;
+}
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-dark.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+.btn-primary {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(top, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  background-color: #0044cc;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #003399 \9;
+}
+.btn-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -ms-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(top, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  background-color: #f89406;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+.btn-danger {
+  background-color: #da4f49;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(top, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  background-color: #bd362f;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+.btn-success {
+  background-color: #5bb75b;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -ms-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(top, #62c462, #51a351);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  background-color: #51a351;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+.btn-info {
+  background-color: #49afcd;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(top, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  background-color: #2f96b4;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+.btn-inverse {
+  background-color: #393939;
+  background-image: -moz-linear-gradient(top, #454545, #262626);
+  background-image: -ms-linear-gradient(top, #454545, #262626);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626));
+  background-image: -webkit-linear-gradient(top, #454545, #262626);
+  background-image: -o-linear-gradient(top, #454545, #262626);
+  background-image: linear-gradient(top, #454545, #262626);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0);
+  border-color: #262626 #262626 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-inverse:hover,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  background-color: #262626;
+}
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #0c0c0c \9;
+}
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 2px;
+  *padding-bottom: 2px;
+}
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button.btn.large,
+input[type="submit"].btn.large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+button.btn.small,
+input[type="submit"].btn.small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+.btn-group {
+  position: relative;
+  *zoom: 1;
+  *margin-left: .3em;
+}
+.btn-group:before,
+.btn-group:after {
+  display: table;
+  content: "";
+}
+.btn-group:after {
+  clear: both;
+}
+.btn-group:first-child {
+  *margin-left: 0;
+}
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-toolbar {
+  margin-top: 9px;
+  margin-bottom: 9px;
+}
+.btn-toolbar .btn-group {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+  *zoom: 1;
+}
+.btn-group .btn {
+  position: relative;
+  float: left;
+  margin-left: -1px;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-group .btn:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+  border-top-left-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  border-bottom-left-radius: 4px;
+}
+.btn-group .btn:last-child,
+.btn-group .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  border-bottom-right-radius: 4px;
+}
+.btn-group .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 6px;
+  -moz-border-radius-topleft: 6px;
+  border-top-left-radius: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  border-bottom-left-radius: 6px;
+}
+.btn-group .btn.large:last-child,
+.btn-group .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+  -moz-border-radius-bottomright: 6px;
+  border-bottom-right-radius: 6px;
+}
+.btn-group .btn:hover,
+.btn-group .btn:focus,
+.btn-group .btn:active,
+.btn-group .btn.active {
+  z-index: 2;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  *padding-top: 5px;
+  *padding-bottom: 5px;
+}
+.btn-group.open {
+  *z-index: 1000;
+}
+.btn-group.open .dropdown-menu {
+  display: block;
+  margin-top: 1px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.btn .caret {
+  margin-top: 7px;
+  margin-left: 0;
+}
+.btn:hover .caret,
+.open.btn-group .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.btn-primary .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+.btn-small .caret {
+  margin-top: 4px;
+}
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 18px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.alert,
+.alert-heading {
+  color: #c09853;
+}
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 18px;
+}
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.alert-success,
+.alert-success .alert-heading {
+  color: #468847;
+}
+.alert-danger,
+.alert-error {
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+.alert-danger,
+.alert-error,
+.alert-danger .alert-heading,
+.alert-error .alert-heading {
+  color: #b94a48;
+}
+.alert-info {
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.alert-info,
+.alert-info .alert-heading {
+  color: #3a87ad;
+}
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+.alert-block p + p {
+  margin-top: 5px;
+}
+.nav {
+  margin-left: 0;
+  margin-bottom: 18px;
+  list-style: none;
+}
+.nav > li > a {
+  display: block;
+}
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.nav .nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 18px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+.nav-list {
+  padding-left: 14px;
+  padding-right: 14px;
+  margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-left: -15px;
+  margin-right: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+.nav-list .active > a,
+.nav-list .active > a:hover {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0088cc;
+}
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  content: "";
+}
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  padding-top: 9px;
+  padding-bottom: 9px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: #555555;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.nav-pills .active > a,
+.nav-pills .active > a:hover {
+  color: #ffffff;
+  background-color: #0088cc;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.nav-tabs.nav-stacked > li > a:hover {
+  border-color: #ddd;
+  z-index: 2;
+}
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+.nav-tabs .dropdown-menu,
+.nav-pills .dropdown-menu {
+  margin-top: 1px;
+  border-width: 1px;
+}
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.nav-tabs .dropdown-toggle .caret,
+.nav-pills .dropdown-toggle .caret {
+  border-top-color: #0088cc;
+  margin-top: 6px;
+}
+.nav-tabs .dropdown-toggle:hover .caret,
+.nav-pills .dropdown-toggle:hover .caret {
+  border-top-color: #005580;
+}
+.nav-tabs .active .dropdown-toggle .caret,
+.nav-pills .active .dropdown-toggle .caret {
+  border-top-color: #333333;
+}
+.nav > .dropdown.active > a:hover {
+  color: #000000;
+  cursor: pointer;
+}
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > .open.active > a:hover {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+.nav .open .caret,
+.nav .open.active .caret,
+.nav .open a:hover .caret {
+  border-top-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.tabs-stacked .open > a:hover {
+  border-color: #999999;
+}
+.tabbable {
+  *zoom: 1;
+}
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  content: "";
+}
+.tabbable:after {
+  clear: both;
+}
+.tab-content {
+  overflow: hidden;
+}
+.tabs-below .nav-tabs,
+.tabs-right .nav-tabs,
+.tabs-left .nav-tabs {
+  border-bottom: 0;
+}
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+.tabs-below .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+.tabs-below .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+.tabs-below .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.tabs-below .nav-tabs > li > a:hover {
+  border-bottom-color: transparent;
+  border-top-color: #ddd;
+}
+.tabs-below .nav-tabs .active > a,
+.tabs-below .nav-tabs .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+.tabs-left .nav-tabs > li,
+.tabs-right .nav-tabs > li {
+  float: none;
+}
+.tabs-left .nav-tabs > li > a,
+.tabs-right .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+.tabs-left .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+.tabs-left .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+  -moz-border-radius: 4px 0 0 4px;
+  border-radius: 4px 0 0 4px;
+}
+.tabs-left .nav-tabs > li > a:hover {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+.tabs-left .nav-tabs .active > a,
+.tabs-left .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+.tabs-right .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+.tabs-right .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+  -moz-border-radius: 0 4px 4px 0;
+  border-radius: 0 4px 4px 0;
+}
+.tabs-right .nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+.tabs-right .nav-tabs .active > a,
+.tabs-right .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+.navbar {
+  overflow: visible;
+  margin-bottom: 18px;
+}
+.navbar-inner {
+  padding-left: 20px;
+  padding-right: 20px;
+  background-color: #2c2c2c;
+  background-image: -moz-linear-gradient(top, #333333, #222222);
+  background-image: -ms-linear-gradient(top, #333333, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));
+  background-image: -webkit-linear-gradient(top, #333333, #222222);
+  background-image: -o-linear-gradient(top, #333333, #222222);
+  background-image: linear-gradient(top, #333333, #222222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+}
+.btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-left: 5px;
+  margin-right: 5px;
+  background-color: #2c2c2c;
+  background-image: -moz-linear-gradient(top, #333333, #222222);
+  background-image: -ms-linear-gradient(top, #333333, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));
+  background-image: -webkit-linear-gradient(top, #333333, #222222);
+  background-image: -o-linear-gradient(top, #333333, #222222);
+  background-image: linear-gradient(top, #333333, #222222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+.btn-navbar:hover,
+.btn-navbar:active,
+.btn-navbar.active,
+.btn-navbar.disabled,
+.btn-navbar[disabled] {
+  background-color: #222222;
+}
+.btn-navbar:active,
+.btn-navbar.active {
+  background-color: #080808 \9;
+}
+.btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+.nav-collapse.collapse {
+  height: auto;
+}
+.navbar .brand:hover {
+  text-decoration: none;
+}
+.navbar .brand {
+  float: left;
+  display: block;
+  padding: 8px 20px 12px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 1;
+  color: #ffffff;
+}
+.navbar .navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+  color: #999999;
+}
+.navbar .navbar-text a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 5px;
+}
+.navbar .btn-group .btn {
+  margin-top: 0;
+}
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  content: "";
+}
+.navbar-form:after {
+  clear: both;
+}
+.navbar-form input,
+.navbar-form select {
+  display: inline-block;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 6px;
+  white-space: nowrap;
+}
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 6px;
+  margin-bottom: 0;
+}
+.navbar-search .search-query {
+  padding: 4px 9px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  color: #ffffff;
+  color: rgba(255, 255, 255, 0.75);
+  background: #666;
+  background: rgba(255, 255, 255, 0.3);
+  border: 1px solid #111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+  -moz-transition: none;
+  -ms-transition: none;
+  -o-transition: none;
+  transition: none;
+}
+.navbar-search .search-query :-moz-placeholder {
+  color: #eeeeee;
+}
+.navbar-search .search-query ::-webkit-input-placeholder {
+  color: #eeeeee;
+}
+.navbar-search .search-query:hover {
+  color: #ffffff;
+  background-color: #999999;
+  background-color: rgba(255, 255, 255, 0.5);
+}
+.navbar-search .search-query:focus,
+.navbar-search .search-query.focused {
+  padding: 5px 10px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  outline: 0;
+}
+.navbar-fixed-top {
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+.navbar-fixed-top .navbar-inner {
+  padding-left: 0;
+  padding-right: 0;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+  float: right;
+}
+.navbar .nav > li {
+  display: block;
+  float: left;
+}
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 10px 11px;
+  line-height: 19px;
+  color: #999999;
+  text-decoration: none;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar .nav > li > a:hover {
+  background-color: transparent;
+  color: #ffffff;
+  text-decoration: none;
+}
+.navbar .nav .active > a,
+.navbar .nav .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #222222;
+}
+.navbar .divider-vertical {
+  height: 40px;
+  width: 1px;
+  margin: 0 9px;
+  overflow: hidden;
+  background-color: #222222;
+  border-right: 1px solid #333333;
+}
+.navbar .nav.pull-right {
+  margin-left: 10px;
+  margin-right: 0;
+}
+.navbar .dropdown-menu {
+  margin-top: 1px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.navbar .dropdown-menu:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+  top: -7px;
+  left: 9px;
+}
+.navbar .dropdown-menu:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  position: absolute;
+  top: -6px;
+  left: 10px;
+}
+.navbar .nav .dropdown-toggle .caret,
+.navbar .nav .open.dropdown .caret {
+  border-top-color: #ffffff;
+}
+.navbar .nav .active .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.navbar .nav .open > .dropdown-toggle,
+.navbar .nav .active > .dropdown-toggle,
+.navbar .nav .open.active > .dropdown-toggle {
+  background-color: transparent;
+}
+.navbar .nav .active > .dropdown-toggle:hover {
+  color: #ffffff;
+}
+.navbar .nav.pull-right .dropdown-menu {
+  left: auto;
+  right: 0;
+}
+.navbar .nav.pull-right .dropdown-menu:before {
+  left: auto;
+  right: 12px;
+}
+.navbar .nav.pull-right .dropdown-menu:after {
+  left: auto;
+  right: 13px;
+}
+.breadcrumb {
+  padding: 7px 14px;
+  margin: 0 0 18px;
+  background-color: #fbfbfb;
+  background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
+  background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
+  background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
+  background-image: linear-gradient(top, #ffffff, #f5f5f5);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
+  border: 1px solid #ddd;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+  -moz-box-shadow: inset 0 1px 0 #ffffff;
+  box-shadow: inset 0 1px 0 #ffffff;
+}
+.breadcrumb li {
+  display: inline-block;
+  text-shadow: 0 1px 0 #ffffff;
+}
+.breadcrumb .divider {
+  padding: 0 5px;
+  color: #999999;
+}
+.breadcrumb .active a {
+  color: #333333;
+}
+.pagination {
+  height: 36px;
+  margin: 18px 0;
+}
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+  *zoom: 1;
+  margin-left: 0;
+  margin-bottom: 0;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.pagination li {
+  display: inline;
+}
+.pagination a {
+  float: left;
+  padding: 0 14px;
+  line-height: 34px;
+  text-decoration: none;
+  border: 1px solid #ddd;
+  border-left-width: 0;
+}
+.pagination a:hover,
+.pagination .active a {
+  background-color: #f5f5f5;
+}
+.pagination .active a {
+  color: #999999;
+  cursor: default;
+}
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: #999999;
+  background-color: transparent;
+  cursor: default;
+}
+.pagination li:first-child a {
+  border-left-width: 1px;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.pagination li:last-child a {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.pagination-centered {
+  text-align: center;
+}
+.pagination-right {
+  text-align: right;
+}
+.pager {
+  margin-left: 0;
+  margin-bottom: 18px;
+  list-style: none;
+  text-align: center;
+  *zoom: 1;
+}
+.pager:before,
+.pager:after {
+  display: table;
+  content: "";
+}
+.pager:after {
+  clear: both;
+}
+.pager li {
+  display: inline;
+}
+.pager a {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+}
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.pager .next a {
+  float: right;
+}
+.pager .previous a {
+  float: left;
+}
+.modal-open .dropdown-menu {
+  z-index: 2050;
+}
+.modal-open .dropdown.open {
+  *z-index: 2050;
+}
+.modal-open .popover {
+  z-index: 2060;
+}
+.modal-open .tooltip {
+  z-index: 2070;
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+.modal-backdrop.fade {
+  opacity: 0;
+}
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: 1050;
+  max-height: 500px;
+  overflow: auto;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  /* IE6-7 */
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding-box;
+  background-clip: padding-box;
+}
+.modal.fade {
+  -webkit-transition: opacity .3s linear, top .3s ease-out;
+  -moz-transition: opacity .3s linear, top .3s ease-out;
+  -ms-transition: opacity .3s linear, top .3s ease-out;
+  -o-transition: opacity .3s linear, top .3s ease-out;
+  transition: opacity .3s linear, top .3s ease-out;
+  top: -25%;
+}
+.modal.fade.in {
+  top: 50%;
+}
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+.modal-header .close {
+  margin-top: 2px;
+}
+.modal-body {
+  padding: 15px;
+}
+.modal-body .modal-form {
+  margin-bottom: 0;
+}
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+  -moz-border-radius: 0 0 6px 6px;
+  border-radius: 0 0 6px 6px;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+  -moz-box-shadow: inset 0 1px 0 #ffffff;
+  box-shadow: inset 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: "";
+}
+.modal-footer:after {
+  clear: both;
+}
+.modal-footer .btn {
+  float: right;
+  margin-left: 5px;
+  margin-bottom: 0;
+}
+.tooltip {
+  position: absolute;
+  z-index: 1020;
+  display: block;
+  visibility: visible;
+  padding: 5px;
+  font-size: 11px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+.tooltip.top {
+  margin-top: -2px;
+}
+.tooltip.right {
+  margin-left: 2px;
+}
+.tooltip.bottom {
+  margin-top: 2px;
+}
+.tooltip.left {
+  margin-left: -2px;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-top: 5px solid #000000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-top: 5px solid transparent;
+  border-bottom: 5px solid transparent;
+  border-left: 5px solid #000000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-bottom: 5px solid #000000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-top: 5px solid transparent;
+  border-bottom: 5px solid transparent;
+  border-right: 5px solid #000000;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  padding: 5px;
+}
+.popover.top {
+  margin-top: -5px;
+}
+.popover.right {
+  margin-left: 5px;
+}
+.popover.bottom {
+  margin-top: 5px;
+}
+.popover.left {
+  margin-left: -5px;
+}
+.popover.top .arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-top: 5px solid #000000;
+}
+.popover.right .arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-top: 5px solid transparent;
+  border-bottom: 5px solid transparent;
+  border-right: 5px solid #000000;
+}
+.popover.bottom .arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-bottom: 5px solid #000000;
+}
+.popover.left .arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-top: 5px solid transparent;
+  border-bottom: 5px solid transparent;
+  border-left: 5px solid #000000;
+}
+.popover .arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+}
+.popover-inner {
+  padding: 3px;
+  width: 280px;
+  overflow: hidden;
+  background: #000000;
+  background: rgba(0, 0, 0, 0.8);
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+}
+.popover-title {
+  padding: 9px 15px;
+  line-height: 1;
+  background-color: #f5f5f5;
+  border-bottom: 1px solid #eee;
+  -webkit-border-radius: 3px 3px 0 0;
+  -moz-border-radius: 3px 3px 0 0;
+  border-radius: 3px 3px 0 0;
+}
+.popover-content {
+  padding: 14px;
+  background-color: #ffffff;
+  -webkit-border-radius: 0 0 3px 3px;
+  -moz-border-radius: 0 0 3px 3px;
+  border-radius: 0 0 3px 3px;
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding-box;
+  background-clip: padding-box;
+}
+.popover-content p,
+.popover-content ul,
+.popover-content ol {
+  margin-bottom: 0;
+}
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  content: "";
+}
+.thumbnails:after {
+  clear: both;
+}
+.thumbnails > li {
+  float: left;
+  margin: 0 0 18px 20px;
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 1;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+a.thumbnail:hover {
+  border-color: #0088cc;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-left: auto;
+  margin-right: auto;
+}
+.thumbnail .caption {
+  padding: 9px;
+}
+.label {
+  padding: 2px 4px 3px;
+  font-size: 11.05px;
+  font-weight: bold;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #999999;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.label:hover {
+  color: #ffffff;
+  text-decoration: none;
+}
+.label-important {
+  background-color: #b94a48;
+}
+.label-important:hover {
+  background-color: #953b39;
+}
+.label-warning {
+  background-color: #f89406;
+}
+.label-warning:hover {
+  background-color: #c67605;
+}
+.label-success {
+  background-color: #468847;
+}
+.label-success:hover {
+  background-color: #356635;
+}
+.label-info {
+  background-color: #3a87ad;
+}
+.label-info:hover {
+  background-color: #2d6987;
+}
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  letter-spacing: -1px;
+}
+.hero-unit p {
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 27px;
+}
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.hide {
+  display: none;
+}
+.show {
+  display: block;
+}
+.invisible {
+  visibility: hidden;
+}
diff --git a/output/static/css/breadcrumbs.css b/output/static/css/breadcrumbs.css
new file mode 100644
index 0000000..39060ba
--- /dev/null
+++ b/output/static/css/breadcrumbs.css
@@ -0,0 +1,22 @@
+// BREADCRUMBS
+// -----------
+
+.breadcrumb {
+  padding: 7px 14px;
+  margin: 0 0 @baseLineHeight;
+  #gradient > .vertical(@white, #f5f5f5);
+  border: 1px solid #ddd;
+  .border-radius(3px);
+  .box-shadow(inset 0 1px 0 @white);
+  li {
+    display: inline-block;
+    text-shadow: 0 1px 0 @white;
+  }
+  .divider {
+    padding: 0 5px;
+    color: @grayLight;
+  }
+  .active a {
+    color: @grayDark;
+  }
+}
diff --git a/output/static/css/button-groups.css b/output/static/css/button-groups.css
new file mode 100644
index 0000000..a04220a
--- /dev/null
+++ b/output/static/css/button-groups.css
@@ -0,0 +1,148 @@
+// BUTTON GROUPS
+// -------------
+
+
+// Make the div behave like a button
+.btn-group {
+  position: relative;
+  .clearfix(); // clears the floated buttons
+  .ie7-restore-left-whitespace();
+}
+
+// Space out series of button groups
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+// Optional: Group multiple button groups together for a toolbar
+.btn-toolbar {
+  margin-top: @baseLineHeight / 2;
+  margin-bottom: @baseLineHeight / 2;
+  .btn-group {
+    display: inline-block;
+    .ie7-inline-block();
+  }
+}
+
+// Float them, remove border radius, then re-add to first and last elements
+.btn-group .btn {
+  position: relative;
+  float: left;
+  margin-left: -1px;
+  .border-radius(0);
+}
+// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
+.btn-group .btn:first-child {
+  margin-left: 0;
+     -webkit-border-top-left-radius: 4px;
+         -moz-border-radius-topleft: 4px;
+             border-top-left-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+      -moz-border-radius-bottomleft: 4px;
+          border-bottom-left-radius: 4px;
+}
+.btn-group .btn:last-child,
+.btn-group .dropdown-toggle {
+     -webkit-border-top-right-radius: 4px;
+         -moz-border-radius-topright: 4px;
+             border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+      -moz-border-radius-bottomright: 4px;
+          border-bottom-right-radius: 4px;
+}
+// Reset corners for large buttons
+.btn-group .btn.large:first-child {
+  margin-left: 0;
+     -webkit-border-top-left-radius: 6px;
+         -moz-border-radius-topleft: 6px;
+             border-top-left-radius: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+      -moz-border-radius-bottomleft: 6px;
+          border-bottom-left-radius: 6px;
+}
+.btn-group .btn.large:last-child,
+.btn-group .large.dropdown-toggle {
+     -webkit-border-top-right-radius: 6px;
+         -moz-border-radius-topright: 6px;
+             border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+      -moz-border-radius-bottomright: 6px;
+          border-bottom-right-radius: 6px;
+}
+
+// On hover/focus/active, bring the proper btn to front
+.btn-group .btn:hover,
+.btn-group .btn:focus,
+.btn-group .btn:active,
+.btn-group .btn.active {
+  z-index: 2;
+}
+
+// On active and open, don't show outline
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+
+
+// Split button dropdowns
+// ----------------------
+
+// Give the line between buttons some depth
+.btn-group .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+  @shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  .box-shadow(@shadow);
+  *padding-top: 5px;
+  *padding-bottom: 5px;
+}
+
+.btn-group.open {
+  // IE7's z-index only goes to the nearest positioned ancestor, which would
+  // make the menu appear below buttons that appeared later on the page
+  *z-index: @zindexDropdown;
+
+  // Reposition menu on open and round all corners
+  .dropdown-menu {
+    display: block;
+    margin-top: 1px;
+    .border-radius(5px);
+  }
+
+  .dropdown-toggle {
+    background-image: none;
+    @shadow: inset 0 1px 6px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+    .box-shadow(@shadow);
+  }
+}
+
+// Reposition the caret
+.btn .caret {
+  margin-top: 7px;
+  margin-left: 0;
+}
+.btn:hover .caret,
+.open.btn-group .caret {
+  .opacity(100);
+}
+
+
+// Account for other colors
+.btn-primary,
+.btn-danger,
+.btn-info,
+.btn-success,
+.btn-inverse {
+  .caret {
+    border-top-color: @white;
+    .opacity(75);
+  }
+}
+
+// Small button dropdowns
+.btn-small .caret {
+  margin-top: 4px;
+}
+
diff --git a/output/static/css/buttons.css b/output/static/css/buttons.css
new file mode 100644
index 0000000..55e9fbf
--- /dev/null
+++ b/output/static/css/buttons.css
@@ -0,0 +1,183 @@
+// BUTTON STYLES
+// -------------
+
+
+// Base styles
+// --------------------------------------------------
+
+// Core
+.btn {
+  display: inline-block;
+  padding: 4px 10px 4px;
+  margin-bottom: 0; // For input.btn
+  font-size: @baseFontSize;
+  line-height: @baseLineHeight;
+  color: @grayDark;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255,255,255,.75);
+  vertical-align: middle;
+  .buttonBackground(@white, darken(@white, 10%));
+  border: 1px solid #ccc;
+  border-bottom-color: #bbb;
+  .border-radius(4px);
+  @shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  .box-shadow(@shadow);
+  cursor: pointer;
+
+  // Give IE7 some love
+  .reset-filter();
+  .ie7-restore-left-whitespace();
+}
+
+// Hover state
+.btn:hover {
+  color: @grayDark;
+  text-decoration: none;
+  background-color: darken(@white, 10%);
+  background-position: 0 -15px;
+
+  // transition is only when going to hover, otherwise the background
+  // behind the gradient (there for IE<=9 fallback) gets mismatched
+  .transition(background-position .1s linear);
+}
+
+// Focus state for keyboard and accessibility
+.btn:focus {
+  .tab-focus();
+}
+
+// Active state
+.btn.active,
+.btn:active {
+  background-image: none;
+  @shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  .box-shadow(@shadow);
+  background-color: darken(@white, 10%);
+  background-color: darken(@white, 15%) e("\9");
+  outline: 0;
+}
+
+// Disabled state
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-image: none;
+  background-color: darken(@white, 10%);
+  .opacity(65);
+  .box-shadow(none);
+}
+
+
+// Button Sizes
+// --------------------------------------------------
+
+// Large
+.btn-large {
+  padding: 9px 14px;
+  font-size: @baseFontSize + 2px;
+  line-height: normal;
+  .border-radius(5px);
+}
+.btn-large [class^="icon-"] {
+  margin-top: 1px;
+}
+
+// Small
+.btn-small {
+  padding: 5px 9px;
+  font-size: @baseFontSize - 2px;
+  line-height: @baseLineHeight - 2px;
+}
+.btn-small [class^="icon-"] {
+  margin-top: -1px;
+}
+
+// Mini
+.btn-mini {
+  padding: 2px 6px;
+  font-size: @baseFontSize - 2px;
+  line-height: @baseLineHeight - 4px;
+}
+
+
+// Alternate buttons
+// --------------------------------------------------
+
+// Set text color
+// -------------------------
+.btn-primary,
+.btn-primary:hover,
+.btn-warning,
+.btn-warning:hover,
+.btn-danger,
+.btn-danger:hover,
+.btn-success,
+.btn-success:hover,
+.btn-info,
+.btn-info:hover,
+.btn-inverse,
+.btn-inverse:hover {
+  text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+  color: @white;
+}
+// Provide *some* extra contrast for those who can get it
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-dark.active {
+  color: rgba(255,255,255,.75);
+}
+
+// Set the backgrounds
+// -------------------------
+.btn-primary {
+  .buttonBackground(@primaryButtonBackground, spin(@primaryButtonBackground, 20));
+}
+// Warning appears are orange
+.btn-warning {
+  .buttonBackground(lighten(@orange, 15%), @orange);
+}
+// Danger and error appear as red
+.btn-danger {
+  .buttonBackground(#ee5f5b, #bd362f);
+}
+// Success appears as green
+.btn-success {
+  .buttonBackground(#62c462, #51a351);
+}
+// Info appears as a neutral blue
+.btn-info {
+  .buttonBackground(#5bc0de, #2f96b4);
+}
+// Inverse appears as dark gray
+.btn-inverse {
+  .buttonBackground(#454545, #262626);
+}
+
+
+// Cross-browser Jank
+// --------------------------------------------------
+
+button.btn,
+input[type="submit"].btn {
+
+  // Firefox 3.6 only I believe
+  &::-moz-focus-inner {
+    padding: 0;
+    border: 0;
+  }
+
+  // IE7 has some default padding on button controls
+  *padding-top: 2px;
+  *padding-bottom: 2px;
+  &.large {
+    *padding-top: 7px;
+    *padding-bottom: 7px;
+  }
+  &.small {
+    *padding-top: 3px;
+    *padding-bottom: 3px;
+  }
+}
diff --git a/output/static/css/close.css b/output/static/css/close.css
new file mode 100644
index 0000000..a0e5edb
--- /dev/null
+++ b/output/static/css/close.css
@@ -0,0 +1,18 @@
+// CLOSE ICONS
+// -----------
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: @baseLineHeight;
+  color: @black;
+  text-shadow: 0 1px 0 rgba(255,255,255,1);
+  .opacity(20);
+  &:hover {
+    color: @black;
+    text-decoration: none;
+    .opacity(40);
+    cursor: pointer;
+  }
+}
diff --git a/output/static/css/code.css b/output/static/css/code.css
new file mode 100644
index 0000000..e2157d8
--- /dev/null
+++ b/output/static/css/code.css
@@ -0,0 +1,57 @@
+// Code.less
+// Code typography styles for the <code> and <pre> elements
+// --------------------------------------------------------
+
+// Inline and block code styles
+code,
+pre {
+  padding: 0 3px 2px;
+  #font > #family > .monospace;
+  font-size: @baseFontSize - 1;
+  color: @grayDark;
+  .border-radius(3px);
+}
+
+// Inline code
+code {
+  padding: 3px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+// Blocks of code
+pre {
+  display: block;
+  padding: (@baseLineHeight - 1) / 2;
+  margin: 0 0 @baseLineHeight / 2;
+  font-size: 12px;
+  line-height: @baseLineHeight;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc; // fallback for IE7-8
+  border: 1px solid rgba(0,0,0,.15);
+  .border-radius(4px);
+  white-space: pre;
+  white-space: pre-wrap;
+  word-break: break-all;
+  word-wrap: break-word;
+
+  // Make prettyprint styles more spaced out for readability
+  &.prettyprint {
+    margin-bottom: @baseLineHeight;
+  }
+
+  // Account for some code outputs that place code tags in pre tags
+  code {
+    padding: 0;
+    color: inherit;
+    background-color: transparent;
+    border: 0;
+  }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
\ No newline at end of file
diff --git a/output/static/css/codehilite.css b/output/static/css/codehilite.css
new file mode 100644
index 0000000..999d018
--- /dev/null
+++ b/output/static/css/codehilite.css
@@ -0,0 +1,62 @@
+.codehilite .hll { background-color: #ffffcc }
+.codehilite  { background: #f0f0f0; }
+.codehilite .c { color: #60a0b0; font-style: italic } /* Comment */
+.codehilite .err { border: 1px solid #FF0000 } /* Error */
+.codehilite .k { color: #007020; font-weight: bold } /* Keyword */
+.codehilite .o { color: #666666 } /* Operator */
+.codehilite .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */
+.codehilite .cp { color: #007020 } /* Comment.Preproc */
+.codehilite .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */
+.codehilite .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */
+.codehilite .gd { color: #A00000 } /* Generic.Deleted */
+.codehilite .ge { font-style: italic } /* Generic.Emph */
+.codehilite .gr { color: #FF0000 } /* Generic.Error */
+.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.codehilite .gi { color: #00A000 } /* Generic.Inserted */
+.codehilite .go { color: #808080 } /* Generic.Output */
+.codehilite .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.codehilite .gs { font-weight: bold } /* Generic.Strong */
+.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.codehilite .gt { color: #0040D0 } /* Generic.Traceback */
+.codehilite .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.codehilite .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.codehilite .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.codehilite .kp { color: #007020 } /* Keyword.Pseudo */
+.codehilite .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.codehilite .kt { color: #902000 } /* Keyword.Type */
+.codehilite .m { color: #40a070 } /* Literal.Number */
+.codehilite .s { color: #4070a0 } /* Literal.String */
+.codehilite .na { color: #4070a0 } /* Name.Attribute */
+.codehilite .nb { color: #007020 } /* Name.Builtin */
+.codehilite .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.codehilite .no { color: #60add5 } /* Name.Constant */
+.codehilite .nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.codehilite .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.codehilite .ne { color: #007020 } /* Name.Exception */
+.codehilite .nf { color: #06287e } /* Name.Function */
+.codehilite .nl { color: #002070; font-weight: bold } /* Name.Label */
+.codehilite .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.codehilite .nt { color: #062873; font-weight: bold } /* Name.Tag */
+.codehilite .nv { color: #bb60d5 } /* Name.Variable */
+.codehilite .ow { color: #007020; font-weight: bold } /* Operator.Word */
+.codehilite .w { color: #bbbbbb } /* Text.Whitespace */
+.codehilite .mf { color: #40a070 } /* Literal.Number.Float */
+.codehilite .mh { color: #40a070 } /* Literal.Number.Hex */
+.codehilite .mi { color: #40a070 } /* Literal.Number.Integer */
+.codehilite .mo { color: #40a070 } /* Literal.Number.Oct */
+.codehilite .sb { color: #4070a0 } /* Literal.String.Backtick */
+.codehilite .sc { color: #4070a0 } /* Literal.String.Char */
+.codehilite .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.codehilite .s2 { color: #4070a0 } /* Literal.String.Double */
+.codehilite .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.codehilite .sh { color: #4070a0 } /* Literal.String.Heredoc */
+.codehilite .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.codehilite .sx { color: #c65d09 } /* Literal.String.Other */
+.codehilite .sr { color: #235388 } /* Literal.String.Regex */
+.codehilite .s1 { color: #4070a0 } /* Literal.String.Single */
+.codehilite .ss { color: #517918 } /* Literal.String.Symbol */
+.codehilite .bp { color: #007020 } /* Name.Builtin.Pseudo */
+.codehilite .vc { color: #bb60d5 } /* Name.Variable.Class */
+.codehilite .vg { color: #bb60d5 } /* Name.Variable.Global */
+.codehilite .vi { color: #bb60d5 } /* Name.Variable.Instance */
+.codehilite .il { color: #40a070 } /* Literal.Number.Integer.Long */
diff --git a/output/static/css/component-animations.css b/output/static/css/component-animations.css
new file mode 100644
index 0000000..4f2a4fd
--- /dev/null
+++ b/output/static/css/component-animations.css
@@ -0,0 +1,18 @@
+// COMPONENT ANIMATIONS
+// --------------------
+
+.fade {
+  .transition(opacity .15s linear);
+  opacity: 0;
+  &.in {
+    opacity: 1;
+  }
+}
+
+.collapse {
+  .transition(height .35s ease);
+  position:relative;
+  overflow:hidden;
+  height: 0;
+  &.in { height: auto; }
+}
diff --git a/output/static/css/dropdowns.css b/output/static/css/dropdowns.css
new file mode 100644
index 0000000..1ec06b0
--- /dev/null
+++ b/output/static/css/dropdowns.css
@@ -0,0 +1,130 @@
+// DROPDOWN MENUS
+// --------------
+
+// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle {
+  // The caret makes the toggle a bit too tall in IE7
+  *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+// Dropdown arrow/caret
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  text-indent: -99999px;
+  // IE7 won't do the border trick if there's a text indent, but it doesn't
+  // do the content that text-indent is hiding, either, so we're ok.
+  *text-indent: 0;
+  vertical-align: top;
+  border-left:  4px solid transparent;
+  border-right: 4px solid transparent;
+  border-top:   4px solid @black;
+  .opacity(30);
+  content: "\2193";
+}
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+.dropdown:hover .caret,
+.open.dropdown .caret {
+  .opacity(100);
+}
+// The dropdown menu (ul)
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: @zindexDropdown;
+  float: left;
+  display: none; // none by default, but block on "open" of the menu
+  min-width: 160px;
+  _width: 160px;
+  padding: 4px 0;
+  margin: 0; // override default ul
+  list-style: none;
+  background-color: @white;
+  border-color: #ccc;
+  border-color: rgba(0,0,0,.2);
+  border-style: solid;
+  border-width: 1px;
+  .border-radius(0 0 5px 5px);
+  .box-shadow(0 5px 10px rgba(0,0,0,.2));
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+
+  // Allow for dropdowns to go bottom up (aka, dropup-menu)
+  &.bottom-up {
+    top: auto;
+    bottom: 100%;
+    margin-bottom: 2px;
+  }
+
+  // Dividers (basically an hr) within the dropdown
+  .divider {
+    height: 1px;
+    margin: 5px 1px;
+    overflow: hidden;
+    background-color: #e5e5e5;
+    border-bottom: 1px solid @white;
+
+    // IE7 needs a set width since we gave a height. Restricting just
+    // to IE7 to keep the 1px left/right space in other browsers.
+    // It is unclear where IE is getting the extra space that we need
+    // to negative-margin away, but so it goes.
+    *width: 100%;
+    *margin: -5px 0 5px;
+  }
+
+  // Links within the dropdown menu
+  a {
+    display: block;
+    padding: 3px 15px;
+    clear: both;
+    font-weight: normal;
+    line-height: @baseLineHeight;
+    color: @gray;
+    white-space: nowrap;
+  }
+}
+
+// Hover state
+.dropdown-menu li > a:hover,
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: @white;
+  text-decoration: none;
+  background-color: @linkColor;
+}
+
+// Open state for the dropdown
+.dropdown.open {
+  // IE7's z-index only goes to the nearest positioned ancestor, which would
+  // make the menu appear below buttons that appeared later on the page
+  *z-index: @zindexDropdown;
+
+  .dropdown-toggle {
+    color: @white;
+    background: #ccc;
+    background: rgba(0,0,0,.3);
+  }
+  .dropdown-menu {
+    display: block;
+  }
+}
+
+// Typeahead
+.typeahead {
+  margin-top: 2px; // give it some space to breathe
+  .border-radius(4px);
+}
diff --git a/output/static/css/forms.css b/output/static/css/forms.css
new file mode 100644
index 0000000..08d6bb3
--- /dev/null
+++ b/output/static/css/forms.css
@@ -0,0 +1,522 @@
+// Forms.less
+// Base styles for various input types, form layouts, and states
+// -------------------------------------------------------------
+
+
+// GENERAL STYLES
+// --------------
+
+// Make all forms have space below them
+form {
+  margin: 0 0 @baseLineHeight;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+// Groups of fields with labels on top (legends)
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: @baseLineHeight * 1.5;
+  font-size: @baseFontSize * 1.5;
+  line-height: @baseLineHeight * 2;
+  color: @grayDark;
+  border: 0;
+  border-bottom: 1px solid #eee;
+
+  // Small
+  small {
+    font-size: @baseLineHeight * .75;
+    color: @grayLight;
+  }
+}
+
+// Set font for forms
+label,
+input,
+button,
+select,
+textarea {
+  #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
+}
+input,
+button,
+select,
+textarea {
+  #font > #family > .sans-serif(); // And only set font-family here for those that need it (note the missing label element)
+}
+
+// Identify controls by their labels
+label {
+  display: block;
+  margin-bottom: 5px;
+  color: @grayDark;
+}
+
+// Inputs, Textareas, Selects
+input,
+textarea,
+select,
+.uneditable-input {
+  display: inline-block;
+  width: 210px;
+  height: @baseLineHeight;
+  padding: 4px;
+  margin-bottom: 9px;
+  font-size: @baseFontSize;
+  line-height: @baseLineHeight;
+  color: @gray;
+  border: 1px solid #ccc;
+  .border-radius(3px);
+}
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+// Inputs within a label
+label input,
+label textarea,
+label select {
+  display: block;
+}
+
+// Mini reset for unique input types
+input[type="image"],
+input[type="checkbox"],
+input[type="radio"] {
+  width: auto;
+  height: auto;
+  padding: 0;
+  margin: 3px 0;
+  *margin-top: 0; /* IE7 */
+  line-height: normal;
+  cursor: pointer;
+  .border-radius(0);
+  border: 0 \9; /* IE9 and down */
+}
+input[type="image"] {
+  border: 0;
+}
+
+// Reset the file input to browser defaults
+input[type="file"] {
+  width: auto;
+  padding: initial;
+  line-height: initial;
+  border: initial;
+  background-color: @white;
+  background-color: initial;
+  .box-shadow(none);
+}
+
+// Help out input buttons
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  width: auto;
+  height: auto;
+}
+
+// Set the height of select and file controls to match text inputs
+select,
+input[type="file"] {
+  height: 28px; /* In IE7, the height of the select element cannot be changed by height, only font-size */
+  *margin-top: 4px; /* For IE7, add top margin to align select with labels */
+  line-height: 28px;
+}
+
+// Reset line-height for IE
+input[type="file"] {
+  line-height: 18px \9;
+}
+
+// Chrome on Linux and Mobile Safari need background-color
+select {
+  width: 220px; // default input width + 10px of padding that doesn't get applied
+  background-color: @white;
+}
+
+// Make multiple select elements height not fixed
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+// Remove shadow from image inputs
+input[type="image"] {
+  .box-shadow(none);
+}
+
+// Make textarea height behave
+textarea {
+  height: auto;
+}
+
+// Hidden inputs
+input[type="hidden"] {
+  display: none;
+}
+
+
+
+// CHECKBOXES & RADIOS
+// -------------------
+
+// Indent the labels to position radios/checkboxes as hanging
+.radio,
+.checkbox {
+  padding-left: 18px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+
+// Move the options list down to align with labels
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px; // has to be padding because margin collaspes
+}
+
+// Radios and checkboxes on same line
+// TODO v3: Convert .inline to .control-inline
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px; // space out consecutive inline controls
+}
+
+
+
+// FOCUS STATE
+// -----------
+
+input,
+textarea {
+  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
+  @transition: border linear .2s, box-shadow linear .2s;
+  .transition(@transition);
+}
+input:focus,
+textarea:focus {
+  border-color: rgba(82,168,236,.8);
+  @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+  .box-shadow(@shadow);
+  outline: 0;
+  outline: thin dotted \9; /* IE6-9 */
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus,
+select:focus {
+  .box-shadow(none); // override for file inputs
+  .tab-focus();
+}
+
+
+
+// INPUT SIZES
+// -----------
+
+// General classes for quick sizes
+.input-mini       { width: 60px; }
+.input-small      { width: 90px; }
+.input-medium     { width: 150px; }
+.input-large      { width: 210px; }
+.input-xlarge     { width: 270px; }
+.input-xxlarge    { width: 530px; }
+
+// Grid style input sizes
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input {
+  float: none;
+  margin-left: 0;
+}
+
+
+
+// GRID SIZING FOR INPUTS
+// ----------------------
+
+#inputGridSystem > .generate(@gridColumns, @gridColumnWidth, @gridGutterWidth);
+
+
+
+
+// DISABLED STATE
+// --------------
+
+// Disabled and read-only inputs
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  background-color: #f5f5f5;
+  border-color: #ddd;
+  cursor: not-allowed;
+}
+
+
+
+
+// FORM FIELD FEEDBACK STATES
+// --------------------------
+
+// Warning
+.control-group.warning {
+  .formFieldState(@warningText, @warningText, @warningBackground);
+}
+// Error
+.control-group.error {
+  .formFieldState(@errorText, @errorText, @errorBackground);
+}
+// Success
+.control-group.success {
+  .formFieldState(@successText, @successText, @successBackground);
+}
+
+// HTML5 invalid states
+// Shares styles with the .control-group.error above
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+  &:focus {
+    border-color: darken(#ee5f5b, 10%);
+    .box-shadow(0 0 6px lighten(#ee5f5b, 20%));
+  }
+}
+
+
+
+// FORM ACTIONS
+// ------------
+
+.form-actions {
+  padding: (@baseLineHeight - 1) 20px @baseLineHeight;
+  margin-top: @baseLineHeight;
+  margin-bottom: @baseLineHeight;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+}
+
+// For text that needs to appear as an input but should not be an input
+.uneditable-input {
+  display: block;
+  background-color: @white;
+  border-color: #eee;
+  .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
+  cursor: not-allowed;
+}
+
+// Placeholder text gets special styles; can't be bundled together though for some reason
+.placeholder(@grayLight);
+
+
+
+// HELP TEXT
+// ---------
+
+.help-block {
+  display: block; // account for any element using help-block
+  margin-top: 5px;
+  margin-bottom: 0;
+  color: @grayLight;
+}
+
+.help-inline {
+  display: inline-block;
+  .ie7-inline-block();
+  margin-bottom: 9px;
+  vertical-align: middle;
+  padding-left: 5px;
+}
+
+
+
+// INPUT GROUPS
+// ------------
+
+// Allow us to put symbols and text within the input field for a cleaner look
+.input-prepend,
+.input-append {
+  margin-bottom: 5px;
+  .clearfix(); // Clear the float to prevent wrapping
+  input,
+  .uneditable-input {
+    .border-radius(0 3px 3px 0);
+    &:focus {
+      position: relative;
+      z-index: 2;
+    }
+  }
+  .uneditable-input {
+    border-left-color: #ccc;
+  }
+  .add-on {
+    float: left;
+    display: block;
+    width: auto;
+    min-width: 16px;
+    height: @baseLineHeight;
+    margin-right: -1px;
+    padding: 4px 5px;
+    font-weight: normal;
+    line-height: @baseLineHeight;
+    color: @grayLight;
+    text-align: center;
+    text-shadow: 0 1px 0 @white;
+    background-color: #f5f5f5;
+    border: 1px solid #ccc;
+    .border-radius(3px 0 0 3px);
+  }
+  .active {
+    background-color: lighten(@green, 30);
+    border-color: @green;
+  }
+}
+.input-prepend {
+  .add-on {
+    *margin-top: 1px; /* IE6-7 */
+  }
+}
+.input-append {
+  input,
+  .uneditable-input {
+    float: left;
+    .border-radius(3px 0 0 3px);
+  }
+  .uneditable-input {
+    border-left-color: #eee;
+    border-right-color: #ccc;
+  }
+  .add-on {
+    margin-right: 0;
+    margin-left: -1px;
+    .border-radius(0 3px 3px 0);
+  }
+  input:first-child {
+    // In IE7, having a hasLayout container (from clearfix's zoom:1) can make the first input
+    // inherit the sum of its ancestors' margins.
+    *margin-left: -160px;
+
+    &+.add-on {
+      *margin-left: -21px;
+    }
+  }
+}
+
+
+
+// SEARCH FORM
+// -----------
+
+.search-query {
+  padding-left: 14px;
+  padding-right: 14px;
+  margin-bottom: 0; // remove the default margin on all inputs
+  .border-radius(14px);
+}
+
+
+
+// HORIZONTAL & VERTICAL FORMS
+// ---------------------------
+
+// Common properties
+// -----------------
+
+.form-search,
+.form-inline,
+.form-horizontal {
+  input,
+  textarea,
+  select,
+  .help-inline,
+  .uneditable-input {
+    display: inline-block;
+    margin-bottom: 0;
+  }
+  // Re-hide hidden elements due to specifity
+  .hide {
+    display: none;
+  }
+}
+.form-search label,
+.form-inline label,
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  display: inline-block;
+}
+// Make the prepend and append add-on vertical-align: middle;
+.form-search .input-append .add-on,
+.form-inline .input-prepend .add-on,
+.form-search .input-append .add-on,
+.form-inline .input-prepend .add-on {
+  vertical-align: middle;
+}
+// Inline checkbox/radio labels
+.form-search .radio,
+.form-inline .radio,
+.form-search .checkbox,
+.form-inline .checkbox {
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+// Margin to space out fieldsets
+.control-group {
+  margin-bottom: @baseLineHeight / 2;
+}
+
+// Legend collapses margin, so next element is responsible for spacing
+legend + .control-group {
+  margin-top: @baseLineHeight;
+  -webkit-margin-top-collapse: separate;
+}
+
+// Horizontal-specific styles
+// --------------------------
+
+.form-horizontal {
+  // Increase spacing between groups
+  .control-group {
+    margin-bottom: @baseLineHeight;
+    .clearfix();
+  }
+  // Float the labels left
+  .control-label {
+    float: left;
+    width: 140px;
+    padding-top: 5px;
+    text-align: right;
+  }
+  // Move over all input controls and content
+  .controls {
+    margin-left: 160px;
+  }
+  // Move over buttons in .form-actions to align with .controls
+  .form-actions {
+    padding-left: 160px;
+  }
+}
diff --git a/output/static/css/grid.css b/output/static/css/grid.css
new file mode 100644
index 0000000..4acb0a4
--- /dev/null
+++ b/output/static/css/grid.css
@@ -0,0 +1,8 @@
+// GRID SYSTEM
+// -----------
+
+// Fixed (940px)
+#gridSystem > .generate(@gridColumns, @gridColumnWidth, @gridGutterWidth);
+
+// Fluid (940px)
+#fluidGridSystem > .generate(@gridColumns, @fluidGridColumnWidth, @fluidGridGutterWidth);
diff --git a/output/static/css/hero-unit.css b/output/static/css/hero-unit.css
new file mode 100644
index 0000000..cba1cc4
--- /dev/null
+++ b/output/static/css/hero-unit.css
@@ -0,0 +1,20 @@
+// HERO UNIT
+// ---------
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  background-color: #f5f5f5;
+  .border-radius(6px);
+  h1 {
+    margin-bottom: 0;
+    font-size: 60px;
+    line-height: 1;
+    letter-spacing: -1px;
+  }
+  p {
+    font-size: 18px;
+    font-weight: 200;
+    line-height: @baseLineHeight * 1.5;
+  }
+}
diff --git a/output/static/css/labels.css b/output/static/css/labels.css
new file mode 100644
index 0000000..268435a
--- /dev/null
+++ b/output/static/css/labels.css
@@ -0,0 +1,32 @@
+// LABELS
+// ------
+
+// Base
+.label {
+  padding: 2px 4px 3px;
+  font-size: @baseFontSize * .85;
+  font-weight: bold;
+  color: @white;
+  text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+  background-color: @grayLight;
+  .border-radius(3px);
+}
+
+// Hover state
+.label:hover {
+  color: @white;
+  text-decoration: none;
+}
+
+// Colors
+.label-important        { background-color: @errorText; }
+.label-important:hover  { background-color: darken(@errorText, 10%); }
+
+.label-warning          { background-color: @orange; }
+.label-warning:hover    { background-color: darken(@orange, 10%); }
+
+.label-success          { background-color: @successText; }
+.label-success:hover    { background-color: darken(@successText, 10%); }
+
+.label-info             { background-color: @infoText; }
+.label-info:hover       { background-color: darken(@infoText, 10%); }
diff --git a/output/static/css/layouts.css b/output/static/css/layouts.css
new file mode 100644
index 0000000..c8d358b
--- /dev/null
+++ b/output/static/css/layouts.css
@@ -0,0 +1,17 @@
+//
+// Layouts
+// Fixed-width and fluid (with sidebar) layouts
+// --------------------------------------------
+
+
+// Container (centered, fixed-width layouts)
+.container {
+  .container-fixed();
+}
+
+// Fluid layouts (left aligned, with sidebar, min- & max-width content)
+.container-fluid {
+  padding-left: @gridGutterWidth;
+  padding-right: @gridGutterWidth;
+  .clearfix();
+}
\ No newline at end of file
diff --git a/output/static/css/mixins.css b/output/static/css/mixins.css
new file mode 100644
index 0000000..701cd82
--- /dev/null
+++ b/output/static/css/mixins.css
@@ -0,0 +1,590 @@
+// Mixins.less
+// Snippets of reusable CSS to develop faster and keep code readable
+// -----------------------------------------------------------------
+
+
+// UTILITY MIXINS
+// --------------------------------------------------
+
+// Clearfix
+// --------
+// For clearing floats like a boss h5bp.com/q
+.clearfix {
+  *zoom: 1;
+  &:before,
+  &:after {
+    display: table;
+    content: "";
+  }
+  &:after {
+    clear: both;
+  }
+}
+
+// Webkit-style focus
+// ------------------
+.tab-focus() {
+  // Default
+  outline: thin dotted #333;
+  // Webkit
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+// Center-align a block level element
+// ----------------------------------
+.center-block() {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+// IE7 inline-block
+// ----------------
+.ie7-inline-block() {
+  *display: inline; /* IE7 inline-block hack */
+  *zoom: 1;
+}
+
+// IE7 likes to collapse whitespace on either side of the inline-block elements.
+// Ems because we're attempting to match the width of a space character. Left
+// version is for form buttons, which typically come after other elements, and
+// right version is for icons, which come before. Applying both is ok, but it will
+// mean that space between those elements will be .6em (~2 space characters) in IE7,
+// instead of the 1 space in other browsers.
+.ie7-restore-left-whitespace() {
+  *margin-left: .3em;
+
+  &:first-child {
+    *margin-left: 0;
+  }
+}
+
+.ie7-restore-right-whitespace() {
+  *margin-right: .3em;
+
+  &:last-child {
+    *margin-left: 0;
+  }
+}
+
+// Sizing shortcuts
+// -------------------------
+.size(@height: 5px, @width: 5px) {
+  width: @width;
+  height: @height;
+}
+.square(@size: 5px) {
+  .size(@size, @size);
+}
+
+// Placeholder text
+// -------------------------
+.placeholder(@color: @placeholderText) {
+  :-moz-placeholder {
+    color: @color;
+  }
+  ::-webkit-input-placeholder {
+    color: @color;
+  }
+}
+
+// Text overflow
+// -------------------------
+// Requires inline-block or block for proper styling
+.text-overflow() {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+
+
+// FONTS
+// --------------------------------------------------
+
+#font {
+  #family {
+    .serif() {
+      font-family: Georgia, "Times New Roman", Times, serif;
+    }
+    .sans-serif() {
+      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    }
+    .monospace() {
+      font-family: Menlo, Monaco, "Courier New", monospace;
+    }
+  }
+  .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+    font-size: @size;
+    font-weight: @weight;
+    line-height: @lineHeight;
+  }
+  .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+    #font > #family > .serif;
+    #font > .shorthand(@size, @weight, @lineHeight);
+  }
+  .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+    #font > #family > .sans-serif;
+    #font > .shorthand(@size, @weight, @lineHeight);
+  }
+  .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+    #font > #family > .monospace;
+    #font > .shorthand(@size, @weight, @lineHeight);
+  }
+}
+
+
+
+// GRID SYSTEM
+// --------------------------------------------------
+
+// Site container
+// -------------------------
+.container-fixed() {
+  width: @gridRowWidth;
+  margin-left: auto;
+  margin-right: auto;
+  .clearfix();
+}
+
+// Le grid system
+// -------------------------
+#gridSystem {
+  // Setup the mixins to be used
+  .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, @columns) {
+    width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
+  }
+  .offset(@gridColumnWidth, @gridGutterWidth, @columns) {
+    margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)) + (@gridGutterWidth * 2);
+  }
+  .gridColumn(@gridGutterWidth) {
+    float: left;
+    margin-left: @gridGutterWidth;
+  }
+  // Take these values and mixins, and make 'em do their thang
+  .generate(@gridColumns, @gridColumnWidth, @gridGutterWidth) {
+    // Row surrounds the columns
+    .row {
+      margin-left: @gridGutterWidth * -1;
+      .clearfix();
+    }
+    // Find all .span# classes within .row and give them the necessary properties for grid columns (supported by all browsers back to IE7, thanks @dhg)
+    [class*="span"] {
+      #gridSystem > .gridColumn(@gridGutterWidth);
+    }
+    // Default columns
+    .span1     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 1); }
+    .span2     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 2); }
+    .span3     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 3); }
+    .span4     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 4); }
+    .span5     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 5); }
+    .span6     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 6); }
+    .span7     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 7); }
+    .span8     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 8); }
+    .span9     { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 9); }
+    .span10    { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 10); }
+    .span11    { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 11); }
+    .span12,
+    .container { #gridSystem > .columns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 12); }
+    // Offset column options
+    .offset1   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 1); }
+    .offset2   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 2); }
+    .offset3   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 3); }
+    .offset4   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 4); }
+    .offset5   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 5); }
+    .offset6   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 6); }
+    .offset7   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 7); }
+    .offset8   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 8); }
+    .offset9   { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 9); }
+    .offset10  { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 10); }
+    .offset11  { #gridSystem > .offset(@gridColumnWidth, @gridGutterWidth, 11); }
+  }
+}
+
+// Fluid grid system
+// -------------------------
+#fluidGridSystem {
+  // Setup the mixins to be used
+  .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, @columns) {
+    width: 1% * (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
+  }
+  .gridColumn(@fluidGridGutterWidth) {
+    float: left;
+    margin-left: @fluidGridGutterWidth;
+  }
+  // Take these values and mixins, and make 'em do their thang
+  .generate(@gridColumns, @fluidGridColumnWidth, @fluidGridGutterWidth) {
+    // Row surrounds the columns
+    .row-fluid {
+      width: 100%;
+      .clearfix();
+
+      // Find all .span# classes within .row and give them the necessary properties for grid columns (supported by all browsers back to IE7, thanks @dhg)
+      > [class*="span"] {
+        #fluidGridSystem > .gridColumn(@fluidGridGutterWidth);
+      }
+      > [class*="span"]:first-child {
+        margin-left: 0;
+      }
+      // Default columns
+      > .span1     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 1); }
+      > .span2     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 2); }
+      > .span3     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 3); }
+      > .span4     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 4); }
+      > .span5     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 5); }
+      > .span6     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 6); }
+      > .span7     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 7); }
+      > .span8     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 8); }
+      > .span9     { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 9); }
+      > .span10    { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 10); }
+      > .span11    { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 11); }
+      > .span12    { #fluidGridSystem > .columns(@fluidGridGutterWidth, @fluidGridColumnWidth, 12); }
+    }
+  }
+}
+
+// Input grid system
+// -------------------------
+#inputGridSystem {
+  .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, @columns) {
+    width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 10;
+  }
+  .generate(@gridColumns, @gridColumnWidth, @gridGutterWidth) {
+    input,
+    textarea,
+    .uneditable-input {
+      &.span1     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 1); }
+      &.span2     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 2); }
+      &.span3     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 3); }
+      &.span4     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 4); }
+      &.span5     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 5); }
+      &.span6     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 6); }
+      &.span7     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 7); }
+      &.span8     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 8); }
+      &.span9     { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 9); }
+      &.span10    { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 10); }
+      &.span11    { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 11); }
+      &.span12    { #inputGridSystem > .inputColumns(@gridGutterWidth, @gridColumnWidth, @gridRowWidth, 12); }
+    }
+  }
+}
+
+// Make a Grid
+// -------------------------
+// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
+.makeRow() {
+  margin-left: @gridGutterWidth * -1;
+  .clearfix();
+}
+.makeColumn(@columns: 1) {
+  float: left;
+  margin-left: @gridGutterWidth;
+  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
+}
+
+
+
+// Form field states (used in forms.less)
+// --------------------------------------------------
+
+// Mixin for form field states
+.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
+  // Set the text color
+  > label,
+  .help-block,
+  .help-inline {
+    color: @textColor;
+  }
+  // Style inputs accordingly
+  input,
+  select,
+  textarea {
+    color: @textColor;
+    border-color: @borderColor;
+    &:focus {
+      border-color: darken(@borderColor, 10%);
+      .box-shadow(0 0 6px lighten(@borderColor, 20%));
+    }
+  }
+  // Give a small background color for input-prepend/-append
+  .input-prepend .add-on,
+  .input-append .add-on {
+    color: @textColor;
+    background-color: @backgroundColor;
+    border-color: @textColor;
+  }
+}
+
+
+
+// CSS3 PROPERTIES
+// --------------------------------------------------
+
+// Border Radius
+.border-radius(@radius: 5px) {
+  -webkit-border-radius: @radius;
+     -moz-border-radius: @radius;
+          border-radius: @radius;
+}
+
+// Drop shadows
+.box-shadow(@shadow: 0 1px 3px rgba(0,0,0,.25)) {
+  -webkit-box-shadow: @shadow;
+     -moz-box-shadow: @shadow;
+          box-shadow: @shadow;
+}
+
+// Transitions
+.transition(@transition) {
+  -webkit-transition: @transition;
+     -moz-transition: @transition;
+      -ms-transition: @transition;
+       -o-transition: @transition;
+          transition: @transition;
+}
+
+// Transformations
+.rotate(@degrees) {
+  -webkit-transform: rotate(@degrees);
+     -moz-transform: rotate(@degrees);
+      -ms-transform: rotate(@degrees);
+       -o-transform: rotate(@degrees);
+          transform: rotate(@degrees);
+}
+.scale(@ratio) {
+  -webkit-transform: scale(@ratio);
+     -moz-transform: scale(@ratio);
+      -ms-transform: scale(@ratio);
+       -o-transform: scale(@ratio);
+          transform: scale(@ratio);
+}
+.translate(@x: 0, @y: 0) {
+  -webkit-transform: translate(@x, @y);
+     -moz-transform: translate(@x, @y);
+      -ms-transform: translate(@x, @y);
+       -o-transform: translate(@x, @y);
+          transform: translate(@x, @y);
+}
+.skew(@x: 0, @y: 0) {
+  -webkit-transform: skew(@x, @y);
+     -moz-transform: skew(@x, @y);
+      -ms-transform: skew(@x, @y);
+       -o-transform: skew(@x, @y);
+          transform: skew(@x, @y);
+}
+.translate3d(@x: 0, @y: 0, @z: 0) {
+  -webkit-transform: translate(@x, @y, @z);
+     -moz-transform: translate(@x, @y, @z);
+      -ms-transform: translate(@x, @y, @z);
+       -o-transform: translate(@x, @y, @z);
+          transform: translate(@x, @y, @z);
+}
+
+// Background clipping
+// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
+.background-clip(@clip) {
+  -webkit-background-clip: @clip;
+     -moz-background-clip: @clip;
+          background-clip: @clip;
+}
+
+// Background sizing
+.background-size(@size){
+  -webkit-background-size: @size;
+     -moz-background-size: @size;
+       -o-background-size: @size;
+          background-size: @size;
+}
+
+
+// Box sizing
+.box-sizing(@boxmodel) {
+  -webkit-box-sizing: @boxmodel;
+     -moz-box-sizing: @boxmodel;
+          box-sizing: @boxmodel;
+}
+
+// User select
+// For selecting text on the page
+.user-select(@select) {
+  -webkit-user-select: @select;
+     -moz-user-select: @select;
+       -o-user-select: @select;
+          user-select: @select;
+}
+
+// Resize anything
+.resizable(@direction: both) {
+  resize: @direction; // Options: horizontal, vertical, both
+  overflow: auto; // Safari fix
+}
+
+// CSS3 Content Columns
+.content-columns(@columnCount, @columnGap: @gridColumnGutter) {
+  -webkit-column-count: @columnCount;
+     -moz-column-count: @columnCount;
+          column-count: @columnCount;
+  -webkit-column-gap: @columnGap;
+     -moz-column-gap: @columnGap;
+          column-gap: @columnGap;
+}
+
+// Opacity
+.opacity(@opacity: 100) {
+  opacity: @opacity / 100;
+   filter: e(%("alpha(opacity=%d)", @opacity));
+}
+
+
+
+// BACKGROUNDS
+// --------------------------------------------------
+
+// Add an alphatransparency value to any background or border color (via Elyse Holladay)
+#translucent {
+  .background(@color: @white, @alpha: 1) {
+    background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
+  }
+  .border(@color: @white, @alpha: 1) {
+    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
+    .background-clip(padding-box);
+  }
+}
+
+// Gradient Bar Colors for buttons and alerts
+.gradientBar(@primaryColor, @secondaryColor) {
+  #gradient > .vertical(@primaryColor, @secondaryColor);
+  border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
+  border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
+}
+
+// Gradients
+#gradient {
+  .horizontal(@startColor: #555, @endColor: #333) {
+    background-color: @endColor;
+    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
+    background-image: -ms-linear-gradient(left, @startColor, @endColor); // IE10
+    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(left, @startColor, @endColor); // Le standard
+    background-repeat: repeat-x;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",@startColor,@endColor)); // IE9 and down
+  }
+  .vertical(@startColor: #555, @endColor: #333) {
+    background-color: mix(@startColor, @endColor, 60%);
+    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
+    background-image: -ms-linear-gradient(top, @startColor, @endColor); // IE10
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(top, @startColor, @endColor); // The standard
+    background-repeat: repeat-x;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@startColor,@endColor)); // IE9 and down
+  }
+  .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
+    background-color: @endColor;
+    background-repeat: repeat-x;
+    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
+    background-image: -ms-linear-gradient(@deg, @startColor, @endColor); // IE10
+    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(@deg, @startColor, @endColor); // The standard
+  }
+  .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
+    background-color: mix(@midColor, @endColor, 80%);
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
+    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
+    background-image: -ms-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-repeat: no-repeat;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@startColor,@endColor)); // IE9 and down, gets no color-stop at all for proper fallback
+  }
+  .radial(@innerColor: #555, @outerColor: #333)  {
+    background-color: @outerColor;
+    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
+    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
+    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
+    background-image: -ms-radial-gradient(circle, @innerColor, @outerColor);
+    background-repeat: no-repeat;
+    // Opera cannot do radial gradients yet
+  }
+  .striped(@color, @angle: -45deg) {
+    background-color: @color;
+    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
+    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: -ms-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+  }
+}
+// Reset filters for IE
+.reset-filter() {
+  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
+}
+
+
+// Mixin for generating button backgrounds
+// ---------------------------------------
+.buttonBackground(@startColor, @endColor) {
+  // gradientBar will set the background to a pleasing blend of these, to support IE<=9
+  .gradientBar(@startColor, @endColor);
+  .reset-filter();
+
+  // in these cases the gradient won't cover the background, so we override
+  &:hover, &:active, &.active, &.disabled, &[disabled] {
+    background-color: @endColor;
+  }
+
+  // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
+  &:active,
+  &.active {
+    background-color: darken(@endColor, 10%) e("\9");
+  }
+}
+
+
+// COMPONENT MIXINS
+// --------------------------------------------------
+
+// POPOVER ARROWS
+// -------------------------
+// For tipsies and popovers
+#popoverArrow {
+  .top(@arrowWidth: 5px) {
+    bottom: 0;
+    left: 50%;
+    margin-left: -@arrowWidth;
+    border-left: @arrowWidth solid transparent;
+    border-right: @arrowWidth solid transparent;
+    border-top: @arrowWidth solid @black;
+  }
+  .left(@arrowWidth: 5px) {
+    top: 50%;
+    right: 0;
+    margin-top: -@arrowWidth;
+    border-top: @arrowWidth solid transparent;
+    border-bottom: @arrowWidth solid transparent;
+    border-left: @arrowWidth solid @black;
+  }
+  .bottom(@arrowWidth: 5px) {
+    top: 0;
+    left: 50%;
+    margin-left: -@arrowWidth;
+    border-left: @arrowWidth solid transparent;
+    border-right: @arrowWidth solid transparent;
+    border-bottom: @arrowWidth solid @black;
+  }
+  .right(@arrowWidth: 5px) {
+    top: 50%;
+    left: 0;
+    margin-top: -@arrowWidth;
+    border-top: @arrowWidth solid transparent;
+    border-bottom: @arrowWidth solid transparent;
+    border-right: @arrowWidth solid @black;
+  }
+}
diff --git a/output/static/css/modals.css b/output/static/css/modals.css
new file mode 100644
index 0000000..d1e06dc
--- /dev/null
+++ b/output/static/css/modals.css
@@ -0,0 +1,83 @@
+// MODALS
+// ------
+
+// Recalculate z-index where appropriate
+.modal-open {
+  .dropdown-menu {  z-index: @zindexDropdown + @zindexModal; }
+  .dropdown.open { *z-index: @zindexDropdown + @zindexModal; }
+  .popover       {  z-index: @zindexPopover  + @zindexModal; }
+  .tooltip       {  z-index: @zindexTooltip  + @zindexModal; }
+}
+
+// Background
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: @zindexModalBackdrop;
+  background-color: @black;
+  // Fade for backdrop
+  &.fade { opacity: 0; }
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  .opacity(80);
+}
+
+// Base modal
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: @zindexModal;
+  max-height: 500px;
+  overflow: auto;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  background-color: @white;
+  border: 1px solid #999;
+  border: 1px solid rgba(0,0,0,.3);
+  *border: 1px solid #999; /* IE6-7 */
+  .border-radius(6px);
+  .box-shadow(0 3px 7px rgba(0,0,0,0.3));
+  .background-clip(padding-box);
+  &.fade {
+    .transition(e('opacity .3s linear, top .3s ease-out'));
+    top: -25%;
+  }
+  &.fade.in { top: 50%; }
+}
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+  // Close icon
+  .close { margin-top: 2px; }
+}
+
+// Body (where all modal content resises)
+.modal-body {
+  padding: 15px;
+}
+// Remove bottom margin if need be
+.modal-body .modal-form {
+  margin-bottom: 0;
+}
+
+// Footer (for actions)
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  .border-radius(0 0 6px 6px);
+  .box-shadow(inset 0 1px 0 @white);
+  .clearfix();
+  .btn {
+    float: right;
+    margin-left: 5px;
+    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
+  }
+}
diff --git a/output/static/css/navbar.css b/output/static/css/navbar.css
new file mode 100644
index 0000000..16553c1
--- /dev/null
+++ b/output/static/css/navbar.css
@@ -0,0 +1,299 @@
+// NAVBAR (FIXED AND STATIC)
+// -------------------------
+
+
+// COMMON STYLES
+// -------------
+
+.navbar {
+  overflow: visible;
+  margin-bottom: @baseLineHeight;
+}
+
+// Gradient is applied to it's own element because overflow visible is not honored by IE when filter is present
+.navbar-inner {
+  padding-left:  20px;
+  padding-right: 20px;
+  #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
+  .border-radius(4px);
+  @shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1);
+  .box-shadow(@shadow);
+}
+
+// Navbar button for toggling navbar items in responsive layouts
+.btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-left: 5px;
+  margin-right: 5px;
+  .buttonBackground(@navbarBackgroundHighlight, @navbarBackground);
+  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+  .box-shadow(@shadow);
+}
+.btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  .border-radius(1px);
+  .box-shadow(0 1px 0 rgba(0,0,0,.25));
+}
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+// Override the default collapsed state
+.nav-collapse.collapse {
+  height: auto;
+}
+
+
+// Brand, links, text, and buttons
+.navbar {
+  // Hover and active states
+  .brand:hover {
+    text-decoration: none;
+  }
+  // Website or project name
+  .brand {
+    float: left;
+    display: block;
+    padding: 8px 20px 12px;
+    margin-left: -20px; // negative indent to left-align the text down the page
+    font-size: 20px;
+    font-weight: 200;
+    line-height: 1;
+    color: @white;
+  }
+  // Plain text in topbar
+  .navbar-text {
+    margin-bottom: 0;
+    line-height: 40px;
+    color: @navbarText;
+    a:hover {
+      color: @white;
+      background-color: transparent;
+    }
+  }
+  // Buttons in navbar
+  .btn,
+  .btn-group {
+    margin-top: 5px; // make buttons vertically centered in navbar
+  }
+  .btn-group .btn {
+    margin-top: 0; // then undo the margin here so we don't accidentally double it
+  }
+}
+
+// Navbar forms
+.navbar-form {
+  margin-bottom: 0; // remove default bottom margin
+  .clearfix();
+  input,
+  select {
+    display: inline-block;
+    margin-top: 5px;
+    margin-bottom: 0;
+  }
+  .radio,
+  .checkbox {
+    margin-top: 5px;
+  }
+  input[type="image"],
+  input[type="checkbox"],
+  input[type="radio"] {
+    margin-top: 3px;
+  }
+  .input-append,
+  .input-prepend {
+    margin-top: 6px;
+    white-space: nowrap; // preven two  items from separating within a .navbar-form that has .pull-left
+    input {
+      margin-top: 0; // remove the margin on top since it's on the parent
+    }
+  }
+}
+
+// Navbar search
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 6px;
+  margin-bottom: 0;
+  .search-query {
+    padding: 4px 9px;
+    #font > .sans-serif(13px, normal, 1);
+    color: @white;
+    color: rgba(255,255,255,.75);
+    background: #666;
+    background: rgba(255,255,255,.3);
+    border: 1px solid #111;
+    @shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0px rgba(255,255,255,.15);
+    .box-shadow(@shadow);
+    .transition(none);
+
+    // Placeholder text gets special styles; can't be bundled together though for some reason
+    .placeholder(@grayLighter);
+
+    // Hover states
+    &:hover {
+      color: @white;
+      background-color: @grayLight;
+      background-color: rgba(255,255,255,.5);
+    }
+    // Focus states (we use .focused since IE7-8 and down doesn't support :focus)
+    &:focus,
+    &.focused {
+      padding: 5px 10px;
+      color: @grayDark;
+      text-shadow: 0 1px 0 @white;
+      background-color: @white;
+      border: 0;
+      .box-shadow(0 0 3px rgba(0,0,0,.15));
+      outline: 0;
+    }
+  }
+}
+
+
+// FIXED NAVBAR
+// ------------
+
+.navbar-fixed-top {
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: 0;
+  z-index: @zindexFixedNavbar;
+}
+.navbar-fixed-top .navbar-inner {
+  padding-left:  0;
+  padding-right: 0;
+  .border-radius(0);
+}
+
+
+// NAVIGATION
+// ----------
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+  float: right; // redeclare due to specificity
+}
+.navbar .nav > li {
+  display: block;
+  float: left;
+}
+
+// Links
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 10px 11px;
+  line-height: 19px;
+  color: @navbarLinkColor;
+  text-decoration: none;
+  text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+}
+// Hover
+.navbar .nav > li > a:hover {
+  background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover from .active
+  color: @navbarLinkColorHover;
+  text-decoration: none;
+}
+
+// Active nav items
+.navbar .nav .active > a,
+.navbar .nav .active > a:hover {
+  color: @navbarLinkColorHover;
+  text-decoration: none;
+  background-color: @navbarBackground;
+}
+
+// Dividers (basically a vertical hr)
+.navbar .divider-vertical {
+  height: @navbarHeight;
+  width: 1px;
+  margin: 0 9px;
+  overflow: hidden;
+  background-color: @navbarBackground;
+  border-right: 1px solid @navbarBackgroundHighlight;
+}
+
+// Secondary (floated right) nav in topbar
+.navbar .nav.pull-right {
+  margin-left: 10px;
+  margin-right: 0;
+}
+
+
+
+// Dropdown menus
+// --------------
+
+// Menu position and menu carets
+.navbar .dropdown-menu {
+  margin-top: 1px;
+  .border-radius(4px);
+  &:before {
+    content: '';
+    display: inline-block;
+    border-left:   7px solid transparent;
+    border-right:  7px solid transparent;
+    border-bottom: 7px solid #ccc;
+    border-bottom-color: rgba(0,0,0,.2);
+    position: absolute;
+    top: -7px;
+    left: 9px;
+  }
+  &:after {
+    content: '';
+    display: inline-block;
+    border-left:   6px solid transparent;
+    border-right:  6px solid transparent;
+    border-bottom: 6px solid @white;
+    position: absolute;
+    top: -6px;
+    left: 10px;
+  }
+}
+
+// Dropdown toggle caret
+.navbar .nav .dropdown-toggle .caret,
+.navbar .nav .open.dropdown .caret {
+  border-top-color: @white;
+}
+.navbar .nav .active .caret {
+  .opacity(100);
+}
+
+// Remove background color from open dropdown
+.navbar .nav .open > .dropdown-toggle,
+.navbar .nav .active > .dropdown-toggle,
+.navbar .nav .open.active > .dropdown-toggle {
+  background-color: transparent;
+}
+
+// Dropdown link on hover
+.navbar .nav .active > .dropdown-toggle:hover {
+  color: @white;
+}
+
+// Right aligned menus need alt position
+.navbar .nav.pull-right .dropdown-menu {
+  left: auto;
+  right: 0;
+  &:before {
+    left: auto;
+    right: 12px;
+  }
+  &:after {
+    left: auto;
+    right: 13px;
+  }
+}
\ No newline at end of file
diff --git a/output/static/css/navs.css b/output/static/css/navs.css
new file mode 100644
index 0000000..06219fa
--- /dev/null
+++ b/output/static/css/navs.css
@@ -0,0 +1,353 @@
+// NAVIGATIONS
+// -----------
+
+
+
+// BASE CLASS
+// ----------
+
+.nav {
+  margin-left: 0;
+  margin-bottom: @baseLineHeight;
+  list-style: none;
+}
+
+// Make links block level
+.nav > li > a {
+  display: block;
+}
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: @grayLighter;
+}
+
+// Nav headers (for dropdowns and lists)
+.nav .nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: @baseLineHeight;
+  color: @grayLight;
+  text-shadow: 0 1px 0 rgba(255,255,255,.5);
+  text-transform: uppercase;
+}
+// Space them out when they follow another list item (link)
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+
+// NAV LIST
+// --------
+
+.nav-list {
+  padding-left: 14px;
+  padding-right: 14px;
+  margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-left:  -15px;
+  margin-right: -15px;
+  text-shadow: 0 1px 0 rgba(255,255,255,.5);
+}
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+.nav-list .active > a,
+.nav-list .active > a:hover {
+  color: @white;
+  text-shadow: 0 -1px 0 rgba(0,0,0,.2);
+  background-color: @linkColor;
+}
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+
+
+
+// TABS AND PILLS
+// -------------
+
+// Common styles
+.nav-tabs,
+.nav-pills {
+  .clearfix();
+}
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px; // keeps the overall height an even number
+}
+
+// TABS
+// ----
+
+// Give the tabs something to sit on
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+
+// Make the list-items overlay the bottom border
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+
+// Actual tabs (as links)
+.nav-tabs > li > a {
+  padding-top: 9px;
+  padding-bottom: 9px;
+  border: 1px solid transparent;
+  .border-radius(4px 4px 0 0);
+  &:hover {
+    border-color: @grayLighter @grayLighter #ddd;
+  }
+}
+// Active state, and it's :hover to override normal :hover
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: @gray;
+  background-color: @white;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+
+// PILLS
+// -----
+
+// Links rendered as pills
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  .border-radius(5px);
+}
+
+// Active state
+.nav-pills .active > a,
+.nav-pills .active > a:hover {
+  color: @white;
+  background-color: @linkColor;
+}
+
+
+
+// STACKED NAV
+// -----------
+
+// Stacked tabs and pills
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li > a {
+  margin-right: 0; // no need for the gap between nav items
+}
+
+// Tabs
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  .border-radius(0);
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+  .border-radius(4px 4px 0 0);
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+  .border-radius(0 0 4px 4px);
+}
+.nav-tabs.nav-stacked > li > a:hover {
+  border-color: #ddd;
+  z-index: 2;
+}
+
+// Pills
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px; // decrease margin to match sizing of stacked tabs
+}
+
+
+
+// DROPDOWNS
+// ---------
+
+// Position the menu
+.nav-tabs .dropdown-menu,
+.nav-pills .dropdown-menu {
+  margin-top: 1px;
+  border-width: 1px;
+}
+.nav-pills .dropdown-menu {
+  .border-radius(4px);
+}
+
+// Default dropdown links
+// -------------------------
+// Make carets use linkColor to start
+.nav-tabs .dropdown-toggle .caret,
+.nav-pills .dropdown-toggle .caret {
+  border-top-color: @linkColor;
+  margin-top: 6px;
+}
+.nav-tabs .dropdown-toggle:hover .caret,
+.nav-pills .dropdown-toggle:hover .caret {
+  border-top-color: @linkColorHover;
+}
+
+// Active dropdown links
+// -------------------------
+.nav-tabs .active .dropdown-toggle .caret,
+.nav-pills .active .dropdown-toggle .caret {
+  border-top-color: @grayDark;
+}
+
+// Active:hover dropdown links
+// -------------------------
+.nav > .dropdown.active > a:hover {
+  color: @black;
+  cursor: pointer;
+}
+
+// Open dropdowns
+// -------------------------
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > .open.active > a:hover {
+  color: @white;
+  background-color: @grayLight;
+  border-color: @grayLight;
+}
+.nav .open .caret,
+.nav .open.active .caret,
+.nav .open a:hover .caret {
+  border-top-color: @white;
+  .opacity(100);
+}
+
+// Dropdowns in stacked tabs
+.tabs-stacked .open > a:hover {
+  border-color: @grayLight;
+}
+
+
+
+// TABBABLE
+// --------
+
+
+// COMMON STYLES
+// -------------
+
+// Clear any floats
+.tabbable {
+  .clearfix();
+}
+.tab-content {
+  overflow: hidden; // prevent content from running below tabs
+}
+
+// Remove border on bottom, left, right
+.tabs-below .nav-tabs,
+.tabs-right .nav-tabs,
+.tabs-left .nav-tabs {
+  border-bottom: 0;
+}
+
+// Show/hide tabbable areas
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+
+// BOTTOM
+// ------
+
+.tabs-below .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+.tabs-below .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+.tabs-below .nav-tabs > li > a {
+  .border-radius(0 0 4px 4px);
+  &:hover {
+    border-bottom-color: transparent;
+    border-top-color: #ddd;
+  }
+}
+.tabs-below .nav-tabs .active > a,
+.tabs-below .nav-tabs .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+// LEFT & RIGHT
+// ------------
+
+// Common styles
+.tabs-left .nav-tabs > li,
+.tabs-right .nav-tabs > li {
+  float: none;
+}
+.tabs-left .nav-tabs > li > a,
+.tabs-right .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+// Tabs on the left
+.tabs-left .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+.tabs-left .nav-tabs > li > a {
+  margin-right: -1px;
+  .border-radius(4px 0 0 4px);
+}
+.tabs-left .nav-tabs > li > a:hover {
+  border-color: @grayLighter #ddd @grayLighter @grayLighter;
+}
+.tabs-left .nav-tabs .active > a,
+.tabs-left .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: @white;
+}
+
+// Tabs on the right
+.tabs-right .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+.tabs-right .nav-tabs > li > a {
+  margin-left: -1px;
+  .border-radius(0 4px 4px 0);
+}
+.tabs-right .nav-tabs > li > a:hover {
+  border-color: @grayLighter @grayLighter @grayLighter #ddd;
+}
+.tabs-right .nav-tabs .active > a,
+.tabs-right .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: @white;
+}
diff --git a/output/static/css/pager.css b/output/static/css/pager.css
new file mode 100644
index 0000000..104e41c
--- /dev/null
+++ b/output/static/css/pager.css
@@ -0,0 +1,30 @@
+// PAGER
+// -----
+
+.pager {
+  margin-left: 0;
+  margin-bottom: @baseLineHeight;
+  list-style: none;
+  text-align: center;
+  .clearfix();
+}
+.pager li {
+  display: inline;
+}
+.pager a {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  .border-radius(15px);
+}
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.pager .next a {
+  float: right;
+}
+.pager .previous a {
+  float: left;
+}
diff --git a/output/static/css/pagination.css b/output/static/css/pagination.css
new file mode 100644
index 0000000..de57807
--- /dev/null
+++ b/output/static/css/pagination.css
@@ -0,0 +1,55 @@
+// PAGINATION
+// ----------
+
+.pagination {
+  height: @baseLineHeight * 2;
+  margin: @baseLineHeight 0;
+ }
+.pagination ul {
+  display: inline-block;
+  .ie7-inline-block();
+  margin-left: 0;
+  margin-bottom: 0;
+  .border-radius(3px);
+  .box-shadow(0 1px 2px rgba(0,0,0,.05));
+}
+.pagination li {
+    display: inline;
+  }
+.pagination a {
+  float: left;
+  padding: 0 14px;
+  line-height: (@baseLineHeight * 2) - 2;
+  text-decoration: none;
+  border: 1px solid #ddd;
+  border-left-width: 0;
+}
+.pagination a:hover,
+.pagination .active a {
+  background-color: #f5f5f5;
+}
+.pagination .active a {
+  color: @grayLight;
+  cursor: default;
+}
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: @grayLight;
+  background-color: transparent;
+  cursor: default;
+}
+.pagination li:first-child a {
+  border-left-width: 1px;
+  .border-radius(3px 0 0 3px);
+}
+.pagination li:last-child a {
+  .border-radius(0 3px 3px 0);
+}
+
+// Centered
+.pagination-centered {
+  text-align: center;
+}
+.pagination-right {
+  text-align: right;
+}
diff --git a/output/static/css/popovers.css b/output/static/css/popovers.css
new file mode 100644
index 0000000..558d99e
--- /dev/null
+++ b/output/static/css/popovers.css
@@ -0,0 +1,49 @@
+// POPOVERS
+// --------
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: @zindexPopover;
+  display: none;
+  padding: 5px;
+  &.top    { margin-top:  -5px; }
+  &.right  { margin-left:  5px; }
+  &.bottom { margin-top:   5px; }
+  &.left   { margin-left: -5px; }
+  &.top .arrow    { #popoverArrow > .top(); }
+  &.right .arrow  { #popoverArrow > .right(); }
+  &.bottom .arrow { #popoverArrow > .bottom(); }
+  &.left .arrow   { #popoverArrow > .left();  }
+  .arrow {
+    position: absolute;
+    width: 0;
+    height: 0;
+  }
+}
+.popover-inner {
+  padding: 3px;
+  width: 280px;
+  overflow: hidden;
+  background: @black; // has to be full background declaration for IE fallback
+  background: rgba(0,0,0,.8);
+  .border-radius(6px);
+  .box-shadow(0 3px 7px rgba(0,0,0,0.3));
+}
+.popover-title {
+  padding: 9px 15px;
+  line-height: 1;
+  background-color: #f5f5f5;
+  border-bottom:1px solid #eee;
+  .border-radius(3px 3px 0 0);
+}
+.popover-content {
+  padding: 14px;
+  background-color: @white;
+  .border-radius(0 0 3px 3px);
+  .background-clip(padding-box);
+  p, ul, ol {
+    margin-bottom: 0;
+  }
+}
diff --git a/output/static/css/reset.css b/output/static/css/reset.css
new file mode 100644
index 0000000..1115f59
--- /dev/null
+++ b/output/static/css/reset.css
@@ -0,0 +1,126 @@
+// Reset.less
+// Adapted from Normalize.css http://github.com/necolas/normalize.css
+// ------------------------------------------------------------------------
+
+// Display in IE6-9 and FF3
+// -------------------------
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+// Display block in IE6-9 and FF3
+// -------------------------
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+// Prevents modern browsers from displaying 'audio' without controls
+// -------------------------
+
+audio:not([controls]) {
+    display: none;
+}
+
+// Base settings
+// -------------------------
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+// Focus states
+a:focus {
+  .tab-focus();
+}
+// Hover & Active
+a:hover,
+a:active {
+  outline: 0;
+}
+
+// Prevents sub and sup affecting line-height in all browsers
+// -------------------------
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+
+// Img border in a's and image quality
+// -------------------------
+
+img {
+  max-width: 100%;
+  height: auto;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+// Forms
+// -------------------------
+
+// Font size in all browsers, margin changes, misc consistency
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+button,
+input {
+  *overflow: visible; // Inner spacing ie IE6/7
+  line-height: normal; // FF3/4 have !important on line-height in UA stylesheet
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
+  padding: 0;
+  border: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer; // Cursors on all buttons applied consistently
+  -webkit-appearance: button; // Style clickable inputs in iOS
+}
+input[type="search"] { // Appearance in Safari/Chrome
+  -webkit-appearance: textfield;
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
+}
+textarea {
+  overflow: auto; // Remove vertical scrollbar in IE6-9
+  vertical-align: top; // Readability and alignment cross-browser
+}
diff --git a/output/static/css/responsive.css b/output/static/css/responsive.css
new file mode 100644
index 0000000..1547dce
--- /dev/null
+++ b/output/static/css/responsive.css
@@ -0,0 +1,327 @@
+/*!
+ * Bootstrap Responsive v2.0.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+// Responsive.less
+// For phone and tablet devices
+// -------------------------------------------------------------
+
+
+// REPEAT VARIABLES & MIXINS
+// -------------------------
+// Required since we compile the responsive stuff separately
+
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "mixins.less";
+
+
+// RESPONSIVE CLASSES
+// ------------------
+
+// Hide from screenreaders and browsers
+// Credit: HTML5 Boilerplate
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+
+
+// UP TO LANDSCAPE PHONE
+// ---------------------
+
+@media (max-width: 480px) {
+
+  // Smooth out the collapsing/expanding nav
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0); // activate the GPU
+  }
+
+  // Block level the page header small tag for readability
+  .page-header h1 small {
+    display: block;
+    line-height: @baseLineHeight;
+  }
+
+  // Make span* classes full width
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 28px; /* Make inputs at least the height of their button counterpart */
+    /* Makes inputs behave like true block-level elements */
+    -webkit-box-sizing: border-box; /* Older Webkit */
+       -moz-box-sizing: border-box; /* Older FF */
+        -ms-box-sizing: border-box; /* IE8 */
+            box-sizing: border-box; /* CSS3 spec*/
+  }
+  // But don't let it screw up prepend/append inputs
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    width: auto;
+  }
+
+  // Update checkboxes for iOS
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+
+  // Remove the horizontal form styles
+  .form-horizontal .control-group > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  // Move over all input controls and content
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  // Move the options list down to align with labels
+  .form-horizontal .control-list {
+    padding-top: 0; // has to be padding because margin collaspes
+  }
+  // Move over buttons in .form-actions to align with .controls
+  .form-horizontal .form-actions {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+
+  // Modals
+  .modal {
+    position: absolute;
+    top:   10px;
+    left:  10px;
+    right: 10px;
+    width: auto;
+    margin: 0;
+    &.fade.in { top: auto; }
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+
+  // Carousel
+  .carousel-caption {
+    position: static;
+  }
+
+}
+
+
+
+// LANDSCAPE PHONE TO SMALL DESKTOP & PORTRAIT TABLET
+// --------------------------------------------------
+
+@media (max-width: 767px) {
+  // GRID & CONTAINERS
+  // -----------------
+  // Remove width from containers
+  .container {
+    width: auto;
+    padding: 0 20px;
+  }
+  // Fluid rows
+  .row-fluid {
+    width: 100%;
+  }
+  // Undo negative margin on rows
+  .row {
+    margin-left: 0;
+  }
+  // Make all columns even
+  .row > [class*="span"],
+  .row-fluid > [class*="span"] {
+    float: none;
+    display: block;
+    width: auto;
+    margin: 0;
+  }
+}
+
+
+
+// PORTRAIT TABLET TO DEFAULT DESKTOP
+// ----------------------------------
+
+@media (min-width: 768px) and (max-width: 979px) {
+
+  // Fixed grid
+  #gridSystem > .generate(12, 42px, 20px);
+
+  // Fluid grid
+  #fluidGridSystem > .generate(12, 5.801104972%, 2.762430939%);
+
+  // Input grid
+  #inputGridSystem > .generate(12, 42px, 20px);
+
+}
+
+
+
+// TABLETS AND BELOW
+// -----------------
+@media (max-width: 979px) {
+
+  // UNFIX THE TOPBAR
+  // ----------------
+  // Remove any padding from the body
+  body {
+    padding-top: 0;
+  }
+  // Unfix the navbar
+  .navbar-fixed-top {
+    position: static;
+    margin-bottom: @baseLineHeight;
+  }
+  .navbar-fixed-top .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  // Account for brand name
+  .navbar .brand {
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0 0 0 -5px;
+  }
+  // Nav collapse clears brand
+  .navbar .nav-collapse {
+    clear: left;
+  }
+  // Block-level the nav
+  .navbar .nav {
+    float: none;
+    margin: 0 0 (@baseLineHeight / 2);
+  }
+  .navbar .nav > li {
+    float: none;
+  }
+  .navbar .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .navbar .nav > .divider-vertical {
+    display: none;
+  }
+  .navbar .nav .nav-header {
+    color: @navbarText;
+    text-shadow: none;
+  }
+  // Nav and dropdown links in navbar
+  .navbar .nav > li > a,
+  .navbar .dropdown-menu a {
+    padding: 6px 15px;
+    font-weight: bold;
+    color: @navbarLinkColor;
+    .border-radius(3px);
+  }
+  .navbar .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .navbar .nav > li > a:hover,
+  .navbar .dropdown-menu a:hover {
+    background-color: @navbarBackground;
+  }
+  // Dropdowns in the navbar
+  .navbar .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    float: none;
+    display: block;
+    max-width: none;
+    margin: 0 15px;
+    padding: 0;
+    background-color: transparent;
+    border: none;
+    .border-radius(0);
+    .box-shadow(none);
+  }
+  .navbar .dropdown-menu:before,
+  .navbar .dropdown-menu:after {
+    display: none;
+  }
+  .navbar .dropdown-menu .divider {
+    display: none;
+  }
+  // Forms in navbar
+  .navbar-form,
+  .navbar-search {
+    float: none;
+    padding: (@baseLineHeight / 2) 15px;
+    margin: (@baseLineHeight / 2) 0;
+    border-top: 1px solid @navbarBackground;
+    border-bottom: 1px solid @navbarBackground;
+    @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+    .box-shadow(@shadow);
+  }
+  // Pull right (secondary) nav content
+  .navbar .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  // Static navbar
+  .navbar-static .navbar-inner {
+    padding-left:  10px;
+    padding-right: 10px;
+  }
+  // Navbar button
+  .btn-navbar {
+    display: block;
+  }
+
+  // Hide everything in the navbar save .brand and toggle button */
+  .nav-collapse {
+    overflow: hidden;
+    height: 0;
+  }
+}
+
+
+
+// DEFAULT DESKTOP
+// ---------------
+
+@media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+  }
+}
+
+
+
+// LARGE DESKTOP & UP
+// ------------------
+
+@media (min-width: 1200px) {
+
+  // Fixed grid
+  #gridSystem > .generate(12, 70px, 30px);
+
+  // Fluid grid
+  #fluidGridSystem > .generate(12, 5.982905983%, 2.564102564%);
+
+  // Input grid
+  #inputGridSystem > .generate(12, 70px, 30px);
+
+  // Thumbnails
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+
+}
diff --git a/output/static/css/scaffolding.css b/output/static/css/scaffolding.css
new file mode 100644
index 0000000..47ce538
--- /dev/null
+++ b/output/static/css/scaffolding.css
@@ -0,0 +1,29 @@
+// Scaffolding
+// Basic and global styles for generating a grid system, structural layout, and page templates
+// -------------------------------------------------------------------------------------------
+
+
+// STRUCTURAL LAYOUT
+// -----------------
+
+body {
+  margin: 0;
+  font-family: @baseFontFamily;
+  font-size: @baseFontSize;
+  line-height: @baseLineHeight;
+  color: @textColor;
+  background-color: @white;
+}
+
+
+// LINKS
+// -----
+
+a {
+  color: @linkColor;
+  text-decoration: none;
+}
+a:hover {
+  color: @linkColorHover;
+  text-decoration: underline;
+}
diff --git a/output/static/css/sprites.css b/output/static/css/sprites.css
new file mode 100644
index 0000000..a7f9122
--- /dev/null
+++ b/output/static/css/sprites.css
@@ -0,0 +1,158 @@
+// SPRITES
+// Glyphs and icons for buttons, nav, and more
+// -------------------------------------------
+
+
+// ICONS
+// -----
+
+// All icons receive the styles of the <i> tag with a base class
+// of .i and are then given a unique class to add width, height,
+// and background-position. Your resulting HTML will look like
+// <i class="icon-inbox"></i>.
+
+// For the white version of the  icons, just add the .icon-white class:
+// <i class="icon-inbox icon-white"></i>
+
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url(@iconSpritePath);
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+
+  .ie7-restore-right-whitespace();
+}
+.icon-white {
+  background-image: url(@iconWhiteSpritePath);
+}
+
+.icon-glass              { background-position: 0      0; }
+.icon-music              { background-position: -24px  0; }
+.icon-search             { background-position: -48px  0; }
+.icon-envelope           { background-position: -72px  0; }
+.icon-heart              { background-position: -96px  0; }
+.icon-star               { background-position: -120px 0; }
+.icon-star-empty         { background-position: -144px 0; }
+.icon-user               { background-position: -168px 0; }
+.icon-film               { background-position: -192px 0; }
+.icon-th-large           { background-position: -216px 0; }
+.icon-th                 { background-position: -240px 0; }
+.icon-th-list            { background-position: -264px 0; }
+.icon-ok                 { background-position: -288px 0; }
+.icon-remove             { background-position: -312px 0; }
+.icon-zoom-in            { background-position: -336px 0; }
+.icon-zoom-out           { background-position: -360px 0; }
+.icon-off                { background-position: -384px 0; }
+.icon-signal             { background-position: -408px 0; }
+.icon-cog                { background-position: -432px 0; }
+.icon-trash              { background-position: -456px 0; }
+
+.icon-home               { background-position: 0      -24px; }
+.icon-file               { background-position: -24px  -24px; }
+.icon-time               { background-position: -48px  -24px; }
+.icon-road               { background-position: -72px  -24px; }
+.icon-download-alt       { background-position: -96px  -24px; }
+.icon-download           { background-position: -120px -24px; }
+.icon-upload             { background-position: -144px -24px; }
+.icon-inbox              { background-position: -168px -24px; }
+.icon-play-circle        { background-position: -192px -24px; }
+.icon-repeat             { background-position: -216px -24px; }
+.icon-refresh            { background-position: -240px -24px; }
+.icon-list-alt           { background-position: -264px -24px; }
+.icon-lock               { background-position: -287px -24px; } // 1px off
+.icon-flag               { background-position: -312px -24px; }
+.icon-headphones         { background-position: -336px -24px; }
+.icon-volume-off         { background-position: -360px -24px; }
+.icon-volume-down        { background-position: -384px -24px; }
+.icon-volume-up          { background-position: -408px -24px; }
+.icon-qrcode             { background-position: -432px -24px; }
+.icon-barcode            { background-position: -456px -24px; }
+
+.icon-tag                { background-position: 0      -48px; }
+.icon-tags               { background-position: -25px  -48px; } // 1px off
+.icon-book               { background-position: -48px  -48px; }
+.icon-bookmark           { background-position: -72px  -48px; }
+.icon-print              { background-position: -96px  -48px; }
+.icon-camera             { background-position: -120px -48px; }
+.icon-font               { background-position: -144px -48px; }
+.icon-bold               { background-position: -167px -48px; } // 1px off
+.icon-italic             { background-position: -192px -48px; }
+.icon-text-height        { background-position: -216px -48px; }
+.icon-text-width         { background-position: -240px -48px; }
+.icon-align-left         { background-position: -264px -48px; }
+.icon-align-center       { background-position: -288px -48px; }
+.icon-align-right        { background-position: -312px -48px; }
+.icon-align-justify      { background-position: -336px -48px; }
+.icon-list               { background-position: -360px -48px; }
+.icon-indent-left        { background-position: -384px -48px; }
+.icon-indent-right       { background-position: -408px -48px; }
+.icon-facetime-video     { background-position: -432px -48px; }
+.icon-picture            { background-position: -456px -48px; }
+
+.icon-pencil             { background-position: 0      -72px; }
+.icon-map-marker         { background-position: -24px  -72px; }
+.icon-adjust             { background-position: -48px  -72px; }
+.icon-tint               { background-position: -72px  -72px; }
+.icon-edit               { background-position: -96px  -72px; }
+.icon-share              { background-position: -120px -72px; }
+.icon-check              { background-position: -144px -72px; }
+.icon-move               { background-position: -168px -72px; }
+.icon-step-backward      { background-position: -192px -72px; }
+.icon-fast-backward      { background-position: -216px -72px; }
+.icon-backward           { background-position: -240px -72px; }
+.icon-play               { background-position: -264px -72px; }
+.icon-pause              { background-position: -288px -72px; }
+.icon-stop               { background-position: -312px -72px; }
+.icon-forward            { background-position: -336px -72px; }
+.icon-fast-forward       { background-position: -360px -72px; }
+.icon-step-forward       { background-position: -384px -72px; }
+.icon-eject              { background-position: -408px -72px; }
+.icon-chevron-left       { background-position: -432px -72px; }
+.icon-chevron-right      { background-position: -456px -72px; }
+
+.icon-plus-sign          { background-position: 0      -96px; }
+.icon-minus-sign         { background-position: -24px  -96px; }
+.icon-remove-sign        { background-position: -48px  -96px; }
+.icon-ok-sign            { background-position: -72px  -96px; }
+.icon-question-sign      { background-position: -96px  -96px; }
+.icon-info-sign          { background-position: -120px -96px; }
+.icon-screenshot         { background-position: -144px -96px; }
+.icon-remove-circle      { background-position: -168px -96px; }
+.icon-ok-circle          { background-position: -192px -96px; }
+.icon-ban-circle         { background-position: -216px -96px; }
+.icon-arrow-left         { background-position: -240px -96px; }
+.icon-arrow-right        { background-position: -264px -96px; }
+.icon-arrow-up           { background-position: -289px -96px; } // 1px off
+.icon-arrow-down         { background-position: -312px -96px; }
+.icon-share-alt          { background-position: -336px -96px; }
+.icon-resize-full        { background-position: -360px -96px; }
+.icon-resize-small       { background-position: -384px -96px; }
+.icon-plus               { background-position: -408px -96px; }
+.icon-minus              { background-position: -433px -96px; }
+.icon-asterisk           { background-position: -456px -96px; }
+
+.icon-exclamation-sign   { background-position: 0      -120px; }
+.icon-gift               { background-position: -24px  -120px; }
+.icon-leaf               { background-position: -48px  -120px; }
+.icon-fire               { background-position: -72px  -120px; }
+.icon-eye-open           { background-position: -96px  -120px; }
+.icon-eye-close          { background-position: -120px -120px; }
+.icon-warning-sign       { background-position: -144px -120px; }
+.icon-plane              { background-position: -168px -120px; }
+.icon-calendar           { background-position: -192px -120px; }
+.icon-random             { background-position: -216px -120px; }
+.icon-comment            { background-position: -240px -120px; }
+.icon-magnet             { background-position: -264px -120px; }
+.icon-chevron-up         { background-position: -288px -120px; }
+.icon-chevron-down       { background-position: -313px -119px; } // 1px off
+.icon-retweet            { background-position: -336px -120px; }
+.icon-shopping-cart      { background-position: -360px -120px; }
+.icon-folder-close       { background-position: -384px -120px; }
+.icon-folder-open        { background-position: -408px -120px; }
+.icon-resize-vertical    { background-position: -432px -119px; }
+.icon-resize-horizontal  { background-position: -456px -118px; }
diff --git a/output/static/css/style.css b/output/static/css/style.css
new file mode 100644
index 0000000..6053ac6
--- /dev/null
+++ b/output/static/css/style.css
@@ -0,0 +1,3 @@
+.center {
+  text-align: center;
+}
diff --git a/output/static/css/tables.css b/output/static/css/tables.css
new file mode 100644
index 0000000..3a4066d
--- /dev/null
+++ b/output/static/css/tables.css
@@ -0,0 +1,150 @@
+//
+// Tables.less
+// Tables for, you guessed it, tabular data
+// ----------------------------------------
+
+
+// BASE TABLES
+// -----------------
+
+table {
+  max-width: 100%;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+// BASELINE STYLES
+// ---------------
+
+.table {
+  width: 100%;
+  margin-bottom: @baseLineHeight;
+  // Cells
+  th,
+  td {
+    padding: 8px;
+    line-height: @baseLineHeight;
+    text-align: left;
+    vertical-align: top;
+    border-top: 1px solid #ddd;
+  }
+  th {
+    font-weight: bold;
+  }
+  // Bottom align for column headings
+  thead th {
+    vertical-align: bottom;
+  }
+  // Remove top border from thead by default
+  thead:first-child tr th,
+  thead:first-child tr td {
+    border-top: 0;
+  }
+  // Account for multiple tbody instances
+  tbody + tbody {
+    border-top: 2px solid #ddd;
+  }
+}
+
+
+
+// CONDENSED TABLE W/ HALF PADDING
+// -------------------------------
+
+.table-condensed {
+  th,
+  td {
+    padding: 4px 5px;
+  }
+}
+
+
+// BORDERED VERSION
+// ----------------
+
+.table-bordered {
+  border: 1px solid #ddd;
+  border-collapse: separate; // Done so we can round those corners!
+  *border-collapse: collapsed; // IE7 can't round corners anyway
+  .border-radius(4px);
+  th + th,
+  td + td,
+  th + td,
+  td + th {
+    border-left: 1px solid #ddd;
+  }
+  // Prevent a double border
+  thead:first-child tr:first-child th,
+  tbody:first-child tr:first-child th,
+  tbody:first-child tr:first-child td {
+    border-top: 0;
+  }
+  // For first th or td in the first row in the first thead or tbody
+  thead:first-child tr:first-child th:first-child,
+  tbody:first-child tr:first-child td:first-child {
+    .border-radius(4px 0 0 0);
+  }
+  thead:first-child tr:first-child th:last-child,
+  tbody:first-child tr:first-child td:last-child {
+    .border-radius(0 4px 0 0);
+  }
+  // For first th or td in the first row in the first thead or tbody
+  thead:last-child tr:last-child th:first-child,
+  tbody:last-child tr:last-child td:first-child {
+    .border-radius(0 0 0 4px);
+  }
+  thead:last-child tr:last-child th:last-child,
+  tbody:last-child tr:last-child td:last-child {
+    .border-radius(0 0 4px 0);
+  }
+}
+
+
+// ZEBRA-STRIPING
+// --------------
+
+// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+.table-striped {
+  tbody {
+    tr:nth-child(odd) td,
+    tr:nth-child(odd) th {
+      background-color: #f9f9f9;
+    }
+  }
+}
+
+
+// HOVER EFFECT
+// ------------
+// Placed here since it has to come after the potential zebra striping
+.table {
+  tbody tr:hover td,
+  tbody tr:hover th {
+    background-color: #f5f5f5;
+  }
+}
+
+
+// TABLE CELL SIZING
+// -----------------
+
+// Change the columns
+.tableColumns(@columnSpan: 1) {
+  float: none;
+  width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16;
+  margin-left: 0;
+}
+table {
+  .span1     { .tableColumns(1); }
+  .span2     { .tableColumns(2); }
+  .span3     { .tableColumns(3); }
+  .span4     { .tableColumns(4); }
+  .span5     { .tableColumns(5); }
+  .span6     { .tableColumns(6); }
+  .span7     { .tableColumns(7); }
+  .span8     { .tableColumns(8); }
+  .span9     { .tableColumns(9); }
+  .span10    { .tableColumns(10); }
+  .span11    { .tableColumns(11); }
+  .span12    { .tableColumns(12); }
+}
diff --git a/output/static/css/thrift.css b/output/static/css/thrift.css
new file mode 100644
index 0000000..165acef
--- /dev/null
+++ b/output/static/css/thrift.css
@@ -0,0 +1,25 @@
+
+a.headerlink:hover {
+  text-decoration: none
+}
+
+h1 > .headerlink,
+h2 > .headerlink,
+h3 > .headerlink,
+h4 > .headerlink,
+h5 > .headerlink,
+h6 > .headerlink,
+dt > .elementid-permalink {
+  visibility: hidden
+}
+
+h1:hover > .headerlink,
+h2:hover > .headerlink,
+h3:hover > .headerlink,
+h4:hover > .headerlink,
+h5:hover > .headerlink,
+h6:hover > .headerlink,
+dt:hover > .elementid-permalink {
+  visibility: visible
+}
+
diff --git a/output/static/css/thumbnails.css b/output/static/css/thumbnails.css
new file mode 100644
index 0000000..3a12d4e
--- /dev/null
+++ b/output/static/css/thumbnails.css
@@ -0,0 +1,35 @@
+// THUMBNAILS
+// ----------
+
+.thumbnails {
+  margin-left: -@gridGutterWidth;
+  list-style: none;
+  .clearfix();
+}
+.thumbnails > li {
+  float: left;
+  margin: 0 0 @baseLineHeight @gridGutterWidth;
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 1;
+  border: 1px solid #ddd;
+  .border-radius(4px);
+  .box-shadow(0 1px 1px rgba(0,0,0,.075));
+}
+// Add a hover state for linked versions only
+a.thumbnail:hover {
+  border-color: @linkColor;
+  .box-shadow(0 1px 4px rgba(0,105,214,.25));
+}
+// Images and captions
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-left: auto;
+  margin-right: auto;
+}
+.thumbnail .caption {
+  padding: 9px;
+}
diff --git a/output/static/css/tooltip.css b/output/static/css/tooltip.css
new file mode 100644
index 0000000..5111a19
--- /dev/null
+++ b/output/static/css/tooltip.css
@@ -0,0 +1,35 @@
+// TOOLTIP
+// ------=
+
+.tooltip {
+  position: absolute;
+  z-index: @zindexTooltip;
+  display: block;
+  visibility: visible;
+  padding: 5px;
+  font-size: 11px;
+  .opacity(0);
+  &.in     { .opacity(80); }
+  &.top    { margin-top:  -2px; }
+  &.right  { margin-left:  2px; }
+  &.bottom { margin-top:   2px; }
+  &.left   { margin-left: -2px; }
+  &.top .tooltip-arrow    { #popoverArrow > .top(); }
+  &.left .tooltip-arrow   { #popoverArrow > .left(); }
+  &.bottom .tooltip-arrow { #popoverArrow > .bottom(); }
+  &.right .tooltip-arrow  { #popoverArrow > .right(); }
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: @white;
+  text-align: center;
+  text-decoration: none;
+  background-color: @black;
+  .border-radius(4px);
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+}
diff --git a/output/static/css/type.css b/output/static/css/type.css
new file mode 100644
index 0000000..bcf06d6
--- /dev/null
+++ b/output/static/css/type.css
@@ -0,0 +1,218 @@
+// Typography.less
+// Headings, body text, lists, code, and more for a versatile and durable typography system
+// ----------------------------------------------------------------------------------------
+
+
+// BODY TEXT
+// ---------
+
+p {
+  margin: 0 0 @baseLineHeight / 2;
+  font-family: @baseFontFamily;
+  font-size: @baseFontSize;
+  line-height: @baseLineHeight;
+  small {
+    font-size: @baseFontSize - 2;
+    color: @grayLight;
+  }
+}
+.lead {
+  margin-bottom: @baseLineHeight;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: @baseLineHeight * 1.5;
+}
+
+// HEADINGS
+// --------
+
+h1, h2, h3, h4, h5, h6 {
+  margin: 0;
+  font-weight: bold;
+  color: @grayDark;
+  text-rendering: optimizelegibility; // Fix the character spacing for headings
+  small {
+    font-weight: normal;
+    color: @grayLight;
+  }
+}
+h1 {
+  font-size: 30px;
+  line-height: @baseLineHeight * 2;
+  small {
+    font-size: 18px;
+  }
+}
+h2 {
+  font-size: 24px;
+  line-height: @baseLineHeight * 2;
+  small {
+    font-size: 18px;
+  }
+}
+h3 {
+  line-height: @baseLineHeight * 1.5;
+  font-size: 18px;
+  small {
+    font-size: 14px;
+  }
+}
+h4, h5, h6 {
+  line-height: @baseLineHeight;
+}
+h4 {
+  font-size: 14px;
+  small {
+    font-size: 12px;
+  }
+}
+h5 {
+  font-size: 12px;
+}
+h6 {
+  font-size: 11px;
+  color: @grayLight;
+  text-transform: uppercase;
+}
+
+// Page header
+.page-header {
+  padding-bottom: @baseLineHeight - 1;
+  margin: @baseLineHeight 0;
+  border-bottom: 1px solid @grayLighter;
+}
+.page-header h1 {
+  line-height: 1;
+}
+
+
+
+// LISTS
+// -----
+
+// Unordered and Ordered lists
+ul, ol {
+  padding: 0;
+  margin: 0 0 @baseLineHeight / 2 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+ul {
+  list-style: disc;
+}
+ol {
+  list-style: decimal;
+}
+li {
+  line-height: @baseLineHeight;
+}
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+// Description Lists
+dl {
+  margin-bottom: @baseLineHeight;
+}
+dt,
+dd {
+  line-height: @baseLineHeight;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: @baseLineHeight / 2;
+}
+
+// MISC
+// ----
+
+// Horizontal rules
+hr {
+  margin: @baseLineHeight 0;
+  border: 0;
+  border-top: 1px solid @hrBorder;
+  border-bottom: 1px solid @white;
+}
+
+// Emphasis
+strong {
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+}
+.muted {
+  color: @grayLight;
+}
+
+// Abbreviations and acronyms
+abbr {
+  font-size: 90%;
+  text-transform: uppercase;
+  border-bottom: 1px dotted #ddd;
+  cursor: help;
+}
+
+// Blockquotes
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 @baseLineHeight;
+  border-left: 5px solid @grayLighter;
+  p {
+    margin-bottom: 0;
+    #font > .shorthand(16px,300,@baseLineHeight * 1.25);
+  }
+  small {
+    display: block;
+    line-height: @baseLineHeight;
+    color: @grayLight;
+    &:before {
+      content: '\2014 \00A0';
+    }
+  }
+
+  // Float right with text-align: right
+  &.pull-right {
+    float: right;
+    padding-left: 0;
+    padding-right: 15px;
+    border-left: 0;
+    border-right: 5px solid @grayLighter;
+    p,
+    small {
+      text-align: right;
+    }
+  }
+}
+
+// Quotes
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+// Addresses
+address {
+  display: block;
+  margin-bottom: @baseLineHeight;
+  line-height: @baseLineHeight;
+  font-style: normal;
+}
+
+// Misc
+small {
+  font-size: 100%;
+}
+cite {
+  font-style: normal;
+}
diff --git a/output/static/css/utilities.css b/output/static/css/utilities.css
new file mode 100644
index 0000000..d60d220
--- /dev/null
+++ b/output/static/css/utilities.css
@@ -0,0 +1,23 @@
+// UTILITY CLASSES
+// ---------------
+
+// Quick floats
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+
+// Toggling content
+.hide {
+  display: none;
+}
+.show {
+  display: block;
+}
+
+// Visibility
+.invisible {
+  visibility: hidden;
+}
diff --git a/output/static/css/variables.css b/output/static/css/variables.css
new file mode 100644
index 0000000..3d448ab
--- /dev/null
+++ b/output/static/css/variables.css
@@ -0,0 +1,107 @@
+// Variables.less
+// Variables to customize the look and feel of Bootstrap
+// -----------------------------------------------------
+
+
+
+// GLOBAL VALUES
+// --------------------------------------------------
+
+// Links
+@linkColor:             #08c;
+@linkColorHover:        darken(@linkColor, 15%);
+
+// Grays
+@black:                 #000;
+@grayDarker:            #222;
+@grayDark:              #333;
+@gray:                  #555;
+@grayLight:             #999;
+@grayLighter:           #eee;
+@white:                 #fff;
+
+// Accent colors
+@blue:                  #049cdb;
+@blueDark:              #0064cd;
+@green:                 #46a546;
+@red:                   #9d261d;
+@yellow:                #ffc40d;
+@orange:                #f89406;
+@pink:                  #c3325f;
+@purple:                #7a43b6;
+
+// Typography
+@baseFontSize:          13px;
+@baseFontFamily:        "Helvetica Neue", Helvetica, Arial, sans-serif;
+@baseLineHeight:        18px;
+@textColor:             @grayDark;
+
+// Buttons
+@primaryButtonBackground:    @linkColor;
+
+
+
+// COMPONENT VARIABLES
+// --------------------------------------------------
+
+// Z-index master list
+// Used for a bird's eye view of components dependent on the z-axis
+// Try to avoid customizing these :)
+@zindexDropdown:          1000;
+@zindexPopover:           1010;
+@zindexTooltip:           1020;
+@zindexFixedNavbar:       1030;
+@zindexModalBackdrop:     1040;
+@zindexModal:             1050;
+
+// Sprite icons path
+@iconSpritePath:          "../img/glyphicons-halflings.png";
+@iconWhiteSpritePath:     "../img/glyphicons-halflings-white.png";
+
+// Input placeholder text color
+@placeholderText:         @grayLight;
+
+// Hr border color
+@hrBorder:                @grayLighter;
+
+// Navbar
+@navbarHeight:                    40px;
+@navbarBackground:                @grayDarker;
+@navbarBackgroundHighlight:       @grayDark;
+@navbarLinkBackgroundHover:       transparent;
+
+@navbarText:                      @grayLight;
+@navbarLinkColor:                 @grayLight;
+@navbarLinkColorHover:            @white;
+
+// Form states and alerts
+@warningText:             #c09853;
+@warningBackground:       #fcf8e3;
+@warningBorder:           darken(spin(@warningBackground, -10), 3%);
+
+@errorText:               #b94a48;
+@errorBackground:         #f2dede;
+@errorBorder:             darken(spin(@errorBackground, -10), 3%);
+
+@successText:             #468847;
+@successBackground:       #dff0d8;
+@successBorder:           darken(spin(@successBackground, -10), 5%);
+
+@infoText:                #3a87ad;
+@infoBackground:          #d9edf7;
+@infoBorder:              darken(spin(@infoBackground, -10), 7%);
+
+
+
+// GRID
+// --------------------------------------------------
+
+// Default 940px grid
+@gridColumns:             12;
+@gridColumnWidth:         60px;
+@gridGutterWidth:         20px;
+@gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
+
+// Fluid grid
+@fluidGridColumnWidth:    6.382978723%;
+@fluidGridGutterWidth:    2.127659574%;
diff --git a/output/static/css/wells.css b/output/static/css/wells.css
new file mode 100644
index 0000000..244b8ca
--- /dev/null
+++ b/output/static/css/wells.css
@@ -0,0 +1,17 @@
+// WELLS
+// -----
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #eee;
+  border: 1px solid rgba(0,0,0,.05);
+  .border-radius(4px);
+  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
+  blockquote {
+    border-color: #ddd;
+    border-color: rgba(0,0,0,.15);
+  }
+}
diff --git a/output/static/files/thrift-20070401.pdf b/output/static/files/thrift-20070401.pdf
new file mode 100644
index 0000000..a9eb35a
--- /dev/null
+++ b/output/static/files/thrift-20070401.pdf
Binary files differ
diff --git a/output/static/images/apache-incubator-small.png b/output/static/images/apache-incubator-small.png
new file mode 100644
index 0000000..03855e1
--- /dev/null
+++ b/output/static/images/apache-incubator-small.png
Binary files differ
diff --git a/output/static/images/apache-incubator.png b/output/static/images/apache-incubator.png
new file mode 100644
index 0000000..81fb31e
--- /dev/null
+++ b/output/static/images/apache-incubator.png
Binary files differ
diff --git a/output/static/images/favicon.ico b/output/static/images/favicon.ico
new file mode 100644
index 0000000..e4d94b5
--- /dev/null
+++ b/output/static/images/favicon.ico
Binary files differ
diff --git a/output/static/images/feather.png b/output/static/images/feather.png
new file mode 100644
index 0000000..04065b8
--- /dev/null
+++ b/output/static/images/feather.png
Binary files differ
diff --git a/output/static/images/feather.svg b/output/static/images/feather.svg
new file mode 100644
index 0000000..738dcc2
--- /dev/null
+++ b/output/static/images/feather.svg
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Feather" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+   width="32px" height="32px"
+	 viewBox="0 0 2392.5 4226.6" enable-background="new 0 0 2392.5 4226.6" xml:space="preserve">
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-5167.0962" y1="697.5549" x2="-4570.1162" y2="1395.619" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0" style="stop-color:#F69923"/>
+	<stop  offset="0.3123" style="stop-color:#F79A23"/>
+	<stop  offset="0.8383" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M1798.9,20.1C1732.6,59.2,1622.5,170,1491,330.5l120.8,228c84.8-121.3,170.9-230.4,257.8-323.6
+	c6.7-7.4,10.2-10.9,10.2-10.9c-3.4,3.6-6.8,7.3-10.2,10.9c-28.1,31-113.4,130.5-242.1,328.1c123.9-6.2,314.3-31.5,469.6-58.1
+	c46.2-258.8-45.3-377.3-45.3-377.3S1935.5-60.6,1798.9,20.1z"/>
+<path fill="none" d="M1594.4,1320.7c0.9-0.2,1.8-0.3,2.7-0.5l-17.4,1.9c-1.1,0.5-2,1-3.1,1.4
+	C1582.6,1322.6,1588.5,1321.6,1594.4,1320.7z"/>
+<path fill="none" d="M1471.1,1729.1c-9.9,2.2-20,3.9-30.2,5.4C1451.1,1733,1461.2,1731.2,1471.1,1729.1z"/>
+<path fill="none" d="M633.1,2645.2c1.3-3.4,2.6-6.8,3.8-10.2c26.6-70.2,52.9-138.4,79-204.9c29.3-74.6,58.2-146.8,86.8-216.8
+	c30.1-73.8,59.8-145.1,89.1-214c30.7-72.3,61-141.9,90.7-208.9c24.2-54.5,48-107.3,71.5-158.4c7.8-17,15.6-33.9,23.4-50.6
+	c15.4-33.1,30.7-65.6,45.7-97.3c13.9-29.3,27.7-57.9,41.4-86c4.5-9.4,9.1-18.6,13.6-27.9c0.7-1.5,1.5-3,2.2-4.5l-14.8,1.6
+	l-11.8-23.2c-1.1,2.3-2.3,4.5-3.5,6.8c-21.2,42.1-42.2,84.6-63,127.5c-12,24.8-24,49.7-35.9,74.7c-33,69.3-65.5,139.2-97.4,209.6
+	c-32.3,71.1-63.9,142.6-94.9,214.2c-30.5,70.3-60.3,140.7-89.6,210.9c-29.2,70.1-57.7,140-85.6,209.4
+	c-29.1,72.5-57.4,144.3-84.8,215.3c-6.2,16-12.4,32-18.5,48c-22,57.3-43.4,113.8-64.3,169.6l18.6,36.7l16.6-1.8
+	c0.6-1.7,1.2-3.4,1.8-5C580.1,2786.5,606.7,2714.9,633.1,2645.2z"/>
+<path fill="none" d="M1433.2,1735.7L1433.2,1735.7c0.1,0,0.1-0.1,0.2-0.1C1433.4,1735.6,1433.3,1735.6,1433.2,1735.7z"/>
+<path fill="#BE202E" d="M1393.2,1934.8c-15.4,2.8-31.3,5.5-47.6,8.3c-0.1,0-0.2,0.1-0.3,0.1c8.2-1.2,16.3-2.4,24.3-3.8
+	C1377.6,1938,1385.4,1936.5,1393.2,1934.8z"/>
+<path opacity="0.35" fill="#BE202E" d="M1393.2,1934.8c-15.4,2.8-31.3,5.5-47.6,8.3c-0.1,0-0.2,0.1-0.3,0.1
+	c8.2-1.2,16.3-2.4,24.3-3.8C1377.6,1938,1385.4,1936.5,1393.2,1934.8z"/>
+<path fill="#BE202E" d="M1433.6,1735.5c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0.1-0.2,0.1c2.6-0.3,5.1-0.8,7.6-1.1
+	c10.3-1.5,20.4-3.3,30.2-5.4C1458.8,1731.2,1446.3,1733.4,1433.6,1735.5L1433.6,1735.5L1433.6,1735.5z"/>
+<path opacity="0.35" fill="#BE202E" d="M1433.6,1735.5c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0.1-0.2,0.1c2.6-0.3,5.1-0.8,7.6-1.1
+	c10.3-1.5,20.4-3.3,30.2-5.4C1458.8,1731.2,1446.3,1733.4,1433.6,1735.5L1433.6,1735.5L1433.6,1735.5z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-9585.3418" y1="620.5048" x2="-5326.209" y2="620.5048" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M1255.7,1147.6c36.7-68.6,73.9-135.7,111.5-201c39-67.8,78.5-133.6,118.4-197c2.3-3.7,4.7-7.5,7-11.3
+	c39.4-62.4,79.2-122.4,119.3-179.8l-120.8-228c-9.1,11.1-18.2,22.4-27.5,33.9c-34.8,43.4-71,90.1-108.1,139.6
+	c-41.8,55.8-84.8,115.4-128.5,177.9c-40.3,57.8-81.2,118.3-122.1,180.9c-34.8,53.3-69.8,108.2-104.5,164.5c-1.3,2.1-2.6,4.2-3.9,6.3
+	l157.2,310.5C1187.3,1277.6,1221.3,1212,1255.7,1147.6z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-9071.207" y1="1047.6898" x2="-6533.1782" y2="1047.6898" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0" style="stop-color:#282662"/>
+	<stop  offset="9.548390e-02" style="stop-color:#662E8D"/>
+	<stop  offset="0.7882" style="stop-color:#9F2064"/>
+	<stop  offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" d="M539.7,2897.1c-20.8,57.2-41.7,115.4-62.7,174.9c-0.3,0.9-0.6,1.7-0.9,2.6c-3,8.4-5.9,16.8-8.9,25.2
+	c-14.1,40.1-26.4,76.2-54.5,158.3c46.3,21.1,83.5,76.7,118.7,139.8c-3.7-65.3-30.8-126.7-82.1-174.2
+	c228.3,10.3,425-47.4,526.7-214.3c9.1-14.9,17.4-30.5,24.9-47.2c-46.2,58.6-103.5,83.5-211.4,77.4c-0.2,0.1-0.5,0.2-0.7,0.3
+	c0.2-0.1,0.5-0.2,0.7-0.3c158.8-71.1,238.5-139.3,308.9-252.4c16.7-26.8,32.9-56.1,49.5-88.6C1009,2841.2,848.1,2881.8,678.6,2851
+	l-127.1,13.9C547.5,2875.6,543.6,2886.3,539.7,2897.1z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="580.817" x2="-5086.9941" y2="580.817" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_4_)" d="M599,2612.4c27.5-71,55.8-142.8,84.8-215.3c27.8-69.4,56.4-139.2,85.6-209.4
+	c29.2-70.2,59.1-140.5,89.6-210.9c31-71.6,62.7-143.1,94.9-214.2c31.9-70.3,64.4-140.3,97.4-209.6c11.9-25,23.9-49.9,35.9-74.7
+	c20.8-42.9,41.8-85.4,63-127.5c1.1-2.3,2.3-4.5,3.5-6.8l-157.2-310.5c-2.6,4.2-5.1,8.4-7.7,12.6c-36.6,59.8-73.1,121-108.9,183.5
+	c-36.2,63.1-71.7,127.4-106.4,192.6c-29.3,55-57.9,110.5-85.7,166.5c-5.6,11.4-11.1,22.6-16.6,33.9
+	c-34.3,70.5-65.2,138.6-93.2,204.1c-31.7,74.2-59.6,145.1-84,212.3c-16.1,44.2-30.7,86.9-44.1,127.9c-11,35-21.5,70.1-31.4,105
+	c-23.5,82.3-43.7,164.4-60.3,246.2L516.2,2830c20.9-55.8,42.3-112.3,64.3-169.6C586.6,2644.5,592.8,2628.4,599,2612.4z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-9035.5029" y1="638.4408" x2="-6797.2012" y2="638.4408" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0" style="stop-color:#282662"/>
+	<stop  offset="9.548390e-02" style="stop-color:#662E8D"/>
+	<stop  offset="0.7882" style="stop-color:#9F2064"/>
+	<stop  offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_5_)" d="M356.1,2529.2c-19.8,99.8-33.9,199.2-41,298c-0.2,3.5-0.6,6.9-0.8,10.4
+	c-49.3-79-181.3-156.1-181-155.4c94.5,137,166.2,273,176.9,406.5c-50.6,10.4-119.9-4.6-200-34.1c83.5,76.7,146.2,97.9,170.6,103.6
+	c-76.7,4.8-156.6,57.5-237.1,118.2c117.7-48,212.8-67,280.9-51.6C216.6,3530.6,108.3,3868.2,0,4226.6c33.2-9.8,53-32.1,64.1-62.3
+	c19.3-64.9,147.4-490.7,348.1-1050.4c5.7-15.9,11.5-31.9,17.3-48c1.6-4.5,3.3-9,4.9-13.4c21.2-58.7,43.2-118.6,65.9-179.7
+	c5.2-13.9,10.4-27.8,15.6-41.8c0.1-0.3,0.2-0.6,0.3-0.8l-157.8-311.8C357.7,2521.9,356.8,2525.5,356.1,2529.2z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1021.6218" x2="-5086.9941" y2="1021.6218" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_6_)" d="M1178.1,1370.3c-4.5,9.2-9,18.5-13.6,27.9c-13.6,28.1-27.4,56.7-41.4,86
+	c-15.1,31.7-30.3,64.1-45.7,97.3c-7.8,16.7-15.5,33.5-23.4,50.6c-23.5,51.1-47.3,103.9-71.5,158.4c-29.7,67-60,136.6-90.7,208.9
+	c-29.3,68.9-59,140.2-89.1,214c-28.6,70-57.5,142.3-86.8,216.8c-26.1,66.5-52.4,134.7-79,204.9c-1.3,3.4-2.6,6.8-3.8,10.2
+	c-26.4,69.7-53,141.3-79.8,214.7c-0.6,1.7-1.2,3.4-1.8,5l127.1-13.9c-2.5-0.5-5.1-0.8-7.6-1.3c152-18.9,354-132.5,484.6-272.7
+	c60.2-64.6,114.8-140.8,165.3-230c37.6-66.4,72.9-140,106.5-221.5c29.4-71.2,57.6-148.3,84.8-231.9c-34.9,18.4-74.9,31.9-119,41.3
+	c-7.7,1.6-15.6,3.2-23.6,4.6c-8,1.4-16.1,2.7-24.3,3.8l0,0l0,0c0.1,0,0.2-0.1,0.3-0.1c141.7-54.5,231.1-159.8,296.1-288.7
+	c-37.3,25.4-97.9,58.7-170.5,74.7c-9.9,2.2-20,3.9-30.2,5.4c-2.6,0.4-5.1,0.8-7.6,1.1l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1
+	c0,0,0.1,0,0.1-0.1l0,0c49.2-20.6,90.7-43.6,126.7-70.8c7.7-5.8,15.2-11.8,22.4-18.1c11-9.5,21.4-19.5,31.4-30
+	c6.4-6.7,12.6-13.6,18.6-20.8c14.1-16.8,27.3-34.9,39.7-54.6c3.8-6,7.5-12.1,11.2-18.4c4.7-9.1,9.2-18,13.6-26.8
+	c19.8-39.8,35.6-75.3,48.2-106.5c6.3-15.6,11.8-30,16.5-43.4c1.9-5.3,3.7-10.5,5.4-15.5c5-15,9.1-28.3,12.3-40
+	c4.8-17.5,7.7-31.4,9.3-41.5l0,0l0,0c-4.8,3.8-10.3,7.6-16.5,11.3c-42.8,25.6-116.2,48.8-175.4,59.7l116.7-12.8l-116.7,12.8
+	c-0.9,0.2-1.8,0.3-2.7,0.5c-5.9,1-11.9,1.9-17.9,2.9c1.1-0.5,2-1,3.1-1.4l-399.3,43.8C1179.6,1367.4,1178.9,1368.8,1178.1,1370.3z"
+	/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-9610.334" y1="999.733" x2="-5351.2017" y2="999.733" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_7_)" d="M1627.6,563.1c-35.5,54.5-74.3,116.4-116,186.5c-2.2,3.6-4.4,7.4-6.6,11.1
+	c-36,60.7-74.3,127.3-114.5,200.3c-34.8,63-71,130.6-108.6,203.3c-32.8,63.3-66.7,130.5-101.5,201.6l399.3-43.8
+	c116.3-53.5,168.3-101.9,218.8-171.9c13.4-19.3,26.9-39.5,40.3-60.4c41-64,81.2-134.5,117.2-204.6c34.7-67.7,65.3-134.8,88.8-195.3
+	c14.9-38.5,26.9-74.3,35.2-105.7c7.3-27.7,13-54,17.4-79.1C1941.9,531.6,1751.5,557,1627.6,563.1z"/>
+<path fill="#BE202E" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
+<path opacity="0.35" fill="#BE202E" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1152.7261" x2="-5086.9941" y2="1152.7261" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_8_)" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
+<path fill="#BE202E" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7L1433.2,1735.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7
+	L1433.2,1735.7z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1137.7247" x2="-5086.9941" y2="1137.7247" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_9_)" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7L1433.2,1735.7z"
+	/>
+<path fill="#BE202E" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"/>
+<path opacity="0.35" fill="#BE202E" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"
+	/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-6953.4072" y1="1134.7161" x2="-6011.9995" y2="1134.7161" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_10_)" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"/>
+<path fill="#6D6E71" d="M2218.7,387v11.7h27.4v77.4h12.7v-77.4h27.6V387H2218.7z M2377,387l-30.6,62.2l-30.8-62.2h-15.3v89.1h11.7
+	v-70.7l30.3,61.3h8.1l30.3-61.3v70.7h11.7V387H2377z"/>
+</svg>
diff --git a/output/static/images/glyphicons-halflings-white.png b/output/static/images/glyphicons-halflings-white.png
new file mode 100644
index 0000000..a20760b
--- /dev/null
+++ b/output/static/images/glyphicons-halflings-white.png
Binary files differ
diff --git a/output/static/images/glyphicons-halflings.png b/output/static/images/glyphicons-halflings.png
new file mode 100644
index 0000000..92d4445
--- /dev/null
+++ b/output/static/images/glyphicons-halflings.png
Binary files differ
diff --git a/output/static/images/thrift_body.png b/output/static/images/thrift_body.png
new file mode 100644
index 0000000..0198009
--- /dev/null
+++ b/output/static/images/thrift_body.png
Binary files differ
diff --git a/output/static/images/thrift_fade.png b/output/static/images/thrift_fade.png
new file mode 100644
index 0000000..a8a3225
--- /dev/null
+++ b/output/static/images/thrift_fade.png
Binary files differ
diff --git a/output/static/images/thrift_fade_vert.png b/output/static/images/thrift_fade_vert.png
new file mode 100644
index 0000000..5abffe5
--- /dev/null
+++ b/output/static/images/thrift_fade_vert.png
Binary files differ
diff --git a/output/static/images/thrift_header.png b/output/static/images/thrift_header.png
new file mode 100644
index 0000000..21960f7
--- /dev/null
+++ b/output/static/images/thrift_header.png
Binary files differ
diff --git a/output/static/images/thrift_main.png b/output/static/images/thrift_main.png
new file mode 100644
index 0000000..2ba9f63
--- /dev/null
+++ b/output/static/images/thrift_main.png
Binary files differ
diff --git a/output/static/images/thrift_mask.png b/output/static/images/thrift_mask.png
new file mode 100644
index 0000000..c463057
--- /dev/null
+++ b/output/static/images/thrift_mask.png
Binary files differ
diff --git a/output/static/images/thrift_nav.png b/output/static/images/thrift_nav.png
new file mode 100644
index 0000000..a1ff939
--- /dev/null
+++ b/output/static/images/thrift_nav.png
Binary files differ
diff --git a/output/static/js/bootstrap-dropdown.js b/output/static/js/bootstrap-dropdown.js
new file mode 100644
index 0000000..d04da5d
--- /dev/null
+++ b/output/static/js/bootstrap-dropdown.js
@@ -0,0 +1,169 @@
+/* ============================================================
+ * bootstrap-dropdown.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+  * ========================= */
+
+  var toggle = '[data-toggle=dropdown]'
+    , Dropdown = function (element) {
+        var $el = $(element).on('click.dropdown.data-api', this.toggle)
+        $('html').on('click.dropdown.data-api', function () {
+          $el.parent().removeClass('open')
+        })
+      }
+
+  Dropdown.prototype = {
+
+    constructor: Dropdown
+
+  , toggle: function (e) {
+      var $this = $(this)
+        , $parent
+        , isActive
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      clearMenus()
+
+      if (!isActive) {
+        if ('ontouchstart' in document.documentElement) {
+          // if mobile we we use a backdrop because click events don't delegate
+          $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus)
+        }
+        $parent.toggleClass('open')
+      }
+
+      $this.focus()
+
+      return false
+    }
+
+  , keydown: function (e) {
+      var $this
+        , $items
+        , $active
+        , $parent
+        , isActive
+        , index
+
+      if (!/(38|40|27)/.test(e.keyCode)) return
+
+      $this = $(this)
+
+      e.preventDefault()
+      e.stopPropagation()
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      if (!isActive || (isActive && e.keyCode == 27)) {
+        if (e.which == 27) $parent.find(toggle).focus()
+        return $this.click()
+      }
+
+      $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+      if (!$items.length) return
+
+      index = $items.index($items.filter(':focus'))
+
+      if (e.keyCode == 38 && index > 0) index--                                        // up
+      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+      if (!~index) index = 0
+
+      $items
+        .eq(index)
+        .focus()
+    }
+
+  }
+
+  function clearMenus() {
+    $('.dropdown-backdrop').remove()
+    $(toggle).each(function () {
+      getParent($(this)).removeClass('open')
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = selector && $(selector)
+
+    if (!$parent || !$parent.length) $parent = $this.parent()
+
+    return $parent
+  }
+
+
+  /* DROPDOWN PLUGIN DEFINITION
+   * ========================== */
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('dropdown')
+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+ /* DROPDOWN NO CONFLICT
+  * ==================== */
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  /* APPLY TO STANDARD DROPDOWN ELEMENTS
+   * =================================== */
+
+  $(document)
+    .on('click.dropdown.data-api', clearMenus)
+    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
+    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(window.jQuery);
diff --git a/output/static/js/bootstrap-tab.js b/output/static/js/bootstrap-tab.js
new file mode 100644
index 0000000..3a132c0
--- /dev/null
+++ b/output/static/js/bootstrap-tab.js
@@ -0,0 +1,144 @@
+/* ========================================================
+ * bootstrap-tab.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#tabs
+ * ========================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TAB CLASS DEFINITION
+  * ==================== */
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.prototype = {
+
+    constructor: Tab
+
+  , show: function () {
+      var $this = this.element
+        , $ul = $this.closest('ul:not(.dropdown-menu)')
+        , selector = $this.attr('data-target')
+        , previous
+        , $target
+        , e
+
+      if (!selector) {
+        selector = $this.attr('href')
+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+      }
+
+      if ( $this.parent('li').hasClass('active') ) return
+
+      previous = $ul.find('.active:last a')[0]
+
+      e = $.Event('show', {
+        relatedTarget: previous
+      })
+
+      $this.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      $target = $(selector)
+
+      this.activate($this.parent('li'), $ul)
+      this.activate($target, $target.parent(), function () {
+        $this.trigger({
+          type: 'shown'
+        , relatedTarget: previous
+        })
+      })
+    }
+
+  , activate: function ( element, container, callback) {
+      var $active = container.find('> .active')
+        , transition = callback
+            && $.support.transition
+            && $active.hasClass('fade')
+
+      function next() {
+        $active
+          .removeClass('active')
+          .find('> .dropdown-menu > .active')
+          .removeClass('active')
+
+        element.addClass('active')
+
+        if (transition) {
+          element[0].offsetWidth // reflow for transition
+          element.addClass('in')
+        } else {
+          element.removeClass('fade')
+        }
+
+        if ( element.parent('.dropdown-menu') ) {
+          element.closest('li.dropdown').addClass('active')
+        }
+
+        callback && callback()
+      }
+
+      transition ?
+        $active.one($.support.transition.end, next) :
+        next()
+
+      $active.removeClass('in')
+    }
+  }
+
+
+ /* TAB PLUGIN DEFINITION
+  * ===================== */
+
+  var old = $.fn.tab
+
+  $.fn.tab = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tab')
+      if (!data) $this.data('tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tab.Constructor = Tab
+
+
+ /* TAB NO CONFLICT
+  * =============== */
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+ /* TAB DATA-API
+  * ============ */
+
+  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+    e.preventDefault()
+    $(this).tab('show')
+  })
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/output/static/js/jquery.min.js b/output/static/js/jquery.min.js
new file mode 100644
index 0000000..73f33fb
--- /dev/null
+++ b/output/static/js/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f
+}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},W=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a>",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=$.test(e)?this.mouseHooks:Z.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||z),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==db()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===db()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=z.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===L&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&(a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault())?bb:cb):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:cb,isPropagationStopped:cb,isImmediatePropagationStopped:cb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=bb,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=bb,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submitBubbles||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?b.form:void 0;c&&!n._data(c,"submitBubbles")&&(n.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),n._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.changeBubbles||(n.event.special.change={setup:function(){return Y.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),n.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),n.event.simulate("change",this,a,!0)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;Y.test(b.nodeName)&&!n._data(b,"changeBubbles")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a,!0)}),n._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!Y.test(this.nodeName)}}),l.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=cb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return n().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=cb),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});function eb(a){var b=fb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var fb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gb=/ jQuery\d+="(?:null|\d+)"/g,hb=new RegExp("<(?:"+fb+")[\\s/>]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/<tbody/i,mb=/<|&#?\w+;/,nb=/<(?:script|style|link)/i,ob=/checked\s*(?:[^=]|=\s*.checked.)/i,pb=/^$|\/(?:java|ecma)script/i,qb=/^true\/(.*)/,rb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,sb={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:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1></$2>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?"<table>"!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Db[0].contentWindow||Db[0].contentDocument).document,b.write(),b.close(),c=Fb(a,b),Db.detach()),Eb[a]=c),c}!function(){var a,b,c=z.createElement("div"),d="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],a.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(a.style.opacity),l.cssFloat=!!a.style.cssFloat,c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===c.style.backgroundClip,a=c=null,l.shrinkWrapBlocks=function(){var a,c,e,f;if(null==b){if(a=z.getElementsByTagName("body")[0],!a)return;f="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",c=z.createElement("div"),e=z.createElement("div"),a.appendChild(c).appendChild(e),b=!1,typeof e.style.zoom!==L&&(e.style.cssText=d+";width:1px;padding:1px;zoom:1",e.innerHTML="<div></div>",e.firstChild.style.width="5px",b=3!==e.offsetWidth),a.removeChild(c),a=c=e=null}return b}}();var Hb=/^margin/,Ib=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Jb,Kb,Lb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Jb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),Ib.test(g)&&Hb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):z.documentElement.currentStyle&&(Jb=function(a){return a.currentStyle},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ib.test(g)&&!Lb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Mb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h=z.createElement("div"),i="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",j="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";h.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",b=h.getElementsByTagName("a")[0],b.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(b.style.opacity),l.cssFloat=!!b.style.cssFloat,h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,b=h=null,n.extend(l,{reliableHiddenOffsets:function(){if(null!=c)return c;var a,b,d,e=z.createElement("div"),f=z.getElementsByTagName("body")[0];if(f)return e.setAttribute("className","t"),e.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=z.createElement("div"),a.style.cssText=i,f.appendChild(a).appendChild(e),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",b=e.getElementsByTagName("td"),b[0].style.cssText="padding:0;margin:0;border:0;display:none",d=0===b[0].offsetHeight,b[0].style.display="",b[1].style.display="none",c=d&&0===b[0].offsetHeight,f.removeChild(a),e=f=null,c},boxSizing:function(){return null==d&&k(),d},boxSizingReliable:function(){return null==e&&k(),e},pixelPosition:function(){return null==f&&k(),f},reliableMarginRight:function(){var b,c,d,e;if(null==g&&a.getComputedStyle){if(b=z.getElementsByTagName("body")[0],!b)return;c=z.createElement("div"),d=z.createElement("div"),c.style.cssText=i,b.appendChild(c).appendChild(d),e=d.appendChild(z.createElement("div")),e.style.cssText=d.style.cssText=j,e.style.marginRight=e.style.width="0",d.style.width="1px",g=!parseFloat((a.getComputedStyle(e,null)||{}).marginRight),b.removeChild(c)}return g}});function k(){var b,c,h=z.getElementsByTagName("body")[0];h&&(b=z.createElement("div"),c=z.createElement("div"),b.style.cssText=i,h.appendChild(b).appendChild(c),c.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",n.swap(h,null!=h.style.zoom?{zoom:1}:{},function(){d=4===c.offsetWidth}),e=!0,f=!1,g=!0,a.getComputedStyle&&(f="1%"!==(a.getComputedStyle(c,null)||{}).top,e="4px"===(a.getComputedStyle(c,null)||{width:"4px"}).width),h.removeChild(b),c=h=null)}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Nb=/alpha\([^)]*\)/i,Ob=/opacity\s*=\s*([^)]*)/,Pb=/^(none|table(?!-c[ea]).+)/,Qb=new RegExp("^("+T+")(.*)$","i"),Rb=new RegExp("^([+-])=("+T+")","i"),Sb={position:"absolute",visibility:"hidden",display:"block"},Tb={letterSpacing:0,fontWeight:400},Ub=["Webkit","O","Moz","ms"];function Vb(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ub.length;while(e--)if(b=Ub[e]+c,b in a)return b;return d}function Wb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",Gb(d.nodeName)))):f[g]||(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Xb(a,b,c){var d=Qb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Yb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Zb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Jb(a),g=l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Kb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ib.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Yb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Kb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=Vb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Rb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]="",i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Vb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Kb(a,b,d)),"normal"===f&&b in Tb&&(f=Tb[b]),""===c||c?(e=parseFloat(f),c===!0||n.isNumeric(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&Pb.test(n.css(a,"display"))?n.swap(a,Sb,function(){return Zb(a,b,d)}):Zb(a,b,d):void 0},set:function(a,c,d){var e=d&&Jb(a);return Xb(a,c,d?Yb(a,b,d,l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Ob.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Nb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Nb.test(f)?f.replace(Nb,e):f+" "+e)}}),n.cssHooks.marginRight=Mb(l.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},Kb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Hb.test(a)||(n.cssHooks[a+b].set=Xb)}),n.fn.extend({css:function(a,b){return W(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Jb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)
+},a,b,arguments.length>1)},show:function(){return Wb(this,!0)},hide:function(){return Wb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function $b(a,b,c,d,e){return new $b.prototype.init(a,b,c,d,e)}n.Tween=$b,$b.prototype={constructor:$b,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=$b.propHooks[this.prop];return a&&a.get?a.get(this):$b.propHooks._default.get(this)},run:function(a){var b,c=$b.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):$b.propHooks._default.set(this),this}},$b.prototype.init.prototype=$b.prototype,$b.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},$b.propHooks.scrollTop=$b.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=$b.prototype.init,n.fx.step={};var _b,ac,bc=/^(?:toggle|show|hide)$/,cc=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),dc=/queueHooks$/,ec=[jc],fc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=cc.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&cc.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function gc(){return setTimeout(function(){_b=void 0}),_b=n.now()}function hc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function ic(a,b,c){for(var d,e=(fc[b]||[]).concat(fc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function jc(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k=Gb(a.nodeName),"none"===j&&(j=k),"inline"===j&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==k?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],bc.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}if(!n.isEmptyObject(o)){r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=ic(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function kc(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function lc(a,b,c){var d,e,f=0,g=ec.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=_b||gc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:_b||gc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(kc(k,j.opts.specialEasing);g>f;f++)if(d=ec[f].call(j,a,k,j.opts))return d;return n.map(k,ic,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(lc,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],fc[c]=fc[c]||[],fc[c].unshift(b)},prefilter:function(a,b){b?ec.unshift(a):ec.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=lc(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&dc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(hc(b,!0),a,d,e)}}),n.each({slideDown:hc("show"),slideUp:hc("hide"),slideToggle:hc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(_b=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),_b=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ac||(ac=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(ac),ac=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e=z.createElement("div");e.setAttribute("className","t"),e.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=e.getElementsByTagName("a")[0],c=z.createElement("select"),d=c.appendChild(z.createElement("option")),b=e.getElementsByTagName("input")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==e.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=d.selected,l.enctype=!!z.createElement("form").enctype,c.disabled=!0,l.optDisabled=!d.disabled,b=z.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value,a=b=c=d=e=null}();var mc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(mc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.text(a)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var nc,oc,pc=n.expr.attrHandle,qc=/^(?:checked|selected)$/i,rc=l.getSetAttribute,sc=l.input;n.fn.extend({attr:function(a,b){return W(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===L?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?oc:nc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?sc&&rc||!qc.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(rc?c:d)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),oc={set:function(a,b,c){return b===!1?n.removeAttr(a,c):sc&&rc||!qc.test(c)?a.setAttribute(!rc&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=pc[b]||n.find.attr;pc[b]=sc&&rc||!qc.test(b)?function(a,b,d){var e,f;return d||(f=pc[b],pc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,pc[b]=f),e}:function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),sc&&rc||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):nc&&nc.set(a,b,c)}}),rc||(nc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},pc.id=pc.name=pc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:nc.set},n.attrHooks.contenteditable={set:function(a,b,c){nc.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var tc=/^(?:input|select|textarea|button|object)$/i,uc=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return W(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):tc.test(a.nodeName)||uc.test(a.nodeName)&&a.href?0:-1}}}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var vc=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===L||"boolean"===c)&&(this.className&&n._data(this,"__className__",this.className),this.className=this.className||a===!1?"":n._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(vc," ").indexOf(b)>=0)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var wc=n.now(),xc=/\?/,yc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(yc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var zc,Ac,Bc=/#.*$/,Cc=/([?&])_=[^&]*/,Dc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Ec=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Fc=/^(?:GET|HEAD)$/,Gc=/^\/\//,Hc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ic={},Jc={},Kc="*/".concat("*");try{Ac=location.href}catch(Lc){Ac=z.createElement("a"),Ac.href="",Ac=Ac.href}zc=Hc.exec(Ac.toLowerCase())||[];function Mc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nc(a,b,c,d){var e={},f=a===Jc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Oc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Pc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Qc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ac,type:"GET",isLocal:Ec.test(zc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Oc(Oc(a,n.ajaxSettings),b):Oc(n.ajaxSettings,a)},ajaxPrefilter:Mc(Ic),ajaxTransport:Mc(Jc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Dc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||Ac)+"").replace(Bc,"").replace(Gc,zc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(F)||[""],null==k.crossDomain&&(c=Hc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===zc[1]&&c[2]===zc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(zc[3]||("http:"===zc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),Nc(Ic,k,b,v),2===t)return v;h=k.global,h&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Fc.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(xc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Cc.test(e)?e.replace(Cc,"$1_="+wc++):e+(xc.test(e)?"&":"?")+"_="+wc++)),k.ifModified&&(n.lastModified[e]&&v.setRequestHeader("If-Modified-Since",n.lastModified[e]),n.etag[e]&&v.setRequestHeader("If-None-Match",n.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Kc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Nc(Jc,k,b,v)){v.readyState=1,h&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Pc(k,v,c)),u=Qc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(n.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!l.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||n.css(a,"display"))},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Rc=/%20/g,Sc=/\[\]$/,Tc=/\r?\n/g,Uc=/^(?:submit|button|image|reset|file)$/i,Vc=/^(?:input|select|textarea|keygen)/i;function Wc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Sc.test(a)?d(a,e):Wc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Wc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Wc(c,a[c],b,e);return d.join("&").replace(Rc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Vc.test(this.nodeName)&&!Uc.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Tc,"\r\n")}}):{name:b.name,value:c.replace(Tc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&$c()||_c()}:$c;var Xc=0,Yc={},Zc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Yc)Yc[a](void 0,!0)}),l.cors=!!Zc&&"withCredentials"in Zc,Zc=l.ajax=!!Zc,Zc&&n.ajaxTransport(function(a){if(!a.crossDomain||l.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Xc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Yc[g],b=void 0,f.onreadystatechange=n.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Yc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function $c(){try{return new a.XMLHttpRequest}catch(b){}}function _c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||n("head")[0]||z.documentElement;return{send:function(d,e){b=z.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ad=[],bd=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ad.pop()||n.expando+"_"+wc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(bd.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bd.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bd,"$1"+e):b.jsonp!==!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n});
diff --git a/output/static/js/thrift.js b/output/static/js/thrift.js
new file mode 100644
index 0000000..e90962f
--- /dev/null
+++ b/output/static/js/thrift.js
@@ -0,0 +1,14 @@
+
+  $(function() {
+    // decorate section headers with anchors
+    return $("h2, h3, h4, h5, h6").each(function(i, el) {
+      var $el, icon, id;
+      $el = $(el);
+      id = $el.attr('id');
+      icon = '¶';
+      if (id) {
+        return $el.append($("<a />").addClass("headerlink").attr("href", "#" + id).html(icon));
+      }
+    });
+  });
+
diff --git a/output/test/ThriftTest.thrift b/output/test/ThriftTest.thrift
new file mode 100644
index 0000000..b5c76f1
--- /dev/null
+++ b/output/test/ThriftTest.thrift
@@ -0,0 +1,507 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - ThriftTest</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<div class="highlight"><pre class="codehilite"><code>/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ * Contains some contributions under the Thrift Software License.
+ * Please see doc/old-thrift-license.txt in the Thrift distribution for
+ * details.
+ */
+
+namespace c_glib TTest
+namespace cpp thrift.test
+namespace delphi Thrift.Test
+namespace go thrifttest
+namespace java thrift.test
+namespace js ThriftTest
+namespace lua ThriftTest
+namespace netstd ThriftTest
+namespace perl ThriftTest
+namespace php ThriftTest
+namespace py ThriftTest
+namespace py.twisted ThriftTest
+namespace rb Thrift.Test
+namespace st ThriftTest
+namespace xsd test (uri = 'http://thrift.apache.org/ns/ThriftTest')
+
+// Presence of namespaces and sub-namespaces for which there is
+// no generator should compile with warnings only
+namespace noexist ThriftTest
+namespace cpp.noexist ThriftTest
+
+namespace * thrift.test
+
+/**
+ * Docstring!
+ */
+enum Numberz
+{
+  ONE = 1,
+  TWO,
+  THREE,
+  FIVE = 5,
+  SIX,
+  EIGHT = 8
+}
+
+const Numberz myNumberz = Numberz.ONE;
+// the following is expected to fail:
+// const Numberz urNumberz = ONE;
+
+typedef i64 UserId
+
+struct Bonk
+{
+  1: string message,
+  2: i32 type
+}
+
+typedef map&lt;string,Bonk&gt; MapType
+
+struct Bools {
+  1: bool im_true,
+  2: bool im_false,
+}
+
+struct Xtruct
+{
+  1:  string string_thing,
+  4:  i8     byte_thing,
+  9:  i32    i32_thing,
+  11: i64    i64_thing
+}
+
+struct Xtruct2
+{
+  1: i8     byte_thing,  // used to be byte, hence the name
+  2: Xtruct struct_thing,
+  3: i32    i32_thing
+}
+
+struct Xtruct3
+{
+  1:  string string_thing,
+  4:  i32    changed,
+  9:  i32    i32_thing,
+  11: i64    i64_thing
+}
+
+
+struct Insanity
+{
+  1: map&lt;Numberz, UserId&gt; userMap,
+  2: list&lt;Xtruct&gt; xtructs
+} (python.immutable= "")
+
+struct CrazyNesting {
+  1: string string_field,
+  2: optional set&lt;Insanity&gt; set_field,
+  // Do not insert line break as test/go/Makefile.am is removing this line with pattern match
+  3: required list&lt;map&lt;set&lt;i32&gt; (python.immutable = ""), map&lt;i32,set&lt;list&lt;map&lt;Insanity,string&gt;(python.immutable = "")&gt; (python.immutable = "")&gt;&gt;&gt;&gt; list_field,
+  4: binary binary_field
+}
+
+union SomeUnion {
+  1: map&lt;Numberz, UserId&gt; map_thing,
+  2: string string_thing,
+  3: i32 i32_thing,
+  4: Xtruct3 xtruct_thing,
+  5: Insanity insanity_thing
+}
+
+exception Xception {
+  1: i32 errorCode,
+  2: string message
+}
+
+exception Xception2 {
+  1: i32 errorCode,
+  2: Xtruct struct_thing
+}
+
+struct EmptyStruct {}
+
+struct OneField {
+  1: EmptyStruct field
+}
+
+service ThriftTest
+{
+  /**
+   * Prints "testVoid()" and returns nothing.
+   */
+  void         testVoid(),
+
+  /**
+   * Prints 'testString("%s")' with thing as '%s'
+   * @param string thing - the string to print
+   * @return string - returns the string 'thing'
+   */
+  string       testString(1: string thing),
+
+  /**
+   * Prints 'testBool("%s")' where '%s' with thing as 'true' or 'false'
+   * @param bool  thing - the bool data to print
+   * @return bool  - returns the bool 'thing'
+   */
+  bool         testBool(1: bool thing),
+
+  /**
+   * Prints 'testByte("%d")' with thing as '%d'
+   * The types i8 and byte are synonyms, use of i8 is encouraged, byte still exists for the sake of compatibility.
+   * @param byte thing - the i8/byte to print
+   * @return i8 - returns the i8/byte 'thing'
+   */
+  i8           testByte(1: i8 thing),
+
+  /**
+   * Prints 'testI32("%d")' with thing as '%d'
+   * @param i32 thing - the i32 to print
+   * @return i32 - returns the i32 'thing'
+   */
+  i32          testI32(1: i32 thing),
+
+  /**
+   * Prints 'testI64("%d")' with thing as '%d'
+   * @param i64 thing - the i64 to print
+   * @return i64 - returns the i64 'thing'
+   */
+  i64          testI64(1: i64 thing),
+
+  /**
+   * Prints 'testDouble("%f")' with thing as '%f'
+   * @param double thing - the double to print
+   * @return double - returns the double 'thing'
+   */
+  double       testDouble(1: double thing),
+
+  /**
+   * Prints 'testBinary("%s")' where '%s' is a hex-formatted string of thing's data
+   * @param binary  thing - the binary data to print
+   * @return binary  - returns the binary 'thing'
+   */
+  binary       testBinary(1: binary thing),
+
+  /**
+   * Prints 'testStruct("{%s}")' where thing has been formatted into a string of comma separated values
+   * @param Xtruct thing - the Xtruct to print
+   * @return Xtruct - returns the Xtruct 'thing'
+   */
+  Xtruct       testStruct(1: Xtruct thing),
+
+  /**
+   * Prints 'testNest("{%s}")' where thing has been formatted into a string of the nested struct
+   * @param Xtruct2 thing - the Xtruct2 to print
+   * @return Xtruct2 - returns the Xtruct2 'thing'
+   */
+  Xtruct2      testNest(1: Xtruct2 thing),
+
+  /**
+   * Prints 'testMap("{%s")' where thing has been formatted into a string of 'key =&gt; value' pairs
+   *  separated by commas and new lines
+   * @param map&lt;i32,i32&gt; thing - the map&lt;i32,i32&gt; to print
+   * @return map&lt;i32,i32&gt; - returns the map&lt;i32,i32&gt; 'thing'
+   */
+  map&lt;i32,i32&gt; testMap(1: map&lt;i32,i32&gt; thing),
+
+  /**
+   * Prints 'testStringMap("{%s}")' where thing has been formatted into a string of 'key =&gt; value' pairs
+   *  separated by commas and new lines
+   * @param map&lt;string,string&gt; thing - the map&lt;string,string&gt; to print
+   * @return map&lt;string,string&gt; - returns the map&lt;string,string&gt; 'thing'
+   */
+  map&lt;string,string&gt; testStringMap(1: map&lt;string,string&gt; thing),
+
+  /**
+   * Prints 'testSet("{%s}")' where thing has been formatted into a string of values
+   *  separated by commas and new lines
+   * @param set&lt;i32&gt; thing - the set&lt;i32&gt; to print
+   * @return set&lt;i32&gt; - returns the set&lt;i32&gt; 'thing'
+   */
+  set&lt;i32&gt;     testSet(1: set&lt;i32&gt; thing),
+
+  /**
+   * Prints 'testList("{%s}")' where thing has been formatted into a string of values
+   *  separated by commas and new lines
+   * @param list&lt;i32&gt; thing - the list&lt;i32&gt; to print
+   * @return list&lt;i32&gt; - returns the list&lt;i32&gt; 'thing'
+   */
+  list&lt;i32&gt;    testList(1: list&lt;i32&gt; thing),
+
+  /**
+   * Prints 'testEnum("%d")' where thing has been formatted into its numeric value
+   * @param Numberz thing - the Numberz to print
+   * @return Numberz - returns the Numberz 'thing'
+   */
+  Numberz      testEnum(1: Numberz thing),
+
+  /**
+   * Prints 'testTypedef("%d")' with thing as '%d'
+   * @param UserId thing - the UserId to print
+   * @return UserId - returns the UserId 'thing'
+   */
+  UserId       testTypedef(1: UserId thing),
+
+  /**
+   * Prints 'testMapMap("%d")' with hello as '%d'
+   * @param i32 hello - the i32 to print
+   * @return map&lt;i32,map&lt;i32,i32&gt;&gt; - returns a dictionary with these values:
+   *   {-4 =&gt; {-4 =&gt; -4, -3 =&gt; -3, -2 =&gt; -2, -1 =&gt; -1, }, 4 =&gt; {1 =&gt; 1, 2 =&gt; 2, 3 =&gt; 3, 4 =&gt; 4, }, }
+   */
+  map&lt;i32,map&lt;i32,i32&gt;&gt; testMapMap(1: i32 hello),
+
+  /**
+   * So you think you've got this all worked out, eh?
+   *
+   * Creates a map with these values and prints it out:
+   *   { 1 =&gt; { 2 =&gt; argument,
+   *            3 =&gt; argument,
+   *          },
+   *     2 =&gt; { 6 =&gt; &lt;empty Insanity struct&gt;, },
+   *   }
+   * @return map&lt;UserId, map&lt;Numberz,Insanity&gt;&gt; - a map with the above values
+   */
+  map&lt;UserId, map&lt;Numberz,Insanity&gt;&gt; testInsanity(1: Insanity argument),
+
+  /**
+   * Prints 'testMulti()'
+   * @param i8 arg0 -
+   * @param i32 arg1 -
+   * @param i64 arg2 -
+   * @param map&lt;i16, string&gt; arg3 -
+   * @param Numberz arg4 -
+   * @param UserId arg5 -
+   * @return Xtruct - returns an Xtruct with string_thing = "Hello2, byte_thing = arg0, i32_thing = arg1
+   *    and i64_thing = arg2
+   */
+  Xtruct testMulti(1: i8 arg0, 2: i32 arg1, 3: i64 arg2, 4: map&lt;i16, string&gt; arg3, 5: Numberz arg4, 6: UserId arg5),
+
+  /**
+   * Print 'testException(%s)' with arg as '%s'
+   * @param string arg - a string indication what type of exception to throw
+   * if arg == "Xception" throw Xception with errorCode = 1001 and message = arg
+   * else if arg == "TException" throw TException
+   * else do not throw anything
+   */
+  void testException(1: string arg) throws(1: Xception err1),
+
+  /**
+   * Print 'testMultiException(%s, %s)' with arg0 as '%s' and arg1 as '%s'
+   * @param string arg - a string indicating what type of exception to throw
+   * if arg0 == "Xception" throw Xception with errorCode = 1001 and message = "This is an Xception"
+   * else if arg0 == "Xception2" throw Xception2 with errorCode = 2002 and struct_thing.string_thing = "This is an Xception2"
+   * else do not throw anything
+   * @return Xtruct - an Xtruct with string_thing = arg1
+   */
+  Xtruct testMultiException(1: string arg0, 2: string arg1) throws(1: Xception err1, 2: Xception2 err2)
+
+  /**
+   * Print 'testOneway(%d): Sleeping...' with secondsToSleep as '%d'
+   * sleep 'secondsToSleep'
+   * Print 'testOneway(%d): done sleeping!' with secondsToSleep as '%d'
+   * @param i32 secondsToSleep - the number of seconds to sleep
+   */
+  oneway void testOneway(1:i32 secondsToSleep)
+}
+
+service SecondService
+{
+  /**
+   * Prints 'testString("%s")' with thing as '%s'
+   * @param string thing - the string to print
+   * @return string - returns the string 'thing'
+   */
+  string secondtestString(1: string thing)
+}
+
+struct VersioningTestV1 {
+       1: i32 begin_in_both,
+       3: string old_string,
+       12: i32 end_in_both
+}
+
+struct VersioningTestV2 {
+       1: i32 begin_in_both,
+
+       2: i32 newint,
+       3: i8 newbyte,
+       4: i16 newshort,
+       5: i64 newlong,
+       6: double newdouble
+       7: Bonk newstruct,
+       8: list&lt;i32&gt; newlist,
+       9: set&lt;i32&gt; newset,
+       10: map&lt;i32, i32&gt; newmap,
+       11: string newstring,
+       12: i32 end_in_both
+}
+
+struct ListTypeVersioningV1 {
+       1: list&lt;i32&gt; myints;
+       2: string hello;
+}
+
+struct ListTypeVersioningV2 {
+       1: list&lt;string&gt; strings;
+       2: string hello;
+}
+
+struct GuessProtocolStruct {
+  7: map&lt;string,string&gt; map_field,
+}
+
+struct LargeDeltas {
+  1: Bools b1,
+  10: Bools b10,
+  100: Bools b100,
+  500: bool check_true,
+  1000: Bools b1000,
+  1500: bool check_false,
+  2000: VersioningTestV2 vertwo2000,
+  2500: set&lt;string&gt; a_set2500,
+  3000: VersioningTestV2 vertwo3000,
+  4000: list&lt;i32&gt; big_numbers
+}
+
+struct NestedListsI32x2 {
+  1: list&lt;list&lt;i32&gt;&gt; integerlist
+}
+struct NestedListsI32x3 {
+  1: list&lt;list&lt;list&lt;i32&gt;&gt;&gt; integerlist
+}
+struct NestedMixedx2 {
+  1: list&lt;set&lt;i32&gt;&gt; int_set_list
+  2: map&lt;i32,set&lt;string&gt;&gt; map_int_strset
+  3: list&lt;map&lt;i32,set&lt;string&gt;&gt;&gt; map_int_strset_list
+}
+struct ListBonks {
+  1: list&lt;Bonk&gt; bonk
+}
+struct NestedListsBonk {
+  1: list&lt;list&lt;list&lt;Bonk&gt;&gt;&gt; bonk
+}
+
+struct BoolTest {
+  1: optional bool b = true;
+  2: optional string s = "true";
+}
+
+struct StructA {
+  1: required string s;
+}
+
+struct StructB {
+  1: optional StructA aa;
+  2: required StructA ab;
+}
+
+struct OptionalSetDefaultTest {
+  1: optional set&lt;string&gt; with_default = [ "test" ]
+}
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=test/ThriftTest.thrift">test/ThriftTest.thrift</a>
+</p>
+      
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/test/index.html b/output/test/index.html
new file mode 100644
index 0000000..6288767
--- /dev/null
+++ b/output/test/index.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Test Suite</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="apache-thrift---integration-test-suite">Apache Thrift - integration test suite</h1>
+
+<p>This is the cross everything integration test suite for Apache Thrift.</p>
+
+<h2 id="run">Run</h2>
+
+<h3 id="a-using-make">A. Using Make</h3>
+
+<p>The test can be executed by:</p>
+
+<pre><code>make cross
+</code></pre>
+
+<p>This starts the <a href="test.py">test.py</a> script which does the real cross test with
+different transports, protocols and languages.</p>
+
+<p>Note that this skips any language that is not built locally. It also skips
+tests that are known to be failing. If you need more control over which tests
+to run, read following section.</p>
+
+<h3 id="b-using-test-script-directly">B. Using test script directly</h3>
+
+<p>Alternatively, you can invoke <a href="test.py">test.py</a> directly. You need to run<code>make
+precross</code> once before executing it for the first time.</p>
+
+<p>For example, if you changed something in <code>nodejs</code> library and need to verify
+the patch, you can skip everything except <code>nodejs</code> itself and some reference
+implementation (currently <code>cpp</code> and <code>java</code> are recommended) like this:</p>
+
+<pre><code>./configure --without-c_glib --without-erlang --without-lua ...
+make precross -j8
+test/test.py --server cpp,java --client nodejs
+test/test.py --server nodejs --client cpp,java
+</code></pre>
+
+<p>Another useful flag is &#8211;regex. For example, to run all tests that involve
+Java TBinaryProtocol:</p>
+
+<pre><code>test/test.py --regex "java.*binary"
+</code></pre>
+
+<h2 id="test-case-definition-file">Test case definition file</h2>
+
+<p>The cross test cases are defined in <a href="tests.json">tests.json</a>.
+The root element is collection of test target definitions.
+Each test target definition looks like this:</p>
+
+<pre><code>{
+  "name": "somelib",
+
+  "client": {
+    "command": ["somelib_client_executable"],
+    "workdir": "somelib/bin",
+    "protocols": ["binary"],
+    "transports": ["buffered"],
+    "sockets": ["ip"],
+  },
+  "server": {
+    "command": ["somelib_server_executable"],
+    "workdir": "somelib/bin",
+    "protocols": ["binary"],
+    "transports": ["buffered"],
+    "sockets": ["ip", "ip-ssl"],
+  }
+}
+</code></pre>
+
+<p>Either client or server definition or both should be present.</p>
+
+<p>Parameters that are common to both <code>client</code> and <code>server</code> can be put to target
+definition root:</p>
+
+<pre><code>{
+  "name": "somelib",
+
+  "workdir": "somelib/bin",
+  "protocols": ["binary"],
+  "transports": ["buffered"],
+  "sockets": ["ip"],
+
+  "client": { "command": ["somelib_client_executable"] },
+  "server": {
+    "command": ["somelib_server_executable"],
+    "sockets": ["ip-ssl"]
+  }
+}
+</code></pre>
+
+<p>For the complete list of supported keys and their effect, see source code
+comment at the opt of <a href="crossrunner/collect.py">crossrunner/collect.py</a>.</p>
+
+<h2 id="list-of-known-failures">List of known failures</h2>
+
+<p>Since many cross tests currently fail (mainly due to partial incompatibility
+around exception handling), the test script specifically report for &#8220;not known
+before&#8221; failures.</p>
+
+<p>For this purpose, test cases known to (occasionally) fail are listed in
+<code>known_failures_&lt;platform&gt;.json</code> where <code>&lt;platform&gt;</code> matches with python
+<code>platform.system()</code> string.</p>
+
+<p>Currently, only Linux version is included.</p>
+
+<p>FYI, the file is initially generated by</p>
+
+<pre><code>test/test.py --update-expected-failures=overwrite
+</code></pre>
+
+<p>after a full test run, then repeatedly</p>
+
+<pre><code>test/test.py --skip-known-failures
+test/test.py --update-expected-failures=merge
+</code></pre>
+
+<p>to update the known failures, run</p>
+
+<pre><code>make fail
+</code></pre>
+
+<h2 id="test-executable-specification">Test executable specification</h2>
+
+<h3 id="command-line-parameters">Command line parameters</h3>
+
+<p>Unit tests for languages are usually located under lib/<lang>/test/
+cross language tests according to [ThriftTest.thrift](ThriftTest.thrift) shall be
+provided for every language including executables with the following command
+line interface:</lang></p>
+
+<p><strong>Server command line interface:</strong></p>
+
+<pre><code>$ ./TestServer -h
+Allowed options:
+  -h | --help                  produce help message
+  --port=arg (9090)            Port number to listen
+  --domain-socket=arg          Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)
+  --pipe=arg                   Windows Named Pipe (e.g. MyThriftPipe)
+  --server-type=arg (simple)   type of server, "simple", "thread-pool",
+                               "threaded", or "nonblocking"
+  --transport=arg (buffered)   transport: buffered, framed, http, anonpipe, zlib
+  --protocol=arg (binary)      protocol: binary, compact, header, json
+  --multiplex                  Add TMultiplexedProtocol service name "ThriftTest"
+  --abstract-namespace         Create the domain socket in the Abstract Namespace 
+                               (no connection with filesystem pathnames)
+  --ssl                        Encrypted Transport using SSL
+  --zlib                       Wrapped Transport using Zlib
+  --processor-events           processor-events
+  -n=arg | --workers=arg (=4)  Number of thread pools workers. Only valid for
+                               thread-pool server type
+</code></pre>
+
+<p><strong>Client command line interface:</strong></p>
+
+<pre><code>$ ./TestClient -h
+Allowed options:
+  -h | --help                  produce help message
+  --host=arg (localhost)       Host to connect
+  --port=arg (9090)            Port number to connect
+  --domain-socket=arg          Domain Socket (e.g. /tmp/ThriftTest.thrift),
+                               instead of host and port
+  --pipe=arg                   Windows Named Pipe (e.g. MyThriftPipe)
+  --anon-pipes hRead hWrite    Windows Anonymous Pipes pair (handles)
+  --abstract-namespace         Create the domain socket in the Abstract Namespace
+                               (no connection with filesystem pathnames)
+  --transport=arg (buffered)   Transport: buffered, framed, http, evhttp, zlib
+  --protocol=arg (binary)      Protocol: binary, compact, header, json
+  --multiplex                  Add TMultiplexedProtocol service name "ThriftTest"
+  --ssl                        Encrypted Transport using SSL
+  --zlib                       Wrap Transport with Zlib
+  -n=arg | --testloops=arg (1) Number of Tests
+  -t=arg | --threads=arg (1)   Number of Test threads
+</code></pre>
+
+<p>If you have executed the <strong>make check</strong> or <strong>make cross</strong> then you will be able to browse
+<a href="gen-html/ThriftTest.html">gen-html/ThriftTest.html</a> with the test documentation.</p>
+
+<h3 id="return-code">Return code</h3>
+
+<p>The return code (exit code) shall be 0 on success, or an integer in the range 1 - 255 on errors.
+In order to signal failed tests, the return code shall be composed from these bits to indicate
+failing tests:</p>
+
+<pre><code>  #define TEST_BASETYPES     1  // 0000 0001
+  #define TEST_STRUCTS       2  // 0000 0010
+  #define TEST_CONTAINERS    4  // 0000 0100
+  #define TEST_EXCEPTIONS    8  // 0000 1000
+  #define TEST_UNKNOWN      64  // 0100 0000 (Failed to prepare environment etc.)
+  #define TEST_TIMEOUT     128  // 1000 0000
+  #define TEST_NOTUSED      48  // 0011 0000 (reserved bits)
+</code></pre>
+
+<p>Tests that have not been executed at all count as errors.</p>
+
+<p><strong>Example:</strong></p>
+
+<p>During tests, the test client notices that some of the Struct tests fail.
+Furthermore, due to some other problem none of the Exception tests is executed.
+Therefore, the test client returns the code <code>10 = 2 | 8</code>, indicating the failure
+of both test 2 (TEST_STRUCTS) and test 8 (TEST_EXCEPTIONS).</p>
+
+<h2 id="ssl">SSL</h2>
+<p>Test Keys and Certificates are provided in multiple formats under the following
+directory <a href="keys">test/keys</a></p>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=test/README.md">test/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/test/keys.html b/output/test/keys.html
new file mode 100644
index 0000000..9677101
--- /dev/null
+++ b/output/test/keys.html
@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Keys</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      
+<h1 id="test-keys-and-certificates">Test Keys and Certificates</h1>
+<p>This folder is dedicated to test keys and certificates provided in multiple formats.
+Primary use are unit test suites and cross language tests.</p>
+
+<pre><code>test/keys
+</code></pre>
+
+<p><strong>The files in this directory must never be used on production systems.</strong></p>
+
+<h2 id="ssl-keys-and-certificates">SSL Keys and Certificates</h2>
+
+<h2 id="create-certificates">create certificates</h2>
+
+<p>we use the following parameters for test key and certificate creation</p>
+
+<pre><code>C=US,
+ST=Maryland,
+L=Forest Hill,
+O=The Apache Software Foundation,
+OU=Apache Thrift,
+CN=localhost/emailAddress=dev@thrift.apache.org
+</code></pre>
+
+<h3 id="create-self-signed-server-key-and-certificate">create self-signed server key and certificate</h3>
+
+<pre><code>openssl req -new -x509 -nodes  -days 3000 -out server.crt -keyout server.key
+openssl x509 -in server.crt -text &gt; CA.pem
+cat server.crt server.key &gt; server.pem
+</code></pre>
+
+<p>Export password is &#8220;thrift&#8221; without the quotes</p>
+
+<pre><code>openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12
+</code></pre>
+
+<h3 id="create-client-key-and-certificate">create client key and certificate</h3>
+
+<pre><code>openssl genrsa -out client.key
+</code></pre>
+
+<p>create a signing request:</p>
+
+<pre><code>openssl req -new -key client.key -out client.csr
+</code></pre>
+
+<p>sign the client certificate with the server.key</p>
+
+<pre><code>openssl x509 -req -days 3000 -in client.csr -CA CA.pem -CAkey server.key -set_serial 01 -out client.crt
+</code></pre>
+
+<p>export certificate in PKCS12 format (Export password is &#8220;thrift&#8221; without the quotes)</p>
+
+<pre><code>openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
+</code></pre>
+
+<p>export certificate in PEM format for OpenSSL usage</p>
+
+<pre><code>openssl pkcs12 -in client.p12 -out client.pem -clcerts
+</code></pre>
+
+<h3 id="create-client-key-and-certificate-with-altnames">create client key and certificate with altnames</h3>
+
+<p>copy openssl.cnf from your system e.g. /etc/ssl/openssl.cnf and append following to the end of [ v3_req ]</p>
+
+<pre><code>subjectAltName=@alternate_names
+
+[ alternate_names ]
+IP.1=127.0.0.1
+IP.2=::1
+IP.3=::ffff:127.0.0.1
+</code></pre>
+
+<p>create a signing request:</p>
+
+<pre><code>openssl req -new -key client_v3.key -out client_v3.csr -config openssl.cnf \
+    -subj "/C=US/ST=Maryland/L=Forest Hill/O=The Apache Software Foundation/OU=Apache Thrift/CN=localhost" -extensions v3_req
+</code></pre>
+
+<p>sign the client certificate with the server.key</p>
+
+<pre><code>openssl x509 -req -days 3000 -in client_v3.csr -CA CA.pem -CAkey server.key -set_serial 01 -out client_v3.crt -extensions v3_req -extfile openssl.cnf
+</code></pre>
+
+<h2 id="java-key-and-certificate-import">Java key and certificate import</h2>
+<p>Java Test Environment uses key and trust store password &#8220;thrift&#8221; without the quotes</p>
+
+<p>list keystore entries</p>
+
+<pre><code>keytool -list -storepass thrift -keystore ../../lib/java/test/.keystore
+</code></pre>
+
+<p>list truststore entries</p>
+
+<pre><code>keytool -list -storepass thrift -keystore ../../lib/java/test/.truststore
+</code></pre>
+
+<p>delete an entry</p>
+
+<pre><code>keytool -delete -storepass thrift -keystore ../../lib/java/test/.truststore -alias ssltest
+</code></pre>
+
+<p>import certificate into truststore</p>
+
+<pre><code>keytool -importcert -storepass thrift -keystore ../../lib/java/test/.truststore -alias localhost --file server.crt
+</code></pre>
+
+<p>import key into keystore</p>
+
+<pre><code>keytool -importkeystore -storepass thrift -keystore ../../lib/java/test/.keystore -srcstoretype pkcs12 -srckeystore server.p12
+</code></pre>
+
+<h1 id="test-ssl-server-and-clients">Test SSL server and clients</h1>
+
+<pre><code>openssl s_client -connect localhost:9090
+openssl s_server -accept 9090 -www
+</code></pre>
+
+<p class="snippet_footer">This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=test/keys/README.md">test/keys/README.md</a>
+</p>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/as3.html b/output/tutorial/as3.html
new file mode 100644
index 0000000..f5dc51a
--- /dev/null
+++ b/output/tutorial/as3.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Actionscript 3.0</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Actionscript 3.0 Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen as3 tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+<p>To initialize client you can use code similar to:</p>
+
+<div class="highlight"><pre class="codehilite"><code>    <span class="kd">private</span> <span class="n">function</span> <span class="nf">initConnection</span><span class="o">():</span><span class="kt">void</span> <span class="o">{</span>
+      <span class="n">mTransport</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TSocket</span><span class="o">(</span><span class="s">"127.0.0.1"</span><span class="o">,</span> <span class="mi">9090</span><span class="o">);</span> <span class="c1">// we connect to server</span>
+      <span class="n">mTransport</span><span class="o">.</span><span class="na">open</span><span class="o">();</span>
+      <span class="c1">// initialize protocol:</span>
+      <span class="kt">var</span> <span class="nl">protocol:</span><span class="nc">TProtocol</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TBinaryProtocol</span><span class="o">(</span><span class="n">mTransport</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="kc">false</span><span class="o">);</span>
+      <span class="n">mCalculatorClient</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">CalculatorImpl</span><span class="o">(</span><span class="n">protocol</span><span class="o">);</span> <span class="c1">// finally, we create calculator client instance</span>
+    <span class="o">}</span>
+
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/as3/src/CalculatorUI.as">tutorial/as3/src/CalculatorUI.as</a>
+</p>
+
+<h3 id="server">Server</h3>
+<p>The example client above can be tested against a java tutorial server.</p>
+
+<h3 id="additional-information">Additional Information</h3>
+
+<p>You might find server failing due to out of memory exception. This might happen because of flash crossdomain policy. See
+next passage on how to fix this.</p>
+
+<h3 id="flash-crossdomain-policy">Flash crossdomain policy</h3>
+
+<p>Flash does not allow movies to connect to arbitrary servers. This is done for security reasons. To override this
+restriction, however, servers’ owners can create special file - crossdomain xml file, which lists the rules according to
+which some flash movies can connect to the server.</p>
+
+<p>Details about this behavior are listed in
+<a href="http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html">Setting up a socket policy file server</a>.
+Also, you can find a simple python/perl server script to serve this file there. For same host, you can serve
+crossdomain.xml from any port. So, you can start your RPC servers on ports 9090 and 9091, and serve polisy file from
+port 9092. To tell flash about this, you can use code from tutorial file:</p>
+
+<div class="highlight"><pre class="codehilite"><code>    <span class="kd">private</span> <span class="n">function</span> <span class="nf">initSecurity</span><span class="o">():</span><span class="kt">void</span> <span class="o">{</span>
+      <span class="nc">Security</span><span class="o">.</span><span class="na">loadPolicyFile</span><span class="o">(</span><span class="s">"xmlsocket://127.0.0.1:9092"</span><span class="o">);</span>
+    <span class="o">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/as3/src/CalculatorUI.as">tutorial/as3/src/CalculatorUI.as</a>
+</p>
+
+<p>Example of crossdomain file, to allow connect to ports 9090 and 9091 from any server:</p>
+
+<pre><code>
+&lt;?xml version="1.0"?&gt;
+&lt;!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"&gt;
+&lt;!-- Policy file --&gt;
+&lt;cross-domain-policy&gt;
+  &lt;allow-access-from domain="*" to-ports="9090,9091" /&gt;
+&lt;/cross-domain-policy&gt;
+</code></pre>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/c_glib.html b/output/tutorial/c_glib.html
new file mode 100644
index 0000000..fb87e57
--- /dev/null
+++ b/output/tutorial/c_glib.html
@@ -0,0 +1,798 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - c_glib</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>c_glib Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen c_glib tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cp">#include &lt;stdio.h&gt;
+#include &lt;glib-object.h&gt;
+</span>
+<span class="cp">#include &lt;thrift/c_glib/protocol/thrift_binary_protocol.h&gt;
+#include &lt;thrift/c_glib/transport/thrift_buffered_transport.h&gt;
+#include &lt;thrift/c_glib/transport/thrift_socket.h&gt;
+</span>
+<span class="cp">#include "gen-c_glib/calculator.h"
+</span>
+<span class="kt">int</span> <span class="nf">main</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">ThriftSocket</span> <span class="o">*</span><span class="n">socket</span><span class="p">;</span>
+  <span class="n">ThriftTransport</span> <span class="o">*</span><span class="n">transport</span><span class="p">;</span>
+  <span class="n">ThriftProtocol</span> <span class="o">*</span><span class="n">protocol</span><span class="p">;</span>
+  <span class="n">CalculatorIf</span> <span class="o">*</span><span class="n">client</span><span class="p">;</span>
+
+  <span class="n">GError</span> <span class="o">*</span><span class="n">error</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
+  <span class="n">InvalidOperation</span> <span class="o">*</span><span class="n">invalid_operation</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
+
+  <span class="n">Work</span> <span class="o">*</span><span class="n">work</span><span class="p">;</span>
+
+  <span class="n">gint32</span> <span class="n">sum</span><span class="p">;</span>
+  <span class="n">gint32</span> <span class="n">diff</span><span class="p">;</span>
+
+  <span class="kt">int</span> <span class="n">exit_status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+
+<span class="cp">#if (!GLIB_CHECK_VERSION (2, 36, 0))
+</span>  <span class="n">g_type_init</span> <span class="p">();</span>
+<span class="cp">#endif
+</span>
+  <span class="n">socket</span>    <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">THRIFT_TYPE_SOCKET</span><span class="p">,</span>
+                            <span class="s">"hostname"</span><span class="p">,</span>  <span class="s">"localhost"</span><span class="p">,</span>
+                            <span class="s">"port"</span><span class="p">,</span>      <span class="mi">9090</span><span class="p">,</span>
+                            <span class="nb">NULL</span><span class="p">);</span>
+  <span class="n">transport</span> <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">THRIFT_TYPE_BUFFERED_TRANSPORT</span><span class="p">,</span>
+                            <span class="s">"transport"</span><span class="p">,</span> <span class="n">socket</span><span class="p">,</span>
+                            <span class="nb">NULL</span><span class="p">);</span>
+  <span class="n">protocol</span>  <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">THRIFT_TYPE_BINARY_PROTOCOL</span><span class="p">,</span>
+                            <span class="s">"transport"</span><span class="p">,</span> <span class="n">transport</span><span class="p">,</span>
+                            <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="n">thrift_transport_open</span> <span class="p">(</span><span class="n">transport</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+
+
+  <span class="cm">/* In the C (GLib) implementation of Thrift, service methods on the
+     server are accessed via a generated client class that implements
+     the service interface. In this tutorial, we access a Calculator
+     service through an instance of CalculatorClient, which implements
+     CalculatorIf. */</span>
+  <span class="n">client</span> <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">TYPE_CALCULATOR_CLIENT</span><span class="p">,</span>
+                         <span class="s">"input_protocol"</span><span class="p">,</span>  <span class="n">protocol</span><span class="p">,</span>
+                         <span class="s">"output_protocol"</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span>
+                         <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Each of the client methods requires at least two parameters: A
+     pointer to the client-interface implementation (the client
+     object), and a handle to a GError structure to receive
+     information about any error that occurs.
+
+     On success, client methods return TRUE. A return value of FALSE
+     indicates an error occurred and the error parameter has been
+     set. */</span>
+  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">error</span> <span class="o">&amp;&amp;</span> <span class="n">calculator_if_ping</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">error</span><span class="p">))</span> <span class="p">{</span>
+    <span class="n">puts</span> <span class="p">(</span><span class="s">"ping()"</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="cm">/* Service methods that return a value do so by passing the result
+     back via an output parameter (here, "sum"). */</span>
+  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">error</span> <span class="o">&amp;&amp;</span> <span class="n">calculator_if_add</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">sum</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">error</span><span class="p">))</span> <span class="p">{</span>
+    <span class="n">printf</span> <span class="p">(</span><span class="s">"1+1=%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">sum</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="cm">/* Thrift structs are implemented as GObjects, with each of the
+     struct's members exposed as an object property. */</span>
+  <span class="n">work</span> <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">TYPE_WORK</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">g_object_set</span> <span class="p">(</span><span class="n">work</span><span class="p">,</span>
+                  <span class="s">"num1"</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span>
+                  <span class="s">"num2"</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
+                  <span class="s">"op"</span><span class="p">,</span>   <span class="n">OPERATION_DIVIDE</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+    <span class="cm">/* Exceptions are passed back from service methods in a manner
+       similar to return values. */</span>
+    <span class="k">if</span> <span class="p">(</span><span class="n">calculator_if_calculate</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span>
+                                 <span class="nb">NULL</span><span class="p">,</span>
+                                 <span class="mi">1</span><span class="p">,</span>
+                                 <span class="n">work</span><span class="p">,</span>
+                                 <span class="o">&amp;</span><span class="n">invalid_operation</span><span class="p">,</span>
+                                 <span class="o">&amp;</span><span class="n">error</span><span class="p">))</span> <span class="p">{</span>
+      <span class="n">puts</span> <span class="p">(</span><span class="s">"Whoa? We can divide by zero!"</span><span class="p">);</span>
+    <span class="p">}</span>
+    <span class="k">else</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="n">invalid_operation</span><span class="p">)</span> <span class="p">{</span>
+        <span class="n">gchar</span> <span class="o">*</span><span class="n">why</span><span class="p">;</span>
+
+        <span class="cm">/* Like structs, exceptions are implemented as objects with
+           properties. */</span>
+        <span class="n">g_object_get</span> <span class="p">(</span><span class="n">invalid_operation</span><span class="p">,</span> <span class="s">"why"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">why</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
+
+        <span class="n">printf</span> <span class="p">(</span><span class="s">"InvalidOperation: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">why</span><span class="p">);</span>
+
+        <span class="k">if</span> <span class="p">(</span><span class="n">why</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
+          <span class="n">g_free</span> <span class="p">(</span><span class="n">why</span><span class="p">);</span>
+        <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">invalid_operation</span><span class="p">);</span>
+        <span class="n">invalid_operation</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
+      <span class="p">}</span>
+
+      <span class="n">g_clear_error</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+    <span class="p">}</span>
+  <span class="p">}</span>
+
+  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+    <span class="cm">/* Struct objects can be reused across method invocations. */</span>
+    <span class="n">g_object_set</span> <span class="p">(</span><span class="n">work</span><span class="p">,</span>
+                  <span class="s">"num1"</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span>
+                  <span class="s">"num2"</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span>
+                  <span class="s">"op"</span><span class="p">,</span>   <span class="n">OPERATION_SUBTRACT</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+    <span class="k">if</span> <span class="p">(</span><span class="n">calculator_if_calculate</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span>
+                                 <span class="o">&amp;</span><span class="n">diff</span><span class="p">,</span>
+                                 <span class="mi">1</span><span class="p">,</span>
+                                 <span class="n">work</span><span class="p">,</span>
+                                 <span class="o">&amp;</span><span class="n">invalid_operation</span><span class="p">,</span>
+                                 <span class="o">&amp;</span><span class="n">error</span><span class="p">))</span> <span class="p">{</span>
+      <span class="n">printf</span> <span class="p">(</span><span class="s">"15-10=%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">diff</span><span class="p">);</span>
+    <span class="p">}</span>
+  <span class="p">}</span>
+
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">work</span><span class="p">);</span>
+
+  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">SharedStruct</span> <span class="o">*</span><span class="n">shared_struct</span><span class="p">;</span>
+    <span class="n">gchar</span> <span class="o">*</span><span class="n">value</span><span class="p">;</span>
+
+    <span class="n">shared_struct</span> <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">TYPE_SHARED_STRUCT</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
+
+    <span class="cm">/* As defined in the Thrift file, the Calculator service extends
+       the SharedService service. Correspondingly, in the generated
+       code CalculatorIf inherits from SharedServiceIf, and the parent
+       service's methods are accessible through a simple cast. */</span>
+    <span class="k">if</span> <span class="p">(</span><span class="n">shared_service_client_get_struct</span> <span class="p">(</span><span class="n">SHARED_SERVICE_IF</span> <span class="p">(</span><span class="n">client</span><span class="p">),</span>
+                                          <span class="o">&amp;</span><span class="n">shared_struct</span><span class="p">,</span>
+                                          <span class="mi">1</span><span class="p">,</span>
+                                          <span class="o">&amp;</span><span class="n">error</span><span class="p">))</span> <span class="p">{</span>
+      <span class="n">g_object_get</span> <span class="p">(</span><span class="n">shared_struct</span><span class="p">,</span> <span class="s">"value"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">value</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
+      <span class="n">printf</span> <span class="p">(</span><span class="s">"Check log: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">value</span><span class="p">);</span>
+      <span class="n">g_free</span> <span class="p">(</span><span class="n">value</span><span class="p">);</span>
+    <span class="p">}</span>
+
+    <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">shared_struct</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="k">if</span> <span class="p">(</span><span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">printf</span> <span class="p">(</span><span class="s">"ERROR: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">error</span><span class="o">-&gt;</span><span class="n">message</span><span class="p">);</span>
+    <span class="n">g_clear_error</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+
+    <span class="n">exit_status</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="n">thrift_transport_close</span> <span class="p">(</span><span class="n">transport</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">client</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">protocol</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">transport</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">socket</span><span class="p">);</span>
+
+  <span class="k">return</span> <span class="n">exit_status</span><span class="p">;</span>
+<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/c_glib/c_glib_client.c">tutorial/c_glib/c_glib_client.c</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cp">#include &lt;glib-object.h&gt;
+#include &lt;signal.h&gt;
+#include &lt;stdio.h&gt;
+#include &lt;string.h&gt;
+</span>
+<span class="cp">#include &lt;thrift/c_glib/thrift.h&gt;
+#include &lt;thrift/c_glib/protocol/thrift_binary_protocol_factory.h&gt;
+#include &lt;thrift/c_glib/protocol/thrift_protocol_factory.h&gt;
+#include &lt;thrift/c_glib/server/thrift_server.h&gt;
+#include &lt;thrift/c_glib/server/thrift_simple_server.h&gt;
+#include &lt;thrift/c_glib/transport/thrift_buffered_transport_factory.h&gt;
+#include &lt;thrift/c_glib/transport/thrift_server_socket.h&gt;
+#include &lt;thrift/c_glib/transport/thrift_server_transport.h&gt;
+</span>
+<span class="cp">#include "gen-c_glib/calculator.h"
+</span>
+<span class="n">G_BEGIN_DECLS</span>
+
+<span class="cm">/* In the C (GLib) implementation of Thrift, the actual work done by a
+   server---that is, the code that runs when a client invokes a
+   service method---is defined in a separate "handler" class that
+   implements the service interface. Here we define the
+   TutorialCalculatorHandler class, which implements the CalculatorIf
+   interface and provides the behavior expected by tutorial clients.
+   (Typically this code would be placed in its own module but for
+   clarity this tutorial is presented entirely in a single file.)
+
+   For each service the Thrift compiler generates an abstract base
+   class from which handler implementations should inherit. In our
+   case TutorialCalculatorHandler inherits from CalculatorHandler,
+   defined in gen-c_glib/calculator.h.
+
+   If you're new to GObject, try not to be intimidated by the quantity
+   of code here---much of it is boilerplate and can mostly be
+   copied-and-pasted from existing work. For more information refer to
+   the GObject Reference Manual, available online at
+   https://developer.gnome.org/gobject/. */</span>
+
+<span class="cp">#define TYPE_TUTORIAL_CALCULATOR_HANDLER \
+  (tutorial_calculator_handler_get_type ())
+</span>
+<span class="cp">#define TUTORIAL_CALCULATOR_HANDLER(obj)                                \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj),                                   \
+                               TYPE_TUTORIAL_CALCULATOR_HANDLER,        \
+                               TutorialCalculatorHandler))
+#define TUTORIAL_CALCULATOR_HANDLER_CLASS(c)                    \
+  (G_TYPE_CHECK_CLASS_CAST ((c),                                \
+                            TYPE_TUTORIAL_CALCULATOR_HANDLER,   \
+                            TutorialCalculatorHandlerClass))
+#define IS_TUTORIAL_CALCULATOR_HANDLER(obj)                             \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                                   \
+                               TYPE_TUTORIAL_CALCULATOR_HANDLER))
+#define IS_TUTORIAL_CALCULATOR_HANDLER_CLASS(c)                 \
+  (G_TYPE_CHECK_CLASS_TYPE ((c),                                \
+                            TYPE_TUTORIAL_CALCULATOR_HANDLER))
+#define TUTORIAL_CALCULATOR_HANDLER_GET_CLASS(obj)              \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj),                            \
+                              TYPE_TUTORIAL_CALCULATOR_HANDLER, \
+                              TutorialCalculatorHandlerClass))
+</span>
+<span class="k">struct</span> <span class="n">_TutorialCalculatorHandler</span> <span class="p">{</span>
+  <span class="n">CalculatorHandler</span> <span class="n">parent_instance</span><span class="p">;</span>
+
+  <span class="cm">/* private */</span>
+  <span class="n">GHashTable</span> <span class="o">*</span><span class="n">log</span><span class="p">;</span>
+<span class="p">};</span>
+<span class="k">typedef</span> <span class="k">struct</span> <span class="n">_TutorialCalculatorHandler</span> <span class="n">TutorialCalculatorHandler</span><span class="p">;</span>
+
+<span class="k">struct</span> <span class="n">_TutorialCalculatorHandlerClass</span> <span class="p">{</span>
+  <span class="n">CalculatorHandlerClass</span> <span class="n">parent_class</span><span class="p">;</span>
+<span class="p">};</span>
+<span class="k">typedef</span> <span class="k">struct</span> <span class="n">_TutorialCalculatorHandlerClass</span> <span class="n">TutorialCalculatorHandlerClass</span><span class="p">;</span>
+
+<span class="n">GType</span> <span class="nf">tutorial_calculator_handler_get_type</span> <span class="p">(</span><span class="kt">void</span><span class="p">);</span>
+
+<span class="n">G_END_DECLS</span>
+
+<span class="cm">/* ---------------------------------------------------------------- */</span>
+
+<span class="cm">/* The implementation of TutorialCalculatorHandler follows. */</span>
+
+<span class="n">G_DEFINE_TYPE</span> <span class="p">(</span><span class="n">TutorialCalculatorHandler</span><span class="p">,</span>
+               <span class="n">tutorial_calculator_handler</span><span class="p">,</span>
+               <span class="n">TYPE_CALCULATOR_HANDLER</span><span class="p">)</span>
+
+<span class="cm">/* Each of a handler's methods accepts at least two parameters: A
+   pointer to the service-interface implementation (the handler object
+   itself) and a handle to a GError structure to receive information
+   about any error that occurs.
+
+   On success, a handler method returns TRUE. A return value of FALSE
+   indicates an error occurred and the error parameter has been
+   set. (Methods should not return FALSE without first setting the
+   error parameter.) */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_ping</span> <span class="p">(</span><span class="n">CalculatorIf</span>  <span class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                  <span class="n">GError</span>       <span class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">iface</span><span class="p">);</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">error</span><span class="p">);</span>
+
+  <span class="n">puts</span> <span class="p">(</span><span class="s">"ping()"</span><span class="p">);</span>
+
+  <span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* Service-method parameters are passed through as parameters to the
+   handler method.
+
+   If the service method returns a value an output parameter, _return,
+   is additionally passed to the handler method. This parameter should
+   be set appropriately before the method returns, whenever it
+   succeeds.
+
+   The return value from this method happens to be of a base type,
+   i32, but note if a method returns a complex type such as a map or
+   list *_return will point to a pre-allocated data structure that
+   does not need to be re-allocated and should not be destroyed. */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_add</span> <span class="p">(</span><span class="n">CalculatorIf</span>  <span class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                 <span class="n">gint32</span>        <span class="o">*</span><span class="n">_return</span><span class="p">,</span>
+                                 <span class="k">const</span> <span class="n">gint32</span>   <span class="n">num1</span><span class="p">,</span>
+                                 <span class="k">const</span> <span class="n">gint32</span>   <span class="n">num2</span><span class="p">,</span>
+                                 <span class="n">GError</span>       <span class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">iface</span><span class="p">);</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">error</span><span class="p">);</span>
+
+  <span class="n">printf</span> <span class="p">(</span><span class="s">"add(%d,%d)</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">num1</span><span class="p">,</span> <span class="n">num2</span><span class="p">);</span>
+  <span class="o">*</span><span class="n">_return</span> <span class="o">=</span> <span class="n">num1</span> <span class="o">+</span> <span class="n">num2</span><span class="p">;</span>
+
+  <span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* Any handler method can return a ThriftApplicationException to the
+   client by setting its error parameter appropriately and returning
+   FALSE. See the ThriftApplicationExceptionError enumeration defined
+   in thrift_application_exception.h for a list of recognized
+   exception types (GError codes).
+
+   If a service method can also throw a custom exception (that is, one
+   defined in the .thrift file) an additional output parameter will be
+   provided (here, "ouch") to hold an instance of the exception, when
+   necessary. Note there will be a separate parameter added for each
+   type of exception the method can throw.
+
+   Unlike return values, exception objects are never pre-created; this
+   is always the responsibility of the handler method. */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_calculate</span> <span class="p">(</span><span class="n">CalculatorIf</span>      <span class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                       <span class="n">gint32</span>            <span class="o">*</span><span class="n">_return</span><span class="p">,</span>
+                                       <span class="k">const</span> <span class="n">gint32</span>       <span class="n">logid</span><span class="p">,</span>
+                                       <span class="k">const</span> <span class="n">Work</span>        <span class="o">*</span><span class="n">w</span><span class="p">,</span>
+                                       <span class="n">InvalidOperation</span> <span class="o">**</span><span class="n">ouch</span><span class="p">,</span>
+                                       <span class="n">GError</span>           <span class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">TutorialCalculatorHandler</span> <span class="o">*</span><span class="n">self</span><span class="p">;</span>
+
+  <span class="n">gint</span> <span class="o">*</span><span class="n">log_key</span><span class="p">;</span>
+  <span class="n">gchar</span> <span class="n">log_value</span><span class="p">[</span><span class="mi">12</span><span class="p">];</span>
+  <span class="n">SharedStruct</span> <span class="o">*</span><span class="n">log_struct</span><span class="p">;</span>
+
+  <span class="n">gint</span> <span class="n">num1</span><span class="p">;</span>
+  <span class="n">gint</span> <span class="n">num2</span><span class="p">;</span>
+  <span class="n">Operation</span> <span class="n">op</span><span class="p">;</span>
+  <span class="n">gboolean</span> <span class="n">result</span> <span class="o">=</span> <span class="n">TRUE</span><span class="p">;</span>
+
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">error</span><span class="p">);</span>
+
+  <span class="n">g_return_val_if_fail</span> <span class="p">(</span><span class="n">IS_TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span class="n">iface</span><span class="p">),</span>
+                        <span class="n">FALSE</span><span class="p">);</span>
+  <span class="n">self</span> <span class="o">=</span> <span class="n">TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span class="n">iface</span><span class="p">);</span>
+
+  <span class="cm">/* Remember: Exception objects are never pre-created */</span>
+  <span class="n">g_assert</span> <span class="p">(</span><span class="o">*</span><span class="n">ouch</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Fetch the contents of our Work parameter.
+
+     Note that integer properties of thirty-two bits or fewer in width
+     are _always_ of type gint, regardless of the range of values they
+     hold. A common error is trying to retrieve, say, a structure
+     member defined in the .thrift file as type i16 into a variable of
+     type gint16, which will clobber variables adjacent on the
+     stack. Remember: If you're retrieving an integer property the
+     receiving variable must be of either type gint or gint64, as
+     appropriate. */</span>
+  <span class="n">g_object_get</span> <span class="p">((</span><span class="n">Work</span> <span class="o">*</span><span class="p">)</span><span class="n">w</span><span class="p">,</span>
+                <span class="s">"num1"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">num1</span><span class="p">,</span>
+                <span class="s">"num2"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">num2</span><span class="p">,</span>
+                <span class="s">"op"</span><span class="p">,</span>   <span class="o">&amp;</span><span class="n">op</span><span class="p">,</span>
+                <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="n">printf</span> <span class="p">(</span><span class="s">"calculate(%d,{%d,%d,%d})</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">logid</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">num1</span><span class="p">,</span> <span class="n">num2</span><span class="p">);</span>
+
+  <span class="k">switch</span> <span class="p">(</span><span class="n">op</span><span class="p">)</span> <span class="p">{</span>
+  <span class="k">case</span> <span class="n">OPERATION_ADD</span><span class="p">:</span>
+    <span class="o">*</span><span class="n">_return</span> <span class="o">=</span> <span class="n">num1</span> <span class="o">+</span> <span class="n">num2</span><span class="p">;</span>
+    <span class="k">break</span><span class="p">;</span>
+
+  <span class="k">case</span> <span class="n">OPERATION_SUBTRACT</span><span class="p">:</span>
+    <span class="o">*</span><span class="n">_return</span> <span class="o">=</span> <span class="n">num1</span> <span class="o">-</span> <span class="n">num2</span><span class="p">;</span>
+    <span class="k">break</span><span class="p">;</span>
+
+  <span class="k">case</span> <span class="n">OPERATION_MULTIPLY</span><span class="p">:</span>
+    <span class="o">*</span><span class="n">_return</span> <span class="o">=</span> <span class="n">num1</span> <span class="o">*</span> <span class="n">num2</span><span class="p">;</span>
+    <span class="k">break</span><span class="p">;</span>
+
+  <span class="k">case</span> <span class="n">OPERATION_DIVIDE</span><span class="p">:</span>
+    <span class="k">if</span> <span class="p">(</span><span class="n">num2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
+      <span class="cm">/* For each custom exception type a subclass of ThriftStruct is
+         generated by the Thrift compiler. Throw an exception by
+         setting the corresponding output parameter to a new instance
+         of its type and returning FALSE. */</span>
+      <span class="o">*</span><span class="n">ouch</span> <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">TYPE_INVALID_OPERATION</span><span class="p">,</span>
+                            <span class="s">"whatOp"</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span>
+                            <span class="s">"why"</span><span class="p">,</span>  <span class="n">g_strdup</span> <span class="p">(</span><span class="s">"Cannot divide by 0"</span><span class="p">),</span>
+                            <span class="nb">NULL</span><span class="p">);</span>
+      <span class="n">result</span> <span class="o">=</span> <span class="n">FALSE</span><span class="p">;</span>
+
+      <span class="cm">/* Note the call to g_strdup above: All the memory used by a
+         ThriftStruct's properties belongs to the object itself and
+         will be freed on destruction. Removing this call to g_strdup
+         will lead to a segmentation fault as the object tries to
+         release memory allocated statically to the program. */</span>
+    <span class="p">}</span>
+    <span class="k">else</span> <span class="p">{</span>
+      <span class="o">*</span><span class="n">_return</span> <span class="o">=</span> <span class="n">num1</span> <span class="o">/</span> <span class="n">num2</span><span class="p">;</span>
+    <span class="p">}</span>
+    <span class="k">break</span><span class="p">;</span>
+
+  <span class="nl">default:</span>
+    <span class="o">*</span><span class="n">ouch</span> <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">TYPE_INVALID_OPERATION</span><span class="p">,</span>
+                          <span class="s">"whatOp"</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span>
+                          <span class="s">"why"</span><span class="p">,</span>  <span class="n">g_strdup</span> <span class="p">(</span><span class="s">"Invalid Operation"</span><span class="p">),</span>
+                          <span class="nb">NULL</span><span class="p">);</span>
+    <span class="n">result</span> <span class="o">=</span> <span class="n">FALSE</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="cm">/* On success, log a record of the result to our hash table */</span>
+  <span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">log_key</span> <span class="o">=</span> <span class="n">g_malloc</span> <span class="p">(</span><span class="k">sizeof</span> <span class="o">*</span><span class="n">log_key</span><span class="p">);</span>
+    <span class="o">*</span><span class="n">log_key</span> <span class="o">=</span> <span class="n">logid</span><span class="p">;</span>
+
+    <span class="n">snprintf</span> <span class="p">(</span><span class="n">log_value</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">log_value</span><span class="p">,</span> <span class="s">"%d"</span><span class="p">,</span> <span class="o">*</span><span class="n">_return</span><span class="p">);</span>
+
+    <span class="n">log_struct</span> <span class="o">=</span> <span class="n">g_object_new</span> <span class="p">(</span><span class="n">TYPE_SHARED_STRUCT</span><span class="p">,</span>
+                               <span class="s">"key"</span><span class="p">,</span>   <span class="o">*</span><span class="n">log_key</span><span class="p">,</span>
+                               <span class="s">"value"</span><span class="p">,</span>  <span class="n">g_strdup</span> <span class="p">(</span><span class="n">log_value</span><span class="p">),</span>
+                               <span class="nb">NULL</span><span class="p">);</span>
+    <span class="n">g_hash_table_replace</span> <span class="p">(</span><span class="n">self</span><span class="o">-&gt;</span><span class="n">log</span><span class="p">,</span> <span class="n">log_key</span><span class="p">,</span> <span class="n">log_struct</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* A one-way method has the same signature as an equivalent, regular
+   method that returns no value. */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_zip</span> <span class="p">(</span><span class="n">CalculatorIf</span>  <span class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                 <span class="n">GError</span>       <span class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">iface</span><span class="p">);</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">error</span><span class="p">);</span>
+
+  <span class="n">puts</span> <span class="p">(</span><span class="s">"zip()"</span><span class="p">);</span>
+
+  <span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* As specified in the .thrift file (tutorial.thrift), the Calculator
+   service extends the SharedService service. Correspondingly, in the
+   generated code the Calculator interface, CalculatorIf, extends the
+   SharedService interface, SharedServiceIf, and subclasses of
+   CalculatorHandler should implement its methods as well.
+
+   Here we provide an implementation for the getStruct method from the
+   parent service. */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_get_struct</span> <span class="p">(</span><span class="n">SharedServiceIf</span>  <span class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                        <span class="n">SharedStruct</span>    <span class="o">**</span><span class="n">_return</span><span class="p">,</span>
+                                        <span class="k">const</span> <span class="n">gint32</span>      <span class="n">key32</span><span class="p">,</span>
+                                        <span class="n">GError</span>          <span class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">gint</span> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">gint</span><span class="p">)</span><span class="n">key32</span><span class="p">;</span>
+  <span class="n">TutorialCalculatorHandler</span> <span class="o">*</span><span class="n">self</span><span class="p">;</span>
+  <span class="n">SharedStruct</span> <span class="o">*</span><span class="n">log_struct</span><span class="p">;</span>
+  <span class="n">gint</span> <span class="n">log_key</span><span class="p">;</span>
+  <span class="n">gchar</span> <span class="o">*</span><span class="n">log_value</span><span class="p">;</span>
+
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">error</span><span class="p">);</span>
+
+  <span class="n">g_return_val_if_fail</span> <span class="p">(</span><span class="n">IS_TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span class="n">iface</span><span class="p">),</span>
+                        <span class="n">FALSE</span><span class="p">);</span>
+  <span class="n">self</span> <span class="o">=</span> <span class="n">TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span class="n">iface</span><span class="p">);</span>
+
+  <span class="cm">/* Remember: Complex return types are always pre-created and need
+     only be populated */</span>
+  <span class="n">g_assert</span> <span class="p">(</span><span class="o">*</span><span class="n">_return</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="n">printf</span> <span class="p">(</span><span class="s">"getStruct(%d)</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">key</span><span class="p">);</span>
+
+  <span class="cm">/* If the key exists in our log, return the corresponding logged
+     data (or an empty SharedStruct structure if it does not).
+
+     Incidentally, note we _must_ here copy the values from the hash
+     table into the return structure. All memory used by the return
+     structure belongs to the structure itself and will be freed once
+     a response is sent to the client. If we merely freed *_return and
+     set it to point to our hash-table entry, that would mean memory
+     would be released (effectively, data erased) out of the hash
+     table! */</span>
+  <span class="n">log_struct</span> <span class="o">=</span> <span class="n">g_hash_table_lookup</span> <span class="p">(</span><span class="n">self</span><span class="o">-&gt;</span><span class="n">log</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">key</span><span class="p">);</span>
+  <span class="k">if</span> <span class="p">(</span><span class="n">log_struct</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">g_object_get</span> <span class="p">(</span><span class="n">log_struct</span><span class="p">,</span>
+                  <span class="s">"key"</span><span class="p">,</span>   <span class="o">&amp;</span><span class="n">log_key</span><span class="p">,</span>
+                  <span class="s">"value"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">log_value</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+    <span class="n">g_object_set</span> <span class="p">(</span><span class="o">*</span><span class="n">_return</span><span class="p">,</span>
+                  <span class="s">"key"</span><span class="p">,</span>   <span class="n">log_key</span><span class="p">,</span>
+                  <span class="s">"value"</span><span class="p">,</span> <span class="n">g_strdup</span> <span class="p">(</span><span class="n">log_value</span><span class="p">),</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* TutorialCalculatorHandler's instance finalizer (destructor) */</span>
+<span class="k">static</span> <span class="kt">void</span>
+<span class="nf">tutorial_calculator_handler_finalize</span> <span class="p">(</span><span class="n">GObject</span> <span class="o">*</span><span class="n">object</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">TutorialCalculatorHandler</span> <span class="o">*</span><span class="n">self</span> <span class="o">=</span>
+    <span class="n">TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span class="n">object</span><span class="p">);</span>
+
+  <span class="cm">/* Free our calculation-log hash table */</span>
+  <span class="n">g_hash_table_unref</span> <span class="p">(</span><span class="n">self</span><span class="o">-&gt;</span><span class="n">log</span><span class="p">);</span>
+  <span class="n">self</span><span class="o">-&gt;</span><span class="n">log</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
+
+  <span class="cm">/* Chain up to the parent class */</span>
+  <span class="n">G_OBJECT_CLASS</span> <span class="p">(</span><span class="n">tutorial_calculator_handler_parent_class</span><span class="p">)</span><span class="o">-&gt;</span>
+    <span class="n">finalize</span> <span class="p">(</span><span class="n">object</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="cm">/* TutorialCalculatorHandler's instance initializer (constructor) */</span>
+<span class="k">static</span> <span class="kt">void</span>
+<span class="nf">tutorial_calculator_handler_init</span> <span class="p">(</span><span class="n">TutorialCalculatorHandler</span> <span class="o">*</span><span class="n">self</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="cm">/* Create our calculation-log hash table */</span>
+  <span class="n">self</span><span class="o">-&gt;</span><span class="n">log</span> <span class="o">=</span> <span class="n">g_hash_table_new_full</span> <span class="p">(</span><span class="n">g_int_hash</span><span class="p">,</span>
+                                     <span class="n">g_int_equal</span><span class="p">,</span>
+                                     <span class="n">g_free</span><span class="p">,</span>
+                                     <span class="n">g_object_unref</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="cm">/* TutorialCalculatorHandler's class initializer */</span>
+<span class="k">static</span> <span class="kt">void</span>
+<span class="nf">tutorial_calculator_handler_class_init</span> <span class="p">(</span><span class="n">TutorialCalculatorHandlerClass</span> <span class="o">*</span><span class="n">klass</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">GObjectClass</span> <span class="o">*</span><span class="n">gobject_class</span> <span class="o">=</span> <span class="n">G_OBJECT_CLASS</span> <span class="p">(</span><span class="n">klass</span><span class="p">);</span>
+  <span class="n">SharedServiceHandlerClass</span> <span class="o">*</span><span class="n">shared_service_handler_class</span> <span class="o">=</span>
+    <span class="n">SHARED_SERVICE_HANDLER_CLASS</span> <span class="p">(</span><span class="n">klass</span><span class="p">);</span>
+  <span class="n">CalculatorHandlerClass</span> <span class="o">*</span><span class="n">calculator_handler_class</span> <span class="o">=</span>
+    <span class="n">CALCULATOR_HANDLER_CLASS</span> <span class="p">(</span><span class="n">klass</span><span class="p">);</span>
+
+  <span class="cm">/* Register our destructor */</span>
+  <span class="n">gobject_class</span><span class="o">-&gt;</span><span class="n">finalize</span> <span class="o">=</span> <span class="n">tutorial_calculator_handler_finalize</span><span class="p">;</span>
+
+  <span class="cm">/* Register our implementations of CalculatorHandler's methods */</span>
+  <span class="n">calculator_handler_class</span><span class="o">-&gt;</span><span class="n">ping</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_ping</span><span class="p">;</span>
+  <span class="n">calculator_handler_class</span><span class="o">-&gt;</span><span class="n">add</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_add</span><span class="p">;</span>
+  <span class="n">calculator_handler_class</span><span class="o">-&gt;</span><span class="n">calculate</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_calculate</span><span class="p">;</span>
+  <span class="n">calculator_handler_class</span><span class="o">-&gt;</span><span class="n">zip</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_zip</span><span class="p">;</span>
+
+  <span class="cm">/* Register our implementation of SharedServiceHandler's method */</span>
+  <span class="n">shared_service_handler_class</span><span class="o">-&gt;</span><span class="n">get_struct</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_get_struct</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* ---------------------------------------------------------------- */</span>
+
+<span class="cm">/* That ends the implementation of TutorialCalculatorHandler.
+   Everything below is fairly generic code that sets up a minimal
+   Thrift server for tutorial clients. */</span>
+
+
+<span class="cm">/* Our server object, declared globally so it is accessible within the
+   SIGINT signal handler */</span>
+<span class="n">ThriftServer</span> <span class="o">*</span><span class="n">server</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
+
+<span class="cm">/* A flag that indicates whether the server was interrupted with
+   SIGINT (i.e. Ctrl-C) so we can tell whether its termination was
+   abnormal */</span>
+<span class="n">gboolean</span> <span class="n">sigint_received</span> <span class="o">=</span> <span class="n">FALSE</span><span class="p">;</span>
+
+<span class="cm">/* Handle SIGINT ("Ctrl-C") signals by gracefully stopping the
+   server */</span>
+<span class="k">static</span> <span class="kt">void</span>
+<span class="nf">sigint_handler</span> <span class="p">(</span><span class="kt">int</span> <span class="n">signal_number</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span class="n">signal_number</span><span class="p">);</span>
+
+  <span class="cm">/* Take note we were called */</span>
+  <span class="n">sigint_received</span> <span class="o">=</span> <span class="n">TRUE</span><span class="p">;</span>
+
+  <span class="cm">/* Shut down the server gracefully */</span>
+  <span class="k">if</span> <span class="p">(</span><span class="n">server</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
+    <span class="n">thrift_server_stop</span> <span class="p">(</span><span class="n">server</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="kt">int</span> <span class="nf">main</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">TutorialCalculatorHandler</span> <span class="o">*</span><span class="n">handler</span><span class="p">;</span>
+  <span class="n">CalculatorProcessor</span> <span class="o">*</span><span class="n">processor</span><span class="p">;</span>
+
+  <span class="n">ThriftServerTransport</span> <span class="o">*</span><span class="n">server_transport</span><span class="p">;</span>
+  <span class="n">ThriftTransportFactory</span> <span class="o">*</span><span class="n">transport_factory</span><span class="p">;</span>
+  <span class="n">ThriftProtocolFactory</span> <span class="o">*</span><span class="n">protocol_factory</span><span class="p">;</span>
+
+  <span class="k">struct</span> <span class="n">sigaction</span> <span class="n">sigint_action</span><span class="p">;</span>
+
+  <span class="n">GError</span> <span class="o">*</span><span class="n">error</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
+  <span class="kt">int</span> <span class="n">exit_status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+
+<span class="cp">#if (!GLIB_CHECK_VERSION (2, 36, 0))
+</span>  <span class="n">g_type_init</span> <span class="p">();</span>
+<span class="cp">#endif
+</span>
+  <span class="cm">/* Create an instance of our handler, which provides the service's
+     methods' implementation */</span>
+  <span class="n">handler</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span class="n">TYPE_TUTORIAL_CALCULATOR_HANDLER</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create an instance of the service's processor, automatically
+     generated by the Thrift compiler, which parses incoming messages
+     and dispatches them to the appropriate method in the handler */</span>
+  <span class="n">processor</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span class="n">TYPE_CALCULATOR_PROCESSOR</span><span class="p">,</span>
+                  <span class="s">"handler"</span><span class="p">,</span> <span class="n">handler</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create our server socket, which binds to the specified port and
+     listens for client connections */</span>
+  <span class="n">server_transport</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span class="n">THRIFT_TYPE_SERVER_SOCKET</span><span class="p">,</span>
+                  <span class="s">"port"</span><span class="p">,</span> <span class="mi">9090</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create our transport factory, used by the server to wrap "raw"
+     incoming connections from the client (in this case with a
+     ThriftBufferedTransport to improve performance) */</span>
+  <span class="n">transport_factory</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span class="n">THRIFT_TYPE_BUFFERED_TRANSPORT_FACTORY</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create our protocol factory, which determines which wire protocol
+     the server will use (in this case, Thrift's binary protocol) */</span>
+  <span class="n">protocol_factory</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span class="n">THRIFT_TYPE_BINARY_PROTOCOL_FACTORY</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create the server itself */</span>
+  <span class="n">server</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span class="n">THRIFT_TYPE_SIMPLE_SERVER</span><span class="p">,</span>
+                  <span class="s">"processor"</span><span class="p">,</span>                <span class="n">processor</span><span class="p">,</span>
+                  <span class="s">"server_transport"</span><span class="p">,</span>         <span class="n">server_transport</span><span class="p">,</span>
+                  <span class="s">"input_transport_factory"</span><span class="p">,</span>  <span class="n">transport_factory</span><span class="p">,</span>
+                  <span class="s">"output_transport_factory"</span><span class="p">,</span> <span class="n">transport_factory</span><span class="p">,</span>
+                  <span class="s">"input_protocol_factory"</span><span class="p">,</span>   <span class="n">protocol_factory</span><span class="p">,</span>
+                  <span class="s">"output_protocol_factory"</span><span class="p">,</span>  <span class="n">protocol_factory</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Install our SIGINT handler, which handles Ctrl-C being pressed by
+     stopping the server gracefully (not strictly necessary, but a
+     nice touch) */</span>
+  <span class="n">memset</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">sigint_action</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">sigint_action</span><span class="p">));</span>
+  <span class="n">sigint_action</span><span class="p">.</span><span class="n">sa_handler</span> <span class="o">=</span> <span class="n">sigint_handler</span><span class="p">;</span>
+  <span class="n">sigint_action</span><span class="p">.</span><span class="n">sa_flags</span> <span class="o">=</span> <span class="n">SA_RESETHAND</span><span class="p">;</span>
+  <span class="n">sigaction</span> <span class="p">(</span><span class="n">SIGINT</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">sigint_action</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Start the server, which will run until its stop method is invoked
+     (from within the SIGINT handler, in this case) */</span>
+  <span class="n">puts</span> <span class="p">(</span><span class="s">"Starting the server..."</span><span class="p">);</span>
+  <span class="n">thrift_server_serve</span> <span class="p">(</span><span class="n">server</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+
+  <span class="cm">/* If the server stopped for any reason other than having been
+     interrupted by the user, report the error */</span>
+  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">sigint_received</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">g_message</span> <span class="p">(</span><span class="s">"thrift_server_serve: %s"</span><span class="p">,</span>
+               <span class="n">error</span> <span class="o">!=</span> <span class="nb">NULL</span> <span class="o">?</span> <span class="n">error</span><span class="o">-&gt;</span><span class="n">message</span> <span class="o">:</span> <span class="s">"(null)"</span><span class="p">);</span>
+    <span class="n">g_clear_error</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="n">puts</span> <span class="p">(</span><span class="s">"done."</span><span class="p">);</span>
+
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">server</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">transport_factory</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">protocol_factory</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">server_transport</span><span class="p">);</span>
+
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">processor</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">handler</span><span class="p">);</span>
+
+  <span class="k">return</span> <span class="n">exit_status</span><span class="p">;</span>
+<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/c_glib/c_glib_server.c">tutorial/c_glib/c_glib_server.c</a>
+</p>
+
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/cpp.html b/output/tutorial/cpp.html
new file mode 100644
index 0000000..eafb86e
--- /dev/null
+++ b/output/tutorial/cpp.html
@@ -0,0 +1,337 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - C++</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>C++ Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen cpp tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cp">#include &lt;iostream&gt;
+</span>
+<span class="cp">#include &lt;thrift/protocol/TBinaryProtocol.h&gt;
+#include &lt;thrift/transport/TSocket.h&gt;
+#include &lt;thrift/transport/TTransportUtils.h&gt;
+</span>
+<span class="cp">#include "../gen-cpp/Calculator.h"
+</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="o">::</span><span class="n">protocol</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="o">::</span><span class="n">transport</span><span class="p">;</span>
+
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">tutorial</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">shared</span><span class="p">;</span>
+
+<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
+  <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">TTransport</span><span class="o">&gt;</span> <span class="n">socket</span><span class="p">(</span><span class="k">new</span> <span class="n">TSocket</span><span class="p">(</span><span class="s">"localhost"</span><span class="p">,</span> <span class="mi">9090</span><span class="p">));</span>
+  <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">TTransport</span><span class="o">&gt;</span> <span class="n">transport</span><span class="p">(</span><span class="k">new</span> <span class="n">TBufferedTransport</span><span class="p">(</span><span class="n">socket</span><span class="p">));</span>
+  <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">TProtocol</span><span class="o">&gt;</span> <span class="n">protocol</span><span class="p">(</span><span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">));</span>
+  <span class="n">CalculatorClient</span> <span class="n">client</span><span class="p">(</span><span class="n">protocol</span><span class="p">);</span>
+
+  <span class="k">try</span> <span class="p">{</span>
+    <span class="n">transport</span><span class="o">-&gt;</span><span class="n">open</span><span class="p">();</span>
+
+    <span class="n">client</span><span class="p">.</span><span class="n">ping</span><span class="p">();</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"ping()"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"1 + 1 = "</span> <span class="o">&lt;&lt;</span> <span class="n">client</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+
+    <span class="n">Work</span> <span class="n">work</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">Operation</span><span class="o">::</span><span class="n">DIVIDE</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+
+    <span class="k">try</span> <span class="p">{</span>
+      <span class="n">client</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">);</span>
+      <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Whoa? We can divide by zero!"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="n">InvalidOperation</span><span class="o">&amp;</span> <span class="n">io</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"InvalidOperation: "</span> <span class="o">&lt;&lt;</span> <span class="n">io</span><span class="p">.</span><span class="n">why</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+      <span class="c1">// or using generated operator&lt;&lt;: cout &lt;&lt; io &lt;&lt; endl;</span>
+      <span class="c1">// or by using std::exception native method what(): cout &lt;&lt; io.what() &lt;&lt; endl;</span>
+    <span class="p">}</span>
+
+    <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">Operation</span><span class="o">::</span><span class="n">SUBTRACT</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
+    <span class="kt">int32_t</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">);</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"15 - 10 = "</span> <span class="o">&lt;&lt;</span> <span class="n">diff</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+
+    <span class="c1">// Note that C++ uses return by reference for complex types to avoid</span>
+    <span class="c1">// costly copy construction</span>
+    <span class="n">SharedStruct</span> <span class="n">ss</span><span class="p">;</span>
+    <span class="n">client</span><span class="p">.</span><span class="n">getStruct</span><span class="p">(</span><span class="n">ss</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Received log: "</span> <span class="o">&lt;&lt;</span> <span class="n">ss</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+
+    <span class="n">transport</span><span class="o">-&gt;</span><span class="n">close</span><span class="p">();</span>
+  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="n">TException</span><span class="o">&amp;</span> <span class="n">tx</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"ERROR: "</span> <span class="o">&lt;&lt;</span> <span class="n">tx</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/cpp/CppClient.cpp">tutorial/cpp/CppClient.cpp</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cp">#include &lt;thrift/concurrency/ThreadManager.h&gt;
+#include &lt;thrift/concurrency/ThreadFactory.h&gt;
+#include &lt;thrift/protocol/TBinaryProtocol.h&gt;
+#include &lt;thrift/server/TSimpleServer.h&gt;
+#include &lt;thrift/server/TThreadPoolServer.h&gt;
+#include &lt;thrift/server/TThreadedServer.h&gt;
+#include &lt;thrift/transport/TServerSocket.h&gt;
+#include &lt;thrift/transport/TSocket.h&gt;
+#include &lt;thrift/transport/TTransportUtils.h&gt;
+#include &lt;thrift/TToString.h&gt;
+</span>
+<span class="cp">#include &lt;iostream&gt;
+#include &lt;stdexcept&gt;
+#include &lt;sstream&gt;
+</span>
+<span class="cp">#include "../gen-cpp/Calculator.h"
+</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="o">::</span><span class="n">concurrency</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="o">::</span><span class="n">protocol</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="o">::</span><span class="n">transport</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="o">::</span><span class="n">server</span><span class="p">;</span>
+
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">tutorial</span><span class="p">;</span>
+<span class="k">using</span> <span class="k">namespace</span> <span class="n">shared</span><span class="p">;</span>
+
+<span class="k">class</span> <span class="nc">CalculatorHandler</span> <span class="o">:</span> <span class="k">public</span> <span class="n">CalculatorIf</span> <span class="p">{</span>
+<span class="nl">public:</span>
+  <span class="n">CalculatorHandler</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
+
+  <span class="kt">void</span> <span class="n">ping</span><span class="p">()</span> <span class="k">override</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"ping()"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span>
+
+  <span class="kt">int32_t</span> <span class="n">add</span><span class="p">(</span><span class="k">const</span> <span class="kt">int32_t</span> <span class="n">n1</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int32_t</span> <span class="n">n2</span><span class="p">)</span> <span class="k">override</span> <span class="p">{</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"add("</span> <span class="o">&lt;&lt;</span> <span class="n">n1</span> <span class="o">&lt;&lt;</span> <span class="s">", "</span> <span class="o">&lt;&lt;</span> <span class="n">n2</span> <span class="o">&lt;&lt;</span> <span class="s">")"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+    <span class="k">return</span> <span class="n">n1</span> <span class="o">+</span> <span class="n">n2</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="kt">int32_t</span> <span class="n">calculate</span><span class="p">(</span><span class="k">const</span> <span class="kt">int32_t</span> <span class="n">logid</span><span class="p">,</span> <span class="k">const</span> <span class="n">Work</span><span class="o">&amp;</span> <span class="n">work</span><span class="p">)</span> <span class="k">override</span> <span class="p">{</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"calculate("</span> <span class="o">&lt;&lt;</span> <span class="n">logid</span> <span class="o">&lt;&lt;</span> <span class="s">", "</span> <span class="o">&lt;&lt;</span> <span class="n">work</span> <span class="o">&lt;&lt;</span> <span class="s">")"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+    <span class="kt">int32_t</span> <span class="n">val</span><span class="p">;</span>
+
+    <span class="k">switch</span> <span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">case</span> <span class="n">Operation</span><span class="o">::</span><span class="n">ADD</span><span class="p">:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">+</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+      <span class="k">break</span><span class="p">;</span>
+    <span class="k">case</span> <span class="n">Operation</span><span class="o">::</span><span class="n">SUBTRACT</span><span class="p">:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">-</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+      <span class="k">break</span><span class="p">;</span>
+    <span class="k">case</span> <span class="n">Operation</span><span class="o">::</span><span class="n">MULTIPLY</span><span class="p">:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">*</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+      <span class="k">break</span><span class="p">;</span>
+    <span class="k">case</span> <span class="n">Operation</span><span class="o">::</span><span class="n">DIVIDE</span><span class="p">:</span>
+      <span class="k">if</span> <span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
+        <span class="n">InvalidOperation</span> <span class="n">io</span><span class="p">;</span>
+        <span class="n">io</span><span class="p">.</span><span class="n">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">;</span>
+        <span class="n">io</span><span class="p">.</span><span class="n">why</span> <span class="o">=</span> <span class="s">"Cannot divide by 0"</span><span class="p">;</span>
+        <span class="k">throw</span> <span class="n">io</span><span class="p">;</span>
+      <span class="p">}</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">/</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+      <span class="k">break</span><span class="p">;</span>
+    <span class="nl">default:</span>
+      <span class="n">InvalidOperation</span> <span class="n">io</span><span class="p">;</span>
+      <span class="n">io</span><span class="p">.</span><span class="n">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">;</span>
+      <span class="n">io</span><span class="p">.</span><span class="n">why</span> <span class="o">=</span> <span class="s">"Invalid Operation"</span><span class="p">;</span>
+      <span class="k">throw</span> <span class="n">io</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="n">SharedStruct</span> <span class="n">ss</span><span class="p">;</span>
+    <span class="n">ss</span><span class="p">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">logid</span><span class="p">;</span>
+    <span class="n">ss</span><span class="p">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">to_string</span><span class="p">(</span><span class="n">val</span><span class="p">);</span>
+
+    <span class="n">log</span><span class="p">[</span><span class="n">logid</span><span class="p">]</span> <span class="o">=</span> <span class="n">ss</span><span class="p">;</span>
+
+    <span class="k">return</span> <span class="n">val</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">getStruct</span><span class="p">(</span><span class="n">SharedStruct</span><span class="o">&amp;</span> <span class="n">ret</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int32_t</span> <span class="n">logid</span><span class="p">)</span> <span class="k">override</span> <span class="p">{</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"getStruct("</span> <span class="o">&lt;&lt;</span> <span class="n">logid</span> <span class="o">&lt;&lt;</span> <span class="s">")"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
+    <span class="n">ret</span> <span class="o">=</span> <span class="n">log</span><span class="p">[</span><span class="n">logid</span><span class="p">];</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">zip</span><span class="p">()</span> <span class="k">override</span> <span class="p">{</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"zip()"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span> <span class="p">}</span>
+
+<span class="nl">protected:</span>
+  <span class="n">map</span><span class="o">&lt;</span><span class="kt">int32_t</span><span class="p">,</span> <span class="n">SharedStruct</span><span class="o">&gt;</span> <span class="n">log</span><span class="p">;</span>
+<span class="p">};</span>
+
+<span class="cm">/*
+  CalculatorIfFactory is code generated.
+  CalculatorCloneFactory is useful for getting access to the server side of the
+  transport.  It is also useful for making per-connection state.  Without this
+  CloneFactory, all connections will end up sharing the same handler instance.
+*/</span>
+<span class="k">class</span> <span class="nc">CalculatorCloneFactory</span> <span class="o">:</span> <span class="k">virtual</span> <span class="k">public</span> <span class="n">CalculatorIfFactory</span> <span class="p">{</span>
+ <span class="nl">public:</span>
+  <span class="o">~</span><span class="n">CalculatorCloneFactory</span><span class="p">()</span> <span class="k">override</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
+  <span class="n">CalculatorIf</span><span class="o">*</span> <span class="n">getHandler</span><span class="p">(</span><span class="k">const</span> <span class="o">::</span><span class="n">apache</span><span class="o">::</span><span class="n">thrift</span><span class="o">::</span><span class="n">TConnectionInfo</span><span class="o">&amp;</span> <span class="n">connInfo</span><span class="p">)</span> <span class="k">override</span>
+  <span class="p">{</span>
+    <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">TSocket</span><span class="o">&gt;</span> <span class="n">sock</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">dynamic_pointer_cast</span><span class="o">&lt;</span><span class="n">TSocket</span><span class="o">&gt;</span><span class="p">(</span><span class="n">connInfo</span><span class="p">.</span><span class="n">transport</span><span class="p">);</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Incoming connection</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\t</span><span class="s">SocketInfo: "</span>  <span class="o">&lt;&lt;</span> <span class="n">sock</span><span class="o">-&gt;</span><span class="n">getSocketInfo</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\t</span><span class="s">PeerHost: "</span>    <span class="o">&lt;&lt;</span> <span class="n">sock</span><span class="o">-&gt;</span><span class="n">getPeerHost</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\t</span><span class="s">PeerAddress: "</span> <span class="o">&lt;&lt;</span> <span class="n">sock</span><span class="o">-&gt;</span><span class="n">getPeerAddress</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\t</span><span class="s">PeerPort: "</span>    <span class="o">&lt;&lt;</span> <span class="n">sock</span><span class="o">-&gt;</span><span class="n">getPeerPort</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="k">return</span> <span class="k">new</span> <span class="n">CalculatorHandler</span><span class="p">;</span>
+  <span class="p">}</span>
+  <span class="kt">void</span> <span class="n">releaseHandler</span><span class="p">(</span> <span class="o">::</span><span class="n">shared</span><span class="o">::</span><span class="n">SharedServiceIf</span><span class="o">*</span> <span class="n">handler</span><span class="p">)</span> <span class="k">override</span> <span class="p">{</span>
+    <span class="k">delete</span> <span class="n">handler</span><span class="p">;</span>
+  <span class="p">}</span>
+<span class="p">};</span>
+
+<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
+  <span class="n">TThreadedServer</span> <span class="n">server</span><span class="p">(</span>
+    <span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">CalculatorProcessorFactory</span><span class="o">&gt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">CalculatorCloneFactory</span><span class="o">&gt;</span><span class="p">()),</span>
+    <span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">TServerSocket</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">9090</span><span class="p">),</span> <span class="c1">//port</span>
+    <span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">TBufferedTransportFactory</span><span class="o">&gt;</span><span class="p">(),</span>
+    <span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">TBinaryProtocolFactory</span><span class="o">&gt;</span><span class="p">());</span>
+
+  <span class="cm">/*
+  // if you don't need per-connection state, do the following instead
+  TThreadedServer server(
+    std::make_shared&lt;CalculatorProcessor&gt;(std::make_shared&lt;CalculatorHandler&gt;()),
+    std::make_shared&lt;TServerSocket&gt;(9090), //port
+    std::make_shared&lt;TBufferedTransportFactory&gt;(),
+    std::make_shared&lt;TBinaryProtocolFactory&gt;());
+  */</span>
+
+  <span class="o">/**</span>
+   <span class="o">*</span> <span class="n">Here</span> <span class="n">are</span> <span class="n">some</span> <span class="n">alternate</span> <span class="n">server</span> <span class="n">types</span><span class="p">...</span>
+
+  <span class="c1">// This server only allows one connection at a time, but spawns no threads</span>
+  <span class="n">TSimpleServer</span> <span class="n">server</span><span class="p">(</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/cpp/CppServer.cpp">tutorial/cpp/CppServer.cpp</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+<h3 id="example-threadpool-server">Example ThreadPool Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code>    <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">TSocket</span><span class="o">&gt;</span> <span class="n">sock</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">dynamic_pointer_cast</span><span class="o">&lt;</span><span class="n">TSocket</span><span class="o">&gt;</span><span class="p">(</span><span class="n">connInfo</span><span class="p">.</span><span class="n">transport</span><span class="p">);</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Incoming connection</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\t</span><span class="s">SocketInfo: "</span>  <span class="o">&lt;&lt;</span> <span class="n">sock</span><span class="o">-&gt;</span><span class="n">getSocketInfo</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\t</span><span class="s">PeerHost: "</span>    <span class="o">&lt;&lt;</span> <span class="n">sock</span><span class="o">-&gt;</span><span class="n">getPeerHost</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\t</span><span class="s">PeerAddress: "</span> <span class="o">&lt;&lt;</span> <span class="n">sock</span><span class="o">-&gt;</span><span class="n">getPeerAddress</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\t</span><span class="s">PeerPort: "</span>    <span class="o">&lt;&lt;</span> <span class="n">sock</span><span class="o">-&gt;</span><span class="n">getPeerPort</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
+    <span class="k">return</span> <span class="k">new</span> <span class="n">CalculatorHandler</span><span class="p">;</span>
+  <span class="err">}</span>
+  <span class="kt">void</span> <span class="n">releaseHandler</span><span class="p">(</span> <span class="o">::</span><span class="n">shared</span><span class="o">::</span><span class="n">SharedServiceIf</span><span class="o">*</span> <span class="n">handler</span><span class="p">)</span> <span class="k">override</span> <span class="p">{</span>
+    <span class="k">delete</span> <span class="n">handler</span><span class="p">;</span>
+  <span class="p">}</span>
+<span class="err">}</span><span class="p">;</span>
+
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/cpp/CppServer.cpp">tutorial/cpp/CppServer.cpp</a>
+</p>
+
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/csharp.html b/output/tutorial/csharp.html
new file mode 100644
index 0000000..5a2cd8a
--- /dev/null
+++ b/output/tutorial/csharp.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - CSharp</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>CSharp Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen csharp tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<h3 id="server">Server</h3>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/d.html b/output/tutorial/d.html
new file mode 100644
index 0000000..5e1eeeb
--- /dev/null
+++ b/output/tutorial/d.html
@@ -0,0 +1,262 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - D</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>D Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen d tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">module</span> <span class="n">client</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="n">std</span><span class="p">.</span><span class="n">stdio</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">base</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">codegen</span><span class="p">.</span><span class="n">client</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">protocol</span><span class="p">.</span><span class="n">binary</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">transport</span><span class="p">.</span><span class="n">buffered</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">transport</span><span class="p">.</span><span class="n">socket</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Calculator</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">tutorial_types</span><span class="p">;</span>
+
+<span class="kt">void</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
+  <span class="k">auto</span> <span class="n">socket</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TSocket</span><span class="p">(</span><span class="s">"localhost"</span><span class="p">,</span> <span class="mi">9090</span><span class="p">);</span>
+  <span class="k">auto</span> <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBufferedTransport</span><span class="p">(</span><span class="n">socket</span><span class="p">);</span>
+  <span class="k">auto</span> <span class="n">protocol</span> <span class="o">=</span> <span class="n">tBinaryProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">);</span>
+  <span class="k">auto</span> <span class="n">client</span> <span class="o">=</span> <span class="n">tClient</span><span class="o">!</span><span class="n">Calculator</span><span class="p">(</span><span class="n">protocol</span><span class="p">);</span>
+
+  <span class="n">transport</span><span class="p">.</span><span class="n">open</span><span class="p">();</span>
+
+  <span class="n">client</span><span class="p">.</span><span class="n">ping</span><span class="p">();</span>
+  <span class="n">writeln</span><span class="p">(</span><span class="s">"ping()"</span><span class="p">);</span>
+
+  <span class="kt">int</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
+  <span class="n">writefln</span><span class="p">(</span><span class="s">"1 + 1 = %s"</span><span class="p">,</span> <span class="n">sum</span><span class="p">);</span>
+
+  <span class="k">auto</span> <span class="n">work</span> <span class="o">=</span> <span class="n">Work</span><span class="p">();</span>
+  <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span><span class="p">;</span>
+  <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
+  <span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+  <span class="k">try</span> <span class="p">{</span>
+    <span class="kt">int</span> <span class="n">quotient</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">);</span>
+    <span class="n">writeln</span><span class="p">(</span><span class="s">"Whoa we can divide by 0"</span><span class="p">);</span>
+  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="n">InvalidOperation</span> <span class="n">io</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">writeln</span><span class="p">(</span><span class="s">"Invalid operation: "</span> <span class="o">~</span> <span class="n">io</span><span class="p">.</span><span class="n">why</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span><span class="p">;</span>
+  <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span>
+  <span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
+  <span class="kt">int</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">);</span>
+  <span class="n">writefln</span><span class="p">(</span><span class="s">"15 - 10 = %s"</span><span class="p">,</span> <span class="n">diff</span><span class="p">);</span>
+
+  <span class="k">auto</span> <span class="n">log</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">getStruct</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
+  <span class="n">writefln</span><span class="p">(</span><span class="s">"Check log: %s"</span><span class="p">,</span> <span class="n">log</span><span class="p">.</span><span class="n">value</span><span class="p">);</span>
+<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/d/client.d">tutorial/d/client.d</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">module</span> <span class="n">server</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="n">std</span><span class="p">.</span><span class="n">conv</span> <span class="o">:</span> <span class="n">to</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">std</span><span class="p">.</span><span class="n">stdio</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">codegen</span><span class="p">.</span><span class="n">processor</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">protocol</span><span class="p">.</span><span class="n">binary</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">server</span><span class="p">.</span><span class="n">simple</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">server</span><span class="p">.</span><span class="n">transport</span><span class="p">.</span><span class="n">socket</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">thrift</span><span class="p">.</span><span class="n">transport</span><span class="p">.</span><span class="n">buffered</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="n">share</span><span class="p">.</span><span class="n">SharedService</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">share</span><span class="p">.</span><span class="n">shared_types</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Calculator</span><span class="p">;</span>
+<span class="n">import</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">tutorial_types</span><span class="p">;</span>
+
+<span class="cm">/**
+ * The actual implementation of the Calculator interface that is called by
+ * the server to answer the requests.
+ */</span>
+<span class="k">class</span> <span class="nc">CalculatorHandler</span> <span class="o">:</span> <span class="n">Calculator</span> <span class="p">{</span>
+  <span class="kt">void</span> <span class="n">ping</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">writeln</span><span class="p">(</span><span class="s">"ping()"</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="kt">int</span> <span class="n">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">n1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n2</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">writefln</span><span class="p">(</span><span class="s">"add(%s,%s)"</span><span class="p">,</span> <span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">);</span>
+    <span class="k">return</span> <span class="n">n1</span> <span class="o">+</span> <span class="n">n2</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="kt">int</span> <span class="n">calculate</span><span class="p">(</span><span class="kt">int</span> <span class="n">logid</span><span class="p">,</span> <span class="n">ref</span> <span class="k">const</span><span class="p">(</span><span class="n">Work</span><span class="p">)</span> <span class="n">work</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">writefln</span><span class="p">(</span><span class="s">"calculate(%s, {%s, %s, %s})"</span><span class="p">,</span> <span class="n">logid</span><span class="p">,</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">,</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span><span class="p">,</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">);</span>
+    <span class="kt">int</span> <span class="n">val</span><span class="p">;</span>
+
+    <span class="k">switch</span> <span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">ADD</span><span class="p">:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">+</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+      <span class="k">break</span><span class="p">;</span>
+    <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span><span class="p">:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">-</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+      <span class="k">break</span><span class="p">;</span>
+    <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">MULTIPLY</span><span class="p">:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">*</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+      <span class="k">break</span><span class="p">;</span>
+    <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span><span class="p">:</span>
+      <span class="k">if</span> <span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">auto</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InvalidOperation</span><span class="p">();</span>
+        <span class="n">io</span><span class="p">.</span><span class="n">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">;</span>
+        <span class="n">io</span><span class="p">.</span><span class="n">why</span> <span class="o">=</span> <span class="s">"Cannot divide by 0"</span><span class="p">;</span>
+        <span class="k">throw</span> <span class="n">io</span><span class="p">;</span>
+      <span class="p">}</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">/</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+      <span class="k">break</span><span class="p">;</span>
+    <span class="nl">default:</span>
+      <span class="k">auto</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InvalidOperation</span><span class="p">();</span>
+      <span class="n">io</span><span class="p">.</span><span class="n">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">;</span>
+      <span class="n">io</span><span class="p">.</span><span class="n">why</span> <span class="o">=</span> <span class="s">"Invalid Operation"</span><span class="p">;</span>
+      <span class="k">throw</span> <span class="n">io</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="k">auto</span> <span class="n">ss</span> <span class="o">=</span> <span class="n">SharedStruct</span><span class="p">();</span>
+    <span class="n">ss</span><span class="p">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">logid</span><span class="p">;</span>
+    <span class="n">ss</span><span class="p">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">to</span><span class="o">!</span><span class="n">string</span><span class="p">(</span><span class="n">val</span><span class="p">);</span>
+    <span class="n">log</span><span class="p">[</span><span class="n">logid</span><span class="p">]</span> <span class="o">=</span> <span class="n">ss</span><span class="p">;</span>
+
+    <span class="k">return</span> <span class="n">val</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="n">SharedStruct</span> <span class="n">getStruct</span><span class="p">(</span><span class="kt">int</span> <span class="n">logid</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">writefln</span><span class="p">(</span><span class="s">"getStruct(%s)"</span><span class="p">,</span> <span class="n">logid</span><span class="p">);</span>
+    <span class="k">return</span> <span class="n">log</span><span class="p">[</span><span class="n">logid</span><span class="p">];</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">zip</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">writeln</span><span class="p">(</span><span class="s">"zip()"</span><span class="p">);</span>
+  <span class="p">}</span>
+
+<span class="nl">protected:</span>
+  <span class="n">SharedStruct</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span> <span class="n">log</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="kt">void</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
+  <span class="k">auto</span> <span class="n">protocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocolFactory</span><span class="o">!</span><span class="p">();</span>
+  <span class="k">auto</span> <span class="n">processor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TServiceProcessor</span><span class="o">!</span><span class="n">Calculator</span><span class="p">(</span><span class="k">new</span> <span class="n">CalculatorHandler</span><span class="p">);</span>
+  <span class="k">auto</span> <span class="n">serverTransport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TServerSocket</span><span class="p">(</span><span class="mi">9090</span><span class="p">);</span>
+  <span class="k">auto</span> <span class="n">transportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBufferedTransportFactory</span><span class="p">;</span>
+
+  <span class="k">auto</span> <span class="n">server</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TSimpleServer</span><span class="p">(</span>
+    <span class="n">processor</span><span class="p">,</span> <span class="n">serverTransport</span><span class="p">,</span> <span class="n">transportFactory</span><span class="p">,</span> <span class="n">protocolFactory</span><span class="p">);</span>
+
+  <span class="n">writeln</span><span class="p">(</span><span class="s">"Starting the server on port 9090..."</span><span class="p">);</span>
+  <span class="n">server</span><span class="p">.</span><span class="n">serve</span><span class="p">();</span>
+  <span class="n">writeln</span><span class="p">(</span><span class="s">"done."</span><span class="p">);</span>
+<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/d/server.d">tutorial/d/server.d</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/dart.html b/output/tutorial/dart.html
new file mode 100644
index 0000000..f66e43f
--- /dev/null
+++ b/output/tutorial/dart.html
@@ -0,0 +1,557 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Dart</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Dart Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen dart tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<p>TBD</p>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="err">'</span><span class="n">dart</span><span class="o">:</span><span class="n">html</span><span class="err">'</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">thrift</span><span class="o">/</span><span class="n">thrift</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">thrift</span><span class="o">/</span><span class="n">thrift_browser</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">shared</span><span class="o">/</span><span class="n">shared</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">tutorial</span><span class="o">/</span><span class="n">tutorial</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+
+<span class="c1">/// Adapted from the AS3 tutorial</span>
+<span class="kt">void</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
+  <span class="k">new</span> <span class="n">CalculatorUI</span><span class="p">(</span><span class="n">querySelector</span><span class="p">(</span><span class="err">'#</span><span class="n">output</span><span class="err">'</span><span class="p">)).</span><span class="n">start</span><span class="p">();</span>
+<span class="p">}</span>
+
+<span class="k">class</span> <span class="nc">CalculatorUI</span> <span class="p">{</span>
+  <span class="k">final</span> <span class="n">DivElement</span> <span class="n">output</span><span class="p">;</span>
+
+  <span class="n">CalculatorUI</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">output</span><span class="p">);</span>
+
+  <span class="n">TTransport</span> <span class="n">_transport</span><span class="p">;</span>
+  <span class="n">Calculator</span> <span class="n">_calculatorClient</span><span class="p">;</span>
+
+  <span class="kt">void</span> <span class="n">start</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">_buildInterface</span><span class="p">();</span>
+    <span class="n">_initConnection</span><span class="p">();</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_validate</span><span class="p">()</span> <span class="p">{</span>
+    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">_transport</span><span class="p">.</span><span class="n">isOpen</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">window</span><span class="p">.</span><span class="n">alert</span><span class="p">(</span><span class="s">"The transport is not open!"</span><span class="p">);</span>
+    <span class="p">}</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_initConnection</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">_transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TAsyncClientSocketTransport</span><span class="p">(</span>
+        <span class="k">new</span> <span class="n">TWebSocket</span><span class="p">(</span><span class="n">Uri</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="err">'</span><span class="n">ws</span><span class="o">:</span><span class="c1">//127.0.0.1:9090/ws')),</span>
+        <span class="k">new</span> <span class="n">TMessageReader</span><span class="p">(</span><span class="k">new</span> <span class="n">TBinaryProtocolFactory</span><span class="p">()));</span>
+    <span class="n">TProtocol</span> <span class="n">protocol</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">(</span><span class="n">_transport</span><span class="p">);</span>
+    <span class="n">_transport</span><span class="p">.</span><span class="n">open</span><span class="p">();</span>
+
+    <span class="n">_calculatorClient</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CalculatorClient</span><span class="p">(</span><span class="n">protocol</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_buildInterface</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">children</span><span class="p">.</span><span class="n">forEach</span><span class="p">((</span><span class="n">e</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">e</span><span class="p">.</span><span class="n">remove</span><span class="p">();</span>
+    <span class="p">});</span>
+
+    <span class="n">_buildPingComponent</span><span class="p">();</span>
+
+    <span class="n">_buildAddComponent</span><span class="p">();</span>
+
+    <span class="n">_buildCalculatorComponent</span><span class="p">();</span>
+
+    <span class="n">_buildGetStructComponent</span><span class="p">();</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_buildPingComponent</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="k">new</span> <span class="n">HeadingElement</span><span class="p">.</span><span class="n">h3</span><span class="p">()..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"Ping"</span><span class="p">);</span>
+    <span class="n">ButtonElement</span> <span class="n">pingButton</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ButtonElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"PING"</span>
+      <span class="p">..</span><span class="n">onClick</span><span class="p">.</span><span class="n">listen</span><span class="p">(</span><span class="n">_onPingClick</span><span class="p">);</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">pingButton</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_onPingClick</span><span class="p">(</span><span class="n">MouseEvent</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">_validate</span><span class="p">();</span>
+
+    <span class="n">_calculatorClient</span><span class="p">.</span><span class="n">ping</span><span class="p">();</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_buildAddComponent</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="k">new</span> <span class="n">HeadingElement</span><span class="p">.</span><span class="n">h3</span><span class="p">()..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"Add"</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">num1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InputElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"add1"</span>
+      <span class="p">..</span><span class="n">type</span> <span class="o">=</span> <span class="s">"number"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"50px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">num1</span><span class="p">);</span>
+    <span class="n">SpanElement</span> <span class="n">op</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SpanElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"+"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">op</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">num2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InputElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"add2"</span>
+      <span class="p">..</span><span class="n">type</span> <span class="o">=</span> <span class="s">"number"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"50px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">num2</span><span class="p">);</span>
+    <span class="n">ButtonElement</span> <span class="n">addButton</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ButtonElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"="</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span>
+      <span class="p">..</span><span class="n">onClick</span><span class="p">.</span><span class="n">listen</span><span class="p">(</span><span class="n">_onAddClick</span><span class="p">);</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">addButton</span><span class="p">);</span>
+    <span class="n">SpanElement</span> <span class="n">result</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SpanElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"addResult"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_onAddClick</span><span class="p">(</span><span class="n">MouseEvent</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">_validate</span><span class="p">();</span>
+
+    <span class="n">InputElement</span> <span class="n">num1</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#add1"</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">num2</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#add2"</span><span class="p">);</span>
+    <span class="n">SpanElement</span> <span class="n">result</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#addResult"</span><span class="p">);</span>
+
+    <span class="n">_calculatorClient</span>
+        <span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="kt">int</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">num1</span><span class="p">.</span><span class="n">value</span><span class="p">),</span> <span class="kt">int</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">num2</span><span class="p">.</span><span class="n">value</span><span class="p">))</span>
+        <span class="p">.</span><span class="n">then</span><span class="p">((</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">result</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="s">"$n"</span><span class="p">;</span>
+    <span class="p">});</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_buildCalculatorComponent</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="k">new</span> <span class="n">HeadingElement</span><span class="p">.</span><span class="n">h3</span><span class="p">()..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"Calculator"</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">num1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InputElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"calc1"</span>
+      <span class="p">..</span><span class="n">type</span> <span class="o">=</span> <span class="s">"number"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"50px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">num1</span><span class="p">);</span>
+    <span class="n">SelectElement</span> <span class="n">op</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SelectElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"calcOp"</span>
+      <span class="p">..</span><span class="n">multiple</span> <span class="o">=</span> <span class="nb">false</span>
+      <span class="p">..</span><span class="n">selectedIndex</span> <span class="o">=</span> <span class="mi">0</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"16px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"50px"</span><span class="p">;</span>
+    <span class="n">OptionElement</span> <span class="n">addOp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OptionElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"+"</span>
+      <span class="p">..</span><span class="n">value</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">ADD</span><span class="p">.</span><span class="n">toString</span><span class="p">();</span>
+    <span class="n">op</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">addOp</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
+    <span class="n">OptionElement</span> <span class="n">subtractOp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OptionElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"-"</span>
+      <span class="p">..</span><span class="n">value</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span><span class="p">.</span><span class="n">toString</span><span class="p">();</span>
+    <span class="n">op</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">subtractOp</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
+    <span class="n">OptionElement</span> <span class="n">multiplyOp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OptionElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"*"</span>
+      <span class="p">..</span><span class="n">value</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">MULTIPLY</span><span class="p">.</span><span class="n">toString</span><span class="p">();</span>
+    <span class="n">op</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">multiplyOp</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
+    <span class="n">OptionElement</span> <span class="n">divideOp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OptionElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"/"</span>
+      <span class="p">..</span><span class="n">value</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span><span class="p">.</span><span class="n">toString</span><span class="p">();</span>
+    <span class="n">op</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">divideOp</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">op</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">num2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InputElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"calc2"</span>
+      <span class="p">..</span><span class="n">type</span> <span class="o">=</span> <span class="s">"number"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"50px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">num2</span><span class="p">);</span>
+    <span class="n">ButtonElement</span> <span class="n">calcButton</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ButtonElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"="</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span>
+      <span class="p">..</span><span class="n">onClick</span><span class="p">.</span><span class="n">listen</span><span class="p">(</span><span class="n">_onCalcClick</span><span class="p">);</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">calcButton</span><span class="p">);</span>
+    <span class="n">SpanElement</span> <span class="n">result</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SpanElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"calcResult"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">);</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="k">new</span> <span class="n">BRElement</span><span class="p">());</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="k">new</span> <span class="n">BRElement</span><span class="p">());</span>
+    <span class="n">LabelElement</span> <span class="n">logIdLabel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LabelElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"Log ID:"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">logIdLabel</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">logId</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InputElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"logId"</span>
+      <span class="p">..</span><span class="n">type</span> <span class="o">=</span> <span class="s">"number"</span>
+      <span class="p">..</span><span class="n">value</span> <span class="o">=</span> <span class="s">"1"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"50px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">logId</span><span class="p">);</span>
+    <span class="n">LabelElement</span> <span class="n">commentLabel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LabelElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"Comment:"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">commentLabel</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">comment</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InputElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"comment"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"100px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">comment</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_onCalcClick</span><span class="p">(</span><span class="n">MouseEvent</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">_validate</span><span class="p">();</span>
+
+    <span class="n">InputElement</span> <span class="n">num1</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#calc1"</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">num2</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#calc2"</span><span class="p">);</span>
+    <span class="n">SelectElement</span> <span class="n">op</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#calcOp"</span><span class="p">);</span>
+    <span class="n">SpanElement</span> <span class="n">result</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#calcResult"</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">logId</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#logId"</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">comment</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#comment"</span><span class="p">);</span>
+
+    <span class="kt">int</span> <span class="n">logIdValue</span> <span class="o">=</span> <span class="kt">int</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">logId</span><span class="p">.</span><span class="n">value</span><span class="p">);</span>
+    <span class="n">logId</span><span class="p">.</span><span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="n">logIdValue</span> <span class="o">+</span> <span class="mi">1</span><span class="p">).</span><span class="n">toString</span><span class="p">();</span>
+
+    <span class="n">Work</span> <span class="n">work</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Work</span><span class="p">();</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">=</span> <span class="kt">int</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">num1</span><span class="p">.</span><span class="n">value</span><span class="p">);</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">=</span> <span class="kt">int</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">num2</span><span class="p">.</span><span class="n">value</span><span class="p">);</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">=</span> <span class="kt">int</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">options</span><span class="p">[</span><span class="n">op</span><span class="p">.</span><span class="n">selectedIndex</span><span class="p">].</span><span class="n">value</span><span class="p">);</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">comment</span> <span class="o">=</span> <span class="n">comment</span><span class="p">.</span><span class="n">value</span><span class="p">;</span>
+
+    <span class="n">_calculatorClient</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="n">logIdValue</span><span class="p">,</span> <span class="n">work</span><span class="p">).</span><span class="n">then</span><span class="p">((</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">result</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="s">"$n"</span><span class="p">;</span>
+    <span class="p">});</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_buildGetStructComponent</span><span class="p">()</span> <span class="p">{</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="k">new</span> <span class="n">HeadingElement</span><span class="p">.</span><span class="n">h3</span><span class="p">()..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"Get Struct"</span><span class="p">);</span>
+    <span class="n">LabelElement</span> <span class="n">logIdLabel</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LabelElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"Struct Key:"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">logIdLabel</span><span class="p">);</span>
+    <span class="n">InputElement</span> <span class="n">logId</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InputElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"structKey"</span>
+      <span class="p">..</span><span class="n">type</span> <span class="o">=</span> <span class="s">"number"</span>
+      <span class="p">..</span><span class="n">value</span> <span class="o">=</span> <span class="s">"1"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"50px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">logId</span><span class="p">);</span>
+    <span class="n">ButtonElement</span> <span class="n">getStructButton</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ButtonElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">text</span> <span class="o">=</span> <span class="s">"GET"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span>
+      <span class="p">..</span><span class="n">onClick</span><span class="p">.</span><span class="n">listen</span><span class="p">(</span><span class="n">_onGetStructClick</span><span class="p">);</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">getStructButton</span><span class="p">);</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="k">new</span> <span class="n">BRElement</span><span class="p">());</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="k">new</span> <span class="n">BRElement</span><span class="p">());</span>
+    <span class="n">TextAreaElement</span> <span class="n">result</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TextAreaElement</span><span class="p">()</span>
+      <span class="p">..</span><span class="n">id</span> <span class="o">=</span> <span class="s">"getStructResult"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">fontSize</span> <span class="o">=</span> <span class="s">"14px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">width</span> <span class="o">=</span> <span class="s">"300px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">height</span> <span class="o">=</span> <span class="s">"50px"</span>
+      <span class="p">..</span><span class="n">style</span><span class="p">.</span><span class="n">marginLeft</span> <span class="o">=</span> <span class="s">"10px"</span><span class="p">;</span>
+    <span class="n">output</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="kt">void</span> <span class="n">_onGetStructClick</span><span class="p">(</span><span class="n">MouseEvent</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">_validate</span><span class="p">();</span>
+
+    <span class="n">InputElement</span> <span class="n">structKey</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#structKey"</span><span class="p">);</span>
+    <span class="n">TextAreaElement</span> <span class="n">result</span> <span class="o">=</span> <span class="n">querySelector</span><span class="p">(</span><span class="s">"#getStructResult"</span><span class="p">);</span>
+
+    <span class="n">_calculatorClient</span>
+        <span class="p">.</span><span class="n">getStruct</span><span class="p">(</span><span class="kt">int</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">structKey</span><span class="p">.</span><span class="n">value</span><span class="p">))</span>
+        <span class="p">.</span><span class="n">then</span><span class="p">((</span><span class="n">SharedStruct</span> <span class="n">s</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">result</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="s">"${s.toString()}"</span><span class="p">;</span>
+    <span class="p">});</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/dart/client/web/client.dart">tutorial/dart/client/web/client.dart</a>
+</p>
+
+<h3 id="client-web-page">Client web page</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
+<span class="nt">&lt;html&gt;</span>
+<span class="nt">&lt;head&gt;</span>
+    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;meta</span> <span class="na">http-equiv=</span><span class="s">"X-UA-Compatible"</span> <span class="na">content=</span><span class="s">"IE=edge"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">"viewport"</span> <span class="na">content=</span><span class="s">"width=device-width, initial-scale=1.0"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;title&gt;</span>Thrift Tutorial<span class="nt">&lt;/title&gt;</span>
+    <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"styles.css"</span><span class="nt">&gt;</span>
+  <span class="nt">&lt;script </span><span class="na">async</span> <span class="na">src=</span><span class="s">"client.dart.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
+<span class="nt">&lt;/head&gt;</span>
+
+<span class="nt">&lt;body&gt;</span>
+
+  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"output"</span><span class="nt">&gt;&lt;/div&gt;</span>
+
+<span class="nt">&lt;/body&gt;</span>
+<span class="nt">&lt;/html&gt;</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/dart/client/web/index.html">tutorial/dart/client/web/index.html</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="err">'</span><span class="n">dart</span><span class="o">:</span><span class="n">async</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">dart</span><span class="o">:</span><span class="n">io</span><span class="err">'</span><span class="p">;</span>
+
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">args</span><span class="o">/</span><span class="n">args</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">logging</span><span class="o">/</span><span class="n">logging</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">thrift</span><span class="o">/</span><span class="n">thrift</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">thrift</span><span class="o">/</span><span class="n">thrift_console</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">tutorial</span><span class="o">/</span><span class="n">tutorial</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+<span class="n">import</span> <span class="err">'</span><span class="n">package</span><span class="o">:</span><span class="n">shared</span><span class="o">/</span><span class="n">shared</span><span class="p">.</span><span class="n">dart</span><span class="err">'</span><span class="p">;</span>
+
+<span class="n">TProtocol</span> <span class="n">_protocol</span><span class="p">;</span>
+<span class="n">TProcessor</span> <span class="n">_processor</span><span class="p">;</span>
+<span class="n">WebSocket</span> <span class="n">_webSocket</span><span class="p">;</span>
+
+<span class="n">main</span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
+  <span class="n">Logger</span><span class="p">.</span><span class="n">root</span><span class="p">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">Level</span><span class="p">.</span><span class="n">ALL</span><span class="p">;</span>
+  <span class="n">Logger</span><span class="p">.</span><span class="n">root</span><span class="p">.</span><span class="n">onRecord</span><span class="p">.</span><span class="n">listen</span><span class="p">((</span><span class="n">LogRecord</span> <span class="n">rec</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">print</span><span class="p">(</span><span class="err">'$</span><span class="p">{</span><span class="n">rec</span><span class="p">.</span><span class="n">level</span><span class="p">.</span><span class="n">name</span><span class="p">}</span><span class="o">:</span> <span class="err">$</span><span class="p">{</span><span class="n">rec</span><span class="p">.</span><span class="n">time</span><span class="p">}</span><span class="o">:</span> <span class="err">$</span><span class="p">{</span><span class="n">rec</span><span class="p">.</span><span class="n">message</span><span class="p">}</span><span class="err">'</span><span class="p">);</span>
+  <span class="p">});</span>
+
+  <span class="n">var</span> <span class="n">parser</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArgParser</span><span class="p">();</span>
+  <span class="n">parser</span><span class="p">.</span><span class="n">addOption</span><span class="p">(</span><span class="err">'</span><span class="n">port</span><span class="err">'</span><span class="p">,</span> <span class="n">defaultsTo</span><span class="o">:</span> <span class="err">'</span><span class="mi">9090</span><span class="err">'</span><span class="p">,</span> <span class="n">help</span><span class="o">:</span> <span class="err">'</span><span class="n">The</span> <span class="n">port</span> <span class="n">to</span> <span class="n">listen</span> <span class="n">on</span><span class="err">'</span><span class="p">);</span>
+  <span class="n">parser</span><span class="p">.</span><span class="n">addOption</span><span class="p">(</span><span class="err">'</span><span class="n">type</span><span class="err">'</span><span class="p">,</span>
+      <span class="nl">defaultsTo:</span> <span class="err">'</span><span class="n">ws</span><span class="err">'</span><span class="p">,</span>
+      <span class="nl">allowed:</span> <span class="p">[</span><span class="err">'</span><span class="n">ws</span><span class="err">'</span><span class="p">,</span> <span class="err">'</span><span class="n">tcp</span><span class="err">'</span><span class="p">],</span>
+      <span class="nl">help:</span> <span class="err">'</span><span class="n">The</span> <span class="n">type</span> <span class="n">of</span> <span class="n">socket</span><span class="err">'</span><span class="p">,</span>
+      <span class="nl">allowedHelp:</span> <span class="p">{</span><span class="err">'</span><span class="n">ws</span><span class="err">'</span><span class="o">:</span> <span class="err">'</span><span class="n">WebSocket</span><span class="err">'</span><span class="p">,</span> <span class="err">'</span><span class="n">tcp</span><span class="err">'</span><span class="o">:</span> <span class="err">'</span><span class="n">TCP</span> <span class="n">Socket</span><span class="err">'</span><span class="p">});</span>
+
+  <span class="n">ArgResults</span> <span class="n">results</span><span class="p">;</span>
+  <span class="k">try</span> <span class="p">{</span>
+    <span class="n">results</span> <span class="o">=</span> <span class="n">parser</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
+  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">results</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="k">if</span> <span class="p">(</span><span class="n">results</span> <span class="o">==</span> <span class="n">null</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">print</span><span class="p">(</span><span class="n">parser</span><span class="p">.</span><span class="n">usage</span><span class="p">);</span>
+    <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="kt">int</span> <span class="n">port</span> <span class="o">=</span> <span class="kt">int</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="err">'</span><span class="n">port</span><span class="err">'</span><span class="p">]);</span>
+  <span class="n">String</span> <span class="n">socketType</span> <span class="o">=</span> <span class="n">results</span><span class="p">[</span><span class="err">'</span><span class="n">type</span><span class="err">'</span><span class="p">];</span>
+
+  <span class="k">if</span> <span class="p">(</span><span class="n">socketType</span> <span class="o">==</span> <span class="err">'</span><span class="n">tcp</span><span class="err">'</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">_runTcpServer</span><span class="p">(</span><span class="n">port</span><span class="p">);</span>
+  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">socketType</span> <span class="o">==</span> <span class="err">'</span><span class="n">ws</span><span class="err">'</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">_runWebSocketServer</span><span class="p">(</span><span class="n">port</span><span class="p">);</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+
+<span class="n">Future</span> <span class="nf">_runWebSocketServer</span><span class="p">(</span><span class="kt">int</span> <span class="n">port</span><span class="p">)</span> <span class="n">async</span> <span class="p">{</span>
+  <span class="n">var</span> <span class="n">httpServer</span> <span class="o">=</span> <span class="n">await</span> <span class="n">HttpServer</span><span class="p">.</span><span class="n">bind</span><span class="p">(</span><span class="err">'</span><span class="mf">127.0.0.1</span><span class="err">'</span><span class="p">,</span> <span class="n">port</span><span class="p">);</span>
+  <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">listening</span> <span class="k">for</span> <span class="n">WebSocket</span> <span class="n">connections</span> <span class="n">on</span> <span class="err">$</span><span class="n">port</span><span class="err">'</span><span class="p">);</span>
+
+  <span class="n">httpServer</span><span class="p">.</span><span class="n">listen</span><span class="p">((</span><span class="n">HttpRequest</span> <span class="n">request</span><span class="p">)</span> <span class="n">async</span> <span class="p">{</span>
+    <span class="k">if</span> <span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">uri</span><span class="p">.</span><span class="n">path</span> <span class="o">==</span> <span class="err">'</span><span class="o">/</span><span class="n">ws</span><span class="err">'</span><span class="p">)</span> <span class="p">{</span>
+      <span class="n">_webSocket</span> <span class="o">=</span> <span class="n">await</span> <span class="n">WebSocketTransformer</span><span class="p">.</span><span class="n">upgrade</span><span class="p">(</span><span class="n">request</span><span class="p">);</span>
+      <span class="n">await</span> <span class="n">_initProcessor</span><span class="p">(</span><span class="k">new</span> <span class="n">TWebSocket</span><span class="p">(</span><span class="n">_webSocket</span><span class="p">));</span>
+    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+      <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">Invalid</span> <span class="n">path</span><span class="o">:</span> <span class="err">$</span><span class="p">{</span><span class="n">request</span><span class="p">.</span><span class="n">uri</span><span class="p">.</span><span class="n">path</span><span class="p">}</span><span class="err">'</span><span class="p">);</span>
+    <span class="p">}</span>
+  <span class="p">});</span>
+<span class="err">}</span>
+
+<span class="n">Future</span> <span class="nf">_runTcpServer</span><span class="p">(</span><span class="kt">int</span> <span class="n">port</span><span class="p">)</span> <span class="n">async</span> <span class="p">{</span>
+  <span class="n">var</span> <span class="n">serverSocket</span> <span class="o">=</span> <span class="n">await</span> <span class="n">ServerSocket</span><span class="p">.</span><span class="n">bind</span><span class="p">(</span><span class="err">'</span><span class="mf">127.0.0.1</span><span class="err">'</span><span class="p">,</span> <span class="n">port</span><span class="p">);</span>
+  <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">listening</span> <span class="k">for</span> <span class="n">TCP</span> <span class="n">connections</span> <span class="n">on</span> <span class="err">$</span><span class="n">port</span><span class="err">'</span><span class="p">);</span>
+
+  <span class="n">Socket</span> <span class="n">socket</span> <span class="o">=</span> <span class="n">await</span> <span class="n">serverSocket</span><span class="p">.</span><span class="n">first</span><span class="p">;</span>
+  <span class="n">await</span> <span class="nf">_initProcessor</span><span class="p">(</span><span class="k">new</span> <span class="n">TTcpSocket</span><span class="p">(</span><span class="n">socket</span><span class="p">));</span>
+<span class="err">}</span>
+
+<span class="n">Future</span> <span class="nf">_initProcessor</span><span class="p">(</span><span class="n">TSocket</span> <span class="n">socket</span><span class="p">)</span> <span class="n">async</span> <span class="p">{</span>
+  <span class="n">TServerSocketTransport</span> <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TServerSocketTransport</span><span class="p">(</span><span class="n">socket</span><span class="p">);</span>
+  <span class="n">transport</span><span class="p">.</span><span class="n">onIncomingMessage</span><span class="p">.</span><span class="n">listen</span><span class="p">(</span><span class="n">_processMessage</span><span class="p">);</span>
+  <span class="n">_processor</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">CalculatorProcessor</span><span class="p">(</span><span class="k">new</span> <span class="n">CalculatorServer</span><span class="p">());</span>
+  <span class="n">_protocol</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">TBinaryProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">);</span>
+  <span class="n">await</span> <span class="n">_protocol</span><span class="p">.</span><span class="n">transport</span><span class="p">.</span><span class="n">open</span><span class="p">();</span>
+
+  <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">connected</span><span class="err">'</span><span class="p">);</span>
+<span class="err">}</span>
+
+<span class="n">Future</span> <span class="nf">_processMessage</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="n">async</span> <span class="p">{</span>
+  <span class="n">_processor</span><span class="p">.</span><span class="n">process</span><span class="p">(</span><span class="n">_protocol</span><span class="p">,</span> <span class="n">_protocol</span><span class="p">);</span>
+<span class="err">}</span>
+
+<span class="k">class</span> <span class="nc">CalculatorServer</span> <span class="n">implements</span> <span class="n">Calculator</span> <span class="p">{</span>
+  <span class="k">final</span> <span class="n">Map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">SharedStruct</span><span class="o">&gt;</span> <span class="n">_log</span> <span class="o">=</span> <span class="p">{};</span>
+
+  <span class="n">Future</span> <span class="n">ping</span><span class="p">()</span> <span class="n">async</span> <span class="p">{</span>
+    <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">ping</span><span class="p">()</span><span class="err">'</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="n">Future</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">num1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">num2</span><span class="p">)</span> <span class="n">async</span> <span class="p">{</span>
+    <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">add</span><span class="p">(</span><span class="err">$</span><span class="n">num1</span><span class="p">,</span> <span class="err">$</span><span class="n">num2</span><span class="p">)</span><span class="err">'</span><span class="p">);</span>
+
+    <span class="k">return</span> <span class="n">num1</span> <span class="o">+</span> <span class="n">num2</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="n">Future</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">calculate</span><span class="p">(</span><span class="kt">int</span> <span class="n">logid</span><span class="p">,</span> <span class="n">Work</span> <span class="n">work</span><span class="p">)</span> <span class="n">async</span> <span class="p">{</span>
+    <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">calulate</span><span class="p">(</span><span class="err">$</span><span class="n">logid</span><span class="p">,</span> <span class="err">$</span><span class="p">{</span><span class="n">work</span><span class="p">.</span><span class="n">toString</span><span class="p">()})</span><span class="err">'</span><span class="p">);</span>
+
+    <span class="kt">int</span> <span class="n">val</span><span class="p">;</span>
+
+    <span class="k">switch</span> <span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">ADD</span><span class="p">:</span>
+        <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">+</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+        <span class="k">break</span><span class="p">;</span>
+
+      <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span><span class="p">:</span>
+        <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">-</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+        <span class="k">break</span><span class="p">;</span>
+
+      <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">MULTIPLY</span><span class="p">:</span>
+        <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">*</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">;</span>
+        <span class="k">break</span><span class="p">;</span>
+
+      <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span><span class="p">:</span>
+        <span class="k">if</span> <span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
+          <span class="n">var</span> <span class="n">x</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InvalidOperation</span><span class="p">();</span>
+          <span class="n">x</span><span class="p">.</span><span class="n">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">;</span>
+          <span class="n">x</span><span class="p">.</span><span class="n">why</span> <span class="o">=</span> <span class="err">'</span><span class="n">Cannot</span> <span class="n">divide</span> <span class="n">by</span> <span class="mi">0</span><span class="err">'</span><span class="p">;</span>
+          <span class="k">throw</span> <span class="n">x</span><span class="p">;</span>
+        <span class="p">}</span>
+        <span class="n">val</span> <span class="o">=</span> <span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">/</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span><span class="p">).</span><span class="n">floor</span><span class="p">();</span>
+        <span class="k">break</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="n">var</span> <span class="n">log</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SharedStruct</span><span class="p">();</span>
+    <span class="n">log</span><span class="p">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">logid</span><span class="p">;</span>
+    <span class="n">log</span><span class="p">.</span><span class="n">value</span> <span class="o">=</span> <span class="err">'$</span><span class="n">val</span> <span class="s">"${work.comment}"</span><span class="err">'</span><span class="p">;</span>
+    <span class="k">this</span><span class="p">.</span><span class="n">_log</span><span class="p">[</span><span class="n">logid</span><span class="p">]</span> <span class="o">=</span> <span class="n">log</span><span class="p">;</span>
+
+    <span class="k">return</span> <span class="n">val</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="n">Future</span> <span class="n">zip</span><span class="p">()</span> <span class="n">async</span> <span class="p">{</span>
+    <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">zip</span><span class="p">()</span><span class="err">'</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="n">Future</span><span class="o">&lt;</span><span class="n">SharedStruct</span><span class="o">&gt;</span> <span class="n">getStruct</span><span class="p">(</span><span class="kt">int</span> <span class="n">key</span><span class="p">)</span> <span class="n">async</span> <span class="p">{</span>
+    <span class="n">print</span><span class="p">(</span><span class="err">'</span><span class="n">getStruct</span><span class="p">(</span><span class="err">$</span><span class="n">key</span><span class="p">)</span><span class="err">'</span><span class="p">);</span>
+
+    <span class="k">return</span> <span class="n">_log</span><span class="p">[</span><span class="n">key</span><span class="p">];</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/dart/server/bin/main.dart">tutorial/dart/server/bin/main.dart</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+<p>TBD</p>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/delphi.html b/output/tutorial/delphi.html
new file mode 100644
index 0000000..f6db027
--- /dev/null
+++ b/output/tutorial/delphi.html
@@ -0,0 +1,377 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Delphi</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Delphi Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen delphi tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+<ul>
+  <li>Thrift requires at least Delphi 2010. Earlier versions and FPC will not work due to the lack of Generics.</li>
+</ul>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="k">program</span> <span class="n">DelphiClient</span><span class="p">;</span>
+
+<span class="cm">{$APPTYPE CONSOLE}</span>
+<span class="cm">{$D 'Copyright (c) 2012 The Apache Software Foundation'}</span>
+
+<span class="k">uses</span>
+  <span class="n">SysUtils</span><span class="p">,</span>
+  <span class="n">Generics</span><span class="p">.</span><span class="n">Collections</span><span class="p">,</span>
+  <span class="n">Thrift</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Collections</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Collections.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Configuration</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Configuration.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Exception</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Exception.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Utils</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Utils.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Stream</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Stream.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Protocol.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Server</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Server.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Transport.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span><span class="p">.</span><span class="n">WinHTTP</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Transport.WinHTTP.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span><span class="p">.</span><span class="n">MsxmlHTTP</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Transport.MsxmlHTTP.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">WinHTTP</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.WinHTTP.pas'</span><span class="p">,</span>
+  <span class="n">Shared</span> <span class="k">in</span> <span class="s">'..\..\gen-delphi\Shared.pas'</span><span class="p">,</span>
+  <span class="n">Tutorial</span> <span class="k">in</span> <span class="s">'..\..\gen-delphi\Tutorial.pas'</span><span class="p">;</span>
+
+
+<span class="k">type</span>
+  <span class="n">DelphiTutorialClient</span> <span class="p">=</span> <span class="k">class</span>
+  <span class="k">public</span>
+    <span class="k">class</span> <span class="k">procedure</span> <span class="n">Main</span><span class="p">;</span>
+  <span class="k">end</span><span class="p">;</span>
+
+
+<span class="c1">//--- DelphiTutorialClient ---------------------------------------
+</span>
+
+<span class="k">class</span> <span class="k">procedure</span> <span class="n">DelphiTutorialClient</span><span class="p">.</span><span class="n">Main</span><span class="p">;</span>
+<span class="k">var</span> <span class="n">transport</span> <span class="p">:</span> <span class="n">ITransport</span><span class="p">;</span>
+    <span class="n">protocol</span>  <span class="p">:</span> <span class="n">IProtocol</span><span class="p">;</span>
+    <span class="n">client</span>    <span class="p">:</span> <span class="n">TCalculator</span><span class="p">.</span><span class="n">Iface</span><span class="p">;</span>
+    <span class="n">work</span>      <span class="p">:</span> <span class="n">IWork</span><span class="p">;</span>
+    <span class="n">sum</span><span class="p">,</span> <span class="n">quotient</span><span class="p">,</span> <span class="n">diff</span> <span class="p">:</span> <span class="kt">Integer</span><span class="p">;</span>
+    <span class="n">log</span>       <span class="p">:</span> <span class="n">ISharedStruct</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">try</span>
+    <span class="n">transport</span> <span class="p">:=</span> <span class="n">TSocketImpl</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span> <span class="s">'localhost'</span><span class="p">,</span> <span class="m">9090</span><span class="p">);</span>
+    <span class="n">protocol</span>  <span class="p">:=</span> <span class="n">TBinaryProtocolImpl</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span> <span class="n">transport</span><span class="p">);</span>
+    <span class="n">client</span>    <span class="p">:=</span> <span class="n">TCalculator</span><span class="p">.</span><span class="n">TClient</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span> <span class="n">protocol</span><span class="p">);</span>
+
+    <span class="n">transport</span><span class="p">.</span><span class="n">Open</span><span class="p">;</span>
+
+    <span class="n">client</span><span class="p">.</span><span class="n">ping</span><span class="p">;</span>
+    <span class="k">WriteLn</span><span class="p">(</span><span class="s">'ping()'</span><span class="p">);</span>
+
+    <span class="n">sum</span> <span class="p">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">add</span><span class="p">(</span> <span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">);</span>
+    <span class="k">WriteLn</span><span class="p">(</span> <span class="n">Format</span><span class="p">(</span> <span class="s">'1+1=%d'</span><span class="p">,</span> <span class="p">[</span><span class="n">sum</span><span class="p">]));</span>
+
+    <span class="n">work</span> <span class="p">:=</span> <span class="n">TWorkImpl</span><span class="p">.</span><span class="n">Create</span><span class="p">;</span>
+
+    <span class="n">work</span><span class="p">.</span><span class="n">Op</span>   <span class="p">:=</span> <span class="n">TOperation</span><span class="p">.</span><span class="n">DIVIDE</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">Num1</span> <span class="p">:=</span> <span class="m">1</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">Num2</span> <span class="p">:=</span> <span class="m">0</span><span class="p">;</span>
+    <span class="k">try</span>
+      <span class="n">quotient</span> <span class="p">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="n">work</span><span class="p">);</span>
+      <span class="k">WriteLn</span><span class="p">(</span> <span class="s">'Whoa we can divide by 0'</span><span class="p">);</span>
+      <span class="k">WriteLn</span><span class="p">(</span> <span class="n">Format</span><span class="p">(</span><span class="s">'1/0=%d'</span><span class="p">,[</span><span class="n">quotient</span><span class="p">]));</span>
+    <span class="k">except</span>
+      <span class="k">on</span> <span class="n">io</span><span class="p">:</span> <span class="n">TInvalidOperation</span>
+      <span class="k">do</span> <span class="k">WriteLn</span><span class="p">(</span> <span class="s">'Invalid operation: '</span> <span class="p">+</span> <span class="n">io</span><span class="p">.</span><span class="n">Why</span><span class="p">);</span>
+    <span class="k">end</span><span class="p">;</span>
+
+    <span class="n">work</span><span class="p">.</span><span class="n">Op</span>   <span class="p">:=</span> <span class="n">TOperation</span><span class="p">.</span><span class="n">SUBTRACT</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">Num1</span> <span class="p">:=</span> <span class="m">15</span><span class="p">;</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">Num2</span> <span class="p">:=</span> <span class="m">10</span><span class="p">;</span>
+    <span class="k">try</span>
+      <span class="n">diff</span> <span class="p">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span> <span class="m">1</span><span class="p">,</span> <span class="n">work</span><span class="p">);</span>
+      <span class="k">WriteLn</span><span class="p">(</span> <span class="n">Format</span><span class="p">(</span><span class="s">'15-10=%d'</span><span class="p">,</span> <span class="p">[</span><span class="n">diff</span><span class="p">]));</span>
+    <span class="k">except</span>
+      <span class="k">on</span> <span class="n">io</span><span class="p">:</span> <span class="n">TInvalidOperation</span>
+      <span class="k">do</span> <span class="k">WriteLn</span><span class="p">(</span> <span class="s">'Invalid operation: '</span> <span class="p">+</span> <span class="n">io</span><span class="p">.</span><span class="n">Why</span><span class="p">);</span>
+    <span class="k">end</span><span class="p">;</span>
+
+    <span class="n">log</span> <span class="p">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">getStruct</span><span class="p">(</span><span class="m">1</span><span class="p">);</span>
+    <span class="k">WriteLn</span><span class="p">(</span> <span class="n">Format</span><span class="p">(</span> <span class="s">'Check log: %s'</span><span class="p">,</span> <span class="p">[</span><span class="n">log</span><span class="p">.</span><span class="k">Value</span><span class="p">]));</span>
+
+    <span class="n">transport</span><span class="p">.</span><span class="n">Close</span><span class="p">();</span>
+
+  <span class="k">except</span>
+    <span class="k">on</span> <span class="n">e</span> <span class="p">:</span> <span class="n">Exception</span>
+    <span class="k">do</span> <span class="k">WriteLn</span><span class="p">(</span> <span class="n">e</span><span class="p">.</span><span class="n">ClassName</span><span class="p">+</span><span class="s">': '</span><span class="p">+</span><span class="n">e</span><span class="p">.</span><span class="k">Message</span><span class="p">);</span>
+  <span class="k">end</span><span class="p">;</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="k">begin</span>
+  <span class="k">try</span>
+    <span class="n">DelphiTutorialClient</span><span class="p">.</span><span class="n">Main</span><span class="p">;</span>
+  <span class="k">except</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/delphi/DelphiClient/DelphiClient.dpr">tutorial/delphi/DelphiClient/DelphiClient.dpr</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="k">program</span> <span class="n">DelphiServer</span><span class="p">;</span>
+
+<span class="cm">{$APPTYPE CONSOLE}</span>
+<span class="cm">{$D 'Copyright (c) 2012 The Apache Software Foundation'}</span>
+
+<span class="cm">{$Q+}</span>     <span class="c1">// throws exceptions on numeric overflows
+</span>
+<span class="k">uses</span>
+  <span class="n">SysUtils</span><span class="p">,</span>
+  <span class="n">Generics</span><span class="p">.</span><span class="n">Collections</span><span class="p">,</span>
+  <span class="n">Thrift</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Collections</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Collections.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Configuration</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Configuration.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Exception</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Exception.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Utils</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Utils.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Stream</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Stream.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Protocol.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Server</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Server.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.Transport.pas'</span><span class="p">,</span>
+  <span class="n">Thrift</span><span class="p">.</span><span class="n">WinHTTP</span> <span class="k">in</span> <span class="s">'..\..\..\lib\delphi\src\Thrift.WinHTTP.pas'</span><span class="p">,</span>
+  <span class="n">Shared</span> <span class="k">in</span> <span class="s">'..\..\gen-delphi\Shared.pas'</span><span class="p">,</span>
+  <span class="n">Tutorial</span> <span class="k">in</span> <span class="s">'..\..\gen-delphi\Tutorial.pas'</span><span class="p">;</span>
+
+
+<span class="k">type</span>
+  <span class="n">TCalculatorHandler</span> <span class="p">=</span> <span class="k">class</span><span class="p">(</span> <span class="n">TInterfacedObject</span><span class="p">,</span> <span class="n">TCalculator</span><span class="p">.</span><span class="n">Iface</span><span class="p">)</span>
+  <span class="k">protected</span>
+    <span class="n">FLog</span> <span class="p">:</span> <span class="n">TDictionary</span><span class="p">&lt;</span> <span class="kt">Integer</span><span class="p">,</span> <span class="n">ISharedStruct</span><span class="p">&gt;;</span>
+
+    <span class="c1">// TSharedService.Iface
+</span>    <span class="k">function</span>  <span class="n">getStruct</span><span class="p">(</span><span class="n">key</span><span class="p">:</span> <span class="kt">Integer</span><span class="p">):</span> <span class="n">ISharedStruct</span><span class="p">;</span>
+
+    <span class="c1">// TCalculator.Iface
+</span>    <span class="k">procedure</span> <span class="n">ping</span><span class="p">();</span>
+    <span class="k">function</span>  <span class="n">add</span><span class="p">(</span><span class="n">num1</span><span class="p">:</span> <span class="kt">Integer</span><span class="p">;</span> <span class="n">num2</span><span class="p">:</span> <span class="kt">Integer</span><span class="p">):</span> <span class="kt">Integer</span><span class="p">;</span>
+    <span class="k">function</span>  <span class="n">calculate</span><span class="p">(</span><span class="n">logid</span><span class="p">:</span> <span class="kt">Integer</span><span class="p">;</span> <span class="k">const</span> <span class="n">w</span><span class="p">:</span> <span class="n">IWork</span><span class="p">):</span> <span class="kt">Integer</span><span class="p">;</span>
+    <span class="k">procedure</span> <span class="n">zip</span><span class="p">();</span>
+
+  <span class="k">public</span>
+    <span class="k">constructor</span> <span class="n">Create</span><span class="p">;</span>
+    <span class="k">destructor</span> <span class="n">Destroy</span><span class="p">;</span>  <span class="k">override</span><span class="p">;</span>
+
+  <span class="k">end</span><span class="p">;</span>
+
+  <span class="n">DelphiTutorialServer</span> <span class="p">=</span> <span class="k">class</span>
+  <span class="k">public</span>
+    <span class="k">class</span> <span class="k">procedure</span> <span class="n">Main</span><span class="p">;</span>
+  <span class="k">end</span><span class="p">;</span>
+
+
+<span class="c1">//--- TCalculatorHandler ---------------------------------------------------
+</span>
+
+<span class="k">constructor</span> <span class="n">TCalculatorHandler</span><span class="p">.</span><span class="n">Create</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">inherited</span> <span class="n">Create</span><span class="p">;</span>
+  <span class="n">FLog</span> <span class="p">:=</span> <span class="n">TDictionary</span><span class="p">&lt;</span> <span class="kt">Integer</span><span class="p">,</span> <span class="n">ISharedStruct</span><span class="p">&gt;.</span><span class="n">Create</span><span class="p">();</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="k">destructor</span> <span class="n">TCalculatorHandler</span><span class="p">.</span><span class="n">Destroy</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">try</span>
+    <span class="n">FreeAndNil</span><span class="p">(</span> <span class="n">FLog</span><span class="p">);</span>
+  <span class="k">finally</span>
+    <span class="k">inherited</span> <span class="n">Destroy</span><span class="p">;</span>
+  <span class="k">end</span><span class="p">;</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="k">procedure</span> <span class="n">TCalculatorHandler</span><span class="p">.</span><span class="n">ping</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">WriteLn</span><span class="p">(</span> <span class="s">'ping()'</span><span class="p">);</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="k">function</span> <span class="n">TCalculatorHandler</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">num1</span><span class="p">:</span> <span class="kt">Integer</span><span class="p">;</span> <span class="n">num2</span><span class="p">:</span> <span class="kt">Integer</span><span class="p">):</span> <span class="kt">Integer</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">WriteLn</span><span class="p">(</span> <span class="n">Format</span><span class="p">(</span> <span class="s">'add( %d, %d)'</span><span class="p">,</span> <span class="p">[</span><span class="n">num1</span><span class="p">,</span> <span class="n">num2</span><span class="p">]));</span>
+  <span class="n">result</span> <span class="p">:=</span> <span class="n">num1</span> <span class="p">+</span> <span class="n">num2</span><span class="p">;</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="k">function</span> <span class="n">TCalculatorHandler</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="n">logid</span><span class="p">:</span> <span class="kt">Integer</span><span class="p">;</span> <span class="k">const</span> <span class="n">w</span><span class="p">:</span> <span class="n">IWork</span><span class="p">):</span> <span class="kt">Integer</span><span class="p">;</span>
+<span class="k">var</span> <span class="n">entry</span> <span class="p">:</span> <span class="n">ISharedStruct</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">try</span>
+    <span class="k">WriteLn</span><span class="p">(</span> <span class="n">Format</span><span class="p">(</span><span class="s">'calculate( %d, [%d,%d,%d])'</span><span class="p">,</span> <span class="p">[</span><span class="n">logid</span><span class="p">,</span> <span class="n">Ord</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">),</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span><span class="p">,</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">]));</span>
+
+    <span class="k">case</span> <span class="n">w</span><span class="p">.</span><span class="n">Op</span> <span class="k">of</span>
+      <span class="n">TOperation</span><span class="p">.</span><span class="n">ADD</span>      <span class="p">:</span>  <span class="n">result</span> <span class="p">:=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="p">+</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">;</span>
+      <span class="n">TOperation</span><span class="p">.</span><span class="n">SUBTRACT</span> <span class="p">:</span>  <span class="n">result</span> <span class="p">:=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="p">-</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">;</span>
+      <span class="n">TOperation</span><span class="p">.</span><span class="n">MULTIPLY</span> <span class="p">:</span>  <span class="n">result</span> <span class="p">:=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="p">*</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">;</span>
+      <span class="n">TOperation</span><span class="p">.</span><span class="n">DIVIDE</span>   <span class="p">:</span>  <span class="n">result</span> <span class="p">:=</span> <span class="n">Round</span><span class="p">(</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="p">/</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">);</span>
+    <span class="k">else</span>
+      <span class="k">raise</span> <span class="n">TInvalidOperation</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span> <span class="n">Ord</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">),</span> <span class="s">'Unknown operation'</span><span class="p">);</span>
+    <span class="k">end</span><span class="p">;</span>
+
+  <span class="k">except</span>
+    <span class="k">on</span> <span class="n">e</span><span class="p">:</span><span class="n">Thrift</span><span class="p">.</span><span class="n">TException</span> <span class="k">do</span> <span class="k">raise</span><span class="p">;</span>  <span class="c1">// let Thrift Exceptions pass through
+</span>    <span class="k">on</span> <span class="n">e</span><span class="p">:</span><span class="n">Exception</span> <span class="k">do</span> <span class="k">raise</span> <span class="n">TInvalidOperation</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span> <span class="n">Ord</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">),</span> <span class="n">e</span><span class="p">.</span><span class="k">Message</span><span class="p">);</span>  <span class="c1">// repackage all other
+</span>  <span class="k">end</span><span class="p">;</span>
+
+  <span class="n">entry</span> <span class="p">:=</span> <span class="n">TSharedStructImpl</span><span class="p">.</span><span class="n">Create</span><span class="p">;</span>
+  <span class="n">entry</span><span class="p">.</span><span class="n">Key</span>   <span class="p">:=</span> <span class="n">logid</span><span class="p">;</span>
+  <span class="n">entry</span><span class="p">.</span><span class="k">Value</span> <span class="p">:=</span> <span class="n">IntToStr</span><span class="p">(</span> <span class="n">result</span><span class="p">);</span>
+  <span class="n">FLog</span><span class="p">.</span><span class="n">AddOrSetValue</span><span class="p">(</span> <span class="n">logid</span><span class="p">,</span> <span class="n">entry</span><span class="p">);</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="k">function</span> <span class="n">TCalculatorHandler</span><span class="p">.</span><span class="n">getStruct</span><span class="p">(</span><span class="n">key</span><span class="p">:</span> <span class="kt">Integer</span><span class="p">):</span> <span class="n">ISharedStruct</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">WriteLn</span><span class="p">(</span> <span class="n">Format</span><span class="p">(</span> <span class="s">'getStruct(%d)'</span><span class="p">,</span> <span class="p">[</span><span class="n">key</span><span class="p">]));</span>
+  <span class="n">result</span> <span class="p">:=</span> <span class="n">FLog</span><span class="p">[</span><span class="n">key</span><span class="p">];</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="k">procedure</span> <span class="n">TCalculatorHandler</span><span class="p">.</span><span class="n">zip</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">WriteLn</span><span class="p">(</span> <span class="s">'zip()'</span><span class="p">);</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="c1">//--- DelphiTutorialServer ----------------------------------------------------------------------
+</span>
+
+<span class="k">class</span> <span class="k">procedure</span> <span class="n">DelphiTutorialServer</span><span class="p">.</span><span class="n">Main</span><span class="p">;</span>
+<span class="k">var</span> <span class="n">handler</span>   <span class="p">:</span> <span class="n">TCalculator</span><span class="p">.</span><span class="n">Iface</span><span class="p">;</span>
+    <span class="n">processor</span> <span class="p">:</span> <span class="n">IProcessor</span><span class="p">;</span>
+    <span class="n">transport</span> <span class="p">:</span> <span class="n">IServerTransport</span><span class="p">;</span>
+    <span class="n">server</span>    <span class="p">:</span> <span class="n">IServer</span><span class="p">;</span>
+<span class="k">begin</span>
+  <span class="k">try</span>
+    <span class="n">handler</span>   <span class="p">:=</span> <span class="n">TCalculatorHandler</span><span class="p">.</span><span class="n">Create</span><span class="p">;</span>
+    <span class="n">processor</span> <span class="p">:=</span> <span class="n">TCalculator</span><span class="p">.</span><span class="n">TProcessorImpl</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span> <span class="n">handler</span><span class="p">);</span>
+    <span class="n">transport</span> <span class="p">:=</span> <span class="n">TServerSocketImpl</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span> <span class="m">9090</span><span class="p">);</span>
+    <span class="n">server</span>    <span class="p">:=</span> <span class="n">TSimpleServer</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span> <span class="n">processor</span><span class="p">,</span> <span class="n">transport</span><span class="p">);</span>
+
+    <span class="k">WriteLn</span><span class="p">(</span> <span class="s">'Starting the server...'</span><span class="p">);</span>
+    <span class="n">server</span><span class="p">.</span><span class="n">Serve</span><span class="p">();</span>
+
+  <span class="k">except</span>
+    <span class="k">on</span> <span class="n">e</span><span class="p">:</span> <span class="n">Exception</span> <span class="k">do</span> <span class="k">WriteLn</span><span class="p">(</span> <span class="n">e</span><span class="p">.</span><span class="k">Message</span><span class="p">);</span>
+  <span class="k">end</span><span class="p">;</span>
+
+  <span class="k">WriteLn</span><span class="p">(</span><span class="s">'done.'</span><span class="p">);</span>
+<span class="k">end</span><span class="p">;</span>
+
+
+<span class="k">begin</span>
+  <span class="k">try</span>
+    <span class="n">DelphiTutorialServer</span><span class="p">.</span><span class="n">Main</span><span class="p">;</span>
+  <span class="k">except</span>
+    <span class="k">on</span> <span class="n">E</span><span class="p">:</span> <span class="n">Exception</span> <span class="k">do</span>
+      <span class="k">Writeln</span><span class="p">(</span><span class="n">E</span><span class="p">.</span><span class="n">ClassName</span><span class="p">,</span> <span class="s">': '</span><span class="p">,</span> <span class="n">E</span><span class="p">.</span><span class="k">Message</span><span class="p">);</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/delphi/DelphiServer/DelphiServer.dpr">tutorial/delphi/DelphiServer/DelphiServer.dpr</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/go.html b/output/tutorial/go.html
new file mode 100644
index 0000000..6136f1a
--- /dev/null
+++ b/output/tutorial/go.html
@@ -0,0 +1,335 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Go</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Go Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen go tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<ul>
+  <li>At least Go 1.7 is required to run the tutorial code.</li>
+  <li>The GOPATH may need to be adjusted, alternatively manually put the Go Thrift library files into a suitable location.</li>
+  <li>The Thrift library and compiler must be the same version. Applications might work even with a version mismatch, but this unsupported.
+To use a specific version of the library, either clone the repository for that version, or use a package manager like <a href="https://golang.github.io/dep/">dep</a> or <a href="https://github.com/golang/go/wiki/Modules">Go modules</a>.</li>
+</ul>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="p">(</span>
+	<span class="s">"context"</span>
+	<span class="s">"crypto/tls"</span>
+	<span class="s">"fmt"</span>
+	<span class="s">"tutorial"</span>
+
+	<span class="s">"github.com/apache/thrift/lib/go/thrift"</span>
+<span class="p">)</span>
+
+<span class="n">var</span> <span class="n">defaultCtx</span> <span class="o">=</span> <span class="n">context</span><span class="p">.</span><span class="n">Background</span><span class="p">()</span>
+
+<span class="n">func</span> <span class="nf">handleClient</span><span class="p">(</span><span class="n">client</span> <span class="o">*</span><span class="n">tutorial</span><span class="p">.</span><span class="n">CalculatorClient</span><span class="p">)</span> <span class="p">(</span><span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+	<span class="n">client</span><span class="p">.</span><span class="n">Ping</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">)</span>
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"ping()"</span><span class="p">)</span>
+
+	<span class="n">sum</span><span class="p">,</span> <span class="n">_</span> <span class="o">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"1+1="</span><span class="p">,</span> <span class="n">sum</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
+
+	<span class="n">work</span> <span class="o">:=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">NewWork</span><span class="p">()</span>
+	<span class="n">work</span><span class="p">.</span><span class="n">Op</span> <span class="o">=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_DIVIDE</span>
+	<span class="n">work</span><span class="p">.</span><span class="n">Num1</span> <span class="o">=</span> <span class="mi">1</span>
+	<span class="n">work</span><span class="p">.</span><span class="n">Num2</span> <span class="o">=</span> <span class="mi">0</span>
+	<span class="n">quotient</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">Calculate</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
+	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
+		<span class="k">switch</span> <span class="n">v</span> <span class="o">:=</span> <span class="n">err</span><span class="p">.(</span><span class="n">type</span><span class="p">)</span> <span class="p">{</span>
+		<span class="k">case</span> <span class="o">*</span><span class="n">tutorial</span><span class="p">.</span><span class="n">InvalidOperation</span><span class="p">:</span>
+			<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Invalid operation:"</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+		<span class="nl">default:</span>
+			<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Error during operation:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
+		<span class="p">}</span>
+	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+		<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Whoa we can divide by 0 with new value:"</span><span class="p">,</span> <span class="n">quotient</span><span class="p">)</span>
+	<span class="p">}</span>
+
+	<span class="n">work</span><span class="p">.</span><span class="n">Op</span> <span class="o">=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_SUBTRACT</span>
+	<span class="n">work</span><span class="p">.</span><span class="n">Num1</span> <span class="o">=</span> <span class="mi">15</span>
+	<span class="n">work</span><span class="p">.</span><span class="n">Num2</span> <span class="o">=</span> <span class="mi">10</span>
+	<span class="n">diff</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">Calculate</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
+	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
+		<span class="k">switch</span> <span class="n">v</span> <span class="o">:=</span> <span class="n">err</span><span class="p">.(</span><span class="n">type</span><span class="p">)</span> <span class="p">{</span>
+		<span class="k">case</span> <span class="o">*</span><span class="n">tutorial</span><span class="p">.</span><span class="n">InvalidOperation</span><span class="p">:</span>
+			<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Invalid operation:"</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+		<span class="nl">default:</span>
+			<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Error during operation:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
+		<span class="p">}</span>
+		<span class="k">return</span> <span class="n">err</span>
+	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+		<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"15-10="</span><span class="p">,</span> <span class="n">diff</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
+	<span class="p">}</span>
+
+	<span class="n">log</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">GetStruct</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
+		<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Unable to get struct:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
+		<span class="k">return</span> <span class="n">err</span>
+	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+		<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Check log:"</span><span class="p">,</span> <span class="n">log</span><span class="p">.</span><span class="n">Value</span><span class="p">)</span>
+	<span class="p">}</span>
+	<span class="k">return</span> <span class="n">err</span>
+<span class="p">}</span>
+
+<span class="n">func</span> <span class="n">runClient</span><span class="p">(</span><span class="n">transportFactory</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TTransportFactory</span><span class="p">,</span> <span class="n">protocolFactory</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TProtocolFactory</span><span class="p">,</span> <span class="n">addr</span> <span class="n">string</span><span class="p">,</span> <span class="n">secure</span> <span class="kt">bool</span><span class="p">)</span> <span class="n">error</span> <span class="p">{</span>
+	<span class="n">var</span> <span class="n">transport</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TTransport</span>
+	<span class="n">var</span> <span class="n">err</span> <span class="n">error</span>
+	<span class="k">if</span> <span class="n">secure</span> <span class="p">{</span>
+		<span class="n">cfg</span> <span class="o">:=</span> <span class="k">new</span><span class="p">(</span><span class="n">tls</span><span class="p">.</span><span class="n">Config</span><span class="p">)</span>
+		<span class="n">cfg</span><span class="p">.</span><span class="n">InsecureSkipVerify</span> <span class="o">=</span> <span class="nb">true</span>
+		<span class="n">transport</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTSSLSocket</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+		<span class="n">transport</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTSocket</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
+	<span class="p">}</span>
+	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
+		<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Error opening socket:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
+		<span class="k">return</span> <span class="n">err</span>
+	<span class="p">}</span>
+	<span class="n">transport</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">transportFactory</span><span class="p">.</span><span class="n">GetTransport</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
+	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
+		<span class="k">return</span> <span class="n">err</span>
+	<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/go/src/client.go">tutorial/go/src/client.go</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="p">(</span>
+	<span class="s">"crypto/tls"</span>
+	<span class="s">"fmt"</span>
+	<span class="s">"github.com/apache/thrift/lib/go/thrift"</span>
+	<span class="s">"tutorial"</span>
+<span class="p">)</span>
+
+<span class="n">func</span> <span class="nf">runServer</span><span class="p">(</span><span class="n">transportFactory</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TTransportFactory</span><span class="p">,</span> <span class="n">protocolFactory</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TProtocolFactory</span><span class="p">,</span> <span class="n">addr</span> <span class="n">string</span><span class="p">,</span> <span class="n">secure</span> <span class="kt">bool</span><span class="p">)</span> <span class="n">error</span> <span class="p">{</span>
+	<span class="n">var</span> <span class="n">transport</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TServerTransport</span>
+	<span class="n">var</span> <span class="n">err</span> <span class="n">error</span>
+	<span class="k">if</span> <span class="n">secure</span> <span class="p">{</span>
+		<span class="n">cfg</span> <span class="o">:=</span> <span class="k">new</span><span class="p">(</span><span class="n">tls</span><span class="p">.</span><span class="n">Config</span><span class="p">)</span>
+		<span class="k">if</span> <span class="n">cert</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">tls</span><span class="p">.</span><span class="n">LoadX509KeyPair</span><span class="p">(</span><span class="s">"server.crt"</span><span class="p">,</span> <span class="s">"server.key"</span><span class="p">);</span> <span class="n">err</span> <span class="o">==</span> <span class="n">nil</span> <span class="p">{</span>
+			<span class="n">cfg</span><span class="p">.</span><span class="n">Certificates</span> <span class="o">=</span> <span class="n">append</span><span class="p">(</span><span class="n">cfg</span><span class="p">.</span><span class="n">Certificates</span><span class="p">,</span> <span class="n">cert</span><span class="p">)</span>
+		<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+			<span class="k">return</span> <span class="n">err</span>
+		<span class="p">}</span>
+		<span class="n">transport</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTSSLServerSocket</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
+	<span class="err">}</span> <span class="k">else</span> <span class="p">{</span>
+		<span class="n">transport</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTServerSocket</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
+	<span class="p">}</span>
+	
+	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
+		<span class="k">return</span> <span class="n">err</span>
+	<span class="p">}</span>
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"%T</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">transport</span><span class="p">)</span>
+	<span class="n">handler</span> <span class="o">:=</span> <span class="n">NewCalculatorHandler</span><span class="p">()</span>
+	<span class="n">processor</span> <span class="o">:=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">NewCalculatorProcessor</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
+	<span class="n">server</span> <span class="o">:=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTSimpleServer4</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="n">transport</span><span class="p">,</span> <span class="n">transportFactory</span><span class="p">,</span> <span class="n">protocolFactory</span><span class="p">)</span>
+
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Starting the simple server... on "</span><span class="p">,</span> <span class="n">addr</span><span class="p">)</span>
+	<span class="k">return</span> <span class="n">server</span><span class="p">.</span><span class="n">Serve</span><span class="p">()</span>
+<span class="err">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/go/src/server.go">tutorial/go/src/server.go</a>
+</p>
+
+<h3 id="server-handler">Server Handler</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="p">(</span>
+	<span class="s">"context"</span>
+	<span class="s">"fmt"</span>
+	<span class="s">"shared"</span>
+	<span class="s">"strconv"</span>
+	<span class="s">"tutorial"</span>
+<span class="p">)</span>
+
+<span class="n">type</span> <span class="n">CalculatorHandler</span> <span class="k">struct</span> <span class="p">{</span>
+	<span class="n">log</span> <span class="n">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="o">*</span><span class="n">shared</span><span class="p">.</span><span class="n">SharedStruct</span>
+<span class="p">}</span>
+
+<span class="n">func</span> <span class="nf">NewCalculatorHandler</span><span class="p">()</span> <span class="o">*</span><span class="n">CalculatorHandler</span> <span class="p">{</span>
+	<span class="k">return</span> <span class="o">&amp;</span><span class="n">CalculatorHandler</span><span class="p">{</span><span class="n">log</span><span class="o">:</span> <span class="n">make</span><span class="p">(</span><span class="n">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="o">*</span><span class="n">shared</span><span class="p">.</span><span class="n">SharedStruct</span><span class="p">)}</span>
+<span class="p">}</span>
+
+<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">Ping</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">)</span> <span class="p">(</span><span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"ping()</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
+	<span class="k">return</span> <span class="n">nil</span>
+<span class="p">}</span>
+
+<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">Add</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">num1</span> <span class="n">int32</span><span class="p">,</span> <span class="n">num2</span> <span class="n">int32</span><span class="p">)</span> <span class="p">(</span><span class="n">retval17</span> <span class="n">int32</span><span class="p">,</span> <span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"add("</span><span class="p">,</span> <span class="n">num1</span><span class="p">,</span> <span class="s">","</span><span class="p">,</span> <span class="n">num2</span><span class="p">,</span> <span class="s">")</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
+	<span class="k">return</span> <span class="n">num1</span> <span class="o">+</span> <span class="n">num2</span><span class="p">,</span> <span class="n">nil</span>
+<span class="p">}</span>
+
+<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">Calculate</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">logid</span> <span class="n">int32</span><span class="p">,</span> <span class="n">w</span> <span class="o">*</span><span class="n">tutorial</span><span class="p">.</span><span class="n">Work</span><span class="p">)</span> <span class="p">(</span><span class="n">val</span> <span class="n">int32</span><span class="p">,</span> <span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"calculate("</span><span class="p">,</span> <span class="n">logid</span><span class="p">,</span> <span class="s">", {"</span><span class="p">,</span> <span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">,</span> <span class="s">","</span><span class="p">,</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span><span class="p">,</span> <span class="s">","</span><span class="p">,</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">,</span> <span class="s">"})</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
+	<span class="k">switch</span> <span class="n">w</span><span class="p">.</span><span class="n">Op</span> <span class="p">{</span>
+	<span class="k">case</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_ADD</span><span class="p">:</span>
+		<span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">+</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span>
+		<span class="k">break</span>
+	<span class="k">case</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_SUBTRACT</span><span class="p">:</span>
+		<span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">-</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span>
+		<span class="k">break</span>
+	<span class="k">case</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_MULTIPLY</span><span class="p">:</span>
+		<span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">*</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span>
+		<span class="k">break</span>
+	<span class="k">case</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_DIVIDE</span><span class="p">:</span>
+		<span class="k">if</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
+			<span class="n">ouch</span> <span class="o">:=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">NewInvalidOperation</span><span class="p">()</span>
+			<span class="n">ouch</span><span class="p">.</span><span class="n">WhatOp</span> <span class="o">=</span> <span class="n">int32</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">)</span>
+			<span class="n">ouch</span><span class="p">.</span><span class="n">Why</span> <span class="o">=</span> <span class="s">"Cannot divide by 0"</span>
+			<span class="n">err</span> <span class="o">=</span> <span class="n">ouch</span>
+			<span class="k">return</span>
+		<span class="p">}</span>
+		<span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">/</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span>
+		<span class="k">break</span>
+	<span class="nl">default:</span>
+		<span class="n">ouch</span> <span class="o">:=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">NewInvalidOperation</span><span class="p">()</span>
+		<span class="n">ouch</span><span class="p">.</span><span class="n">WhatOp</span> <span class="o">=</span> <span class="n">int32</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">)</span>
+		<span class="n">ouch</span><span class="p">.</span><span class="n">Why</span> <span class="o">=</span> <span class="s">"Unknown operation"</span>
+		<span class="n">err</span> <span class="o">=</span> <span class="n">ouch</span>
+		<span class="k">return</span>
+	<span class="p">}</span>
+	<span class="n">entry</span> <span class="o">:=</span> <span class="n">shared</span><span class="p">.</span><span class="n">NewSharedStruct</span><span class="p">()</span>
+	<span class="n">entry</span><span class="p">.</span><span class="n">Key</span> <span class="o">=</span> <span class="n">logid</span>
+	<span class="n">entry</span><span class="p">.</span><span class="n">Value</span> <span class="o">=</span> <span class="n">strconv</span><span class="p">.</span><span class="n">Itoa</span><span class="p">(</span><span class="kt">int</span><span class="p">(</span><span class="n">val</span><span class="p">))</span>
+	<span class="n">k</span> <span class="o">:=</span> <span class="kt">int</span><span class="p">(</span><span class="n">logid</span><span class="p">)</span>
+	<span class="cm">/*
+	   oldvalue, exists := p.log[k]
+	   if exists {
+	     fmt.Print("Replacing ", oldvalue, " with ", entry, " for key ", k, "\n")
+	   } else {
+	     fmt.Print("Adding ", entry, " for key ", k, "\n")
+	   }
+	*/</span>
+	<span class="n">p</span><span class="p">.</span><span class="n">log</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">entry</span>
+	<span class="k">return</span> <span class="n">val</span><span class="p">,</span> <span class="n">err</span>
+<span class="p">}</span>
+
+<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">GetStruct</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">key</span> <span class="n">int32</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="n">shared</span><span class="p">.</span><span class="n">SharedStruct</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"getStruct("</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s">")</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
+	<span class="n">v</span><span class="p">,</span> <span class="n">_</span> <span class="o">:=</span> <span class="n">p</span><span class="p">.</span><span class="n">log</span><span class="p">[</span><span class="kt">int</span><span class="p">(</span><span class="n">key</span><span class="p">)]</span>
+	<span class="k">return</span> <span class="n">v</span><span class="p">,</span> <span class="n">nil</span>
+<span class="p">}</span>
+
+<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">Zip</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">)</span> <span class="p">(</span><span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
+	<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"zip()</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
+	<span class="k">return</span> <span class="n">nil</span>
+<span class="p">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/go/src/handler.go">tutorial/go/src/handler.go</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+<ul>
+  <li>Try using one of the other available protocols, default is binary.</li>
+  <li>Try using the buffered and/or framed transport options.</li>
+  <li>Note that both server and client must use the exact same protocol and transport stack.</li>
+</ul>
+
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/graphviz.html b/output/tutorial/graphviz.html
new file mode 100644
index 0000000..dfbbbd3
--- /dev/null
+++ b/output/tutorial/graphviz.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Graphviz</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Graphviz Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen cpp tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+<ul>
+  <li>A Graphviz renderer</li>
+</ul>
+
+<p>The <a href="http://www.graphviz.org">official renderers</a> can be used as a command line tool to produce a graphic from the ‘.gv’ file</p>
+
+<h3 id="overview">Overview</h3>
+
+<p>The Graphviz generator is a convenient way to generate documentation diagrams
+for your API. Usage:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>thrift -r --gen gv tutorial.thrift
+</code></pre></div></div>
+
+<p>This will create the file <code class="language-plaintext highlighter-rouge">gen-gv/tutorial.gv</code>, which is a <a href="http://en.wikipedia.org/wiki/DOT_(graph_description_language)">Graphviz
+source</a> - a
+plain-text description language used for graphs (in this case, for IDL’s types
+and functions diagram). You will need to actually render those graphs into any
+of the supported output formats (e.g. PNG, PDFs, SVG, etc.) by using a Graphiz
+renderer in your platform.</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dot -Tpdf -otutorial.pdf gen-gv/tutorial.gv
+</code></pre></div></div>
+
+<h2 id="extra-options">Extra options</h2>
+
+<p>By default, the diagrams are not rendered with arrows from functions to
+exceptions (although the exception structures are displayed). You can set the
+generator to render those exceptions arrows (i.e. function throws) by using the
+“<code class="language-plaintext highlighter-rouge">exception</code>” option:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>thrift -r --gen:gv:exceptions gv tutorial.thrift
+</code></pre></div></div>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/haxe.html b/output/tutorial/haxe.html
new file mode 100644
index 0000000..1dc3530
--- /dev/null
+++ b/output/tutorial/haxe.html
@@ -0,0 +1,531 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Haxe Framework</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Haxe Framework Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen haxe tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+<ul>
+  <li>Thrift requires at least Haxe 3.1.3. (You may try with older versions on your own luck).</li>
+</ul>
+
+<h3 id="client">Client</h3>
+<p>For this tutorial, we put both the server and the client main code into one single program.
+Depending on the arguments passed, it runs as a server or as a client program.</p>
+
+<div class="highlight"><pre class="codehilite"><code>package;
+
+import org.apache.thrift.*;
+import org.apache.thrift.protocol.*;
+import org.apache.thrift.transport.*;
+import org.apache.thrift.server.*;
+import org.apache.thrift.meta_data.*;
+
+import tutorial.*;
+import shared.*;
+
+
+enum Prot {
+    binary;
+    json;
+}
+
+enum Trns {
+    socket;
+    http;
+}
+
+class Main {
+
+    private static var server : Bool = false;
+    private static var framed : Bool = false;
+    private static var buffered : Bool = false;
+    private static var prot : Prot = binary;
+    private static var trns : Trns = socket;
+
+    private static var targetHost : String = "localhost";
+    private static var targetPort : Int = 9090;
+
+    static function main() {
+
+        #if ! (flash || js || phpwebserver)
+        try {
+              ParseArgs();
+        } catch (e : String) {
+            trace(e);
+            trace(GetHelp());
+            return;
+        }
+
+        #elseif  phpwebserver
+        //forcing server
+        server = true;
+        trns = http;
+        initPhpWebServer();
+        //check method
+        if(php.Web.getMethod() != 'POST') {
+          Sys.println('http endpoint for thrift test server');
+          return;
+        }
+        #end
+
+        try {
+            if (server)
+                RunServer();
+            else
+                RunClient();
+        } catch (e : String) {
+            trace(e);
+        }
+
+        trace("Completed.");
+    }
+
+    #if phpwebserver
+    private static function initPhpWebServer()
+    {
+        //remap trace to error log
+        haxe.Log.trace = function(v:Dynamic, ?infos:haxe.PosInfos)
+        {
+          // handle trace
+          var newValue : Dynamic;
+          if (infos != null &amp;&amp; infos.customParams!=null) {
+            var extra:String = "";
+            for( v in infos.customParams )
+              extra += "," + v;
+            newValue = v + extra;
+          }
+          else {
+            newValue = v;
+          }
+          var msg = infos != null ? infos.fileName + ':' + infos.lineNumber + ': ' : '';
+          Sys.stderr().writeString('${msg}${newValue}\n');
+        }
+    }
+    #end
+
+
+    #if ! (flash || js)
+
+    private static function GetHelp() : String {
+        return Sys.executablePath()+"  modus  trnsOption  transport  protocol\n"
+        +"Options:\n"
+        +"  modus:       client, server   (default: client)\n"
+        +"  trnsOption:  framed, buffered (default: none)\n"
+        +"  transport:   socket, http     (default: socket)\n"
+        +"  protocol:    binary, json     (default: binary)\n"
+        +"\n"
+        +"All arguments are optional.\n";
+    }
+
+
+    private static function ParseArgs() : Void {
+        var step = 0;
+        for (arg in Sys.args()) {
+
+            // server|client
+            switch(step) {
+            case 0:
+                ++step;
+                if ( arg == "client")
+                    server = false;
+                else if ( arg == "server")
+                    server = true;
+                else
+                    throw "First argument must be 'server' or 'client'";
+
+            case 1:
+                if ( arg == "framed") {
+                    framed = true;
+                } else if ( arg == "buffered") {
+                    buffered = true;
+                } else if ( arg == "socket") {
+                    trns = socket;
+                    ++step;
+                } else if ( arg == "http") {
+                    trns = http;
+                    ++step;
+                } else {
+                    throw "Unknown transport "+arg;
+                }
+
+            case 2:
+                if ( arg == "binary") {
+                    prot = binary;
+                    ++step;
+                } else if ( arg == "json") {
+                    prot = json;
+                    ++step;
+                } else {
+                    throw "Unknown protocol "+arg;
+                }
+
+            default:
+                throw "Unexpected argument "+arg;
+            }
+
+            if ( framed &amp;&amp; buffered)
+            {
+                trace("WN: framed supersedes buffered");
+            }
+
+        }
+    }
+
+    #end
+
+    private static function ClientSetup() : Calculator {
+         trace("Client configuration:");
+
+        // endpoint transport
+        var transport : TTransport;
+        switch(trns)
+        {
+        case socket:
+             trace('- socket transport $targetHost:$targetPort');
+            transport = new TSocket( targetHost, targetPort);
+        case http:
+            var uri = 'http://${targetHost}:${targetPort}';
+            trace('- HTTP transport $uri');
+            transport = new THttpClient(uri);
+        default:
+            throw "Unhandled transport";
+        }
+
+
+        // optinal layered transport
+        if ( framed) {
+            trace("- framed transport");
+            transport = new TFramedTransport(transport);
+        } else if ( buffered) {
+            trace("- buffered transport");
+            transport = new TBufferedTransport(transport);
+        }
+
+
+        // protocol
+        var protocol : TProtocol;
+        switch(prot)
+        {
+        case binary:
+             trace("- binary protocol");
+             protocol = new TBinaryProtocol( transport);
+        case json:
+             trace("- JSON protocol");
+             protocol = new TJSONProtocol( transport);
+        default:
+            throw "Unhandled protocol";
+        }
+
+
+        // put everything together
+        transport.open();
+        return new CalculatorImpl(protocol,protocol);
+    }
+
+
+    private static function RunClient() : Void {
+        var client = ClientSetup();
+
+        try {
+              client.ping();
+            trace("ping() successful");
+        } catch(error : TException) {
+            trace('ping() failed: $error');
+        } catch(error : Dynamic) {
+            trace('ping() failed: $error');
+        }
+
+        try {
+            var sum = client.add( 1, 1);
+            trace('1+1=$sum');
+        } catch(error : TException) {
+            trace('add() failed: $error');
+        } catch(error : Dynamic) {
+            trace('add() failed: $error');
+        }
+
+
+        var work = new tutorial.Work();
+        work.op = tutorial.Operation.DIVIDE;
+        work.num1 = 1;
+        work.num2 = 0;
+        try {
+            var quotient = client.calculate( 1, work);
+            trace('Whoa we can divide by 0! Result = $quotient');
+        } catch(error : TException) {
+            trace('calculate() failed: $error');
+        } catch(error : Dynamic) {
+            trace('calculate() failed: $error');
+        }
+
+        work.op = tutorial.Operation.SUBTRACT;
+        work.num1 = 15;
+        work.num2 = 10;
+        try {
+            var diff = client.calculate( 1, work);
+            trace('15-10=$diff');
+        } catch(error : TException) {
+            trace('calculate() failed: $error');
+        } catch(error : Dynamic) {
+            trace('calculate() failed: $error');
+        }
+
+
+        try {
+            var log : SharedStruct = client.getStruct( 1);
+            var logval = log.value;
+            trace('Check log: $logval');
+        } catch(error : TException) {
+            trace('getStruct() failed: $error');
+        } catch(error : Dynamic) {
+            trace('getStruct() failed: $error');
+        }
+    }
+
+
+    private static function ServerSetup() : TServer {
+         trace("Server configuration:");
+
+        // endpoint transport
+        var transport : TServerTransport = null;
+        switch(trns)
+        {
+        case socket:
+            #if (flash || js)
+            throw 'current platform does not support socket servers';
+            #else
+             trace('- socket transport port $targetPort');
+            transport = new TServerSocket( targetPort);
+            #end
+        case http:
+            #if !phpwebserver
+              throw "HTTP server not implemented yet";
+              //trace("- http transport");
+              //transport = new THttpClient( targetHost);
+            #else
+              trace("- http transport");
+              transport = new TWrappingServerTransport(
+                      new TStreamTransport(
+                        new TFileStream("php://input", Read),
+                        new TFileStream("php://output", Append)
+                        )
+                      );
+
+            #end
+        default:
+            throw "Unhandled transport";
+        }
+
+        // optional: layered transport
+        var transfactory : TTransportFactory = null;
+        if ( framed) {
+            trace("- framed transport");
+            transfactory = new TFramedTransportFactory();
+        } else if ( buffered) {
+            trace("- buffered transport");
+            transfactory = new TBufferedTransportFactory();
+        }
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/haxe/src/Main.hx">tutorial/haxe/src/Main.hx</a>
+</p>
+
+<p>Were done with the client, but need some more for the server: A service handler implementaion.</p>
+
+<h3 id="server">Server</h3>
+<p>As the name suggests, the service handler implements the Thrift service on the server side.
+The code to achieve this is as follows:</p>
+
+<div class="highlight"><pre class="codehilite"><code>package;
+
+import haxe.ds.IntMap;
+
+import org.apache.thrift.*;
+import org.apache.thrift.protocol.*;
+import org.apache.thrift.transport.*;
+import org.apache.thrift.server.*;
+import org.apache.thrift.meta_data.*;
+
+import tutorial.*;
+import shared.*;
+
+
+class CalculatorHandler implements Calculator {
+
+    private var log = new IntMap&lt;SharedStruct&gt;();
+
+    public function new() {
+    }
+
+    public function ping() : Void {
+        trace("ping()");
+    }
+
+
+    public function add( num1 : haxe.Int32, num2 : haxe.Int32) : haxe.Int32 {
+        trace('add( $num1, $num2)');
+        return num1 + num2;
+    }
+
+    public function calculate( logid : haxe.Int32, work : Work) : haxe.Int32  {
+        trace('calculate( $logid, '+work.op+","+work.num1+","+work.num2+")");
+
+        var val : haxe.Int32 = 0;
+        switch (work.op)
+        {
+            case Operation.ADD:
+                val = work.num1 + work.num2;
+
+            case Operation.SUBTRACT:
+                val = work.num1 - work.num2;
+
+            case Operation.MULTIPLY:
+                val = work.num1 * work.num2;
+
+            case Operation.DIVIDE:
+                if (work.num2 == 0)
+                {
+                    var io = new InvalidOperation();
+                    io.whatOp = work.op;
+                    io.why = "Cannot divide by 0";
+                    throw io;
+                }
+                val = Std.int( work.num1 / work.num2);
+
+            default:
+                var io = new InvalidOperation();
+                io.whatOp = work.op;
+                io.why = "Unknown operation";
+                throw io;
+        }
+
+        var entry = new SharedStruct();
+        entry.key = logid;
+        entry.value = '$val';
+        log.set(logid, entry);
+
+        return val;
+    }
+
+    public function getStruct( key : haxe.Int32) : SharedStruct {
+        trace('getStruct($key)');
+        return log.get(key);
+    }
+
+    // oneway method,  no args
+    public function zip() : Void {
+        trace("zip()");
+    }
+
+}
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/haxe/src/CalculatorHandler.hx">tutorial/haxe/src/CalculatorHandler.hx</a>
+</p>
+
+<h3 id="additional-information">Additional Information</h3>
+
+<p>Similar to Thrift, Haxe supports different compiler targets. Depending on the target, some features
+may or may not be supported. For example, if you plan to use Flash or JavaScript targets,
+there is currently no way to pass command line arguments to the program.</p>
+
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/hs.html b/output/tutorial/hs.html
new file mode 100644
index 0000000..b7b3b01
--- /dev/null
+++ b/output/tutorial/hs.html
@@ -0,0 +1,259 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Haskell</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Haskell Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen hs tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="n">qualified</span> <span class="n">Calculator</span>
+<span class="n">import</span> <span class="n">qualified</span> <span class="n">Calculator_Client</span> <span class="n">as</span> <span class="n">Client</span>
+<span class="n">import</span> <span class="n">qualified</span> <span class="n">SharedService_Client</span> <span class="n">as</span> <span class="n">SClient</span>
+<span class="n">import</span> <span class="n">Tutorial_Types</span>
+<span class="n">import</span> <span class="n">SharedService_Iface</span>
+<span class="n">import</span> <span class="n">Shared_Types</span>
+
+<span class="n">import</span> <span class="n">Thrift</span>
+<span class="n">import</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span><span class="p">.</span><span class="n">Binary</span>
+<span class="n">import</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span>
+<span class="n">import</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span><span class="p">.</span><span class="n">Handle</span>
+<span class="n">import</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Server</span>
+
+<span class="n">import</span> <span class="n">Control</span><span class="p">.</span><span class="n">Exception</span>
+<span class="n">import</span> <span class="n">Data</span><span class="p">.</span><span class="n">Maybe</span>
+<span class="n">import</span> <span class="n">Data</span><span class="p">.</span><span class="n">Text</span><span class="p">.</span><span class="n">Lazy</span>
+<span class="n">import</span> <span class="n">Text</span><span class="p">.</span><span class="n">Printf</span>
+<span class="n">import</span> <span class="n">Network</span>
+
+<span class="n">main</span> <span class="o">=</span> <span class="k">do</span>
+  <span class="n">transport</span>  <span class="o">&lt;-</span> <span class="n">hOpen</span> <span class="p">(</span><span class="s">"localhost"</span><span class="p">,</span> <span class="n">PortNumber</span> <span class="mi">9090</span><span class="p">)</span>
+  <span class="n">let</span> <span class="n">binProto</span> <span class="o">=</span> <span class="n">BinaryProtocol</span> <span class="n">transport</span>
+  <span class="n">let</span> <span class="n">client</span> <span class="o">=</span> <span class="p">(</span><span class="n">binProto</span><span class="p">,</span> <span class="n">binProto</span><span class="p">)</span>
+
+  <span class="n">Client</span><span class="p">.</span><span class="n">ping</span> <span class="n">client</span>
+  <span class="n">print</span> <span class="s">"ping()"</span>
+
+  <span class="n">sum</span> <span class="o">&lt;-</span> <span class="n">Client</span><span class="p">.</span><span class="n">add</span> <span class="n">client</span> <span class="mi">1</span> <span class="mi">1</span>
+  <span class="n">printf</span> <span class="s">"1+1=%d</span><span class="se">\n</span><span class="s">"</span> <span class="n">sum</span>
+
+
+  <span class="n">let</span> <span class="n">work</span> <span class="o">=</span> <span class="n">Work</span> <span class="p">{</span> <span class="n">work_op</span> <span class="o">=</span> <span class="n">Operation_DIVIDE</span><span class="p">,</span>
+                    <span class="n">work_num1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
+                    <span class="n">work_num2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
+                    <span class="n">work_comment</span> <span class="o">=</span> <span class="n">Nothing</span>
+                  <span class="p">}</span>
+
+  <span class="n">Control</span><span class="p">.</span><span class="n">Exception</span><span class="p">.</span><span class="k">catch</span> <span class="p">(</span><span class="n">printf</span> <span class="s">"1/0=%d</span><span class="se">\n</span><span class="s">"</span> <span class="o">=&lt;&lt;</span> <span class="n">Client</span><span class="p">.</span><span class="n">calculate</span> <span class="n">client</span> <span class="mi">1</span> <span class="n">work</span><span class="p">)</span>
+        <span class="p">(</span><span class="err">\</span><span class="n">e</span> <span class="o">-&gt;</span> <span class="n">printf</span> <span class="s">"InvalidOperation %s</span><span class="se">\n</span><span class="s">"</span> <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">e</span> <span class="o">::</span> <span class="n">InvalidOperation</span><span class="p">)))</span>
+
+
+  <span class="n">let</span> <span class="n">work</span> <span class="o">=</span> <span class="n">Work</span> <span class="p">{</span> <span class="n">work_op</span> <span class="o">=</span> <span class="n">Operation_SUBTRACT</span><span class="p">,</span>
+                    <span class="n">work_num1</span> <span class="o">=</span> <span class="mi">15</span><span class="p">,</span>
+                    <span class="n">work_num2</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
+                    <span class="n">work_comment</span> <span class="o">=</span> <span class="n">Nothing</span>
+                  <span class="p">}</span>
+
+  <span class="n">diff</span> <span class="o">&lt;-</span> <span class="n">Client</span><span class="p">.</span><span class="n">calculate</span> <span class="n">client</span> <span class="mi">1</span> <span class="n">work</span>
+  <span class="n">printf</span> <span class="s">"15-10=%d</span><span class="se">\n</span><span class="s">"</span> <span class="n">diff</span>
+
+  <span class="n">log</span> <span class="o">&lt;-</span> <span class="n">SClient</span><span class="p">.</span><span class="n">getStruct</span> <span class="n">client</span> <span class="mi">1</span>
+  <span class="n">printf</span> <span class="s">"Check log: %s</span><span class="se">\n</span><span class="s">"</span> <span class="err">$</span> <span class="n">unpack</span> <span class="err">$</span> <span class="n">sharedStruct_value</span> <span class="n">log</span>
+
+  <span class="o">--</span> <span class="n">Close</span><span class="o">!</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/hs/HaskellClient.hs">tutorial/hs/HaskellClient.hs</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="p">{</span><span class="o">-</span><span class="err">#</span> <span class="n">LANGUAGE</span> <span class="n">OverloadedStrings</span> <span class="err">#</span><span class="o">-</span><span class="p">}</span>
+
+<span class="n">import</span> <span class="n">qualified</span> <span class="n">Calculator</span>
+<span class="n">import</span> <span class="n">Calculator_Iface</span>
+<span class="n">import</span> <span class="n">Tutorial_Types</span>
+<span class="n">import</span> <span class="n">SharedService_Iface</span>
+<span class="n">import</span> <span class="n">Shared_Types</span>
+
+<span class="n">import</span> <span class="n">Thrift</span>
+<span class="n">import</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span><span class="p">.</span><span class="n">Binary</span>
+<span class="n">import</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span>
+<span class="n">import</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Server</span>
+
+<span class="n">import</span> <span class="n">Data</span><span class="p">.</span><span class="n">Int</span>
+<span class="n">import</span> <span class="n">Data</span><span class="p">.</span><span class="n">String</span>
+<span class="n">import</span> <span class="n">Data</span><span class="p">.</span><span class="n">Maybe</span>
+<span class="n">import</span> <span class="n">Text</span><span class="p">.</span><span class="n">Printf</span>
+<span class="n">import</span> <span class="n">Control</span><span class="p">.</span><span class="n">Exception</span> <span class="p">(</span><span class="k">throw</span><span class="p">)</span>
+<span class="n">import</span> <span class="n">Control</span><span class="p">.</span><span class="n">Concurrent</span><span class="p">.</span><span class="n">MVar</span>
+<span class="n">import</span> <span class="n">qualified</span> <span class="n">Data</span><span class="p">.</span><span class="n">Map</span> <span class="n">as</span> <span class="n">M</span>
+<span class="n">import</span> <span class="n">Data</span><span class="p">.</span><span class="n">Map</span> <span class="p">((</span><span class="o">!</span><span class="p">))</span>
+<span class="n">import</span> <span class="n">Data</span><span class="p">.</span><span class="n">Monoid</span>
+
+<span class="n">data</span> <span class="n">CalculatorHandler</span> <span class="o">=</span> <span class="n">CalculatorHandler</span> <span class="p">{</span><span class="n">mathLog</span> <span class="o">::</span> <span class="n">MVar</span> <span class="p">(</span><span class="n">M</span><span class="p">.</span><span class="n">Map</span> <span class="n">Int32</span> <span class="n">SharedStruct</span><span class="p">)}</span>
+
+<span class="n">newCalculatorHandler</span> <span class="o">=</span> <span class="k">do</span>
+  <span class="n">log</span> <span class="o">&lt;-</span> <span class="n">newMVar</span> <span class="n">mempty</span>
+  <span class="k">return</span> <span class="err">$</span> <span class="n">CalculatorHandler</span> <span class="n">log</span>
+
+<span class="n">instance</span> <span class="n">SharedService_Iface</span> <span class="n">CalculatorHandler</span> <span class="n">where</span>
+  <span class="n">getStruct</span> <span class="n">self</span> <span class="n">k</span> <span class="o">=</span> <span class="k">do</span>
+    <span class="n">myLog</span> <span class="o">&lt;-</span> <span class="n">readMVar</span> <span class="p">(</span><span class="n">mathLog</span> <span class="n">self</span><span class="p">)</span>
+    <span class="k">return</span> <span class="err">$</span> <span class="p">(</span><span class="n">myLog</span> <span class="o">!</span> <span class="n">k</span><span class="p">)</span>
+
+
+<span class="n">instance</span> <span class="n">Calculator_Iface</span> <span class="n">CalculatorHandler</span> <span class="n">where</span>
+  <span class="n">ping</span> <span class="n">_</span> <span class="o">=</span>
+    <span class="n">print</span> <span class="s">"ping()"</span>
+
+  <span class="n">add</span> <span class="n">_</span> <span class="n">n1</span> <span class="n">n2</span> <span class="o">=</span> <span class="k">do</span>
+    <span class="n">printf</span> <span class="s">"add(%d,%d)</span><span class="se">\n</span><span class="s">"</span> <span class="n">n1</span> <span class="n">n2</span>
+    <span class="k">return</span> <span class="p">(</span><span class="n">n1</span> <span class="o">+</span> <span class="n">n2</span><span class="p">)</span>
+
+  <span class="n">calculate</span> <span class="n">self</span> <span class="n">mlogid</span> <span class="n">mwork</span> <span class="o">=</span> <span class="k">do</span>
+    <span class="n">printf</span> <span class="s">"calculate(%d, %s)</span><span class="se">\n</span><span class="s">"</span> <span class="n">logid</span> <span class="p">(</span><span class="n">show</span> <span class="n">work</span><span class="p">)</span>
+
+    <span class="n">let</span> <span class="n">val</span> <span class="o">=</span> <span class="k">case</span> <span class="n">op</span> <span class="n">work</span> <span class="n">of</span>
+                <span class="n">Operation_ADD</span> <span class="o">-&gt;</span>
+                    <span class="n">num1</span> <span class="n">work</span> <span class="o">+</span> <span class="n">num2</span> <span class="n">work</span>
+                <span class="n">Operation_SUBTRACT</span> <span class="o">-&gt;</span>
+                    <span class="n">num1</span> <span class="n">work</span> <span class="o">-</span> <span class="n">num2</span> <span class="n">work</span>
+                <span class="n">Operation_MULTIPLY</span> <span class="o">-&gt;</span>
+                    <span class="n">num1</span> <span class="n">work</span> <span class="o">*</span> <span class="n">num2</span> <span class="n">work</span>
+                <span class="n">Operation_DIVIDE</span> <span class="o">-&gt;</span>
+                    <span class="k">if</span> <span class="n">num2</span> <span class="n">work</span> <span class="o">==</span> <span class="mi">0</span> <span class="n">then</span>
+                        <span class="k">throw</span> <span class="err">$</span>
+                              <span class="n">InvalidOperation</span> <span class="err">{</span>
+                                 <span class="n">invalidOperation_whatOp</span> <span class="o">=</span> <span class="n">fromIntegral</span> <span class="err">$</span> <span class="n">fromEnum</span> <span class="err">$</span> <span class="n">op</span> <span class="n">work</span><span class="p">,</span>
+                                 <span class="n">invalidOperation_why</span> <span class="o">=</span> <span class="s">"Cannot divide by 0"</span>
+                                            <span class="err">}</span>
+                    <span class="k">else</span>
+                        <span class="n">num1</span> <span class="n">work</span> <span class="err">`</span><span class="n">div</span><span class="err">`</span> <span class="n">num2</span> <span class="n">work</span>
+
+    <span class="n">let</span> <span class="n">logEntry</span> <span class="o">=</span> <span class="n">SharedStruct</span> <span class="n">logid</span> <span class="p">(</span><span class="n">fromString</span> <span class="err">$</span> <span class="n">show</span> <span class="err">$</span> <span class="n">val</span><span class="p">)</span>
+    <span class="n">modifyMVar_</span> <span class="p">(</span><span class="n">mathLog</span> <span class="n">self</span><span class="p">)</span> <span class="err">$</span> <span class="k">return</span> <span class="p">.(</span><span class="n">M</span><span class="p">.</span><span class="n">insert</span> <span class="n">logid</span> <span class="n">logEntry</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="err">$</span><span class="o">!</span> <span class="n">val</span>
+
+   <span class="n">where</span>
+     <span class="o">--</span> <span class="n">stupid</span> <span class="n">dynamic</span> <span class="n">languages</span> <span class="n">f</span><span class="err">'</span><span class="n">ing</span> <span class="n">it</span> <span class="n">up</span>
+     <span class="n">num1</span> <span class="o">=</span> <span class="n">work_num1</span>
+     <span class="n">num2</span> <span class="o">=</span> <span class="n">work_num2</span>
+     <span class="n">op</span> <span class="o">=</span> <span class="n">work_op</span>
+     <span class="n">logid</span> <span class="o">=</span> <span class="n">mlogid</span>
+     <span class="n">work</span> <span class="o">=</span> <span class="n">mwork</span>
+
+  <span class="n">zip</span> <span class="n">_</span> <span class="o">=</span>
+    <span class="n">print</span> <span class="s">"zip()"</span>
+
+<span class="n">main</span> <span class="o">=</span>  <span class="k">do</span>
+  <span class="n">handler</span> <span class="o">&lt;-</span> <span class="n">newCalculatorHandler</span>
+  <span class="n">print</span> <span class="s">"Starting the server..."</span>
+  <span class="n">runBasicServer</span> <span class="n">handler</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">process</span> <span class="mi">9090</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/hs/HaskellServer.hs">tutorial/hs/HaskellServer.hs</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/index.html b/output/tutorial/index.html
new file mode 100644
index 0000000..eea1a41
--- /dev/null
+++ b/output/tutorial/index.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Index of tutorial/</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2 id="apache-thrift-tutorial">Apache Thrift Tutorial</h2>
+
+<ul>
+  <li>
+    <h3 id="download-apache-thrift">Download Apache Thrift</h3>
+    <p>To get started, <a href="/download">download</a> a copy of Thrift.</p>
+  </li>
+  <li>
+    <h3 id="build-and-install-the-apache-thrift-compiler-and-libraries">Build and Install the Apache Thrift compiler and libraries</h3>
+    <p>You will then need to build the Apache Thrift compiler and libraries.</p>
+
+    <p>./configure &amp;&amp; make</p>
+  </li>
+</ul>
+
+<p>This will also compile the tutorial client and server for several languages.
+See the <a href="/docs/BuildingFromSource">Building from source</a> guide for any help with this step.</p>
+
+<ul>
+  <li>
+    <h3 id="writing-a-thrift-file">Writing a .thrift file</h3>
+    <p>After the Thrift compiler is installed you will need to create a .thrift file. This file is an <a href="/docs/idl">interface definition</a> made up of <a href="/docs/types">thrift types</a> and Services. The services you define in this file are implemented by the server and are called by any clients.</p>
+  </li>
+  <li>
+    <h3 id="generate-thrift-file-to-source-code">Generate Thrift file to source code</h3>
+    <p>The Thrift compiler is used to generate your Thrift file into source code which is used by the different client libraries and the server you write. To generate the source from a Thrift file run</p>
+
+    <p>thrift –gen <language> <Thrift filename=""></Thrift></language></p>
+  </li>
+</ul>
+
+<p>To recursivly generate source code from a Thrift file and all other Thrift files included by it, run</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>thrift -r --gen &lt;language&gt; &lt;Thrift filename&gt;
+</code></pre></div></div>
+
+<p>The sample <a href="https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob_plain;f=tutorial/tutorial.thrift">tutorial.thrift</a>
+file defines a basic calculator service. This sample calculator service .thrift file includes another file called
+<a href="https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob_plain;f=tutorial/shared.thrift">shared.thrift</a>.
+Both files will be used to demonstrate how to build a Thrift client and server pair.</p>
+
+<h2 id="examples-clients-and-servers">Examples Clients and Servers</h2>
+
+<ul>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/tutorial/as3.html">Actionscript 3.0</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/c_glib.html">c_glib</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/tutorial/cpp.html">C++</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/csharp.html">CSharp</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/d.html">D</a></li>
+
+
+
+  <li><a href="/tutorial/dart.html">Dart</a></li>
+
+
+
+
+
+
+
+  <li><a href="/tutorial/delphi.html">Delphi</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/tutorial/go.html">Go</a></li>
+
+
+
+  <li><a href="/tutorial/graphviz.html">Graphviz</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/haxe.html">Haxe Framework</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/hs.html">Haskell</a></li>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  <li><a href="/tutorial/java.html">Java</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/js.html">Javascript</a></li>
+
+
+
+
+
+
+
+
+
+  <li><a href="/tutorial/netstd.html">.NET Standard</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/nodejs.html">Node.js</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/ocaml.html">OCaml</a></li>
+
+
+
+
+
+
+
+  <li><a href="/tutorial/perl.html">Perl</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/php.html">PHP</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/py.html">Python</a></li>
+
+
+
+
+
+  <li><a href="/tutorial/rb.html">Ruby</a></li>
+
+
+
+
+
+
+
+
+
+
+</ul>
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/java.html b/output/tutorial/java.html
new file mode 100644
index 0000000..56a73ee
--- /dev/null
+++ b/output/tutorial/java.html
@@ -0,0 +1,437 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Java</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Java Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen java tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cm">/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */</span>
+
+<span class="c1">// Generated code</span>
+<span class="kn">import</span> <span class="nn">tutorial.*</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">shared.*</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">org.apache.thrift.TException</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.transport.TSSLTransportFactory</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.transport.TTransport</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.transport.TSocket</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.transport.TSSLTransportFactory.TSSLTransportParameters</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.protocol.TBinaryProtocol</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.protocol.TProtocol</span><span class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">JavaClient</span> <span class="o">{</span>
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span> <span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
+
+    <span class="k">if</span> <span class="o">(</span><span class="n">args</span><span class="o">.</span><span class="na">length</span> <span class="o">!=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">{</span>
+      <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Please enter 'simple' or 'secure'"</span><span class="o">);</span>
+      <span class="nc">System</span><span class="o">.</span><span class="na">exit</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
+    <span class="o">}</span>
+
+    <span class="k">try</span> <span class="o">{</span>
+      <span class="nc">TTransport</span> <span class="n">transport</span><span class="o">;</span>
+      <span class="k">if</span> <span class="o">(</span><span class="n">args</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">contains</span><span class="o">(</span><span class="s">"simple"</span><span class="o">))</span> <span class="o">{</span>
+        <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TSocket</span><span class="o">(</span><span class="s">"localhost"</span><span class="o">,</span> <span class="mi">9090</span><span class="o">);</span>
+        <span class="n">transport</span><span class="o">.</span><span class="na">open</span><span class="o">();</span>
+      <span class="o">}</span>
+      <span class="k">else</span> <span class="o">{</span>
+        <span class="cm">/*
+         * Similar to the server, you can use the parameters to setup client parameters or
+         * use the default settings. On the client side, you will need a TrustStore which
+         * contains the trusted certificate along with the public key. 
+         * For this example it's a self-signed cert. 
+         */</span>
+        <span class="nc">TSSLTransportParameters</span> <span class="n">params</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TSSLTransportParameters</span><span class="o">();</span>
+        <span class="n">params</span><span class="o">.</span><span class="na">setTrustStore</span><span class="o">(</span><span class="s">"../../lib/java/test/.truststore"</span><span class="o">,</span> <span class="s">"thrift"</span><span class="o">,</span> <span class="s">"SunX509"</span><span class="o">,</span> <span class="s">"JKS"</span><span class="o">);</span>
+        <span class="cm">/*
+         * Get a client transport instead of a server transport. The connection is opened on
+         * invocation of the factory method, no need to specifically call open()
+         */</span>
+        <span class="n">transport</span> <span class="o">=</span> <span class="nc">TSSLTransportFactory</span><span class="o">.</span><span class="na">getClientSocket</span><span class="o">(</span><span class="s">"localhost"</span><span class="o">,</span> <span class="mi">9091</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">params</span><span class="o">);</span>
+      <span class="o">}</span>
+
+      <span class="nc">TProtocol</span> <span class="n">protocol</span> <span class="o">=</span> <span class="k">new</span>  <span class="nc">TBinaryProtocol</span><span class="o">(</span><span class="n">transport</span><span class="o">);</span>
+      <span class="nc">Calculator</span><span class="o">.</span><span class="na">Client</span> <span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Calculator</span><span class="o">.</span><span class="na">Client</span><span class="o">(</span><span class="n">protocol</span><span class="o">);</span>
+
+      <span class="n">perform</span><span class="o">(</span><span class="n">client</span><span class="o">);</span>
+
+      <span class="n">transport</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
+    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">TException</span> <span class="n">x</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">x</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
+    <span class="o">}</span> 
+  <span class="o">}</span>
+
+  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">perform</span><span class="o">(</span><span class="nc">Calculator</span><span class="o">.</span><span class="na">Client</span> <span class="n">client</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">TException</span>
+  <span class="o">{</span>
+    <span class="n">client</span><span class="o">.</span><span class="na">ping</span><span class="o">();</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"ping()"</span><span class="o">);</span>
+
+    <span class="kt">int</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span><span class="mi">1</span><span class="o">);</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"1+1="</span> <span class="o">+</span> <span class="n">sum</span><span class="o">);</span>
+
+    <span class="nc">Work</span> <span class="n">work</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Work</span><span class="o">();</span>
+
+    <span class="n">work</span><span class="o">.</span><span class="na">op</span> <span class="o">=</span> <span class="nc">Operation</span><span class="o">.</span><span class="na">DIVIDE</span><span class="o">;</span>
+    <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span>
+    <span class="n">work</span><span class="o">.</span><span class="na">num2</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
+    <span class="k">try</span> <span class="o">{</span>
+      <span class="kt">int</span> <span class="n">quotient</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">calculate</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="n">work</span><span class="o">);</span>
+      <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Whoa we can divide by 0"</span><span class="o">);</span>
+    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">InvalidOperation</span> <span class="n">io</span><span class="o">)</span> <span class="o">{</span>
+      <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Invalid operation: "</span> <span class="o">+</span> <span class="n">io</span><span class="o">.</span><span class="na">why</span><span class="o">);</span>
+    <span class="o">}</span>
+
+    <span class="n">work</span><span class="o">.</span><span class="na">op</span> <span class="o">=</span> <span class="nc">Operation</span><span class="o">.</span><span class="na">SUBTRACT</span><span class="o">;</span>
+    <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">=</span> <span class="mi">15</span><span class="o">;</span>
+    <span class="n">work</span><span class="o">.</span><span class="na">num2</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span>
+    <span class="k">try</span> <span class="o">{</span>
+      <span class="kt">int</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">calculate</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="n">work</span><span class="o">);</span>
+      <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"15-10="</span> <span class="o">+</span> <span class="n">diff</span><span class="o">);</span>
+    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">InvalidOperation</span> <span class="n">io</span><span class="o">)</span> <span class="o">{</span>
+      <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Invalid operation: "</span> <span class="o">+</span> <span class="n">io</span><span class="o">.</span><span class="na">why</span><span class="o">);</span>
+    <span class="o">}</span>
+
+    <span class="nc">SharedStruct</span> <span class="n">log</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">getStruct</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Check log: "</span> <span class="o">+</span> <span class="n">log</span><span class="o">.</span><span class="na">value</span><span class="o">);</span>
+  <span class="o">}</span>
+<span class="o">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/java/src/JavaClient.java">tutorial/java/src/JavaClient.java</a>
+</p>
+
+<h3 id="calculatorhandler">CalculatorHandler</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cm">/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */</span>
+
+<span class="kn">import</span> <span class="nn">org.apache.thrift.TException</span><span class="o">;</span>
+
+<span class="c1">// Generated code</span>
+<span class="kn">import</span> <span class="nn">tutorial.*</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">shared.*</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">java.util.HashMap</span><span class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">CalculatorHandler</span> <span class="kd">implements</span> <span class="nc">Calculator</span><span class="o">.</span><span class="na">Iface</span> <span class="o">{</span>
+
+  <span class="kd">private</span> <span class="nc">HashMap</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span><span class="nc">SharedStruct</span><span class="o">&gt;</span> <span class="n">log</span><span class="o">;</span>
+
+  <span class="kd">public</span> <span class="nf">CalculatorHandler</span><span class="o">()</span> <span class="o">{</span>
+    <span class="n">log</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashMap</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">,</span> <span class="nc">SharedStruct</span><span class="o">&gt;();</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">ping</span><span class="o">()</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"ping()"</span><span class="o">);</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kt">int</span> <span class="nf">add</span><span class="o">(</span><span class="kt">int</span> <span class="n">n1</span><span class="o">,</span> <span class="kt">int</span> <span class="n">n2</span><span class="o">)</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"add("</span> <span class="o">+</span> <span class="n">n1</span> <span class="o">+</span> <span class="s">","</span> <span class="o">+</span> <span class="n">n2</span> <span class="o">+</span> <span class="s">")"</span><span class="o">);</span>
+    <span class="k">return</span> <span class="n">n1</span> <span class="o">+</span> <span class="n">n2</span><span class="o">;</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kt">int</span> <span class="nf">calculate</span><span class="o">(</span><span class="kt">int</span> <span class="n">logid</span><span class="o">,</span> <span class="nc">Work</span> <span class="n">work</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">InvalidOperation</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"calculate("</span> <span class="o">+</span> <span class="n">logid</span> <span class="o">+</span> <span class="s">", {"</span> <span class="o">+</span> <span class="n">work</span><span class="o">.</span><span class="na">op</span> <span class="o">+</span> <span class="s">","</span> <span class="o">+</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">+</span> <span class="s">","</span> <span class="o">+</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span> <span class="o">+</span> <span class="s">"})"</span><span class="o">);</span>
+    <span class="kt">int</span> <span class="n">val</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
+    <span class="k">switch</span> <span class="o">(</span><span class="n">work</span><span class="o">.</span><span class="na">op</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">case</span> <span class="nl">ADD:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">+</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span><span class="o">;</span>
+      <span class="k">break</span><span class="o">;</span>
+    <span class="k">case</span> <span class="nl">SUBTRACT:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">-</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span><span class="o">;</span>
+      <span class="k">break</span><span class="o">;</span>
+    <span class="k">case</span> <span class="nl">MULTIPLY:</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">*</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span><span class="o">;</span>
+      <span class="k">break</span><span class="o">;</span>
+    <span class="k">case</span> <span class="nl">DIVIDE:</span>
+      <span class="k">if</span> <span class="o">(</span><span class="n">work</span><span class="o">.</span><span class="na">num2</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
+        <span class="nc">InvalidOperation</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InvalidOperation</span><span class="o">();</span>
+        <span class="n">io</span><span class="o">.</span><span class="na">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">op</span><span class="o">.</span><span class="na">getValue</span><span class="o">();</span>
+        <span class="n">io</span><span class="o">.</span><span class="na">why</span> <span class="o">=</span> <span class="s">"Cannot divide by 0"</span><span class="o">;</span>
+        <span class="k">throw</span> <span class="n">io</span><span class="o">;</span>
+      <span class="o">}</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">num1</span> <span class="o">/</span> <span class="n">work</span><span class="o">.</span><span class="na">num2</span><span class="o">;</span>
+      <span class="k">break</span><span class="o">;</span>
+    <span class="k">default</span><span class="o">:</span>
+      <span class="nc">InvalidOperation</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InvalidOperation</span><span class="o">();</span>
+      <span class="n">io</span><span class="o">.</span><span class="na">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="o">.</span><span class="na">op</span><span class="o">.</span><span class="na">getValue</span><span class="o">();</span>
+      <span class="n">io</span><span class="o">.</span><span class="na">why</span> <span class="o">=</span> <span class="s">"Unknown operation"</span><span class="o">;</span>
+      <span class="k">throw</span> <span class="n">io</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="nc">SharedStruct</span> <span class="n">entry</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SharedStruct</span><span class="o">();</span>
+    <span class="n">entry</span><span class="o">.</span><span class="na">key</span> <span class="o">=</span> <span class="n">logid</span><span class="o">;</span>
+    <span class="n">entry</span><span class="o">.</span><span class="na">value</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">val</span><span class="o">);</span>
+    <span class="n">log</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">logid</span><span class="o">,</span> <span class="n">entry</span><span class="o">);</span>
+
+    <span class="k">return</span> <span class="n">val</span><span class="o">;</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="nc">SharedStruct</span> <span class="nf">getStruct</span><span class="o">(</span><span class="kt">int</span> <span class="n">key</span><span class="o">)</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"getStruct("</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s">")"</span><span class="o">);</span>
+    <span class="k">return</span> <span class="n">log</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">key</span><span class="o">);</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">zip</span><span class="o">()</span> <span class="o">{</span>
+    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"zip()"</span><span class="o">);</span>
+  <span class="o">}</span>
+
+<span class="o">}</span>
+
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/java/src/CalculatorHandler.java">tutorial/java/src/CalculatorHandler.java</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cm">/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */</span>
+
+<span class="kn">import</span> <span class="nn">org.apache.thrift.server.TServer</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.server.TServer.Args</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.server.TSimpleServer</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.server.TThreadPoolServer</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.transport.TSSLTransportFactory</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.transport.TServerSocket</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.transport.TServerTransport</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.thrift.transport.TSSLTransportFactory.TSSLTransportParameters</span><span class="o">;</span>
+
+<span class="c1">// Generated code</span>
+<span class="kn">import</span> <span class="nn">tutorial.*</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">shared.*</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">java.util.HashMap</span><span class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">JavaServer</span> <span class="o">{</span>
+
+  <span class="kd">public</span> <span class="kd">static</span> <span class="nc">CalculatorHandler</span> <span class="n">handler</span><span class="o">;</span>
+
+  <span class="kd">public</span> <span class="kd">static</span> <span class="nc">Calculator</span><span class="o">.</span><span class="na">Processor</span> <span class="n">processor</span><span class="o">;</span>
+
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span> <span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">try</span> <span class="o">{</span>
+      <span class="n">handler</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">CalculatorHandler</span><span class="o">();</span>
+      <span class="n">processor</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Calculator</span><span class="o">.</span><span class="na">Processor</span><span class="o">(</span><span class="n">handler</span><span class="o">);</span>
+
+      <span class="nc">Runnable</span> <span class="n">simple</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Runnable</span><span class="o">()</span> <span class="o">{</span>
+        <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
+          <span class="n">simple</span><span class="o">(</span><span class="n">processor</span><span class="o">);</span>
+        <span class="o">}</span>
+      <span class="o">};</span>      
+      <span class="nc">Runnable</span> <span class="n">secure</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Runnable</span><span class="o">()</span> <span class="o">{</span>
+        <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
+          <span class="n">secure</span><span class="o">(</span><span class="n">processor</span><span class="o">);</span>
+        <span class="o">}</span>
+      <span class="o">};</span>
+
+      <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">simple</span><span class="o">).</span><span class="na">start</span><span class="o">();</span>
+      <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="n">secure</span><span class="o">).</span><span class="na">start</span><span class="o">();</span>
+    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">x</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">x</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">simple</span><span class="o">(</span><span class="nc">Calculator</span><span class="o">.</span><span class="na">Processor</span> <span class="n">processor</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">try</span> <span class="o">{</span>
+      <span class="nc">TServerTransport</span> <span class="n">serverTransport</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TServerSocket</span><span class="o">(</span><span class="mi">9090</span><span class="o">);</span>
+      <span class="nc">TServer</span> <span class="n">server</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TSimpleServer</span><span class="o">(</span><span class="k">new</span> <span class="nc">Args</span><span class="o">(</span><span class="n">serverTransport</span><span class="o">).</span><span class="na">processor</span><span class="o">(</span><span class="n">processor</span><span class="o">));</span>
+
+      <span class="c1">// Use this for a multithreaded server</span>
+      <span class="c1">// TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));</span>
+
+      <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Starting the simple server..."</span><span class="o">);</span>
+      <span class="n">server</span><span class="o">.</span><span class="na">serve</span><span class="o">();</span>
+    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">secure</span><span class="o">(</span><span class="nc">Calculator</span><span class="o">.</span><span class="na">Processor</span> <span class="n">processor</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">try</span> <span class="o">{</span>
+      <span class="cm">/*
+       * Use TSSLTransportParameters to setup the required SSL parameters. In this example
+       * we are setting the keystore and the keystore password. Other things like algorithms,
+       * cipher suites, client auth etc can be set. 
+       */</span>
+      <span class="nc">TSSLTransportParameters</span> <span class="n">params</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TSSLTransportParameters</span><span class="o">();</span>
+      <span class="c1">// The Keystore contains the private key</span>
+      <span class="n">params</span><span class="o">.</span><span class="na">setKeyStore</span><span class="o">(</span><span class="s">"../../lib/java/test/.keystore"</span><span class="o">,</span> <span class="s">"thrift"</span><span class="o">,</span> <span class="kc">null</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
+
+      <span class="cm">/*
+       * Use any of the TSSLTransportFactory to get a server transport with the appropriate
+       * SSL configuration. You can use the default settings if properties are set in the command line.
+       * Ex: -Djavax.net.ssl.keyStore=.keystore and -Djavax.net.ssl.keyStorePassword=thrift
+       * 
+       * Note: You need not explicitly call open(). The underlying server socket is bound on return
+       * from the factory class. 
+       */</span>
+      <span class="nc">TServerTransport</span> <span class="n">serverTransport</span> <span class="o">=</span> <span class="nc">TSSLTransportFactory</span><span class="o">.</span><span class="na">getServerSocket</span><span class="o">(</span><span class="mi">9091</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="kc">null</span><span class="o">,</span> <span class="n">params</span><span class="o">);</span>
+      <span class="nc">TServer</span> <span class="n">server</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TSimpleServer</span><span class="o">(</span><span class="k">new</span> <span class="nc">Args</span><span class="o">(</span><span class="n">serverTransport</span><span class="o">).</span><span class="na">processor</span><span class="o">(</span><span class="n">processor</span><span class="o">));</span>
+
+      <span class="c1">// Use this for a multi threaded server</span>
+      <span class="c1">// TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));</span>
+
+      <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Starting the secure server..."</span><span class="o">);</span>
+      <span class="n">server</span><span class="o">.</span><span class="na">serve</span><span class="o">();</span>
+    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+<span class="o">}</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/java/src/JavaServer.java">tutorial/java/src/JavaServer.java</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/js.html b/output/tutorial/js.html
new file mode 100644
index 0000000..8d9e845
--- /dev/null
+++ b/output/tutorial/js.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Javascript</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Javascript Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen js tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<ul>
+  <li>This tutorial depends on an existing Thrift server. See either the <a href="/tutorial/java">Java tutorial</a> or <a href="/tutorial/nodejs">node.js tutorial</a> for how to build and setup one of these servers. Out of the box, a Thrift HTTP server using the JSON protocol is expected. To learn more about how to use other transports and/or protocols refer to the “Additional Information” section below.</li>
+</ul>
+
+<h3 id="client">Client</h3>
+
+<pre><code class="language-js">
+function calc() {
+  var transport = new Thrift.Transport("/thrift/service/tutorial/");
+  var protocol  = new Thrift.Protocol(transport);
+  var client    = new CalculatorClient(protocol);
+
+  var work = new Work()
+  work.num1 = $("#num1").val();
+  work.num2 = $("#num2").val();
+  work.op = $("#op").val();
+
+  try {
+    result = client.calculate(1, work);
+    $('#result').val(result);
+    $('#result').css('color', 'black');
+  } catch(ouch){
+    $('#result').val(ouch.why);
+    $('#result').css('color', 'red');
+  }
+}
+</code></pre>
+
+<h3 id="server">Server</h3>
+
+<p>Use either the <a href="/tutorial/java">Java tutorial</a> or <a href="/tutorial/cpp">C++ tutorial</a> server</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+<h3 id="inspecting-the-generated-javascript-code-and-html-code">Inspecting the generated Javascript code and HTML code</h3>
+
+<p>Inside the html file is the entry point of using the Thrift.js and compiled Javascript files. The main section code from the tutorial.html file is the Thrift client as shown above.</p>
+
+<p>The first thing for using the Thrift files is setting up your Transport protocol. At this time, it only supports AJAX and is as follows:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var transport = new Thrift.Transport("/thrift/service/tutorial/");
+</code></pre></div></div>
+
+<p>After that the protocol needs setup using the transport object, which for Javascript is JSON:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var protocol  = new Thrift.Protocol(transport);
+</code></pre></div></div>
+
+<p>Now we are setup for the full Thrift communications, so we can start instantiating the Thrift objects, which define our Services and Objects.</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var client    = new CalculatorClient(protocol);
+</code></pre></div></div>
+
+<p>Now that we have a functional Service Interface object created, we can can setup the JSON object, which gets is needed by the service routine and gets passed to it:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var work = new Work()
+work.num1 = $("#num1").val();
+work.num2 = $("#num2").val();
+work.op = $("#op").val();
+</code></pre></div></div>
+
+<p>Once the object is created, we can now pass</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>try {
+    result = client.calculate(1, work);
+    //etc......
+</code></pre></div></div>
+
+<p>Now, when the calculate button on the html page is clicked, the calc() function as defined above is called and we get an AJAX call, which blocks and waits for the response. This then updates the result from the calculation.</p>
+
+<h3 id="inspecting-the-generated-tutorial_typesjs-file">Inspecting the generated tutorial_types.js file</h3>
+
+<p>Each Thrift struct will have properties associated with it.  For our tutorial object, Work, this is as shown above. For example:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var work = new Work();
+work.num1 = 1;
+work.num2 = 2;
+work.op = ADD;
+</code></pre></div></div>
+
+<p>In addition, there is a read(input) and write(output) function created on the object as well. For the end user, these are not functions to be used as they are mainly just used by the Thrift.js file for accessing objects.</p>
+
+<h3 id="inspecting-the-generated-calculatorjs-file">Inspecting the generated Calculator.js file</h3>
+<p>The Calculator.js file is the services created and defined in the .thrift file. The two services defined are:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>i32 add(1:i32 num1, 2:i32 num2),
+i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
+</code></pre></div></div>
+
+<p>To start using this, the Calculator object has to be created and accessed as shown above. The Javascript Object, whichi is your interface to the services created looks like this:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CalculatorClient = function(input, output){}
+</code></pre></div></div>
+
+<p>Then, to access your defined services, the functions created look like this:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CalculatorClient.prototype.add = function(num1, num2) {}
+</code></pre></div></div>
+
+<p>and</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CalculatorClient.prototype.calculate = function(logid, w) {}
+</code></pre></div></div>
+
+<p>Unfortunately, the Javascript object isn’t just called Calculator and there are a lot of other functions defined as well, but how those are used are out of the scope of this tutorial.</p>
+
+<h3 id="inspecting-the-thriftjs-file">Inspecting the Thrift.js file</h3>
+
+<ul>
+  <li>The main goal of the library is to define the Transport and Protocol layers.</li>
+  <li>The Transport layer can use AJAX or WebSockets.</li>
+  <li>The Protocol layer handles the encoding/decoding to JSON or Binary format.</li>
+  <li>There are also the Thrift object types and call functions defined here as well.</li>
+  <li>The Thrift.js library can use jQuery.js if provided.</li>
+</ul>
+
+<h4 id="jquery-api">jQuery API</h4>
+
+<p>jQuery aware JS source files can generated using the <em>jquery</em> compiler option:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>thrift --gen js:jquery tutorial.thrift
+</code></pre></div></div>
+
+<p>This does not change the default behavior of the library, i.e. service calls will be done synchronously. However, services will use jQuery.ajax if a callback function is provided as showed below.</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>client.calculate(1, work, function(result) { alert(result); } );
+</code></pre></div></div>
+
+<p>This method call will immediately return but the callback function (and its <em>alert</em> message) will be called as soon as a response is received from the server. The service call also returns a jqXHR object, which has more callback options:</p>
+
+<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>client.calculate(1, work, function(){} )
+.fail( function(jqXHR, status, error) {  alert(error.message); } )
+.done( function(result) { /* success! do something */ } )
+.always( function() { /* do something more */ } );
+</code></pre></div></div>
+
+<p>For more information refer to the <a href="http://api.jquery.com/jquery.ajax/">jQuery API documentation</a>.</p>
+
+<p>Note: Synchronously calls are easy to debug and good for testing but should not be used on a front-end browser in production, as it will normally result on a full browser freeze until the response has returned from the server.</p>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/netstd.html b/output/tutorial/netstd.html
new file mode 100644
index 0000000..687f8b6
--- /dev/null
+++ b/output/tutorial/netstd.html
@@ -0,0 +1,875 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - .NET Standard</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>.NET Standard Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen netstd tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="k">using</span> <span class="n">System</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Collections</span><span class="p">.</span><span class="n">Generic</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Linq</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Net</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Net</span><span class="p">.</span><span class="n">Security</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Security</span><span class="p">.</span><span class="n">Cryptography</span><span class="p">.</span><span class="n">X509Certificates</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Threading</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Threading</span><span class="p">.</span><span class="n">Tasks</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span class="p">.</span><span class="n">Extensions</span><span class="p">.</span><span class="n">Logging</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span><span class="p">.</span><span class="n">Client</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">tutorial</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">shared</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span class="p">.</span><span class="n">Extensions</span><span class="p">.</span><span class="n">DependencyInjection</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Diagnostics</span><span class="p">;</span>
+
+<span class="k">namespace</span> <span class="n">Client</span>
+<span class="p">{</span>
+    <span class="k">public</span> <span class="k">class</span> <span class="nc">Program</span>
+    <span class="p">{</span>
+        <span class="k">private</span> <span class="k">static</span> <span class="n">ServiceCollection</span> <span class="n">ServiceCollection</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ServiceCollection</span><span class="p">();</span>
+        <span class="k">private</span> <span class="k">static</span> <span class="n">ILogger</span> <span class="n">Logger</span><span class="p">;</span>
+        <span class="k">private</span> <span class="k">static</span> <span class="n">readonly</span> <span class="n">TConfiguration</span> <span class="n">Configuration</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>  <span class="c1">// new TConfiguration() if  needed</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">DisplayHelp</span><span class="p">()</span>
+        <span class="p">{</span>
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">@</span><span class="s">"</span><span class="err">
+</span><span class="s">Usage: </span><span class="err">
+</span><span class="s">    Client -help</span><span class="err">
+</span><span class="s">        will diplay help information </span><span class="err">
+
+</span><span class="s">    Client -tr:&lt;transport&gt; -bf:&lt;buffering&gt; -pr:&lt;protocol&gt; -mc:&lt;numClients&gt;</span><span class="err">
+</span><span class="s">        will run client with specified arguments (tcp transport and binary protocol by default) and with 1 client</span><span class="err">
+
+</span><span class="s">Options:</span><span class="err">
+</span><span class="s">    -tr (transport): </span><span class="err">
+</span><span class="s">        tcp - (default) tcp transport will be used (host - ""localhost"", port - 9090)</span><span class="err">
+</span><span class="s">        namedpipe - namedpipe transport will be used (pipe address - "".test"")</span><span class="err">
+</span><span class="s">        http - http transport will be used (address - ""http://localhost:9090"")        </span><span class="err">
+</span><span class="s">        tcptls - tcp tls transport will be used (host - ""localhost"", port - 9090)</span><span class="err">
+
+</span><span class="s">    -bf (buffering): </span><span class="err">
+</span><span class="s">        none - (default) no buffering will be used</span><span class="err">
+</span><span class="s">        buffered - buffered transport will be used</span><span class="err">
+</span><span class="s">        framed - framed transport will be used</span><span class="err">
+
+</span><span class="s">    -pr (protocol): </span><span class="err">
+</span><span class="s">        binary - (default) binary protocol will be used</span><span class="err">
+</span><span class="s">        compact - compact protocol will be used</span><span class="err">
+</span><span class="s">        json - json protocol will be used</span><span class="err">
+</span><span class="s">        multiplexed - multiplexed protocol will be used</span><span class="err">
+
+</span><span class="s">    -mc (multiple clients):</span><span class="err">
+</span><span class="s">        &lt;numClients&gt; - number of multiple clients to connect to server (max 100, default 1)</span><span class="err">
+
+</span><span class="s">Sample:</span><span class="err">
+</span><span class="s">    Client -tr:tcp -pr:binary</span><span class="err">
+</span><span class="s">"</span><span class="p">);</span>
+        <span class="p">}</span>
+
+        <span class="k">public</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">Main</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="o">??</span> <span class="k">new</span> <span class="n">string</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
+
+            <span class="n">ServiceCollection</span><span class="p">.</span><span class="n">AddLogging</span><span class="p">(</span><span class="n">logging</span> <span class="o">=&gt;</span> <span class="n">ConfigureLogging</span><span class="p">(</span><span class="n">logging</span><span class="p">));</span>
+            <span class="k">using</span> <span class="p">(</span><span class="n">var</span> <span class="n">serviceProvider</span> <span class="o">=</span> <span class="n">ServiceCollection</span><span class="p">.</span><span class="n">BuildServiceProvider</span><span class="p">())</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span> <span class="o">=</span> <span class="n">serviceProvider</span><span class="p">.</span><span class="n">GetService</span><span class="o">&lt;</span><span class="n">ILoggerFactory</span><span class="o">&gt;</span><span class="p">().</span><span class="n">CreateLogger</span><span class="p">(</span><span class="n">nameof</span><span class="p">(</span><span class="n">Client</span><span class="p">));</span>
+
+                <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">Any</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-help"</span><span class="p">,</span> <span class="n">StringComparison</span><span class="p">.</span><span class="n">OrdinalIgnoreCase</span><span class="p">)))</span>
+                <span class="p">{</span>
+                    <span class="n">DisplayHelp</span><span class="p">();</span>
+                    <span class="k">return</span><span class="p">;</span>
+                <span class="p">}</span>
+
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"Starting client..."</span><span class="p">);</span>
+
+                <span class="k">using</span> <span class="p">(</span><span class="n">var</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CancellationTokenSource</span><span class="p">())</span>
+                <span class="p">{</span>
+                    <span class="n">RunAsync</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">source</span><span class="p">.</span><span class="n">Token</span><span class="p">).</span><span class="n">GetAwaiter</span><span class="p">().</span><span class="n">GetResult</span><span class="p">();</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">ConfigureLogging</span><span class="p">(</span><span class="n">ILoggingBuilder</span> <span class="n">logging</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">logging</span><span class="p">.</span><span class="n">SetMinimumLevel</span><span class="p">(</span><span class="n">LogLevel</span><span class="p">.</span><span class="n">Trace</span><span class="p">);</span>
+            <span class="n">logging</span><span class="p">.</span><span class="n">AddConsole</span><span class="p">();</span>
+            <span class="n">logging</span><span class="p">.</span><span class="n">AddDebug</span><span class="p">();</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">async</span> <span class="n">Task</span> <span class="n">RunAsync</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">,</span> <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">numClients</span> <span class="o">=</span> <span class="n">GetNumberOfClients</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"Selected # of clients: {numClients}"</span><span class="p">);</span>
+
+            <span class="n">var</span> <span class="n">transports</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TTransport</span><span class="p">[</span><span class="n">numClients</span><span class="p">];</span>
+            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">numClients</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">t</span> <span class="o">=</span> <span class="n">GetTransport</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
+                <span class="n">transports</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">t</span><span class="p">;</span>
+            <span class="p">}</span>
+            
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"Selected client transport: {transports[0]}"</span><span class="p">);</span>
+
+            <span class="n">var</span> <span class="n">protocols</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Tuple</span><span class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">&gt;</span><span class="p">[</span><span class="n">numClients</span><span class="p">];</span>
+            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">numClients</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">p</span> <span class="o">=</span> <span class="n">GetProtocol</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">transports</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
+                <span class="n">protocols</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"Selected client protocol: {protocols[0].Item1}"</span><span class="p">);</span>
+
+            <span class="n">var</span> <span class="n">tasks</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Task</span><span class="p">[</span><span class="n">numClients</span><span class="p">];</span>
+            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">numClients</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">task</span> <span class="o">=</span> <span class="n">RunClientAsync</span><span class="p">(</span><span class="n">protocols</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">cancellationToken</span><span class="p">);</span>
+                <span class="n">tasks</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">task</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">Task</span><span class="p">.</span><span class="n">WaitAll</span><span class="p">(</span><span class="n">tasks</span><span class="p">);</span>
+
+            <span class="n">await</span> <span class="n">Task</span><span class="p">.</span><span class="n">CompletedTask</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">TTransport</span> <span class="n">GetTransport</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">TTransport</span> <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TSocketTransport</span><span class="p">(</span><span class="n">IPAddress</span><span class="p">.</span><span class="n">Loopback</span><span class="p">,</span> <span class="mi">9090</span><span class="p">,</span> <span class="n">Configuration</span><span class="p">);</span>
+
+            <span class="c1">// construct endpoint transport</span>
+            <span class="n">var</span> <span class="n">transportArg</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-tr"</span><span class="p">))</span><span class="o">?</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="sc">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
+            <span class="k">if</span> <span class="p">(</span><span class="n">Enum</span><span class="p">.</span><span class="n">TryParse</span><span class="p">(</span><span class="n">transportArg</span><span class="p">,</span> <span class="nb">true</span><span class="p">,</span> <span class="n">out</span> <span class="n">Transport</span> <span class="n">selectedTransport</span><span class="p">))</span>
+            <span class="p">{</span>
+                <span class="k">switch</span> <span class="p">(</span><span class="n">selectedTransport</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="k">case</span> <span class="n">Transport</span><span class="p">.</span><span class="n">Tcp</span><span class="p">:</span>
+                        <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TSocketTransport</span><span class="p">(</span><span class="n">IPAddress</span><span class="p">.</span><span class="n">Loopback</span><span class="p">,</span> <span class="mi">9090</span><span class="p">,</span> <span class="n">Configuration</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="k">case</span> <span class="n">Transport</span><span class="p">.</span><span class="n">NamedPipe</span><span class="p">:</span>
+                        <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TNamedPipeTransport</span><span class="p">(</span><span class="s">".test"</span><span class="p">,</span> <span class="n">Configuration</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="k">case</span> <span class="n">Transport</span><span class="p">.</span><span class="n">Http</span><span class="p">:</span>
+                        <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">THttpTransport</span><span class="p">(</span><span class="k">new</span> <span class="n">Uri</span><span class="p">(</span><span class="s">"http://localhost:9090"</span><span class="p">),</span> <span class="n">Configuration</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="k">case</span> <span class="n">Transport</span><span class="p">.</span><span class="n">TcpTls</span><span class="p">:</span>
+                        <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TTlsSocketTransport</span><span class="p">(</span><span class="n">IPAddress</span><span class="p">.</span><span class="n">Loopback</span><span class="p">,</span> <span class="mi">9090</span><span class="p">,</span> <span class="n">Configuration</span><span class="p">,</span>
+                            <span class="n">GetCertificate</span><span class="p">(),</span> <span class="n">CertValidator</span><span class="p">,</span> <span class="n">LocalCertificateSelectionCallback</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="nl">default:</span>
+                        <span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="nb">false</span><span class="p">,</span> <span class="s">"unhandled case"</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+
+            <span class="c1">// optionally add layered transport(s)</span>
+            <span class="n">var</span> <span class="n">bufferingArg</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-bf"</span><span class="p">))</span><span class="o">?</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="sc">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
+            <span class="k">if</span> <span class="p">(</span><span class="n">Enum</span><span class="p">.</span><span class="n">TryParse</span><span class="o">&lt;</span><span class="n">Buffering</span><span class="o">&gt;</span><span class="p">(</span><span class="n">bufferingArg</span><span class="p">,</span> <span class="n">out</span> <span class="n">var</span> <span class="n">selectedBuffering</span><span class="p">))</span>
+            <span class="p">{</span>
+                <span class="k">switch</span> <span class="p">(</span><span class="n">selectedBuffering</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="k">case</span> <span class="n">Buffering</span><span class="p">.</span><span class="n">Buffered</span><span class="p">:</span>
+                        <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBufferedTransport</span><span class="p">(</span><span class="n">transport</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="k">case</span> <span class="n">Buffering</span><span class="p">.</span><span class="n">Framed</span><span class="p">:</span>
+                        <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TFramedTransport</span><span class="p">(</span><span class="n">transport</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="nl">default:</span> <span class="c1">// layered transport(s) are optional</span>
+                        <span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">selectedBuffering</span> <span class="o">==</span> <span class="n">Buffering</span><span class="p">.</span><span class="n">None</span><span class="p">,</span> <span class="s">"unhandled case"</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+
+            <span class="k">return</span> <span class="n">transport</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="kt">int</span> <span class="n">GetNumberOfClients</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">numClients</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-mc"</span><span class="p">))</span><span class="o">?</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="sc">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"Selected # of clients: {numClients}"</span><span class="p">);</span>
+
+            <span class="kt">int</span> <span class="n">c</span><span class="p">;</span>
+            <span class="k">if</span><span class="p">(</span> <span class="kt">int</span><span class="p">.</span><span class="n">TryParse</span><span class="p">(</span><span class="n">numClients</span><span class="p">,</span> <span class="n">out</span> <span class="n">c</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="mi">0</span> <span class="o">&lt;</span> <span class="n">c</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">c</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">))</span>
+				<span class="k">return</span> <span class="n">c</span><span class="p">;</span>
+			<span class="k">else</span>
+				<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">X509Certificate2</span> <span class="n">GetCertificate</span><span class="p">()</span>
+        <span class="p">{</span>
+            <span class="c1">// due to files location in net core better to take certs from top folder</span>
+            <span class="n">var</span> <span class="n">certFile</span> <span class="o">=</span> <span class="n">GetCertPath</span><span class="p">(</span><span class="n">Directory</span><span class="p">.</span><span class="n">GetParent</span><span class="p">(</span><span class="n">Directory</span><span class="p">.</span><span class="n">GetCurrentDirectory</span><span class="p">()));</span>
+            <span class="k">return</span> <span class="k">new</span> <span class="n">X509Certificate2</span><span class="p">(</span><span class="n">certFile</span><span class="p">,</span> <span class="s">"ThriftTest"</span><span class="p">);</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">string</span> <span class="n">GetCertPath</span><span class="p">(</span><span class="n">DirectoryInfo</span> <span class="n">di</span><span class="p">,</span> <span class="kt">int</span> <span class="n">maxCount</span> <span class="o">=</span> <span class="mi">6</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">topDir</span> <span class="o">=</span> <span class="n">di</span><span class="p">;</span>
+            <span class="n">var</span> <span class="n">certFile</span> <span class="o">=</span>
+                <span class="n">topDir</span><span class="p">.</span><span class="n">EnumerateFiles</span><span class="p">(</span><span class="s">"ThriftTest.pfx"</span><span class="p">,</span> <span class="n">SearchOption</span><span class="p">.</span><span class="n">AllDirectories</span><span class="p">)</span>
+                    <span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">();</span>
+            <span class="k">if</span> <span class="p">(</span><span class="n">certFile</span> <span class="o">==</span> <span class="n">null</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">if</span> <span class="p">(</span><span class="n">maxCount</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
+                    <span class="k">throw</span> <span class="k">new</span> <span class="n">FileNotFoundException</span><span class="p">(</span><span class="s">"Cannot find file in directories"</span><span class="p">);</span>
+                <span class="k">return</span> <span class="n">GetCertPath</span><span class="p">(</span><span class="n">di</span><span class="p">.</span><span class="n">Parent</span><span class="p">,</span> <span class="n">maxCount</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
+            <span class="p">}</span>
+
+            <span class="k">return</span> <span class="n">certFile</span><span class="p">.</span><span class="n">FullName</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">X509Certificate</span> <span class="n">LocalCertificateSelectionCallback</span><span class="p">(</span><span class="n">object</span> <span class="n">sender</span><span class="p">,</span>
+            <span class="n">string</span> <span class="n">targetHost</span><span class="p">,</span> <span class="n">X509CertificateCollection</span> <span class="n">localCertificates</span><span class="p">,</span>
+            <span class="n">X509Certificate</span> <span class="n">remoteCertificate</span><span class="p">,</span> <span class="n">string</span><span class="p">[]</span> <span class="n">acceptableIssuers</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="k">return</span> <span class="n">GetCertificate</span><span class="p">();</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="kt">bool</span> <span class="n">CertValidator</span><span class="p">(</span><span class="n">object</span> <span class="n">sender</span><span class="p">,</span> <span class="n">X509Certificate</span> <span class="n">certificate</span><span class="p">,</span>
+            <span class="n">X509Chain</span> <span class="n">chain</span><span class="p">,</span> <span class="n">SslPolicyErrors</span> <span class="n">sslPolicyErrors</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">Tuple</span><span class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">&gt;</span> <span class="n">GetProtocol</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">,</span> <span class="n">TTransport</span> <span class="n">transport</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">protocol</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-pr"</span><span class="p">))</span><span class="o">?</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="sc">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
+
+            <span class="n">Protocol</span> <span class="n">selectedProtocol</span><span class="p">;</span>
+            <span class="k">if</span> <span class="p">(</span><span class="n">Enum</span><span class="p">.</span><span class="n">TryParse</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="nb">true</span><span class="p">,</span> <span class="n">out</span> <span class="n">selectedProtocol</span><span class="p">))</span>
+            <span class="p">{</span>
+                <span class="k">switch</span> <span class="p">(</span><span class="n">selectedProtocol</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="k">case</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Binary</span><span class="p">:</span>
+                        <span class="k">return</span> <span class="k">new</span> <span class="n">Tuple</span><span class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">&gt;</span><span class="p">(</span><span class="n">selectedProtocol</span><span class="p">,</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">));</span>
+                    <span class="k">case</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Compact</span><span class="p">:</span>
+                        <span class="k">return</span> <span class="k">new</span> <span class="n">Tuple</span><span class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">&gt;</span><span class="p">(</span><span class="n">selectedProtocol</span><span class="p">,</span> <span class="k">new</span> <span class="n">TCompactProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">));</span>
+                    <span class="k">case</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Json</span><span class="p">:</span>
+                        <span class="k">return</span> <span class="k">new</span> <span class="n">Tuple</span><span class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">&gt;</span><span class="p">(</span><span class="n">selectedProtocol</span><span class="p">,</span> <span class="k">new</span> <span class="n">TJsonProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">));</span>
+                    <span class="k">case</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Multiplexed</span><span class="p">:</span>
+                        <span class="c1">// it returns BinaryProtocol to avoid making wrapped protocol as public in TProtocolDecorator (in RunClientAsync it will be wrapped into Multiplexed protocol)</span>
+                        <span class="k">return</span> <span class="k">new</span> <span class="n">Tuple</span><span class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">&gt;</span><span class="p">(</span><span class="n">selectedProtocol</span><span class="p">,</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">));</span>
+                    <span class="nl">default:</span>
+                        <span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="nb">false</span><span class="p">,</span> <span class="s">"unhandled case"</span><span class="p">);</span>
+                        <span class="k">break</span><span class="p">;</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+
+            <span class="k">return</span> <span class="k">new</span> <span class="n">Tuple</span><span class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">&gt;</span><span class="p">(</span><span class="n">selectedProtocol</span><span class="p">,</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">));</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">async</span> <span class="n">Task</span> <span class="n">RunClientAsync</span><span class="p">(</span><span class="n">Tuple</span><span class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">&gt;</span> <span class="n">protocolTuple</span><span class="p">,</span> <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="k">try</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">protocol</span> <span class="o">=</span> <span class="n">protocolTuple</span><span class="p">.</span><span class="n">Item2</span><span class="p">;</span>
+                <span class="n">var</span> <span class="n">protocolType</span> <span class="o">=</span> <span class="n">protocolTuple</span><span class="p">.</span><span class="n">Item1</span><span class="p">;</span>
+
+                <span class="n">TBaseClient</span> <span class="n">client</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>
+
+                <span class="k">try</span>
+                <span class="p">{</span>
+                    <span class="k">if</span> <span class="p">(</span><span class="n">protocolType</span> <span class="o">!=</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Multiplexed</span><span class="p">)</span>
+                    <span class="p">{</span>
+
+                        <span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">Client</span><span class="p">(</span><span class="n">protocol</span><span class="p">);</span>
+                        <span class="n">await</span> <span class="n">ExecuteCalculatorClientOperations</span><span class="p">(</span><span class="n">cancellationToken</span><span class="p">,</span> <span class="p">(</span><span class="n">Calculator</span><span class="p">.</span><span class="n">Client</span><span class="p">)</span><span class="n">client</span><span class="p">);</span>
+                    <span class="p">}</span>
+                    <span class="k">else</span>
+                    <span class="p">{</span>
+                        <span class="c1">// it uses binary protocol there  to create Multiplexed protocols</span>
+                        <span class="n">var</span> <span class="n">multiplex</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TMultiplexedProtocol</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="n">nameof</span><span class="p">(</span><span class="n">Calculator</span><span class="p">));</span>
+                        <span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">Client</span><span class="p">(</span><span class="n">multiplex</span><span class="p">);</span>
+                        <span class="n">await</span> <span class="n">ExecuteCalculatorClientOperations</span><span class="p">(</span><span class="n">cancellationToken</span><span class="p">,</span> <span class="p">(</span><span class="n">Calculator</span><span class="p">.</span><span class="n">Client</span><span class="p">)</span><span class="n">client</span><span class="p">);</span>
+
+                        <span class="n">multiplex</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TMultiplexedProtocol</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="n">nameof</span><span class="p">(</span><span class="n">SharedService</span><span class="p">));</span>
+                        <span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SharedService</span><span class="p">.</span><span class="n">Client</span><span class="p">(</span><span class="n">multiplex</span><span class="p">);</span>
+                        <span class="n">await</span> <span class="n">ExecuteSharedServiceClientOperations</span><span class="p">(</span><span class="n">cancellationToken</span><span class="p">,</span> <span class="p">(</span><span class="n">SharedService</span><span class="p">.</span><span class="n">Client</span><span class="p">)</span><span class="n">client</span><span class="p">);</span>
+                    <span class="p">}</span>
+                <span class="p">}</span>
+                <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">ex</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="n">Logger</span><span class="p">.</span><span class="n">LogError</span><span class="p">(</span><span class="err">$</span><span class="s">"{client?.ClientId} "</span> <span class="o">+</span> <span class="n">ex</span><span class="p">);</span>
+                <span class="p">}</span>
+                <span class="n">finally</span>
+                <span class="p">{</span>
+                    <span class="n">protocol</span><span class="p">.</span><span class="n">Transport</span><span class="p">.</span><span class="n">Close</span><span class="p">();</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+            <span class="k">catch</span> <span class="p">(</span><span class="n">TApplicationException</span> <span class="n">x</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogError</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">ToString</span><span class="p">());</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">async</span> <span class="n">Task</span> <span class="n">ExecuteCalculatorClientOperations</span><span class="p">(</span><span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">,</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">Client</span> <span class="n">client</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">await</span> <span class="n">client</span><span class="p">.</span><span class="n">OpenTransportAsync</span><span class="p">(</span><span class="n">cancellationToken</span><span class="p">);</span>
+
+            <span class="c1">// Async version</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"{client.ClientId} PingAsync()"</span><span class="p">);</span>
+            <span class="n">await</span> <span class="n">client</span><span class="p">.</span><span class="n">pingAsync</span><span class="p">(</span><span class="n">cancellationToken</span><span class="p">);</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"{client.ClientId} AddAsync(1,1)"</span><span class="p">);</span>
+            <span class="n">var</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">await</span> <span class="n">client</span><span class="p">.</span><span class="n">addAsync</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">cancellationToken</span><span class="p">);</span>
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"{client.ClientId} AddAsync(1,1)={sum}"</span><span class="p">);</span>
+
+            <span class="n">var</span> <span class="n">work</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Work</span>
+            <span class="p">{</span>
+                <span class="n">Op</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span><span class="p">,</span>
+                <span class="n">Num1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
+                <span class="n">Num2</span> <span class="o">=</span> <span class="mi">0</span>
+            <span class="p">};</span>
+
+            <span class="k">try</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"{client.ClientId} CalculateAsync(1)"</span><span class="p">);</span>
+                <span class="n">await</span> <span class="n">client</span><span class="p">.</span><span class="n">calculateAsync</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">,</span> <span class="n">cancellationToken</span><span class="p">);</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"{client.ClientId} Whoa we can divide by 0"</span><span class="p">);</span>
+            <span class="p">}</span>
+            <span class="k">catch</span> <span class="p">(</span><span class="n">InvalidOperation</span> <span class="n">io</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"{client.ClientId} Invalid operation: "</span> <span class="o">+</span> <span class="n">io</span><span class="p">);</span>
+            <span class="p">}</span>
+
+            <span class="n">work</span><span class="p">.</span><span class="n">Op</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span><span class="p">;</span>
+            <span class="n">work</span><span class="p">.</span><span class="n">Num1</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/netstd/Client/Program.cs">tutorial/netstd/Client/Program.cs</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="k">using</span> <span class="n">System</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Collections</span><span class="p">.</span><span class="n">Generic</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Linq</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Net</span><span class="p">.</span><span class="n">Security</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Security</span><span class="p">.</span><span class="n">Cryptography</span><span class="p">.</span><span class="n">X509Certificates</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Threading</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Threading</span><span class="p">.</span><span class="n">Tasks</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span class="p">.</span><span class="n">AspNetCore</span><span class="p">.</span><span class="n">Builder</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span class="p">.</span><span class="n">AspNetCore</span><span class="p">.</span><span class="n">Hosting</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span class="p">.</span><span class="n">Extensions</span><span class="p">.</span><span class="n">Configuration</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span class="p">.</span><span class="n">Extensions</span><span class="p">.</span><span class="n">DependencyInjection</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span class="p">.</span><span class="n">Extensions</span><span class="p">.</span><span class="n">Logging</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Server</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Transport</span><span class="p">.</span><span class="n">Server</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">tutorial</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">shared</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Processor</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Diagnostics</span><span class="p">;</span>
+
+<span class="k">namespace</span> <span class="n">Server</span>
+<span class="p">{</span>
+    <span class="k">public</span> <span class="k">class</span> <span class="nc">Program</span>
+    <span class="p">{</span>
+        <span class="k">private</span> <span class="k">static</span> <span class="n">ServiceCollection</span> <span class="n">ServiceCollection</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ServiceCollection</span><span class="p">();</span>
+        <span class="k">private</span> <span class="k">static</span> <span class="n">ILogger</span> <span class="n">Logger</span><span class="p">;</span>
+        <span class="k">private</span> <span class="k">static</span> <span class="n">readonly</span> <span class="n">TConfiguration</span> <span class="n">Configuration</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>  <span class="c1">// new TConfiguration() if  needed</span>
+
+        <span class="k">public</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">Main</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">args</span> <span class="o">=</span> <span class="n">args</span> <span class="o">??</span> <span class="k">new</span> <span class="n">string</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
+
+            <span class="n">ServiceCollection</span><span class="p">.</span><span class="n">AddLogging</span><span class="p">(</span><span class="n">logging</span> <span class="o">=&gt;</span> <span class="n">ConfigureLogging</span><span class="p">(</span><span class="n">logging</span><span class="p">));</span>
+            <span class="k">using</span> <span class="p">(</span><span class="n">var</span> <span class="n">serviceProvider</span> <span class="o">=</span> <span class="n">ServiceCollection</span><span class="p">.</span><span class="n">BuildServiceProvider</span><span class="p">())</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span> <span class="o">=</span> <span class="n">serviceProvider</span><span class="p">.</span><span class="n">GetService</span><span class="o">&lt;</span><span class="n">ILoggerFactory</span><span class="o">&gt;</span><span class="p">().</span><span class="n">CreateLogger</span><span class="p">(</span><span class="n">nameof</span><span class="p">(</span><span class="n">Server</span><span class="p">));</span>
+
+                <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">Any</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-help"</span><span class="p">,</span> <span class="n">StringComparison</span><span class="p">.</span><span class="n">OrdinalIgnoreCase</span><span class="p">)))</span>
+                <span class="p">{</span>
+                    <span class="n">DisplayHelp</span><span class="p">();</span>
+                    <span class="k">return</span><span class="p">;</span>
+                <span class="p">}</span>
+
+                <span class="k">using</span> <span class="p">(</span><span class="n">var</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CancellationTokenSource</span><span class="p">())</span>
+                <span class="p">{</span>
+                    <span class="n">RunAsync</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">source</span><span class="p">.</span><span class="n">Token</span><span class="p">).</span><span class="n">GetAwaiter</span><span class="p">().</span><span class="n">GetResult</span><span class="p">();</span>
+
+                    <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"Press any key to stop..."</span><span class="p">);</span>
+
+                    <span class="n">Console</span><span class="p">.</span><span class="n">ReadLine</span><span class="p">();</span>
+                    <span class="n">source</span><span class="p">.</span><span class="n">Cancel</span><span class="p">();</span>
+                <span class="p">}</span>
+
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"Server stopped"</span><span class="p">);</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">ConfigureLogging</span><span class="p">(</span><span class="n">ILoggingBuilder</span> <span class="n">logging</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">logging</span><span class="p">.</span><span class="n">SetMinimumLevel</span><span class="p">(</span><span class="n">LogLevel</span><span class="p">.</span><span class="n">Trace</span><span class="p">);</span>
+            <span class="n">logging</span><span class="p">.</span><span class="n">AddConsole</span><span class="p">();</span>
+            <span class="n">logging</span><span class="p">.</span><span class="n">AddDebug</span><span class="p">();</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">DisplayHelp</span><span class="p">()</span>
+        <span class="p">{</span>
+            <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">@</span><span class="s">"</span><span class="err">
+</span><span class="s">Usage: </span><span class="err">
+</span><span class="s">    Server -help</span><span class="err">
+</span><span class="s">        will diplay help information </span><span class="err">
+
+</span><span class="s">    Server -tr:&lt;transport&gt; -bf:&lt;buffering&gt; -pr:&lt;protocol&gt;</span><span class="err">
+</span><span class="s">        will run server with specified arguments (tcp transport, no buffering, and binary protocol by default)</span><span class="err">
+
+</span><span class="s">Options:</span><span class="err">
+</span><span class="s">    -tr (transport): </span><span class="err">
+</span><span class="s">        tcp - (default) tcp transport will be used (host - ""localhost"", port - 9090)</span><span class="err">
+</span><span class="s">        namedpipe - namedpipe transport will be used (pipe address - "".test"")</span><span class="err">
+</span><span class="s">        http - http transport will be used (http address - ""localhost:9090"")</span><span class="err">
+</span><span class="s">        tcptls - tcp transport with tls will be used (host - ""localhost"", port - 9090)</span><span class="err">
+
+</span><span class="s">    -bf (buffering): </span><span class="err">
+</span><span class="s">        none - (default) no buffering will be used</span><span class="err">
+</span><span class="s">        buffered - buffered transport will be used</span><span class="err">
+</span><span class="s">        framed - framed transport will be used</span><span class="err">
+
+</span><span class="s">    -pr (protocol): </span><span class="err">
+</span><span class="s">        binary - (default) binary protocol will be used</span><span class="err">
+</span><span class="s">        compact - compact protocol will be used</span><span class="err">
+</span><span class="s">        json - json protocol will be used</span><span class="err">
+</span><span class="s">        multiplexed - multiplexed protocol will be used</span><span class="err">
+
+</span><span class="s">Sample:</span><span class="err">
+</span><span class="s">    Server -tr:tcp</span><span class="err">
+</span><span class="s">"</span><span class="p">);</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">async</span> <span class="n">Task</span> <span class="n">RunAsync</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">,</span> <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">selectedTransport</span> <span class="o">=</span> <span class="n">GetTransport</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
+            <span class="n">var</span> <span class="n">selectedBuffering</span> <span class="o">=</span> <span class="n">GetBuffering</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
+            <span class="n">var</span> <span class="n">selectedProtocol</span> <span class="o">=</span> <span class="n">GetProtocol</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
+
+            <span class="k">if</span> <span class="p">(</span><span class="n">selectedTransport</span> <span class="o">==</span> <span class="n">Transport</span><span class="p">.</span><span class="n">Http</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">new</span> <span class="n">HttpServerSample</span><span class="p">().</span><span class="n">Run</span><span class="p">(</span><span class="n">cancellationToken</span><span class="p">);</span>
+            <span class="p">}</span>
+            <span class="k">else</span>
+            <span class="p">{</span>
+                <span class="n">await</span> <span class="n">RunSelectedConfigurationAsync</span><span class="p">(</span><span class="n">selectedTransport</span><span class="p">,</span> <span class="n">selectedBuffering</span><span class="p">,</span> <span class="n">selectedProtocol</span><span class="p">,</span> <span class="n">cancellationToken</span><span class="p">);</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">Protocol</span> <span class="n">GetProtocol</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">transport</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-pr"</span><span class="p">))</span><span class="o">?</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="sc">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
+
+            <span class="n">Enum</span><span class="p">.</span><span class="n">TryParse</span><span class="p">(</span><span class="n">transport</span><span class="p">,</span> <span class="nb">true</span><span class="p">,</span> <span class="n">out</span> <span class="n">Protocol</span> <span class="n">selectedProtocol</span><span class="p">);</span>
+
+            <span class="k">return</span> <span class="n">selectedProtocol</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">Buffering</span> <span class="n">GetBuffering</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">buffering</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-bf"</span><span class="p">))</span><span class="o">?</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="s">":"</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
+
+            <span class="n">Enum</span><span class="p">.</span><span class="n">TryParse</span><span class="o">&lt;</span><span class="n">Buffering</span><span class="o">&gt;</span><span class="p">(</span><span class="n">buffering</span><span class="p">,</span> <span class="n">out</span> <span class="n">var</span> <span class="n">selectedBuffering</span><span class="p">);</span>
+
+            <span class="k">return</span> <span class="n">selectedBuffering</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">Transport</span> <span class="n">GetTransport</span><span class="p">(</span><span class="n">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">transport</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-tr"</span><span class="p">))</span><span class="o">?</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="sc">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
+
+            <span class="n">Enum</span><span class="p">.</span><span class="n">TryParse</span><span class="p">(</span><span class="n">transport</span><span class="p">,</span> <span class="nb">true</span><span class="p">,</span> <span class="n">out</span> <span class="n">Transport</span> <span class="n">selectedTransport</span><span class="p">);</span>
+
+            <span class="k">return</span> <span class="n">selectedTransport</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">async</span> <span class="n">Task</span> <span class="n">RunSelectedConfigurationAsync</span><span class="p">(</span><span class="n">Transport</span> <span class="n">transport</span><span class="p">,</span> <span class="n">Buffering</span> <span class="n">buffering</span><span class="p">,</span> <span class="n">Protocol</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">handler</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CalculatorAsyncHandler</span><span class="p">();</span>
+
+            <span class="n">TServerTransport</span> <span class="n">serverTransport</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>
+            <span class="k">switch</span> <span class="p">(</span><span class="n">transport</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">case</span> <span class="n">Transport</span><span class="p">.</span><span class="n">Tcp</span><span class="p">:</span>
+                    <span class="n">serverTransport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TServerSocketTransport</span><span class="p">(</span><span class="mi">9090</span><span class="p">,</span> <span class="n">Configuration</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span class="n">Transport</span><span class="p">.</span><span class="n">NamedPipe</span><span class="p">:</span>
+                    <span class="n">serverTransport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TNamedPipeServerTransport</span><span class="p">(</span><span class="s">".test"</span><span class="p">,</span> <span class="n">Configuration</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span class="n">Transport</span><span class="p">.</span><span class="n">TcpTls</span><span class="p">:</span>
+                    <span class="n">serverTransport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TTlsServerSocketTransport</span><span class="p">(</span><span class="mi">9090</span><span class="p">,</span> <span class="n">Configuration</span><span class="p">,</span>
+                        <span class="n">GetCertificate</span><span class="p">(),</span> <span class="n">ClientCertValidator</span><span class="p">,</span> <span class="n">LocalCertificateSelectionCallback</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">TTransportFactory</span> <span class="n">inputTransportFactory</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>
+            <span class="n">TTransportFactory</span> <span class="n">outputTransportFactory</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>
+            <span class="k">switch</span> <span class="p">(</span><span class="n">buffering</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">case</span> <span class="n">Buffering</span><span class="p">.</span><span class="n">Buffered</span><span class="p">:</span>
+                    <span class="n">inputTransportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBufferedTransport</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputTransportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBufferedTransport</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="k">break</span><span class="p">;</span>
+
+                <span class="k">case</span> <span class="n">Buffering</span><span class="p">.</span><span class="n">Framed</span><span class="p">:</span>
+                    <span class="n">inputTransportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TFramedTransport</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputTransportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TFramedTransport</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="k">break</span><span class="p">;</span>
+
+                <span class="nl">default:</span> <span class="c1">// layered transport(s) are optional</span>
+                    <span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">buffering</span> <span class="o">==</span> <span class="n">Buffering</span><span class="p">.</span><span class="n">None</span><span class="p">,</span> <span class="s">"unhandled case"</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">TProtocolFactory</span> <span class="n">inputProtocolFactory</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>
+            <span class="n">TProtocolFactory</span> <span class="n">outputProtocolFactory</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>
+            <span class="n">ITAsyncProcessor</span> <span class="n">processor</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span>
+            <span class="k">switch</span> <span class="p">(</span><span class="n">protocol</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">case</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Binary</span><span class="p">:</span>
+                    <span class="n">inputProtocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputProtocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">processor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">AsyncProcessor</span><span class="p">(</span><span class="n">handler</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+
+                <span class="k">case</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Compact</span><span class="p">:</span>
+                    <span class="n">inputProtocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TCompactProtocol</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputProtocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TCompactProtocol</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">processor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">AsyncProcessor</span><span class="p">(</span><span class="n">handler</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+
+                <span class="k">case</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Json</span><span class="p">:</span>
+                    <span class="n">inputProtocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TJsonProtocol</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputProtocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TJsonProtocol</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">processor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">AsyncProcessor</span><span class="p">(</span><span class="n">handler</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+
+                <span class="k">case</span> <span class="n">Protocol</span><span class="p">.</span><span class="n">Multiplexed</span><span class="p">:</span>
+                    <span class="n">inputProtocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputProtocolFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span>
+
+                    <span class="n">var</span> <span class="n">calcHandler</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CalculatorAsyncHandler</span><span class="p">();</span>
+                    <span class="n">var</span> <span class="n">calcProcessor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">AsyncProcessor</span><span class="p">(</span><span class="n">calcHandler</span><span class="p">);</span>
+
+                    <span class="n">var</span> <span class="n">sharedServiceHandler</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SharedServiceAsyncHandler</span><span class="p">();</span>
+                    <span class="n">var</span> <span class="n">sharedServiceProcessor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SharedService</span><span class="p">.</span><span class="n">AsyncProcessor</span><span class="p">(</span><span class="n">sharedServiceHandler</span><span class="p">);</span>
+
+                    <span class="n">var</span> <span class="n">multiplexedProcessor</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TMultiplexedProcessor</span><span class="p">();</span>
+                    <span class="n">multiplexedProcessor</span><span class="p">.</span><span class="n">RegisterProcessor</span><span class="p">(</span><span class="n">nameof</span><span class="p">(</span><span class="n">Calculator</span><span class="p">),</span> <span class="n">calcProcessor</span><span class="p">);</span>
+                    <span class="n">multiplexedProcessor</span><span class="p">.</span><span class="n">RegisterProcessor</span><span class="p">(</span><span class="n">nameof</span><span class="p">(</span><span class="n">SharedService</span><span class="p">),</span> <span class="n">sharedServiceProcessor</span><span class="p">);</span>
+
+                    <span class="n">processor</span> <span class="o">=</span> <span class="n">multiplexedProcessor</span><span class="p">;</span>
+                    <span class="k">break</span><span class="p">;</span>
+
+                <span class="nl">default:</span>
+                    <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentOutOfRangeException</span><span class="p">(</span><span class="n">nameof</span><span class="p">(</span><span class="n">protocol</span><span class="p">),</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">null</span><span class="p">);</span>
+            <span class="p">}</span>
+
+
+            <span class="k">try</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span>
+                    <span class="err">$</span><span class="s">"Selected TAsyncServer with {serverTransport} transport, {processor} processor and {inputProtocolFactory} protocol factories"</span><span class="p">);</span>
+
+                <span class="n">var</span> <span class="n">loggerFactory</span> <span class="o">=</span> <span class="n">ServiceCollection</span><span class="p">.</span><span class="n">BuildServiceProvider</span><span class="p">().</span><span class="n">GetService</span><span class="o">&lt;</span><span class="n">ILoggerFactory</span><span class="o">&gt;</span><span class="p">();</span>
+
+                <span class="n">var</span> <span class="n">server</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TSimpleAsyncServer</span><span class="p">(</span>
+                    <span class="nl">itProcessorFactory:</span> <span class="k">new</span> <span class="n">TSingletonProcessorFactory</span><span class="p">(</span><span class="n">processor</span><span class="p">),</span>
+                    <span class="nl">serverTransport:</span> <span class="n">serverTransport</span><span class="p">,</span>
+                    <span class="nl">inputTransportFactory:</span> <span class="n">inputTransportFactory</span><span class="p">,</span>
+                    <span class="nl">outputTransportFactory:</span> <span class="n">outputTransportFactory</span><span class="p">,</span>
+                    <span class="nl">inputProtocolFactory:</span> <span class="n">inputProtocolFactory</span><span class="p">,</span>
+                    <span class="nl">outputProtocolFactory:</span> <span class="n">outputProtocolFactory</span><span class="p">,</span>
+                    <span class="nl">logger:</span> <span class="n">loggerFactory</span><span class="p">.</span><span class="n">CreateLogger</span><span class="o">&lt;</span><span class="n">TSimpleAsyncServer</span><span class="o">&gt;</span><span class="p">());</span>
+
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"Starting the server..."</span><span class="p">);</span>
+
+                <span class="n">await</span> <span class="n">server</span><span class="p">.</span><span class="n">ServeAsync</span><span class="p">(</span><span class="n">cancellationToken</span><span class="p">);</span>
+            <span class="p">}</span>
+            <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">x</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">ToString</span><span class="p">());</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">X509Certificate2</span> <span class="n">GetCertificate</span><span class="p">()</span>
+        <span class="p">{</span>
+            <span class="c1">// due to files location in net core better to take certs from top folder</span>
+            <span class="n">var</span> <span class="n">certFile</span> <span class="o">=</span> <span class="n">GetCertPath</span><span class="p">(</span><span class="n">Directory</span><span class="p">.</span><span class="n">GetParent</span><span class="p">(</span><span class="n">Directory</span><span class="p">.</span><span class="n">GetCurrentDirectory</span><span class="p">()));</span>
+            <span class="k">return</span> <span class="k">new</span> <span class="n">X509Certificate2</span><span class="p">(</span><span class="n">certFile</span><span class="p">,</span> <span class="s">"ThriftTest"</span><span class="p">);</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">string</span> <span class="n">GetCertPath</span><span class="p">(</span><span class="n">DirectoryInfo</span> <span class="n">di</span><span class="p">,</span> <span class="kt">int</span> <span class="n">maxCount</span> <span class="o">=</span> <span class="mi">6</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">topDir</span> <span class="o">=</span> <span class="n">di</span><span class="p">;</span>
+            <span class="n">var</span> <span class="n">certFile</span> <span class="o">=</span>
+                <span class="n">topDir</span><span class="p">.</span><span class="n">EnumerateFiles</span><span class="p">(</span><span class="s">"ThriftTest.pfx"</span><span class="p">,</span> <span class="n">SearchOption</span><span class="p">.</span><span class="n">AllDirectories</span><span class="p">)</span>
+                    <span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">();</span>
+            <span class="k">if</span> <span class="p">(</span><span class="n">certFile</span> <span class="o">==</span> <span class="n">null</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">if</span> <span class="p">(</span><span class="n">maxCount</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
+                    <span class="k">throw</span> <span class="k">new</span> <span class="n">FileNotFoundException</span><span class="p">(</span><span class="s">"Cannot find file in directories"</span><span class="p">);</span>
+                <span class="k">return</span> <span class="n">GetCertPath</span><span class="p">(</span><span class="n">di</span><span class="p">.</span><span class="n">Parent</span><span class="p">,</span> <span class="n">maxCount</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
+            <span class="p">}</span>
+
+            <span class="k">return</span> <span class="n">certFile</span><span class="p">.</span><span class="n">FullName</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="n">X509Certificate</span> <span class="n">LocalCertificateSelectionCallback</span><span class="p">(</span><span class="n">object</span> <span class="n">sender</span><span class="p">,</span>
+            <span class="n">string</span> <span class="n">targetHost</span><span class="p">,</span> <span class="n">X509CertificateCollection</span> <span class="n">localCertificates</span><span class="p">,</span>
+            <span class="n">X509Certificate</span> <span class="n">remoteCertificate</span><span class="p">,</span> <span class="n">string</span><span class="p">[]</span> <span class="n">acceptableIssuers</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="k">return</span> <span class="n">GetCertificate</span><span class="p">();</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span class="kt">bool</span> <span class="n">ClientCertValidator</span><span class="p">(</span><span class="n">object</span> <span class="n">sender</span><span class="p">,</span> <span class="n">X509Certificate</span> <span class="n">certificate</span><span class="p">,</span>
+            <span class="n">X509Chain</span> <span class="n">chain</span><span class="p">,</span> <span class="n">SslPolicyErrors</span> <span class="n">sslPolicyErrors</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">enum</span> <span class="n">Transport</span>
+        <span class="p">{</span>
+            <span class="n">Tcp</span><span class="p">,</span>
+            <span class="n">NamedPipe</span><span class="p">,</span>
+            <span class="n">Http</span><span class="p">,</span>
+            <span class="n">TcpTls</span><span class="p">,</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">enum</span> <span class="n">Buffering</span>
+        <span class="p">{</span>
+            <span class="n">None</span><span class="p">,</span>
+            <span class="n">Buffered</span><span class="p">,</span>
+            <span class="n">Framed</span><span class="p">,</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">enum</span> <span class="n">Protocol</span>
+        <span class="p">{</span>
+            <span class="n">Binary</span><span class="p">,</span>
+            <span class="n">Compact</span><span class="p">,</span>
+            <span class="n">Json</span><span class="p">,</span>
+            <span class="n">Multiplexed</span>
+        <span class="p">}</span>
+
+        <span class="k">public</span> <span class="k">class</span> <span class="nc">HttpServerSample</span>
+        <span class="p">{</span>
+            <span class="k">public</span> <span class="kt">void</span> <span class="n">Run</span><span class="p">(</span><span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">config</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ConfigurationBuilder</span><span class="p">()</span>
+                    <span class="p">.</span><span class="n">AddEnvironmentVariables</span><span class="p">(</span><span class="n">prefix</span><span class="o">:</span> <span class="s">"ASPNETCORE_"</span><span class="p">)</span>
+                    <span class="p">.</span><span class="n">Build</span><span class="p">();</span>
+
+                <span class="n">var</span> <span class="n">host</span> <span class="o">=</span> <span class="k">new</span> <span class="n">WebHostBuilder</span><span class="p">()</span>
+                    <span class="p">.</span><span class="n">UseConfiguration</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
+                    <span class="p">.</span><span class="n">UseKestrel</span><span class="p">()</span>
+                    <span class="p">.</span><span class="n">UseUrls</span><span class="p">(</span><span class="s">"http://localhost:9090"</span><span class="p">)</span>
+                    <span class="p">.</span><span class="n">UseContentRoot</span><span class="p">(</span><span class="n">Directory</span><span class="p">.</span><span class="n">GetCurrentDirectory</span><span class="p">())</span>
+                    <span class="p">.</span><span class="n">UseStartup</span><span class="o">&lt;</span><span class="n">Startup</span><span class="o">&gt;</span><span class="p">()</span>
+                    <span class="p">.</span><span class="n">ConfigureLogging</span><span class="p">((</span><span class="n">ctx</span><span class="p">,</span><span class="n">logging</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="n">ConfigureLogging</span><span class="p">(</span><span class="n">logging</span><span class="p">))</span>
+                    <span class="p">.</span><span class="n">Build</span><span class="p">();</span>
+
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogTrace</span><span class="p">(</span><span class="s">"test"</span><span class="p">);</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogCritical</span><span class="p">(</span><span class="s">"test"</span><span class="p">);</span>
+                <span class="n">host</span><span class="p">.</span><span class="n">RunAsync</span><span class="p">(</span><span class="n">cancellationToken</span><span class="p">).</span><span class="n">GetAwaiter</span><span class="p">().</span><span class="n">GetResult</span><span class="p">();</span>
+            <span class="p">}</span>
+
+            <span class="k">public</span> <span class="k">class</span> <span class="nc">Startup</span>
+            <span class="p">{</span>
+                <span class="k">public</span> <span class="n">Startup</span><span class="p">(</span><span class="n">IWebHostEnvironment</span> <span class="n">env</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="n">var</span> <span class="n">builder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ConfigurationBuilder</span><span class="p">()</span>
+                        <span class="p">.</span><span class="n">SetBasePath</span><span class="p">(</span><span class="n">env</span><span class="p">.</span><span class="n">ContentRootPath</span><span class="p">)</span>
+                        <span class="p">.</span><span class="n">AddEnvironmentVariables</span><span class="p">();</span>
+
+                    <span class="n">Configuration</span> <span class="o">=</span> <span class="n">builder</span><span class="p">.</span><span class="n">Build</span><span class="p">();</span>
+                <span class="p">}</span>
+
+                <span class="k">public</span> <span class="n">IConfigurationRoot</span> <span class="n">Configuration</span> <span class="p">{</span> <span class="n">get</span><span class="p">;</span> <span class="p">}</span>
+
+                <span class="c1">// This method gets called by the runtime. Use this method to add services to the container.</span>
+                <span class="k">public</span> <span class="kt">void</span> <span class="n">ConfigureServices</span><span class="p">(</span><span class="n">IServiceCollection</span> <span class="n">services</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="n">services</span><span class="p">.</span><span class="n">AddTransient</span><span class="o">&lt;</span><span class="n">Calculator</span><span class="p">.</span><span class="n">IAsync</span><span class="p">,</span> <span class="n">CalculatorAsyncHandler</span><span class="o">&gt;</span><span class="p">();</span>
+                    <span class="n">services</span><span class="p">.</span><span class="n">AddTransient</span><span class="o">&lt;</span><span class="n">ITAsyncProcessor</span><span class="p">,</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">AsyncProcessor</span><span class="o">&gt;</span><span class="p">();</span>
+                    <span class="n">services</span><span class="p">.</span><span class="n">AddTransient</span><span class="o">&lt;</span><span class="n">THttpServerTransport</span><span class="p">,</span> <span class="n">THttpServerTransport</span><span class="o">&gt;</span><span class="p">();</span>
+                <span class="p">}</span>
+
+                <span class="c1">// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.</span>
+                <span class="k">public</span> <span class="kt">void</span> <span class="n">Configure</span><span class="p">(</span><span class="n">IApplicationBuilder</span> <span class="n">app</span><span class="p">,</span> <span class="n">IWebHostEnvironment</span> <span class="n">env</span><span class="p">,</span> <span class="n">ILoggerFactory</span> <span class="n">loggerFactory</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="n">app</span><span class="p">.</span><span class="n">UseMiddleware</span><span class="o">&lt;</span><span class="n">THttpServerTransport</span><span class="o">&gt;</span><span class="p">();</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">public</span> <span class="k">class</span> <span class="nc">CalculatorAsyncHandler</span> <span class="o">:</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">IAsync</span>
+        <span class="p">{</span>
+            <span class="k">private</span> <span class="n">readonly</span> <span class="n">Dictionary</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">SharedStruct</span><span class="o">&gt;</span> <span class="n">_log</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">SharedStruct</span><span class="o">&gt;</span><span class="p">();</span>
+
+            <span class="k">public</span> <span class="n">CalculatorAsyncHandler</span><span class="p">()</span>
+            <span class="p">{</span>
+            <span class="p">}</span>
+
+            <span class="k">public</span> <span class="n">async</span> <span class="n">Task</span><span class="o">&lt;</span><span class="n">SharedStruct</span><span class="o">&gt;</span> <span class="n">getStructAsync</span><span class="p">(</span><span class="kt">int</span> <span class="n">key</span><span class="p">,</span>
+                <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"GetStructAsync({0})"</span><span class="p">,</span> <span class="n">key</span><span class="p">);</span>
+                <span class="k">return</span> <span class="n">await</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">_log</span><span class="p">[</span><span class="n">key</span><span class="p">]);</span>
+            <span class="p">}</span>
+
+            <span class="k">public</span> <span class="n">async</span> <span class="n">Task</span> <span class="n">pingAsync</span><span class="p">(</span><span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"PingAsync()"</span><span class="p">);</span>
+                <span class="n">await</span> <span class="n">Task</span><span class="p">.</span><span class="n">CompletedTask</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="k">public</span> <span class="n">async</span> <span class="n">Task</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">addAsync</span><span class="p">(</span><span class="kt">int</span> <span class="n">num1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">num2</span><span class="p">,</span> <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"AddAsync({num1},{num2})"</span><span class="p">);</span>
+                <span class="k">return</span> <span class="n">await</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">num1</span> <span class="o">+</span> <span class="n">num2</span><span class="p">);</span>
+            <span class="p">}</span>
+
+            <span class="k">public</span> <span class="n">async</span> <span class="n">Task</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">calculateAsync</span><span class="p">(</span><span class="kt">int</span> <span class="n">logid</span><span class="p">,</span> <span class="n">Work</span> <span class="n">w</span><span class="p">,</span> <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="err">$</span><span class="s">"CalculateAsync({logid}, [{w.Op},{w.Num1},{w.Num2}])"</span><span class="p">);</span>
+
+                <span class="n">var</span> <span class="n">val</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+                <span class="k">switch</span> <span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">ADD</span><span class="p">:</span>
+                        <span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">+</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">;</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span><span class="p">:</span>
+                        <span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">-</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">;</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">MULTIPLY</span><span class="p">:</span>
+                        <span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">*</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">;</span>
+                        <span class="k">break</span><span class="p">;</span>
+
+                    <span class="k">case</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span><span class="p">:</span>
+                        <span class="k">if</span> <span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Num2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
+                        <span class="p">{</span>
+                            <span class="n">var</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InvalidOperation</span>
+                            <span class="p">{</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/netstd/Server/Program.cs">tutorial/netstd/Server/Program.cs</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/nodejs.html b/output/tutorial/nodejs.html
new file mode 100644
index 0000000..8a0e36e
--- /dev/null
+++ b/output/tutorial/nodejs.html
@@ -0,0 +1,243 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Node.js</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Node.js Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen js:node tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="kd">var</span> <span class="nx">Calculator</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">./gen-nodejs/Calculator</span><span class="dl">'</span><span class="p">);</span>
+<span class="kd">var</span> <span class="nx">ttypes</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">./gen-nodejs/tutorial_types</span><span class="dl">'</span><span class="p">);</span>
+<span class="kd">const</span> <span class="nx">assert</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">assert</span><span class="dl">'</span><span class="p">);</span>
+
+<span class="kd">var</span> <span class="nx">transport</span> <span class="o">=</span> <span class="nx">thrift</span><span class="p">.</span><span class="nx">TBufferedTransport</span><span class="p">;</span>
+<span class="kd">var</span> <span class="nx">protocol</span> <span class="o">=</span> <span class="nx">thrift</span><span class="p">.</span><span class="nx">TBinaryProtocol</span><span class="p">;</span>
+
+<span class="kd">var</span> <span class="nx">connection</span> <span class="o">=</span> <span class="nx">thrift</span><span class="p">.</span><span class="nx">createConnection</span><span class="p">(</span><span class="dl">"</span><span class="s2">localhost</span><span class="dl">"</span><span class="p">,</span> <span class="mi">9090</span><span class="p">,</span> <span class="p">{</span>
+  <span class="na">transport</span> <span class="p">:</span> <span class="nx">transport</span><span class="p">,</span>
+  <span class="na">protocol</span> <span class="p">:</span> <span class="nx">protocol</span>
+<span class="p">});</span>
+
+<span class="nx">connection</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="dl">'</span><span class="s1">error</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
+  <span class="nx">assert</span><span class="p">(</span><span class="kc">false</span><span class="p">,</span> <span class="nx">err</span><span class="p">);</span>
+<span class="p">});</span>
+
+<span class="c1">// Create a Calculator client with the connection</span>
+<span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">thrift</span><span class="p">.</span><span class="nx">createClient</span><span class="p">(</span><span class="nx">Calculator</span><span class="p">,</span> <span class="nx">connection</span><span class="p">);</span>
+
+
+<span class="nx">client</span><span class="p">.</span><span class="nx">ping</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
+  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">ping()</span><span class="dl">'</span><span class="p">);</span>
+<span class="p">});</span>
+
+
+<span class="nx">client</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">response</span><span class="p">)</span> <span class="p">{</span>
+  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">1+1=</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">response</span><span class="p">);</span>
+<span class="p">});</span>
+
+
+<span class="nx">work</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">Work</span><span class="p">();</span>
+<span class="nx">work</span><span class="p">.</span><span class="nx">op</span> <span class="o">=</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">Operation</span><span class="p">.</span><span class="nx">DIVIDE</span><span class="p">;</span>
+<span class="nx">work</span><span class="p">.</span><span class="nx">num1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
+<span class="nx">work</span><span class="p">.</span><span class="nx">num2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+
+<span class="nx">client</span><span class="p">.</span><span class="nx">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">work</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
+  <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">InvalidOperation </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">err</span><span class="p">);</span>
+  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Whoa? You know how to divide by zero?</span><span class="dl">'</span><span class="p">);</span>
+  <span class="p">}</span>
+<span class="p">});</span>
+
+<span class="nx">work</span><span class="p">.</span><span class="nx">op</span> <span class="o">=</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">Operation</span><span class="p">.</span><span class="nx">SUBTRACT</span><span class="p">;</span>
+<span class="nx">work</span><span class="p">.</span><span class="nx">num1</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span>
+<span class="nx">work</span><span class="p">.</span><span class="nx">num2</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
+
+<span class="nx">client</span><span class="p">.</span><span class="nx">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">work</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
+  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">15-10=</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">message</span><span class="p">);</span>
+
+  <span class="nx">client</span><span class="p">.</span><span class="nx">getStruct</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">message</span><span class="p">){</span>
+    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Check log: </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">message</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
+
+    <span class="c1">//close the connection once we're done</span>
+    <span class="nx">connection</span><span class="p">.</span><span class="nx">end</span><span class="p">();</span>
+  <span class="p">});</span>
+<span class="p">});</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/nodejs/NodeClient.js">tutorial/nodejs/NodeClient.js</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="kd">var</span> <span class="nx">Calculator</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">./gen-nodejs/Calculator</span><span class="dl">"</span><span class="p">);</span>
+<span class="kd">var</span> <span class="nx">ttypes</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">./gen-nodejs/tutorial_types</span><span class="dl">"</span><span class="p">);</span>
+<span class="kd">var</span> <span class="nx">SharedStruct</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">./gen-nodejs/shared_types</span><span class="dl">"</span><span class="p">).</span><span class="nx">SharedStruct</span><span class="p">;</span>
+
+<span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{};</span>
+
+<span class="kd">var</span> <span class="nx">server</span> <span class="o">=</span> <span class="nx">thrift</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span><span class="nx">Calculator</span><span class="p">,</span> <span class="p">{</span>
+  <span class="na">ping</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">result</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">ping()</span><span class="dl">"</span><span class="p">);</span>
+    <span class="nx">result</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
+  <span class="p">},</span>
+
+  <span class="na">add</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n1</span><span class="p">,</span> <span class="nx">n2</span><span class="p">,</span> <span class="nx">result</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">add(</span><span class="dl">"</span><span class="p">,</span> <span class="nx">n1</span><span class="p">,</span> <span class="dl">"</span><span class="s2">,</span><span class="dl">"</span><span class="p">,</span> <span class="nx">n2</span><span class="p">,</span> <span class="dl">"</span><span class="s2">)</span><span class="dl">"</span><span class="p">);</span>
+    <span class="nx">result</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">n1</span> <span class="o">+</span> <span class="nx">n2</span><span class="p">);</span>
+  <span class="p">},</span>
+
+  <span class="na">calculate</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">logid</span><span class="p">,</span> <span class="nx">work</span><span class="p">,</span> <span class="nx">result</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">calculate(</span><span class="dl">"</span><span class="p">,</span> <span class="nx">logid</span><span class="p">,</span> <span class="dl">"</span><span class="s2">,</span><span class="dl">"</span><span class="p">,</span> <span class="nx">work</span><span class="p">,</span> <span class="dl">"</span><span class="s2">)</span><span class="dl">"</span><span class="p">);</span>
+
+    <span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+    <span class="k">if</span> <span class="p">(</span><span class="nx">work</span><span class="p">.</span><span class="nx">op</span> <span class="o">==</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">Operation</span><span class="p">.</span><span class="nx">ADD</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">val</span> <span class="o">=</span> <span class="nx">work</span><span class="p">.</span><span class="nx">num1</span> <span class="o">+</span> <span class="nx">work</span><span class="p">.</span><span class="nx">num2</span><span class="p">;</span>
+    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">work</span><span class="p">.</span><span class="nx">op</span> <span class="o">===</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">Operation</span><span class="p">.</span><span class="nx">SUBTRACT</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">val</span> <span class="o">=</span> <span class="nx">work</span><span class="p">.</span><span class="nx">num1</span> <span class="o">-</span> <span class="nx">work</span><span class="p">.</span><span class="nx">num2</span><span class="p">;</span>
+    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">work</span><span class="p">.</span><span class="nx">op</span> <span class="o">===</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">Operation</span><span class="p">.</span><span class="nx">MULTIPLY</span><span class="p">)</span> <span class="p">{</span>
+      <span class="nx">val</span> <span class="o">=</span> <span class="nx">work</span><span class="p">.</span><span class="nx">num1</span> <span class="o">*</span> <span class="nx">work</span><span class="p">.</span><span class="nx">num2</span><span class="p">;</span>
+    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">work</span><span class="p">.</span><span class="nx">op</span> <span class="o">===</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">Operation</span><span class="p">.</span><span class="nx">DIVIDE</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span class="nx">work</span><span class="p">.</span><span class="nx">num2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
+        <span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">InvalidOperation</span><span class="p">();</span>
+        <span class="nx">x</span><span class="p">.</span><span class="nx">whatOp</span> <span class="o">=</span> <span class="nx">work</span><span class="p">.</span><span class="nx">op</span><span class="p">;</span>
+        <span class="nx">x</span><span class="p">.</span><span class="nx">why</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Cannot divide by 0</span><span class="dl">'</span><span class="p">;</span>
+        <span class="nx">result</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
+        <span class="k">return</span><span class="p">;</span>
+      <span class="p">}</span>
+      <span class="nx">val</span> <span class="o">=</span> <span class="nx">work</span><span class="p">.</span><span class="nx">num1</span> <span class="o">/</span> <span class="nx">work</span><span class="p">.</span><span class="nx">num2</span><span class="p">;</span>
+    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+      <span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ttypes</span><span class="p">.</span><span class="nx">InvalidOperation</span><span class="p">();</span>
+      <span class="nx">x</span><span class="p">.</span><span class="nx">whatOp</span> <span class="o">=</span> <span class="nx">work</span><span class="p">.</span><span class="nx">op</span><span class="p">;</span>
+      <span class="nx">x</span><span class="p">.</span><span class="nx">why</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Invalid operation</span><span class="dl">'</span><span class="p">;</span>
+      <span class="nx">result</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
+      <span class="k">return</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="kd">var</span> <span class="nx">entry</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SharedStruct</span><span class="p">();</span>
+    <span class="nx">entry</span><span class="p">.</span><span class="nx">key</span> <span class="o">=</span> <span class="nx">logid</span><span class="p">;</span>
+    <span class="nx">entry</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="dl">""</span><span class="o">+</span><span class="nx">val</span><span class="p">;</span>
+    <span class="nx">data</span><span class="p">[</span><span class="nx">logid</span><span class="p">]</span> <span class="o">=</span> <span class="nx">entry</span><span class="p">;</span>
+
+    <span class="nx">result</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span>
+  <span class="p">},</span>
+
+  <span class="na">getStruct</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">result</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">getStruct(</span><span class="dl">"</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="dl">"</span><span class="s2">)</span><span class="dl">"</span><span class="p">);</span>
+    <span class="nx">result</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">data</span><span class="p">[</span><span class="nx">key</span><span class="p">]);</span>
+  <span class="p">},</span>
+
+  <span class="na">zip</span><span class="p">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
+    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">zip()</span><span class="dl">"</span><span class="p">);</span>
+  <span class="p">}</span>
+
+<span class="p">});</span>
+
+<span class="nx">server</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">9090</span><span class="p">);</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/nodejs/NodeServer.js">tutorial/nodejs/NodeServer.js</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/ocaml.html b/output/tutorial/ocaml.html
new file mode 100644
index 0000000..d47452c
--- /dev/null
+++ b/output/tutorial/ocaml.html
@@ -0,0 +1,247 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - OCaml</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>OCaml Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen ocaml tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">open</span> <span class="n">Arg</span>
+<span class="n">open</span> <span class="n">Thrift</span>
+<span class="n">open</span> <span class="n">Tutorial_types</span>
+<span class="n">open</span> <span class="n">Shared_types</span>
+
+<span class="n">exception</span> <span class="n">Die</span><span class="p">;;</span>
+<span class="n">let</span> <span class="n">sod</span> <span class="o">=</span> <span class="n">function</span>
+    <span class="n">Some</span> <span class="n">v</span> <span class="o">-&gt;</span> <span class="n">v</span>
+  <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">raise</span> <span class="n">Die</span><span class="p">;;</span>
+
+<span class="n">type</span> <span class="n">connection</span> <span class="o">=</span> <span class="p">{</span>
+  <span class="n">trans</span> <span class="o">:</span> <span class="n">Transport</span><span class="p">.</span><span class="n">t</span> <span class="p">;</span>
+  <span class="n">proto</span> <span class="o">:</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span><span class="p">.</span><span class="n">t</span><span class="p">;</span>
+  <span class="n">calc</span> <span class="o">:</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">client</span> <span class="p">;</span>
+<span class="p">}</span>
+
+<span class="n">let</span> <span class="n">connect</span> <span class="o">~</span><span class="n">host</span> <span class="n">port</span> <span class="o">=</span>
+  <span class="n">let</span> <span class="n">tx</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TSocket</span><span class="p">.</span><span class="n">t</span> <span class="n">host</span> <span class="n">port</span> <span class="n">in</span>
+  <span class="n">let</span> <span class="n">proto</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">t</span> <span class="n">tx</span> <span class="n">in</span>
+  <span class="n">let</span> <span class="n">calc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">client</span> <span class="n">proto</span> <span class="n">proto</span> <span class="n">in</span>
+    <span class="n">tx</span><span class="err">#</span><span class="n">opn</span><span class="p">;</span>
+    <span class="p">{</span> <span class="n">trans</span> <span class="o">=</span> <span class="n">tx</span> <span class="p">;</span> <span class="n">proto</span> <span class="o">=</span> <span class="n">proto</span><span class="p">;</span> <span class="n">calc</span> <span class="o">=</span> <span class="n">calc</span> <span class="p">}</span>
+<span class="p">;;</span>
+
+<span class="n">let</span> <span class="n">doclient</span> <span class="p">()</span> <span class="o">=</span>
+  <span class="n">let</span> <span class="n">cli</span> <span class="o">=</span> <span class="n">connect</span> <span class="o">~</span><span class="n">host</span><span class="o">:</span><span class="s">"127.0.0.1"</span> <span class="mi">9090</span> <span class="n">in</span>
+  <span class="k">try</span>
+    <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">ping</span> <span class="p">;</span>
+    <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"ping()</span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span>
+    <span class="p">(</span><span class="n">let</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">add</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="n">in</span>
+       <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"1+1=%ld</span><span class="se">\n</span><span class="s">"</span> <span class="n">sum</span> <span class="p">;</span>
+       <span class="n">flush</span> <span class="n">stdout</span><span class="p">)</span> <span class="p">;</span>
+    <span class="p">(</span><span class="n">let</span> <span class="n">w</span> <span class="o">=</span> <span class="k">new</span> <span class="n">work</span> <span class="n">in</span>
+       <span class="n">w</span><span class="err">#</span><span class="n">set_op</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span> <span class="p">;</span>
+       <span class="n">w</span><span class="err">#</span><span class="n">set_num1</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="p">;</span>
+       <span class="n">w</span><span class="err">#</span><span class="n">set_num2</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">0</span><span class="p">)</span> <span class="p">;</span>
+       <span class="k">try</span>
+	 <span class="n">let</span> <span class="n">quotient</span> <span class="o">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">calculate</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="n">w</span> <span class="n">in</span>
+	   <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"Whoa? We can divide by zero!</span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span>
+       <span class="n">with</span> <span class="n">InvalidOperation</span> <span class="n">io</span> <span class="o">-&gt;</span>
+	 <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"InvalidOperation: %s</span><span class="se">\n</span><span class="s">"</span> <span class="n">io</span><span class="err">#</span><span class="n">grab_why</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span><span class="p">)</span> <span class="p">;</span>
+    <span class="p">(</span><span class="n">let</span> <span class="n">w</span> <span class="o">=</span> <span class="k">new</span> <span class="n">work</span> <span class="n">in</span>
+       <span class="n">w</span><span class="err">#</span><span class="n">set_op</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span> <span class="p">;</span>
+       <span class="n">w</span><span class="err">#</span><span class="n">set_num1</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">15</span><span class="p">)</span> <span class="p">;</span>
+       <span class="n">w</span><span class="err">#</span><span class="n">set_num2</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">10</span><span class="p">)</span> <span class="p">;</span>
+       <span class="n">let</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">calculate</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="n">w</span> <span class="n">in</span>
+	 <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"15-10=%ld</span><span class="se">\n</span><span class="s">"</span> <span class="n">diff</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span><span class="p">)</span> <span class="p">;</span>
+    <span class="p">(</span><span class="n">let</span> <span class="n">ss</span> <span class="o">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">getStruct</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="n">in</span>
+       <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"Check log: %s</span><span class="se">\n</span><span class="s">"</span> <span class="n">ss</span><span class="err">#</span><span class="n">grab_value</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span><span class="p">)</span> <span class="p">;</span>
+    <span class="n">cli</span><span class="p">.</span><span class="n">trans</span><span class="err">#</span><span class="n">close</span>
+  <span class="n">with</span> <span class="n">Transport</span><span class="p">.</span><span class="n">E</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span><span class="n">what</span><span class="p">)</span> <span class="o">-&gt;</span>
+    <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"ERROR: %s</span><span class="se">\n</span><span class="s">"</span> <span class="n">what</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span>
+<span class="p">;;</span>
+
+<span class="n">doclient</span><span class="p">();;</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/ocaml/CalcClient.ml">tutorial/ocaml/CalcClient.ml</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="n">open</span> <span class="n">Arg</span>
+<span class="n">open</span> <span class="n">Thrift</span>
+<span class="n">open</span> <span class="n">Tutorial_types</span>
+<span class="n">open</span> <span class="n">Shared_types</span>
+
+<span class="n">exception</span> <span class="n">Die</span><span class="p">;;</span>
+<span class="n">let</span> <span class="n">sod</span> <span class="o">=</span> <span class="n">function</span>
+    <span class="n">Some</span> <span class="n">v</span> <span class="o">-&gt;</span> <span class="n">v</span>
+  <span class="o">|</span> <span class="n">None</span> <span class="o">-&gt;</span> <span class="n">raise</span> <span class="n">Die</span><span class="p">;;</span>
+
+<span class="k">class</span> <span class="nc">calc_handler</span> <span class="o">=</span>
+<span class="n">object</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span>
+  <span class="n">inherit</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">iface</span>
+  <span class="n">val</span> <span class="n">log</span> <span class="o">=</span> <span class="n">Hashtbl</span><span class="p">.</span><span class="n">create</span> <span class="mi">23</span>
+  <span class="n">method</span> <span class="n">ping</span>  <span class="o">=</span> <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"ping()</span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span>
+  <span class="n">method</span> <span class="n">add</span> <span class="n">a</span> <span class="n">b</span> <span class="o">=</span>
+    <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span><span class="s">"add(%ld,%ld)</span><span class="se">\n</span><span class="s">"</span> <span class="p">(</span><span class="n">sod</span> <span class="n">a</span><span class="p">)</span> <span class="p">(</span><span class="n">sod</span> <span class="n">b</span><span class="p">);</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span>
+    <span class="n">Int32</span><span class="p">.</span><span class="n">add</span> <span class="p">(</span><span class="n">sod</span> <span class="n">a</span><span class="p">)</span> <span class="p">(</span><span class="n">sod</span> <span class="n">b</span><span class="p">)</span>
+  <span class="n">method</span> <span class="n">calculate</span> <span class="n">logid</span> <span class="n">w</span> <span class="o">=</span>
+    <span class="n">let</span> <span class="n">w</span> <span class="o">=</span> <span class="n">sod</span> <span class="n">w</span> <span class="n">in</span>
+      <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"calculate(%ld,{%ld,%ld,%ld})</span><span class="se">\n</span><span class="s">"</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> <span class="p">(</span><span class="n">Operation</span><span class="p">.</span><span class="n">to_i</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_op</span><span class="p">)</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span><span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span>
+    <span class="n">let</span> <span class="n">rv</span> <span class="o">=</span>
+      <span class="n">match</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_op</span> <span class="n">with</span>
+	  <span class="n">Operation</span><span class="p">.</span><span class="n">ADD</span> <span class="o">-&gt;</span>
+	    <span class="n">Int32</span><span class="p">.</span><span class="n">add</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span>
+	<span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span> <span class="o">-&gt;</span>
+	    <span class="n">Int32</span><span class="p">.</span><span class="n">sub</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span>
+	<span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">MULTIPLY</span> <span class="o">-&gt;</span>
+	    <span class="n">Int32</span><span class="p">.</span><span class="n">mul</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span>
+	<span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span> <span class="o">-&gt;</span>
+	    <span class="k">if</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span> <span class="o">=</span> <span class="n">Int32</span><span class="p">.</span><span class="n">zero</span> <span class="n">then</span>
+	      <span class="n">let</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="n">invalidOperation</span> <span class="n">in</span>
+		<span class="n">io</span><span class="err">#</span><span class="n">set_whatOp</span> <span class="p">(</span><span class="n">Operation</span><span class="p">.</span><span class="n">to_i</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_op</span><span class="p">)</span> <span class="p">;</span>
+		<span class="n">io</span><span class="err">#</span><span class="n">set_why</span> <span class="s">"Cannot divide by 0"</span> <span class="p">;</span>
+		<span class="n">raise</span> <span class="p">(</span><span class="n">InvalidOperation</span> <span class="n">io</span><span class="p">)</span>
+	    <span class="k">else</span>
+	      <span class="n">Int32</span><span class="p">.</span><span class="n">div</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span> <span class="n">in</span>
+
+    <span class="n">let</span> <span class="n">ss</span> <span class="o">=</span> <span class="k">new</span> <span class="n">sharedStruct</span> <span class="n">in</span>
+      <span class="n">ss</span><span class="err">#</span><span class="n">set_key</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> <span class="p">;</span>
+    <span class="n">let</span> <span class="n">buffer</span> <span class="o">=</span> <span class="n">Int32</span><span class="p">.</span><span class="n">to_string</span> <span class="n">rv</span> <span class="n">in</span>
+      <span class="n">ss</span><span class="err">#</span><span class="n">set_value</span> <span class="n">buffer</span> <span class="p">;</span>
+      <span class="n">Hashtbl</span><span class="p">.</span><span class="n">add</span> <span class="n">log</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> <span class="n">ss</span> <span class="p">;</span>
+      <span class="n">rv</span>
+
+  <span class="n">method</span> <span class="n">zip</span> <span class="o">=</span>
+    <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"zip()</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span>
+
+  <span class="n">method</span> <span class="n">getStruct</span> <span class="n">logid</span> <span class="o">=</span>
+    <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"getStruct(%ld)</span><span class="se">\n</span><span class="s">"</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span>
+    <span class="n">Hashtbl</span><span class="p">.</span><span class="n">find</span> <span class="n">log</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span>
+
+<span class="n">end</span>
+
+<span class="n">let</span> <span class="n">doserver</span> <span class="p">()</span> <span class="o">=</span>
+  <span class="n">let</span> <span class="n">h</span> <span class="o">=</span> <span class="k">new</span> <span class="n">calc_handler</span> <span class="n">in</span>
+  <span class="n">let</span> <span class="n">proc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">processor</span> <span class="n">h</span> <span class="n">in</span>
+  <span class="n">let</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">9090</span> <span class="n">in</span>
+  <span class="n">let</span> <span class="n">pf</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">factory</span> <span class="n">in</span>
+  <span class="n">let</span> <span class="n">server</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TThreadedServer</span><span class="p">.</span><span class="n">t</span>
+		 <span class="n">proc</span>
+		 <span class="p">(</span><span class="k">new</span> <span class="n">TServerSocket</span><span class="p">.</span><span class="n">t</span> <span class="n">port</span><span class="p">)</span>
+		 <span class="p">(</span><span class="k">new</span> <span class="n">Transport</span><span class="p">.</span><span class="n">factory</span><span class="p">)</span>
+		 <span class="n">pf</span>
+		 <span class="n">pf</span>
+  <span class="n">in</span>
+    <span class="n">server</span><span class="err">#</span><span class="n">serve</span>
+<span class="p">;;</span>
+
+<span class="n">doserver</span><span class="p">();;</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/ocaml/CalcServer.ml">tutorial/ocaml/CalcServer.ml</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/perl.html b/output/tutorial/perl.html
new file mode 100644
index 0000000..71cd3a4
--- /dev/null
+++ b/output/tutorial/perl.html
@@ -0,0 +1,248 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Perl</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Perl Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen perl tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="c1">#</span>
+
+<span class="k">use</span> <span class="nv">strict</span><span class="p">;</span>
+<span class="k">use</span> <span class="nv">warnings</span><span class="p">;</span>
+
+<span class="k">use</span> <span class="nv">lib</span> <span class="p">'</span><span class="s1">../../lib/perl/lib</span><span class="p">';</span>
+<span class="k">use</span> <span class="nv">lib</span> <span class="p">'</span><span class="s1">gen-perl</span><span class="p">';</span>
+
+<span class="k">use</span> <span class="nv">Thrift</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">Thrift::</span><span class="nv">BinaryProtocol</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">Thrift::</span><span class="nv">Socket</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">Thrift::</span><span class="nv">BufferedTransport</span><span class="p">;</span>
+
+<span class="k">use</span> <span class="nn">shared::</span><span class="nv">SharedService</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">tutorial::</span><span class="nv">Calculator</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">shared::</span><span class="nv">Types</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">tutorial::</span><span class="nv">Types</span><span class="p">;</span>
+
+<span class="k">use</span> <span class="nn">Data::</span><span class="nv">Dumper</span><span class="p">;</span>
+
+<span class="k">my</span> <span class="nv">$socket</span>    <span class="o">=</span> <span class="nn">Thrift::</span><span class="nv">Socket</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">('</span><span class="s1">localhost</span><span class="p">',</span><span class="mi">9090</span><span class="p">);</span>
+<span class="k">my</span> <span class="nv">$transport</span> <span class="o">=</span> <span class="nn">Thrift::</span><span class="nv">BufferedTransport</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span><span class="nv">$socket</span><span class="p">,</span><span class="mi">1024</span><span class="p">,</span><span class="mi">1024</span><span class="p">);</span>
+<span class="k">my</span> <span class="nv">$protocol</span>  <span class="o">=</span> <span class="nn">Thrift::</span><span class="nv">BinaryProtocol</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span><span class="nv">$transport</span><span class="p">);</span>
+<span class="k">my</span> <span class="nv">$client</span>    <span class="o">=</span> <span class="nn">tutorial::</span><span class="nv">CalculatorClient</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span><span class="nv">$protocol</span><span class="p">);</span>
+
+
+<span class="nb">eval</span><span class="p">{</span>
+    <span class="nv">$transport</span><span class="o">-&gt;</span><span class="nb">open</span><span class="p">();</span>
+
+    <span class="nv">$client</span><span class="o">-&gt;</span><span class="nv">ping</span><span class="p">();</span>
+    <span class="k">print</span> <span class="p">"</span><span class="s2">ping()</span><span class="se">\n</span><span class="p">";</span>
+
+
+    <span class="k">my</span> <span class="nv">$sum</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="nv">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
+    <span class="k">print</span> <span class="p">"</span><span class="s2">1+1=</span><span class="si">$sum</span><span class="se">\n</span><span class="p">";</span>
+
+    <span class="k">my</span> <span class="nv">$work</span> <span class="o">=</span> <span class="nn">tutorial::</span><span class="nv">Work</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">();</span>
+
+    <span class="nv">$work</span><span class="o">-&gt;</span><span class="nv">op</span><span class="p">(</span><span class="nn">tutorial::Operation::</span><span class="nv">DIVIDE</span><span class="p">);</span>
+    <span class="nv">$work</span><span class="o">-&gt;</span><span class="nv">num1</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
+    <span class="nv">$work</span><span class="o">-&gt;</span><span class="nv">num2</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
+
+    <span class="nb">eval</span> <span class="p">{</span>
+        <span class="nv">$client</span><span class="o">-&gt;</span><span class="nv">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nv">$work</span><span class="p">);</span>
+        <span class="k">print</span> <span class="p">"</span><span class="s2">Whoa! We can divide by zero?</span><span class="se">\n</span><span class="p">";</span>
+    <span class="p">};</span> <span class="k">if</span><span class="p">(</span><span class="vg">$@</span><span class="p">)</span> <span class="p">{</span>
+        <span class="nb">warn</span> <span class="p">'</span><span class="s1">InvalidOperation: </span><span class="p">'</span><span class="o">.</span><span class="nv">Dumper</span><span class="p">(</span><span class="vg">$@</span><span class="p">);</span>
+    <span class="p">}</span>
+
+    <span class="nv">$work</span><span class="o">-&gt;</span><span class="nv">op</span><span class="p">(</span><span class="nn">tutorial::Operation::</span><span class="nv">SUBTRACT</span><span class="p">);</span>
+    <span class="nv">$work</span><span class="o">-&gt;</span><span class="nv">num1</span><span class="p">(</span><span class="mi">15</span><span class="p">);</span>
+    <span class="nv">$work</span><span class="o">-&gt;</span><span class="nv">num2</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
+    <span class="k">my</span> <span class="nv">$diff</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="nv">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nv">$work</span><span class="p">);</span>
+    <span class="k">print</span> <span class="p">"</span><span class="s2">15-10=</span><span class="si">$diff</span><span class="se">\n</span><span class="p">";</span>
+
+    <span class="k">my</span> <span class="nv">$log</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="nv">getStruct</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
+    <span class="k">print</span> <span class="p">"</span><span class="s2">Log: </span><span class="si">$log</span><span class="s2">-&gt;{value}</span><span class="se">\n</span><span class="p">";</span>
+
+    <span class="nv">$transport</span><span class="o">-&gt;</span><span class="nb">close</span><span class="p">();</span>
+
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/perl/PerlClient.pl">tutorial/perl/PerlClient.pl</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="c1">#</span>
+
+<span class="k">use</span> <span class="nv">strict</span><span class="p">;</span>
+<span class="k">use</span> <span class="nv">lib</span> <span class="p">'</span><span class="s1">../../lib/perl/lib</span><span class="p">';</span>
+<span class="k">use</span> <span class="nv">lib</span> <span class="p">'</span><span class="s1">gen-perl</span><span class="p">';</span>
+<span class="k">use</span> <span class="nn">Thrift::</span><span class="nv">Socket</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">Thrift::</span><span class="nv">Server</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">Thrift::</span><span class="nv">ServerSocket</span><span class="p">;</span>
+<span class="k">use</span> <span class="nn">tutorial::</span><span class="nv">Calculator</span><span class="p">;</span>
+
+<span class="nb">package</span> <span class="nv">CalculatorHandler</span><span class="p">;</span>
+<span class="k">use</span> <span class="nv">base</span> <span class="sx">qw(tutorial::CalculatorIf)</span><span class="p">;</span>
+
+<span class="k">sub </span><span class="nf">new</span> <span class="p">{</span>
+    <span class="k">my</span> <span class="nv">$classname</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
+    <span class="k">my</span> <span class="nv">$self</span>      <span class="o">=</span> <span class="p">{};</span>
+
+    <span class="k">return</span> <span class="nb">bless</span><span class="p">(</span><span class="nv">$self</span><span class="p">,</span><span class="nv">$classname</span><span class="p">);</span>
+<span class="p">}</span>
+
+
+<span class="k">sub </span><span class="nf">ping</span>
+<span class="p">{</span>
+  <span class="k">print</span> <span class="p">"</span><span class="s2">ping()</span><span class="se">\n</span><span class="p">";</span>
+<span class="p">}</span>
+
+<span class="k">sub </span><span class="nf">add</span>
+<span class="p">{</span>
+  <span class="k">my</span><span class="p">(</span><span class="nv">$self</span><span class="p">,</span> <span class="nv">$n1</span><span class="p">,</span> <span class="nv">$n2</span><span class="p">)</span> <span class="o">=</span> <span class="nv">@_</span><span class="p">;</span>
+  <span class="nb">printf</span><span class="p">("</span><span class="s2">add(%d,%d)</span><span class="se">\n</span><span class="p">",</span> <span class="nv">$n1</span><span class="p">,</span> <span class="nv">$n2</span><span class="p">);</span>
+  <span class="k">return</span> <span class="nv">$n1</span> <span class="o">+</span> <span class="nv">$n2</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="k">sub </span><span class="nf">calculate</span>
+<span class="p">{</span>
+  <span class="k">my</span><span class="p">(</span><span class="nv">$self</span><span class="p">,</span> <span class="nv">$logid</span><span class="p">,</span> <span class="nv">$work</span><span class="p">)</span> <span class="o">=</span> <span class="nv">@_</span><span class="p">;</span>
+  <span class="k">my</span> <span class="nv">$op</span>   <span class="o">=</span> <span class="nv">$work</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">op</span><span class="p">};</span>
+  <span class="k">my</span> <span class="nv">$num1</span> <span class="o">=</span> <span class="nv">$work</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">num1</span><span class="p">};</span>
+  <span class="k">my</span> <span class="nv">$num2</span> <span class="o">=</span> <span class="nv">$work</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">num2</span><span class="p">};</span>
+  <span class="nb">printf</span><span class="p">("</span><span class="s2">calculate(%d, %d %d %d)</span><span class="se">\n</span><span class="p">",</span> <span class="nv">$logid</span><span class="p">,</span> <span class="nv">$num1</span><span class="p">,</span> <span class="nv">$num2</span><span class="p">,</span> <span class="nv">$op</span><span class="p">);</span>
+
+  <span class="k">my</span> <span class="nv">$val</span><span class="p">;</span>
+
+  <span class="k">if</span> <span class="p">(</span><span class="nv">$op</span> <span class="o">==</span> <span class="nn">tutorial::Operation::</span><span class="nv">ADD</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nv">$val</span> <span class="o">=</span> <span class="nv">$num1</span> <span class="o">+</span> <span class="nv">$num2</span><span class="p">;</span>
+  <span class="p">}</span> <span class="k">elsif</span> <span class="p">(</span><span class="nv">$op</span> <span class="o">==</span> <span class="nn">tutorial::Operation::</span><span class="nv">SUBTRACT</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nv">$val</span> <span class="o">=</span> <span class="nv">$num1</span> <span class="o">-</span> <span class="nv">$num2</span><span class="p">;</span>
+  <span class="p">}</span> <span class="k">elsif</span> <span class="p">(</span><span class="nv">$op</span> <span class="o">==</span> <span class="nn">tutorial::Operation::</span><span class="nv">MULTIPLY</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nv">$val</span> <span class="o">=</span> <span class="nv">$num1</span> <span class="o">*</span> <span class="nv">$num2</span><span class="p">;</span>
+  <span class="p">}</span> <span class="k">elsif</span> <span class="p">(</span><span class="nv">$op</span> <span class="o">==</span> <span class="nn">tutorial::Operation::</span><span class="nv">DIVIDE</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">if</span> <span class="p">(</span><span class="nv">$num2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
+    <span class="p">{</span>
+      <span class="k">my</span> <span class="nv">$x</span> <span class="o">=</span> <span class="nn">tutorial::</span><span class="nv">InvalidOperation</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">();</span>
+      <span class="nv">$x</span><span class="o">-&gt;</span><span class="nv">whatOp</span><span class="p">(</span><span class="nv">$op</span><span class="p">);</span>
+      <span class="nv">$x</span><span class="o">-&gt;</span><span class="nv">why</span><span class="p">('</span><span class="s1">Cannot divide by 0</span><span class="p">');</span>
+      <span class="nb">die</span> <span class="nv">$x</span><span class="p">;</span>
+    <span class="p">}</span>
+    <span class="nv">$val</span> <span class="o">=</span> <span class="nv">$num1</span> <span class="o">/</span> <span class="nv">$num2</span><span class="p">;</span>
+  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+    <span class="k">my</span> <span class="nv">$x</span> <span class="o">=</span> <span class="nn">tutorial::</span><span class="nv">InvalidOperation</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">();</span>
+    <span class="nv">$x</span><span class="o">-&gt;</span><span class="nv">whatOp</span><span class="p">(</span><span class="nv">$op</span><span class="p">);</span>
+    <span class="nv">$x</span><span class="o">-&gt;</span><span class="nv">why</span><span class="p">('</span><span class="s1">Invalid operation</span><span class="p">');</span>
+    <span class="nb">die</span> <span class="nv">$x</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="k">my</span> <span class="nv">$log</span> <span class="o">=</span> <span class="nn">shared::</span><span class="nv">SharedStruct</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">();</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/perl/PerlServer.pl">tutorial/perl/PerlServer.pl</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/php.html b/output/tutorial/php.html
new file mode 100644
index 0000000..06e990b
--- /dev/null
+++ b/output/tutorial/php.html
@@ -0,0 +1,341 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - PHP</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>PHP Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen php tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cp">&lt;?php</span>
+
+<span class="kn">namespace</span> <span class="nn">tutorial\php</span><span class="p">;</span>
+
+<span class="nb">error_reporting</span><span class="p">(</span><span class="kc">E_ALL</span><span class="p">);</span>
+
+<span class="k">require_once</span> <span class="k">__DIR__</span><span class="mf">.</span><span class="s1">'/../../vendor/autoload.php'</span><span class="p">;</span>
+
+<span class="kn">use</span> <span class="nc">Thrift\ClassLoader\ThriftClassLoader</span><span class="p">;</span>
+
+<span class="nv">$GEN_DIR</span> <span class="o">=</span> <span class="nb">realpath</span><span class="p">(</span><span class="nb">dirname</span><span class="p">(</span><span class="k">__FILE__</span><span class="p">))</span><span class="mf">.</span><span class="s1">'/gen-php'</span><span class="p">;</span>
+
+<span class="nv">$loader</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ThriftClassLoader</span><span class="p">();</span>
+<span class="nv">$loader</span><span class="o">-&gt;</span><span class="nf">registerNamespace</span><span class="p">(</span><span class="s1">'Thrift'</span><span class="p">,</span> <span class="k">__DIR__</span> <span class="mf">.</span> <span class="s1">'/../../lib/php/lib'</span><span class="p">);</span>
+<span class="nv">$loader</span><span class="o">-&gt;</span><span class="nf">registerNamespace</span><span class="p">(</span><span class="s1">'shared'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span>
+<span class="nv">$loader</span><span class="o">-&gt;</span><span class="nf">registerNamespace</span><span class="p">(</span><span class="s1">'tutorial'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span>
+<span class="nv">$loader</span><span class="o">-&gt;</span><span class="nf">register</span><span class="p">();</span>
+
+<span class="cm">/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */</span>
+
+<span class="kn">use</span> <span class="nc">Thrift\Protocol\TBinaryProtocol</span><span class="p">;</span>
+<span class="kn">use</span> <span class="nc">Thrift\Transport\TSocket</span><span class="p">;</span>
+<span class="kn">use</span> <span class="nc">Thrift\Transport\THttpClient</span><span class="p">;</span>
+<span class="kn">use</span> <span class="nc">Thrift\Transport\TBufferedTransport</span><span class="p">;</span>
+<span class="kn">use</span> <span class="nc">Thrift\Exception\TException</span><span class="p">;</span>
+
+<span class="k">try</span> <span class="p">{</span>
+  <span class="k">if</span> <span class="p">(</span><span class="nb">array_search</span><span class="p">(</span><span class="s1">'--http'</span><span class="p">,</span> <span class="nv">$argv</span><span class="p">))</span> <span class="p">{</span>
+    <span class="nv">$socket</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">THttpClient</span><span class="p">(</span><span class="s1">'localhost'</span><span class="p">,</span> <span class="mi">8080</span><span class="p">,</span> <span class="s1">'/php/PhpServer.php'</span><span class="p">);</span>
+  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+    <span class="nv">$socket</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TSocket</span><span class="p">(</span><span class="s1">'localhost'</span><span class="p">,</span> <span class="mi">9090</span><span class="p">);</span>
+  <span class="p">}</span>
+  <span class="nv">$transport</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TBufferedTransport</span><span class="p">(</span><span class="nv">$socket</span><span class="p">,</span> <span class="mi">1024</span><span class="p">,</span> <span class="mi">1024</span><span class="p">);</span>
+  <span class="nv">$protocol</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TBinaryProtocol</span><span class="p">(</span><span class="nv">$transport</span><span class="p">);</span>
+  <span class="nv">$client</span> <span class="o">=</span> <span class="k">new</span> <span class="err">\</span><span class="nf">tutorial\CalculatorClient</span><span class="p">(</span><span class="nv">$protocol</span><span class="p">);</span>
+
+  <span class="nv">$transport</span><span class="o">-&gt;</span><span class="nf">open</span><span class="p">();</span>
+
+  <span class="nv">$client</span><span class="o">-&gt;</span><span class="nf">ping</span><span class="p">();</span>
+  <span class="k">print</span> <span class="s2">"ping()</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
+
+  <span class="nv">$sum</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="nf">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
+  <span class="k">print</span> <span class="s2">"1+1=</span><span class="nv">$sum</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
+
+  <span class="nv">$work</span> <span class="o">=</span> <span class="k">new</span> <span class="err">\</span><span class="nf">tutorial\Work</span><span class="p">();</span>
+
+  <span class="nv">$work</span><span class="o">-&gt;</span><span class="n">op</span> <span class="o">=</span> <span class="err">\</span><span class="nc">tutorial\Operation</span><span class="o">::</span><span class="no">DIVIDE</span><span class="p">;</span>
+  <span class="nv">$work</span><span class="o">-&gt;</span><span class="n">num1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
+  <span class="nv">$work</span><span class="o">-&gt;</span><span class="n">num2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+
+  <span class="k">try</span> <span class="p">{</span>
+    <span class="nv">$client</span><span class="o">-&gt;</span><span class="nf">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nv">$work</span><span class="p">);</span>
+    <span class="k">print</span> <span class="s2">"Whoa! We can divide by zero?</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
+  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="err">\</span><span class="nc">tutorial\InvalidOperation</span> <span class="nv">$io</span><span class="p">)</span> <span class="p">{</span>
+    <span class="k">print</span> <span class="s2">"InvalidOperation: </span><span class="nv">$io-&gt;why</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="nv">$work</span><span class="o">-&gt;</span><span class="n">op</span> <span class="o">=</span> <span class="err">\</span><span class="nc">tutorial\Operation</span><span class="o">::</span><span class="no">SUBTRACT</span><span class="p">;</span>
+  <span class="nv">$work</span><span class="o">-&gt;</span><span class="n">num1</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span>
+  <span class="nv">$work</span><span class="o">-&gt;</span><span class="n">num2</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
+  <span class="nv">$diff</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="nf">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nv">$work</span><span class="p">);</span>
+  <span class="k">print</span> <span class="s2">"15-10=</span><span class="nv">$diff</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
+
+  <span class="nv">$log</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="nf">getStruct</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
+  <span class="k">print</span> <span class="s2">"Log: </span><span class="nv">$log-&gt;value</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
+
+  <span class="nv">$transport</span><span class="o">-&gt;</span><span class="nf">close</span><span class="p">();</span>
+
+<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nc">TException</span> <span class="nv">$tx</span><span class="p">)</span> <span class="p">{</span>
+  <span class="k">print</span> <span class="s1">'TException: '</span><span class="mf">.</span><span class="nv">$tx</span><span class="o">-&gt;</span><span class="nf">getMessage</span><span class="p">()</span><span class="mf">.</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="cp">?&gt;</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/php/PhpClient.php">tutorial/php/PhpClient.php</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="cp">&lt;?php</span>
+
+<span class="kn">namespace</span> <span class="nn">tutorial\php</span><span class="p">;</span>
+
+<span class="nb">error_reporting</span><span class="p">(</span><span class="kc">E_ALL</span><span class="p">);</span>
+
+<span class="k">require_once</span> <span class="k">__DIR__</span><span class="mf">.</span><span class="s1">'/../../vendor/autoload.php'</span><span class="p">;</span>
+
+<span class="kn">use</span> <span class="nc">Thrift\ClassLoader\ThriftClassLoader</span><span class="p">;</span>
+
+<span class="nv">$GEN_DIR</span> <span class="o">=</span> <span class="nb">realpath</span><span class="p">(</span><span class="nb">dirname</span><span class="p">(</span><span class="k">__FILE__</span><span class="p">))</span><span class="mf">.</span><span class="s1">'/gen-php'</span><span class="p">;</span>
+
+<span class="nv">$loader</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ThriftClassLoader</span><span class="p">();</span>
+<span class="nv">$loader</span><span class="o">-&gt;</span><span class="nf">registerNamespace</span><span class="p">(</span><span class="s1">'Thrift'</span><span class="p">,</span> <span class="k">__DIR__</span> <span class="mf">.</span> <span class="s1">'/../../lib/php/lib'</span><span class="p">);</span>
+<span class="nv">$loader</span><span class="o">-&gt;</span><span class="nf">registerNamespace</span><span class="p">(</span><span class="s1">'shared'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span>
+<span class="nv">$loader</span><span class="o">-&gt;</span><span class="nf">registerNamespace</span><span class="p">(</span><span class="s1">'tutorial'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span>
+<span class="nv">$loader</span><span class="o">-&gt;</span><span class="nf">register</span><span class="p">();</span>
+
+<span class="cm">/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */</span>
+
+<span class="cm">/*
+ * This is not a stand-alone server.  It should be run as a normal
+ * php web script (like through Apache's mod_php) or as a cgi script
+ * (like with the included runserver.py).  You can connect to it with
+ * THttpClient in any language that supports it.  The PHP tutorial client
+ * will work if you pass it the argument "--http".
+ */</span>
+
+<span class="k">if</span> <span class="p">(</span><span class="nb">php_sapi_name</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'cli'</span><span class="p">)</span> <span class="p">{</span>
+  <span class="nb">ini_set</span><span class="p">(</span><span class="s2">"display_errors"</span><span class="p">,</span> <span class="s2">"stderr"</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="kn">use</span> <span class="nc">Thrift\Protocol\TBinaryProtocol</span><span class="p">;</span>
+<span class="kn">use</span> <span class="nc">Thrift\Transport\TPhpStream</span><span class="p">;</span>
+<span class="kn">use</span> <span class="nc">Thrift\Transport\TBufferedTransport</span><span class="p">;</span>
+
+<span class="kd">class</span> <span class="nc">CalculatorHandler</span> <span class="k">implements</span> <span class="err">\</span><span class="nc">tutorial\CalculatorIf</span> <span class="p">{</span>
+  <span class="k">protected</span> <span class="nv">$log</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
+
+  <span class="k">public</span> <span class="k">function</span> <span class="n">ping</span><span class="p">()</span> <span class="p">{</span>
+    <span class="nb">error_log</span><span class="p">(</span><span class="s2">"ping()"</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="k">public</span> <span class="k">function</span> <span class="n">add</span><span class="p">(</span><span class="nv">$num1</span><span class="p">,</span> <span class="nv">$num2</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nb">error_log</span><span class="p">(</span><span class="s2">"add(</span><span class="si">{</span><span class="nv">$num1</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="nv">$num2</span><span class="si">}</span><span class="s2">)"</span><span class="p">);</span>
+    <span class="k">return</span> <span class="nv">$num1</span> <span class="o">+</span> <span class="nv">$num2</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="k">public</span> <span class="k">function</span> <span class="n">calculate</span><span class="p">(</span><span class="nv">$logid</span><span class="p">,</span> <span class="err">\</span><span class="nc">tutorial\Work</span> <span class="nv">$w</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nb">error_log</span><span class="p">(</span><span class="s2">"calculate(</span><span class="si">{</span><span class="nv">$logid</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="nv">{$w-&gt;op</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num1</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num2</span><span class="si">}</span><span class="s2">})"</span><span class="p">);</span>
+    <span class="k">switch</span> <span class="p">(</span><span class="nv">$w</span><span class="o">-&gt;</span><span class="n">op</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">case</span> <span class="err">\</span><span class="nc">tutorial\Operation</span><span class="o">::</span><span class="no">ADD</span><span class="o">:</span>
+        <span class="nv">$val</span> <span class="o">=</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num1</span> <span class="o">+</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num2</span><span class="p">;</span>
+        <span class="k">break</span><span class="p">;</span>
+      <span class="k">case</span> <span class="err">\</span><span class="nc">tutorial\Operation</span><span class="o">::</span><span class="no">SUBTRACT</span><span class="o">:</span>
+        <span class="nv">$val</span> <span class="o">=</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num1</span> <span class="o">-</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num2</span><span class="p">;</span>
+        <span class="k">break</span><span class="p">;</span>
+      <span class="k">case</span> <span class="err">\</span><span class="nc">tutorial\Operation</span><span class="o">::</span><span class="no">MULTIPLY</span><span class="o">:</span>
+        <span class="nv">$val</span> <span class="o">=</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num1</span> <span class="o">*</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num2</span><span class="p">;</span>
+        <span class="k">break</span><span class="p">;</span>
+      <span class="k">case</span> <span class="err">\</span><span class="nc">tutorial\Operation</span><span class="o">::</span><span class="no">DIVIDE</span><span class="o">:</span>
+        <span class="k">if</span> <span class="p">(</span><span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
+          <span class="nv">$io</span> <span class="o">=</span> <span class="k">new</span> <span class="err">\</span><span class="nf">tutorial\InvalidOperation</span><span class="p">();</span>
+          <span class="nv">$io</span><span class="o">-&gt;</span><span class="n">whatOp</span> <span class="o">=</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">op</span><span class="p">;</span>
+          <span class="nv">$io</span><span class="o">-&gt;</span><span class="n">why</span> <span class="o">=</span> <span class="s2">"Cannot divide by 0"</span><span class="p">;</span>
+          <span class="k">throw</span> <span class="nv">$io</span><span class="p">;</span>
+        <span class="p">}</span>
+        <span class="nv">$val</span> <span class="o">=</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num1</span> <span class="o">/</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">num2</span><span class="p">;</span>
+        <span class="k">break</span><span class="p">;</span>
+      <span class="k">default</span><span class="o">:</span>
+        <span class="nv">$io</span> <span class="o">=</span> <span class="k">new</span> <span class="err">\</span><span class="nf">tutorial\InvalidOperation</span><span class="p">();</span>
+        <span class="nv">$io</span><span class="o">-&gt;</span><span class="n">whatOp</span> <span class="o">=</span> <span class="nv">$w</span><span class="o">-&gt;</span><span class="n">op</span><span class="p">;</span>
+        <span class="nv">$io</span><span class="o">-&gt;</span><span class="n">why</span> <span class="o">=</span> <span class="s2">"Invalid Operation"</span><span class="p">;</span>
+        <span class="k">throw</span> <span class="nv">$io</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="nv">$log</span> <span class="o">=</span> <span class="k">new</span> <span class="err">\</span><span class="nf">shared\SharedStruct</span><span class="p">();</span>
+    <span class="nv">$log</span><span class="o">-&gt;</span><span class="n">key</span> <span class="o">=</span> <span class="nv">$logid</span><span class="p">;</span>
+    <span class="nv">$log</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="n">string</span><span class="p">)</span><span class="nv">$val</span><span class="p">;</span>
+    <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">log</span><span class="p">[</span><span class="nv">$logid</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$log</span><span class="p">;</span>
+
+    <span class="k">return</span> <span class="nv">$val</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="k">public</span> <span class="k">function</span> <span class="n">getStruct</span><span class="p">(</span><span class="nv">$key</span><span class="p">)</span> <span class="p">{</span>
+    <span class="nb">error_log</span><span class="p">(</span><span class="s2">"getStruct(</span><span class="si">{</span><span class="nv">$key</span><span class="si">}</span><span class="s2">)"</span><span class="p">);</span>
+    <span class="c1">// This actually doesn't work because the PHP interpreter is</span>
+    <span class="c1">// restarted for every request.</span>
+    <span class="c1">//return $this-&gt;log[$key];</span>
+    <span class="k">return</span> <span class="k">new</span> <span class="err">\</span><span class="nf">shared\SharedStruct</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s2">"key"</span> <span class="o">=&gt;</span> <span class="nv">$key</span><span class="p">,</span> <span class="s2">"value"</span> <span class="o">=&gt;</span> <span class="s2">"PHP is stateless!"</span><span class="p">));</span>
+  <span class="p">}</span>
+
+  <span class="k">public</span> <span class="k">function</span> <span class="n">zip</span><span class="p">()</span> <span class="p">{</span>
+    <span class="nb">error_log</span><span class="p">(</span><span class="s2">"zip()"</span><span class="p">);</span>
+  <span class="p">}</span>
+
+<span class="p">};</span>
+
+<span class="nb">header</span><span class="p">(</span><span class="s1">'Content-Type'</span><span class="p">,</span> <span class="s1">'application/x-thrift'</span><span class="p">);</span>
+<span class="k">if</span> <span class="p">(</span><span class="nb">php_sapi_name</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'cli'</span><span class="p">)</span> <span class="p">{</span>
+  <span class="k">echo</span> <span class="s2">"</span><span class="se">\r\n</span><span class="s2">"</span><span class="p">;</span>
+<span class="p">}</span>
+
+<span class="nv">$handler</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">CalculatorHandler</span><span class="p">();</span>
+<span class="nv">$processor</span> <span class="o">=</span> <span class="k">new</span> <span class="err">\</span><span class="nf">tutorial\CalculatorProcessor</span><span class="p">(</span><span class="nv">$handler</span><span class="p">);</span>
+
+<span class="nv">$transport</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TBufferedTransport</span><span class="p">(</span><span class="k">new</span> <span class="nc">TPhpStream</span><span class="p">(</span><span class="nc">TPhpStream</span><span class="o">::</span><span class="no">MODE_R</span> <span class="o">|</span> <span class="nc">TPhpStream</span><span class="o">::</span><span class="no">MODE_W</span><span class="p">));</span>
+<span class="nv">$protocol</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TBinaryProtocol</span><span class="p">(</span><span class="nv">$transport</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
+
+<span class="nv">$transport</span><span class="o">-&gt;</span><span class="nf">open</span><span class="p">();</span>
+<span class="nv">$processor</span><span class="o">-&gt;</span><span class="nf">process</span><span class="p">(</span><span class="nv">$protocol</span><span class="p">,</span> <span class="nv">$protocol</span><span class="p">);</span>
+<span class="nv">$transport</span><span class="o">-&gt;</span><span class="nf">close</span><span class="p">();</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/php/PhpServer.php">tutorial/php/PhpServer.php</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/py.html b/output/tutorial/py.html
new file mode 100644
index 0000000..1e96f8c
--- /dev/null
+++ b/output/tutorial/py.html
@@ -0,0 +1,260 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Python</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Python Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen py tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="kn">import</span> <span class="nn">sys</span>
+<span class="kn">import</span> <span class="nn">glob</span>
+<span class="n">sys</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'gen-py'</span><span class="p">)</span>
+<span class="n">sys</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">glob</span><span class="p">.</span><span class="n">glob</span><span class="p">(</span><span class="s">'../../lib/py/build/lib*'</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
+
+<span class="kn">from</span> <span class="nn">tutorial</span> <span class="kn">import</span> <span class="n">Calculator</span>
+<span class="kn">from</span> <span class="nn">tutorial.ttypes</span> <span class="kn">import</span> <span class="n">InvalidOperation</span><span class="p">,</span> <span class="n">Operation</span><span class="p">,</span> <span class="n">Work</span>
+
+<span class="kn">from</span> <span class="nn">thrift</span> <span class="kn">import</span> <span class="n">Thrift</span>
+<span class="kn">from</span> <span class="nn">thrift.transport</span> <span class="kn">import</span> <span class="n">TSocket</span>
+<span class="kn">from</span> <span class="nn">thrift.transport</span> <span class="kn">import</span> <span class="n">TTransport</span>
+<span class="kn">from</span> <span class="nn">thrift.protocol</span> <span class="kn">import</span> <span class="n">TBinaryProtocol</span>
+
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+    <span class="c1"># Make socket
+</span>    <span class="n">transport</span> <span class="o">=</span> <span class="n">TSocket</span><span class="p">.</span><span class="n">TSocket</span><span class="p">(</span><span class="s">'localhost'</span><span class="p">,</span> <span class="mi">9090</span><span class="p">)</span>
+
+    <span class="c1"># Buffering is critical. Raw sockets are very slow
+</span>    <span class="n">transport</span> <span class="o">=</span> <span class="n">TTransport</span><span class="p">.</span><span class="n">TBufferedTransport</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
+
+    <span class="c1"># Wrap in a protocol
+</span>    <span class="n">protocol</span> <span class="o">=</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">TBinaryProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
+
+    <span class="c1"># Create a client to use the protocol encoder
+</span>    <span class="n">client</span> <span class="o">=</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">Client</span><span class="p">(</span><span class="n">protocol</span><span class="p">)</span>
+
+    <span class="c1"># Connect!
+</span>    <span class="n">transport</span><span class="p">.</span><span class="nb">open</span><span class="p">()</span>
+
+    <span class="n">client</span><span class="p">.</span><span class="n">ping</span><span class="p">()</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">'ping()'</span><span class="p">)</span>
+
+    <span class="n">sum_</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">'1+1=%d'</span> <span class="o">%</span> <span class="n">sum_</span><span class="p">)</span>
+
+    <span class="n">work</span> <span class="o">=</span> <span class="n">Work</span><span class="p">()</span>
+
+    <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">=</span> <span class="mi">1</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">=</span> <span class="mi">0</span>
+
+    <span class="k">try</span><span class="p">:</span>
+        <span class="n">quotient</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">'Whoa? You know how to divide by zero?'</span><span class="p">)</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">'FYI the answer is %d'</span> <span class="o">%</span> <span class="n">quotient</span><span class="p">)</span>
+    <span class="k">except</span> <span class="n">InvalidOperation</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">'InvalidOperation: %r'</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
+
+    <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">=</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">=</span> <span class="mi">15</span>
+    <span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">=</span> <span class="mi">10</span>
+
+    <span class="n">diff</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">'15-10=%d'</span> <span class="o">%</span> <span class="n">diff</span><span class="p">)</span>
+
+    <span class="n">log</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">getStruct</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">'Check log: %s'</span> <span class="o">%</span> <span class="n">log</span><span class="p">.</span><span class="n">value</span><span class="p">)</span>
+
+    <span class="c1"># Close!
+</span>    <span class="n">transport</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
+
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/py/PythonClient.py">tutorial/py/PythonClient.py</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="kn">import</span> <span class="nn">glob</span>
+<span class="kn">import</span> <span class="nn">sys</span>
+<span class="n">sys</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'gen-py'</span><span class="p">)</span>
+<span class="n">sys</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">glob</span><span class="p">.</span><span class="n">glob</span><span class="p">(</span><span class="s">'../../lib/py/build/lib*'</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
+
+<span class="kn">from</span> <span class="nn">tutorial</span> <span class="kn">import</span> <span class="n">Calculator</span>
+<span class="kn">from</span> <span class="nn">tutorial.ttypes</span> <span class="kn">import</span> <span class="n">InvalidOperation</span><span class="p">,</span> <span class="n">Operation</span>
+
+<span class="kn">from</span> <span class="nn">shared.ttypes</span> <span class="kn">import</span> <span class="n">SharedStruct</span>
+
+<span class="kn">from</span> <span class="nn">thrift.transport</span> <span class="kn">import</span> <span class="n">TSocket</span>
+<span class="kn">from</span> <span class="nn">thrift.transport</span> <span class="kn">import</span> <span class="n">TTransport</span>
+<span class="kn">from</span> <span class="nn">thrift.protocol</span> <span class="kn">import</span> <span class="n">TBinaryProtocol</span>
+<span class="kn">from</span> <span class="nn">thrift.server</span> <span class="kn">import</span> <span class="n">TServer</span>
+
+
+<span class="k">class</span> <span class="nc">CalculatorHandler</span><span class="p">:</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="p">.</span><span class="n">log</span> <span class="o">=</span> <span class="p">{}</span>
+
+    <span class="k">def</span> <span class="nf">ping</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">'ping()'</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">'add(%d,%d)'</span> <span class="o">%</span> <span class="p">(</span><span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">))</span>
+        <span class="k">return</span> <span class="n">n1</span> <span class="o">+</span> <span class="n">n2</span>
+
+    <span class="k">def</span> <span class="nf">calculate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logid</span><span class="p">,</span> <span class="n">work</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">'calculate(%d, %r)'</span> <span class="o">%</span> <span class="p">(</span><span class="n">logid</span><span class="p">,</span> <span class="n">work</span><span class="p">))</span>
+
+        <span class="k">if</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">==</span> <span class="n">Operation</span><span class="p">.</span><span class="n">ADD</span><span class="p">:</span>
+            <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">+</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span>
+        <span class="k">elif</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">==</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span><span class="p">:</span>
+            <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">-</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span>
+        <span class="k">elif</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">==</span> <span class="n">Operation</span><span class="p">.</span><span class="n">MULTIPLY</span><span class="p">:</span>
+            <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">*</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span>
+        <span class="k">elif</span> <span class="n">work</span><span class="p">.</span><span class="n">op</span> <span class="o">==</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="k">raise</span> <span class="n">InvalidOperation</span><span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">,</span> <span class="s">'Cannot divide by 0'</span><span class="p">)</span>
+            <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="n">num1</span> <span class="o">/</span> <span class="n">work</span><span class="p">.</span><span class="n">num2</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="n">InvalidOperation</span><span class="p">(</span><span class="n">work</span><span class="p">.</span><span class="n">op</span><span class="p">,</span> <span class="s">'Invalid operation'</span><span class="p">)</span>
+
+        <span class="n">log</span> <span class="o">=</span> <span class="n">SharedStruct</span><span class="p">()</span>
+        <span class="n">log</span><span class="p">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">logid</span>
+        <span class="n">log</span><span class="p">.</span><span class="n">value</span> <span class="o">=</span> <span class="s">'%d'</span> <span class="o">%</span> <span class="p">(</span><span class="n">val</span><span class="p">)</span>
+        <span class="bp">self</span><span class="p">.</span><span class="n">log</span><span class="p">[</span><span class="n">logid</span><span class="p">]</span> <span class="o">=</span> <span class="n">log</span>
+
+        <span class="k">return</span> <span class="n">val</span>
+
+    <span class="k">def</span> <span class="nf">getStruct</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">'getStruct(%d)'</span> <span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">))</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">log</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+    <span class="k">def</span> <span class="nf">zip</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="s">'zip()'</span><span class="p">)</span>
+
+
+<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
+    <span class="n">handler</span> <span class="o">=</span> <span class="n">CalculatorHandler</span><span class="p">()</span>
+    <span class="n">processor</span> <span class="o">=</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">Processor</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
+    <span class="n">transport</span> <span class="o">=</span> <span class="n">TSocket</span><span class="p">.</span><span class="n">TServerSocket</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s">'127.0.0.1'</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">9090</span><span class="p">)</span>
+    <span class="n">tfactory</span> <span class="o">=</span> <span class="n">TTransport</span><span class="p">.</span><span class="n">TBufferedTransportFactory</span><span class="p">()</span>
+    <span class="n">pfactory</span> <span class="o">=</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">TBinaryProtocolFactory</span><span class="p">()</span>
+
+    <span class="n">server</span> <span class="o">=</span> <span class="n">TServer</span><span class="p">.</span><span class="n">TSimpleServer</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="n">transport</span><span class="p">,</span> <span class="n">tfactory</span><span class="p">,</span> <span class="n">pfactory</span><span class="p">)</span>
+
+    <span class="c1"># You could do one of these for a multithreaded server
+</span>    <span class="c1"># server = TServer.TThreadedServer(
+</span>    <span class="c1">#     processor, transport, tfactory, pfactory)
+</span>    <span class="c1"># server = TServer.TThreadPoolServer(
+</span>    <span class="c1">#     processor, transport, tfactory, pfactory)
+</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">'Starting the server...'</span><span class="p">)</span>
+    <span class="n">server</span><span class="p">.</span><span class="n">serve</span><span class="p">()</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">'done.'</span><span class="p">)</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/py/PythonServer.py">tutorial/py/PythonServer.py</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>
diff --git a/output/tutorial/rb.html b/output/tutorial/rb.html
new file mode 100644
index 0000000..4880beb
--- /dev/null
+++ b/output/tutorial/rb.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+    <link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+    <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+    <script src="/static/js/thrift.js"></script>
+
+    <title>Apache Thrift - Ruby</title>
+  </head>
+  <body>
+    <div class="navbar">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/">Apache Thrift &trade;</a>
+      <div class="nav-collapse">
+        <ul class="nav pull-right">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/docs">Documentation</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/lib">Libraries</a></li>
+          <li><a href="/tutorial">Tutorial</a></li>
+          <li><a href="/test">Test Suite</a></li>
+          <li><a href="/about">About</a></li>
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
+              <li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
+              <li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
+            </ul>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+    <div class="container">
+      <h2>Ruby Tutorial</h2>
+
+<h3>Introduction</h3>
+
+<p>
+All Apache Thrift tutorials require that you have:
+
+<ol>
+  <li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
+  <li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
+    <pre><code>thrift -r --gen rb tutorial.thrift</code></pre>
+  </li>
+  <li>Followed all prerequisites listed below.</li>
+</ol>
+
+<h3 id="prerequisites">Prerequisites</h3>
+
+<h3 id="client">Client</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="vg">$:</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="s1">'gen-rb'</span><span class="p">)</span>
+<span class="vg">$:</span><span class="p">.</span><span class="nf">unshift</span> <span class="s1">'../../lib/rb/lib'</span>
+
+<span class="nb">require</span> <span class="s1">'thrift'</span>
+
+<span class="nb">require</span> <span class="s1">'calculator'</span>
+
+<span class="k">begin</span>
+  <span class="n">port</span> <span class="o">=</span> <span class="no">ARGV</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">||</span> <span class="mi">9090</span>
+
+  <span class="n">transport</span> <span class="o">=</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">BufferedTransport</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="no">Thrift</span><span class="o">::</span><span class="no">Socket</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s1">'localhost'</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
+  <span class="n">protocol</span> <span class="o">=</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">BinaryProtocol</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
+  <span class="n">client</span> <span class="o">=</span> <span class="no">Calculator</span><span class="o">::</span><span class="no">Client</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">protocol</span><span class="p">)</span>
+
+  <span class="n">transport</span><span class="p">.</span><span class="nf">open</span><span class="p">()</span>
+
+  <span class="n">client</span><span class="p">.</span><span class="nf">ping</span><span class="p">()</span>
+  <span class="nb">print</span> <span class="s2">"ping()</span><span class="se">\n</span><span class="s2">"</span>
+
+  <span class="n">sum</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
+  <span class="nb">print</span> <span class="s2">"1+1="</span><span class="p">,</span> <span class="n">sum</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
+
+  <span class="n">sum</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span>
+  <span class="nb">print</span> <span class="s2">"1+4="</span><span class="p">,</span> <span class="n">sum</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
+
+  <span class="n">work</span> <span class="o">=</span> <span class="no">Work</span><span class="p">.</span><span class="nf">new</span><span class="p">()</span>
+
+  <span class="n">work</span><span class="p">.</span><span class="nf">op</span> <span class="o">=</span> <span class="no">Operation</span><span class="o">::</span><span class="no">SUBTRACT</span>
+  <span class="n">work</span><span class="p">.</span><span class="nf">num1</span> <span class="o">=</span> <span class="mi">15</span>
+  <span class="n">work</span><span class="p">.</span><span class="nf">num2</span> <span class="o">=</span> <span class="mi">10</span>
+  <span class="n">diff</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="nf">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
+  <span class="nb">print</span> <span class="s2">"15-10="</span><span class="p">,</span> <span class="n">diff</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
+
+  <span class="n">log</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="nf">getStruct</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+  <span class="nb">print</span> <span class="s2">"Log: "</span><span class="p">,</span> <span class="n">log</span><span class="p">.</span><span class="nf">value</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
+
+  <span class="k">begin</span>
+    <span class="n">work</span><span class="p">.</span><span class="nf">op</span> <span class="o">=</span> <span class="no">Operation</span><span class="o">::</span><span class="no">DIVIDE</span>
+    <span class="n">work</span><span class="p">.</span><span class="nf">num1</span> <span class="o">=</span> <span class="mi">1</span>
+    <span class="n">work</span><span class="p">.</span><span class="nf">num2</span> <span class="o">=</span> <span class="mi">0</span>
+    <span class="n">quot</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="nf">calculate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
+    <span class="nb">puts</span> <span class="s2">"Whoa, we can divide by 0 now?"</span>
+  <span class="k">rescue</span> <span class="no">InvalidOperation</span> <span class="o">=&gt;</span> <span class="n">io</span>
+    <span class="nb">print</span> <span class="s2">"InvalidOperation: "</span><span class="p">,</span> <span class="n">io</span><span class="p">.</span><span class="nf">why</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
+  <span class="k">end</span>
+
+  <span class="n">client</span><span class="p">.</span><span class="nf">zip</span><span class="p">()</span>
+  <span class="nb">print</span> <span class="s2">"zip</span><span class="se">\n</span><span class="s2">"</span>
+
+  <span class="n">transport</span><span class="p">.</span><span class="nf">close</span><span class="p">()</span>
+
+<span class="k">rescue</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">Exception</span> <span class="o">=&gt;</span> <span class="n">tx</span>
+  <span class="nb">print</span> <span class="s1">'Thrift::Exception: '</span><span class="p">,</span> <span class="n">tx</span><span class="p">.</span><span class="nf">message</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
+<span class="k">end</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/rb/RubyClient.rb">tutorial/rb/RubyClient.rb</a>
+</p>
+
+<h3 id="server">Server</h3>
+
+<div class="highlight"><pre class="codehilite"><code><span class="vg">$:</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="s1">'gen-rb'</span><span class="p">)</span>
+<span class="vg">$:</span><span class="p">.</span><span class="nf">unshift</span> <span class="s1">'../../lib/rb/lib'</span>
+
+<span class="nb">require</span> <span class="s1">'thrift'</span>
+
+<span class="nb">require</span> <span class="s1">'calculator'</span>
+<span class="nb">require</span> <span class="s1">'shared_types'</span>
+
+<span class="k">class</span> <span class="nc">CalculatorHandler</span>
+  <span class="k">def</span> <span class="nf">initialize</span><span class="p">()</span>
+    <span class="vi">@log</span> <span class="o">=</span> <span class="p">{}</span>
+  <span class="k">end</span>
+
+  <span class="k">def</span> <span class="nf">ping</span><span class="p">()</span>
+    <span class="nb">puts</span> <span class="s2">"ping()"</span>
+  <span class="k">end</span>
+
+  <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">)</span>
+    <span class="nb">print</span> <span class="s2">"add("</span><span class="p">,</span> <span class="n">n1</span><span class="p">,</span> <span class="s2">","</span><span class="p">,</span> <span class="n">n2</span><span class="p">,</span> <span class="s2">")</span><span class="se">\n</span><span class="s2">"</span>
+    <span class="k">return</span> <span class="n">n1</span> <span class="o">+</span> <span class="n">n2</span>
+  <span class="k">end</span>
+
+  <span class="k">def</span> <span class="nf">calculate</span><span class="p">(</span><span class="n">logid</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
+    <span class="nb">print</span> <span class="s2">"calculate("</span><span class="p">,</span> <span class="n">logid</span><span class="p">,</span> <span class="s2">", {"</span><span class="p">,</span> <span class="n">work</span><span class="p">.</span><span class="nf">op</span><span class="p">,</span> <span class="s2">","</span><span class="p">,</span> <span class="n">work</span><span class="p">.</span><span class="nf">num1</span><span class="p">,</span> <span class="s2">","</span><span class="p">,</span> <span class="n">work</span><span class="p">.</span><span class="nf">num2</span><span class="p">,</span><span class="s2">"})</span><span class="se">\n</span><span class="s2">"</span>
+    <span class="k">if</span> <span class="n">work</span><span class="p">.</span><span class="nf">op</span> <span class="o">==</span> <span class="no">Operation</span><span class="o">::</span><span class="no">ADD</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="nf">num1</span> <span class="o">+</span> <span class="n">work</span><span class="p">.</span><span class="nf">num2</span>
+    <span class="k">elsif</span> <span class="n">work</span><span class="p">.</span><span class="nf">op</span> <span class="o">==</span> <span class="no">Operation</span><span class="o">::</span><span class="no">SUBTRACT</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="nf">num1</span> <span class="o">-</span> <span class="n">work</span><span class="p">.</span><span class="nf">num2</span>
+    <span class="k">elsif</span> <span class="n">work</span><span class="p">.</span><span class="nf">op</span> <span class="o">==</span> <span class="no">Operation</span><span class="o">::</span><span class="no">MULTIPLY</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="nf">num1</span> <span class="o">*</span> <span class="n">work</span><span class="p">.</span><span class="nf">num2</span>
+    <span class="k">elsif</span> <span class="n">work</span><span class="p">.</span><span class="nf">op</span> <span class="o">==</span> <span class="no">Operation</span><span class="o">::</span><span class="no">DIVIDE</span>
+      <span class="k">if</span> <span class="n">work</span><span class="p">.</span><span class="nf">num2</span> <span class="o">==</span> <span class="mi">0</span>
+        <span class="n">x</span> <span class="o">=</span> <span class="no">InvalidOperation</span><span class="p">.</span><span class="nf">new</span><span class="p">()</span>
+        <span class="n">x</span><span class="p">.</span><span class="nf">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="nf">op</span>
+        <span class="n">x</span><span class="p">.</span><span class="nf">why</span> <span class="o">=</span> <span class="s2">"Cannot divide by 0"</span>
+        <span class="k">raise</span> <span class="n">x</span>
+      <span class="k">end</span>
+      <span class="n">val</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="nf">num1</span> <span class="o">/</span> <span class="n">work</span><span class="p">.</span><span class="nf">num2</span>
+    <span class="k">else</span>
+      <span class="n">x</span> <span class="o">=</span> <span class="no">InvalidOperation</span><span class="p">.</span><span class="nf">new</span><span class="p">()</span>
+      <span class="n">x</span><span class="p">.</span><span class="nf">whatOp</span> <span class="o">=</span> <span class="n">work</span><span class="p">.</span><span class="nf">op</span>
+      <span class="n">x</span><span class="p">.</span><span class="nf">why</span> <span class="o">=</span> <span class="s2">"Invalid operation"</span>
+      <span class="k">raise</span> <span class="n">x</span>
+    <span class="k">end</span>
+
+    <span class="n">entry</span> <span class="o">=</span> <span class="no">SharedStruct</span><span class="p">.</span><span class="nf">new</span><span class="p">()</span>
+    <span class="n">entry</span><span class="p">.</span><span class="nf">key</span> <span class="o">=</span> <span class="n">logid</span>
+    <span class="n">entry</span><span class="p">.</span><span class="nf">value</span> <span class="o">=</span> <span class="s2">"</span><span class="si">#{</span><span class="n">val</span><span class="si">}</span><span class="s2">"</span>
+    <span class="vi">@log</span><span class="p">[</span><span class="n">logid</span><span class="p">]</span> <span class="o">=</span> <span class="n">entry</span>
+
+    <span class="k">return</span> <span class="n">val</span>
+
+  <span class="k">end</span>
+
+  <span class="k">def</span> <span class="nf">getStruct</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+    <span class="nb">print</span> <span class="s2">"getStruct("</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s2">")</span><span class="se">\n</span><span class="s2">"</span>
+    <span class="k">return</span> <span class="vi">@log</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+  <span class="k">end</span>
+
+  <span class="k">def</span> <span class="nf">zip</span><span class="p">()</span>
+    <span class="nb">print</span> <span class="s2">"zip</span><span class="se">\n</span><span class="s2">"</span>
+  <span class="k">end</span>
+
+<span class="k">end</span>
+
+<span class="n">handler</span> <span class="o">=</span> <span class="no">CalculatorHandler</span><span class="p">.</span><span class="nf">new</span><span class="p">()</span>
+<span class="n">processor</span> <span class="o">=</span> <span class="no">Calculator</span><span class="o">::</span><span class="no">Processor</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
+<span class="n">transport</span> <span class="o">=</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">ServerSocket</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">9090</span><span class="p">)</span>
+<span class="n">transportFactory</span> <span class="o">=</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">BufferedTransportFactory</span><span class="p">.</span><span class="nf">new</span><span class="p">()</span>
+<span class="n">server</span> <span class="o">=</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">SimpleServer</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="n">transport</span><span class="p">,</span> <span class="n">transportFactory</span><span class="p">)</span>
+
+<span class="nb">puts</span> <span class="s2">"Starting the server..."</span>
+<span class="n">server</span><span class="p">.</span><span class="nf">serve</span><span class="p">()</span>
+<span class="nb">puts</span> <span class="s2">"done."</span>
+</code></pre></div>
+<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
+<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/rb/RubyServer.rb">tutorial/rb/RubyServer.rb</a>
+</p>
+
+<h2 id="additional-information">Additional Information</h2>
+
+
+
+    </div>
+    <div class="container">
+  <hr>
+  <footer class="footer">
+    <div class="row">
+      <div class="span3">
+        <h3>Links</h3>
+        <ul class="unstyled">
+          <li><a href="/download">Download</a></li>
+          <li><a href="/developers">Developers</a></li>
+          <li><a href="/tutorial">Tutorials</a></li>
+        </ul>
+        <ul class="unstyled">
+          <li><a href="/sitemap">Sitemap</a></li>
+        </ul>
+      </div>
+      <div class="span3">
+        <h3>Get Involved</h3>
+        <ul class="unstyled">
+          <li><a href="/mailing">Mailing Lists</a></li>
+          <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+          <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+        </ul>
+      </div>
+      <div class="span6">
+        <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+        Copyright &copy; 2020 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+        Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+        Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+      </div>
+    </div>
+  </footer>
+</div>
+
+  </body>
+</html>