Added: tinkerpop/site/docs/3.2.6-SNAPSHOT/dev/developer/index.html
URL: 
http://svn.apache.org/viewvc/tinkerpop/site/docs/3.2.6-SNAPSHOT/dev/developer/index.html?rev=1799018&view=auto
==============================================================================
--- tinkerpop/site/docs/3.2.6-SNAPSHOT/dev/developer/index.html (added)
+++ tinkerpop/site/docs/3.2.6-SNAPSHOT/dev/developer/index.html Sat Jun 17 
18:56:29 2017
@@ -0,0 +1,4129 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta name="generator" content="Asciidoctor 0.1.4">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Developer Documentation</title>
+<style>
+/*
+ * 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.
+ */
+
+/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
+/* ========================================================================== 
HTML5 display definitions 
========================================================================== */
+/** Correct `block` display not defined in IE 8/9. */
+@import 
url(http://cdnjs.cloudflare.com/ajax/libs/font-awesome/3.2.1/css/font-awesome.css);
+article, aside, details, figcaption, figure, footer, header, hgroup, main, 
nav, section, summary { display: block; }
+
+/** Correct `inline-block` display not defined in IE 8/9. */
+audio, canvas, video { display: inline-block; }
+
+/** Prevent modern browsers from displaying `audio` without controls. Remove 
excess height in iOS 5 devices. */
+audio:not([controls]) { display: none; height: 0; }
+
+/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` 
element in IE, Safari, and Firefox < 22. */
+[hidden], template { display: none; }
+
+script { display: none !important; }
+
+/* ========================================================================== 
Base ========================================================================== 
*/
+/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust 
after orientation change, without disabling user zoom. */
+html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ 
-webkit-text-size-adjust: 100%; /* 2 */ }
+
+/** Remove default margin. */
+body { margin: 0; }
+
+/* ========================================================================== 
Links 
========================================================================== */
+/** Remove the gray background color from active links in IE 10. */
+a { background: transparent; }
+
+/** Address `outline` inconsistency between Chrome and other browsers. */
+a:focus { outline: thin dotted; }
+
+/** Improve readability when focused and also mouse hovered in all browsers. */
+a:active, a:hover { outline: 0; }
+
+/* ========================================================================== 
Typography 
========================================================================== */
+/** Address variable `h1` font-size and margin within `section` and `article` 
contexts in Firefox 4+, Safari 5, and Chrome. */
+h1 { font-size: 2em; margin: 0.67em 0; }
+
+/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
+abbr[title] { border-bottom: 1px dotted; }
+
+/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
+b, strong { font-weight: bold; }
+
+/** Address styling not present in Safari 5 and Chrome. */
+dfn { font-style: italic; }
+
+/** Address differences between Firefox and other browsers. */
+hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }
+
+/** Address styling not present in IE 8/9. */
+mark { background: #ff0; color: #000; }
+
+/** Correct font family set oddly in Safari 5 and Chrome. */
+code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }
+
+/** Improve readability of pre-formatted text in all browsers. */
+pre { white-space: pre-wrap; }
+
+/** Set consistent quote types. */
+q { quotes: "\201C" "\201D" "\2018" "\2019"; }
+
+/** Address inconsistent and variable font size in all browsers. */
+small { font-size: 80%; }
+
+/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
+sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: 
baseline; }
+
+sup { top: -0.5em; }
+
+sub { bottom: -0.25em; }
+
+/* ========================================================================== 
Embedded content 
========================================================================== */
+/** Remove border when inside `a` element in IE 8/9. */
+img { border: 0; }
+
+/** Correct overflow displayed oddly in IE 9. */
+svg:not(:root) { overflow: hidden; }
+
+/* ========================================================================== 
Figures 
========================================================================== */
+/** Address margin not present in IE 8/9 and Safari 5. */
+figure { margin: 0; }
+
+/* ========================================================================== 
Forms 
========================================================================== */
+/** Define consistent border, margin, and padding. */
+fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 
0.75em; }
+
+/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so 
people aren't caught out if they zero out fieldsets. */
+legend { border: 0; /* 1 */ padding: 0; /* 2 */ }
+
+/** 1. Correct font family not being inherited in all browsers. 2. Correct 
font size not being inherited in all browsers. 3. Address margins set 
differently in Firefox 4+, Safari 5, and Chrome. */
+button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 
100%; /* 2 */ margin: 0; /* 3 */ }
+
+/** Address Firefox 4+ setting `line-height` on `input` using `!important` in 
the UA stylesheet. */
+button, input { line-height: normal; }
+
+/** Address inconsistent `text-transform` inheritance for `button` and 
`select`. All other form control elements do not inherit `text-transform` 
values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. 
Correct `select` style inheritance in Firefox 4+ and Opera. */
+button, select { text-transform: none; }
+
+/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 
and `video` controls. 2. Correct inability to style clickable `input` types in 
iOS. 3. Improve usability and consistency of cursor style between image-type 
`input` and others. */
+button, html input[type="button"], input[type="reset"], input[type="submit"] { 
-webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }
+
+/** Re-set default cursor for disabled elements. */
+button[disabled], html input[disabled] { cursor: default; }
+
+/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess 
padding in IE 8/9. */
+input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ 
padding: 0; /* 2 */ }
+
+/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. 
Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` 
to future-proof). */
+input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: 
content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }
+
+/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS 
X. */
+input[type="search"]::-webkit-search-cancel-button, 
input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
+
+/** Remove inner padding and border in Firefox 4+. */
+button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
+
+/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and 
alignment in all browsers. */
+textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }
+
+/* ========================================================================== 
Tables 
========================================================================== */
+/** Remove most spacing between table cells. */
+table { border-collapse: collapse; border-spacing: 0; }
+
+meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; 
width: 768px; }
+
+meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; 
width: 1280px; }
+
+meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; 
width: 1440px; }
+
+*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: 
border-box; box-sizing: border-box; }
+
+html, body { font-size: 100%; }
+
+body { background: white; color: #222222; padding: 0; margin: 0; font-family: 
"Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: 
normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }
+
+a:hover { cursor: pointer; }
+
+img, object, embed { max-width: 100%; height: auto; }
+
+object, embed { height: 100%; }
+
+img { -ms-interpolation-mode: bicubic; }
+
+#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, 
.map_canvas embed, .map_canvas object { max-width: none !important; }
+
+.left { float: left !important; }
+
+.right { float: right !important; }
+
+.text-left { text-align: left !important; }
+
+.text-right { text-align: right !important; }
+
+.text-center { text-align: center !important; }
+
+.text-justify { text-align: justify !important; }
+
+.hide { display: none; }
+
+.antialiased, body { -webkit-font-smoothing: antialiased; }
+
+img { display: inline-block; vertical-align: middle; }
+
+textarea { height: auto; min-height: 50px; }
+
+select { width: 100%; }
+
+p.lead, .paragraph.lead > p, #preamble > .sectionbody > 
.paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }
+
+.subheader, #content #toctitle, .admonitionblock td.content > .title, 
.exampleblock > .title, .imageblock > .title, .listingblock > .title, 
.literalblock > .title, .mathblock > .title, .openblock > .title, .paragraph > 
.title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, 
.verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, 
.ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { 
line-height: 1.4; color: #6c818f; font-weight: 300; margin-top: 0.2em; 
margin-bottom: 0.5em; }
+
+/* Typography resets */
+div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > 
.title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; 
direction: ltr; }
+
+/* Default Link Styles */
+a { color: #444444; text-decoration: underline; line-height: inherit; }
+a:hover, a:focus { color: #111111; }
+a img { border: none; }
+
+/* Default paragraph styles */
+p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 
1.5; margin-bottom: 1.25em; text-rendering: optimizeLegibility; }
+p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }
+
+/* Default header styles */
+h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { 
font-family: ff-meta-web-pro-1, ff-meta-web-pro-2, Arial, "Helvetica Neue", 
sans-serif; font-weight: bold; font-style: normal; color: #465158; 
text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; 
line-height: 1.2125em; }
+h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > 
.title small, h4 small, h5 small, h6 small { font-size: 60%; color: #909ea7; 
line-height: 0; }
+
+h1 { font-size: 2.125em; }
+
+h2 { font-size: 1.6875em; }
+
+h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }
+
+h4 { font-size: 1.125em; }
+
+h5 { font-size: 1.125em; }
+
+h6 { font-size: 1em; }
+
+hr { border: solid #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 
0 1.1875em; height: 0; }
+
+/* Helpful Typography Defaults */
+em, i { font-style: italic; line-height: inherit; }
+
+strong, b { font-weight: bold; line-height: inherit; }
+
+small { font-size: 60%; line-height: inherit; }
+
+code { font-family: "Consolas", "Deja Vu Sans Mono", "Bitstream Vera Sans 
Mono", monospace; font-weight: normal; color: #444444; }
+
+/* Lists */
+ul, ol, dl { font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; 
list-style-position: outside; font-family: inherit; }
+
+ul, ol { margin-left: 0; }
+ul.no-bullet, ol.no-bullet { margin-left: 0; }
+
+/* Unordered Lists */
+ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* 
Override nested font-size change */ }
+ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
+ul.square { list-style-type: square; }
+ul.circle { list-style-type: circle; }
+ul.disc { list-style-type: disc; }
+ul.no-bullet { list-style: none; }
+
+/* Ordered Lists */
+ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }
+
+/* Definition Lists */
+dl dt { margin-bottom: 0.3em; font-weight: bold; }
+dl dd { margin-bottom: 0.75em; }
+
+/* Abbreviations */
+abbr, acronym { text-transform: uppercase; font-size: 90%; color: black; 
border-bottom: 1px dotted #dddddd; cursor: help; }
+
+abbr { text-transform: none; }
+
+/* Blockquotes */
+blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; 
border-left: 1px solid #dddddd; }
+blockquote cite { display: block; font-size: 0.8125em; color: #748590; }
+blockquote cite:before { content: "\2014 \0020"; }
+blockquote cite a, blockquote cite a:visited { color: #748590; }
+
+blockquote, blockquote p { line-height: 1.5; color: #909ea7; }
+
+/* Microformats */
+.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid 
#dddddd; padding: 0.625em 0.75em; }
+.vcard li { margin: 0; display: block; }
+.vcard .fn { font-weight: bold; font-size: 0.9375em; }
+
+.vevent .summary { font-weight: bold; }
+.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: 
none; padding: 0 0.0625em; }
+
+@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, 
.sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
+  h1 { font-size: 2.75em; }
+  h2 { font-size: 2.3125em; }
+  h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
+  h4 { font-size: 1.4375em; } }
+/* Print styles.  Inlined to avoid required HTTP connection: 
www.phpied.com/delay-loading-your-print-css/ Credit to Paul Irish and HTML5 
Boilerplate (html5boilerplate.com)
+*/
+.print-only { display: none !important; }
+
+@media print { * { background: transparent !important; color: #000 !important; 
/* Black prints faster: h5bp.com/s */ box-shadow: none !important; text-shadow: 
none !important; }
+  a, a:visited { text-decoration: underline; }
+  a[href]:after { content: " (" attr(href) ")"; }
+  abbr[title]:after { content: " (" attr(title) ")"; }
+  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; 
}
+  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
+  thead { display: table-header-group; /* h5bp.com/t */ }
+  tr, img { page-break-inside: avoid; }
+  img { max-width: 100% !important; }
+  @page { margin: 0.5cm; }
+  p, h2, h3, #toctitle, .sidebarblock > .content > .title { orphans: 3; 
widows: 3; }
+  h2, h3, #toctitle, .sidebarblock > .content > .title { page-break-after: 
avoid; }
+  .hide-on-print { display: none !important; }
+  .print-only { display: block !important; }
+  .hide-for-print { display: none !important; }
+  .show-for-print { display: inherit !important; } }
+/* Tables */
+table { background: white; margin-bottom: 1.25em; border: solid 0 #dddddd; }
+table thead, table tfoot { background: none; font-weight: bold; }
+table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { 
padding: 1px 8px 1px 5px; font-size: 1em; color: #222222; text-align: left; }
+table tr th, table tr td { padding: 1px 8px 1px 5px; font-size: 1em; color: 
#222222; }
+table tr.even, table tr.alt, table tr:nth-of-type(even) { background: none; }
+table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table 
tfoot tr td { display: table-cell; line-height: 1.5; }
+
+.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { 
content: " "; display: table; }
+.clearfix:after, .float-group:after { clear: both; }
+
+*:not(pre) > code { font-size: 0.95em; padding: 0; white-space: nowrap; 
background-color: #f2f2f2; border: 0 solid #dddddd; -webkit-border-radius: 6px; 
border-radius: 6px; text-shadow: none; }
+
+pre, pre > code { line-height: 1.2; color: inherit; font-family: "Consolas", 
"Deja Vu Sans Mono", "Bitstream Vera Sans Mono", monospace; font-weight: 
normal; }
+
+.keyseq { color: #333333; }
+
+kbd:not(.keyseq) { display: inline-block; color: black; font-size: 0.75em; 
line-height: 1.4; background-color: #F7F7F7; border: 1px solid #ccc; 
-webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 
rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 
0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 
0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; }
+
+.keyseq kbd:first-child { margin-left: 0; }
+
+.keyseq kbd:last-child { margin-right: 0; }
+
+.menuseq, .menu { color: black; }
+
+b.button:before, b.button:after { position: relative; top: -1px; font-weight: 
normal; }
+
+b.button:before { content: "["; padding: 0 3px 0 2px; }
+
+b.button:after { content: "]"; padding: 0 2px 0 3px; }
+
+p a > code:hover { color: #373737; }
+
+#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; 
margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 
1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
+#header:before, #header:after, #content:before, #content:after, 
#footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " 
"; display: table; }
+#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }
+
+#header { margin-bottom: 2.5em; }
+#header > h1 { color: #111111; font-weight: bold; border-bottom: 1px solid 
#dddddd; margin-bottom: -28px; padding-bottom: 32px; }
+#header span { color: #909ea7; }
+#header #revnumber { text-transform: capitalize; }
+#header br { display: none; }
+#header br + span { padding-left: 3px; }
+#header br + span:before { content: "\2013 \0020"; }
+#header br + span.author { padding-left: 0; }
+#header br + span.author:before { content: ", "; }
+
+#toc { border-bottom: 1px solid #dddddd; padding-bottom: 1.25em; }
+#toc > ul { margin-left: 0.25em; }
+#toc ul.sectlevel0 > li > a { font-style: italic; }
+#toc ul.sectlevel0 ul.sectlevel1 { margin-left: 0; margin-top: 0.5em; 
margin-bottom: 0.5em; }
+#toc ul { list-style-type: none; }
+
+#toctitle { color: #6c818f; }
+
+@media only screen and (min-width: 768px) { body.toc2 { padding-left: 15em; 
padding-right: 0; }
+  #toc.toc2 { position: fixed; width: 15em; left: 0; top: 0; border-right: 1px 
solid #dddddd; border-bottom: 0; z-index: 1000; padding: 1em; height: 100%; 
overflow: auto; }
+  #toc.toc2 #toctitle { margin-top: 0; font-size: 1.2em; }
+  #toc.toc2 > ul { font-size: .90em; }
+  #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; }
+  #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; 
margin-bottom: 0.5em; }
+  body.toc2.toc-right { padding-left: 0; padding-right: 15em; }
+  body.toc2.toc-right #toc.toc2 { border-right: 0; border-left: 1px solid 
#dddddd; left: auto; right: 0; } }
+@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; 
padding-right: 0; }
+  #toc.toc2 { width: 20em; }
+  #toc.toc2 #toctitle { font-size: 1.375em; }
+  #toc.toc2 > ul { font-size: 0.95em; }
+  #toc.toc2 ul ul { padding-left: 1.25em; }
+  body.toc2.toc-right { padding-left: 0; padding-right: 20em; } }
+#content #toc { border-style: solid; border-width: 1px; border-color: #d9d9d9; 
margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; border-width: 0; 
-webkit-border-radius: 6px; border-radius: 6px; }
+#content #toc > :first-child { margin-top: 0; }
+#content #toc > :last-child { margin-bottom: 0; }
+#content #toc a { text-decoration: none; }
+
+#content #toctitle { font-weight: bold; font-family: ff-meta-web-pro-1, 
ff-meta-web-pro-2, Arial, "Helvetica Neue", sans-serif; font-size: 1em; 
padding-left: 0.125em; }
+
+#footer { max-width: 100%; background-color: black; padding: 1.25em; }
+
+#footer-text { color: white; line-height: 1.35; }
+
+.sect1 { padding-bottom: 1.25em; }
+
+.sect1 + .sect1 { border-top: 1px solid #dddddd; }
+
+#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, 
.sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 
> a.anchor { position: absolute; width: 1em; margin-left: -1em; display: block; 
text-decoration: none; visibility: hidden; text-align: center; font-weight: 
normal; }
+#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, 
#toctitle > a.anchor:before, .sidebarblock > .content > .title > 
a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > 
a.anchor:before { content: '\00A7'; font-size: .85em; vertical-align: text-top; 
display: block; margin-top: 0.05em; }
+#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > 
a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, 
.sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, 
#toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, 
h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > 
a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; 
}
+#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, 
.sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > 
a.link { color: #465158; text-decoration: none; }
+#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > 
a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > 
a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #3b444a; }
+
+.imageblock, .literalblock, .listingblock, .mathblock, .verseblock, 
.videoblock { margin-bottom: 1.25em; }
+
+.admonitionblock td.content > .title, .exampleblock > .title, .imageblock > 
.title, .listingblock > .title, .literalblock > .title, .mathblock > .title, 
.openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > 
.title, .tableblock > .title, .verseblock > .title, .videoblock > .title, 
.dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > 
.title { text-align: left; font-weight: bold; }
+
+.tableblock > caption { text-align: left; font-weight: bold; white-space: 
nowrap; overflow: visible; max-width: 0; }
+
+table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { 
font-size: inherit; }
+
+.admonitionblock > table { border: 0; background: none; width: 100%; }
+.admonitionblock > table td.icon { text-align: center; width: 80px; }
+.admonitionblock > table td.icon img { max-width: none; }
+.admonitionblock > table td.icon .title { font-weight: bold; text-transform: 
uppercase; }
+.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 
1.25em; border-left: 1px solid #dddddd; color: #909ea7; }
+.admonitionblock > table td.content > :last-child > :last-child { 
margin-bottom: 0; }
+
+.exampleblock > .content { border-style: solid; border-width: 1px; 
border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: 
white; -webkit-border-radius: 6px; border-radius: 6px; }
+.exampleblock > .content > :first-child { margin-top: 0; }
+.exampleblock > .content > :last-child { margin-bottom: 0; }
+.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > 
.content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > 
.content > .title, .exampleblock > .content h4, .exampleblock > .content h5, 
.exampleblock > .content h6, .exampleblock > .content p { color: #333333; }
+.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > 
.content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > 
.content > .title, .exampleblock > .content h4, .exampleblock > .content h5, 
.exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; }
+.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, 
.exampleblock > .content h3.subheader, .exampleblock > .content 
.subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, 
.exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, 
.exampleblock > .content h6.subheader { line-height: 1.4; }
+
+.exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #d9d9d9; 
box-shadow: 0 1px 8px #d9d9d9; }
+
+.sidebarblock { border-style: solid; border-width: 1px; border-color: #d9d9d9; 
margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; 
-webkit-border-radius: 6px; border-radius: 6px; }
+.sidebarblock > :first-child { margin-top: 0; }
+.sidebarblock > :last-child { margin-bottom: 0; }
+.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, 
.sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, 
.sidebarblock h6, .sidebarblock p { color: #333333; }
+.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, 
.sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, 
.sidebarblock h6 { line-height: 1; margin-bottom: 0.625em; }
+.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock 
h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > 
.subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, 
.sidebarblock h6.subheader { line-height: 1.4; }
+.sidebarblock > .content > .title { color: #6c818f; margin-top: 0; 
line-height: 1.5; }
+
+.exampleblock > .content > :last-child > :last-child, .exampleblock > .content 
.olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul 
> li:last-child > :last-child, .exampleblock > .content .qlist > ol > 
li:last-child > :last-child, .sidebarblock > .content > :last-child > 
:last-child, .sidebarblock > .content .olist > ol > li:last-child > 
:last-child, .sidebarblock > .content .ulist > ul > li:last-child > 
:last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child 
{ margin-bottom: 0; }
+
+.literalblock pre:not([class]), .listingblock pre:not([class]) { background: 
#eeeeee; }
+.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock 
pre[class] { border-width: 1px; border-style: solid; border-color: #cccccc; 
-webkit-border-radius: 6px; border-radius: 6px; padding: 0.5em; word-wrap: 
break-word; }
+.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock 
pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: 
pre; word-wrap: normal; }
+.literalblock pre > code, .literalblock pre[class] > code, .listingblock pre > 
code, .listingblock pre[class] > code { display: block; }
+@media only screen { .literalblock pre, .literalblock pre[class], 
.listingblock pre, .listingblock pre[class] { font-size: 0.76em; } }
+@media only screen and (min-width: 768px) { .literalblock pre, .literalblock 
pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.855em; } 
}
+@media only screen and (min-width: 1280px) { .literalblock pre, .literalblock 
pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.95em; } }
+
+.listingblock pre.highlight { padding: 0; }
+.listingblock pre.highlight > code { padding: 0.5em; }
+
+.listingblock > .content { position: relative; }
+
+.listingblock:hover code[class*=" language-"]:before { text-transform: 
uppercase; font-size: 0.9em; color: #999; position: absolute; top: 0.375em; 
right: 0.375em; }
+
+.listingblock:hover code.asciidoc:before { content: "asciidoc"; }
+.listingblock:hover code.clojure:before { content: "clojure"; }
+.listingblock:hover code.css:before { content: "css"; }
+.listingblock:hover code.groovy:before { content: "groovy"; }
+.listingblock:hover code.html:before { content: "html"; }
+.listingblock:hover code.java:before { content: "java"; }
+.listingblock:hover code.javascript:before { content: "javascript"; }
+.listingblock:hover code.python:before { content: "python"; }
+.listingblock:hover code.ruby:before { content: "ruby"; }
+.listingblock:hover code.sass:before { content: "sass"; }
+.listingblock:hover code.scss:before { content: "scss"; }
+.listingblock:hover code.xml:before { content: "xml"; }
+.listingblock:hover code.yaml:before { content: "yaml"; }
+
+.listingblock.terminal pre .command:before { content: attr(data-prompt); 
padding-right: 0.5em; color: #999; }
+
+.listingblock.terminal pre .command:not([data-prompt]):before { content: '$'; }
+
+table.pyhltable { border: 0; margin-bottom: 0; }
+
+table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; }
+
+table.pyhltable td.code { padding-left: .75em; padding-right: 0; }
+
+.highlight.pygments .lineno, table.pyhltable td:not(.code) { color: #999; 
padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; }
+
+.highlight.pygments .lineno { display: inline-block; margin-right: .25em; }
+
+table.pyhltable .linenodiv { background-color: transparent !important; 
padding-right: 0 !important; }
+
+.quoteblock { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; 
border-left: 1px solid #dddddd; }
+.quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0 0 0.5625em 0; 
border: 0; }
+.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
+.quoteblock .attribution { margin-top: -.25em; padding-bottom: 0.5625em; 
font-size: 0.8125em; color: #748590; }
+.quoteblock .attribution br { display: none; }
+.quoteblock .attribution cite { display: block; margin-bottom: 0.625em; }
+
+table thead th, table tfoot th { font-weight: bold; }
+
+table.tableblock.grid-all { border-collapse: separate; border-spacing: 1px; 
-webkit-border-radius: 6px; border-radius: 6px; border-top: 0 solid #dddddd; 
border-bottom: 0 solid #dddddd; }
+
+table.tableblock.frame-topbot, table.tableblock.frame-none { border-left: 0; 
border-right: 0; }
+
+table.tableblock.frame-sides, table.tableblock.frame-none { border-top: 0; 
border-bottom: 0; }
+
+table.tableblock td .paragraph:last-child p > p:last-child, table.tableblock 
th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; }
+
+th.tableblock.halign-left, td.tableblock.halign-left { text-align: left; }
+
+th.tableblock.halign-right, td.tableblock.halign-right { text-align: right; }
+
+th.tableblock.halign-center, td.tableblock.halign-center { text-align: center; 
}
+
+th.tableblock.valign-top, td.tableblock.valign-top { vertical-align: top; }
+
+th.tableblock.valign-bottom, td.tableblock.valign-bottom { vertical-align: 
bottom; }
+
+th.tableblock.valign-middle, td.tableblock.valign-middle { vertical-align: 
middle; }
+
+tbody tr th { display: table-cell; line-height: 1.5; background: none; }
+
+tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: #222222; 
font-weight: bold; }
+
+td > div.verse { white-space: pre; }
+
+ol { margin-left: 0.25em; }
+
+ul li ol { margin-left: 0; }
+
+dl dd { margin-left: 1.125em; }
+
+dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }
+
+ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist 
.olist, .olist .ulist { margin-bottom: 0.625em; }
+
+ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; }
+
+ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; }
+
+ul.checklist li > p:first-child > i[class^="icon-check"]:first-child, 
ul.checklist li > p:first-child > input[type="checkbox"]:first-child { 
margin-right: 0.25em; }
+
+ul.checklist li > p:first-child > input[type="checkbox"]:first-child { 
position: relative; top: 1px; }
+
+ul.inline { margin: 0 auto 0.625em auto; margin-left: -1.375em; margin-right: 
0; padding: 0; list-style: none; overflow: hidden; }
+ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: 
block; }
+ul.inline > li > * { display: block; }
+
+.unstyled dl dt { font-weight: normal; font-style: normal; }
+
+ol.arabic { list-style-type: decimal; }
+
+ol.decimal { list-style-type: decimal-leading-zero; }
+
+ol.loweralpha { list-style-type: lower-alpha; }
+
+ol.upperalpha { list-style-type: upper-alpha; }
+
+ol.lowerroman { list-style-type: lower-roman; }
+
+ol.upperroman { list-style-type: upper-roman; }
+
+ol.lowergreek { list-style-type: lower-greek; }
+
+.hdlist > table, .colist > table { border: 0; background: none; }
+.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; 
}
+
+td.hdlist1 { padding-right: .75em; font-weight: bold; }
+
+td.hdlist1, td.hdlist2 { vertical-align: top; }
+
+.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }
+
+.colist > table tr > td:first-of-type { padding: 0 .75em; line-height: 1; }
+.colist > table tr > td:last-of-type { padding: 0.25em 0; }
+
+.qanda > ol > li > p > em:only-child { color: #373737; }
+
+.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; 
-webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; }
+
+.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 
1.25em 0; }
+.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 
1.25em 0.625em; }
+.imageblock > .title { margin-bottom: 0; }
+.imageblock.thumb, .imageblock.th { border-width: 6px; }
+.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }
+
+.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; 
display: inline-block; line-height: 0; }
+.image.left { margin-right: 0.625em; }
+.image.right { margin-left: 0.625em; }
+
+a.image { text-decoration: none; }
+
+span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; }
+span.footnote a, span.footnoteref a { text-decoration: none; }
+
+#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 
0.625em; }
+#footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; 
border-width: 1px 0 0 0; }
+#footnotes .footnote { padding: 0 0.375em; line-height: 1.3; font-size: 
0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .2em; }
+#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: 
none; }
+#footnotes .footnote:last-of-type { margin-bottom: 0; }
+
+#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 
0; }
+
+.gist .file-data > table { border: none; background: #fff; width: 100%; 
margin-bottom: 0; }
+.gist .file-data > table td.line-data { width: 99%; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+.big { font-size: larger; }
+
+.small { font-size: smaller; }
+
+.underline { text-decoration: underline; }
+
+.overline { text-decoration: overline; }
+
+.line-through { text-decoration: line-through; }
+
+.aqua { color: #00bfbf; }
+
+.aqua-background { background-color: #00fafa; }
+
+.black { color: black; }
+
+.black-background { background-color: black; }
+
+.blue { color: #0000bf; }
+
+.blue-background { background-color: #0000fa; }
+
+.fuchsia { color: #bf00bf; }
+
+.fuchsia-background { background-color: #fa00fa; }
+
+.gray { color: #606060; }
+
+.gray-background { background-color: #7d7d7d; }
+
+.green { color: #006000; }
+
+.green-background { background-color: #007d00; }
+
+.lime { color: #00bf00; }
+
+.lime-background { background-color: #00fa00; }
+
+.maroon { color: #600000; }
+
+.maroon-background { background-color: #7d0000; }
+
+.navy { color: #000060; }
+
+.navy-background { background-color: #00007d; }
+
+.olive { color: #606000; }
+
+.olive-background { background-color: #7d7d00; }
+
+.purple { color: #600060; }
+
+.purple-background { background-color: #7d007d; }
+
+.red { color: #bf0000; }
+
+.red-background { background-color: #fa0000; }
+
+.silver { color: #909090; }
+
+.silver-background { background-color: #bcbcbc; }
+
+.teal { color: #006060; }
+
+.teal-background { background-color: #007d7d; }
+
+.white { color: #bfbfbf; }
+
+.white-background { background-color: #fafafa; }
+
+.yellow { color: #bfbf00; }
+
+.yellow-background { background-color: #fafa00; }
+
+span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; 
}
+
+.admonitionblock td.icon [class^="icon-"]:before { font-size: 2.5em; 
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
+.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #444444; 
color: #333333; }
+.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 
1px 2px rgba(155, 155, 0, 0.8); color: #111; }
+.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: 
#bf6900; }
+.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: 
#bf3400; }
+.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: 
#bf0000; }
+
+.conum { display: inline-block; color: white !important; background-color: 
black; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; 
width: 20px; height: 20px; font-size: 12px; font-weight: bold; line-height: 
20px; font-family: Arial, sans-serif; font-style: normal; position: relative; 
top: -2px; letter-spacing: -1px; }
+.conum * { color: white !important; }
+.conum + b { display: none; }
+.conum:after { content: attr(data-value); }
+.conum:not([data-value]):empty { display: none; }
+
+.listingblock code { white-space: pre; overflow: auto; overflow-wrap: normal; 
/* needed for webkit browsers */ }
+
+#toc ul.sectlevel0 > li > a { font-style: normal; font-weight: bold; }
+
+h4 { color: #6c818f; }
+
+.literalblock > .content > pre, .listingblock > .content > pre { 
-webkit-border-radius: 6px; border-radius: 6px; margin-left: 2em; margin-right: 
2em; }
+
+.admonitionblock { margin-left: 2em; margin-right: 2em; }
+.admonitionblock > table { border: 1px solid #609060; border-top-width: 1.5em; 
background-color: #e9ffe9; border-collapse: separate; -webkit-border-radius: 0; 
border-radius: 0; }
+.admonitionblock > table td.icon { padding-top: .5em; padding-bottom: .5em; }
+.admonitionblock > table td.content { padding: .5em 1em; color: black; 
font-size: .9em; border-left: none; }
+
+.sidebarblock { background-color: #e8ecef; border-color: #ccc; }
+.sidebarblock > .content > .title { color: #444444; }
+
+table.tableblock.grid-all { border-collapse: collapse; -webkit-border-radius: 
0; border-radius: 0; }
+table.tableblock.grid-all th.tableblock, table.tableblock.grid-all 
td.tableblock { border-bottom: 1px solid #aaa; }
+
+#footer { background-color: #465158; padding: 2em; }
+
+#footer-text { color: #eee; font-size: 0.8em; text-align: center; }
+</style>
+<style>
+/* Foundation stylesheet for CodeRay (to match GitHub theme) | MIT License | 
http://foundation.zurb.com */
+table.CodeRay { border-collapse: collapse; padding: 2px; margin-bottom: 0; 
border: 0; background: transparent; }
+table.CodeRay td { padding: 0 .5em; vertical-align: top; }
+table.CodeRay td.line-numbers { text-align: right; color: #999; border-right: 
1px solid #e5e5e5; padding-left: 0; }
+span.line-numbers { border-right: 1px solid #E5E5E5; color: #999; display: 
inline-block; margin-right: 0.5em; padding-right: 0.5em; }
+.CodeRay td.line-numbers strong, .CodeRay span.line-numbers strong { 
font-weight: normal; }
+.CodeRay .debug { color: white !important; background: blue !important; }
+.CodeRay .annotation { color: #007; }
+.CodeRay .attribute-name { color: #f08; }
+.CodeRay .attribute-value { color: #700; }
+.CodeRay .binary { color: #509; }
+.CodeRay .comment  { color: #999; font-style: italic; }
+.CodeRay .char { color: #04D; }
+.CodeRay .char .content { color: #04D; }
+.CodeRay .char .delimiter { color: #039; }
+.CodeRay .class { color: #458; }
+.CodeRay .complex { color: #A08; }
+.CodeRay .constant { color: teal; }
+.CodeRay .color { color: #0A0; }
+.CodeRay .class-variable { color: #369; }
+.CodeRay .decorator { color: #B0B; }
+.CodeRay .definition { color: #099; }
+.CodeRay .directive { color: #088; }
+.CodeRay .delimiter { color: black; }
+.CodeRay .doc { color: #970; }
+.CodeRay .doctype { color: #34b; }
+.CodeRay .doc-string { color: #D42; }
+.CodeRay .escape  { color: #666; }
+.CodeRay .entity { color: #800; }
+.CodeRay .error { color: #808; }
+.CodeRay .exception { color: #C00; }
+.CodeRay .filename { color: #099; }
+.CodeRay .function { color: #900; }
+.CodeRay .global-variable { color: teal; }
+.CodeRay .hex { color: #058; }
+.CodeRay .integer  { color: #099; }
+.CodeRay .include { color: #B44; }
+.CodeRay .inline { color: black; }
+.CodeRay .inline .inline { background: #ccc; }
+.CodeRay .inline .inline .inline { background: #bbb; }
+.CodeRay .inline .inline-delimiter { color: #D14; }
+.CodeRay .inline-delimiter { color: #D14; }
+.CodeRay .important { color: #f00; }
+.CodeRay .interpreted { color: #B2B; }
+.CodeRay .instance-variable { color: teal; }
+.CodeRay .label { color: #970; }
+.CodeRay .local-variable { color: #963; }
+.CodeRay .octal { color: #40E; }
+.CodeRay .predefined { color: #369; }
+.CodeRay .preprocessor { color: #579; }
+.CodeRay .pseudo-class { color: #00C; }
+.CodeRay .predefined-type { color: #074; }
+.CodeRay .reserved, .keyword  { color: #000; }
+.CodeRay .key { color: #808; }
+.CodeRay .key .delimiter { color: #606; }
+.CodeRay .key .char { color: #80f; }
+.CodeRay .value { color: #088; }
+.CodeRay .regexp { background-color: #fff0ff; }
+.CodeRay .regexp .content { color: #808; }
+.CodeRay .regexp .delimiter { color: #404; }
+.CodeRay .regexp .modifier { color: #C2C; }
+.CodeRay .regexp .function  { color: #404; font-weight: bold; }
+.CodeRay .string { color: #D20; }
+.CodeRay .string .string { }
+.CodeRay .string .string .string { background-color: #ffd0d0; }
+.CodeRay .string .content { color: #D14; }
+.CodeRay .string .char { color: #D14; }
+.CodeRay .string .delimiter { color: #D14; }
+.CodeRay .shell { color: #D14; }
+.CodeRay .shell .content { }
+.CodeRay .shell .delimiter { color: #D14; }
+.CodeRay .symbol { color: #990073; }
+.CodeRay .symbol .content { color: #A60; }
+.CodeRay .symbol .delimiter { color: #630; }
+.CodeRay .tag, .CodeRay .attribute-name { color: #070; }
+.CodeRay .tag-special { color: #D70; }
+.CodeRay .type { color: #339; }
+.CodeRay .variable  { color: #036; }
+.CodeRay .insert { background: #afa; }
+.CodeRay .delete { background: #faa; }
+.CodeRay .change { color: #aaf; background: #007; }
+.CodeRay .head { color: #f8f; background: #505; }
+.CodeRay .insert .insert { color: #080; }
+.CodeRay .delete .delete { color: #800; }
+.CodeRay .change .change { color: #66f; }
+.CodeRay .head .head { color: #f4f; }
+
+</style>
+</head>
+<body class="book toc2 toc-left">
+<div id="header">
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel0">
+<li><a href="#_developer_documentation">Developer Documentation</a></li>
+<li><a href="#_contributing">Contributing</a></li>
+<li>
+<ul class="sectlevel1">
+<li><a href="#_ways_to_contribute">Ways to Contribute</a></li>
+<li>
+<ul class="sectlevel2">
+<li><a href="#_mailing_list_participation">Mailing List Participation</a></li>
+<li><a href="#_testing_releases">Testing Releases</a></li>
+<li><a href="#_reviewing_changes">Reviewing Changes</a></li>
+<li><a href="#_writing_documentation">Writing Documentation</a></li>
+<li><a href="#_reporting_bugs">Reporting Bugs</a></li>
+<li><a href="#_tinkerpop_libraries">TinkerPop Libraries</a></li>
+</ul>
+</li>
+<li><a href="#_considering_code_changes">Considering Code Changes</a></li>
+<li><a href="#_contributing_code_changes">Contributing Code Changes</a></li>
+</ul>
+</li>
+<li><a href="#development-environment">Development Environment</a></li>
+<li>
+<ul class="sectlevel1">
+<li><a href="#system-configuration">System Configuration</a></li>
+<li>
+<ul class="sectlevel2">
+<li><a href="#documentation-environment">Documentation Environment</a></li>
+<li><a href="#python-environment">Python Environment</a></li>
+<li><a href="#release-environment">Release Environment</a></li>
+</ul>
+</li>
+<li><a href="#building-testing">Building and Testing</a></li>
+<li><a href="#docker-integration">Docker Integration</a></li>
+<li><a href="#_ide_setup_with_intellij">IDE Setup with Intellij</a></li>
+</ul>
+</li>
+<li><a href="#_for_committers">For Committers</a></li>
+<li>
+<ul class="sectlevel1">
+<li><a href="#_communication">Communication</a></li>
+<li><a href="#_release_notes">Release Notes</a></li>
+<li><a href="#branches">Branches</a></li>
+<li><a href="#_tags">Tags</a></li>
+<li><a href="#_issue_tracker_conventions">Issue Tracker Conventions</a></li>
+<li><a href="#_code_style">Code Style</a></li>
+<li><a href="#_build_server">Build Server</a></li>
+<li><a href="#_deprecation">Deprecation</a></li>
+<li><a href="#_developing_tests">Developing Tests</a></li>
+<li>
+<ul class="sectlevel2">
+<li><a href="#_gremlin_language_test_cases">Gremlin Language Test 
Cases</a></li>
+</ul>
+</li>
+<li><a href="#_developing_benchmarks">Developing Benchmarks</a></li>
+<li><a href="#rtc">Review then Commit</a></li>
+<li>
+<ul class="sectlevel2">
+<li><a href="#pull-requests">Pull Requests</a></li>
+</ul>
+</li>
+<li><a href="#dependencies">Dependencies</a></li>
+<li>
+<ul class="sectlevel2">
+<li><a href="#_source_license_and_notice">Source LICENSE and NOTICE</a></li>
+<li><a href="#_binary_license_and_notice">Binary LICENSE and NOTICE</a></li>
+</ul>
+</li>
+<li><a href="#documentation">Documentation</a></li>
+<li><a href="#logging">Logging</a></li>
+</ul>
+</li>
+<li><a href="#_for_providers">For Providers</a></li>
+<li><a href="#_release_process">Release Process</a></li>
+<li>
+<ul class="sectlevel2">
+<li><a href="#_development_versions">Development Versions</a></li>
+<li><a href="#_release_manager_requirements">Release Manager 
Requirements</a></li>
+<li><a href="#_pre_flight_check">Pre-flight Check</a></li>
+<li><a href="#_release_candidate">Release Candidate</a></li>
+<li><a href="#_pmc_vote">PMC Vote</a></li>
+<li><a href="#_release_promote">Release &amp; Promote</a></li>
+<li><a href="#_email_templates">Email Templates</a></li>
+<li>
+<ul class="sectlevel2">
+<li><a href="#_release_vote">Release VOTE</a></li>
+<li><a href="#_dev_release_result_vote">Dev Release RESULT VOTE</a></li>
+<li><a href="#_general_release_announcement">General Release 
Announcement</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a href="#_administration">Administration</a></li>
+<li>
+<ul class="sectlevel1">
+<li><a href="#_new_committers">New Committers</a></li>
+<li><a href="#_new_pmc_members">New PMC Members</a></li>
+<li><a href="#_board_reports">Board Reports</a></li>
+</ul>
+</li>
+<li><a href="#meetings">Meetings</a></li>
+<li>
+<ul class="sectlevel1">
+<li><a href="#_november_23_2015">November 23, 2015</a></li>
+<li><a href="#_october_29_2015">October 29, 2015</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div class="imageblock">
+<div class="content">
+<a class="image" href="http://tinkerpop.apache.org";><img 
src="../../images/apache-tinkerpop-logo.png" alt="apache tinkerpop logo" 
width="500"></a>
+</div>
+</div>
+<div class="paragraph">
+<p><strong>3.2.6-SNAPSHOT</strong></p>
+</div>
+<h1 id="_developer_documentation" class="sect0">Developer Documentation</h1>
+<div class="paragraph">
+<p>This document contains information for TinkerPop developers, contributors, 
and community members. It focuses on
+technical information and other internal processes related to the project.</p>
+</div>
+<h1 id="_contributing" class="sect0">Contributing</h1>
+<div class="paragraph">
+<p>Contributions via GitHub pull requests are gladly accepted from their 
original author. By submitting any copyrighted
+material via pull request, email, or other means you agree to license the 
material under the project&#8217;s open source
+license and warrant that you have the legal authority to do so.</p>
+</div>
+<div class="sect1">
+<h2 id="_ways_to_contribute">Ways to Contribute</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p><span class="image" style="float: left"><img 
src="../../images/gremlin-apache.png" alt="gremlin-apache" width="250"></span> 
While the concept of an open source contribution can refer to doing
+development work on the code base, there are many other ways outside of coding 
to contribute to Apache TinkerPop.
+Participating on the various mailing lists, offering ideas, reporting bugs, 
writing documentation are all welcome
+contributions to the project that help improve the TinkerPop. This section of 
the document is designed to help
+provide some structure for potential contributors and to give them ideas for 
how they could get started becoming more
+involved in the TinkerPop community.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+As a quick acknowledgement, this section was influenced by Apache 
Spark&#8217;s well organized
+<a 
href="https://cwiki.apache.org/confluence/display/SPARK/Contributing+to+Spark";>"Contributing
 to Spark"</a> document.
+</td>
+</tr>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_mailing_list_participation">Mailing List Participation</h3>
+<div class="paragraph">
+<p>TinkerPop has two mailing lists: <a 
href="https://groups.google.com/forum/#!forum/gremlin-users";>gremlin-users</a> 
and
+<a 
href="https://lists.apache.org/[email protected]";>dev</a>. 
Subscribing to and
+participating on one or both of these mailing lists is a great way to 
contribute to TinkerPop. Helping users with their
+problems by answering their questions on gremlin-users is a great help to the 
community and an easy way for
+the community to become familiar with the contributor.</p>
+</div>
+<div class="paragraph">
+<p>The <a 
href="mailto:[email protected]";>[email protected]</a> mailing 
list is where all design discussion, early feature announcements, release
+discussions and other similar communication takes place. Having insight into 
the project at this level, will yield a
+lot of information about the day-to-day course of TinkerPop and many of the 
other ways contributors can be involved
+require a subscription to this list.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_testing_releases">Testing Releases</h3>
+<div class="paragraph">
+<p>Proposed TinkerPop releases are not official until after they are evaluated 
by the community. The process of evaluation
+occurs on the <a 
href="mailto:[email protected]";>[email protected]</a> mailing 
list where the community is invited to review release artifacts and
+vote if they should be released or not. Anyone is free to comment and provide 
a vote (+1/+0/-1) on a release. Note
+that votes of non-PMC members are considered non-binding, but are certainly 
considered in the review process.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_reviewing_changes">Reviewing Changes</h3>
+<div class="paragraph">
+<p>Virtually all changes to TinkerPop&#8217;s source code are performed via 
GitHub
+<a href="https://github.com/apache/tinkerpop/pulls";>pull requests</a>. When a 
pull request is issue it undergoes a
+<a href="#rtc">review process</a> prior to be merged to a release branch. 
Anyone is free to comment and provide a vote (+1/+0/-1)
+on a pull request. Note that votes of non-committers are considered 
non-binding, but are certainly considered in the
+review process.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_writing_documentation">Writing Documentation</h3>
+<div class="paragraph">
+<p>Proposing a documentation change is quite similar to providing a source 
code change, which is described below in more
+detail. Note that there is a difference between project documentation and the 
TinkerPop web site. The project
+documentation refers to the documentation that is published per release like, 
tutorials, reference documentation, and
+other similar pages. This content is not updated after release and remains 
static bound to that version. The TinkerPop
+web site refers to the static home page and its related content, such as <a 
href="http://tinkerpop.apache.org/gremlin.html";>Understanding Gremlin</a>,
+<a href="http://tinkerpop.apache.org/policy.html";>Provider Listing and Graphic 
Usage Policies</a> and other similar pages.
+This content is not bound to any particular version and can be published at 
any time where new content simply replaces
+old content.</p>
+</div>
+<div class="paragraph">
+<p>For both types of documentation, changes can be submitted via pull request. 
For project documentation, TinkerPop has
+a robust documentation system that is based on <a 
href="http://asciidoc.org/";>asciidoc</a>. The content can be found in the
+<a 
href="https://github.com/apache/tinkerpop/tree/master/docs/src";>docs/src</a>. 
Recall that this documentation is version
+specific, so consider the appropriate branch on which to submit the pull 
request so that the documentation is reflective
+of the version it is tied to. To view generated documentation locally, read 
more about environment configurations in
+the <a href="#documentation-environment">Documentation Environment</a> 
section.</p>
+</div>
+<div class="paragraph">
+<p>For web site changes, the process is largely the same except that the 
documentation system is HTML based instead of
+Asciidoc. The content can be found in the source control tree at link:[<a 
href="https://github.com/apache/tinkerpop/tree/master/docs/site";>docs/site</a>.
+The web site is always published from the <code>master</code> branch as it is 
not bound to a version, so there is no need to
+submit a pull request to any other branches besides that one. If the change to 
this documentation involves changing
+provider listings in some way, first propose the those changes on the <a 
href="mailto:[email protected]";>[email protected]</a> mailing 
list and achieve
+consensus (wait time is 72 hours as usual). At that point, pull requests or 
direct changes can be submitted.
+Again, see the <a href="#documentation-environment">Documentation 
Environment</a> section for more information on how to generate
+the site locally.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_reporting_bugs">Reporting Bugs</h3>
+<div class="paragraph">
+<p>Well formed bug reports (especially when accompanied by a pull request that 
fixes the problem) are welcome
+contributions that ultimately help improve the quality of TinkerPop. Of 
course, a bug report is only as good as its
+reproduction steps and the surrounding details of the issue. When a bug is 
encountered, it should be documented in
+<a href="https://issues.apache.org/jira/browse/TINKERPOP";>JIRA</a>, where it 
will likely trigger some discussion and
+ultimately a resolution.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_tinkerpop_libraries">TinkerPop Libraries</h3>
+<div class="paragraph">
+<p>TinkerPop is more than just the core source code repository. It is a rich 
ecosystem of libraries developed by
+<a href="http://tinkerpop.apache.org/providers.html";>providers</a>, who look 
to use or extend upon the TinkerPop interfaces.
+TinkerPop is highly focused on its interfaces and a small set of reference 
implementations of those interfaces as part
+of its core code base. As such, large and independent new functionality is 
often rejected from inclusion in TinkerPop
+itself, however, it is very much encouraged that such a project stand on its 
own as separate repository. Projects like
+this that meet the TinkerPop <a 
href="http://tinkerpop.apache.org/policy.html";>listing policy</a> can be added 
to the
+TinkerPop web site and promoted there. Please see the current listing of such 
libraries on the TinkerPop
+<a href="http://tinkerpop.apache.org/#graph-systems";>home page</a> to get an 
idea as to what kinds of libraries are available
+from the community.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_considering_code_changes">Considering Code Changes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Code changes can take a fair bit of effort from both the contributor doing 
the work, as well as the people who
+will be reviewing and testing that work. It is beneficial to all involved that 
some basic considerations be made by
+the contributor to ensure the best use is made of everyone&#8217;s time.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+For those who are trying to find a place to start to contribute, consider 
looking at unresolved issues that
+have the "trivial" priority as these issues are specifically set aside as
+<a 
href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20TINKERPOP%20AND%20resolution%20%3D%20Unresolved%20AND%20priority%20%3D%20Trivial%20ORDER%20BY%20key%20DESC";>low-hanging
 fruit</a>
+for newcomers.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>Before proceeding, contributors should evaluate if the proposed change is 
likely to be relevant, new and actionable:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Is it clear that code must change? Proposing a JIRA issue and pull request 
is appropriate only when a clear problem
+or change has been identified. When in doubt, email <a 
href="mailto:[email protected]";>[email protected]</a> first 
about the possible change.</p>
+</li>
+<li>
+<p>Search the mailing list archives for related discussions. Often, the 
problem has been discussed before, with
+a resolution that doesn&#8217;t require a code change, or recording what kinds 
of changes will not be accepted as a
+resolution.</p>
+</li>
+<li>
+<p>Search <a href="https://issues.apache.org/jira/browse/TINKERPOP";>JIRA</a> 
for existing issues.</p>
+</li>
+<li>
+<p>Is the scope of the change matched to the contributor&#8217;s level of 
experience? Anyone is qualified to suggest a typo
+fix, but refactoring a core feature in serialization or OLAP requires much 
more understanding of TinkerPop. Some
+changes require building up experience first.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Before considering how to contribute code, it is useful to understand how 
code is reviewed, and why changes may be
+rejected. Simply put, changes that have many or large positives, and few 
negative effects or risks, are much more
+likely to be merged, and merged quickly. Risky and less valuable changes are 
very unlikely to be merged, and may be
+rejected outright rather than receive iterations of review.</p>
+</div>
+<div class="paragraph">
+<p><strong>Positives</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Change has already been discussed and is known to committers</p>
+</li>
+<li>
+<p>Fixes the root cause of a bug in existing functionality</p>
+</li>
+<li>
+<p>Adds functionality or fixes a problem needed by a large number of users</p>
+</li>
+<li>
+<p>Simple, targeted</p>
+</li>
+<li>
+<p>Easily tested; has tests</p>
+</li>
+<li>
+<p>Reduces complexity and lines of code</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Negatives, Risks</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Band-aids a symptom of a bug only</p>
+</li>
+<li>
+<p>Introduces complex new functionality, especially an API that needs to be 
supported</p>
+</li>
+<li>
+<p>Adds complexity that only helps a niche use case</p>
+</li>
+<li>
+<p>Adds user-space functionality that does not need to be maintained in 
TinkerPop, but could be hosted externally and
+promoted in <a href="http://tinkerpop.apache.org/#graph-systems";>provider 
listings</a></p>
+</li>
+<li>
+<p>Changes a public API or semantics thus introducing a breaking change</p>
+</li>
+<li>
+<p>Adds large dependencies</p>
+</li>
+<li>
+<p>Changes versions of existing dependencies</p>
+</li>
+<li>
+<p>Adds a large amount of code</p>
+</li>
+<li>
+<p>Makes lots of modifications in one "big bang" change</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_contributing_code_changes">Contributing Code Changes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Generally, TinkerPop uses <a 
href="https://issues.apache.org/jira/browse/TINKERPOP";>JIRA</a> to track 
logical issues,
+including bugs and improvements, and uses GitHub pull requests to manage the 
review and merge of specific code
+changes. That is, JIRA issues are used to describe what should be fixed or 
changed, and high-level approaches, and pull
+requests describe how to implement that change in the project&#8217;s source 
code.</p>
+</div>
+<div class="paragraph">
+<p>As a first step to making a contribution, consider 
<strong>JIRA</strong>:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Find the existing JIRA ticket that the change pertains to.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Do not create a new ticket if creating a change to address an existing 
issue in JIRA; add to the existing
+discussion and work instead.</p>
+</li>
+<li>
+<p>Look for existing pull requests that are linked from the ticket, to 
understand if someone is already working on
+the JIRA.</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>If the change is new, then it usually needs a new ticket. However, trivial 
changes, where the change is virtually
+the same as the how it should change do not require a JIRA (e.g. "Fix typos in 
Foo javadoc").</p>
+</li>
+<li>
+<p>If required, create a new ticket:</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Provide a descriptive Title and a detailed Description. For bug reports, 
this should ideally include a short
+reproduction of the problem.</p>
+</li>
+<li>
+<p>Set required fields - these are detailed later in this document in the <a 
href="#_issue_tracker_conventions">Issue Tracker
+Conventions</a> section.</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>If the change is a large change, consider inviting discussion on the issue 
at <a href="mailto:[email protected]";>[email protected]</a> 
first
+before proceeding to implement the change.</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>Next, <strong>make changes</strong> and prepare a <strong>pull 
request</strong>:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p><a href="https://help.github.com/articles/fork-a-repo/";>Fork and then 
clone</a> the Apache TinkerPop
+<a href="https://github.com/apache/tinkerpop";>GitHub repository</a> if not 
already done.</p>
+</li>
+<li>
+<p>Make changes in the fork</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>It is typically best to create a branch for the changes. Consider naming 
that branch after the JIRA issue number
+to easily track what that branch is for.</p>
+</li>
+<li>
+<p>Consider which release branch (e.g. <code>master</code>, <code>tp31</code> 
etc) to create the development branch from in the first place.
+In other words, is the change to be targetted at a specific TinkerPop version 
(e.g. a patch to an older version)? When
+in doubt, please ask on <a 
href="mailto:[email protected]";>[email protected]</a>.</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>Build the project and run tests.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>A simple build can be accomplished with maven: <code>mvn clean 
install</code>.</p>
+</li>
+<li>
+<p>Often, a "simple build" isn&#8217;t sufficient and integration tests are 
required:
+<code>mvn clean install -DskipIntegrationTests=false -DincludeNeo4j</code>. 
Note that Hadoop must be running for the integration
+tests to execute.</p>
+</li>
+<li>
+<p>Docker can help simplify building and testing: <code>docker/build.sh -t -i 
-n</code></p>
+</li>
+<li>
+<p>Please see the <a href="#building-testing">Building and Testing</a> section 
for more building and testing options.</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>Consider whether documentation or tests need to be added or updated as part 
of the change, and add them as needed.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Nearly all changes should include a modification to the 
<code>CHANGELOG.asciidoc</code> file - one more entries to
+help summarize the change.</p>
+</li>
+<li>
+<p>Some changes will require updates to the "upgrade documentation" - usually 
reserved for major new features and
+breaking changes.</p>
+</li>
+<li>
+<p>Docker can help simplify documentation generation: <code>docker/build.sh 
-d</code></p>
+</li>
+<li>
+<p>Please see the <a href="#building-testing">Building and Testing</a> section 
for more documentation generation options.</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>Open the <a 
href="https://help.github.com/articles/using-pull-requests/";>pull request</a> 
against the appropriate branch
+on the Apache TinkerPop repository.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Target the pull request at the appropriate branch in TinkerPop&#8217;s 
repository</p>
+</li>
+<li>
+<p>Prefix the name of the pull request with the JIRA issue number (include a 
brief description after that).</p>
+</li>
+<li>
+<p>Include a link to the ticket in JIRA in the pull request description.</p>
+</li>
+<li>
+<p>Include a rough synopsis of how the changes were tested. This might be as 
simple as "Ran mvn clean install to
+success and performed manual testing in the Gremlin Console".</p>
+</li>
+<li>
+<p>Include other descriptive elements about the change if they are not already 
included in the JIRA ticket.</p>
+</li>
+<li>
+<p>Automated builds will occur with Travis. Please be sure that the pull 
request passes those builds and
+correct them if there are problems.</p>
+</li>
+</ol>
+</div>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>Once the pull request has been placed it will go into 
<strong>review</strong>:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Other reviewers, including committers, may comment on the changes and 
suggest modifications. Changes can be added by
+simply pushing more commits to the same branch.</p>
+</li>
+<li>
+<p>Lively, polite, rapid technical debate is encouraged from everyone in the 
community. The outcome may be a rejection
+of the entire change.</p>
+</li>
+<li>
+<p>Reviewers can indicate that a change looks suitable for merging with by 
providing a "+1". Please see the
+<a href="#rtc">Review then Commit</a> process for more details.</p>
+</li>
+<li>
+<p>Sometimes, other changes will be merged which conflict with your pull 
request&#8217;s changes. The PR can&#8217;t be merged
+until the conflict is resolved. This can be resolved with "git fetch origin" 
followed by "git merge origin/master"
+and resolving the conflicts by hand, then pushing the result to your branch. 
Or more nicely, consider rebasing changes
+and force pushing the branch.</p>
+</li>
+<li>
+<p>Try to be responsive to the discussion rather than let days pass between 
replies</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>On successful review, the <strong>pull request will be merged</strong> to 
the main repository and the JIRA issue will be closed.</p>
+</div>
+</div>
+</div>
+<h1 id="development-environment" class="sect0">Development Environment</h1>
+<div class="paragraph">
+<p>TinkerPop is fairly large body of code spread across many modules and 
covering multiple programming languages. Despite
+this complexity, it remains relatively straightforward a project to build. 
This following subsections explain how to
+configure a development environment for TinkerPop.</p>
+</div>
+<div class="sect1">
+<h2 id="system-configuration">System Configuration</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>At a minimum, development of TinkerPop requires <a 
href="http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html";>Java
 1.8.0_40+</a>
+and <a href="https://maven.apache.org/download.cgi";>Maven 3.0.5+</a>. Maven is 
used as the common build system, which even
+controls the builds of non-JVM <a 
href="http://tinkerpop.apache.org/docs/current/tutorials/gremlin-language-variants/";>GLVs</a>
+such as <code>gremlin-python</code>. Java and Maven are described as a 
"minimum" for a development environment, because they
+will only build JVM portions of TinkerPop and many integration tests will not 
fire with this simple setup. It is
+possible to get a clean and successful build with this minimum, but it will 
not be possible to build non-JVM aspects
+of the project and those will go untested.</p>
+</div>
+<div class="paragraph">
+<p>To gain the ability to execute all aspects of the TinkerPop build system, 
other environmental configurations must be
+established. Those prerequisites are defined in the following subsections.</p>
+</div>
+<div class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Important</div>
+</td>
+<td class="content">
+For those who intend to offer a contribution, building with a minimal 
configuration may not be sufficient
+when submitting a pull request. Consider setting up the full environment.
+</td>
+</tr>
+</table>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+For those using Windows, efforts have been made to keep the build OS 
independent, but, in practice, it is likely
+that TinkerPop&#8217;s build system will only allow for a minimum build at 
best.
+</td>
+</tr>
+</table>
+</div>
+<div class="sect2">
+<h3 id="documentation-environment">Documentation Environment</h3>
+<div class="paragraph">
+<p>The documentation generation process is not Maven-based and uses shell 
scripts to process the project&#8217;s asciidoc. The
+scripts should work on Mac and Linux.</p>
+</div>
+<div class="paragraph">
+<p>To generate documentation, it is required that <a 
href="https://hadoop.apache.org";>Hadoop 2.7.x</a> is running in
+<a 
href="https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SingleCluster.html#Pseudo-Distributed_Operation";>pseudo-distributed</a>
+mode. Be sure to set the <code>HADOOP_GREMLIN_LIBS</code> environment variable 
as described in the
+<a 
href="http://tinkerpop.apache.org/docs/current/reference/#hadoop-gremlin";>reference
 documentation</a>. It is also important
+to set the <code>CLASSPATH</code> to point at the directory containing the 
Hadoop configuration files, like <code>mapred-site.xml</code>.</p>
+</div>
+<div class="paragraph">
+<p>Also note that <a href="http://www.grymoire.com/Unix/Awk.html";>awk</a> 
version <code>4.0.1</code> is required for documentation generation.</p>
+</div>
+<div class="paragraph">
+<p>Documentation can be generated locally with:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay"><code class="text 
language-text">bin/process-docs.sh</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Documentation is generated to the <code>target/docs</code> directory. It is 
also possible to generate documentation locally with
+Docker. <code>docker/build.sh -d</code>.</p>
+</div>
+<div class="paragraph">
+<p>To generate the web site locally, there is no need for any of the above 
infrastructure. Site generation is a simple
+shell script:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay"><code class="text 
language-text">bin/generate-home.sh</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The site will be generated to the <code>target/site/home</code> 
directory.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="python-environment">Python Environment</h3>
+<div class="paragraph">
+<p>As of TinkerPop 3.2.2, the build optionally requires <a 
href="https://www.python.org/";>Python 2.x</a> to work with the
+<code>gremlin-python</code> module. If Python is not installed, TinkerPop will 
still build with Maven, but native Python tests and
+Java tests that require Python code will be skipped. Developers should also 
install <a href="https://pypi.python.org/pypi/pip";>pip</a>
+and <a href="https://virtualenv.pypa.io/en/stable/";>virtualenv</a> (version 
15.0.2 - older versions may cause build failures).</p>
+</div>
+<div class="paragraph">
+<p>Once the Python environment is established, the full building and testing 
of <code>gremlin-python</code> may commence. It can be
+done manually from the command line with:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay"><code class="text language-text">mvn clean install 
-Pglv-python</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>which enables the "glv-python" Maven profile or in a more automated fashion 
simply add a <code>.glv</code> file to the root of the
+<code>gremlin-python</code> module which will signify to Maven that the 
environment is Python-ready. The <code>.glv</code> file need not have
+any contents and is ignored by Git. A standard <code>mvn clean install</code> 
will then build <code>gremlin-python</code> in full.</p>
+</div>
+<div class="paragraph">
+<p>As of TinkerPop 3.2.5, the build also requires Python to execute 
<code>gremlin-console</code> integration tests. The integration
+test is configured by a "console-integration-tests" Maven profile. This 
profile can be activated manually or can more
+simply piggy-back on the <code>.glv</code> file in 
<code>gremlin-python</code>. Note that unlike <code>gremlin-python</code> the 
tests are actually
+integration tests and therefore must be actively switched on with 
<code>-DskipIntegrationTests=false</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay"><code class="text language-text">mvn clean install -pl 
gremlin-console -DskipIntegrationTests=false</code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="release-environment">Release Environment</h3>
+<div class="paragraph">
+<p>This section is only useful to TinkerPop release managers and describes 
prerequisites related to deploying an official
+release of TinkerPop. All Apache releases must be signed. Please see <a 
href="http://www.apache.org/dev/release-signing.html";>this guide</a>
+in the Apache documentation for instructions on to set up gpg. Keys should be 
added to KEYS files in both the
+<a 
href="https://dist.apache.org/repos/dist/dev/tinkerpop/KEYS";>development</a> and
+<a 
href="https://dist.apache.org/repos/dist/release/tinkerpop/KEYS";>release</a> 
distribution directories and committed
+using Apache Subversion (SVN).</p>
+</div>
+<div class="paragraph">
+<p>Uploading to pypi uses <a 
href="https://pypi.python.org/pypi/twine";>twine</a> which is automatically 
installed by the build
+process in maven. Twine refers to <code>HOME/.pypirc</code> file for 
configuration on the pypi deploy environments and username
+and password combinations. The file typically looks like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay"><code class="text language-text">[distutils]
+index-servers=
+    pypi
+    pypitest
+
+[pypitest]
+repository = https://testpypi.python.org/pypi
+username = &lt;username&gt;
+password =
+
+[pypi]
+repository = https://pypi.python.org/pypi
+username = &lt;username&gt;
+password =</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The release manager shall use the project&#8217;s pypi credentials, which 
are available in the PMC repository.
+The <code>password</code> should be left blank so the deployment process in 
Maven will prompt for it at deployment time.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="building-testing">Building and Testing</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The following commands are a mix of Maven flags and shell scripts that 
handle different build operations</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Build project: <code>mvn clean install</code></p>
+<div class="ulist">
+<ul>
+<li>
+<p>Build a specific module (e.g. <code>gremlin-server</code>) within the 
project: <code>mvn clean install -pl gremlin-server</code></p>
+</li>
+<li>
+<p>Specify specific tests in a TinkerPop Suite to run with the 
<code>GREMLIN_TESTS</code> environment variable, along with the
+Maven project list argument, e.g.:</p>
+<div class="listingblock">
+<div class="content">
+<pre>export 
GREMLIN_TESTS='org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest$Traversals,org.apache.tinkerpop.gremlin.process.traversal.PathTest'
+mvn -Dmaven.javadoc.skip=true --projects tinkergraph-gremlin test</pre>
+</div>
+</div>
+</li>
+<li>
+<p>Clean the <code>.groovy/grapes/org.apache.tinkerpop</code> directory on 
build: <code>mvn clean install -DcleanGrapes</code></p>
+</li>
+<li>
+<p>Turn off "heavy" logging in the "process" tests: <code>mvn clean install 
-DargLine="-DmuteTestLogs=true"</code></p>
+</li>
+<li>
+<p>The test suite for <code>neo4j-gremlin</code> is disabled by default - to 
turn it on: <code>mvn clean install -DincludeNeo4j</code></p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Regenerate test data (only necessary given changes to IO classes): 
<code>mvn clean install -Dio</code> from <code>tinkergraph-gremlin</code> 
directory</p>
+<div class="ulist">
+<ul>
+<li>
+<p>If there are changes to the Gryo format, it may be necessary to generate 
the Grateful Dead dataset from GraphSON (see 
<code>IoDataGenerationTest.shouldWriteGratefulDead</code>)</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Check license headers are present: <code>mvn apache-rat:check</code></p>
+</li>
+<li>
+<p>Build AsciiDocs (see <a href="#documentation-environment">Documentation 
Environment</a>): <code>bin/process-docs.sh</code></p>
+<div class="ulist">
+<ul>
+<li>
+<p>Build AsciiDocs (but don&#8217;t evaluate code blocks): 
<code>bin/process-docs.sh --dryRun</code></p>
+</li>
+<li>
+<p>Build AsciiDocs (but don&#8217;t evaluate code blocks in specific files): 
<code>bin/process-docs.sh --dryRun 
docs/src/reference/the-graph.asciidoc,docs/src/tutorial/getting-started,...</code></p>
+</li>
+<li>
+<p>Build AsciiDocs (but evaluate code blocks only in specific files): 
<code>bin/process-docs.sh --fullRun 
docs/src/reference/the-graph.asciidoc,docs/src/tutorial/getting-started,...</code></p>
+</li>
+<li>
+<p>Process a single AsciiDoc file: <code>docs/preprocessor/preprocess-file.sh 
`pwd`/gremlin-console/target/apache-tinkerpop-gremlin-console-*-standalone "" 
"*" `pwd`/docs/src/xyz.asciidoc</code></p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Build JavaDocs: <code>mvn process-resources -Djavadoc</code></p>
+</li>
+<li>
+<p>Check for Apache License headers: <code>mvn apache-rat:check</code></p>
+</li>
+<li>
+<p>Check for newer dependencies: <code>mvn 
versions:display-dependency-updates</code> or <code>mvn 
versions:display-plugin-updates</code></p>
+</li>
+<li>
+<p>Deploy JavaDocs/AsciiDocs: <code>bin/publish-docs.sh svn-username</code></p>
+</li>
+<li>
+<p>Integration Tests: <code>mvn verify -DskipIntegrationTests=false</code></p>
+<div class="ulist">
+<ul>
+<li>
+<p>Execute with the <code>-DincludeNeo4j</code> option to include 
transactional tests.</p>
+</li>
+<li>
+<p>Execute with the <code>-DuseEpoll</code> option to try to use Netty native 
transport (works on Linux, but will fallback to Java NIO on other OS).</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Performance Tests: <code>mvn verify -DskipPerformanceTests=false</code></p>
+</li>
+<li>
+<p>Benchmarks: <code>mvn verify -DskipBenchmarks=false</code></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="docker-integration">Docker Integration</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>TinkerPop provides a shell script, that can start several build tasks 
within a Docker container. The
+required Docker images will be built automatically if they don&#8217;t exist 
yet. Thus the first invocation
+of the Docker script is expected to take some time.</p>
+</div>
+<div class="paragraph">
+<p>The script can be found under <code>PROJECT_HOME/docker/build.sh</code>. 
The following tasks are currently
+supported:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>run standard test suite</p>
+</li>
+<li>
+<p>run integration tests</p>
+</li>
+<li>
+<p>build Java docs</p>
+</li>
+<li>
+<p>build user docs</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>A list of command line options is provided by <code>docker/build.sh 
--help</code>. The container will install,
+configure and start all required dependencies, such as Hadoop.</p>
+</div>
+<div class="paragraph">
+<p>Options can be passed to Docker by setting the 
<code>TINKERPOP_DOCKER_OPTS</code> environment variable. A speed boost can
+be gained at the expense of memory by using tmpfs and the special directory 
<code>/usr/src/tinkermem</code>.</p>
+</div>
+<div class="listingblock">
+<div class="title">Build in-memory</div>
+<div class="content">
+<pre class="CodeRay"><code class="bash 
language-bash">TINKERPOP_DOCKER_OPTS=&quot;--tmpfs 
/usr/src/tinkermem:exec,mode=0755,rw,noatime,size=2000m&quot;</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="title">Disable IPv6 for Hadoop</div>
+<div class="content">
+<pre class="CodeRay"><code class="bash 
language-bash">TINKERPOP_DOCKER_OPTS=&quot;--sysctl 
net.ipv6.conf.all.disable_ipv6=1 --sysctl 
net.ipv6.conf.default.disable_ipv6=1&quot;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A custom maven settings.xml can be supplied, for example, to point to a 
local proxy. Copy the <code>settings.xml</code> to the
+<code>PROJECT_HOME/</code> directory. The Docker script will detect and copy 
it to the running container.</p>
+</div>
+<div class="paragraph">
+<p>If the container is used to generate the user docs, it will start a web 
server and show the URL that
+is used to host the HTML docs.</p>
+</div>
+<div class="paragraph">
+<p>After finishing all tasks, the script will immediately destroy the 
container.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_ide_setup_with_intellij">IDE Setup with Intellij</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This section refers specifically to setup within Intellij.  TinkerPop has a 
module called <code>gremlin-shaded</code> which
+contains shaded dependencies for some libraries that are widely used and tend 
to introduce conflicts.  To ensure
+that Intellij properly interprets this module after importing the Maven 
<code>pom.xml</code> perform the following steps:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Build <code>gremlin-shaded</code> from the command line with <code>mvn 
clean install</code>.</p>
+</li>
+<li>
+<p>Right-click on the <code>gremlin-shaded</code> module in the project viewer 
of Intellij and select "Remove module". If this menu
+option is not available (as is the case in newer versions of Intellij - first 
noticed in 13.1.5), then open the "Maven
+Projects" side panel, right click the <code>gremlin-shaded</code> module and 
select "Ignore Project".</p>
+</li>
+<li>
+<p>In the "Maven Projects" Tool window and click the tool button for "Reimport 
All Maven projects" (go to
+<code>View | Tool Windows | Maven Projects</code> on the main menu if this 
panel is not activated).</p>
+</li>
+<li>
+<p>At this point it should be possible to compile and run the tests within 
Intellij, but in the worst case, use
+<code>File | Invalidate Caches/Restart</code> to ensure that indices properly 
rebuild.</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>Note that it maybe be necessary to re-execute these steps if the 
<code>gremlin-shaded</code> <code>pom.xml</code> is ever updated.</p>
+</div>
+<div class="paragraph">
+<p>Developers working on the <code>neo4j-gremlin</code> module should enabled 
the <code>include-neo4j</code> Maven profile in Intellij.
+This will ensure that tests will properly execute within the IDE.</p>
+</div>
+<div class="paragraph">
+<p>If Intellij complains about "duplicate sources" for the Groovy files when 
attempting to compile/run tests, then
+install the <a 
href="http://plugins.jetbrains.com/plugin/7442?pr=idea";>GMavenPlus Intellij 
plugin</a>.</p>
+</div>
+<div class="paragraph">
+<p>The <code>gremlin-core</code> module uses a Java annotation processor to 
help support DSLs. To support this capability be sure
+that:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p><code>File | Settings | Compiler | Annotation Processors</code> has the 
checkbox with the "Enable annotation processing" checked.
+Intellij should be able to detect the processor automatically on build.</p>
+</li>
+<li>
+<p>The <code>gremlin-core/target</code> directory should not be hidden and 
<code>target/classes</code>, <code>target/gneerated-sources</code> and
+`target/generated-test-sources should be marked as "Generated Sources Root". 
If they are not setup that way by
+Intellij by default then simply right-click on them use the "Mark Directory 
with" option to make the appropriate
+selections.</p>
+</li>
+</ol>
+</div>
+</div>
+</div>
+<h1 id="_for_committers" class="sect0">For Committers</h1>
+<div class="imageblock">
+<div class="content">
+<img src="../../images/business-gremlin.png" alt="business gremlin" 
width="400">
+</div>
+</div>
+<div class="paragraph">
+<p>The guidelines that follow apply to those with commit access to the main 
repository:</p>
+</div>
+<div class="sect1">
+<h2 id="_communication">Communication</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>TinkerPop has a <a href="http://groups.google.com/group/gremlin-users";>user 
mailing list</a> and a
+<a href="https://lists.apache.org/list.html?<a 
href="mailto:[email protected]";>[email protected]</a>">developer
 mailing list</a>.  As a committer,
+it is a good idea to join both.</p>
+</div>
+<div class="paragraph">
+<p>It would also be helpful to join the public <a 
href="https://apache.hipchat.com/chat/room/2013155";>TinkerPop HipChat room</a>
+for developer discussion.  This helps contributors to communicate in a more 
real-time way.  Anyone can join as a guest,
+but for regular contributors it may be best to request that an Apache HipChat 
account be created.</p>
+</div>
+<div class="paragraph">
+<p>Occasionally, online meetings via video conference are held.  These 
meetings are schedule via the dev mailing list
+about a week before they are to occur to find a day and time that is available 
for those interested in attending.
+On the day of the meeting, the meeting organizer will create a Google Hangout 
(or similar video conferencing link) to
+post to the TinkerPop room in HipChat.  At that point, all who are interested 
can attend.  Meeting minutes should be
+taken and added to the <a href="#meetings">Meetings</a> section of this 
document using the pattern already established.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_release_notes">Release Notes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>There is a two-pronged approach to maintaining the change log and preparing 
the release notes.</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>For work that is documented in JIRA, run the release notes report to 
include all of
+the tickets targeted for a specific release.  This report can be included in 
the
+release announcement.</p>
+</li>
+<li>
+<p>The manual change log (<code>CHANGELOG.asciidoc</code>) can be used to 
highlight large
+changes, describe themes (e.g. "We focused on performance improvements") or to
+give voice to undocumented changes.</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>Given the dependence on the JIRA report for generating additions to the 
<code>CHANGELOG.asciidoc</code>,
+which uses the title of the issue as the line presented in the release note 
report, titles should
+be edited prior to release to be useful in that context.  In other words, an 
issue title should
+be understandable as a change in the fewest words possible while still 
conveying the gist of the
+change.</p>
+</div>
+<div class="paragraph">
+<p>Changes that break the public APIs should be marked with a "breaking" label 
and should be
+distinguished from other changes in the release notes.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="branches">Branches</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>TinkerPop has several release branches:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>tp30</code> - 3.0.x (no longer maintained)</p>
+</li>
+<li>
+<p><code>tp31</code> - 3.1.x (bug fixes and documentation updates only)</p>
+</li>
+<li>
+<p><code>tp32</code> - 3.2.x (bug fixes and documentation updates only)</p>
+</li>
+<li>
+<p><code>master</code> - 3.3.x</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Changes to <code>tp31</code> should merge to <code>tp32</code>, and changes 
to <code>tp32</code> should merge to <code>master</code>. Please read more 
about this
+process in the <a href="#pull-requests">Pull Requests</a> section.</p>
+</div>
+<div class="paragraph">
+<p>Other branches may be created for collaborating on features or for 
RFC&#8217;s that other developers may want to inspect.
+It is suggested that the JIRA issue ID be used as the prefix, since that 
triggers certain automation, and it provides a
+way to account for the branch lifecycle, i.e. "Who&#8217;s branch is this, and 
can I delete it?"</p>
+</div>
+<div class="paragraph">
+<p>For branches that are NOT associated with JIRA issues, developers should 
utilize their Apache ID as

[... 2305 lines stripped ...]

Reply via email to