diff --git a/apps/_documentation/static/en/.buildinfo b/apps/_documentation/static/en/.buildinfo index 4ffd52044..7d9eca350 100644 --- a/apps/_documentation/static/en/.buildinfo +++ b/apps/_documentation/static/en/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 6caf0f7db59c0515710115373bfa6456 +config: 154aa256a0dfceb4c55d272ea1758345 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/apps/_documentation/static/en/_static/basic.css b/apps/_documentation/static/en/_static/basic.css index 7577acb1a..30fee9d0f 100644 --- a/apps/_documentation/static/en/_static/basic.css +++ b/apps/_documentation/static/en/_static/basic.css @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -670,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -738,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/apps/_documentation/static/en/_static/css/theme.css b/apps/_documentation/static/en/_static/css/theme.css index c03c88f06..19a446a0e 100644 --- a/apps/_documentation/static/en/_static/css/theme.css +++ b/apps/_documentation/static/en/_static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/apps/_documentation/static/en/_static/documentation_options.js b/apps/_documentation/static/en/_static/documentation_options.js index 593eb28e9..ebf92ac71 100644 --- a/apps/_documentation/static/en/_static/documentation_options.js +++ b/apps/_documentation/static/en/_static/documentation_options.js @@ -1,6 +1,5 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.20230507.1', +const DOCUMENTATION_OPTIONS = { + VERSION: '1.20230718.1', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/apps/_documentation/static/en/_static/pygments.css b/apps/_documentation/static/en/_static/pygments.css index 08bec689d..84ab3030a 100644 --- a/apps/_documentation/static/en/_static/pygments.css +++ b/apps/_documentation/static/en/_static/pygments.css @@ -17,6 +17,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #008400 } /* Generic.Inserted */ diff --git a/apps/_documentation/static/en/_static/searchtools.js b/apps/_documentation/static/en/_static/searchtools.js index 97d56a74d..7918c3fab 100644 --- a/apps/_documentation/static/en/_static/searchtools.js +++ b/apps/_documentation/static/en/_static/searchtools.js @@ -57,12 +57,12 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, searchTerms) => { +const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; const [docName, title, anchor, descr, score, _filename] = item; @@ -75,20 +75,24 @@ const _displayItem = (item, searchTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; + requestUrl = contentRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; + requestUrl = contentRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + anchor; linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) + if (descr) { listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) @@ -97,6 +101,9 @@ const _displayItem = (item, searchTerms) => { listItem.appendChild( Search.makeSearchSummary(data, searchTerms) ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -115,14 +122,15 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, - searchTerms + searchTerms, + highlightTerms, ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), searchTerms); + _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( - () => _displayNextItem(results, resultCount, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), 5 ); } @@ -360,7 +368,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, searchTerms); + _displayNextItem(results, results.length, searchTerms, highlightTerms); }, /** diff --git a/apps/_documentation/static/en/chapter-01.html b/apps/_documentation/static/en/chapter-01.html index a26806cb1..4d145a25c 100644 --- a/apps/_documentation/static/en/chapter-01.html +++ b/apps/_documentation/static/en/chapter-01.html @@ -1,10 +1,10 @@ - + - What is py4web? — py4web 1.20230507.1 documentation + What is py4web? — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
- 1.20230507.1 + 1.20230718.1
@@ -98,7 +98,7 @@
-

What is py4web?

+

What is py4web?

PY4WEB is a web framework for rapid development of efficient database driven web applications. It is an evolution of the popular web2py framework, but much faster and slicker. Its internal design has been much @@ -198,7 +198,7 @@

What is py4web? -

Acknowledgments

+

Acknowledgments

Many thanks to everyone who has contributed to the project, and especially:

  • Massimo Di Pierro

  • @@ -256,7 +256,7 @@

    Acknowledgments - v: 1.20230507.1 + v: 1.20230718.1
    diff --git a/apps/_documentation/static/en/chapter-02.html b/apps/_documentation/static/en/chapter-02.html index 6b5fbc96f..462785009 100644 --- a/apps/_documentation/static/en/chapter-02.html +++ b/apps/_documentation/static/en/chapter-02.html @@ -1,10 +1,10 @@ - + - Help, resources and hints — py4web 1.20230507.1 documentation + Help, resources and hints — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
    - 1.20230507.1 + 1.20230718.1
    @@ -113,26 +113,26 @@
    -

    Help, resources and hints

    +

    Help, resources and hints

    We’ve made our best to make PY4WEB simple and clean. But you know, modern web programming is a daunting task. It requires an open mind, able to jump frequently (without being lost!) from python to HTML to javascript to css and even database management. But don’t be scared, in this manual we’ll assist you side by side in this journey. And there are many other valuable resources that we’re going to show you.

    -

    Resources

    +

    Resources

    -

    This manual

    +

    This manual

    This manual is the Reference Manual for py4web. It’s available online at https://py4web.com/_documentation/static/index.html, where you’ll also find the PDF and EBOOK version, in multiple languages. It written in RestructuredText and generated using Sphinx.

    -

    The Google group

    +

    The Google group

    There is a dedicated mailing list hosted on Google Groups, see https://groups.google.com/g/py4web. This is the main source of discussions for developers and simple users. For any problem you should face, this is the right place to search for a hint or a solution.

    -

    The Discord server

    +

    The Discord server

    For quick questions and chats you can also use the free Discord server dedicated to py4web. You could usually find many py4web developers hanging out in the channel.

    -

    Tutorials and video

    +

    Tutorials and video

    There are many tutorials and videos available. Here are some of them:

    • the Learn Py4Web site by Luca de Alfaro (with lots of excellent training videos)

    • @@ -143,21 +143,21 @@

      Tutorials and video -

      The sources on GitHub

      +

      The sources on GitHub

      Last but not least, py4web is Open Source, with a BSD v3 license, hosted on GitHub at https://github.com/web2py/py4web. This means that you can read, study and experiment with all of its internal details by yourself.

    -

    Hints and tips

    +

    Hints and tips

    This paragraph is dedicated to preliminary hints, suggestions and tips that could be helpful to know before starting to learn py4web.

    -

    Prerequisites

    +

    Prerequisites

    In order to understand py4web you need at least a basic python knowledge. There are many books, courses and tutorials available on the web - choose what’s best for you. The python’s decorators, in particular, are a milestone of any python web framework and you have to fully understand it.

    -

    A modern python workplace

    +

    A modern python workplace

    In the following chapters you will start coding on your computer. We suggest you to setup a modern python workplace if you plan to do it efficiently and safely. Even for running simple examples and experimenting a little, we strongly suggest to use an Integrated Development Environment (IDE). This will make your programming experience much better, allowing syntax checking, linting and visual debugging. Nowadays there are two free and multi-platform main choices: Microsoft Visual Studio Code aka VScode and @@ -176,7 +176,7 @@

    A modern python workplace -

    Debugging py4web with VScode

    +

    Debugging py4web with VScode

    It’s quite simple to run and debug py4web within VScode.

    If you have installed py4web from source, you just need to open the main py4web folder (not the apps folder!) with VScode and add:

    "args": ["run", "apps"],
    @@ -209,12 +209,12 @@ 

    Debugging py4web with VScode -

    Debugging py4web with PyCharm

    +

    Debugging py4web with PyCharm

    In PyCharm, if you should get gevent errors you need to enable Settings | Build, Execution, Deployment | Python Debugger | Gevent compatible.

    -

    How to contribute

    +

    How to contribute

    We need help from everyone: support our efforts! You can just participate in the Google group trying to answer other’s questions, submit bugs using or create pull requests on the GitHub repository.

    If you wish to correct and expand this manual, or even translate it in a new foreign language, you can read all the needed information directly on the @@ -261,7 +261,7 @@

    How to contribute - v: 1.20230507.1 + v: 1.20230718.1
    diff --git a/apps/_documentation/static/en/chapter-03.html b/apps/_documentation/static/en/chapter-03.html index d0dcc190a..c15bd13af 100644 --- a/apps/_documentation/static/en/chapter-03.html +++ b/apps/_documentation/static/en/chapter-03.html @@ -1,10 +1,10 @@ - + - Installation and Startup — py4web 1.20230507.1 documentation + Installation and Startup — py4web 1.20230718.1 documentation @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
    - 1.20230507.1 + 1.20230718.1
    @@ -129,9 +129,9 @@
    -

    Installation and Startup

    +

    Installation and Startup

    -

    Understanding the design

    +

    Understanding the design

    Before everything else it is important to understand that unlike other web frameworks, is not only a python module that can be imported by apps. It is also a program that is in charge of starting some apps. For this reason you need two things:

    @@ -146,16 +146,16 @@

    Understanding the design -

    Supported platforms and prerequisites

    +

    Supported platforms and prerequisites

    PY4WEB runs fine on Windows, MacOS and Linux. Its only prerequisite is Python 3.7+, which must be installed in advance (except if you use binaries).

    -

    Setup procedures

    +

    Setup procedures

    There are four alternative ways of running py4web, with different level of difficulty and flexibility. Let’s look at the pros and cons.

    -

    Installing from binaries

    +

    Installing from binaries

    This is not a real installation, because you just copy a bunch of files on your system without modifying it anyhow. Hence this is the simplest solution, especially for newbies or students, because it does not @@ -177,7 +177,7 @@

    Installing from binaries -

    Installing from pip

    +

    Installing from pip

    Using pip is the standard installation procedure for py4web, since it will quickly install the latest stable release of py4web.

    From the command line

    @@ -200,7 +200,7 @@

    Installing from pip -

    Installing using a virtual environment

    +

    Installing using a virtual environment

    A full installation of any complex python application like py4web will surely modify the python environment of your system. In order to prevent any unwanted change, it’s a good habit to use a python virtual @@ -218,7 +218,7 @@

    Installing using a virtual environment -

    Installing from source (globally)

    +

    Installing from source (globally)

    This is the traditional way for installing a program, but it works only on Linux and MacOS (Windows does not normally support the make utility). All the requirements will be installed on the @@ -238,7 +238,7 @@

    Installing from source (globally) -

    Installing from source (locally)

    +

    Installing from source (locally)

    In this way all the requirements will be installed or upgraded on the system’s path, but py4web itself will only be copied on a local folder. This is especially useful if you already have a @@ -275,7 +275,7 @@

    Installing from source (locally) -

    Upgrading

    +

    Upgrading

    If you installed py4web from pip you can simple upgrade it with

    python3 -m pip install --upgrade py4web
     
    @@ -297,7 +297,7 @@

    Upgrading -

    First run

    +

    First run

    Running py4web using any of the previous procedure should produce an output like this:

    py4web run apps
    @@ -339,7 +339,7 @@ 

    First run -

    Command line options

    +

    Command line options

    py4web provides multiple command line options which can be listed by running it without any argument

    # py4web
    @@ -349,7 +349,7 @@ 

    Command line optionsYou can have additional help for a specific command line option by running it with the –help or -h argument.

    -

    call command option

    +

    call command option

    # py4web call -h
     Usage: py4web.py call [OPTIONS] APPS_FOLDER FUNC
     
    @@ -370,7 +370,7 @@ 

    Command line options

    -

    new_app command option

    +

    new_app command option

    # py4web new_app -h
     Usage: py4web.py new_app [OPTIONS] APPS_FOLDER APP_NAME
     
    @@ -388,7 +388,7 @@ 

    Command line options

    -

    run command option

    +

    run command option

    # py4web run -h
     Usage: py4web.py run [OPTIONS] APPS_FOLDER
     
    @@ -446,7 +446,7 @@ 

    Command line options

    -

    set_password command option

    +

    set_password command option

    # py4web set_password -h
     Usage: py4web.py set_password [OPTIONS]
     
    @@ -483,7 +483,7 @@ 

    Command line options

    -

    setup command option

    +

    setup command option

    # py4web setup -h
     Usage: py4web.py setup [OPTIONS] APPS_FOLDER
     
    @@ -502,7 +502,7 @@ 

    Command line options

    -

    shell command option

    +

    shell command option

    # py4web shell -h
     Usage: py4web.py shell [OPTIONS] APPS_FOLDER
     
    @@ -525,7 +525,7 @@ 

    Command line options

    -

    version command option

    +

    version command option

    # py4web version -h
     Usage: py4web.py version [OPTIONS]
     
    @@ -541,13 +541,13 @@ 

    Command line options

    -

    Special installations

    +

    Special installations

    There are special cases in which you cannot or don’t want to use one of the generic installation instructions we’ve already described. There is a special folder called deployment_tools in the py4web repository that collects some special recipes. They are briefly described here, along with some tips and tricks.

    -

    HTTPS

    +

    HTTPS

    To use https with the build-in web server (Rocket3) these are the steps:

    -

    WSGI

    +

    WSGI

    py4web is a standard WSGI application. So, if a full program installation it’s not feasible you can simply run py4web as a WSGI app. For example, using gunicorn-cli, create a python file:

    @@ -594,7 +594,7 @@

    WSGI

    The wsgi function takes arguments with the same name as the command line arguments.

    -

    Deployment on GCloud (aka GAE - Google App Engine)

    +

    Deployment on GCloud (aka GAE - Google App Engine)

    Login into the Gcloud console and create a new project. You will obtain a project id that looks like “{project_name}-{number}”.

    @@ -638,21 +638,21 @@

    Deployment on GCloud (aka GAE - Google App Engine)main.py.

    -

    Deployment on PythonAnywhere.com

    +

    Deployment on PythonAnywhere.com

    Watch the YouTube video and follow the detailed tutorial . The bottle_app.py script is in py4web/deployment_tools/pythonanywhere.com/bottle_app.py

    -

    Deployment on Docker/Podman

    +

    Deployment on Docker/Podman

    On deployment_tools/docker there is a simple Dockerfile for quickly running a py4web container. There is also a docker-compose.yml file for setting up a more complex multi-container with PostgreSQL.

    Note that you can use them also with Podman, which has the advantage of does not requiring sudo and does not running any background daemon.

    -

    Deployment on Ubuntu

    +

    Deployment on Ubuntu

    On deployment_tools/ubuntu there is a bash script tested with Ubuntu Server 20.04.03 LTS. It uses nginx and self-signed certificates. It optionally manage iptables, too.

    @@ -695,7 +695,7 @@

    Deployment on Ubuntu - v: 1.20230507.1 + v: 1.20230718.1
    diff --git a/apps/_documentation/static/en/chapter-04.html b/apps/_documentation/static/en/chapter-04.html index a5683c28c..9cf552219 100644 --- a/apps/_documentation/static/en/chapter-04.html +++ b/apps/_documentation/static/en/chapter-04.html @@ -1,10 +1,10 @@ - + - The Dashboard — py4web 1.20230507.1 documentation + The Dashboard — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
    - 1.20230507.1 + 1.20230718.1
    @@ -99,13 +99,13 @@
    -

    The Dashboard

    +

    The Dashboard

    The Dashboard is the standard web based IDE; you will surely use it extensively to manage the applications and check your databases. Looking at its interface is a good way to start exploring py4web and its components.

    -

    The main Web page

    +

    The main Web page

    When you run the standard py4web program, it starts a web server with a main web page listening on http://127.0.0.1:8000 (which means that it is listening on the TCP port 8000 on your local PC, using the HTTP protocol).

    @@ -125,7 +125,7 @@

    The main Web page -

    Login into the Dashboard

    +

    Login into the Dashboard

    Pressing the Dashboard button will forward you to the Dashboard login. Here you must insert the password that you’ve already setup (see set_password command option). @@ -198,7 +198,7 @@

    Login into the Dashboard - v: 1.20230507.1 + v: 1.20230718.1
    diff --git a/apps/_documentation/static/en/chapter-05.html b/apps/_documentation/static/en/chapter-05.html index fbe9496de..226f83e75 100644 --- a/apps/_documentation/static/en/chapter-05.html +++ b/apps/_documentation/static/en/chapter-05.html @@ -1,10 +1,10 @@ - + - Creating your first app — py4web 1.20230507.1 documentation + Creating your first app — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
    - 1.20230507.1 + 1.20230718.1
    @@ -109,9 +109,9 @@
    -

    Creating your first app

    +

    Creating your first app

    -

    From scratch

    +

    From scratch

    Apps can be created using the dashboard or directly from the filesystem. Here, we are going to do it manually, as the Dashboard is already described in its own chapter.

    @@ -149,7 +149,7 @@

    From scratch -

    Static web pages

    +

    Static web pages

    To expose static web pages you simply need to create a static subfolder, and any file in there will be automatically published:

    mkdir apps/myapp/static
    @@ -169,7 +169,7 @@ 

    Static web pages -

    Dynamic Web Pages

    +

    Dynamic Web Pages

    To create a dynamic page, you must create a function that returns the page content. For example edit the myapp/__init__.py as follows:

    import datetime
    @@ -201,7 +201,7 @@ 

    Dynamic Web Pages -

    On return values

    +

    On return values

    py4web actions should return a string or a dictionary. If they return a dictionary you must tell py4web what to do with it. By default py4web will serialize it into json. For example edit __init__.py again and @@ -223,7 +223,7 @@

    On return values -

    Routes

    +

    Routes

    It is possible to map patterns in the URL into arguments of the function. For example:

    @action('color/<name>')
    @@ -265,7 +265,7 @@ 

    Routes

    -

    The request object

    +

    The request object

    From py4web you can import request

    from py4web import request
     
    @@ -288,7 +288,7 @@ 

    The requestWhich you can use the code to identify the name and the folder used for the app.

    -

    Templates

    +

    Templates

    In order to use a yatl template you must declare it. For example create a file apps/myapp/templates/paint.html that contains:

    <html>
      <head>
    @@ -345,7 +345,7 @@ 

    Templates -

    The _scaffold app

    +

    The _scaffold app

    Most of the times, you do not want to start writing code from scratch. You also want to follow some sane conventions outlined here, like not putting all your code into __init__.py. PY4WEB provides a @@ -422,7 +422,7 @@

    The _scaffold app -

    Copying the _scaffold app

    +

    Copying the _scaffold app

    The scaffold app is really useful, and you will surely use it a lot as a starting point for testing and even developing full features new apps.

    It’s better not to work directly on it: always create new apps copying it. @@ -440,7 +440,7 @@

    The _scaffold app -

    Watch for files change

    +

    Watch for files change

    As described in the run command option, Py4web facilitates a development server’s setup by automatically reloads an app when its Python source files change (by default). @@ -525,7 +525,7 @@

    Watch for files change - v: 1.20230507.1 + v: 1.20230718.1
    diff --git a/apps/_documentation/static/en/chapter-06.html b/apps/_documentation/static/en/chapter-06.html index 30ca12de2..a857880dc 100644 --- a/apps/_documentation/static/en/chapter-06.html +++ b/apps/_documentation/static/en/chapter-06.html @@ -1,10 +1,10 @@ - + - Fixtures — py4web 1.20230507.1 documentation + Fixtures — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
    - 1.20230507.1 + 1.20230718.1
    @@ -120,7 +120,7 @@
    -

    Fixtures

    +

    Fixtures

    A fixture is defined as “a piece of equipment or furniture which is fixed in position in a building or vehicle”. In our case a fixture is something attached to the action that processes an HTTP request in order @@ -151,7 +151,7 @@

    FixturesCustom fixtures paragraph.

    -

    Using Fixtures

    +

    Using Fixtures

    As we’ve seen in the previous chapter, fixtures are the arguments of the decorator @action.uses(...). You can specify multiple fixtures in one decorator or you can have multiple decorators.

    @@ -174,7 +174,7 @@

    Using Fixtures -

    The Template fixture

    +

    The Template fixture

    PY4WEB by default uses the YATL template language and provides a fixture for it.

    from py4web import action
    @@ -233,7 +233,7 @@ 

    The Template fixture

    -

    The Inject fixture

    +

    The Inject fixture

    The Inject fixture is used for passing variables (and even python functions) to templates. Here is a simple example:

    my_var = "Example variable to be passed to a Template"
    @@ -249,7 +249,7 @@ 

    The Inject fixtureUsing Inject in the YATL chapter.

    -

    The Translator fixture

    +

    The Translator fixture

    Here is an example of usage:

    from py4web import action, Translator
     import os
    @@ -326,7 +326,7 @@ 

    The Translator fixture

    -

    The Flash fixture

    +

    The Flash fixture

    It is common to want to display “alerts” to the users. Here we refer to them as flash messages. There is a little more to it than just displaying a message to the view, because flash messages:

    @@ -379,7 +379,7 @@

    The Flash fixture -

    The Session fixture

    +

    The Session fixture

    Simply speaking, a session can be defined as a way to preserve information that is desired to persist throughout the user’s interaction with the web site or web application. In other words, sessions render the stateless HTTP connection a stateful one.

    @@ -450,7 +450,7 @@

    The Session fixture -

    Client-side session in cookies

    +

    Client-side session in cookies

    By default the session object is stored inside a cookie called appname_session. It’s a JWT, hence encoded in a URL-friendly string format and signed using the provided secret for preventing tampering. @@ -464,7 +464,7 @@

    Client-side session in cookies -

    Server-side session in memcache

    +

    Server-side session in memcache

    Requires memcache installed and configured.

    import memcache, time
     conn = memcache.Client(['127.0.0.1:11211'], debug=0)
    @@ -473,7 +473,7 @@ 

    Server-side session in memcache -

    Server-side session in Redis

    +

    Server-side session in Redis

    Requires Redis installed and configured.

    import redis
     conn = redis.Redis(host='localhost', port=6379)
    @@ -488,7 +488,7 @@ 

    Server-side session in Redis -

    Server-side session in database

    +

    Server-side session in database

    from py4web import Session, DAL
     from py4web.utils.dbstore import DBStore
     db = DAL('sqlite:memory')
    @@ -512,7 +512,7 @@ 

    Server-side session in database -

    Server-side session anywhere

    +

    Server-side session anywhere

    You can easily store sessions in any place you want. All you need to do is provide to the Session object a storage object with both get and set methods. For example, imagine you want to store @@ -543,7 +543,7 @@

    Server-side session anywhere -

    Sharing sessions

    +

    Sharing sessions

    Imagine you have an app “app1” which uses a session and an app “app2” that wants to share a session with app1. Assuming they use sessons in cookies, “app2” would use:

    session = Session(secret=settings.SESSION_SECRET_KEY,
                       name="app1_session")
    @@ -561,7 +561,7 @@ 

    Sharing sessions -

    The Condition fixture

    +

    The Condition fixture

    Some times you want to restrict access to an action based on a given condition. For example to enforce a workflow:

    @action("step1")
    @@ -619,7 +619,7 @@ 

    The Condition fixture

    -

    The URLsigner fixture

    +

    The URLsigner fixture

    A signed URL is a URL that provides limited permission and time to make an HTTP request by containing authentication information in its query string. The typical usage is as follows:

    @@ -643,7 +643,7 @@

    The URLsigner fixture

    -

    The DAL fixture

    +

    The DAL fixture

    We have already used the DAL fixture in the context of sessions but maybe you want direct access to the DAL object for the purpose of accessing the database, not just sessions.

    @@ -675,7 +675,7 @@

    The DAL fixtureon_success and rolls back on_error.

    -

    The Auth fixture

    +

    The Auth fixture

    auth and auth.user are both fixtures that depend on session and db. Their role is to provide the action with authentication information.

    @@ -730,7 +730,7 @@

    The Auth fixture -

    Caveats about fixtures

    +

    Caveats about fixtures

    Since fixtures are shared by multiple actions you are not allowed to change their state because it would not be thread safe. There is one exception to this rule. Actions can change some attributes of database @@ -764,7 +764,7 @@

    Caveats about fixtures

    -

    Custom fixtures

    +

    Custom fixtures

    A fixture is an object with the following minimal structure:

    from py4web.core import Fixture
     
    @@ -860,7 +860,7 @@ 

    Custom fixtures -

    Multiple fixtures

    +

    Multiple fixtures

    As previously stated, it’s generally not important the order you use to specify the fixtures but it’s mandatory that you always place the template as the first one. Consider this:

    @@ -898,7 +898,7 @@

    Multiple fixtures -

    Caching and Memoize

    +

    Caching and Memoize

    py4web provides a cache in RAM object that implements the last recently used (LRU) algorithm. It can be used to cache any function via a decorator:

    @@ -923,16 +923,16 @@

    Caching and Memoize -

    Convenience Decorators

    +

    Convenience Decorators

    The _scaffold application, in common.py defines two special convenience decorators:

    -
    @unauthenticated
    +
    @unauthenticated()
     def index():
         return dict()
     

    and

    -
    @authenticated
    +
    @authenticated()
     def index():
         return dict()
     
    @@ -987,7 +987,7 @@

    Convenience Decorators - v: 1.20230507.1 + v: 1.20230718.1
    diff --git a/apps/_documentation/static/en/chapter-07.html b/apps/_documentation/static/en/chapter-07.html index ea5649eb1..6cb6a7d15 100644 --- a/apps/_documentation/static/en/chapter-07.html +++ b/apps/_documentation/static/en/chapter-07.html @@ -1,10 +1,10 @@ - + - The Database Abstraction Layer (DAL) — py4web 1.20230507.1 documentation + The Database Abstraction Layer (DAL) — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
    - 1.20230507.1 + 1.20230718.1
    @@ -258,9 +258,9 @@
    -

    The Database Abstraction Layer (DAL)

    +

    The Database Abstraction Layer (DAL)

    -

    DAL introduction

    +

    DAL introduction

    py4web rely on a database abstraction layer (DAL), an API that maps Python objects into database objects such as queries, tables, and records. The DAL dynamically generates the SQL in real time using the @@ -279,7 +279,7 @@

    DAL introduction -

    py4web model

    +

    py4web model

    Even if web2py and py4web use the same pyDAL, there are important differences (see From web2py to py4web for details). The main caveat is that in py4web only the action is executed for every HTTP request, while the code defined outside of @@ -292,7 +292,7 @@

    py4web model -

    Supported databases

    +

    Supported databases

    A partial list of supported databases is show in the table below. Please check on the py4web/pyDAL web site and mailing list for more recent adapters.

    @@ -367,7 +367,7 @@

    Supported databases -

    The DAL: a quick tour

    +

    The DAL: a quick tour

    py4web defines the following classes that make up the DAL:

    DAL

    represents a database connection. For example:

    @@ -424,7 +424,7 @@

    The DAL: a quick tour

    -

    Using the DAL “stand-alone”

    +

    Using the DAL “stand-alone”

    pyDAL is an independent python package. As such, it can be used without the web2py/py4web environment; you just need to install it with pip. Then import the pydal module when needed:

    @@ -443,7 +443,7 @@

    Using the DAL “stand-alone” -

    Experiment with the py4web shell

    +

    Experiment with the py4web shell

    You can also experiment with the pyDAL API using the py4web shell, that is available using the shell command option.

    @@ -471,7 +471,7 @@

    Experiment with the py4web shell -

    DAL constructor

    +

    DAL constructor

    Basic use:

    >>> db = DAL('sqlite://storage.sqlite')
     
    @@ -495,7 +495,7 @@

    DAL constructor -

    DAL signature

    +

    DAL signature

    DAL(uri='sqlite://dummy.db',
         pool_size=0,
         folder=None,
    @@ -524,7 +524,7 @@ 

    DAL signature -

    Connection strings (the uri parameter)

    +

    Connection strings (the uri parameter)

    A connection with the database is established by creating an instance of the DAL object:

    db = DAL('sqlite://storage.sqlite')
    @@ -645,7 +645,7 @@ 

    Connection strings (the uri parameter) -

    Connection pooling

    +

    Connection pooling

    A common argument of the DAL constructor is the pool_size; it defaults to zero.

    As it is rather slow to establish a new database connection for each @@ -670,7 +670,7 @@

    Connection pooling -

    Connection failures (attempts parameter)

    +

    Connection failures (attempts parameter)

    If py4web fails to connect to the database it waits 1 second and by default tries again up to 5 times before declaring a failure. In case of connection pooling it is possible that a pooled connection that stays @@ -679,7 +679,7 @@

    Connection failures (attempts parameter) -

    Lazy Tables

    +

    Lazy Tables

    Setting lazy_tables = True provides a major performance boost (but not with py4web). It means that table creation is deferred until the table is actually referenced.

    @@ -690,7 +690,7 @@

    Lazy Tables -

    Model-less applications

    +

    Model-less applications

    In py4web the code defined outside of actions (where normally DAL tables are defined) is only executed at startup.

    However, it is possible to define DAL tables on demand inside actions. @@ -702,7 +702,7 @@

    Model-less applicationsmodels.py file.

    -

    Replicated databases

    +

    Replicated databases

    The first argument of DAL(...) can be a list of URIs. In this case py4web tries to connect to each of them. The main purpose for this is to deal with multiple database servers and distribute the workload among @@ -715,7 +715,7 @@

    Replicated databases

    -

    Reserved keywords

    +

    Reserved keywords

    check_reserved tells the constructor to check table names and column names against reserved SQL keywords in target back-end databases. check_reserved defaults to None.

    @@ -765,7 +765,7 @@

    Reserved keywords -

    Database quoting and case settings

    +

    Database quoting and case settings

    Quoting of SQL entities are enabled by default in DAL, that is:

    entity_quoting = True

    This way identifiers are automatically quoted in SQL generated by DAL. @@ -788,7 +788,7 @@

    Database quoting and case settings -

    Making a secure connection

    +

    Making a secure connection

    Sometimes it is necessary (and advised) to connect to your database using secure connection, especially if your database is not on the same server as your application. In this case you need to pass additional @@ -806,16 +806,16 @@

    Making a secure connection -

    Other DAL constructor parameters

    +

    Other DAL constructor parameters

    -

    Database folder location

    +

    Database folder location

    folder sets the place where migration files will be created (see Migrations for details). It is also used for SQLite databases. Automatically set within py4web. Set a path when using DAL outside py4web.

    -

    Default migration settings

    +

    Default migration settings

    The DAL constructor migration settings are booleans affecting defaults and global behaviour.

    migrate = True sets default migrate behavior for all tables

    @@ -826,7 +826,7 @@

    Default migration settings -

    commit and rollback

    +

    commit and rollback

    The insert, truncate, delete, and update operations aren’t actually committed until py4web issues the commit command. The create and drop operations may be executed immediately, depending on the database @@ -880,10 +880,10 @@

    commit

    -

    Table constructor

    +

    Table constructor

    Tables are defined in the DAL via define_table.

    -

    define_table signature

    +

    define_table signature

    The signature for define_table method is:

    define_table(tablename, *fields, **kwargs)
     
    @@ -907,7 +907,7 @@

    define_table signature

    -

    id: Notes about the primary key

    +

    id: Notes about the primary key

    Do not declare a field called “id”, because one is created by py4web anyway. Every table has a field called “id” by default. It is an auto-increment integer field (usually starting at 1) used for @@ -921,13 +921,13 @@

    idprimarykey parameter.

    -

    plural and singular

    +

    plural and singular

    As pyDAL is a general DAL, it includes plural and singular attributes to refer to the table names so that external elements can use the proper name for a table.

    -

    redefine

    +

    redefine

    Tables can be defined only once but you can force py4web to redefine an existing table:

    db.define_table('person', Field('name'))
    @@ -937,7 +937,7 @@ 

    redefine

    The redefinition may trigger a migration if table definition changes.

    -

    format: Record representation

    +

    format: Record representation

    It is optional but recommended to specify a format representation for records with the format parameter.

    db.define_table('person', Field('name'), format='%(name)s')
    @@ -962,7 +962,7 @@ 

    format

    -

    rname: Real name

    +

    rname: Real name

    rname sets a database backend name for the table. This makes the py4web table name an alias, and rname is the real name used when constructing the query for the backend. To illustrate just one use, @@ -971,17 +971,17 @@

    rnamername = 'db1.dbo.table1'

    -

    primarykey: Support for legacy tables

    +

    primarykey: Support for legacy tables

    primarykey helps support legacy tables with existing primary keys, even multi-part. See Legacy databases and keyed tables.

    -

    migrate, fake_migrate

    +

    migrate, fake_migrate

    migrate sets migration options for the table. Refer to Migrations for details.

    -

    table_class

    +

    table_class

    If you define your own table class as a sub-class of pydal.objects.Table, you can provide it here; this allows you to extend and override methods. Example:

    @@ -995,7 +995,7 @@

    table_class

    -

    sequence_name

    +

    sequence_name

    The name of a custom table sequence (if supported by the database). Can create a SEQUENCE (starting at 1 and incrementing by 1) or use this for legacy tables with custom sequences.

    @@ -1005,16 +1005,16 @@

    sequence_name

    -

    trigger_name

    +

    trigger_name

    Relates to sequence_name. Relevant for some backends which do not support auto-increment numeric fields.

    -

    polymodel

    +

    polymodel

    For use with Google App Engine.

    -

    on_define

    +

    on_define

    on_define is a callback triggered when a lazy_table is instantiated, although it is called anyway if the table is not lazy. This allows dynamic changes to the table without losing the advantages of delayed @@ -1038,7 +1038,7 @@

    on_defineon_define.

    -

    Adding attributes to fields and tables

    +

    Adding attributes to fields and tables

    If you need to add custom attributes to fields, you can simply do this: db.table.field.extra = {}

    “extra” is not a keyword; it’s a custom attribute now attached to the @@ -1049,7 +1049,7 @@

    Adding attributes to fields and tables -

    Legacy databases and keyed tables

    +

    Legacy databases and keyed tables

    py4web can connect to legacy databases under some conditions.

    The easiest way is when these conditions are met:

      @@ -1094,7 +1094,7 @@

      Legacy databases and keyed tables -

      Field constructor

      +

      Field constructor

      These are the default values of a Field constructor:

      Field(fieldname, type='string', length=None, default=DEFAULT,
             required=False, requires=DEFAULT,
      @@ -1222,7 +1222,7 @@ 

      Field constructordefault, update, readable, writable, requires.

      -

      Field types and validators

      +

      Field types and validators

      @@ -1321,7 +1321,7 @@

      Field types and validators -

      Run-time field and table modification

      +

      Run-time field and table modification

      Most attributes of fields and tables can be modified after they are defined:

      >>> db.define_table('person', Field('name', default=''), format='%(name)s')
      @@ -1392,7 +1392,7 @@ 

      Run-time field and table modification -

      More on uploads

      +

      More on uploads

      Consider the following model:

      db.define_table('myfile',
                       Field('image', 'upload', default='path/to/file'))
      @@ -1480,7 +1480,7 @@ 

      More on uploads -

      Migrations

      +

      Migrations

      With our example table definition:

      db.define_table('person')
       
      @@ -1545,7 +1545,7 @@

      Migrations -

      Fixing broken migrations

      +

      Fixing broken migrations

      There are two common problems with migrations and there are ways to recover from them.

      One problem is specific with SQLite. SQLite does not enforce column @@ -1589,7 +1589,7 @@

      Fixing broken migrations -

      Migration control summary

      +

      Migration control summary

      The logic of the various migration arguments are summarized in this pseudo-code:

      if DAL.migrate_enabled and table.migrate:
      @@ -1602,9 +1602,9 @@ 

      Migration control summary -

      Table methods

      +

      Table methods

      -

      insert

      +

      insert

      Given a table, you can insert records

      >>> db.person.insert(name="Alex")
       1
      @@ -1643,7 +1643,7 @@ 

      insert

      -

      Query, Set, Rows

      +

      Query, Set, Rows

      Let’s consider again the table defined (and dropped) previously and insert three records:

      >>> db.define_table('person', Field('name'))
      @@ -1682,7 +1682,7 @@ 

      Query

      -

      update_or_insert

      +

      update_or_insert

      Some times you need to perform an insert only if there is no record with the same values as those being inserted. This can be done with

      db.define_table('person',
      @@ -1713,7 +1713,7 @@ 

      update_or_inser

      -

      validate_and_insert, validate_and_update

      +

      validate_and_insert, validate_and_update

      The function

      ret = db.mytable.validate_and_insert(field='value')
       
      @@ -1744,14 +1744,14 @@

      validate_and_in will be in ret.errors.

      -

      drop

      +

      drop

      Finally, you can drop tables and all data will be lost:

      db.person.drop()
       
      -

      Tagging records

      +

      Tagging records

      Tags allows to add or find properties attached to records in your database.

      from py4web import DAL, Field
      @@ -1790,9 +1790,9 @@ 

      Tagging records -

      Raw SQL

      +

      Raw SQL

      -

      executesql

      +

      executesql

      The DAL allows you to explicitly issue SQL statements.

      >>> db.executesql('SELECT * FROM person;')
       [(1, u'Massimo'), (2, u'Massimo')]
      @@ -1843,7 +1843,7 @@ 

      executesql

      -

      _lastsql

      +

      _lastsql

      Whether SQL was executed manually using executesql or was SQL generated by the DAL, you can always find the SQL code in db._lastsql. This is useful for debugging purposes:

      @@ -1858,14 +1858,14 @@

      _lastsql

      -

      Timing queries

      +

      Timing queries

      All queries are automatically timed by py4web. The variable db._timings is a list of tuples. Each tuple contains the raw SQL query as passed to the database driver and the time it took to execute in seconds.

      -

      Indexes

      +

      Indexes

      Currently the DAL API does not provide a command to create indexes on tables, but this can be done using the executesql command. This is because the existence of indexes can make migrations complex, and it is @@ -1881,7 +1881,7 @@

      Indexes -

      Generating raw SQL

      +

      Generating raw SQL

      Sometimes you need to generate the SQL but not execute it. This is easy to do with py4web since every command that performs database IO has an equivalent command that does not, and simply returns the SQL that would @@ -1920,7 +1920,7 @@

      Generating raw SQL -

      select command

      +

      select command

      Given a Set, s, you can fetch the records with the command select:

      >>> rows = s.select()
      @@ -2018,7 +2018,7 @@ 

      select

      -

      Using an iterator-based select for lower memory use

      +

      Using an iterator-based select for lower memory use

      Python “iterators” are a type of “lazy-evaluation”. They ‘feed’ data one step at time; traditional Python loops create the entire set of data in memory before looping.

      @@ -2037,7 +2037,7 @@

      Using an iterator-based select for lower memory use

      -

      Rendering rows using represent

      +

      Rendering rows using represent

      You may wish to rewrite rows returned by select to take advantage of formatting information contained in the represents setting of the fields.

      @@ -2065,7 +2065,7 @@

      Rendering rows using represent -

      Shortcuts

      +

      Shortcuts

      The DAL supports various code-simplifying shortcuts. In particular:

      myrecord = db.mytable[id]
       
      @@ -2111,7 +2111,7 @@

      Shortcuts -

      Fetching a Row

      +

      Fetching a Row

      Yet another convenient syntax is the following:

      record = db.mytable(id)
       record = db.mytable(db.mytable.id == id)
      @@ -2125,7 +2125,7 @@ 

      Fetching a Row< record must meet. If they are not met, it also returns None.

      -

      Recursive selects

      +

      Recursive selects

      Consider the previous table person and a new table “thing” referencing a “person”:

      db.define_table('thing',
      @@ -2171,10 +2171,10 @@ 

      Recursive selec a full Query.

      -

      orderby, groupby, limitby, distinct, having, orderby_on_limitby, join, left, cache

      +

      orderby, groupby, limitby, distinct, having, orderby_on_limitby, join, left, cache

      The select command takes a number of optional arguments.

      -

      orderby

      +

      orderby

      You can fetch the records sorted by name:

      >>> for row in db().select(db.person.ALL, orderby=db.person.name):
       ...     print(row.name)
      @@ -2224,7 +2224,7 @@ 

      orderby -

      groupby, having

      +

      groupby, having

      Using groupby together with orderby, you can group records with the same value for the specified field (this is back-end specific, and is not on the Google NoSQL):

      @@ -2247,7 +2247,7 @@

      groupby, having -

      distinct

      +

      distinct

      With the argument distinct=True, you can specify that you only want to select distinct records. This has the same effect as grouping using all specified fields except that it does not require sorting. When using @@ -2273,7 +2273,7 @@

      distinct -

      limitby

      +

      limitby

      With limitby=(min, max), you can select a subset of the records from offset=min to but not including offset=max. In the next example we select the first two records starting at zero:

      @@ -2286,19 +2286,19 @@

      limitby -

      orderby_on_limitby

      +

      orderby_on_limitby

      Note that the DAL defaults to implicitly adding an orderby when using a limitby. This ensures the same query returns the same results each time, important for pagination. But it can cause performance problems. use orderby_on_limitby = False to change this (this defaults to True).

      -

      join, left

      +

      join, left

      These are involved in managing One to many relation. They are described in Inner join and Left outer join sections respectively.

      -

      cache, cacheable

      +

      cache, cacheable

      An example use which gives much faster selects is:

      rows = db(query).select(cache=(cache.ram, 3600), cacheable=True)
       
      @@ -2307,7 +2307,7 @@

      cache, cacheable -

      Logical operators

      +

      Logical operators

      Queries can be combined using the binary AND operator “&”:

      >>> rows = db((db.person.name=='Alex') & (db.person.id > 3)).select()
       >>> for row in rows: print row.id, row.name
      @@ -2353,7 +2353,7 @@ 

      Logical operators -

      count, isempty, delete, update

      +

      count, isempty, delete, update

      You can count records in a set:

      >>> db(db.person.name != 'William').count()
       3
      @@ -2384,7 +2384,7 @@ 

      countThe update method returns the number of records that were updated.

      -

      Expressions

      +

      Expressions

      The value assigned an update statement can be an expression. For example consider this model

      db.define_table('person',
      @@ -2405,7 +2405,7 @@ 

      Expressions -

      case

      +

      case

      An expression can contain a case clause for example:

      >>> condition = db.person.name.startswith('B')
       >>> yes_or_no = condition.case('Yes', 'No')
      @@ -2419,7 +2419,7 @@ 

      case

      -

      update_record

      +

      update_record

      py4web also allows updating a single record that is already in memory using update_record

      >>> row = db(db.person.id == 2).select().first()
      @@ -2456,7 +2456,7 @@ 

      update_recordTrue.

      -

      Inserting and updating from a dictionary

      +

      Inserting and updating from a dictionary

      A common issue consists of needing to insert or update records in a table where the name of the table, the field to be updated, and the value for the field are all stored in variables. For example: @@ -2474,7 +2474,7 @@

      Inserting and updating from a dictionary -

      first and last

      +

      first and last

      Given a Rows object containing records:

      rows = db(query).select()
       first_row = rows.first()
      @@ -2495,7 +2495,7 @@ 

      first

      -

      as_dict and as_list

      +

      as_dict and as_list

      A Row object can be serialized into a regular dictionary using the as_dict() method and a Rows object can be serialized into a list of dictionaries using the as_list() method. Here are some examples:

      @@ -2514,7 +2514,7 @@

      as_dict<

      -

      Combining rows

      +

      Combining rows

      Rows objects can be combined at the Python level. Here we assume:

      >>> print(rows1)
       person.name
      @@ -2555,7 +2555,7 @@ 

      Combining rows -

      find, exclude, sort

      +

      find, exclude, sort

      Some times you need to perform two selects and one contains a subset of a previous select. In this case it is pointless to access the database again. The find, exclude and sort objects allow you to @@ -2612,7 +2612,7 @@

      findselect method.

      -

      Caching selects

      +

      Caching selects

      The select method also takes a cache argument, which defaults to None. For caching purposes, it should be set to a tuple where the first element is the cache model (cache.ram, cache.disk, etc.), and @@ -2648,9 +2648,9 @@

      Caching selects -

      Computed and Virtual fields

      +

      Computed and Virtual fields

      -

      Computed fields

      +

      Computed fields

      DAL fields may have a compute attribute. This must be a function (or lambda) that takes a Row object and returns a value for the field. When a new record is modified, including both insertions and updates, if a @@ -2680,7 +2680,7 @@

      Computed fields -

      Virtual fields

      +

      Virtual fields

      Virtual fields are also computed fields (as in the previous subsection) but they differ from those because they are virtual in the sense that they are not stored in the db and they are computed each time records @@ -2689,7 +2689,7 @@

      Virtual fields -

      New style virtual fields (experimental)

      +

      New style virtual fields (experimental)

      py4web provides a new and easier way to define virtual fields and lazy virtual fields. This section is marked experimental because the APIs may still change a little from what is described here.

      @@ -2750,7 +2750,7 @@

      New style virtual fields (experimental) -

      Old style virtual fields

      +

      Old style virtual fields

      In order to define one or more virtual fields, you can also define a container class, instantiate it and link it to a table or to a select. For example, consider the following table:

      @@ -2853,9 +2853,9 @@

      Old style virtual fields -

      Joins and Relations

      +

      Joins and Relations

      -

      One to many relation

      +

      One to many relation

      To illustrate how to implement one to many relations with the DAL, define another table “thing” that refers to the table “person” which we redefine here:

      @@ -2919,7 +2919,7 @@

      One to many relation

      -

      Inner join

      +

      Inner join

      Another way to achieve a similar result is by using a join, specifically an INNER JOIN. py4web performs joins automatically and transparently when the query links two or more tables as in the following example:

      @@ -2975,7 +2975,7 @@

      Inner joinjoin can be list of db.table.on(...) to join.

      -

      Left outer join

      +

      Left outer join

      Notice that Carl did not appear in the list above because he has no things. If you intend to select on persons (whether they have things or not) and their things (if they have any), then you need to perform a @@ -3004,7 +3004,7 @@

      Left outer joindb.mytable.on(...) to the left parameter.

      -

      Grouping and counting

      +

      Grouping and counting

      When doing joins, sometimes you want to group rows according to certain criteria and count them. For example, count the number of things owned by every person. py4web allows this as well. First, you need a count @@ -3031,7 +3031,7 @@

      Grouping and counting

      -

      Many to many relation

      +

      Many to many relation

      In the previous examples, we allowed a thing to have one owner but one person could have many things. What if Boat was owned by Alex and Curt? This requires a many-to-many relation, and it is realized via an @@ -3106,7 +3106,7 @@

      Many to many relation

      -

      Self-Reference and aliases

      +

      Self-Reference and aliases

      It is possible to define tables with fields that refer to themselves, here is an example:

      db.define_table('person',
      @@ -3187,7 +3187,7 @@ 

      Self-Reference and aliases -

      Other operators

      +

      Other operators

      py4web has other operators that provide an API to access equivalent SQL operators. Let’s define another table “log” to store security events, their event_time and severity, where the severity is an integer number.

      @@ -3212,7 +3212,7 @@

      Other operators -

      like, ilike, regexp, startswith, endswith, contains, upper, lower

      +

      like, ilike, regexp, startswith, endswith, contains, upper, lower

      Fields have a like operator that you can use to match strings:

      >>> for row in db(db.log.event.like('port%')).select():
       ...     print(row.event)
      @@ -3273,7 +3273,7 @@ 

      like

      -

      year, month, day, hour, minutes, seconds

      +

      year, month, day, hour, minutes, seconds

      The date and datetime fields have day, month and year methods. The datetime and time fields have hour, minutes and seconds methods. Here is an example:

      @@ -3287,7 +3287,7 @@

      year

      -

      belongs

      +

      belongs

      The SQL IN operator is realized via the belongs method which returns true when the field value belongs to the specified set (list or tuples):

      >>> for row in db(db.log.severity.belongs((1, 2))).select():
      @@ -3334,7 +3334,7 @@ 

      belongs< person “Jonathan”. The two lines result in one single SQL query.

      -

      sum, avg, min, max and len

      +

      sum, avg, min, max and len

      Previously, you have used the count operator to count records. Similarly, you can use the sum operator to add (sum) the values of a specific field from a group of records. As in the case of count, the @@ -3370,7 +3370,7 @@

      sum

      -

      Substrings

      +

      Substrings

      One can build an expression to refer to a substring. For example, we can group things whose name starts with the same three characters and select only one from each group:

      @@ -3379,7 +3379,7 @@

      Substrings -

      Default values with coalesce and coalesce_zero

      +

      Default values with coalesce and coalesce_zero

      There are times when you need to pull a value from database but also need a default values if the value for a record is set to NULL. In SQL there is a function, COALESCE, for this. py4web has an equivalent @@ -3420,9 +3420,9 @@

      Default values with -

      Exporting and importing data

      +

      Exporting and importing data

      -

      CSV (one Table at a time)

      +

      CSV (one Table at a time)

      When a Rows object is converted to a string it is automatically serialized in CSV:

      >>> rows = db(db.person.id == db.thing.owner_id).select()
      @@ -3474,7 +3474,7 @@ 

      CSV (one Table at a time) -

      CSV (all tables at once)

      +

      CSV (all tables at once)

      In py4web, you can backup/restore an entire database with two commands:

      To export:

      with open('somefile.csv', 'w', encoding='utf-8', newline='') as dumpfile:
      @@ -3512,7 +3512,7 @@ 

      CSV (all tables at once)

      -

      CSV and remote database synchronization

      +

      CSV and remote database synchronization

      Consider once again the following model:

      db.define_table('person',
                       Field('name'))
      @@ -3610,7 +3610,7 @@ 

      CSV and remote database synchronization -

      HTML and XML (one Table at a time)

      +

      HTML and XML (one Table at a time)

      Rows objects also have an xml method (like helpers) that serializes it to XML/HTML:

      >>> rows = db(db.person.id == db.thing.owner_id).select()
      @@ -3662,7 +3662,7 @@ 

      HTML and XML (one Table at a time) -

      Data representation

      +

      Data representation

      The Rows.export_to_csv_file method accepts a keyword argument named represent. When True it will use the columns represent function while exporting the data instead of the raw data.

      @@ -3693,9 +3693,9 @@

      Data representation -

      Advanced features

      +

      Advanced features

      -

      list:<type> and contains

      +

      list:<type> and contains

      py4web provides the following special field types:

      list:string
       list:integer
      @@ -3779,7 +3779,7 @@ 

      Advanced features -

      Table inheritance

      +

      Table inheritance

      It is possible to create a table that contains all the fields from another table. It is sufficient to pass the other table in place of a field to define_table. For example

      @@ -3815,7 +3815,7 @@

      Table inheritance -

      filter_in and filter_out

      +

      filter_in and filter_out

      It is possible to define a filter for each field to be called before a value is inserted into the database for that field and after a value is retrieved from the database.

      @@ -3840,7 +3840,7 @@

      Table inheritanceSQLCustomType, as discussed in Custom Field types.

      -

      callbacks on record insert, delete and update

      +

      callbacks on record insert, delete and update

      PY4WEB provides a mechanism to register callbacks to be called before and/or after insert, update and delete of records.

      Each table stores six lists of callbacks:

      @@ -3898,7 +3898,7 @@

      callbacks on record insert, delete and updateupdate but ignores before and after callbacks.

      -

      Database cascades

      +

      Database cascades

      Database schema can define relationships which trigger deletions of related records, known as cascading. The DAL is not informed when a record is deleted due to a cascade. So no *_delete callback will ever @@ -3906,7 +3906,7 @@

      Database cascades -

      Record versioning

      +

      Record versioning

      It is possible to ask py4web to save every copy of a record when the record is individually modified. There are different ways to do it and it can be done for all tables at once using the syntax:

      @@ -3957,7 +3957,7 @@

      Record versioning -

      Common filters

      +

      Common filters

      A common filter is a generalization of the above multi-tenancy idea. It provides an easy way to prevent repeating of the same query. Consider for example the following table:

      @@ -3992,7 +3992,7 @@

      Common filters -

      Custom Field types

      +

      Custom Field types

      Aside for using filter_in and filter_out, it is possible to define new/custom field types. For example, suppose that you want to define a custom type to store an IP address:

      @@ -4050,7 +4050,7 @@

      Common filters -

      Using DAL without define tables

      +

      Using DAL without define tables

      The DAL can be used from any Python program simply by doing this:

      from pydal import DAL, Field
       db = DAL('sqlite://storage.sqlite', folder='path/to/app/databases')
      @@ -4070,7 +4070,7 @@ 

      Using DAL without define tables -

      Distributed transaction

      +

      Distributed transaction

      At the time of writing this feature is only supported by PostgreSQL, MySQL and Firebird, since they expose API for two-phase commits.

      @@ -4093,7 +4093,7 @@

      Distributed transaction

      -

      Copy data from one db into another

      +

      Copy data from one db into another

      Consider the situation in which you have been using the following database:

      db = DAL('sqlite://storage.sqlite')
      @@ -4110,9 +4110,9 @@ 

      Copy data from one db into another -

      Gotchas

      +

      Gotchas

      -

      Note on new DAL and adapters

      +

      Note on new DAL and adapters

      The source code of the Database Abstraction Layer was completely rewritten in 2010. While it stays backward compatible, the rewrite made it more modular and easier to extend. Here we explain the main logic.

      @@ -4386,7 +4386,7 @@

      Note on new DAL and adapters -

      SQLite

      +

      SQLite

      SQLite does not support dropping and altering columns. That means that py4web migrations will work up to a point. If you delete a field from a table, the column will remain in the database but will be invisible to @@ -4405,7 +4405,7 @@

      SQLite

      -

      MySQL

      +

      MySQL

      MySQL does not support multiple ALTER TABLE within a single transaction. This means that any migration process is broken into multiple commits. If something happens that causes a failure it is possible to break a @@ -4418,7 +4418,7 @@

      MySQL again).

      -

      Google SQL

      +

      Google SQL

      Google SQL has the same problems as MySQL and more. In particular table metadata itself must be stored in the database in a table that is not migrated by py4web. This is because Google App Engine has a read-only @@ -4431,7 +4431,7 @@

      Google SQLpy4web_filesystem.

      -

      MSSQL (Microsoft SQL Server)

      +

      MSSQL (Microsoft SQL Server)

      MSSQL < 2012 does not support the SQL OFFSET keyword. Therefore the database cannot do pagination. When doing a limitby=(a, b) py4web will fetch the first a + b rows and discard the first a. This @@ -4468,7 +4468,7 @@

      MSSQL (Microsoft SQL Server) -

      Oracle

      +

      Oracle

      Oracle also does not support pagination. It does not support neither the OFFSET nor the LIMIT keywords. PY4WEB achieves pagination by translating a db(...).select(limitby=(a, b)) into a complex three-way nested @@ -4477,7 +4477,7 @@

      Oracle

      -

      Google NoSQL (Datastore)

      +

      Google NoSQL (Datastore)

      Google NoSQL (Datastore) does not allow joins, left joins, aggregates, expression, OR involving more than one table, the ‘like’ operator searches in “text” fields.

      @@ -4532,7 +4532,7 @@

      Google NoSQL (Datastore) - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/chapter-08.html b/apps/_documentation/static/en/chapter-08.html index 43ad70afa..82a5fbb4f 100644 --- a/apps/_documentation/static/en/chapter-08.html +++ b/apps/_documentation/static/en/chapter-08.html @@ -1,10 +1,10 @@ - + - The RestAPI — py4web 1.20230507.1 documentation + The RestAPI — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -101,7 +101,7 @@
      -

      The RestAPI

      +

      The RestAPI

      Since version 19.5.10 pyDAL includes a restful API [CIT0801] called RestAPI. It is inspired by GraphQL [CIT0802] and while it’s not quite the same due to it being less powerful, it is in the spirit of py4web since it’s more practical and easier to use.

      @@ -198,7 +198,7 @@

      The RestAPI -

      RestAPI policies and actions

      +

      RestAPI policies and actions

      The policy is per table (or * for all tables) and per method. authorize can be True (allow), False (deny) or a function with the signature (method, tablename, record_id, get_vars, post_vars) which returns @@ -223,7 +223,7 @@

      RestAPI policies and actions -

      RestAPI GET

      +

      RestAPI GET

      The general query has the form {something}.eq=value where eq= stands for “equal”, gt= stands for “greater than”, etc. The expression can be prepended by not..

      @@ -284,7 +284,7 @@

      RestAPI GET@lookup denormalizes the linked field.

      -

      RestAPI practical examples

      +

      RestAPI practical examples

      Here are some practical examples:

      URL:

      /superheroes/api/superhero
      @@ -1086,7 +1086,7 @@ 

      RestAPI practical examples -

      The RestAPI response

      +

      The RestAPI response

      All RestAPI response have the fields:

      api_version:
      @@ -1169,7 +1169,7 @@

      The RestAPI response - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/chapter-09.html b/apps/_documentation/static/en/chapter-09.html index e98806c7e..2e86eecc5 100644 --- a/apps/_documentation/static/en/chapter-09.html +++ b/apps/_documentation/static/en/chapter-09.html @@ -1,10 +1,10 @@ - + - YATL Template Language — py4web 1.20230507.1 documentation + YATL Template Language — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -117,7 +117,7 @@
      -

      YATL Template Language

      +

      YATL Template Language

      py4web uses two distinct template languages for rendering dynamic HTML pages that contain Python code:

      -

      Basic syntax

      +

      Basic syntax

      The py4web template language supports all Python control structures. Here we provide some examples of each of them. They can be nested according to usual programming practice. @@ -237,7 +237,7 @@

      Basic syntaxCopying the _scaffold app) and then editing the file new_app/template/index.html.

      -

      for...in

      +

      for...in

      In templates you can loop over any iterable object:

      [[items = ['a', 'b', 'c'] ]]
       <ul>
      @@ -258,7 +258,7 @@ 

      for...in The elements displayed are first serialized and escaped.

      -

      while

      +

      while

      You can create a loop using the while keyword:

      [[k = 3]]
       <ul>
      @@ -276,7 +276,7 @@ 

      while

      -

      if...elif...else

      +

      if...elif...else

      You can use conditional clauses:

      [[
       import random
      @@ -320,7 +320,7 @@ 

      if...elif...els

      -

      try...except...else...finally

      +

      try...except...else...finally

      It is also possible to use try...except statements in templates with one caveat. Consider the following example:

      [[try:]]
      @@ -344,7 +344,7 @@ 

      try...except... the try block. “Hello” is written because it precedes the exception.

      -

      def...return

      +

      def...return

      The py4web template language allows the developer to define and implement functions that can return any Python object or a text/html string. Here we consider two examples:

      @@ -381,13 +381,13 @@

      def...return

      -

      Information workflow

      +

      Information workflow

      For dynamically modifying the workflow of the information there are custom commands available: extend, include, block and super. Note that they are special template directives, not Python commands.

      In addition, you can use normal Python functions inside templates.

      -

      extend and include

      +

      extend and include

      Templates can extend and include other templates in a tree-like structure.

      For example, we can think of a template “index.html” that extends “layout.html” and includes “body.html”. At the same time, “layout.html” @@ -461,7 +461,7 @@

      extend

      -

      Extending using variables

      +

      Extending using variables

      The argument of an extend or include (i.e., the extended or included template name) can be a Python variable (though not a Python expression). However, this imposes a limitation – templates that use @@ -496,7 +496,7 @@

      Extending using variables -

      Template Functions

      +

      Template Functions

      Consider this “layout.html”:

      <!--layout.html-->
       <html>
      @@ -542,7 +542,7 @@ 

      Template Functions[[=mysidebar()]]. Functions defined in this way can take arguments.

      -

      block and super

      +

      block and super

      The main way to make a template more modular is by using [[block ...]]s and this mechanism is an alternative to the mechanism discussed in the previous section.

      @@ -622,9 +622,9 @@

      block

      -

      Page layout standard structure

      +

      Page layout standard structure

      -

      Default page layout

      +

      Default page layout

      The “templates/layout.html” that currently ships with the py4web _scaffold application is quite complex but it has the following structure:

       1 <!DOCTYPE html>
      @@ -716,7 +716,7 @@ 

      Default page layout -

      Mobile development

      +

      Mobile development

      Although the default layout.html is designed to be mobile-friendly, one may sometimes need to use different templates when a page is visited by a mobile device.

      @@ -760,7 +760,7 @@

      Mobile development - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/chapter-10.html b/apps/_documentation/static/en/chapter-10.html index abf70e105..d90daa3cf 100644 --- a/apps/_documentation/static/en/chapter-10.html +++ b/apps/_documentation/static/en/chapter-10.html @@ -1,10 +1,10 @@ - + - YATL helpers — py4web 1.20230507.1 documentation + YATL helpers — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -144,9 +144,9 @@
      -

      YATL helpers

      +

      YATL helpers

      -

      Helpers overview

      +

      Helpers overview

      Consider the following code in a template:

      [[=DIV('this', 'is', 'a', 'test', _id='123', _class='myclass')]]
       
      @@ -264,9 +264,9 @@

      Helpers overview -

      Built-in helpers

      +

      Built-in helpers

      -

      XML

      +

      XML

      XML is an helper object used to encapsulate text that should not be escaped. The text may or may not contain valid XML; for example it could contain JavaScript.

      @@ -313,7 +313,7 @@

      Built-in helpers -

      A

      +

      A

      This helper is used to build links.

      >>> print(A('<click>', XML('<strong>me</strong>'),
                   _href='http://www.py4web.com'))
      @@ -322,7 +322,7 @@ 

      A

      -

      BODY

      +

      BODY

      This helper makes the body of a page.

      >>> print(BODY('<hello>', XML('<strong>world</strong>'), _bgcolor='red'))
       <body bgcolor="red">&lt;hello&gt;<strong>world</strong></body>
      @@ -330,7 +330,7 @@ 

      BODY

      -

      CAT

      +

      CAT

      This helper concatenates other helpers.

      >>> print(CAT('Here is a ', A('link', _href='target'), ', and here is some ', STRONG('bold text'), '.'))
       Here is a <a href="target">link</a>, and here is some <strong>bold text</strong>.
      @@ -338,7 +338,7 @@ 

      CAT

      -

      DIV

      +

      DIV

      This is the content division element.

      >>> print(DIV('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <div id="0" class="test">&lt;hello&gt;<strong>world</strong></div>
      @@ -346,7 +346,7 @@ 

      DIV

      -

      EM

      +

      EM

      Emphasizes its content.

      >>> print(EM('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <em id="0" class="test">&lt;hello&gt;<strong>world</strong></em>
      @@ -354,7 +354,7 @@ 

      EM

      -

      FORM

      +

      FORM

      Use this helper to make a FORM for user input. Forms will be later discussed in detail in the dedicated Forms chapter.

      >>> print(FORM(INPUT(_type='submit'), _action='', _method='post'))
      @@ -363,7 +363,7 @@ 

      FORM

      -

      H1, H2, H3, H4, H5, H6

      +

      H1, H2, H3, H4, H5, H6

      These helpers are for paragraph headings and subheadings.

      >>> print(H1('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <h1 id="0" class="test">&lt;hello&gt;<strong>world</strong></h1>
      @@ -371,7 +371,7 @@ 

      H1

      -

      HTML

      +

      HTML

      For tagging an HTML page.

      >>> print(HTML(BODY('<hello>', XML('<strong>world</strong>'))))
       <html><body>&lt;hello&gt;<strong>world</strong></body></html>
      @@ -387,7 +387,7 @@ 

      HTML

      -

      I

      +

      I

      This helper makes its contents italic.

      >>> print(I('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <i id="0" class="test">&lt;hello&gt;<strong>world</strong></i>
      @@ -395,7 +395,7 @@ 

      I

      -

      IMG

      +

      IMG

      It can be used to embed images into HTML.

      >>> print(IMG(_src='http://example.com/image.png', _alt='test'))
       <img alt="test" src="http://example.com/image.png"/>
      @@ -410,7 +410,7 @@ 

      IMG

      -

      INPUT

      +

      INPUT

      Creates an <input.../> tag. An input tag may not contain other tags, and is closed by /> instead of >. The input tag has an optional attribute _type that can be set to “text” (the default), “submit”, @@ -437,7 +437,7 @@

      INPUT

      -

      LABEL

      +

      LABEL

      It is used to create a LABEL tag for an INPUT field.

      >>> print(LABEL('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <label id="0" class="test">&lt;hello&gt;<strong>world</strong></label>
      @@ -445,7 +445,7 @@ 

      LABEL

      -

      LI

      +

      LI

      It makes a list item and should be contained in a UL or OL tag.

      >>> print(LI('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <li id="0" class="test">&lt;hello&gt;<strong>world</strong></li>
      @@ -453,7 +453,7 @@ 

      LI

      -

      OL

      +

      OL

      It stands for ordered list. The list should contain LI tags.

      >>> print(OL(LI('<hello>'), LI(XML('<strong>world</strong>')), _class='test', _id=0))
       <ol class="test" id="0"><li>&lt;hello&gt;</li><li><strong>world</strong></li></ol>
      @@ -461,7 +461,7 @@ 

      OL

      -

      OPTION

      +

      OPTION

      This should only be used as argument of a SELECT.

      >>> print(OPTION('<hello>', XML('<strong>world</strong>'), _value='a'))
       <option value="a">&lt;hello&gt;<strong>world</strong></option>
      @@ -474,7 +474,7 @@ 

      OPTION

      -

      P

      +

      P

      This is for tagging a paragraph.

      >>> print(P('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <p id="0" class="test">&lt;hello&gt;<strong>world</strong></p>
      @@ -482,7 +482,7 @@ 

      P

      -

      PRE

      +

      PRE

      Generates a <pre>...</pre> tag for displaying pre-formatted text. The CODE helper is generally preferable for code listings.

      >>> print(SELECT(OPTION('first', _value='1'), OPTION('second', _value='2'), _class='test', _id=0))
      @@ -491,7 +491,7 @@ 

      PRE

      -

      SCRIPT

      +

      SCRIPT

      This is for include or link a script, such as JavaScript.

      >>> print(SCRIPT('console.log("hello world");', _type='text/javascript'))
       <script type="text/javascript">console.log("hello world");</script>
      @@ -499,7 +499,7 @@ 

      SCRIPT

      -

      SELECT

      +

      SELECT

      Makes a <select>...</select> tag. This is used with the OPTION helper.

      >>> print(SELECT(OPTION('first', _value='1'), OPTION('second', _value='2'),
      @@ -509,7 +509,7 @@ 

      SELECT

      -

      SPAN

      +

      SPAN

      Similar to DIV but used to tag inline (rather than block) content.

      >>> print(SPAN('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <span id="0" class="test">&lt;hello&gt;<strong>world</strong></span>
      @@ -517,7 +517,7 @@ 

      SPAN

      -

      STYLE

      +

      STYLE

      Similar to script, but used to either include or link CSS code. Here the CSS is included:

      >>> print(STYLE(XML('body {color: white}')))
      @@ -531,7 +531,7 @@ 

      STYLE

      -

      TABLE, TR, TD

      +

      TABLE, TR, TD

      These tags (along with the optional THEAD and TBODY helpers) are used to build HTML tables.

      >>> print(TABLE(TR(TD('a'), TD('b')), TR(TD('c'), TD('d'))))
      @@ -556,7 +556,7 @@ 

      TABLE

      -

      TBODY

      +

      TBODY

      This is used to tag rows contained in the table body, as opposed to header or footer rows. It is optional.

      >>> print(TBODY(TR(TD('<hello>')), _class='test', _id=0))
      @@ -565,7 +565,7 @@ 

      TBODY

      -

      TEXTAREA

      +

      TEXTAREA

      This helper makes a <textarea>...</textarea> tag.

      >>> print(TEXTAREA('<hello>', XML('<strong>world</strong>'), _class='test',
       ... _cols="40", _rows="10"))
      @@ -574,7 +574,7 @@ 

      TEXTAREA

      -

      TH

      +

      TH

      This is used instead of TD in table headers.

      >>> print(TH('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <th id="0" class="test">&lt;hello&gt;<strong>world</strong></th>
      @@ -582,7 +582,7 @@ 

      TH

      -

      THEAD

      +

      THEAD

      This is used to tag table header rows.

      >>> print(THEAD(TR(TH('<hello>')), _class='test', _id=0))
       <thead id="0" class="test"><tr><th>&lt;hello&gt;</th></tr></thead>
      @@ -590,7 +590,7 @@ 

      THEAD

      -

      TITLE

      +

      TITLE

      This is used to tag the title of a page in an HTML header.

      >>> print(TITLE('<hello>', XML('<strong>world</strong>')))
       <title>&lt;hello&gt;<strong>world</strong></title>
      @@ -598,7 +598,7 @@ 

      TITLE

      -

      TT

      +

      TT

      Tags text as typewriter (monospaced) text.

      >>> print(TT('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
       <tt id="0" class="test">&lt;hello&gt;<strong>world</strong></tt>
      @@ -606,7 +606,7 @@ 

      TT

      -

      UL

      +

      UL

      It stands for unordered list. The list should contain LI tags.

      >>> print(UL(LI('<hello>'), LI(XML('<strong>world</strong>')), _class='test', _id=0))
       <ul class="test" id="0"><li>&lt;hello&gt;</li><li><strong>world</strong></li></ul>
      @@ -614,14 +614,14 @@ 

      UL

      -

      URL

      +

      URL

      The URL helper is not part of yatl package, instead it is provided by py4web.

      -

      Custom helpers

      +

      Custom helpers

      -

      TAG

      +

      TAG

      Sometimes you need to generate custom XML tags*. For this purpose py4web provides TAG, a universal tag generator.

      [[=TAG.name('a', 'b', _c='d')]]
      @@ -651,7 +651,7 @@ 

      Custom helpers -

      BEAUTIFY

      +

      BEAUTIFY

      BEAUTIFY is used to build HTML representations of compound objects, including lists, tuples and dictionaries:

      [[=BEAUTIFY({"a": ["hello", STRONG("world")], "b": (1, 2)})]]
      @@ -673,10 +673,10 @@ 

      BEAUTIFY

      -

      Server-side DOM

      +

      Server-side DOM

      As we’ve already seen the helpers mechanism in py4web also provides a server-side representation of the document object model (DOM).

      -

      children

      +

      children

      Each helper object keep the list of its components into the children attribute.

      >>> CAT('hello', STRONG('world')).children
      @@ -685,7 +685,7 @@ 

      children

      -

      find

      +

      find

      To help searching into the DOM, all helpers have a find method with the following signature:

      def find(self, query=None, **kargs)
      @@ -779,7 +779,7 @@ 

      find

      -

      Using Inject

      +

      Using Inject

      Normally all the code should be called from the controller program, and only the necessary data is passed to the template in order to be displayed. But sometimes it’s useful to pass variables or even use a python function as a helper called from a template.

      @@ -870,7 +870,7 @@

      Using Inject - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/chapter-11.html b/apps/_documentation/static/en/chapter-11.html index 0d9304971..64da672c8 100644 --- a/apps/_documentation/static/en/chapter-11.html +++ b/apps/_documentation/static/en/chapter-11.html @@ -1,10 +1,10 @@ - + - Internationalization — py4web 1.20230507.1 documentation + Internationalization — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -99,9 +99,9 @@
      -

      Internationalization

      +

      Internationalization

      -

      Pluralize

      +

      Pluralize

      Pluralize is a Python library for Internationalization (i18n) and Pluralization (p10n).

      The library assumes a folder (for example “translations”) that contains @@ -154,7 +154,7 @@

      Pluralize -

      Update the translation files

      +

      Update the translation files

      Find all strings wrapped in T(…) in .py, .html, and .js files:

      matches = T.find_matches('path/to/app/folder')
       
      @@ -218,7 +218,7 @@

      Update the translation files - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/chapter-12.html b/apps/_documentation/static/en/chapter-12.html index 729c0fac7..130386cdf 100644 --- a/apps/_documentation/static/en/chapter-12.html +++ b/apps/_documentation/static/en/chapter-12.html @@ -1,10 +1,10 @@ - + - Forms — py4web 1.20230507.1 documentation + Forms — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -181,13 +181,13 @@
      -

      Forms

      +

      Forms

      The Form class provides a high-level API for quickly building CRUD (create, update and delete) forms, especially for working on an existing database table. It can generate and process a form from a list of desired fields and/or from an existing database table. It is a pretty much equivalent to web2py’s SQLFORM.

      -

      The Form constructor

      +

      The Form constructor

      The Form constructor accepts the following arguments:

      Form(self,
            table,
      @@ -226,7 +226,7 @@ 

      The Form constructor

      -

      A minimal form example without a database

      +

      A minimal form example without a database

      Let’s start with a minimal working form example. Create a new minimal app called form_minimal :

      # in form_minimal/__init__.py
      @@ -279,7 +279,7 @@ 

      A minimal form example without a database -

      Basic form example

      +

      Basic form example

      In this next basic example we generate a form from a database. Create a new minimal app called form_basic :

      # in form_basic/__init__.py
      @@ -341,7 +341,7 @@ 

      Basic form example -

      File upload field

      +

      File upload field

      The file upload field is quite particular. The standard way to use it (as in the _scaffold app) is to have the UPLOAD_FOLDER defined in the common.py file. But if you don’t specify it, then the default value of your_app/upload folder will be used (and the folder will also be created if needed). @@ -394,9 +394,9 @@

      File upload field -

      Widgets

      +

      Widgets

      -

      Standard widgets

      +

      Standard widgets

      Py4web provides many widgets in the py4web.utility.form library. They are simple plugins that easily allow you to specify the type of the input elements in a form, along with some of their properties.

      @@ -473,7 +473,7 @@

      Standard widgets -

      Custom widgets

      +

      Custom widgets

      You can also customize the widgets properties by subclassing the FormStyleDefault class. Let’s have a quick look, improving again our Superhero example:

      #
      @@ -550,9 +550,9 @@ 

      Custom widgets -

      Advanced form design

      +

      Advanced form design

      -

      Form structure manipulation

      +

      Form structure manipulation

      In py4web a form is rendered by YATL helpers. This means the tree structure of a form can be manipulated before the form is serialized in HTML. Here is an example of how to manipulate the generate HTML structure:

      @@ -567,7 +567,7 @@

      Form structure manipulation -

      Custom forms

      +

      Custom forms

      Custom forms allow you to granulary control how the form is processed. In the template file, you can execute specific instructions before the form is displayed or after its data submission by inserting code among the following statements:

      [[=form.custom.begin ]]
      @@ -603,7 +603,7 @@ 

      Custom forms -

      The sidecar parameter

      +

      The sidecar parameter

      The sidecar is the stuff injected in the form along with the submit button.

      For example, you can inject a simple click me button in your form with the following code:

      @@ -621,7 +621,7 @@

      The sidecar parameter

      -

      Form validation

      +

      Form validation

      Validators are classes used to validate input fields (including forms generated from database tables). They are normally assigned using the requires attribute of a table Field object, as already shown on the Field constructor paragraph of the DAL chapter. Also, you can use advanced validators @@ -710,37 +710,37 @@

      Form validation -

      Text format validators

      +

      Text format validators

      -

      IS_ALPHANUMERIC

      +

      IS_ALPHANUMERIC

      This validator checks that a field value contains only characters in the ranges a-z, A-Z, 0-9, and underscores.

      requires = IS_ALPHANUMERIC(error_message='must be alphanumeric!')
       
      -

      IS_LOWER

      +

      IS_LOWER

      This validator never returns an error. It just converts the value to lower case.

      requires = IS_LOWER()
       
      -

      IS_UPPER

      +

      IS_UPPER

      This validator never returns an error. It converts the value to upper case.

      requires = IS_UPPER()
       
      -

      IS_EMAIL

      +

      IS_EMAIL

      It checks that the field value looks like an email address. It does not try to send email to confirm.

      requires = IS_EMAIL(error_message='invalid email!')
       
      -

      IS_MATCH

      +

      IS_MATCH

      This validator matches the value against a regular expression and returns an error if it does not match. Here is an example of usage to validate a US zip code:

      requires = IS_MATCH('^\d{5}(-\d{4})?$',
      @@ -770,7 +770,7 @@ 

      IS_MATCH substring rather than the original value.

      -

      IS_LENGTH

      +

      IS_LENGTH

      Checks if length of field’s value fits between given boundaries. Works for both text and file inputs.

      Its arguments are:

      @@ -799,7 +799,7 @@

      IS_LENGTH

      -

      IS_URL

      +

      IS_URL

      Rejects a URL string if any of the following is true:

      • The string is empty or None

      • @@ -845,7 +845,7 @@

        IS_URL

      -

      IS_SLUG

      +

      IS_SLUG

      requires = IS_SLUG(maxlen=80, check=False, error_message='must be slug')
       
      @@ -853,7 +853,7 @@

      IS_SLUG<

      If check is set to False (default) it converts the input value to a slug.

      -

      IS_JSON

      +

      IS_JSON

      requires = IS_JSON(error_message='Invalid json', native_json=False)
       
      @@ -862,16 +862,16 @@

      IS_JSON<

      -

      Date and time validators

      +

      Date and time validators

      -

      IS_TIME

      +

      IS_TIME

      This validator checks that a field value contains a valid time in the specified format.

      requires = IS_TIME(error_message='must be HH:MM:SS!')
       
      -

      IS_DATE

      +

      IS_DATE

      This validator checks that a field value contains a valid date in the specified format. It is good practice to specify the format using the translation operator, in order to support different formats in different locales.

      requires = IS_DATE(format=T('%Y-%m-%d'),
           error_message='must be YYYY-MM-DD!')
      @@ -880,7 +880,7 @@ 

      IS_DATE<

      For the full description on % directives look under the IS_DATETIME validator.

      -

      IS_DATETIME

      +

      IS_DATETIME

      This validator checks that a field value contains a valid datetime in the specified format. It is good practice to specify the format using the translation operator, in order to support different formats in different locales.

      requires = IS_DATETIME(format=T('%Y-%m-%d %H:%M:%S'),
                          error_message='must be YYYY-MM-DD HH:MM:SS!')
      @@ -902,7 +902,7 @@ 

      IS_DATETIME

      -

      IS_DATE_IN_RANGE

      +

      IS_DATE_IN_RANGE

      Works very much like the previous validator but allows to specify a range:

      requires = IS_DATE_IN_RANGE(format=T('%Y-%m-%d'),
                       minimum=datetime.date(2008, 1, 1),
      @@ -913,7 +913,7 @@ 

      IS_DATE_IN_RANG

      For the full description on % directives look under the IS_DATETIME validator.

      -

      IS_DATETIME_IN_RANGE

      +

      IS_DATETIME_IN_RANGE

      Works very much like the previous validator but allows to specify a range:

      requires = IS_DATETIME_IN_RANGE(format=T('%Y-%m-%d %H:%M:%S'),
                           minimum=datetime.datetime(2008, 1, 1, 10, 30),
      @@ -925,9 +925,9 @@ 

      IS_DATETIME_IN_

      -

      Range, set and equality validators

      +

      Range, set and equality validators

      -

      IS_EQUAL_TO

      +

      IS_EQUAL_TO

      Checks whether the validated value is equal to a given value (which can be a variable):

      requires = IS_EQUAL_TO(request.vars.password,
                           error_message='passwords do not match')
      @@ -935,7 +935,7 @@ 

      IS_EQUAL_TO

      -

      IS_NOT_EMPTY

      +

      IS_NOT_EMPTY

      This validator checks that the content of the field value is neither None nor an empty string nor an empty list. A string value is checked for after a .strip().

      requires = IS_NOT_EMPTY(error_message='cannot be empty!')
       
      @@ -946,11 +946,11 @@

      IS_NOT_EMPTY

      -

      IS_NULL_OR

      +

      IS_NULL_OR

      Deprecated, an alias for IS_EMPTY_OR described below.

      -

      IS_EMPTY_OR

      +

      IS_EMPTY_OR

      Sometimes you need to allow empty values on a field along with other requirements. For example a field may be a date but it can also be empty. The IS_EMPTY_OR validator allows this:

      requires = IS_EMPTY_OR(IS_DATE())
      @@ -964,7 +964,7 @@ 

      IS_EMPTY_OR

      -

      IS_EXPR

      +

      IS_EXPR

      This validator let you express a general condition by means of a callable which takes a value to validate and returns the error message or None to accept the input value.

      requires = IS_EXPR(lambda v: T('not divisible by 3') if int(v) % 3 else None)
       
      @@ -982,7 +982,7 @@

      IS_EXPR<

      -

      IS_DECIMAL_IN_RANGE

      +

      IS_DECIMAL_IN_RANGE

      INPUT(_type='text', _name='name', requires=IS_DECIMAL_IN_RANGE(0, 10, dot="."))
       
      @@ -994,7 +994,7 @@

      IS_DECIMAL_IN_R

      The dot argument is optional and allows you to internationalize the symbol used to separate the decimals.

      -

      IS_FLOAT_IN_RANGE

      +

      IS_FLOAT_IN_RANGE

      Checks that the field value is a floating point number within a definite range, 0 <= value <= 100 in the following example:

      requires = IS_FLOAT_IN_RANGE(0, 100, dot=".",
                                   error_message='negative or too large!')
      @@ -1003,7 +1003,7 @@ 

      IS_FLOAT_IN_RAN

      The dot argument is optional and allows you to internationalize the symbol used to separate the decimals.

      -

      IS_INT_IN_RANGE

      +

      IS_INT_IN_RANGE

      Checks that the field value is an integer number within a definite range,

      0 <= value < 100 in the following example:

      requires = IS_INT_IN_RANGE(0, 100,
      @@ -1014,7 +1014,7 @@ 

      IS_INT_IN_RANGE

      -

      IS_IN_SET

      +

      IS_IN_SET

      This validator will automatically set the form field to an option field (ie, with a drop-down menu).

      IS_IN_SET checks that the field values are in a set:

      requires = IS_IN_SET(['a', 'b', 'c'], zero=T('choose one'),
      @@ -1032,14 +1032,14 @@ 

      IS_IN_SET

      -

      Checkbox validation

      +

      Checkbox validation

      To force a filled-in form checkbox (such as an acceptance of terms and conditions), use this:

      -
      requires=IS_IN_SET(['on'])
      +
      requires=IS_IN_SET(['ON'])
       
      -

      Dictionaries and tuples with IS_IN_SET

      +

      Dictionaries and tuples with IS_IN_SET

      You may also use a dictionary or a list of tuples to make the drop down list more descriptive:

      # Dictionary example:
       requires = IS_IN_SET({'A':'Apple', 'B':'Banana', 'C':'Cherry'}, zero=None)
      @@ -1050,14 +1050,14 @@ 

      Dictionaries and tuples with IS_IN_SET -

      Sorted options

      +

      Sorted options

      To keep the options alphabetically sorted by their labels into the drop down list, use the sort argument with IS_IN_SET.

      IS_IN_SET([('H', 'Hulk'), ('S', 'Superman'), ('B', 'Batman')], sort=True)
       
      -

      IS_IN_SET and Tagging

      +

      IS_IN_SET and Tagging

      The IS_IN_SET validator has an optional attribute multiple=False. If set to True, multiple values can be stored in one field. The field should be of type list:integer or list:string as discussed in [[Chapter 6 ../06#list-type-and-contains]]. An explicit example of tagging is discussed there. We strongly suggest using the jQuery multiselect plugin to render multiple fields.

      @@ -1067,9 +1067,9 @@

      IS_IN_SET

      -

      Complexity and security validators

      +

      Complexity and security validators

      -

      IS_STRONG

      +

      IS_STRONG

      Enforces complexity requirements on a field (usually a password field).

      Example:

      requires = IS_STRONG(min=10, special=2, upper=2)
      @@ -1099,7 +1099,7 @@ 

      IS_STRONGnumber = 1, special = 1 which otherwise are all sets to None.

      -

      CRYPT

      +

      CRYPT

      This is also a filter. It performs a secure hash on the input and it is used to prevent passwords from being passed in the clear to the database.

      requires = CRYPT()
       
      @@ -1131,9 +1131,9 @@

      CRYPT

      -

      Special type validators

      +

      Special type validators

      -

      IS_LIST_OF

      +

      IS_LIST_OF

      This validator helps you to ensure length limits on values of type list, for this purpose use its minimum, maximum, and error_message arguments, for example:

      requires = IS_LIST_OF(minimum=2)
      @@ -1152,7 +1152,7 @@ 

      IS_LIST_OF

      -

      IS_LIST_OF_EMAILS

      +

      IS_LIST_OF_EMAILS

      This validator is specifically designed to work with the following field:

      Field('emails', 'list:string',
             widget=SQLFORM.widgets.text.widget,
      @@ -1178,7 +1178,7 @@ 

      IS_LIST_OF_EMAI

      The effect of the represent argument (at lines 6 and 7) is to add a “mailto:…” link to each email address when the record is rendered in HTML pages.

      -

      ANY_OF

      +

      ANY_OF

      This validator takes a list of validators and accepts a value if any of the validators in the list does (i.e. it acts like a logical OR with respect to given validators).

      requires = ANY_OF([IS_ALPHANUMERIC(), IS_EMAIL()])
      @@ -1195,7 +1195,7 @@ 

      ANY_OF

      -

      IS_IMAGE

      +

      IS_IMAGE

      This validator checks if a file uploaded through the file input was saved in one of the selected image formats and has dimensions (width and height) within given limits.

      It does not check for maximum file size (use IS_LENGTH for that). It returns @@ -1230,7 +1230,7 @@

      IS_IMAGE

      -

      IS_FILE

      +

      IS_FILE

      Checks if name and extension of file uploaded through file input matches given criteria.

      Does not ensure the file type in any way. Returns validation failure if no data was uploaded.

      Its arguments are:

      @@ -1270,7 +1270,7 @@

      IS_FILE<

      -

      IS_UPLOAD_FILENAME

      +

      IS_UPLOAD_FILENAME

      This is the older implementation for checking files, included for backwards compatibility. For new applications, use IS_FILE().

      This validator checks if the name and extension of a file uploaded through the file input matches the given criteria.

      It does not ensure the file type in any way. Returns validation failure @@ -1299,7 +1299,7 @@

      IS_UPLOAD_FILEN

      -

      IS_IPV4

      +

      IS_IPV4

      This validator checks if a field’s value is an IP version 4 address in decimal form. Can be set to force addresses from a certain range.

      IPv4 regex taken from regexlib. The signature for the IS_IPV4 constructor is the following:

      @@ -1347,7 +1347,7 @@

      IS_IPV4<

      -

      IS_IPV6

      +

      IS_IPV6

      This validator checks if a field’s value is an IP version 6 address.

      The signature for the IS_IPV6 constructor is the following:

      IS_IPV6(is_private=None,
      @@ -1394,7 +1394,7 @@ 

      IS_IPV6<

      -

      IS_IPADDRESS

      +

      IS_IPADDRESS

      This validator checks if a field’s value is an IP address (either version 4 or version 6). Can be set to force addresses from within a specific range. Checks are done using the appropriate IS_IPV4 or IS_IPV6 validator.

      @@ -1426,9 +1426,9 @@

      IS_IPADDRESS

      -

      Other validators

      +

      Other validators

      -

      CLEANUP

      +

      CLEANUP

      This is a filter. It never fails. By default it just removes all characters whose decimal ASCII codes are not in the list [10, 13, 32-127]. It always perform an initial strip (i.e. heading and trailing blank characters removal) on the value.

      requires = CLEANUP()
      @@ -1442,9 +1442,9 @@ 

      CLEANUP<

      -

      Database validators

      +

      Database validators

      -

      IS_NOT_IN_DB

      +

      IS_NOT_IN_DB

      Synopsis: IS_NOT_IN_DB(db|set, 'table.field')

      Consider the following example:

      @@ -1480,7 +1480,7 @@

      IS_NOT_IN_DB

      -

      IS_IN_DB

      +

      IS_IN_DB

      Synopsis: IS_IN_DB(db|set, 'table.value_field', '%(representing_field)s', zero='choose one') where the third and fourth arguments are optional.

      @@ -1539,7 +1539,7 @@

      IS_IN_DB

      -

      IS_IN_DB and Tagging

      +

      IS_IN_DB and Tagging

      The IS_IN_DB validator has an optional attribute multiple=False. If set to True multiple values can be stored in one field. This field should be of type list:reference as discussed in list:<type> and contains. An explicit example of tagging is discussed there. Multiple references are handled automatically in create and update forms, but they are transparent to @@ -1547,7 +1547,7 @@

      IS_IN_DB

      -

      Validation functions

      +

      Validation functions

      In order to explicitly define a validation function, we pass to the validation parameter a function that takes the form and returns a dictionary, mapping field names to errors. If the dictionary is non-empty, the errors will be @@ -1615,7 +1615,7 @@

      Validation functions - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/chapter-13.html b/apps/_documentation/static/en/chapter-13.html index 996dd4653..9ef151f79 100644 --- a/apps/_documentation/static/en/chapter-13.html +++ b/apps/_documentation/static/en/chapter-13.html @@ -1,10 +1,10 @@ - + - Authentication and authorization — py4web 1.20230507.1 documentation + Authentication and authorization — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -89,6 +89,7 @@
    • Multiple Tags objects
    • +
    • User Impersonation
    • Grid
    • @@ -121,7 +122,7 @@
      -

      Authentication and authorization

      +

      Authentication and authorization

      Strong authentication and authorization methods are vital for a modern, multiuser web application. While they are often used interchangeably, authentication and authorization @@ -131,7 +132,7 @@

      Authentication and authorization -

      Authentication using Auth

      +

      Authentication using Auth

      py4web comes with a an object Auth and a system of plugins for user authentication. It has the same name as the corresponding web2py one and serves the same purpose but the API and @@ -181,7 +182,7 @@

      Authentication using Auth -

      Auth UI

      +

      Auth UI

      You can create your own web UI to login users using the above APIs but py4web provides one as an example, implemented in the following files:

        @@ -225,7 +226,7 @@

        Auth UI -

        Using Auth inside actions

        +

        Using Auth inside actions

        There two ways to use the Auth object in an action.

        The first one does not force a login. With @action.uses(auth) we tell py4web that this action should have information about the user, @@ -249,7 +250,7 @@

        Using Auth inside actions -

        Two Factor Authentication

        +

        Two Factor Authentication

        Two factor authentication (or Two-step verification) is a way of improving authentication security. When activated an extra step is added in the login process. In the first step, users are shown the standard username/password form. If they successfully pass this challenge by submitting the correct username and password, and two factor authentication is enabled for the user, the server will present a second form before logging them in.

        There are a few Auth settings available to control how two factor authentication works.

        The follow can be specified on Auth instantiation:

        @@ -258,7 +259,7 @@

        Two Factor Authentication -

        two_factor_required

        +

        two_factor_required

        When you pass a method name to the two_factor_filter parameter you are telling py4web to call that method to determine whether or not this login should be use or bypass two factor authentication. If your method returns True, then this login requires two factor. If it returns False, two factor authentication is bypassed for this login.

        Sample two_factor_filter method

        This example shows how to allow users that are on a specific network.

        @@ -280,7 +281,7 @@

        two_factor_required -

        two_factor_send

        +

        two_factor_send

        When two factor authentication is active, py4web generates a 6 digit code (using random.randint) and sends it to you. How this code is sent, is up to you. The two_factor_send argument to the Auth class allows you to specify the method that sends the two factor code to the user.

        This example shows how to send an email with the two factor code:

        def send_two_factor_email(user, code):
        @@ -304,7 +305,7 @@ 

        two_factor_send -

        two_factor_tries

        +

        two_factor_tries

        By default, the user has 3 attempts to pass two factor authentication. You can override this after using:

        auth.param.two_factor_tries = 5
         
        @@ -327,7 +328,7 @@

        two_factor_tries -

        Auth Plugins

        +

        Auth Plugins

        Plugins are defined in “py4web/utils/auth_plugins” and they have a hierarchical structure. Some are exclusive and some are not. For example, default, LDAP, PAM, and SAML are exclusive (the developer has to pick @@ -339,7 +340,7 @@

        Auth Plugins -

        PAM

        +

        PAM

        Configuring PAM is the easiest:

        from py4web.utils.auth_plugins.pam_plugin import PamPlugin
         auth.register_plugin(PamPlugin())
        @@ -358,7 +359,7 @@ 

        PAM

      -

      LDAP

      +

      LDAP

      This is a common authentication method, especially using Microsoft Active Directory in enterprises.

      from py4web.utils.auth_plugins.ldap_plugin import LDAPPlugin
       LDAP_SETTING = {
      @@ -376,7 +377,7 @@ 

      LDAP

      -

      OAuth2 with Google

      +

      OAuth2 with Google

      from py4web.utils.auth_plugins.oauth2google import OAuth2Google # TESTED
       auth.register_plugin(OAuth2Google(
           client_id=CLIENT_ID,
      @@ -387,7 +388,7 @@ 

      OAuth2 with Google -

      OAuth2 with Facebook

      +

      OAuth2 with Facebook

      from py4web.utils.auth_plugins.oauth2facebook import OAuth2Facebook # UNTESTED
       auth.register_plugin(OAuth2Facebook(
           client_id=CLIENT_ID,
      @@ -398,7 +399,7 @@ 

      OAuth2 with FacebookThe client id and client secret must be provided by Facebook.

      -

      OAuth2 with Discord

      +

      OAuth2 with Discord

      from py4web.utils.auth_plugins.oauth2discord import OAuth2Discord
       auth.register_plugin(OAuth2Discord(
           client_id=DISCORD_CLIENT_ID,
      @@ -418,12 +419,12 @@ 

      OAuth2 with Discord -

      Authorization using Tags

      +

      Authorization using Tags

      As already mentioned, authorization is the process of verifying what specific applications, files, and data a user has access to. This is accomplished in py4web using Tags.

      -

      Tags and Permissions

      +

      Tags and Permissions

      Py4web provides a general purpose tagging mechanism that allows the developer to tag any record of any table, check for the existence of tags, as well as checking for records @@ -501,7 +502,7 @@

      Tags and PermissionsThis means that slashes have a special meaning for tags.

      -

      Multiple Tags objects

      +

      Multiple Tags objects

      Note

      One table can have multiple associated Tags objects. The @@ -546,6 +547,25 @@

      Multiple Tags objects

      +
      +

      User Impersonation

      +

      It is possible to impersonate a user. As an example here is an action that, when called with ?user_id={number} +start impersonation and when called without ?user_id will stop impersonation:

      +
      @action("impersonate")
      +@action.uses(auth.user)
      +def switch_impersonation():
      +    id = request.query.get("user_id")
      +    if auth.is_impersonating():
      +        if not user_id or auth.user_id != user_id:
      +         auth.stop_impersonation(next_url=URL("index"))
      +    # if we are not impersonating and a user email is specificed
      +    if not auth.is_impersonating() and user_id:
      +        if db(db.auth_user.id == user_id),count() == 0:
      +             raise HTTP(404)
      +        auth.impersonate(user_id, next_url=URL("index"))
      +
      +
      +

      @@ -584,7 +604,7 @@

      Multiple Tags objects - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/chapter-14.html b/apps/_documentation/static/en/chapter-14.html index 76b77ab05..2088c50bf 100644 --- a/apps/_documentation/static/en/chapter-14.html +++ b/apps/_documentation/static/en/chapter-14.html @@ -1,10 +1,10 @@ - + - Grid — py4web 1.20230507.1 documentation + Grid — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -113,12 +113,12 @@
      -

      Grid

      +

      Grid

      py4web comes with a Grid object providing grid and CRUD (create, update and delete) capabilities. This allows you to quickly and safely provide an interface to your data. Since it’s also highly customizable, it’s the corner stone of most py4web’s applications.

      -

      Key features

      +

      Key features

      • Full CRUD with Delete Confirmation

      • Click column heads for sorting - click again for DESC

      • @@ -137,7 +137,7 @@

        Key features -

        Basic grid example

        +

        Basic grid example

        In this simple example we will make a grid over the superhero table.

        Create a new minimal app called grid. Change it with the following content.

        # in grid/__init__.py
        @@ -249,7 +249,7 @@ 

        Basic grid examplehttps://github.com/jpsteil/grid_tutorial.

      -

      The Grid object

      +

      The Grid object

      class Grid:
          def __init__(
             self,
      @@ -338,7 +338,7 @@ 

      The Grid objectUsing callable parameters later on.

      -

      Searching and filtering

      +

      Searching and filtering

      There are two ways to build a search form:

      • Provide a search_queries list

      • @@ -356,7 +356,7 @@

        Searching and filtering

      -

      CRUD settings

      +

      CRUD settings

      The grid provides CRUD (create, read, update and delete) capabilities utilizing py4web Form. You can turn off CRUD features by setting @@ -367,7 +367,7 @@

      CRUD settings -

      Custom columns

      +

      Custom columns

      If the grid does not involve a join but displays results from a single table you can specify a list of columns. Columns are highly customizable.

      from py4web.utils.grid import Column
      @@ -402,7 +402,7 @@ 

      Custom columns -

      Using templates

      +

      Using templates

      Use the following to render your grid or CRUD forms in your templates.

      Display the grid or a CRUD Form

      [[=grid.render()]]
      @@ -433,7 +433,7 @@ 

      Using templates -

      Customizing style

      +

      Customizing style

      You can provide your own formstyle or grid classes and style to grid.

      -

      Simple conversion examples

      +

      Simple conversion examples

      -

      “Hello world” example

      +

      “Hello world” example

      web2py

      # in controllers/default.py
       def index():
      @@ -216,7 +216,7 @@ 

      “Hello world” example

      -

      “Redirect with variables” example

      +

      “Redirect with variables” example

      web2py

      request.get_vars.name
       request.post_vars.name
      @@ -237,7 +237,7 @@ 

      “Redirect with variables” example -

      “Returning variables” example

      +

      “Returning variables” example

      web2py

      def index():
          a = request.get_vars.a
      @@ -253,7 +253,7 @@ 

      “Returning variables” example -

      “Returning args” example

      +

      “Returning args” example

      web2py

      def index():
          a, b, c = request.args
      @@ -269,7 +269,7 @@ 

      “Returning args” example -

      “Return calling methods” example

      +

      “Return calling methods” example

      web2py

      def index():
          if request.method == "GET":
      @@ -291,7 +291,7 @@ 

      “Return calling methods” example -

      “Setting up a counter” example

      +

      “Setting up a counter” example

      web2py

      def counter():
          session.counter = (session.counter or 0) + 1
      @@ -306,7 +306,7 @@ 

      “Setting up a counter” example -

      “View” example

      +

      “View” example

      web2py

      {{ extend 'layout.html' }}
       <div>
      @@ -327,7 +327,7 @@ 

      “View” example -

      “Form and flash” example

      +

      “Form and flash” example

      web2py

      db.define_table('thing', Field('name'))
       
      @@ -367,7 +367,7 @@ 

      “Form and flash” example -

      “grid” example

      +

      “grid” example

      web2py

      def index():
          grid = SQLFORM.grid(db.thing, editable=True)
      @@ -385,7 +385,7 @@ 

      “grid” example -

      “Accessing OS files” example

      +

      “Accessing OS files” example

      web2py

      file_path = os.path.join(request.folder, 'file.csv')
       
      @@ -397,7 +397,7 @@

      “Accessing OS files” example -

      “auth” example

      +

      “auth” example

      web2py

      auth = Auth()
       auth.define_tables()
      @@ -488,7 +488,7 @@ 

      “auth” example - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/chapter-16.html b/apps/_documentation/static/en/chapter-16.html index 1d466aa17..7d1e768f0 100644 --- a/apps/_documentation/static/en/chapter-16.html +++ b/apps/_documentation/static/en/chapter-16.html @@ -1,10 +1,10 @@ - + - Advanced topics and examples — py4web 1.20230507.1 documentation + Advanced topics and examples — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -39,7 +39,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -109,9 +109,9 @@
      -

      Advanced topics and examples

      +

      Advanced topics and examples

      -

      py4web and asyncio

      +

      py4web and asyncio

      Asyncio is not strictly needed, at least for most of the normal use cases where it will add problems more than value because of its concurrency model. On the other hand, we think py4web needs a built-in websocket async based solution.

      @@ -120,7 +120,7 @@

      py4web and asyncio -

      htmx

      +

      htmx

      There are many javascript front-end frameworks available today that allow you great flexibility over how you design your web client. Vue, React and Angular are just a few. However, the complexity in building one of these systems prevents many developers from reaping those benefits. @@ -139,7 +139,7 @@

      htmx
    • Includes an htmx attributes plugin for the py4web grid

    • -

      htmx usage in Form

      +

      htmx usage in Form

      The py4web Form class allows you to pass **kwargs to it that will be passed along as attributes to the html form. For example, to add the hx-post and hx-target to the <form> element you would use:

      attrs = {
      @@ -231,7 +231,7 @@ 

      htmx usage in Form -

      htmx usage in Grid

      +

      htmx usage in Grid

      The py4web grid provides an attributes plugin system that allows you to build plugins to provide custom attributes for form elements, anchor elements or confirmation messages. py4web also provide an attributes plugin specifically for htmx.

      @@ -302,7 +302,7 @@

      htmx usage in Grid -

      Autocomplete Widget using htmx

      +

      Autocomplete Widget using htmx

      htmx can be used for much more than just form/grid processing. In this example we’ll take advantage of htmx and the py4web form widgets to build an autocomplete widget that can be used in your forms. NOTE: this is just an example, none of this code comes with py4web

      @@ -506,18 +506,18 @@

      Autocomplete Widget using htmx -

      utils.js

      +

      utils.js

      Multiple times in this documentation we have mentioned utils.js which comes with the scaffolding application, yet we never clearly listed what is in there. So here it is.

      -

      string.format

      +

      string.format

      It extends the String object prototype to allow expressions like this:

      var a = "hello {name}".format(name="Max");
       
      -

      The Q object

      +

      The Q object

      The Q object can be used like a selector supporting jQuery like syntax:

      var element = Q("#element-id")[0];
       var selected_elements = Q(".element-class");
      @@ -601,7 +601,7 @@ 

      The Q object -

      The T object

      +

      The T object

      This is a Javascript reimplementation of the Python pluralize library in Python which is used by the Python T object in py4web. So basically a client-side T.

      T.translations = {'dog': {0: 'no cane', 1: 'un case', 2: '{n} cani', 10: 'tanti cani'}};
      @@ -756,7 +756,7 @@ 

      The T object - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/genindex.html b/apps/_documentation/static/en/genindex.html index 4e0a3b464..0b361f15d 100644 --- a/apps/_documentation/static/en/genindex.html +++ b/apps/_documentation/static/en/genindex.html @@ -3,7 +3,7 @@ - Index — py4web 1.20230507.1 documentation + Index — py4web 1.20230718.1 documentation @@ -13,13 +13,13 @@ - - - - - - - + + + + + + + @@ -38,7 +38,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -132,7 +132,7 @@

      Index

      - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/en/index.html b/apps/_documentation/static/en/index.html index fdf8655db..a25b16f7a 100644 --- a/apps/_documentation/static/en/index.html +++ b/apps/_documentation/static/en/index.html @@ -1,10 +1,10 @@ - + - py4web: the reference Manual — py4web 1.20230507.1 documentation + py4web: the reference Manual — py4web 1.20230718.1 documentation @@ -14,12 +14,12 @@ - - - - - - + + + + + + @@ -39,7 +39,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -94,7 +94,7 @@
      -

      py4web: the reference Manual

      +

      py4web: the reference Manual

      Contents:

        @@ -205,6 +205,7 @@

        py4web: the reference ManualAuthentication and authorization
      • Grid
          @@ -232,7 +233,7 @@

          py4web: the reference Manual -

          Indices and tables

          +

          Indices and tables

          • Index

          • Module Index

          • @@ -275,7 +276,7 @@

            Indices and tables - v: 1.20230507.1 + v: 1.20230718.1
            diff --git a/apps/_documentation/static/en/objects.inv b/apps/_documentation/static/en/objects.inv index 808b02451..b8d748d3d 100644 Binary files a/apps/_documentation/static/en/objects.inv and b/apps/_documentation/static/en/objects.inv differ diff --git a/apps/_documentation/static/en/search.html b/apps/_documentation/static/en/search.html index 1721874fd..04620334b 100644 --- a/apps/_documentation/static/en/search.html +++ b/apps/_documentation/static/en/search.html @@ -3,7 +3,7 @@ - Search — py4web 1.20230507.1 documentation + Search — py4web 1.20230718.1 documentation @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
            - 1.20230507.1 + 1.20230718.1
            @@ -139,7 +139,7 @@ - v: 1.20230507.1 + v: 1.20230718.1
            diff --git a/apps/_documentation/static/en/searchindex.js b/apps/_documentation/static/en/searchindex.js index f9e569e77..76264c487 100644 --- a/apps/_documentation/static/en/searchindex.js +++ b/apps/_documentation/static/en/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["chapter-01", "chapter-02", "chapter-03", "chapter-04", "chapter-05", "chapter-06", "chapter-07", "chapter-08", "chapter-09", "chapter-10", "chapter-11", "chapter-12", "chapter-13", "chapter-14", "chapter-15", "chapter-16", "index"], "filenames": ["chapter-01.rst", "chapter-02.rst", "chapter-03.rst", "chapter-04.rst", "chapter-05.rst", "chapter-06.rst", "chapter-07.rst", "chapter-08.rst", "chapter-09.rst", "chapter-10.rst", "chapter-11.rst", "chapter-12.rst", "chapter-13.rst", "chapter-14.rst", "chapter-15.rst", "chapter-16.rst", "index.rst"], "titles": ["What is py4web?", "Help, resources and hints", "Installation and Startup", "The Dashboard", "Creating your first app", "Fixtures", "The Database Abstraction Layer (DAL)", "The RestAPI", "YATL Template Language", "YATL helpers", "Internationalization", "Forms", "Authentication and authorization", "Grid", "From web2py to py4web", "Advanced topics and examples", "py4web: the reference Manual"], "terms": {"web": [0, 1, 2, 5, 6, 8, 12, 13, 14, 15, 16], "framework": [0, 1, 2, 4, 5, 11, 12, 13, 14, 15], "rapid": [0, 11, 15], "develop": [0, 1, 4, 5, 6, 12, 13, 14, 15], "effici": [0, 1, 5, 6, 14], "databas": [0, 1, 3, 4, 7, 12, 13, 14, 15, 16], "driven": 0, "applic": [0, 2, 3, 4, 5, 8, 11, 12, 13, 14, 15], "It": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15], "an": [0, 1, 2, 3, 4, 5, 8, 9, 11, 12, 13, 14, 15], "evolut": 0, "popular": [0, 6], "web2pi": [0, 1, 2, 3, 4, 6, 11, 12, 13, 16], "much": [0, 1, 4, 5, 6, 8, 11, 13, 14, 15], "faster": [0, 6, 8, 14], "slicker": 0, "Its": [0, 2, 6, 11, 13], "intern": [0, 1, 4, 5, 6, 8, 12, 13], "design": [0, 4, 6, 8, 12, 15, 16], "ha": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "been": [0, 2, 5, 6, 8, 11], "simplifi": [0, 4, 6, 8], "compar": [0, 6, 14], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "seen": [0, 5, 6, 7, 9, 11, 13, 15], "competitor": 0, "other": [0, 1, 2, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16], "like": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "django": [0, 1, 14], "flask": [0, 14], "inde": [0, 5], "serv": [0, 2, 4, 6, 12, 14, 15], "same": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "purpos": [0, 4, 5, 6, 9, 11, 12, 14], "yet": [0, 2, 4, 5, 6, 8, 11, 15], "aim": 0, "provid": [0, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "larger": 0, "featur": [0, 2, 4, 7, 8, 14, 16], "set": [0, 1, 2, 4, 5, 7, 8, 9, 10, 12, 15], "out": [0, 1, 6, 8, 15], "box": [0, 6, 11], "reduc": [0, 5, 15], "time": [0, 2, 4, 5, 8, 13, 14, 15], "new": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "app": [0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "from": [0, 1, 3, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16], "histor": [0, 6], "perspect": 0, "our": [0, 1, 2, 4, 5, 6, 9, 11, 15], "stori": [0, 5], "start": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15], "2007": 0, "when": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "wa": [0, 5, 6, 11, 12], "first": [0, 3, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16], "releas": [0, 2], "all": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "inclus": [0, 11], "solut": [0, 1, 2, 6, 15], "one": [0, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 15], "zip": [0, 2, 6, 11], "file": [0, 1, 2, 3, 5, 6, 8, 9, 12, 13, 15, 16], "contain": [0, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "python": [0, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "interpret": [0, 6, 7, 9], "base": [0, 2, 3, 4, 5, 7, 8, 11, 12, 13, 14, 15], "id": [0, 1, 2, 3, 5, 7, 8, 9, 11, 12, 13, 14, 15], "collect": [0, 2, 14], "battl": 0, "test": [0, 2, 4, 6, 8, 9, 11, 12, 13], "packag": [0, 6, 9], "work": [0, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "well": [0, 5, 6, 8, 11, 12, 15], "togeth": [0, 6, 8, 10, 13], "In": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "mani": [0, 1, 2, 4, 5, 7, 8, 11, 13, 14, 15], "wai": [0, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "immens": 0, "success": [0, 4, 5, 6, 7, 12, 15], "succeed": 0, "low": 0, "barrier": 0, "entri": [0, 6, 7, 10, 11, 13, 14], "veri": [0, 4, 5, 6, 8, 9, 11, 12, 14], "secur": [0, 2, 7, 12], "platform": [0, 1, 16], "remain": [0, 6, 11], "backward": [0, 6, 11], "compat": [0, 1, 6, 9, 11], "until": [0, 5, 6, 8, 11], "todai": [0, 11, 15], "alwai": [0, 2, 4, 5, 6, 8, 11, 15], "suffer": [0, 12], "problem": [0, 1, 6, 8, 12, 13, 15], "its": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "monolith": 0, "The": [0, 2, 8, 9, 10, 12, 14, 16], "most": [0, 3, 4, 5, 6, 11, 12, 13, 14, 15], "experienc": 0, "did": [0, 4, 6, 15], "understand": [0, 1, 4, 6, 7, 8, 13, 16], "how": [0, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16], "us": [0, 1, 3, 4, 7, 10, 11, 14, 16], "compon": [0, 3, 4, 5, 8, 9, 11, 12, 15], "outsid": [0, 5, 6, 11, 13, 14, 15], "third": [0, 5, 6, 11], "parti": [0, 5], "within": [0, 1, 4, 5, 6, 8, 9, 11, 13, 15], "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "thought": [0, 6, 12], "perfect": 0, "tool": [0, 6, 12, 15], "have": [0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "broken": [0, 11], "piec": [0, 5, 6, 8, 11], "becaus": [0, 2, 4, 5, 6, 8, 9, 10, 11, 13, 15], "would": [0, 5, 6, 8, 9, 11, 13, 15], "compromis": 0, "turn": [0, 4, 6, 12, 13, 15], "were": [0, 4, 6], "wrong": [0, 5, 6], "plai": [0, 15], "import": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "henc": [0, 2, 4, 5, 6, 11], "sinc": [0, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14], "2015": 0, "three": [0, 5, 6], "front": [0, 8, 11, 15], "port": [0, 2, 3, 5, 6, 14], "3": [0, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "broke": 0, "modul": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 16], "independ": [0, 5, 6, 12], "reassembl": 0, "some": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 14], "those": [0, 2, 5, 6, 8, 9, 12, 14, 15], "more": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "modular": [0, 6, 8, 14], "than": [0, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15], "repackag": 0, "complet": [0, 6, 8, 9, 11, 12], "redesign": 0, "them": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14], "case": [0, 1, 2, 3, 4, 5, 8, 9, 11, 12, 13, 14, 15], "better": [0, 1, 2, 4, 6, 13, 14], "function": [0, 2, 4, 5, 6, 7, 9, 13, 14, 15], "remov": [0, 2, 4, 6, 9, 11, 12], "ad": [0, 2, 5, 10, 11, 12, 13, 15], "tri": [0, 6, 14], "preserv": [0, 5], "syntax": [0, 1, 4, 5, 6, 7, 9, 11, 12, 14, 15, 16], "user": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "love": 0, "here": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], "explicit": [0, 2, 4, 5, 6, 11, 12], "list": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 15], "see": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15], "detail": [0, 1, 2, 5, 6, 7, 8, 9, 11, 13, 15], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "come": [0, 4, 5, 6, 8, 11, 12, 13, 14, 15], "unlik": [0, 2, 4, 6, 7, 8, 14, 15], "requir": [0, 1, 2, 4, 5, 6, 7, 11, 12, 13, 14, 15], "instal": [0, 1, 3, 4, 5, 6, 12, 16], "pip": [0, 1, 6], "depend": [0, 2, 3, 4, 5, 6, 8, 11, 13, 14], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "manag": [0, 1, 2, 3, 4, 5, 6, 11, 12], "txt": [0, 2, 4, 6], "regular": [0, 2, 4, 6, 7, 8, 10, 11, 13, 14, 15], "thi": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "differ": [0, 2, 5, 6, 8, 10, 11, 12, 13, 14, 15], "particular": [0, 1, 6, 11, 13, 14, 15], "ditch": 0, "custom": [0, 2, 4, 8, 14, 15, 16], "reli": [0, 4, 6], "now": [0, 2, 4, 5, 6, 8, 11, 13, 15], "exclus": [0, 5, 6, 11, 12], "mechan": [0, 5, 6, 8, 9, 12, 14], "multipl": [0, 1, 2, 4, 6, 8, 9, 10, 11, 14, 15, 16], "concurr": [0, 2, 6, 11, 15], "long": [0, 11], "submodul": 0, "ombott": [0, 4, 14], "spin": [0, 4], "off": [0, 2, 4, 6, 13, 15], "bottl": [0, 4, 5, 8, 14], "request": [0, 1, 2, 5, 6, 7, 11, 12, 13, 14, 15], "object": [0, 5, 6, 7, 8, 9, 10, 11, 14, 16], "rout": [0, 3, 5, 13, 14, 15], "doe": [0, 2, 5, 6, 8, 11, 12, 13, 14, 15], "creat": [0, 1, 2, 3, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16], "environ": [0, 1, 4, 5, 6, 14], "everi": [0, 2, 4, 5, 6, 12, 13, 14, 15], "introduc": [0, 8], "concept": [0, 12], "fixtur": [0, 2, 4, 6, 9, 12, 14, 16], "explicitli": [0, 2, 5, 6, 8, 9, 11], "declar": [0, 4, 5, 6], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "need": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "re": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "initi": [0, 2, 4, 5, 8, 11], "http": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "arriv": [0, 6], "cleanup": 0, "make": [0, 1, 2, 5, 8, 9, 10, 11, 12, 13, 14, 15], "session": [0, 2, 4, 6, 9, 11, 12, 13, 14, 15, 16], "": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], "strong": [0, 9, 12], "encrypt": [0, 2, 5], "data": [0, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16], "longer": [0, 6], "store": [0, 2, 5, 6, 9, 11, 12, 14, 15], "system": [0, 2, 5, 6, 9, 12, 15], "perform": [0, 3, 5, 6, 11, 12, 14], "issu": [0, 3, 6], "cooki": [0, 4, 6, 15], "redi": 0, "memcach": [0, 6], "option": [0, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16], "also": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "limit": [0, 5, 6, 7, 8, 11, 12, 14, 15], "json": [0, 1, 2, 4, 5, 6, 7, 10, 11, 14, 15], "serializ": [0, 5, 6, 9], "built": [0, 1, 4, 6, 8, 11, 13, 15, 16], "ticket": [0, 3, 6], "global": [0, 5, 6, 8, 12, 14, 15], "per": [0, 4, 5, 7, 13], "filesystem": [0, 4, 5, 6], "individu": [0, 2, 5, 6, 7, 8, 11], "thei": [0, 2, 4, 5, 6, 7, 8, 11, 12, 14, 15], "singl": [0, 2, 5, 6, 7, 8, 9, 11, 12, 13], "pydal": [0, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15], "leverag": 0, "restapi": [0, 3, 16], "yatl": [0, 4, 5, 6, 11, 13, 15, 16], "templat": [0, 9, 11, 12, 14, 15, 16], "languag": [0, 1, 4, 5, 10, 14, 15, 16], "default": [0, 2, 3, 4, 5, 7, 9, 11, 12, 13, 14, 15], "squar": [0, 8], "bracket": [0, 8, 11], "delimit": [0, 5, 6, 8, 14], "avoid": [0, 1, 2, 5, 6, 8, 11], "conflict": [0, 2, 4, 6], "model": [0, 3, 4, 7, 9, 13, 14, 15], "j": [0, 4, 5, 8, 10, 14, 16], "vue": [0, 4, 15], "angular": [0, 15], "includ": [0, 4, 5, 6, 7, 9, 11, 13, 14, 15], "subset": [0, 6, 11], "helper": [0, 4, 5, 6, 8, 11, 13, 14, 16], "plural": [0, 4, 5, 13, 14, 15, 16], "librari": [0, 2, 4, 6, 10, 11, 12, 14, 15], "internation": [0, 4, 5, 11, 14, 16], "practic": [0, 6, 8, 11, 14, 16], "expos": [0, 3, 4, 5, 6, 7, 12], "t": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14], "similar": [0, 4, 5, 6, 9, 11, 14], "cach": [0, 2, 4, 11, 16], "flexibl": [0, 2, 6, 12, 13, 15], "capabl": [0, 13, 15], "dashboard": [0, 2, 4, 6, 8, 11, 16], "replac": [0, 2, 4, 6, 8, 9, 11, 13, 15], "admin": [0, 6, 14], "upload": [0, 4, 14], "edit": [0, 2, 3, 4, 8, 9, 11, 12, 13, 14, 15], "interfac": [0, 3, 5, 6, 13, 14, 15], "appadmin": [0, 6], "form": [0, 5, 6, 7, 10, 12, 13, 16], "grid": [0, 16], "sqlform": [0, 11, 14], "auth": [0, 2, 4, 6, 8, 9, 15, 16], "easier": [0, 6, 7, 8], "extend": [0, 5, 6, 12, 14, 15], "basic": [0, 1, 5, 6, 15, 16], "regist": [0, 4, 5, 6, 8, 12, 14], "login": [0, 2, 4, 5, 6, 8, 11, 12, 14, 16], "logout": [0, 8, 12], "chang": [0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "password": [0, 2, 3, 5, 6, 8, 11, 12, 14, 15], "profil": [0, 8, 12, 14], "integr": [0, 1, 8, 15], "pam": [0, 5], "saml2": 0, "ldap": [0, 5], "oauth2": [0, 5], "googl": [0, 3, 5, 8, 11, 13], "facebook": [0, 5], "twitter": [0, 5, 12], "tag": [0, 5, 7, 8, 14, 15, 16], "group": [0, 2, 3, 5, 12, 14], "search": [0, 1, 2, 3, 6, 9, 11, 12, 16], "appli": [0, 5, 6, 11, 12, 13, 15], "permiss": [0, 5, 6, 14], "membership": [0, 5, 11, 12, 14], "interact": [0, 5], "gener": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "These": [0, 5, 6, 9, 11, 13], "api": [0, 6, 7, 9, 11, 12, 14, 15], "allow": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15], "server": [0, 2, 3, 4, 7, 8, 12, 14, 15, 16], "polici": [0, 16], "about": [0, 7, 12, 13, 14, 15, 16], "oper": [0, 3, 5, 10, 11, 12, 16], "client": [0, 7, 11, 12, 15], "give": [0, 2, 4, 5, 6, 8, 11, 12, 13], "constraint": [0, 6], "two": [0, 1, 2, 4, 5, 6, 8, 11, 13, 14, 15], "main": [0, 1, 2, 4, 6, 8, 13, 14, 15, 16], "mtabl": 0, "customiz": [0, 11, 13], "goal": 0, "easi": [0, 5, 6, 8, 9, 11], "access": [0, 2, 4, 5, 6, 9, 11, 12, 15], "while": [0, 5, 6, 7, 11, 12, 14], "produc": [0, 2, 5, 6, 8, 9, 11, 12], "fast": [0, 4, 15], "thank": [0, 6, 9], "everyon": [0, 1], "who": [0, 12], "contribut": [0, 16], "project": [0, 2, 4, 5, 6], "especi": [0, 2, 5, 6, 11, 12], "massimo": [0, 6], "di": [0, 5], "pierro": 0, "luca": [0, 1], "de": [0, 1, 6, 10], "alfaro": [0, 1], "cassio": 0, "botaro": 0, "dan": 0, "carrol": 0, "jim": [0, 1, 13], "steil": [0, 1, 13], "john": [0, 6], "m": [0, 2, 6, 9, 11], "wolf": 0, "micah": 0, "beaslei": 0, "nico": 0, "zanferrari": 0, "pirsch": 0, "sugizo": 0, "valq7711": [0, 4], "kevin": 0, "keller": 0, "sam": 0, "logo": [0, 8, 9], "special": [0, 4, 5, 6, 8, 9, 10, 12, 14, 16], "offici": [0, 6, 11, 15], "friendli": [0, 5, 8], "call": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], "axel": 0, "axolotl": 0, "magic": 0, "repres": [0, 8, 11], "sens": [0, 6, 11, 12], "kind": [0, 4], "believ": [0, 5], "cornerston": 0, "grow": [0, 6, 15], "commun": [0, 5, 6], "ve": [1, 2, 3, 5, 8, 9, 11, 13, 15], "made": [1, 2, 6, 8, 11, 13], "best": [1, 2, 5, 6, 10, 13], "simpl": [1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16], "clean": [1, 9], "But": [1, 2, 4, 5, 6, 8, 9, 11, 13, 15], "know": [1, 2, 5, 6, 8, 13], "program": [1, 2, 3, 6, 8, 9, 11, 15], "i": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "daunt": 1, "task": [1, 4, 5, 6, 12], "open": [1, 2, 3, 4, 5, 6, 9], "mind": [1, 4, 6, 7, 8, 11], "abl": [1, 2, 5, 6, 11], "jump": 1, "frequent": [1, 6, 11], "without": [1, 2, 8, 9, 13, 15, 16], "being": [1, 5, 6, 7, 8, 11, 15], "lost": [1, 5, 6, 14], "html": [1, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15], "javascript": [1, 4, 7, 9, 15], "css": [1, 4, 5, 8, 9, 11, 12, 13, 15], "even": [1, 4, 5, 6, 8, 9, 11, 13, 14], "don": [1, 2, 3, 4, 6, 8, 11, 12, 13], "scare": 1, "ll": [1, 2, 3, 5, 6, 8, 11, 13, 15], "assist": 1, "side": [1, 6, 15, 16], "journei": 1, "And": [1, 4, 5, 6, 11, 12, 13, 15], "valuabl": 1, "go": [1, 2, 4, 6, 8, 13, 15], "show": [1, 2, 4, 5, 6, 8, 11, 12, 13], "refer": [1, 5, 7, 8, 11], "avail": [1, 2, 6, 8, 9, 12, 14, 15], "onlin": [1, 6], "com": [1, 3, 4, 8, 9, 12, 13, 15], "_document": [1, 3], "static": [1, 8, 9, 14, 16], "index": [1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16], "where": [1, 2, 4, 6, 7, 8, 11, 12, 14, 15], "find": [1, 2, 4, 8, 10, 11, 12, 13], "pdf": [1, 11], "ebook": 1, "version": [1, 3, 5, 7, 8, 11, 15], "written": [1, 8, 11, 13], "restructuredtext": 1, "sphinx": 1, "There": [1, 2, 5, 6, 8, 12, 13, 15], "dedic": [1, 4, 5, 9, 14], "mail": [1, 3, 6, 11], "host": [1, 2, 5, 11, 12], "g": [1, 6, 9, 11], "discuss": [1, 3, 6, 8, 9, 11], "For": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15], "ani": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "should": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "face": [1, 6], "right": [1, 2, 3, 5, 6, 8], "place": [1, 5, 6, 8, 11, 13, 15], "quick": [1, 11], "question": [1, 2, 6], "chat": 1, "free": [1, 5, 6, 12], "could": [1, 2, 4, 6, 8, 9, 11, 12, 14], "usual": [1, 2, 5, 6, 7, 8, 9, 11], "hang": 1, "channel": 1, "learn": [1, 6], "site": [1, 2, 4, 5, 6, 9, 13, 15], "lot": [1, 4, 6], "excel": [1, 13], "train": 1, "cours": [1, 8], "2020": 1, "uc": 1, "santa": 1, "cruz": 1, "blog": [1, 6, 9], "andrew": 1, "gavgavian": 1, "replic": [1, 5], "famou": 1, "corei": 1, "schafer": 1, "seri": 1, "south": 1, "breez": 1, "enterpris": [1, 12], "demo": [1, 2, 15], "around": [1, 6, 14], "structur": [1, 4, 5, 6, 10, 12, 13, 14, 16], "microsoft": [1, 12], "northwind": 1, "convert": [1, 4, 6, 9, 11], "sqlite": [1, 4, 5, 7, 11, 12, 13], "view": [1, 5, 6], "final": [1, 2, 4, 6, 10, 13], "result": [1, 6, 7, 8, 11, 13, 15], "last": [1, 5, 8, 11, 12, 13, 15], "least": [1, 2, 6, 11, 14, 15], "bsd": 1, "v3": 1, "licens": 1, "mean": [1, 2, 3, 5, 6, 8, 11, 12, 14], "read": [1, 4, 5, 6, 7, 13, 15], "studi": 1, "experi": [1, 11, 12], "yourself": [1, 2, 11, 13], "paragraph": [1, 5, 9, 11, 13], "preliminari": 1, "suggest": [1, 6, 11], "befor": [1, 2, 5, 6, 8, 9, 11, 12, 13], "order": [1, 2, 4, 5, 6, 7, 9, 11, 13, 14], "knowledg": 1, "book": [1, 6], "choos": [1, 11, 12], "what": [1, 4, 5, 6, 8, 11, 12, 14, 15, 16], "decor": [1, 4, 6, 14, 16], "mileston": 1, "fulli": [1, 4, 5, 6, 11], "follow": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "chapter": [1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14], "code": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "your": [1, 2, 3, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16], "comput": [1, 16], "setup": [1, 3, 4, 12, 13, 15, 16], "plan": [1, 15], "do": [1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "safe": [1, 5, 6, 9, 13, 14], "run": [1, 3, 4, 5, 8, 12, 14, 16], "exampl": [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16], "littl": [1, 5, 6], "strongli": [1, 5, 11, 13], "check": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14], "lint": 1, "visual": 1, "nowadai": 1, "multi": [1, 2, 6, 14], "choic": [1, 4, 11, 13], "studio": 1, "aka": 1, "jetbrain": 1, "deal": [1, 6, 15], "complex": [1, 2, 4, 5, 6, 8, 9, 12, 14, 15], "reliabl": 1, "virtual": [1, 16], "virtualenv": [1, 2], "introduct": [1, 2, 16], "mess": 1, "up": [1, 2, 5, 6, 8, 12, 15], "git": [1, 2], "keep": [1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 14], "track": [1, 6, 14], "save": [1, 2, 4, 5, 6, 10, 11], "gitlat": 1, "bitbucket": 1, "editor": [1, 8], "highlight": [1, 8], "highli": [1, 13], "recommend": [1, 5, 6, 11], "quit": [1, 2, 5, 7, 8, 11, 13], "If": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "just": [1, 2, 4, 5, 6, 7, 8, 11, 13, 15], "folder": [1, 2, 3, 4, 5, 7, 10, 11, 13, 14], "add": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "arg": [1, 2, 6], "your_full_path_to_py4web": 1, "py": [1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15], "launch": [1, 2], "configur": [1, 2, 5, 6, 11, 12, 14], "note": [1, 2, 5, 8, 9, 11, 14, 15], "window": [1, 2, 4, 5, 6, 8, 11], "paramet": [1, 2, 4, 5, 12, 15], "must": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14], "forward": [1, 3], "slash": [1, 4, 5, 12], "onli": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "c": [1, 2, 3, 5, 6, 8, 9, 11, 14], "your_nam": [1, 15], "instead": [1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "copi": [1, 2, 3, 8, 9, 13, 16], "standard": [1, 2, 3, 6, 7, 12, 13, 14, 15, 16], "launcher": 1, "insid": [1, 2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "renam": [1, 7], "error": [1, 2, 3, 5, 6, 7, 8, 9, 11, 14, 15], "later": [1, 2, 4, 5, 6, 8, 9, 11, 12, 13], "usr": 1, "bin": [1, 2], "env": [1, 14], "python3": [1, 2], "core": [1, 2, 4, 5, 11], "cli": [1, 2], "both": [1, 2, 4, 5, 6, 8, 11, 14], "get": [1, 2, 4, 5, 6, 8, 11, 12, 13, 14, 15, 16], "gevent": [1, 2], "true": [1, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "enabl": [1, 5, 6, 7, 9, 12, 14, 15], "build": [1, 2, 4, 5, 6, 9, 11, 13, 15], "execut": [1, 2, 5, 6, 8, 9, 11, 14, 15], "deploy": 1, "debugg": [1, 14], "support": [1, 4, 5, 8, 9, 10, 11, 12, 14, 15, 16], "effort": 1, "particip": 1, "try": [1, 2, 5, 6, 11, 12], "answer": 1, "submit": [1, 5, 6, 9, 11, 12, 13, 15], "bug": [1, 3, 6], "pull": [1, 6], "repositori": [1, 2, 3], "wish": [1, 6, 11, 15], "correct": [1, 6, 12], "expand": [1, 3], "translat": [1, 2, 4, 6, 8, 11, 14, 15, 16], "foreign": [1, 13], "inform": [1, 5, 6, 7, 11, 12, 14, 16], "directli": [1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15], "specif": [1, 2, 5, 6, 7, 8, 9, 11, 12, 14, 15], "readm": [1, 4, 11], "realli": [1, 4, 6], "rst": 1, "doc": 1, "browser": [1, 2, 3, 5, 7, 8, 13, 15], "onc": [1, 2, 5, 9, 11, 12, 13, 15], "pr": 1, "accept": [1, 2, 4, 5, 6, 9, 10, 11, 14, 15], "master": [1, 2, 6, 13], "branch": [1, 2], "reflect": [1, 6], "page": [1, 5, 6, 9, 11, 12, 13, 14, 15, 16], "epub": 1, "next": [1, 2, 5, 6, 8, 11], "output": [1, 2, 4, 5, 6, 7, 8, 9, 11, 15], "everyth": [2, 4, 14], "els": [2, 4, 6, 11, 12, 13, 14, 15], "charg": [2, 14], "reason": [2, 5, 6, 7, 13, 14], "thing": [2, 5, 6, 14], "py4web": [2, 3, 4, 5, 7, 8, 9, 11, 12, 13], "download": 2, "pypi": 2, "github": [2, 3, 4, 6, 13], "want": [2, 4, 5, 6, 8, 9, 11, 13, 15], "exist": [2, 5, 6, 11, 12, 13, 15], "scaffold": [2, 4, 5, 6, 8, 14, 15], "under": [2, 3, 4, 5, 6, 11], "process": [2, 4, 5, 6, 8, 11, 12, 13, 14, 15], "address": [2, 6, 11, 12], "each": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "fine": [2, 12, 13], "maco": 2, "linux": 2, "7": [2, 7, 8, 11, 14], "advanc": [2, 12, 13, 16], "except": [2, 4, 5, 6, 9, 11, 12, 15], "four": [2, 6], "altern": [2, 5, 6, 8, 11, 15], "level": [2, 6, 7, 10, 11, 12], "difficulti": 2, "let": [2, 6, 7, 11, 15], "look": [2, 3, 5, 6, 7, 9, 11, 12], "pro": 2, "con": 2, "real": [2, 4, 7, 8, 11], "bunch": 2, "modifi": [2, 4, 6, 7, 8, 11, 13, 14, 15], "anyhow": 2, "simplest": [2, 4], "newbi": 2, "student": 2, "pre": [2, 4, 5, 6, 13], "nor": [2, 6, 11], "administr": 2, "On": [2, 6, 11, 12, 15], "hand": [2, 6, 11, 15], "experiment": [2, 5], "old": [2, 5, 11, 14], "difficult": [2, 15], "latest": [2, 6, 14], "extern": [2, 6], "unzip": 2, "With": [2, 6, 11, 12, 15], "type": [2, 4, 5, 7, 8, 9, 12, 13, 15], "rememb": [2, 3, 5, 6, 11], "document": [2, 3, 5, 6, 8, 9, 11, 15], "notic": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "correspond": [2, 3, 4, 6, 9, 10, 11, 12, 13, 14], "stabl": 2, "although": [2, 6, 8, 11], "date": [2, 6, 13], "quickli": [2, 11, 13], "dir": [2, 11, 15], "specifi": [2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "full": [2, 4, 6, 8, 11, 13, 15], "8": [2, 6, 7, 11], "path": [2, 4, 5, 6, 7, 10, 11, 13, 14, 15], "asset": 2, "after": [2, 3, 5, 6, 8, 11, 12, 13], "given": [2, 5, 6, 8, 11], "ex": 2, "point": [2, 3, 4, 5, 6, 7, 8, 11, 13, 14], "mistak": 2, "A": [2, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16], "sure": [2, 3, 4, 5, 6, 10, 11, 15], "prevent": [2, 5, 6, 8, 9, 11, 15], "unwant": [2, 6], "good": [2, 3, 11], "habit": 2, "still": [2, 5, 6, 9, 11, 13, 14], "discoveri": 2, "instruct": [2, 11], "activ": [2, 6, 12], "venv": 2, "tradit": [2, 6], "normal": [2, 4, 5, 6, 8, 9, 11, 13, 15], "util": [2, 4, 5, 8, 9, 11, 12, 13, 14, 16], "along": [2, 4, 9, 11, 15], "link": [2, 6, 7, 8, 9, 11, 12, 13, 15], "clone": [2, 4, 6, 15], "cd": 2, "content": [2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "miss": [2, 12, 13], "manual": [2, 3, 4, 6, 9, 12, 13], "itself": [2, 6, 11, 15], "alreadi": [2, 3, 4, 5, 6, 9, 11, 12, 13], "present": [2, 6, 8, 11, 12], "gain": 2, "potenti": 2, "untest": [2, 12], "r": [2, 6, 11], "forc": [2, 6, 11, 12], "ones": [2, 5, 6, 7, 11, 14], "automat": [2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "safeti": 2, "precaut": 2, "backup": [2, 6, 11], "person": [2, 6, 7, 11, 13], "done": [2, 6, 8, 11, 13, 14], "delet": [2, 4, 7, 11, 13, 15], "again": [2, 3, 4, 5, 6, 11, 13, 15], "previou": [2, 5, 6, 8, 9, 11, 15], "name": [2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "wit": 2, "noth": [2, 5, 6, 11, 15], "expect": [2, 4, 5, 6, 9, 11, 14], "_dashboard": [2, 3], "_default": [2, 4], "describ": [2, 3, 4, 5, 6, 11], "welcom": [2, 4, 5, 8, 14, 15], "role": [2, 5, 9], "therefor": [2, 4, 5, 6, 8, 9, 11, 14], "actual": [2, 5, 6, 8, 13], "_": [2, 11, 15], "url": [2, 4, 5, 7, 8, 11, 12, 13, 14, 15], "localhost": [2, 4, 5, 6, 11], "8000": [2, 3, 4, 11, 13], "yourappnam": 2, "stop": [2, 3], "hit": [2, 6], "control": [2, 4, 5, 8, 9, 11, 12, 13, 14, 15], "appnam": [2, 5, 12, 14], "prefix": [2, 4, 6, 7, 8, 11, 14], "mai": [2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "symlink": [2, 4], "trail": [2, 11], "ctrl": [2, 3], "break": [2, 6, 11], "fn": 2, "paus": 2, "argument": [2, 4, 5, 6, 8, 9, 11, 12, 14], "addit": [2, 4, 5, 6, 7, 8, 11, 13], "help": [2, 6, 7, 8, 9, 11, 14, 16], "h": [2, 11], "usag": [2, 3, 4, 5, 6, 9, 11, 12, 13], "apps_fold": 2, "func": [2, 5], "y": [2, 9, 11], "ye": [2, 6], "No": [2, 6], "prompt": [2, 4, 6], "assum": [2, 5, 6, 7, 10, 14], "fals": [2, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "text": [2, 5, 6, 8, 9, 13, 15], "pass": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "messag": [2, 4, 5, 7, 8, 11, 13, 14, 15], "exit": [2, 5], "myfunct": 2, "x": [2, 6, 8, 9, 11, 13], "100": [2, 6, 7, 8, 11], "doubl": [2, 6, 8], "quot": [2, 9], "shown": [2, 6, 11, 12], "app_nam": [2, 4, 5, 6], "scaffold_zip": 2, "current": [2, 5, 6, 8, 9, 12, 13, 14, 15], "127": [2, 3, 5, 11, 13], "0": [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "1": [2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15], "p": [2, 8, 11], "integ": [2, 4, 6, 7, 9, 11, 15], "number": [2, 4, 5, 6, 8, 10, 11, 13], "password_fil": 2, "wsgiref": 2, "tornado": 2, "gunicorn": 2, "waitress": 2, "geventwebsocketserv": 2, "wsgirefthreadingserv": 2, "rocketserv": 2, "w": [2, 4, 5, 6], "number_work": 2, "worker": [2, 5], "d": [2, 7, 9, 11], "dashboard_mod": 2, "mode": [2, 4, 5, 11, 12], "readonli": [2, 11, 15], "none": [2, 5, 6, 7, 9, 11, 13, 14, 15], "watch": [2, 3, 16], "sync": [2, 6], "lazi": [2, 4, 14], "reload": [2, 3, 4, 5, 11, 15], "ssl_cert": 2, "ssl": 2, "certif": 2, "ssl_kei": 2, "kei": [2, 4, 5, 7, 9, 10, 11, 12, 16], "errorlog": 2, "send": [2, 6, 11, 12], "log": [2, 3, 4, 5, 6, 8, 9, 12, 14, 15], "stdout": 2, "stderr": 2, "tickets_onli": 2, "filenam": [2, 4, 5, 6, 11], "l": [2, 11], "logging_level": 2, "50": [2, 7], "30": [2, 6, 8, 11], "warn": [2, 5], "debug": [2, 4, 5, 6, 8], "switch": [2, 5, 6], "By": [2, 4, 5, 6, 11, 12, 14], "upon": [2, 8, 12, 14], "occur": [2, 6, 8, 11, 15], "incom": 2, "prefer": [2, 5, 6, 9, 15], "immedi": [2, 6, 13], "product": [2, 4, 6, 11, 15], "unned": 2, "restart": [2, 4, 5, 6, 13], "direct": [2, 5, 6, 8, 11], "modif": 2, "behaviour": [2, 6, 11, 13], "rocket3": [2, 14], "thread": [2, 5, 6, 14], "strip": [2, 11, 14], "python2": [2, 14], "logic": [2, 4, 5, 11, 12, 14], "valu": [2, 5, 7, 8, 9, 10, 11, 13, 15], "defin": [2, 4, 5, 8, 11, 12, 13, 14, 15], "common": [2, 3, 4, 5, 8, 11, 12, 14, 15], "notset": 2, "10": [2, 6, 7, 8, 9, 10, 11, 12, 15], "20": [2, 7, 10, 11], "info": [2, 4, 5, 6, 12], "40": [2, 9, 15], "critic": 2, "tell": [2, 4, 5, 6, 12, 13, 15], "handl": [2, 4, 5, 6, 11, 13, 14, 15], "event": [2, 6, 15], "found": [2, 6, 11], "invalid": [2, 5, 6, 11], "ask": [2, 5, 6], "annoi": 2, "pdkdf2": 2, "hash": [2, 6, 11], "unless": [2, 3, 5, 6, 8, 11], "my_password_fil": 2, "runtim": [2, 6], "valid": [2, 4, 7, 8, 9, 13, 14, 16], "crypt": 2, "write": [2, 4, 5, 6, 8, 11, 14], "str": [2, 5, 6, 9, 14, 15], "input": [2, 4, 5, 6, 8, 11, 15], "reinstal": 2, "confirm": [2, 11, 12, 13, 15], "creation": [2, 6], "parent": [2, 6, 8, 15], "myapp": [2, 4], "db": [2, 3, 4, 5, 7, 9, 11, 12, 13, 14, 15], "dal": [2, 4, 7, 11, 13, 15, 16], "field": [2, 4, 5, 7, 9, 12, 14, 15, 16], "too": [2, 5, 6, 11, 15], "cannot": [2, 5, 6, 8, 9, 11, 15], "deployment_tool": 2, "recip": 2, "briefli": 2, "tip": [2, 13, 16], "trick": 2, "To": [2, 4, 6, 8, 9, 10, 11, 12, 13], "step": [2, 6, 12, 14, 15], "www": [2, 8, 9, 13], "section": [2, 4, 6, 8, 11, 12], "io": [2, 6], "educ": 2, "brows": [2, 3, 13, 15], "vscode": 2, "updat": [2, 5, 11, 13, 14, 15, 16], "workspacefold": 2, "path_to": 2, "crt": [2, 6], "absolut": [2, 6, 14], "locat": [2, 4, 8, 14], "so": [2, 5, 6, 8, 9, 11, 13, 14, 15], "feasibl": [2, 11], "simpli": [2, 4, 5, 6, 8, 10, 15], "py4web_wsgi": 2, "4": [2, 5, 6, 7, 8, 11, 13], "take": [2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15], "consol": [2, 9, 12, 15], "obtain": [2, 4, 6, 12, 15], "project_nam": 2, "mkdir": [2, 4, 7, 11, 13], "cp": 2, "development_tool": 2, "mayb": [2, 5], "empti": [2, 4, 6, 11, 15], "__init__": [2, 4, 5, 6, 7, 11, 13, 14, 15], "deploi": 2, "makefil": 2, "lib": [2, 8, 9, 13], "yaml": 2, "sdk": 2, "config": [2, 4], "email": [2, 5, 8, 11, 12, 14], "account": [2, 6], "suit": 2, "youtub": [2, 6], "video": [2, 15], "tutori": [2, 13, 15], "bottle_app": 2, "script": [2, 5, 8, 15], "dockerfil": 2, "compos": [2, 5], "yml": 2, "postgresql": [2, 6], "advantag": [2, 6, 8, 15], "sudo": [2, 12], "background": [2, 4, 11, 15], "daemon": 2, "bash": 2, "04": 2, "03": [2, 6, 7], "lt": [2, 9], "nginx": 2, "self": [2, 5, 9, 11, 13, 15], "sign": [2, 4, 5, 6, 8, 11, 12], "iptabl": 2, "extens": [3, 6, 11, 14], "explor": 3, "listen": 3, "tcp": 3, "local": [3, 5, 6, 11, 12, 13, 14], "pc": 3, "protocol": 3, "connect": [3, 4, 5, 11, 14], "firefox": [3, 15], "chrome": [3, 15], "button": [3, 4, 5, 9, 11, 15, 16], "20201112": 3, "sourc": [3, 4, 6, 11], "forum": 3, "press": [3, 4, 13], "insert": [3, 5, 7, 8, 11, 12, 13, 15], "set_password": 3, "command": [3, 4, 8, 9, 16], "displai": [3, 4, 5, 6, 8, 9, 11, 12, 13, 15], "tab": [3, 5, 11], "compress": [3, 4], "click": [3, 6, 9, 11, 13, 15], "titl": [3, 8, 11, 15], "context": [3, 5, 6, 8], "select": [3, 4, 7, 10, 11, 12, 13, 14, 15, 16], "compris": 3, "effect": [3, 6, 11], "fail": [3, 6, 8, 11], "load": [3, 4, 5, 6, 8, 13, 15], "red": [3, 4, 6, 8, 9, 11], "crud": [3, 11, 15], "visit": [3, 5, 6, 8, 11, 12], "trigger": [3, 5, 6, 15], "recent": [3, 5, 6, 11, 13], "own": [4, 5, 6, 8, 11, 12, 13, 14, 15], "strictli": [4, 15], "enter": [4, 5, 9, 11, 12], "echo": 4, "backslash": 4, "e": [4, 5, 6, 7, 8, 9, 11, 12, 15], "recogn": [4, 6], "whenev": [4, 6], "anyth": 4, "arbitrari": [4, 6, 12], "typic": [4, 5, 6, 8, 11], "subfold": [4, 5, 6], "publish": 4, "hello": [4, 5, 6, 8, 9, 11, 12, 15], "world": [4, 5, 6, 8, 9, 11], "newli": [4, 6, 10], "One": [4, 11, 12], "__": 4, "stream": [4, 5, 6, 14], "partial": [4, 6, 14], "rang": [4, 6, 8, 12, 14], "header": [4, 5, 6, 8, 9, 13, 15], "datetim": [4, 5, 6, 7, 11, 15], "action": [4, 5, 6, 9, 11, 14, 15, 16], "def": [4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "webserv": 4, "prepend": [4, 7, 11, 14, 15], "ambigu": [4, 6], "string": [4, 5, 7, 8, 9, 10, 11, 13], "dictionari": [4, 5, 9, 10, 14], "serial": [4, 5, 6, 8, 9, 11], "end": [4, 6, 8, 9, 11, 12, 13, 14, 15], "color": [4, 6, 8, 9, 11, 15], "blue": [4, 6, 11, 14], "green": [4, 6, 14], "visibl": 4, "chose": 4, "convent": [4, 6, 8, 11, 14], "often": [4, 6, 12, 15], "shortli": 4, "possibl": [4, 5, 6, 8, 11, 13, 14], "map": [4, 6, 9, 10, 11, 14], "pattern": [4, 7], "pick": [4, 5, 12], "unknown": 4, "wildcard": 4, "filter": [4, 7, 11, 12], "int": [4, 6, 11, 14], "match": [4, 5, 6, 7, 8, 9, 10, 11], "digit": [4, 6, 11, 12], "float": [4, 11], "decim": [4, 6, 11], "charact": [4, 6, 9, 11], "non": [4, 5, 6, 11, 13, 14], "greedi": 4, "segment": 4, "exp": [4, 6], "express": [4, 7, 8, 9, 10, 11, 13, 15], "variabl": [4, 5, 6, 9, 10, 11, 13, 15], "method": [4, 5, 7, 8, 9, 11, 12, 13, 15, 16], "post": [4, 6, 7, 9, 11, 12, 13, 14, 15], "paint": [4, 11], "queri": [4, 5, 7, 9, 11, 12, 13, 14, 15], "equival": [4, 5, 6, 9, 11, 14], "attribut": [4, 5, 9, 11, 13, 14, 15], "identifi": [4, 5, 6, 9, 11], "head": [4, 8, 11, 13], "style": [4, 8, 11, 15, 16], "bodi": [4, 8, 12, 13, 15], "h1": [4, 8], "dict": [4, 5, 6, 10, 11, 13, 14, 15], "ingredi": 4, "behavior": [4, 6, 9, 11, 14, 15], "scope": 4, "plugin": [4, 5, 11, 13, 15], "tree": [4, 8, 11], "explain": [4, 5, 6, 11, 13], "That": [4, 6, 14], "easili": [4, 5, 6, 8, 9, 11, 13], "pool": [4, 5], "commit": [4, 5, 7, 13, 14], "rollback": 4, "failur": [4, 11, 15], "pars": [4, 5, 6, 10, 11, 12], "retriev": [4, 5, 6, 14, 15], "determin": [4, 5, 6, 8, 10, 11, 12, 13], "optim": [4, 6], "rule": [4, 5, 8, 11, 13], "sane": 4, "outlin": [4, 5], "put": [4, 5, 7, 11, 15], "organ": 4, "properli": 4, "registr": [4, 11], "construct": [4, 6], "metadata": [4, 6], "md": 4, "tabl": [4, 5, 7, 11, 12, 13, 14, 15], "settings_priv": 4, "privat": [4, 5, 11], "ship": [4, 8], "bulma": [4, 11, 13, 15], "agnost": 4, "past": 4, "favicon": 4, "ico": 4, "etc": [4, 5, 6, 7, 10, 14], "layout": [4, 11, 12, 13, 14, 15, 16], "italian": [4, 5, 10], "respons": [4, 5, 6, 8, 13, 14, 15, 16], "abort": [4, 6], "redirect": [4, 5, 11, 12, 13, 15], "get_us": [4, 5, 12, 14], "first_nam": [4, 5, 12, 13], "format": [4, 5, 7, 9, 10, 12, 13], "bottlepi": [4, 5], "counterpart": 4, "div": [4, 5, 8, 11, 14, 15], "span": [4, 14], "img": 4, "pretti": [4, 6, 11, 14], "indic": [4, 6, 11, 14, 15], "probabl": [4, 11], "line": [4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16], "whole": [4, 11], "anoth": [4, 5, 8, 10, 11], "my_app": 4, "Then": [4, 5, 6, 9, 11, 12, 13, 15], "upper": [4, 5, 11], "As": [4, 5, 6, 7, 8, 9, 11, 12, 13, 15], "facilit": 4, "fact": [4, 5, 6, 14], "handler": 4, "app_watch_handl": 4, "report": [4, 8], "worri": [4, 6], "sass": 4, "compil": [4, 8, 9, 11], "libsass": 4, "static_dev": 4, "overrid": [4, 6, 8, 9, 12, 13, 14, 15], "sass_compil": 4, "changed_fil": 4, "print": [4, 6, 9, 10, 12, 14], "abov": [4, 5, 6, 7, 8, 11, 12, 13], "compiled_css": 4, "filep": 4, "include_path": 4, "output_styl": 4, "dest": [4, 6], "o": [4, 5, 7, 11, 13], "join": [4, 5, 7, 11, 12, 13, 14, 16], "esprima": 4, "implement": [4, 5, 6, 8, 11, 12, 14, 15], "node": 4, "dbadmin": 4, "validate_j": 4, "cf": 4, "abspath": 4, "parsemodul": 4, "filepath": 4, "rel": [4, 6, 8, 13, 14], "ignor": [4, 6, 8, 9, 11, 13, 15], "termin": [4, 8, 15], "equip": 5, "furnitur": 5, "fix": [5, 14], "posit": [5, 9], "vehicl": 5, "someth": [5, 6, 7, 8, 9, 11], "attach": [5, 6, 12, 14], "transact": 5, "lookup": [5, 7, 11], "proper": [5, 6, 13], "back": [5, 6, 11], "accomplish": [5, 6, 12, 14], "skip": [5, 15], "manner": [5, 14], "boilerpl": 5, "wsgi": 5, "middlewar": 5, "authent": [5, 6, 13, 16], "return": [5, 6, 7, 9, 11, 12, 13, 15], "otherwis": [5, 6, 8, 11, 12, 13], "variou": [5, 6], "transform": [5, 6, 11, 15], "jinja2": 5, "syntact": [5, 11], "sugar": 5, "ram": [5, 6], "Be": [5, 6, 8], "care": [5, 6, 8, 14, 15], "exactli": [5, 6, 8], "opposit": [5, 6], "earli": [5, 6], "februari": 5, "2022": 5, "combin": [5, 9, 11, 13], "implic": 5, "cleaner": 5, "my_var": [5, 9], "t_folder": 5, "dirnam": [5, 7, 11, 13], "__file__": [5, 7, 11, 13], "class": [5, 6, 8, 9, 11, 12, 14, 15], "counter": [5, 6, 15], "count": [5, 7, 12, 13, 15], "dbstore": 5, "memori": 5, "storag": [5, 6, 7, 11, 13], "n": [5, 6, 10, 15], "en": [5, 7], "2": [5, 6, 7, 8, 9, 10, 11, 12, 14, 15], "twice": [5, 6], "6": [5, 6, 7, 11, 12, 14], "5": [5, 6, 7, 8, 10, 11, 12, 13, 15], "english": 5, "ti": 5, "ho": 5, "visto": 5, "prima": 5, "gia": 5, "volt": 5, "piu": 5, "alert": [5, 8, 9, 11, 14], "state": [5, 6, 7, 14, 15], "dismiss": [5, 14], "_class": [5, 9, 11, 15], "sanit": [5, 9, 14], "src": [5, 6, 8, 9, 15], "xml": [5, 8, 11, 14, 15], "achiev": [5, 6, 14], "temporarili": 5, "sent": [5, 6, 12, 15], "overwritten": [5, 14], "hardcod": 5, "speak": 5, "desir": [5, 8, 11, 12], "persist": [5, 6, 12], "throughout": 5, "word": [5, 6, 10, 13], "render": [5, 7, 8, 9, 11, 13, 14, 15], "stateless": [5, 15], "secret": [5, 12], "my": [5, 8, 9, 11, 12, 15], "increas": 5, "close": [5, 6, 8, 9], "reopen": 5, "relat": [5, 16], "usernam": [5, 6, 12], "shop": 5, "cart": 5, "jwt": 5, "token": [5, 11], "__str__": [5, 8, 9], "minim": [5, 13, 16], "never": [5, 6, 8, 11, 14, 15], "expir": [5, 6], "3600": [5, 6], "algorithm": [5, 11], "hs256": 5, "same_sit": 5, "lax": 5, "_sesson": 5, "passphras": 5, "maximum": [5, 6, 11], "lifetim": 5, "second": [5, 9, 11, 12, 14], "timeout": 5, "signatur": [5, 7, 9, 11], "csrf": [5, 11], "attack": [5, 9], "cross": [5, 6, 9], "forgeri": 5, "uuid": [5, 6], "why": [5, 6, 8, 14], "appname_sess": 5, "encod": [5, 6, 11, 15], "tamper": [5, 6], "trivial": [5, 6], "disk": [5, 6], "sensit": [5, 6, 11], "vice": 5, "versa": 5, "small": [5, 11], "size": [5, 6, 8, 11], "kbyte": 5, "conn": 5, "11211": 5, "6379": 5, "lambda": [5, 6, 9, 11, 13, 15], "k": [5, 8, 14], "v": [5, 9, 11, 15], "ct": 5, "ttl": 5, "monkei": 5, "patch": 5, "multiprocess": 5, "quirk": 5, "determinist": 5, "unsaf": [5, 9], "imagin": [5, 6, 8, 15], "fsstorag": 5, "fp": 5, "dump": [5, 6, 15], "tmp": [5, 6], "leav": [5, 6, 12], "exercis": [5, 12], "lock": [5, 6], "ineffici": [5, 6], "scale": [5, 8], "app1": 5, "app2": 5, "sesson": 5, "session_secret_kei": 5, "app1_sess": 5, "between": [5, 6, 9, 11, 14], "consist": [5, 6, 8, 13, 14], "session_app1": 5, "restrict": [5, 6, 7, 11, 15], "enforc": [5, 6, 11, 14], "workflow": [5, 16], "step1": 5, "step_complet": 5, "_href": [5, 8, 9, 11, 13], "step2": 5, "step3": 5, "on_request": 5, "evalu": [5, 6, 7, 8, 11, 15], "rais": [5, 6, 11, 14], "404": [5, 11], "cond": 5, "400": [5, 14], "on_fals": 5, "13": [5, 6, 11], "auth_us": [5, 6, 12], "requires_membership": 5, "group_nam": [5, 12], "user_id": [5, 6, 14], "payrol": 5, "employe": [5, 13], "signer": 5, "url_sign": 5, "somepath": 5, "signed_url": 5, "anotherpath": 5, "verifi": [5, 11, 12], "abstract": [5, 14, 16], "layer": [5, 14, 16], "pleas": [5, 6], "doesn": [5, 6, 13], "db_folder": [5, 7, 11, 13], "pool_siz": [5, 6], "define_t": [5, 7, 11, 12, 13, 14], "visit_log": 5, "client_ip": 5, "timestamp": [5, 7, 15], "remote_addr": [5, 12], "utcnow": [5, 6], "wrap": [5, 10, 11], "on_success": 5, "roll": [5, 6], "on_error": 5, "Their": [5, 6, 14], "constructor": [5, 9, 12, 16], "last_nam": [5, 12, 13], "sso_id": [5, 12], "action_token": [5, 12], "mostli": 5, "presenc": [5, 6], "_scaffold": [5, 8, 9, 11, 12, 13, 14, 16], "author": [5, 6, 7, 16], "writabl": [5, 6, 11, 14], "readabl": [5, 6, 7, 13, 14], "threadsafevari": 5, "myfixtur": 5, "eventu": 5, "inner": [5, 8, 15], "b": [5, 6, 8, 9, 11, 14, 15], "circumst": 5, "think": [5, 6, 8, 13, 15], "onion": 5, "center": [5, 8], "outer": [5, 11, 15], "previous": [5, 6, 11], "uppercas": [5, 11], "upper_cas": 5, "traceback": [5, 6], "logerror": 5, "errlog": 5, "myerror": 5, "__prerequisite__": 5, "append": [5, 6, 9, 11, 13, 15], "__prerequisites__": 5, "guarante": [5, 6, 8, 14], "prerequisit": [5, 16], "singleton": [5, 14], "consid": [5, 6, 8, 9, 11, 13, 14], "httrespons": 5, "complic": 5, "whether": [5, 6, 8, 11, 12, 13, 14], "mandatori": [5, 6, 8], "happen": [5, 6], "sequenc": [5, 6], "revers": [5, 6], "extra": [5, 6, 11, 12], "almost": 5, "futur": [5, 14, 15], "lru": 5, "via": [5, 6, 8, 9, 12, 15], "1000": [5, 6, 11, 15], "60": [5, 6], "uuid4": [5, 6], "mention": [5, 12, 15], "unauthent": [5, 6, 9], "below": [5, 6, 7, 11, 13], "separ": [5, 6, 8, 11, 12, 13, 15], "preced": [5, 6, 7, 8, 11], "dynam": [6, 7, 8, 9, 11, 12, 16], "dialect": 6, "term": [6, 11], "portabl": 6, "among": [6, 11], "choosen": 6, "pure": 6, "conceiv": 6, "tast": 6, "aggreg": 6, "nest": [6, 8, 9], "caveat": [6, 8, 14, 16], "startup": [6, 14, 16], "downsid": [6, 14], "approach": [6, 14], "modern": [6, 12, 15], "driver": 6, "sqlite3": 6, "mac": 6, "binari": 6, "appropri": [6, 11], "pysqlite2": 6, "zxjdbc": 6, "jython": 6, "psycopg2": 6, "pymysql": 6, "mysqldb": 6, "cx_oracl": 6, "pyodbc": 6, "pypyodbc": 6, "firebird": 6, "kinterbasdb": 6, "fdb": 6, "db2": 6, "informix": 6, "informixdb": 6, "ingr": 6, "ingresdbi": 6, "cubrid": 6, "cubriddb": 6, "sybas": 6, "teradata": 6, "sapdb": 6, "mongodb": 6, "pymongo": 6, "imap": 6, "imaplib": 6, "treat": [6, 14], "instanti": [6, 12, 13, 14], "mytabl": 6, "myfield": 6, "truncat": 6, "import_from_csv_fil": 6, "claus": [6, 8], "myqueri": 6, "myset": 6, "somevalu": 6, "deriv": 6, "myorder": 6, "advis": [6, 13], "NOT": [6, 11, 12], "hesit": 6, "snippet": 6, "auth_user_tag_group": [6, 12], "superhero": [6, 7, 11, 13, 15], "superpow": [6, 7], "superman": [6, 7, 11, 13], "real_ident": [6, 7], "zero": [6, 8, 11, 13], "sake": 6, "simplic": [6, 15], "engin": [6, 11], "At": [6, 8], "_uri": 6, "_dbname": 6, "instanc": [6, 9, 11, 13, 15], "uniform": 6, "resourc": [6, 12, 16], "situat": 6, "dummi": [6, 8], "db_codec": 6, "utf": 6, "check_reserv": 6, "migrate_en": 6, "fake_migrate_al": 6, "decode_credenti": 6, "driver_arg": 6, "adapter_arg": 6, "auto_import": 6, "bigint_id": 6, "lazy_t": 6, "db_uid": 6, "do_connect": 6, "after_connect": 6, "ignore_field_cas": 6, "entity_quot": 6, "table_hash": 6, "establish": [6, 14], "set_encod": 6, "utf8mb4": 6, "postgr": 6, "2005": 6, "mssql3": 6, "2012": 6, "mssql4": 6, "dsn": 6, "uid": 6, "pwd": 6, "ndb": 6, "alter": 6, "utf8": 6, "unicod": [6, 11], "byte": [6, 11], "buffer": 6, "had": 6, "_select": [6, 9], "_insert": 6, "_updat": 6, "_delet": 6, "behav": [6, 13], "latin1": 6, "unicodedecodeerror": 6, "rather": [6, 8, 9, 11, 15], "slow": 6, "goe": [6, 11], "recycl": 6, "minimum": [6, 11], "receiv": 6, "share": [6, 14], "sequenti": 6, "simultan": 6, "yield": 6, "benefit": [6, 15], "wait": 6, "stai": 6, "unus": 6, "retri": 6, "major": 6, "boost": [6, 8], "defer": [6, 15], "referenc": [6, 7, 9], "possibli": 6, "howev": [6, 8, 9, 11, 13, 15], "demand": 6, "housekeep": 6, "definit": [6, 7, 11, 13, 14], "maintain": [6, 8, 13, 15], "workload": 6, "slave": 6, "column": [6, 16], "against": [6, 7, 9, 11, 13], "target": [6, 9, 15], "scan": 6, "known": [6, 8], "_nonreserv": 6, "postgres_nonreserv": 6, "backend": 6, "entiti": 6, "unquot": [6, 9], "insensit": [6, 11], "thu": [6, 8], "fold": 6, "accord": [6, 8], "compliant": [6, 15], "schema": 6, "arrang": [6, 11], "table1": 6, "sometim": [6, 8, 9, 11, 13], "necessari": [6, 8, 9], "user_nam": 6, "user_password": 6, "server_addr": 6, "db_name": 6, "sslmode": 6, "sslrootcert": 6, "root": [6, 8, 12, 13], "sslcert": 6, "sslkei": 6, "boolean": [6, 13], "affect": 6, "disabl": [6, 7, 9, 11, 13], "fake": 6, "aren": 6, "ever": 6, "granular": 6, "bob": 6, "enclos": [6, 8], "pseudo": 6, "visitor": [6, 9, 11], "tablenam": [6, 7, 11, 15], "kwarg": [6, 15], "subclass": [6, 11], "common_filt": 6, "catch": 6, "anywai": 6, "auto": [6, 13], "increment": 6, "uniqu": [6, 7, 11], "element": [6, 8, 9, 11, 13, 15], "redefinit": 6, "anonym": [6, 8, 11], "down": [6, 11, 15], "othert": 6, "otherfield": 6, "alia": [6, 11], "illustr": [6, 8], "qualifi": 6, "db1": 6, "dbo": 6, "part": [6, 9, 11, 14], "sub": 6, "relev": 6, "numer": [6, 11], "lose": [6, 11], "delai": [6, 15], "ag": 6, "set_attribut": 6, "is_not_empti": 6, "is_int_in_rang": 6, "120": 6, "is_in_db": [6, 13], "somet": 6, "somefield": 6, "some_valu": 6, "caus": [6, 11], "underscor": [6, 9, 11], "_extra": 6, "condit": [6, 8, 11, 16], "easiest": [6, 12], "met": 6, "accnum": 6, "acctyp": 6, "accdesc": 6, "null": [6, 7, 11, 15], "fieldnam": [6, 15], "length": [6, 11], "ondelet": 6, "notnul": 6, "uploadfield": 6, "widget": [6, 16], "label": [6, 7, 8, 11, 13, 14, 15], "comment": [6, 9], "searchabl": 6, "listabl": 6, "autodelet": 6, "uploadfold": 6, "uploadsepar": 6, "uploadf": 6, "custom_qualifi": 6, "map_non": 6, "Not": 6, "upgrad": [6, 16], "popul": 6, "seem": 6, "redund": [6, 11], "ON": 6, "statement": [6, 8, 11], "NO": 6, "somewher": 6, "blob": 6, "upload_fold": [6, 11], "attent": 6, "either": [6, 9, 11], "move": 6, "amazon": 6, "s3": 6, "sftp": 6, "pyfilesystem": 6, "due": [6, 7, 11], "associ": [6, 10, 11, 12], "autogener": 6, "neither": [6, 11], "reset": 6, "is_length": 6, "512": 6, "32768": 6, "31": [6, 7, 11], "gib": 6, "is_float_in_rang": 6, "1e100": 6, "is_decimal_in_rang": 6, "is_dat": 6, "is_tim": 6, "is_datetim": 6, "_id": [6, 9, 11, 15], "is_empty_or": 6, "is_json": 6, "bigint": 6, "63": [6, 11], "big": [6, 14], "total": [6, 7], "respect": [6, 9, 11, 13], "certain": [6, 8, 11, 13], "denorm": [6, 7], "listproperti": 6, "stringlistproperti": 6, "item": [6, 7, 8, 9, 11], "escap": [6, 8, 9], "explanatori": 6, "backport": 6, "base64": [6, 8, 15], "decod": 6, "extract": [6, 11, 15], "neg": [6, 11], "33": [6, 11], "space": [6, 8, 11, 13], "_format": 6, "similarli": [6, 9], "32": [6, 11], "_tabl": [6, 11, 15], "_tablenam": 6, "_db": 6, "tupl": [6, 8, 9], "myfil": 6, "imag": [6, 8, 9, 11], "assign": [6, 8, 11, 12, 14], "duplic": 6, "file_cont": [6, 15], "file_nam": [6, 15], "occasion": [6, 11], "programmat": [6, 9, 11], "rb": 6, "simpler": [6, 8, 13], "temp": 6, "image_fil": 6, "plain": 6, "fullnam": 6, "nameonli": 6, "origin": [6, 8, 9, 10, 11], "readi": 6, "contextlib": 6, "shutil": 6, "wb": 6, "copyfileobj": 6, "logfil": 6, "unnam": [6, 9], "recov": 6, "junk": 6, "complain": 6, "corrupt": 6, "smaller": 6, "involv": [6, 8, 13, 14], "confus": 6, "rebuild": 6, "prudent": 6, "yourapp": 6, "narrow": 6, "summar": 6, "alex": 6, "ident": [6, 7, 11, 14], "bulk_insert": 6, "tim": 6, "oppos": [6, 9], "loop": [6, 8], "speed": [6, 7, 8], "carl": 6, "q": [6, 13], "far": [6, 15], "birthplac": 6, "chicago": 6, "born": 6, "hi": [6, 11], "criteria": [6, 11], "pet": 6, "rover": 6, "ret": 6, "bail": 6, "hold": [6, 15], "whose": [6, 8, 11], "rare": 6, "num": 6, "properti": [6, 11], "id1": 6, "chair": 6, "id2": 6, "materi": 6, "wood": 6, "assert": 6, "thing_tags_default": 6, "tail": 6, "u": [6, 9, 11], "five": 6, "placehold": [6, 10, 11, 15], "colnam": 6, "as_ordered_dict": 6, "substitut": [6, 8], "cursor": [6, 15], "field1": 6, "val1_row1": 6, "field2": 6, "val2_row1": 6, "val1_row2": 6, "val2_row2": 6, "former": 6, "ensur": [6, 11], "ordereddict": 6, "_time": 6, "took": 6, "recurr": 6, "IF": 6, "myidx": 6, "INTO": 6, "_count": 6, "susan": 6, "moreov": [6, 15], "act": [6, 9, 11], "latter": [6, 11, 14], "over": [6, 8, 13, 15], "particularli": 6, "handi": 6, "compact": 6, "notat": [6, 9], "unusu": 6, "delete_record": 6, "feed": 6, "entir": [6, 8, 14, 15], "larg": [6, 11], "dramat": 6, "iterselect": 6, "machin": 6, "rewrit": 6, "repr_row": 6, "slice": 6, "wouldn": 6, "myrecord": 6, "del": [6, 9], "19": [6, 7, 11], "02": [6, 11], "permit": 6, "conveni": [6, 16], "appar": 6, "safer": [6, 11, 13], "meet": 6, "owner_id": 6, "nevertheless": 6, "tild": 6, "appear": [6, 11, 13], "random": [6, 8, 11, 12, 15], "overcom": 6, "concaten": [6, 9], "conjunct": 6, "condition": 6, "query1": 6, "query2": 6, "offset": [6, 7], "implicitli": [6, 11], "pagin": [6, 13], "trade": 6, "AND": 6, "OR": [6, 9, 11, 13], "negat": 6, "invert": [6, 11], "unari": 6, "overload": 6, "higher": 6, "comparison": [6, 11], "parenthes": 6, "william": 6, "ken": 6, "yes_or_no": 6, "curt": 6, "philip": 6, "modified_on": 6, "retain": 6, "first_row": 6, "last_row": 6, "obvious": [6, 11], "won": 6, "forget": [6, 13], "table_nam": 6, "optimis": 6, "rows_list": 6, "first_row_dict": 6, "themselv": [6, 8], "rows1": 6, "rows2": 6, "union": 6, "rows3": 6, "intersect": 6, "pointless": 6, "manipul": 6, "unchang": [6, 11], "obviou": [6, 7, 8, 12], "cache_db_select": 6, "lack": [6, 11, 14], "unit_pric": 6, "quantiti": [6, 11], "total_pric": 6, "rid": 6, "99": 6, "9": [6, 7, 11, 13, 14], "95": 6, "1l": 6, "wiki": [6, 7], "subsect": 6, "mark": [6, 12], "calcul": 6, "discounted_tot": 6, "discount": 6, "implicit": 6, "price": 6, "percentag": 6, "sai": [6, 12], "15": [6, 11, 12, 13], "myvirtualfield": 6, "virtualfield": 6, "order_item": 6, "setvirtualfield": 6, "myvirtualfields1": 6, "discounted_unit_pric": 6, "90": [6, 7], "myvirtualfields2": 6, "discounted_total_pric": 6, "lazy_total_pric": 6, "shorter": [6, 11], "owner": [6, 11], "intend": [6, 15], "cyclic": 6, "boat": 6, "shoe": 6, "acquir": 6, "transpar": [6, 8, 11], "observ": 6, "owner_id1": 6, "owner_id2": 6, "with_alia": 6, "he": 6, "clearli": [6, 15], "equal": [6, 7, 9, 12, 15], "realiz": 6, "intermedi": 6, "ownership": 6, "relationship": 6, "rewritten": 6, "co": [6, 11], "persons_and_th": 6, "lighter": [6, 14], "father_id": 6, "mother_id": 6, "father": 6, "temporari": 6, "fid": 6, "mid": 6, "claudia": 6, "marco": 6, "mother": 6, "AS": 6, "chosen": 6, "subtl": 6, "clear": [6, 11], "event_tim": 6, "sever": 6, "few": [6, 8, 12, 15], "xss": [6, 8, 9], "inject": [6, 8, 11, 16], "unauthor": 6, "percent": 6, "wild": 6, "card": 6, "ansi": 6, "collat": 6, "case_sensit": 6, "roughli": 6, "value1": 6, "value2": 6, "degre": 6, "2018": 6, "IN": 6, "bad_dai": 6, "jonathan": 6, "verbos": 6, "nested_select": 6, "averag": 6, "plu": [6, 8, 12, 13], "43": 6, "sysus": 6, "power": [6, 7, 12, 14, 15], "coa": 6, "mathemat": 6, "rescu": 6, "dumpfil": 6, "newlin": [6, 11], "export_to_csv_fil": 6, "explict": 6, "restor": 6, "somefil": 6, "field3": 6, "suffic": 6, "nid": 6, "across": [6, 8], "merg": 6, "64": [6, 8, 15], "stringio": 6, "set_head": 6, "getvalu": 6, "import_and_sync": 6, "_type": [6, 9, 11, 15], "_name": [6, 9, 11, 15], "var": [6, 9, 11, 14, 15], "rpc": 6, "therein": 6, "thead": 6, "tr": 6, "th": 6, "tbodi": 6, "w2p_odd": 6, "odd": [6, 8], "td": 6, "w2p_even": 6, "univers": [6, 9, 11], "f": [6, 12, 13, 14, 15], "parser": 6, "quotechar": 6, "quote_minim": 6, "oufil": 6, "quote_nonnumer": 6, "35": 6, "descript": [6, 7, 11, 12, 13], "2013": 6, "consult": 6, "is_in_set": 6, "toi": 6, "car": 6, "comma": [6, 15], "suffici": 6, "gender": 6, "doctor": 6, "reus": 6, "is_act": 6, "created_on": 6, "created_bi": 6, "modified_bi": 6, "payment": 6, "amount": 6, "anyobj": 6, "obj": [6, 8], "myobj": 6, "aid": 6, "myobjnam": 6, "sqlcustomtyp": 6, "six": 6, "_before_insert": 6, "_after_insert": 6, "_before_upd": 6, "_after_upd": 6, "_before_delet": 6, "_after_delet": 6, "pprint": 6, "before_insert": 6, "after_insert": 6, "oprow": 6, "before_upd": 6, "after_upd": 6, "before_delet": 6, "after_delet": 6, "pair": [6, 9], "_before_": 6, "fire": 6, "infinit": 6, "update_na": 6, "consequ": [6, 11, 15], "enable_record_vers": 6, "stored_item": 6, "hidden": [6, 11, 15], "_enable_record_vers": 6, "archive_db": 6, "archive_nam": 6, "stored_item_arch": 6, "current_record": 6, "archiv": 6, "hide": [6, 13], "tenanc": 6, "idea": 6, "repeat": [6, 11], "blog_post": 6, "subject": [6, 7, 12], "post_text": 6, "is_publ": 6, "public": 6, "_common_filt": 6, "phrase": 6, "enhanc": 6, "disallow": [6, 11], "ignore_common_filt": [6, 11], "asid": 6, "suppos": 6, "ip": [6, 11], "ip2int": 6, "sv": 6, "ipv4": [6, 11], "sp": 6, "split": [6, 7, 8, 11], "iip": 6, "int2ip": 6, "iv": 6, "ov": 6, "divmod": 6, "256": 6, "nativ": 6, "websit": [6, 15], "ipaddr": 6, "wikipedia": [6, 7], "91": 6, "198": 6, "174": 6, "192": [6, 11], "172": [6, 11], "217": 6, "11": [6, 11], "74": 6, "125": 6, "65": 6, "207": 6, "97": 6, "227": 6, "239": 6, "factori": [6, 9], "concern": 6, "awai": 6, "phase": 6, "db_a": 6, "db_b": 6, "distributed_transaction_commit": 6, "succe": 6, "mydb": 6, "2010": 6, "connectionpool": 6, "baseadapt": 6, "deleg": 6, "myvalu": 6, "_adapt": 6, "_listifi": 6, "list_of_field": 6, "moment": 6, "sqliteadapt": 6, "jdbcsqliteadapt": 6, "mysqladapt": 6, "postgresqladapt": 6, "jdbcpostgresqladapt": 6, "oracleadapt": 6, "mssqladapt": 6, "mssql2adapt": 6, "mssql3adapt": 6, "mssql4adapt": 6, "firebirdadapt": 6, "firebirdembeddedadapt": 6, "informixadapt": 6, "db2adapt": 6, "ingresadapt": 6, "ingresunicodeadapt": 6, "googlesqladapt": 6, "nosqladapt": 6, "googledatastoreadapt": 6, "cubridadapt": 6, "teradataadapt": 6, "sapdbadapt": 6, "couchdbadapt": 6, "imapadapt": 6, "mongodbadapt": 6, "verticaadapt": 6, "sybaseadapt": 6, "char": [6, 12], "varchar": 6, "longtext": 6, "credential_decod": 6, "pool_connect": 6, "foreign_key_check": 6, "sql_mode": 6, "no_backslash_escap": 6, "lastrowid": 6, "last_insert_id": 6, "fetchon": 6, "couchdb": 6, "ibm_db_dbi": 6, "db2ibm": 6, "db2pyodbc": 6, "firebird_embed": 6, "firebirdembed": 6, "googlemysql": 6, "googledatastor": 6, "googlepostgr": 6, "googlesql": 6, "se": 6, "informixs": 6, "ingresu": 6, "ingresunicod": 6, "jdbc": 6, "jdbcpostgr": 6, "jdbcsqlite": 6, "mongo": 6, "mssql1": 6, "mssql2": 6, "mssql1n": 6, "mssql3n": 6, "mssql4n": 6, "mssqln": 6, "postgres2": 6, "postgrenew": 6, "postgrepsyconew": 6, "postgres3": 6, "postgreboolean": 6, "postgrepsycoboolean": 6, "postgrepsyco": 6, "pytd": 6, "sap": 6, "spatialit": 6, "vertica": 6, "sqladapt": 6, "mysqldv": 6, "invis": 6, "decid": [6, 11, 13], "reinstat": 6, "rebuilt": 6, "awar": 6, "continu": [6, 8, 15], "unfortun": [6, 13], "aftermath": 6, "revert": 6, "py4web_filesystem": 6, "discard": 6, "consider": 6, "overhead": 6, "resultset": 6, "superseed": 6, "onward": 6, "deprec": [6, 11, 15], "circular": 6, "on_delete_act": 6, "run_in_transact": 6, "liststringproperti": 6, "rest": [7, 12], "cit0801": 7, "inspir": 7, "graphql": 7, "cit0802": 7, "less": [7, 11, 14], "spirit": 7, "impli": 7, "might": [7, 11], "isdir": [7, 11, 13], "job": [7, 11, 13], "strength": 7, "clark": [7, 13], "kent": [7, 13], "journalist": [7, 13], "peter": [7, 13], "park": [7, 13], "photograph": [7, 13], "bruce": [7, 13], "wayn": [7, 13], "ceo": [7, 13], "spiderman": [7, 13], "batman": [7, 11, 13], "flight": 7, "durabl": 7, "75": 7, "80": [7, 11], "70": 7, "allowed_pattern": 7, "rec_id": 7, "deni": 7, "record_id": [7, 15], "get_var": [7, 14], "post_var": [7, 14], "diagram": 7, "formdata": 7, "eq": 7, "stand": [7, 9, 11], "gt": [7, 9], "greater": 7, "record": [7, 11, 12, 13, 14, 15], "said": 7, "statu": 7, "200": [7, 11, 14, 15], "2019": 7, "05": 7, "19t05": 7, "38": 7, "00": 7, "132635": 7, "api_vers": 7, "2021": 7, "01": 7, "04t07": 7, "466030": 7, "regex": [7, 9, 11], "post_writ": 7, "referenced_bi": 7, "put_writ": 7, "178974": 7, "123218": 7, "collaps": [7, 9], "559918": 7, "201988": 7, "322494": 7, "309903": 7, "355181": 7, "34": 7, "974953": 7, "405515": 7, "366288": 7, "451907": 7, "453020": 7, "iso": 7, "8601": 7, "org": [7, 9, 15], "representational_state_transf": 7, "distinct": [8, 11], "renoir": 8, "newer": 8, "minor": [8, 14], "trickeri": 8, "seamlessli": 8, "embed": [8, 11], "angl": 8, "mix": 8, "soon": [8, 15], "indent": 8, "un": [8, 9, 10, 15], "keyword": [8, 9], "colon": 8, "begin": [8, 11, 12, 13], "emac": 8, "signifi": 8, "divis": [8, 9, 11], "br": [8, 9], "dom": [8, 16], "inspector": 8, "recurs": 8, "vulner": 8, "dummyrespons": 8, "new_app": [8, 9], "iter": [8, 11], "ul": [8, 11, 12, 15], "li": [8, 11, 12, 15], "row": [8, 9, 11, 13, 14, 15], "randint": [8, 12], "h2": [8, 11], "45": [8, 11], "incorrect": 8, "recal": 8, "itemize1": 8, "href": [8, 9, 12, 13], "itemize2": 8, "footer": [8, 9], "minimalist": [8, 14], "minimalist_pag": 8, "bytecod": 8, "pyc": 8, "sidebar_en": 8, "home": 8, "excerpt": 8, "sidebar": 8, "anywher": [8, 14], "worth": 8, "though": 8, "impos": 8, "signific": 8, "some_condit": 8, "this_templ": 8, "that_templ": 8, "encapsul": [8, 9], "menu": [8, 11, 12], "mysidebar": 8, "predefin": 8, "ride": 8, "doctyp": [8, 13], "meta": [8, 9], "viewport": 8, "width": [8, 11], "devic": 8, "shortcut": [8, 11], "icon": [8, 13], "aaabaaeaaqeaaaeaiaawaaaafgaaacgaaaabaaaaagaaaaeaiaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaapaaaaaa": 8, "stylesheet": [8, 13], "cdnj": [8, 13], "cloudflar": [8, 13], "ajax": [8, 13, 15], "font": [8, 11, 13], "awesom": [8, 13], "14": [8, 11, 13], "min": [8, 11, 13], "sha512": [8, 11], "1pkogiy59xj8co8": 8, "ne6fz": 8, "loazkji": 8, "ky8iq0g4b3cyey6wyhn3yt9pw0xpsrivlkmxe40ptknxrlnz9": 8, "fkdaog": 8, "crossorigin": 8, "margin": [8, 15], "top": [8, 10, 11, 12], "16px": 8, "8em": [8, 15], "page_head": 8, "navig": [8, 13, 15], "bar": [8, 13], "nav": 8, "black": [8, 11], "touch": 8, "hamburg": 8, "checkbox": [8, 9], "left": [8, 11, 13, 15], "page_left_menu": 8, "navbar": [8, 12], "primari": [8, 12], "change_password": [8, 12], "flash": [8, 15, 16], "pad": [8, 14, 15], "contect": 8, "gotta": 8, "page_script": 8, "html5": 8, "58": 8, "accordingli": 8, "54": 8, "Of": 8, "123": [9, 11], "myclass": 9, "thisisatest": 9, "metatag": 9, "tagger": 9, "xmlescap": 9, "shell": 9, "represent": 9, "ab": [9, 11], "yb": 9, "hyphen": 9, "_data": 9, "soap": 9, "whatev": [9, 15], "_xmln": 9, "xmln": 9, "permitted_tag": 9, "allowed_attribut": 9, "blockquot": 9, "cite": [9, 11], "alt": 9, "colspan": 9, "me": [9, 11, 13, 15], "_bgcolor": 9, "bgcolor": 9, "bold": 9, "emphas": 9, "_action": 9, "_method": 9, "subhead": 9, "ital": 9, "emb": 9, "_src": 9, "png": [9, 11], "_alt": 9, "radio": [9, 11], "_valu": [9, 11, 15], "_check": 9, "ok": [9, 14], "inlin": [9, 15], "block": [9, 12, 15], "white": [9, 15], "arrai": [9, 15], "_col": 9, "_row": 9, "col": 9, "typewrit": 9, "monospac": 9, "unord": 9, "_c": 9, "suppress": 9, "ref": [9, 11], "compound": 9, "nice": 9, "0x7fa533ff7640": 9, "karg": 9, "suppli": 9, "first_onli": 9, "z": [9, 11], "jqueri": [9, 11, 15], "selector": [9, 15], "selector1": 9, "selector2": 9, "selectorn": 9, "descend": 9, "ancestor": 9, "_u": 9, "_disabl": 9, "abc": [9, 11], "xyz": [9, 11], "callabl": [9, 11], "el": 9, "textual": 9, "efg": 9, "timeoffset": 9, "sidebar_menu": 9, "i18n": 10, "p10n": 10, "IT": 10, "fr": 10, "dog": [10, 11, 15], "cane": [10, 15], "cani": [10, 15], "tantissimi": 10, "bed": 10, "czech": 10, "postel": 10, "postel\u00ed": 10, "warp": 10, "max": [10, 11, 15], "find_match": 10, "discov": 10, "update_languag": 10, "german": 10, "known_express": 10, "high": [11, 12], "formstyl": [11, 13, 15], "formstyledefault": [11, 13], "dbio": 11, "keep_valu": 11, "form_nam": 11, "csrf_session": 11, "csrf_protect": 11, "lifespan": 11, "signing_info": 11, "formstylebulma": [11, 13, 15], "formstylebootstrap4": 11, "form_minim": 11, "product_nam": 11, "product_quant": 11, "not_accept": 11, "form_exampl": 11, "intention": 11, "form_bas": 11, "realnam": 11, "dc": [11, 12], "comic": 11, "marvel": 11, "dual": 11, "bottom": 11, "dropdown": [11, 13, 15], "prototyp": [11, 15], "your_app": 11, "form_upload": 11, "required_fold": 11, "checkboxwidget": 11, "datetimewidget": 11, "fileuploadwidget": 11, "listwidget": 11, "passwordwidget": 11, "radiowidget": 11, "selectwidget": 11, "textareawidget": 11, "improv": [11, 12, 13], "form_widget": 11, "form_custom_widget": 11, "mycustomwidget": 11, "no_tabl": [11, 15], "s_": [11, 15], "_placehold": [11, 15], "_titl": [11, 15], "_style": [11, 15], "mystyl": 11, "foreground": 11, "granulari": 11, "submiss": [11, 15], "detail_field": 11, "clash": 11, "isn": [11, 13], "surround": 11, "correctli": 11, "stuff": [11, 13], "param": [11, 12, 13, 14, 15], "_onclick": 11, "doh": 11, "cancel": [11, 15], "attr": [11, 13, 15], "histori": 11, "drop": 11, "error_messag": 11, "fist": 11, "fill": [11, 15], "letter": 11, "alphanumer": 11, "lower": 11, "phone": 11, "strict": 11, "substr": 11, "fit": 11, "boundari": 11, "maxsiz": 11, "255": 11, "minsiz": 11, "16": 11, "1kb": 11, "1mb": 11, "1048576": 11, "1024": 11, "cgi": 11, "fieldstorag": 11, "intuit": 11, "reject": 11, "scheme": 11, "domain": [11, 12], "rfc": 11, "2616": 11, "semant": [11, 12], "abbrevi": 11, "ca": 11, "2396": 11, "allowed_schem": 11, "exclud": 11, "prepend_schem": 11, "idn": 11, "3490": 11, "ascii": 11, "punycod": 11, "3492": 11, "bit": 11, "beyond": 11, "hex": 11, "0x4e86": 11, "becom": 11, "4e": 11, "86": 11, "ftp": 11, "maxlen": 11, "slug": 11, "dash": 11, "native_json": 11, "hh": 11, "mm": 11, "ss": 11, "yyyi": 11, "dd": 11, "symbol": 11, "year": [11, 15], "centuri": 11, "1963": 11, "dai": 11, "month": 11, "28": 11, "08": 11, "aug": 11, "august": 11, "hour": 11, "24": 11, "clock": 11, "12": 11, "am": 11, "pm": 11, "minut": 11, "59": 11, "2008": 11, "2009": 11, "empty_regex": 11, "dot": 11, "fall": 11, "arithmet": 11, "ie": 11, "convers": [11, 16], "prime": 11, "appl": 11, "banana": 11, "cherri": 11, "alphabet": 11, "hulk": 11, "06": 11, "multiselect": 11, "forbidden": 11, "clever": 11, "enough": [11, 12, 13], "entropi": 11, "53": 11, "pbkdf2": 11, "md5": 11, "hmac": 11, "thisisthekei": 11, "useless": [11, 14], "salt": 11, "constant": 11, "mysaltvalu": 11, "Or": 11, "somewhat": 11, "min_length": 11, "alg": 11, "filter_in": 11, "split_email": 11, "findal": 11, "mailto": 11, "textarea": 11, "blank": [11, 13], "onvalid": 11, "emails_onvalid": 11, "attempt": [11, 12], "through": 11, "dimens": 11, "height": [11, 13, 15], "bmp": 11, "gif": 11, "jpeg": 11, "taken": 11, "source1": 11, "lowercas": 11, "bypass": [11, 12, 13], "200x200": 11, "pixel": 11, "lastdot": 11, "tar": 11, "gz": 11, "thumbnail": 11, "jpg": 11, "older": 11, "regexlib": 11, "minip": 11, "maxip": 11, "is_localhost": 11, "is_priv": 11, "is_automat": 11, "lowest": 11, "highest": 11, "flag": 11, "168": 11, "199": 11, "forbid": 11, "169": 11, "254": 11, "network": [11, 12], "is_link_loc": 11, "is_reserv": 11, "is_multicast": 11, "is_rout": 11, "is_6to4": 11, "is_teredo": 11, "subnet": 11, "ipv6": 11, "alloc": 11, "reserv": 11, "fe80": 11, "ietf": 11, "multicast": 11, "ff00": 11, "6to4": 11, "2002": 11, "teredo": 11, "2001": 11, "member": [11, 12], "fb00": 11, "456": 11, "123456": 11, "synopsi": 11, "her": 11, "race": 11, "operationalerror": 11, "dbset": 11, "allowed_overrid": 11, "registration_stamp": 11, "timedelta": 11, "value_field": 11, "representing_field": 11, "fourth": 11, "ten": 11, "orderbi": [11, 12, 13, 15], "groupbi": 11, "useful": 11, "_and": 11, "check_nonnegative_quant": 11, "vital": 12, "multius": 12, "interchang": 12, "guidelin": 12, "approv": 12, "request_reset_password": 12, "reset_password": 12, "verify_email": 12, "change_email": 12, "allowed_act": 12, "verif": 12, "successfulli": 12, "challeng": 12, "two_factor_filt": 12, "sampl": 12, "user_outside_network": 12, "ipaddress": 12, "22": 12, "ip_list": 12, "ipv4network": 12, "ipv4address": 12, "mfa": 12, "send_two_factor_email": 12, "sender": 12, "from_address": 12, "youremail": 12, "flow": 12, "two_factor": 12, "endpoint": [12, 15], "_next_url": 12, "auth_plugin": 12, "hierarch": 12, "saml": 12, "oauth": 12, "adapt": [12, 15], "pam_plugin": 12, "pamplugin": 12, "register_plugin": 12, "mount": 12, "directori": 12, "ldap_plugin": 12, "ldapplugin": 12, "ldap_set": 12, "base_dn": 12, "cn": 12, "ubuntu": 12, "apt": 12, "libldap2": 12, "dev": 12, "libsasl2": 12, "oauth2googl": 12, "client_id": 12, "client_secret": 12, "callback_url": 12, "callback": [12, 15], "oauth2facebook": 12, "oauth2discord": 12, "discord_client_id": 12, "discord_client_secret": 12, "uri": 12, "discrimin": 12, "overkil": 12, "tagged_db": 12, "_tag": 12, "tagged_nam": 12, "dancer": 12, "teacher": 12, "auth_user_tagged_group": 12, "foot": 12, "not_author": 12, "find_by_tag": 12, "has_membership": 12, "school": 12, "physic": 12, "creativ": 12, "auth_group": 12, "zapper": 12, "zap_id": 12, "zap": 12, "belong": [12, 14], "further": 12, "corner": 13, "stone": 13, "sort": 13, "desc": 13, "search_queri": 13, "search_form": 13, "jpsteil": 13, "grid_tutori": 13, "doubt": 13, "preciou": 13, "hint": [13, 16], "gridclassstylebulma": 13, "grid_class_styl": 13, "gridclassstyl": 13, "val": [13, 15], "perfectli": 13, "usabl": 13, "refresh": 13, "lead": 13, "topic": [13, 16], "htmx": [13, 16], "field_id": 13, "show_id": 13, "pre_action_button": 13, "post_action_button": 13, "auto_process": [13, 15], "rows_per_pag": 13, "include_action_button_text": 13, "search_button_text": 13, "action_button": 13, "gather": 13, "dure": 13, "addition": 13, "fifth": 13, "clickabl": 13, "portion": 13, "primarili": 13, "class_styl": 13, "bootstrap": 13, "init": 13, "gridactionbutton": 13, "additional_class": 13, "additional_styl": 13, "override_class": 13, "override_styl": 13, "append_id": 13, "ignore_attribute_plugin": 13, "fa": 13, "calendar": 13, "id_field_nam": 13, "id_valu": 13, "querystr": 13, "10px": 13, "foo": 13, "coupl": [13, 15], "filter_out": 13, "compani": 13, "is_null_or": 13, "downfal": 13, "search_text": 13, "migrat": [14, 16], "predetermin": 14, "constrain": 14, "my_url_path": 14, "postfix": 14, "matter": 14, "wrapper": [14, 15], "hard": 14, "analogi": 14, "hous": 14, "preprocess": 14, "postprocess": 14, "carri": 14, "underli": 14, "exact": 14, "danger": 14, "pyweb": 14, "abil": 14, "requires_": 14, "rocket": 14, "301": 14, "sophist": 14, "file_path": 14, "csv": 14, "app_fold": 14, "requires_login": 14, "user_email": 14, "fetch": [14, 15], "websocket": 15, "async": 15, "great": 15, "react": 15, "reap": 15, "ecosystem": 15, "road": 15, "reactiv": 15, "emerg": 15, "leader": 15, "technic": 15, "transit": 15, "socket": 15, "hypertext": 15, "cit1601": 15, "frontend": 15, "hx": 15, "_hx": 15, "url_to_post_to": 15, "htmx_form_demo": 15, "htmx_list": 15, "htmx_form": 15, "cancel_attr": 15, "sidecar": 15, "unpkg": 15, "sh": 15, "mainten": 15, "anchor": 15, "fanci": 15, "htmx_grid": 15, "attributes_plugin": 15, "attributespluginhtmx": 15, "new_sidecar": 15, "edit_sidecar": 15, "functool": 15, "autocomplete_queri": 15, "fk_tabl": 15, "ktabl": 15, "fk_field": 15, "kfield": 15, "_autocomplete_search_field": 15, "sf": 15, "_search": 15, "len": 15, "data_label": 15, "htmxautocompletewidget": 15, "simple_queri": 15, "pop": 15, "todo": 15, "hidden_input": 15, "hidden_div": 15, "keyup": 15, "500m": 15, "s_autocomplete_result": 15, "search_valu": 15, "s_search": 15, "_autocomplet": 15, "onload": 15, "elt": 15, "queryselector": 15, "onkeydown": 15, "check_": 15, "s_down_kei": 15, "keycod": 15, "s_autocomplet": 15, "focu": 15, "selectedindex": 15, "formatt": 15, "formstylefactori": 15, "class_inner_except": 15, "vendor": 15, "vendor_typ": 15, "product_record": 15, "earlier": 15, "whichev": 15, "subqueri": 15, "builder": 15, "selected_el": 15, "queryselectoral": 15, "eval": 15, "sandbox": 15, "math": 15, "nicer": 15, "recereiv": 15, "get_cooki": 15, "register_vue_compon": 15, "lazili": 15, "upload_help": 15, "bind": 15, "my_id": 15, "reimplement": 15, "tanti": 15, "clientsid": 15, "serversid": 15, "debounc": 15, "setinterv": 15, "500": 15, "200m": 15, "onclick": 15, "1000m": 15, "tags_input": 15, "jsl": 15, "zip_cod": 15, "freetext": 15, "safari": 15, "edg": 15, "datalist": 15, "firfox": 15, "undocu": 15, "border": 15, "radiu": 15, "100px": 15, "111111": 15, "3em": 15, "2em": 15, "2px": 15, "pointer": 15, "opac": 15, "capit": 15, "tag_input": 15, "score_input": 15, "score": 15, "new_password": 15, "poor": 15, "man": 15, "trap": 15, "component_1": 15, "mycompon": 15, "blink": 15, "envelop": 15, "other_pag": 15, "acknowledg": 16, "procedur": 16, "scratch": 16, "urlsign": 16, "memoiz": 16, "raw": 16, "sql": 16, "export": 16, "gotcha": 16, "overview": 16, "asyncio": 16}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"what": 0, "i": [0, 9], "py4web": [0, 1, 6, 14, 15, 16], "acknowledg": 0, "help": 1, "resourc": 1, "hint": 1, "thi": 1, "manual": [1, 16], "The": [1, 3, 4, 5, 6, 7, 11, 13, 15], "googl": [1, 2, 6, 12], "group": [1, 6], "discord": [1, 12], "server": [1, 5, 6, 9], "tutori": 1, "video": 1, "sourc": [1, 2], "github": 1, "tip": 1, "prerequisit": [1, 2], "A": [1, 9, 11], "modern": 1, "python": 1, "workplac": 1, "debug": 1, "vscode": 1, "pycharm": 1, "how": 1, "contribut": 1, "instal": 2, "startup": 2, "understand": 2, "design": [2, 11], "support": [2, 6], "platform": 2, "setup": 2, "procedur": 2, "from": [2, 4, 6, 14], "binari": 2, "pip": 2, "us": [2, 5, 6, 8, 9, 12, 13, 15], "virtual": [2, 6], "environ": 2, "global": 2, "local": 2, "upgrad": 2, "first": [2, 4, 6], "run": [2, 6], "command": [2, 6], "line": 2, "option": [2, 9, 11], "call": [2, 14], "new_app": 2, "set_password": 2, "shell": [2, 6], "version": [2, 6], "special": [2, 11], "http": 2, "wsgi": 2, "deploy": 2, "gcloud": 2, "aka": 2, "gae": 2, "app": [2, 4], "engin": 2, "pythonanywher": 2, "com": 2, "docker": 2, "podman": 2, "ubuntu": 2, "dashboard": 3, "main": 3, "web": [3, 4], "page": [3, 4, 8], "login": 3, "creat": 4, "your": 4, "scratch": 4, "static": 4, "dynam": 4, "On": 4, "return": [4, 8, 14], "valu": [4, 6], "rout": 4, "request": 4, "object": [4, 12, 13, 15], "templat": [4, 5, 8, 13], "_scaffold": 4, "copi": [4, 6], "watch": 4, "file": [4, 10, 11, 14], "chang": 4, "fixtur": 5, "inject": [5, 9], "translat": [5, 10], "flash": [5, 14], "session": 5, "client": 5, "side": [5, 9], "cooki": 5, "memcach": 5, "redi": 5, "databas": [5, 6, 11], "anywher": 5, "share": 5, "condit": 5, "urlsign": 5, "dal": [5, 6], "auth": [5, 12, 14], "caveat": 5, "about": [5, 6], "custom": [5, 6, 9, 11, 13], "multipl": [5, 12], "cach": [5, 6], "memoiz": 5, "conveni": 5, "decor": 5, "abstract": 6, "layer": 6, "introduct": 6, "model": 6, "quick": 6, "tour": 6, "stand": 6, "alon": 6, "experi": 6, "constructor": [6, 11], "signatur": 6, "connect": 6, "string": [6, 15], "uri": 6, "paramet": [6, 11, 13], "pool": 6, "failur": 6, "attempt": 6, "lazi": 6, "tabl": [6, 9, 16], "less": 6, "applic": 6, "replic": 6, "reserv": 6, "keyword": 6, "quot": 6, "case": 6, "set": [6, 11, 13, 14], "make": 6, "secur": [6, 11], "other": [6, 11], "folder": 6, "locat": 6, "default": [6, 8], "migrat": 6, "commit": 6, "rollback": 6, "define_t": 6, "id": 6, "note": 6, "primari": 6, "kei": [6, 13], "plural": [6, 10], "singular": 6, "redefin": 6, "format": [6, 11, 15], "record": 6, "represent": 6, "rname": 6, "real": 6, "name": 6, "primarykei": 6, "legaci": 6, "fake_migr": 6, "table_class": 6, "sequence_nam": 6, "trigger_nam": 6, "polymodel": 6, "on_defin": 6, "ad": 6, "attribut": 6, "field": [6, 11, 13], "type": [6, 11], "valid": [6, 11], "time": [6, 11], "modif": 6, "more": 6, "upload": [6, 11], "fix": 6, "broken": 6, "control": 6, "summari": 6, "method": [6, 14], "insert": 6, "queri": 6, "row": 6, "update_or_insert": 6, "validate_and_insert": 6, "validate_and_upd": 6, "drop": 6, "tag": [6, 9, 11, 12], "raw": 6, "sql": 6, "executesql": 6, "_lastsql": 6, "index": 6, "gener": 6, "select": [6, 9], "an": 6, "iter": 6, "base": 6, "lower": 6, "memori": 6, "render": 6, "repres": 6, "shortcut": 6, "fetch": 6, "recurs": 6, "orderbi": 6, "groupbi": 6, "limitbi": 6, "distinct": 6, "have": 6, "orderby_on_limitbi": 6, "join": 6, "left": 6, "cacheabl": 6, "logic": 6, "oper": 6, "count": 6, "isempti": 6, "delet": 6, "updat": [6, 10], "express": 6, "update_record": 6, "dictionari": [6, 11], "last": 6, "as_dict": 6, "as_list": 6, "combin": 6, "find": [6, 9], "exclud": 6, "sort": [6, 11], "comput": 6, "new": 6, "style": [6, 9, 13], "experiment": 6, "old": 6, "relat": 6, "One": 6, "mani": 6, "inner": 6, "outer": 6, "self": 6, "refer": [6, 13, 16], "alias": 6, "like": 6, "ilik": 6, "regexp": 6, "startswith": 6, "endswith": 6, "contain": 6, "upper": 6, "year": 6, "month": 6, "dai": 6, "hour": 6, "minut": 6, "second": 6, "belong": 6, "sum": 6, "avg": 6, "min": 6, "max": 6, "len": 6, "substr": 6, "coalesc": 6, "coalesce_zero": 6, "export": 6, "import": 6, "data": 6, "csv": 6, "one": 6, "all": 6, "onc": 6, "remot": 6, "synchron": 6, "html": [6, 9], "xml": [6, 9], "advanc": [6, 11, 15], "featur": [6, 13], "list": 6, "inherit": 6, "filter_in": 6, "filter_out": 6, "callback": 6, "cascad": 6, "common": 6, "filter": [6, 13], "without": [6, 11], "defin": 6, "distribut": 6, "transact": 6, "db": 6, "anoth": 6, "gotcha": 6, "adapt": 6, "sqlite": 6, "mysql": 6, "mssql": 6, "microsoft": 6, "oracl": 6, "nosql": 6, "datastor": 6, "restapi": 7, "polici": 7, "action": [7, 12, 13], "get": 7, "practic": 7, "exampl": [7, 11, 13, 14, 15], "respons": 7, "yatl": [8, 9], "languag": 8, "basic": [8, 11, 13], "syntax": 8, "while": 8, "elif": 8, "els": 8, "try": 8, "except": 8, "final": 8, "def": 8, "inform": 8, "workflow": 8, "extend": 8, "includ": 8, "variabl": [8, 14], "function": [8, 11], "block": 8, "super": 8, "layout": 8, "standard": [8, 11], "structur": [8, 11], "mobil": 8, "develop": 8, "helper": 9, "overview": 9, "built": 9, "bodi": 9, "cat": 9, "div": 9, "em": 9, "form": [9, 11, 14, 15], "h1": 9, "h2": 9, "h3": 9, "h4": 9, "h5": 9, "h6": 9, "head": 9, "img": 9, "input": 9, "label": 9, "li": 9, "ol": 9, "p": 9, "pre": 9, "script": 9, "span": 9, "tr": 9, "td": 9, "tbodi": 9, "textarea": 9, "th": 9, "thead": 9, "titl": 9, "tt": 9, "ul": 9, "url": 9, "beautifi": 9, "dom": 9, "children": 9, "internation": 10, "minim": 11, "widget": [11, 15], "manipul": 11, "sidecar": 11, "text": 11, "is_alphanumer": 11, "is_low": 11, "is_upp": 11, "is_email": 11, "is_match": 11, "is_length": 11, "is_url": 11, "is_slug": 11, "is_json": 11, "date": 11, "is_tim": 11, "is_dat": 11, "is_datetim": 11, "is_date_in_rang": 11, "is_datetime_in_rang": 11, "rang": 11, "equal": 11, "is_equal_to": 11, "is_not_empti": 11, "is_null_or": 11, "is_empty_or": 11, "is_expr": 11, "is_decimal_in_rang": 11, "is_float_in_rang": 11, "is_int_in_rang": 11, "is_in_set": 11, "checkbox": 11, "tupl": 11, "complex": 11, "is_strong": 11, "crypt": 11, "is_list_of": 11, "is_list_of_email": 11, "any_of": 11, "is_imag": 11, "is_fil": 11, "is_upload_filenam": 11, "is_ipv4": 11, "is_ipv6": 11, "is_ipaddress": 11, "cleanup": 11, "is_not_in_db": 11, "is_in_db": 11, "authent": 12, "author": 12, "ui": 12, "insid": 12, "two": 12, "factor": 12, "two_factor_requir": 12, "two_factor_send": 12, "two_factor_tri": 12, "plugin": 12, "pam": 12, "ldap": 12, "oauth2": 12, "facebook": 12, "permiss": 12, "grid": [13, 14, 15], "search": 13, "crud": 13, "column": 13, "button": 13, "sampl": 13, "class": 13, "callabl": 13, "web2pi": 14, "simpl": 14, "convers": 14, "hello": 14, "world": 14, "redirect": 14, "arg": 14, "up": 14, "counter": 14, "view": 14, "access": 14, "o": 14, "topic": 15, "asyncio": 15, "htmx": 15, "usag": 15, "autocomplet": 15, "util": 15, "j": 15, "q": 15, "t": 15, "content": 16, "indic": 16}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"What is py4web?": [[0, "what-is-py4web"]], "Acknowledgments": [[0, "acknowledgments"]], "Help, resources and hints": [[1, "help-resources-and-hints"]], "Resources": [[1, "resources"]], "This manual": [[1, "this-manual"]], "The Google group": [[1, "the-google-group"]], "The Discord server": [[1, "the-discord-server"]], "Tutorials and video": [[1, "tutorials-and-video"]], "The sources on GitHub": [[1, "the-sources-on-github"]], "Hints and tips": [[1, "hints-and-tips"]], "Prerequisites": [[1, "prerequisites"]], "A modern python workplace": [[1, "a-modern-python-workplace"]], "Debugging py4web with VScode": [[1, "debugging-py4web-with-vscode"]], "Debugging py4web with PyCharm": [[1, "debugging-py4web-with-pycharm"]], "How to contribute": [[1, "how-to-contribute"]], "Installation and Startup": [[2, "installation-and-startup"]], "Understanding the design": [[2, "understanding-the-design"]], "Supported platforms and prerequisites": [[2, "supported-platforms-and-prerequisites"]], "Setup procedures": [[2, "setup-procedures"]], "Installing from binaries": [[2, "installing-from-binaries"]], "Installing from pip": [[2, "installing-from-pip"]], "Installing using a virtual environment": [[2, "installing-using-a-virtual-environment"]], "Installing from source (globally)": [[2, "installing-from-source-globally"]], "Installing from source (locally)": [[2, "installing-from-source-locally"]], "Upgrading": [[2, "upgrading"]], "First run": [[2, "first-run"]], "Command line options": [[2, "command-line-options"]], "call command option": [[2, "call-command-option"]], "new_app command option": [[2, "new-app-command-option"]], "run command option": [[2, "run-command-option"]], "set_password command option": [[2, "set-password-command-option"]], "setup command option": [[2, "setup-command-option"]], "shell command option": [[2, "shell-command-option"]], "version command option": [[2, "version-command-option"]], "Special installations": [[2, "special-installations"]], "HTTPS": [[2, "https"]], "WSGI": [[2, "wsgi"]], "Deployment on GCloud (aka GAE - Google App Engine)": [[2, "deployment-on-gcloud-aka-gae-google-app-engine"]], "Deployment on PythonAnywhere.com": [[2, "deployment-on-pythonanywhere-com"]], "Deployment on Docker/Podman": [[2, "deployment-on-docker-podman"]], "Deployment on Ubuntu": [[2, "deployment-on-ubuntu"]], "The Dashboard": [[3, "the-dashboard"]], "The main Web page": [[3, "the-main-web-page"]], "Login into the Dashboard": [[3, "login-into-the-dashboard"]], "Creating your first app": [[4, "creating-your-first-app"]], "From scratch": [[4, "from-scratch"]], "Static web pages": [[4, "static-web-pages"]], "Dynamic Web Pages": [[4, "dynamic-web-pages"]], "On return values": [[4, "on-return-values"]], "Routes": [[4, "routes"]], "The request object": [[4, "the-request-object"]], "Templates": [[4, "templates"]], "The _scaffold app": [[4, "the-scaffold-app"]], "Copying the _scaffold app": [[4, "copying-the-scaffold-app"]], "Watch for files change": [[4, "watch-for-files-change"]], "Fixtures": [[5, "fixtures"]], "Using Fixtures": [[5, "using-fixtures"]], "The Template fixture": [[5, "the-template-fixture"]], "The Inject fixture": [[5, "the-inject-fixture"]], "The Translator fixture": [[5, "the-translator-fixture"]], "The Flash fixture": [[5, "the-flash-fixture"]], "The Session fixture": [[5, "the-session-fixture"]], "Client-side session in cookies": [[5, "client-side-session-in-cookies"]], "Server-side session in memcache": [[5, "server-side-session-in-memcache"]], "Server-side session in Redis": [[5, "server-side-session-in-redis"]], "Server-side session in database": [[5, "server-side-session-in-database"]], "Server-side session anywhere": [[5, "server-side-session-anywhere"]], "Sharing sessions": [[5, "sharing-sessions"]], "The Condition fixture": [[5, "the-condition-fixture"]], "The URLsigner fixture": [[5, "the-urlsigner-fixture"]], "The DAL fixture": [[5, "the-dal-fixture"]], "The Auth fixture": [[5, "the-auth-fixture"]], "Caveats about fixtures": [[5, "caveats-about-fixtures"]], "Custom fixtures": [[5, "custom-fixtures"]], "Multiple fixtures": [[5, "multiple-fixtures"]], "Caching and Memoize": [[5, "caching-and-memoize"]], "Convenience Decorators": [[5, "convenience-decorators"]], "The Database Abstraction Layer (DAL)": [[6, "the-database-abstraction-layer-dal"]], "DAL introduction": [[6, "dal-introduction"]], "py4web model": [[6, "py4web-model"]], "Supported databases": [[6, "supported-databases"]], "The DAL: a quick tour": [[6, "the-dal-a-quick-tour"]], "Using the DAL \u201cstand-alone\u201d": [[6, "using-the-dal-stand-alone"]], "Experiment with the py4web shell": [[6, "experiment-with-the-py4web-shell"]], "DAL constructor": [[6, "dal-constructor"]], "DAL signature": [[6, "dal-signature"]], "Connection strings (the uri parameter)": [[6, "connection-strings-the-uri-parameter"]], "Connection pooling": [[6, "connection-pooling"]], "Connection failures (attempts parameter)": [[6, "connection-failures-attempts-parameter"]], "Lazy Tables": [[6, "lazy-tables"]], "Model-less applications": [[6, "model-less-applications"]], "Replicated databases": [[6, "replicated-databases"]], "Reserved keywords": [[6, "reserved-keywords"]], "Database quoting and case settings": [[6, "database-quoting-and-case-settings"]], "Making a secure connection": [[6, "making-a-secure-connection"]], "Other DAL constructor parameters": [[6, "other-dal-constructor-parameters"]], "Database folder location": [[6, "database-folder-location"]], "Default migration settings": [[6, "default-migration-settings"]], "commit and rollback": [[6, "commit-and-rollback"]], "Table constructor": [[6, "table-constructor"]], "define_table signature": [[6, "define-table-signature"]], "id: Notes about the primary key": [[6, "id-notes-about-the-primary-key"]], "plural and singular": [[6, "plural-and-singular"]], "redefine": [[6, "redefine"]], "format: Record representation": [[6, "format-record-representation"]], "rname: Real name": [[6, "rname-real-name"]], "primarykey: Support for legacy tables": [[6, "primarykey-support-for-legacy-tables"]], "migrate, fake_migrate": [[6, "migrate-fake-migrate"]], "table_class": [[6, "table-class"]], "sequence_name": [[6, "sequence-name"]], "trigger_name": [[6, "trigger-name"]], "polymodel": [[6, "polymodel"]], "on_define": [[6, "on-define"]], "Adding attributes to fields and tables": [[6, "adding-attributes-to-fields-and-tables"]], "Legacy databases and keyed tables": [[6, "legacy-databases-and-keyed-tables"]], "Field constructor": [[6, "field-constructor"]], "Field types and validators": [[6, "field-types-and-validators"]], "Run-time field and table modification": [[6, "run-time-field-and-table-modification"]], "More on uploads": [[6, "more-on-uploads"]], "Migrations": [[6, "migrations"]], "Fixing broken migrations": [[6, "fixing-broken-migrations"]], "Migration control summary": [[6, "migration-control-summary"]], "Table methods": [[6, "table-methods"]], "insert": [[6, "insert"]], "Query, Set, Rows": [[6, "query-set-rows"]], "update_or_insert": [[6, "update-or-insert"]], "validate_and_insert, validate_and_update": [[6, "validate-and-insert-validate-and-update"]], "drop": [[6, "drop"]], "Tagging records": [[6, "tagging-records"]], "Raw SQL": [[6, "raw-sql"]], "executesql": [[6, "executesql"]], "_lastsql": [[6, "lastsql"]], "Timing queries": [[6, "timing-queries"]], "Indexes": [[6, "indexes"]], "Generating raw SQL": [[6, "generating-raw-sql"]], "select command": [[6, "select-command"]], "Using an iterator-based select for lower memory use": [[6, "using-an-iterator-based-select-for-lower-memory-use"]], "Rendering rows using represent": [[6, "rendering-rows-using-represent"]], "Shortcuts": [[6, "shortcuts"]], "Fetching a Row": [[6, "fetching-a-row"]], "Recursive selects": [[6, "recursive-selects"]], "orderby, groupby, limitby, distinct, having, orderby_on_limitby, join, left, cache": [[6, "orderby-groupby-limitby-distinct-having-orderby-on-limitby-join-left-cache"]], "orderby": [[6, "orderby"]], "groupby, having": [[6, "groupby-having"]], "distinct": [[6, "distinct"]], "limitby": [[6, "limitby"]], "orderby_on_limitby": [[6, "orderby-on-limitby"]], "join, left": [[6, "join-left"]], "cache, cacheable": [[6, "cache-cacheable"]], "Logical operators": [[6, "logical-operators"]], "count, isempty, delete, update": [[6, "count-isempty-delete-update"]], "Expressions": [[6, "expressions"]], "case": [[6, "case"]], "update_record": [[6, "update-record"]], "Inserting and updating from a dictionary": [[6, "inserting-and-updating-from-a-dictionary"]], "first and last": [[6, "first-and-last"]], "as_dict and as_list": [[6, "as-dict-and-as-list"]], "Combining rows": [[6, "combining-rows"]], "find, exclude, sort": [[6, "find-exclude-sort"]], "Caching selects": [[6, "caching-selects"]], "Computed and Virtual fields": [[6, "computed-and-virtual-fields"]], "Computed fields": [[6, "computed-fields"]], "Virtual fields": [[6, "virtual-fields"]], "New style virtual fields (experimental)": [[6, "new-style-virtual-fields-experimental"]], "Old style virtual fields": [[6, "old-style-virtual-fields"]], "Joins and Relations": [[6, "joins-and-relations"]], "One to many relation": [[6, "one-to-many-relation"]], "Inner join": [[6, "inner-join"]], "Left outer join": [[6, "left-outer-join"]], "Grouping and counting": [[6, "grouping-and-counting"]], "Many to many relation": [[6, "many-to-many-relation"]], "Self-Reference and aliases": [[6, "self-reference-and-aliases"]], "Other operators": [[6, "other-operators"]], "like, ilike, regexp, startswith, endswith, contains, upper, lower": [[6, "like-ilike-regexp-startswith-endswith-contains-upper-lower"]], "year, month, day, hour, minutes, seconds": [[6, "year-month-day-hour-minutes-seconds"]], "belongs": [[6, "belongs"]], "sum, avg, min, max and len": [[6, "sum-avg-min-max-and-len"]], "Substrings": [[6, "substrings"]], "Default values with coalesce and coalesce_zero": [[6, "default-values-with-coalesce-and-coalesce-zero"]], "Exporting and importing data": [[6, "exporting-and-importing-data"]], "CSV (one Table at a time)": [[6, "csv-one-table-at-a-time"]], "CSV (all tables at once)": [[6, "csv-all-tables-at-once"]], "CSV and remote database synchronization": [[6, "csv-and-remote-database-synchronization"]], "HTML and XML (one Table at a time)": [[6, "html-and-xml-one-table-at-a-time"]], "Data representation": [[6, "data-representation"]], "Advanced features": [[6, "advanced-features"]], "list: and contains": [[6, "list-type-and-contains"]], "Table inheritance": [[6, "table-inheritance"]], "filter_in and filter_out": [[6, "filter-in-and-filter-out"]], "callbacks on record insert, delete and update": [[6, "callbacks-on-record-insert-delete-and-update"]], "Database cascades": [[6, "database-cascades"]], "Record versioning": [[6, "record-versioning"]], "Common filters": [[6, "common-filters"]], "Custom Field types": [[6, "custom-field-types"]], "Using DAL without define tables": [[6, "using-dal-without-define-tables"]], "Distributed transaction": [[6, "distributed-transaction"]], "Copy data from one db into another": [[6, "copy-data-from-one-db-into-another"]], "Gotchas": [[6, "gotchas"]], "Note on new DAL and adapters": [[6, "note-on-new-dal-and-adapters"]], "SQLite": [[6, "sqlite"]], "MySQL": [[6, "mysql"]], "Google SQL": [[6, "google-sql"]], "MSSQL (Microsoft SQL Server)": [[6, "mssql-microsoft-sql-server"]], "Oracle": [[6, "oracle"]], "Google NoSQL (Datastore)": [[6, "google-nosql-datastore"]], "The RestAPI": [[7, "the-restapi"]], "RestAPI policies and actions": [[7, "restapi-policies-and-actions"]], "RestAPI GET": [[7, "restapi-get"]], "RestAPI practical examples": [[7, "restapi-practical-examples"]], "The RestAPI response": [[7, "the-restapi-response"]], "YATL Template Language": [[8, "yatl-template-language"]], "Basic syntax": [[8, "basic-syntax"]], "for...in": [[8, "for-in"]], "while": [[8, "while"]], "if...elif...else": [[8, "if-elif-else"]], "try...except...else...finally": [[8, "try-except-else-finally"]], "def...return": [[8, "def-return"]], "Information workflow": [[8, "information-workflow"]], "extend and include": [[8, "extend-and-include"]], "Extending using variables": [[8, "extending-using-variables"]], "Template Functions": [[8, "template-functions"]], "block and super": [[8, "block-and-super"]], "Page layout standard structure": [[8, "page-layout-standard-structure"]], "Default page layout": [[8, "default-page-layout"]], "Mobile development": [[8, "mobile-development"]], "YATL helpers": [[9, "yatl-helpers"]], "Helpers overview": [[9, "helpers-overview"]], "Built-in helpers": [[9, "built-in-helpers"]], "XML": [[9, "xml"]], "A": [[9, "a"]], "BODY": [[9, "body"]], "CAT": [[9, "cat"]], "DIV": [[9, "div"]], "EM": [[9, "em"]], "FORM": [[9, "form"]], "H1, H2, H3, H4, H5, H6": [[9, "h1-h2-h3-h4-h5-h6"]], "HEAD": [[9, "head"]], "HTML": [[9, "html"]], "I": [[9, "i"]], "IMG": [[9, "img"]], "INPUT": [[9, "input"]], "LABEL": [[9, "label"]], "LI": [[9, "li"]], "OL": [[9, "ol"]], "OPTION": [[9, "option"]], "P": [[9, "p"]], "PRE": [[9, "pre"]], "SCRIPT": [[9, "script"]], "SELECT": [[9, "select"]], "SPAN": [[9, "span"]], "STYLE": [[9, "style"]], "TABLE, TR, TD": [[9, "table-tr-td"]], "TBODY": [[9, "tbody"]], "TEXTAREA": [[9, "textarea"]], "TH": [[9, "th"]], "THEAD": [[9, "thead"]], "TITLE": [[9, "title"]], "TT": [[9, "tt"]], "UL": [[9, "ul"]], "URL": [[9, "url"]], "Custom helpers": [[9, "custom-helpers"]], "TAG": [[9, "tag"]], "BEAUTIFY": [[9, "beautify"]], "Server-side DOM": [[9, "server-side-dom"]], "children": [[9, "children"]], "find": [[9, "find"]], "Using Inject": [[9, "using-inject"]], "Internationalization": [[10, "internationalization"]], "Pluralize": [[10, "pluralize"]], "Update the translation files": [[10, "update-the-translation-files"]], "Forms": [[11, "forms"]], "The Form constructor": [[11, "the-form-constructor"]], "A minimal form example without a database": [[11, "a-minimal-form-example-without-a-database"]], "Basic form example": [[11, "basic-form-example"]], "File upload field": [[11, "file-upload-field"]], "Widgets": [[11, "widgets"]], "Standard widgets": [[11, "standard-widgets"]], "Custom widgets": [[11, "custom-widgets"]], "Advanced form design": [[11, "advanced-form-design"]], "Form structure manipulation": [[11, "form-structure-manipulation"]], "Custom forms": [[11, "custom-forms"]], "The sidecar parameter": [[11, "the-sidecar-parameter"]], "Form validation": [[11, "form-validation"]], "Text format validators": [[11, "text-format-validators"]], "IS_ALPHANUMERIC": [[11, "is-alphanumeric"]], "IS_LOWER": [[11, "is-lower"]], "IS_UPPER": [[11, "is-upper"]], "IS_EMAIL": [[11, "is-email"]], "IS_MATCH": [[11, "is-match"]], "IS_LENGTH": [[11, "is-length"]], "IS_URL": [[11, "is-url"]], "IS_SLUG": [[11, "is-slug"]], "IS_JSON": [[11, "is-json"]], "Date and time validators": [[11, "date-and-time-validators"]], "IS_TIME": [[11, "is-time"]], "IS_DATE": [[11, "is-date"]], "IS_DATETIME": [[11, "is-datetime"]], "IS_DATE_IN_RANGE": [[11, "is-date-in-range"]], "IS_DATETIME_IN_RANGE": [[11, "is-datetime-in-range"]], "Range, set and equality validators": [[11, "range-set-and-equality-validators"]], "IS_EQUAL_TO": [[11, "is-equal-to"]], "IS_NOT_EMPTY": [[11, "is-not-empty"]], "IS_NULL_OR": [[11, "is-null-or"]], "IS_EMPTY_OR": [[11, "is-empty-or"]], "IS_EXPR": [[11, "is-expr"]], "IS_DECIMAL_IN_RANGE": [[11, "is-decimal-in-range"]], "IS_FLOAT_IN_RANGE": [[11, "is-float-in-range"]], "IS_INT_IN_RANGE": [[11, "is-int-in-range"]], "IS_IN_SET": [[11, "is-in-set"]], "Checkbox validation": [[11, "checkbox-validation"]], "Dictionaries and tuples with IS_IN_SET": [[11, "dictionaries-and-tuples-with-is-in-set"]], "Sorted options": [[11, "sorted-options"]], "IS_IN_SET and Tagging": [[11, "is-in-set-and-tagging"]], "Complexity and security validators": [[11, "complexity-and-security-validators"]], "IS_STRONG": [[11, "is-strong"]], "CRYPT": [[11, "crypt"]], "Special type validators": [[11, "special-type-validators"]], "IS_LIST_OF": [[11, "is-list-of"]], "IS_LIST_OF_EMAILS": [[11, "is-list-of-emails"]], "ANY_OF": [[11, "any-of"]], "IS_IMAGE": [[11, "is-image"]], "IS_FILE": [[11, "is-file"]], "IS_UPLOAD_FILENAME": [[11, "is-upload-filename"]], "IS_IPV4": [[11, "is-ipv4"]], "IS_IPV6": [[11, "is-ipv6"]], "IS_IPADDRESS": [[11, "is-ipaddress"]], "Other validators": [[11, "other-validators"]], "CLEANUP": [[11, "cleanup"]], "Database validators": [[11, "database-validators"]], "IS_NOT_IN_DB": [[11, "is-not-in-db"]], "IS_IN_DB": [[11, "is-in-db"]], "IS_IN_DB and Tagging": [[11, "is-in-db-and-tagging"]], "Validation functions": [[11, "validation-functions"]], "Authentication and authorization": [[12, "authentication-and-authorization"]], "Authentication using Auth": [[12, "authentication-using-auth"]], "Auth UI": [[12, "auth-ui"]], "Using Auth inside actions": [[12, "using-auth-inside-actions"]], "Two Factor Authentication": [[12, "two-factor-authentication"]], "two_factor_required": [[12, "two-factor-required"]], "two_factor_send": [[12, "two-factor-send"]], "two_factor_tries": [[12, "two-factor-tries"]], "Auth Plugins": [[12, "auth-plugins"]], "PAM": [[12, "pam"]], "LDAP": [[12, "ldap"]], "OAuth2 with Google": [[12, "oauth2-with-google"]], "OAuth2 with Facebook": [[12, "oauth2-with-facebook"]], "OAuth2 with Discord": [[12, "oauth2-with-discord"]], "Authorization using Tags": [[12, "authorization-using-tags"]], "Tags and Permissions": [[12, "tags-and-permissions"]], "Multiple Tags objects": [[12, "multiple-tags-objects"]], "Grid": [[13, "grid"]], "Key features": [[13, "key-features"]], "Basic grid example": [[13, "basic-grid-example"]], "The Grid object": [[13, "the-grid-object"]], "Searching and filtering": [[13, "searching-and-filtering"]], "CRUD settings": [[13, "crud-settings"]], "Custom columns": [[13, "custom-columns"]], "Using templates": [[13, "using-templates"]], "Customizing style": [[13, "customizing-style"]], "Custom Action Buttons": [[13, "custom-action-buttons"]], "Sample Action Button Class": [[13, "sample-action-button-class"]], "Using callable parameters": [[13, "using-callable-parameters"]], "Reference Fields": [[13, "reference-fields"]], "From web2py to py4web": [[14, "from-web2py-to-py4web"]], "Simple conversion examples": [[14, "simple-conversion-examples"]], "\u201cHello world\u201d example": [[14, "hello-world-example"]], "\u201cRedirect with variables\u201d example": [[14, "redirect-with-variables-example"]], "\u201cReturning variables\u201d example": [[14, "returning-variables-example"]], "\u201cReturning args\u201d example": [[14, "returning-args-example"]], "\u201cReturn calling methods\u201d example": [[14, "return-calling-methods-example"]], "\u201cSetting up a counter\u201d example": [[14, "setting-up-a-counter-example"]], "\u201cView\u201d example": [[14, "view-example"]], "\u201cForm and flash\u201d example": [[14, "form-and-flash-example"]], "\u201cgrid\u201d example": [[14, "grid-example"]], "\u201cAccessing OS files\u201d example": [[14, "accessing-os-files-example"]], "\u201cauth\u201d example": [[14, "auth-example"]], "Advanced topics and examples": [[15, "advanced-topics-and-examples"]], "py4web and asyncio": [[15, "py4web-and-asyncio"]], "htmx": [[15, "htmx"]], "htmx usage in Form": [[15, "htmx-usage-in-form"]], "htmx usage in Grid": [[15, "htmx-usage-in-grid"]], "Autocomplete Widget using htmx": [[15, "autocomplete-widget-using-htmx"]], "utils.js": [[15, "utils-js"]], "string.format": [[15, "string-format"]], "The Q object": [[15, "the-q-object"]], "The T object": [[15, "the-t-object"]], "py4web: the reference Manual": [[16, "py4web-the-reference-manual"]], "Contents:": [[16, null]], "Indices and tables": [[16, "indices-and-tables"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["chapter-01", "chapter-02", "chapter-03", "chapter-04", "chapter-05", "chapter-06", "chapter-07", "chapter-08", "chapter-09", "chapter-10", "chapter-11", "chapter-12", "chapter-13", "chapter-14", "chapter-15", "chapter-16", "index"], "filenames": ["chapter-01.rst", "chapter-02.rst", "chapter-03.rst", "chapter-04.rst", "chapter-05.rst", "chapter-06.rst", "chapter-07.rst", "chapter-08.rst", "chapter-09.rst", "chapter-10.rst", "chapter-11.rst", "chapter-12.rst", "chapter-13.rst", "chapter-14.rst", "chapter-15.rst", "chapter-16.rst", "index.rst"], "titles": ["What is py4web?", "Help, resources and hints", "Installation and Startup", "The Dashboard", "Creating your first app", "Fixtures", "The Database Abstraction Layer (DAL)", "The RestAPI", "YATL Template Language", "YATL helpers", "Internationalization", "Forms", "Authentication and authorization", "Grid", "From web2py to py4web", "Advanced topics and examples", "py4web: the reference Manual"], "terms": {"web": [0, 1, 2, 5, 6, 8, 12, 13, 14, 15, 16], "framework": [0, 1, 2, 4, 5, 11, 12, 13, 14, 15], "rapid": [0, 11, 15], "develop": [0, 1, 4, 5, 6, 12, 13, 14, 15], "effici": [0, 1, 5, 6, 14], "databas": [0, 1, 3, 4, 7, 12, 13, 14, 15, 16], "driven": 0, "applic": [0, 2, 3, 4, 5, 8, 11, 12, 13, 14, 15], "It": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15], "an": [0, 1, 2, 3, 4, 5, 8, 9, 11, 12, 13, 14, 15], "evolut": 0, "popular": [0, 6], "web2pi": [0, 1, 2, 3, 4, 6, 11, 12, 13, 16], "much": [0, 1, 4, 5, 6, 8, 11, 13, 14, 15], "faster": [0, 6, 8, 14], "slicker": 0, "Its": [0, 2, 6, 11, 13], "intern": [0, 1, 4, 5, 6, 8, 12, 13], "design": [0, 4, 6, 8, 12, 15, 16], "ha": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "been": [0, 2, 5, 6, 8, 11], "simplifi": [0, 4, 6, 8], "compar": [0, 6, 14], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "seen": [0, 5, 6, 7, 9, 11, 13, 15], "competitor": 0, "other": [0, 1, 2, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16], "like": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "django": [0, 1, 14], "flask": [0, 14], "inde": [0, 5], "serv": [0, 2, 4, 6, 12, 14, 15], "same": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "purpos": [0, 4, 5, 6, 9, 11, 12, 14], "yet": [0, 2, 4, 5, 6, 8, 11, 15], "aim": 0, "provid": [0, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "larger": 0, "featur": [0, 2, 4, 7, 8, 14, 16], "set": [0, 1, 2, 4, 5, 7, 8, 9, 10, 12, 15], "out": [0, 1, 6, 8, 15], "box": [0, 6, 11], "reduc": [0, 5, 15], "time": [0, 2, 4, 5, 8, 13, 14, 15], "new": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "app": [0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "from": [0, 1, 3, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16], "histor": [0, 6], "perspect": 0, "our": [0, 1, 2, 4, 5, 6, 9, 11, 15], "stori": [0, 5], "start": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "2007": 0, "when": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "wa": [0, 5, 6, 11, 12], "first": [0, 3, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16], "releas": [0, 2], "all": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "inclus": [0, 11], "solut": [0, 1, 2, 6, 15], "one": [0, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 15], "zip": [0, 2, 6, 11], "file": [0, 1, 2, 3, 5, 6, 8, 9, 12, 13, 15, 16], "contain": [0, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "python": [0, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "interpret": [0, 6, 7, 9], "base": [0, 2, 3, 4, 5, 7, 8, 11, 12, 13, 14, 15], "id": [0, 1, 2, 3, 5, 7, 8, 9, 11, 12, 13, 14, 15], "collect": [0, 2, 14], "battl": 0, "test": [0, 2, 4, 6, 8, 9, 11, 12, 13], "packag": [0, 6, 9], "work": [0, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "well": [0, 5, 6, 8, 11, 12, 15], "togeth": [0, 6, 8, 10, 13], "In": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "mani": [0, 1, 2, 4, 5, 7, 8, 11, 13, 14, 15], "wai": [0, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "immens": 0, "success": [0, 4, 5, 6, 7, 12, 15], "succeed": 0, "low": 0, "barrier": 0, "entri": [0, 6, 7, 10, 11, 13, 14], "veri": [0, 4, 5, 6, 8, 9, 11, 12, 14], "secur": [0, 2, 7, 12], "platform": [0, 1, 16], "remain": [0, 6, 11], "backward": [0, 6, 11], "compat": [0, 1, 6, 9, 11], "until": [0, 5, 6, 8, 11], "todai": [0, 11, 15], "alwai": [0, 2, 4, 5, 6, 8, 11, 15], "suffer": [0, 12], "problem": [0, 1, 6, 8, 12, 13, 15], "its": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "monolith": 0, "The": [0, 2, 8, 9, 10, 12, 14, 16], "most": [0, 3, 4, 5, 6, 11, 12, 13, 14, 15], "experienc": 0, "did": [0, 4, 6, 15], "understand": [0, 1, 4, 6, 7, 8, 13, 16], "how": [0, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16], "us": [0, 1, 3, 4, 7, 10, 11, 14, 16], "compon": [0, 3, 4, 5, 8, 9, 11, 12, 15], "outsid": [0, 5, 6, 11, 13, 14, 15], "third": [0, 5, 6, 11], "parti": [0, 5], "within": [0, 1, 4, 5, 6, 8, 9, 11, 13, 15], "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "thought": [0, 6, 12], "perfect": 0, "tool": [0, 6, 12, 15], "have": [0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "broken": [0, 11], "piec": [0, 5, 6, 8, 11], "becaus": [0, 2, 4, 5, 6, 8, 9, 10, 11, 13, 15], "would": [0, 5, 6, 8, 9, 11, 13, 15], "compromis": 0, "turn": [0, 4, 6, 12, 13, 15], "were": [0, 4, 6], "wrong": [0, 5, 6], "plai": [0, 15], "import": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "henc": [0, 2, 4, 5, 6, 11], "sinc": [0, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14], "2015": 0, "three": [0, 5, 6], "front": [0, 8, 11, 15], "port": [0, 2, 3, 5, 6, 14], "3": [0, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "broke": 0, "modul": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 16], "independ": [0, 5, 6, 12], "reassembl": 0, "some": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 14], "those": [0, 2, 5, 6, 8, 9, 12, 14, 15], "more": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "modular": [0, 6, 8, 14], "than": [0, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15], "repackag": 0, "complet": [0, 6, 8, 9, 11, 12], "redesign": 0, "them": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14], "case": [0, 1, 2, 3, 4, 5, 8, 9, 11, 12, 13, 14, 15], "better": [0, 1, 2, 4, 6, 13, 14], "function": [0, 2, 4, 5, 6, 7, 9, 13, 14, 15], "remov": [0, 2, 4, 6, 9, 11, 12], "ad": [0, 2, 5, 10, 11, 12, 13, 15], "tri": [0, 6, 14], "preserv": [0, 5], "syntax": [0, 1, 4, 5, 6, 7, 9, 11, 12, 14, 15, 16], "user": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16], "love": 0, "here": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], "explicit": [0, 2, 4, 5, 6, 11, 12], "list": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 15], "see": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15], "detail": [0, 1, 2, 5, 6, 7, 8, 9, 11, 13, 15], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "come": [0, 4, 5, 6, 8, 11, 12, 13, 14, 15], "unlik": [0, 2, 4, 6, 7, 8, 14, 15], "requir": [0, 1, 2, 4, 5, 6, 7, 11, 12, 13, 14, 15], "instal": [0, 1, 3, 4, 5, 6, 12, 16], "pip": [0, 1, 6], "depend": [0, 2, 3, 4, 5, 6, 8, 11, 13, 14], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "manag": [0, 1, 2, 3, 4, 5, 6, 11, 12], "txt": [0, 2, 4, 6], "regular": [0, 2, 4, 6, 7, 8, 10, 11, 13, 14, 15], "thi": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "differ": [0, 2, 5, 6, 8, 10, 11, 12, 13, 14, 15], "particular": [0, 1, 6, 11, 13, 14, 15], "ditch": 0, "custom": [0, 2, 4, 8, 14, 15, 16], "reli": [0, 4, 6], "now": [0, 2, 4, 5, 6, 8, 11, 13, 15], "exclus": [0, 5, 6, 11, 12], "mechan": [0, 5, 6, 8, 9, 12, 14], "multipl": [0, 1, 2, 4, 6, 8, 9, 10, 11, 14, 15, 16], "concurr": [0, 2, 6, 11, 15], "long": [0, 11], "submodul": 0, "ombott": [0, 4, 14], "spin": [0, 4], "off": [0, 2, 4, 6, 13, 15], "bottl": [0, 4, 5, 8, 14], "request": [0, 1, 2, 5, 6, 7, 11, 12, 13, 14, 15], "object": [0, 5, 6, 7, 8, 9, 10, 11, 14, 16], "rout": [0, 3, 5, 13, 14, 15], "doe": [0, 2, 5, 6, 8, 11, 12, 13, 14, 15], "creat": [0, 1, 2, 3, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16], "environ": [0, 1, 4, 5, 6, 14], "everi": [0, 2, 4, 5, 6, 12, 13, 14, 15], "introduc": [0, 8], "concept": [0, 12], "fixtur": [0, 2, 4, 6, 9, 12, 14, 16], "explicitli": [0, 2, 5, 6, 8, 9, 11], "declar": [0, 4, 5, 6], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "need": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "re": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "initi": [0, 2, 4, 5, 8, 11], "http": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "arriv": [0, 6], "cleanup": 0, "make": [0, 1, 2, 5, 8, 9, 10, 11, 12, 13, 14, 15], "session": [0, 2, 4, 6, 9, 11, 12, 13, 14, 15, 16], "": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], "strong": [0, 9, 12], "encrypt": [0, 2, 5], "data": [0, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16], "longer": [0, 6], "store": [0, 2, 5, 6, 9, 11, 12, 14, 15], "system": [0, 2, 5, 6, 9, 12, 15], "perform": [0, 3, 5, 6, 11, 12, 14], "issu": [0, 3, 6], "cooki": [0, 4, 6, 15], "redi": 0, "memcach": [0, 6], "option": [0, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16], "also": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "limit": [0, 5, 6, 7, 8, 11, 12, 14, 15], "json": [0, 1, 2, 4, 5, 6, 7, 10, 11, 14, 15], "serializ": [0, 5, 6, 9], "built": [0, 1, 4, 6, 8, 11, 13, 15, 16], "ticket": [0, 3, 6], "global": [0, 5, 6, 8, 12, 14, 15], "per": [0, 4, 5, 7, 13], "filesystem": [0, 4, 5, 6], "individu": [0, 2, 5, 6, 7, 8, 11], "thei": [0, 2, 4, 5, 6, 7, 8, 11, 12, 14, 15], "singl": [0, 2, 5, 6, 7, 8, 9, 11, 12, 13], "pydal": [0, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15], "leverag": 0, "restapi": [0, 3, 16], "yatl": [0, 4, 5, 6, 11, 13, 15, 16], "templat": [0, 9, 11, 12, 14, 15, 16], "languag": [0, 1, 4, 5, 10, 14, 15, 16], "default": [0, 2, 3, 4, 5, 7, 9, 11, 12, 13, 14, 15], "squar": [0, 8], "bracket": [0, 8, 11], "delimit": [0, 5, 6, 8, 14], "avoid": [0, 1, 2, 5, 6, 8, 11], "conflict": [0, 2, 4, 6], "model": [0, 3, 4, 7, 9, 13, 14, 15], "j": [0, 4, 5, 8, 10, 14, 16], "vue": [0, 4, 15], "angular": [0, 15], "includ": [0, 4, 5, 6, 7, 9, 11, 13, 14, 15], "subset": [0, 6, 11], "helper": [0, 4, 5, 6, 8, 11, 13, 14, 16], "plural": [0, 4, 5, 13, 14, 15, 16], "librari": [0, 2, 4, 6, 10, 11, 12, 14, 15], "internation": [0, 4, 5, 11, 14, 16], "practic": [0, 6, 8, 11, 14, 16], "expos": [0, 3, 4, 5, 6, 7, 12], "t": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14], "similar": [0, 4, 5, 6, 9, 11, 14], "cach": [0, 2, 4, 11, 16], "flexibl": [0, 2, 6, 12, 13, 15], "capabl": [0, 13, 15], "dashboard": [0, 2, 4, 6, 8, 11, 16], "replac": [0, 2, 4, 6, 8, 9, 11, 13, 15], "admin": [0, 6, 14], "upload": [0, 4, 14], "edit": [0, 2, 3, 4, 8, 9, 11, 12, 13, 14, 15], "interfac": [0, 3, 5, 6, 13, 14, 15], "appadmin": [0, 6], "form": [0, 5, 6, 7, 10, 12, 13, 16], "grid": [0, 16], "sqlform": [0, 11, 14], "auth": [0, 2, 4, 6, 8, 9, 15, 16], "easier": [0, 6, 7, 8], "extend": [0, 5, 6, 12, 14, 15], "basic": [0, 1, 5, 6, 15, 16], "regist": [0, 4, 5, 6, 8, 12, 14], "login": [0, 2, 4, 5, 6, 8, 11, 12, 14, 16], "logout": [0, 8, 12], "chang": [0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "password": [0, 2, 3, 5, 6, 8, 11, 12, 14, 15], "profil": [0, 8, 12, 14], "integr": [0, 1, 8, 15], "pam": [0, 5], "saml2": 0, "ldap": [0, 5], "oauth2": [0, 5], "googl": [0, 3, 5, 8, 11, 13], "facebook": [0, 5], "twitter": [0, 5, 12], "tag": [0, 5, 7, 8, 14, 15, 16], "group": [0, 2, 3, 5, 12, 14], "search": [0, 1, 2, 3, 6, 9, 11, 12, 16], "appli": [0, 5, 6, 11, 12, 13, 15], "permiss": [0, 5, 6, 14], "membership": [0, 5, 11, 12, 14], "interact": [0, 5], "gener": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "These": [0, 5, 6, 9, 11, 13], "api": [0, 6, 7, 9, 11, 12, 14, 15], "allow": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15], "server": [0, 2, 3, 4, 7, 8, 12, 14, 15, 16], "polici": [0, 16], "about": [0, 7, 12, 13, 14, 15, 16], "oper": [0, 3, 5, 10, 11, 12, 16], "client": [0, 7, 11, 12, 15], "give": [0, 2, 4, 5, 6, 8, 11, 12, 13], "constraint": [0, 6], "two": [0, 1, 2, 4, 5, 6, 8, 11, 13, 14, 15], "main": [0, 1, 2, 4, 6, 8, 13, 14, 15, 16], "mtabl": 0, "customiz": [0, 11, 13], "goal": 0, "easi": [0, 5, 6, 8, 9, 11], "access": [0, 2, 4, 5, 6, 9, 11, 12, 15], "while": [0, 5, 6, 7, 11, 12, 14], "produc": [0, 2, 5, 6, 8, 9, 11, 12], "fast": [0, 4, 15], "thank": [0, 6, 9], "everyon": [0, 1], "who": [0, 12], "contribut": [0, 16], "project": [0, 2, 4, 5, 6], "especi": [0, 2, 5, 6, 11, 12], "massimo": [0, 6], "di": [0, 5], "pierro": 0, "luca": [0, 1], "de": [0, 1, 6, 10], "alfaro": [0, 1], "cassio": 0, "botaro": 0, "dan": 0, "carrol": 0, "jim": [0, 1, 13], "steil": [0, 1, 13], "john": [0, 6], "m": [0, 2, 6, 9, 11], "wolf": 0, "micah": 0, "beaslei": 0, "nico": 0, "zanferrari": 0, "pirsch": 0, "sugizo": 0, "valq7711": [0, 4], "kevin": 0, "keller": 0, "sam": 0, "logo": [0, 8, 9], "special": [0, 4, 5, 6, 8, 9, 10, 12, 14, 16], "offici": [0, 6, 11, 15], "friendli": [0, 5, 8], "call": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], "axel": 0, "axolotl": 0, "magic": 0, "repres": [0, 8, 11], "sens": [0, 6, 11, 12], "kind": [0, 4], "believ": [0, 5], "cornerston": 0, "grow": [0, 6, 15], "commun": [0, 5, 6], "ve": [1, 2, 3, 5, 8, 9, 11, 13, 15], "made": [1, 2, 6, 8, 11, 13], "best": [1, 2, 5, 6, 10, 13], "simpl": [1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16], "clean": [1, 9], "But": [1, 2, 4, 5, 6, 8, 9, 11, 13, 15], "know": [1, 2, 5, 6, 8, 13], "program": [1, 2, 3, 6, 8, 9, 11, 15], "i": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16], "daunt": 1, "task": [1, 4, 5, 6, 12], "open": [1, 2, 3, 4, 5, 6, 9], "mind": [1, 4, 6, 7, 8, 11], "abl": [1, 2, 5, 6, 11], "jump": 1, "frequent": [1, 6, 11], "without": [1, 2, 8, 9, 12, 13, 15, 16], "being": [1, 5, 6, 7, 8, 11, 15], "lost": [1, 5, 6, 14], "html": [1, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15], "javascript": [1, 4, 7, 9, 15], "css": [1, 4, 5, 8, 9, 11, 12, 13, 15], "even": [1, 4, 5, 6, 8, 9, 11, 13, 14], "don": [1, 2, 3, 4, 6, 8, 11, 12, 13], "scare": 1, "ll": [1, 2, 3, 5, 6, 8, 11, 13, 15], "assist": 1, "side": [1, 6, 15, 16], "journei": 1, "And": [1, 4, 5, 6, 11, 12, 13, 15], "valuabl": 1, "go": [1, 2, 4, 6, 8, 13, 15], "show": [1, 2, 4, 5, 6, 8, 11, 12, 13], "refer": [1, 5, 7, 8, 11], "avail": [1, 2, 6, 8, 9, 12, 14, 15], "onlin": [1, 6], "com": [1, 3, 4, 8, 9, 12, 13, 15], "_document": [1, 3], "static": [1, 8, 9, 14, 16], "index": [1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16], "where": [1, 2, 4, 6, 7, 8, 11, 12, 14, 15], "find": [1, 2, 4, 8, 10, 11, 12, 13], "pdf": [1, 11], "ebook": 1, "version": [1, 3, 5, 7, 8, 11, 15], "written": [1, 8, 11, 13], "restructuredtext": 1, "sphinx": 1, "There": [1, 2, 5, 6, 8, 12, 13, 15], "dedic": [1, 4, 5, 9, 14], "mail": [1, 3, 6, 11], "host": [1, 2, 5, 11, 12], "g": [1, 6, 9, 11], "discuss": [1, 3, 6, 8, 9, 11], "For": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15], "ani": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "should": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "face": [1, 6], "right": [1, 2, 3, 5, 6, 8], "place": [1, 5, 6, 8, 11, 13, 15], "quick": [1, 11], "question": [1, 2, 6], "chat": 1, "free": [1, 5, 6, 12], "could": [1, 2, 4, 6, 8, 9, 11, 12, 14], "usual": [1, 2, 5, 6, 7, 8, 9, 11], "hang": 1, "channel": 1, "learn": [1, 6], "site": [1, 2, 4, 5, 6, 9, 13, 15], "lot": [1, 4, 6], "excel": [1, 13], "train": 1, "cours": [1, 8], "2020": 1, "uc": 1, "santa": 1, "cruz": 1, "blog": [1, 6, 9], "andrew": 1, "gavgavian": 1, "replic": [1, 5], "famou": 1, "corei": 1, "schafer": 1, "seri": 1, "south": 1, "breez": 1, "enterpris": [1, 12], "demo": [1, 2, 15], "around": [1, 6, 14], "structur": [1, 4, 5, 6, 10, 12, 13, 14, 16], "microsoft": [1, 12], "northwind": 1, "convert": [1, 4, 6, 9, 11], "sqlite": [1, 4, 5, 7, 11, 12, 13], "view": [1, 5, 6], "final": [1, 2, 4, 6, 10, 13], "result": [1, 6, 7, 8, 11, 13, 15], "last": [1, 5, 8, 11, 12, 13, 15], "least": [1, 2, 6, 11, 14, 15], "bsd": 1, "v3": 1, "licens": 1, "mean": [1, 2, 3, 5, 6, 8, 11, 12, 14], "read": [1, 4, 5, 6, 7, 13, 15], "studi": 1, "experi": [1, 11, 12], "yourself": [1, 2, 11, 13], "paragraph": [1, 5, 9, 11, 13], "preliminari": 1, "suggest": [1, 6, 11], "befor": [1, 2, 5, 6, 8, 9, 11, 12, 13], "order": [1, 2, 4, 5, 6, 7, 9, 11, 13, 14], "knowledg": 1, "book": [1, 6], "choos": [1, 11, 12], "what": [1, 4, 5, 6, 8, 11, 12, 14, 15, 16], "decor": [1, 4, 6, 14, 16], "mileston": 1, "fulli": [1, 4, 5, 6, 11], "follow": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "chapter": [1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14], "code": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "your": [1, 2, 3, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16], "comput": [1, 16], "setup": [1, 3, 4, 12, 13, 15, 16], "plan": [1, 15], "do": [1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "safe": [1, 5, 6, 9, 13, 14], "run": [1, 3, 4, 5, 8, 12, 14, 16], "exampl": [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16], "littl": [1, 5, 6], "strongli": [1, 5, 11, 13], "check": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14], "lint": 1, "visual": 1, "nowadai": 1, "multi": [1, 2, 6, 14], "choic": [1, 4, 11, 13], "studio": 1, "aka": 1, "jetbrain": 1, "deal": [1, 6, 15], "complex": [1, 2, 4, 5, 6, 8, 9, 12, 14, 15], "reliabl": 1, "virtual": [1, 16], "virtualenv": [1, 2], "introduct": [1, 2, 16], "mess": 1, "up": [1, 2, 5, 6, 8, 12, 15], "git": [1, 2], "keep": [1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 14], "track": [1, 6, 14], "save": [1, 2, 4, 5, 6, 10, 11], "gitlat": 1, "bitbucket": 1, "editor": [1, 8], "highlight": [1, 8], "highli": [1, 13], "recommend": [1, 5, 6, 11], "quit": [1, 2, 5, 7, 8, 11, 13], "If": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "just": [1, 2, 4, 5, 6, 7, 8, 11, 13, 15], "folder": [1, 2, 3, 4, 5, 7, 10, 11, 13, 14], "add": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "arg": [1, 2, 6], "your_full_path_to_py4web": 1, "py": [1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15], "launch": [1, 2], "configur": [1, 2, 5, 6, 11, 12, 14], "note": [1, 2, 5, 8, 9, 11, 14, 15], "window": [1, 2, 4, 5, 6, 8, 11], "paramet": [1, 2, 4, 5, 12, 15], "must": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14], "forward": [1, 3], "slash": [1, 4, 5, 12], "onli": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "c": [1, 2, 3, 5, 6, 8, 9, 11, 14], "your_nam": [1, 15], "instead": [1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "copi": [1, 2, 3, 8, 9, 13, 16], "standard": [1, 2, 3, 6, 7, 12, 13, 14, 15, 16], "launcher": 1, "insid": [1, 2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "renam": [1, 7], "error": [1, 2, 3, 5, 6, 7, 8, 9, 11, 14, 15], "later": [1, 2, 4, 5, 6, 8, 9, 11, 12, 13], "usr": 1, "bin": [1, 2], "env": [1, 14], "python3": [1, 2], "core": [1, 2, 4, 5, 11], "cli": [1, 2], "both": [1, 2, 4, 5, 6, 8, 11, 14], "get": [1, 2, 4, 5, 6, 8, 11, 12, 13, 14, 15, 16], "gevent": [1, 2], "true": [1, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "enabl": [1, 5, 6, 7, 9, 12, 14, 15], "build": [1, 2, 4, 5, 6, 9, 11, 13, 15], "execut": [1, 2, 5, 6, 8, 9, 11, 14, 15], "deploy": 1, "debugg": [1, 14], "support": [1, 4, 5, 8, 9, 10, 11, 12, 14, 15, 16], "effort": 1, "particip": 1, "try": [1, 2, 5, 6, 11, 12], "answer": 1, "submit": [1, 5, 6, 9, 11, 12, 13, 15], "bug": [1, 3, 6], "pull": [1, 6], "repositori": [1, 2, 3], "wish": [1, 6, 11, 15], "correct": [1, 6, 12], "expand": [1, 3], "translat": [1, 2, 4, 6, 8, 11, 14, 15, 16], "foreign": [1, 13], "inform": [1, 5, 6, 7, 11, 12, 14, 16], "directli": [1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15], "specif": [1, 2, 5, 6, 7, 8, 9, 11, 12, 14, 15], "readm": [1, 4, 11], "realli": [1, 4, 6], "rst": 1, "doc": 1, "browser": [1, 2, 3, 5, 7, 8, 13, 15], "onc": [1, 2, 5, 9, 11, 12, 13, 15], "pr": 1, "accept": [1, 2, 4, 5, 6, 9, 10, 11, 14, 15], "master": [1, 2, 6, 13], "branch": [1, 2], "reflect": [1, 6], "page": [1, 5, 6, 9, 11, 12, 13, 14, 15, 16], "epub": 1, "next": [1, 2, 5, 6, 8, 11], "output": [1, 2, 4, 5, 6, 7, 8, 9, 11, 15], "everyth": [2, 4, 14], "els": [2, 4, 6, 11, 12, 13, 14, 15], "charg": [2, 14], "reason": [2, 5, 6, 7, 13, 14], "thing": [2, 5, 6, 14], "py4web": [2, 3, 4, 5, 7, 8, 9, 11, 12, 13], "download": 2, "pypi": 2, "github": [2, 3, 4, 6, 13], "want": [2, 4, 5, 6, 8, 9, 11, 13, 15], "exist": [2, 5, 6, 11, 12, 13, 15], "scaffold": [2, 4, 5, 6, 8, 14, 15], "under": [2, 3, 4, 5, 6, 11], "process": [2, 4, 5, 6, 8, 11, 12, 13, 14, 15], "address": [2, 6, 11, 12], "each": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "fine": [2, 12, 13], "maco": 2, "linux": 2, "7": [2, 7, 8, 11, 14], "advanc": [2, 12, 13, 16], "except": [2, 4, 5, 6, 9, 11, 12, 15], "four": [2, 6], "altern": [2, 5, 6, 8, 11, 15], "level": [2, 6, 7, 10, 11, 12], "difficulti": 2, "let": [2, 6, 7, 11, 15], "look": [2, 3, 5, 6, 7, 9, 11, 12], "pro": 2, "con": 2, "real": [2, 4, 7, 8, 11], "bunch": 2, "modifi": [2, 4, 6, 7, 8, 11, 13, 14, 15], "anyhow": 2, "simplest": [2, 4], "newbi": 2, "student": 2, "pre": [2, 4, 5, 6, 13], "nor": [2, 6, 11], "administr": 2, "On": [2, 6, 11, 12, 15], "hand": [2, 6, 11, 15], "experiment": [2, 5], "old": [2, 5, 11, 14], "difficult": [2, 15], "latest": [2, 6, 14], "extern": [2, 6], "unzip": 2, "With": [2, 6, 11, 12, 15], "type": [2, 4, 5, 7, 8, 9, 12, 13, 15], "rememb": [2, 3, 5, 6, 11], "document": [2, 3, 5, 6, 8, 9, 11, 15], "notic": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "correspond": [2, 3, 4, 6, 9, 10, 11, 12, 13, 14], "stabl": 2, "although": [2, 6, 8, 11], "date": [2, 6, 13], "quickli": [2, 11, 13], "dir": [2, 11, 15], "specifi": [2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "full": [2, 4, 6, 8, 11, 13, 15], "8": [2, 6, 7, 11], "path": [2, 4, 5, 6, 7, 10, 11, 13, 14, 15], "asset": 2, "after": [2, 3, 5, 6, 8, 11, 12, 13], "given": [2, 5, 6, 8, 11], "ex": 2, "point": [2, 3, 4, 5, 6, 7, 8, 11, 13, 14], "mistak": 2, "A": [2, 4, 5, 6, 7, 8, 12, 13, 14, 15, 16], "sure": [2, 3, 4, 5, 6, 10, 11, 15], "prevent": [2, 5, 6, 8, 9, 11, 15], "unwant": [2, 6], "good": [2, 3, 11], "habit": 2, "still": [2, 5, 6, 9, 11, 13, 14], "discoveri": 2, "instruct": [2, 11], "activ": [2, 6, 12], "venv": 2, "tradit": [2, 6], "normal": [2, 4, 5, 6, 8, 9, 11, 13, 15], "util": [2, 4, 5, 8, 9, 11, 12, 13, 14, 16], "along": [2, 4, 9, 11, 15], "link": [2, 6, 7, 8, 9, 11, 12, 13, 15], "clone": [2, 4, 6, 15], "cd": 2, "content": [2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "miss": [2, 12, 13], "manual": [2, 3, 4, 6, 9, 12, 13], "itself": [2, 6, 11, 15], "alreadi": [2, 3, 4, 5, 6, 9, 11, 12, 13], "present": [2, 6, 8, 11, 12], "gain": 2, "potenti": 2, "untest": [2, 12], "r": [2, 6, 11], "forc": [2, 6, 11, 12], "ones": [2, 5, 6, 7, 11, 14], "automat": [2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "safeti": 2, "precaut": 2, "backup": [2, 6, 11], "person": [2, 6, 7, 11, 13], "done": [2, 6, 8, 11, 13, 14], "delet": [2, 4, 7, 11, 13, 15], "again": [2, 3, 4, 5, 6, 11, 13, 15], "previou": [2, 5, 6, 8, 9, 11, 15], "name": [2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "wit": 2, "noth": [2, 5, 6, 11, 15], "expect": [2, 4, 5, 6, 9, 11, 14], "_dashboard": [2, 3], "_default": [2, 4], "describ": [2, 3, 4, 5, 6, 11], "welcom": [2, 4, 5, 8, 14, 15], "role": [2, 5, 9], "therefor": [2, 4, 5, 6, 8, 9, 11, 14], "actual": [2, 5, 6, 8, 13], "_": [2, 11, 15], "url": [2, 4, 5, 7, 8, 11, 12, 13, 14, 15], "localhost": [2, 4, 5, 6, 11], "8000": [2, 3, 4, 11, 13], "yourappnam": 2, "stop": [2, 3, 12], "hit": [2, 6], "control": [2, 4, 5, 8, 9, 11, 12, 13, 14, 15], "appnam": [2, 5, 12, 14], "prefix": [2, 4, 6, 7, 8, 11, 14], "mai": [2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "symlink": [2, 4], "trail": [2, 11], "ctrl": [2, 3], "break": [2, 6, 11], "fn": 2, "paus": 2, "argument": [2, 4, 5, 6, 8, 9, 11, 12, 14], "addit": [2, 4, 5, 6, 7, 8, 11, 13], "help": [2, 6, 7, 8, 9, 11, 14, 16], "h": [2, 11], "usag": [2, 3, 4, 5, 6, 9, 11, 12, 13], "apps_fold": 2, "func": [2, 5], "y": [2, 9, 11], "ye": [2, 6], "No": [2, 6], "prompt": [2, 4, 6], "assum": [2, 5, 6, 7, 10, 14], "fals": [2, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "text": [2, 5, 6, 8, 9, 13, 15], "pass": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "messag": [2, 4, 5, 7, 8, 11, 13, 14, 15], "exit": [2, 5], "myfunct": 2, "x": [2, 6, 8, 9, 11, 13], "100": [2, 6, 7, 8, 11], "doubl": [2, 6, 8], "quot": [2, 9], "shown": [2, 6, 11, 12], "app_nam": [2, 4, 5, 6], "scaffold_zip": 2, "current": [2, 5, 6, 8, 9, 12, 13, 14, 15], "127": [2, 3, 5, 11, 13], "0": [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "1": [2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15], "p": [2, 8, 11], "integ": [2, 4, 6, 7, 9, 11, 15], "number": [2, 4, 5, 6, 8, 10, 11, 12, 13], "password_fil": 2, "wsgiref": 2, "tornado": 2, "gunicorn": 2, "waitress": 2, "geventwebsocketserv": 2, "wsgirefthreadingserv": 2, "rocketserv": 2, "w": [2, 4, 5, 6], "number_work": 2, "worker": [2, 5], "d": [2, 7, 9, 11], "dashboard_mod": 2, "mode": [2, 4, 5, 11, 12], "readonli": [2, 11, 15], "none": [2, 5, 6, 7, 9, 11, 13, 14, 15], "watch": [2, 3, 16], "sync": [2, 6], "lazi": [2, 4, 14], "reload": [2, 3, 4, 5, 11, 15], "ssl_cert": 2, "ssl": 2, "certif": 2, "ssl_kei": 2, "kei": [2, 4, 5, 7, 9, 10, 11, 12, 16], "errorlog": 2, "send": [2, 6, 11, 12], "log": [2, 3, 4, 5, 6, 8, 9, 12, 14, 15], "stdout": 2, "stderr": 2, "tickets_onli": 2, "filenam": [2, 4, 5, 6, 11], "l": [2, 11], "logging_level": 2, "50": [2, 7], "30": [2, 6, 8, 11], "warn": [2, 5], "debug": [2, 4, 5, 6, 8], "switch": [2, 5, 6], "By": [2, 4, 5, 6, 11, 12, 14], "upon": [2, 8, 12, 14], "occur": [2, 6, 8, 11, 15], "incom": 2, "prefer": [2, 5, 6, 9, 15], "immedi": [2, 6, 13], "product": [2, 4, 6, 11, 15], "unned": 2, "restart": [2, 4, 5, 6, 13], "direct": [2, 5, 6, 8, 11], "modif": 2, "behaviour": [2, 6, 11, 13], "rocket3": [2, 14], "thread": [2, 5, 6, 14], "strip": [2, 11, 14], "python2": [2, 14], "logic": [2, 4, 5, 11, 12, 14], "valu": [2, 5, 7, 8, 9, 10, 11, 13, 15], "defin": [2, 4, 5, 8, 11, 12, 13, 14, 15], "common": [2, 3, 4, 5, 8, 11, 12, 14, 15], "notset": 2, "10": [2, 6, 7, 8, 9, 10, 11, 12, 15], "20": [2, 7, 10, 11], "info": [2, 4, 5, 6, 12], "40": [2, 9, 15], "critic": 2, "tell": [2, 4, 5, 6, 12, 13, 15], "handl": [2, 4, 5, 6, 11, 13, 14, 15], "event": [2, 6, 15], "found": [2, 6, 11], "invalid": [2, 5, 6, 11], "ask": [2, 5, 6], "annoi": 2, "pdkdf2": 2, "hash": [2, 6, 11], "unless": [2, 3, 5, 6, 8, 11], "my_password_fil": 2, "runtim": [2, 6], "valid": [2, 4, 7, 8, 9, 13, 14, 16], "crypt": 2, "write": [2, 4, 5, 6, 8, 11, 14], "str": [2, 5, 6, 9, 14, 15], "input": [2, 4, 5, 6, 8, 11, 15], "reinstal": 2, "confirm": [2, 11, 12, 13, 15], "creation": [2, 6], "parent": [2, 6, 8, 15], "myapp": [2, 4], "db": [2, 3, 4, 5, 7, 9, 11, 12, 13, 14, 15], "dal": [2, 4, 7, 11, 13, 15, 16], "field": [2, 4, 5, 7, 9, 12, 14, 15, 16], "too": [2, 5, 6, 11, 15], "cannot": [2, 5, 6, 8, 9, 11, 15], "deployment_tool": 2, "recip": 2, "briefli": 2, "tip": [2, 13, 16], "trick": 2, "To": [2, 4, 6, 8, 9, 10, 11, 12, 13], "step": [2, 6, 12, 14, 15], "www": [2, 8, 9, 13], "section": [2, 4, 6, 8, 11, 12], "io": [2, 6], "educ": 2, "brows": [2, 3, 13, 15], "vscode": 2, "updat": [2, 5, 11, 13, 14, 15, 16], "workspacefold": 2, "path_to": 2, "crt": [2, 6], "absolut": [2, 6, 14], "locat": [2, 4, 8, 14], "so": [2, 5, 6, 8, 9, 11, 13, 14, 15], "feasibl": [2, 11], "simpli": [2, 4, 5, 6, 8, 10, 15], "py4web_wsgi": 2, "4": [2, 5, 6, 7, 8, 11, 13], "take": [2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15], "consol": [2, 9, 12, 15], "obtain": [2, 4, 6, 12, 15], "project_nam": 2, "mkdir": [2, 4, 7, 11, 13], "cp": 2, "development_tool": 2, "mayb": [2, 5], "empti": [2, 4, 6, 11, 15], "__init__": [2, 4, 5, 6, 7, 11, 13, 14, 15], "deploi": 2, "makefil": 2, "lib": [2, 8, 9, 13], "yaml": 2, "sdk": 2, "config": [2, 4], "email": [2, 5, 8, 11, 12, 14], "account": [2, 6], "suit": 2, "youtub": [2, 6], "video": [2, 15], "tutori": [2, 13, 15], "bottle_app": 2, "script": [2, 5, 8, 15], "dockerfil": 2, "compos": [2, 5], "yml": 2, "postgresql": [2, 6], "advantag": [2, 6, 8, 15], "sudo": [2, 12], "background": [2, 4, 11, 15], "daemon": 2, "bash": 2, "04": 2, "03": [2, 6, 7], "lt": [2, 9], "nginx": 2, "self": [2, 5, 9, 11, 13, 15], "sign": [2, 4, 5, 6, 8, 11, 12], "iptabl": 2, "extens": [3, 6, 11, 14], "explor": 3, "listen": 3, "tcp": 3, "local": [3, 5, 6, 11, 12, 13, 14], "pc": 3, "protocol": 3, "connect": [3, 4, 5, 11, 14], "firefox": [3, 15], "chrome": [3, 15], "button": [3, 4, 5, 9, 11, 15, 16], "20201112": 3, "sourc": [3, 4, 6, 11], "forum": 3, "press": [3, 4, 13], "insert": [3, 5, 7, 8, 11, 12, 13, 15], "set_password": 3, "command": [3, 4, 8, 9, 16], "displai": [3, 4, 5, 6, 8, 9, 11, 12, 13, 15], "tab": [3, 5, 11], "compress": [3, 4], "click": [3, 6, 9, 11, 13, 15], "titl": [3, 8, 11, 15], "context": [3, 5, 6, 8], "select": [3, 4, 7, 10, 11, 12, 13, 14, 15, 16], "compris": 3, "effect": [3, 6, 11], "fail": [3, 6, 8, 11], "load": [3, 4, 5, 6, 8, 13, 15], "red": [3, 4, 6, 8, 9, 11], "crud": [3, 11, 15], "visit": [3, 5, 6, 8, 11, 12], "trigger": [3, 5, 6, 15], "recent": [3, 5, 6, 11, 13], "own": [4, 5, 6, 8, 11, 12, 13, 14, 15], "strictli": [4, 15], "enter": [4, 5, 9, 11, 12], "echo": 4, "backslash": 4, "e": [4, 5, 6, 7, 8, 9, 11, 12, 15], "recogn": [4, 6], "whenev": [4, 6], "anyth": 4, "arbitrari": [4, 6, 12], "typic": [4, 5, 6, 8, 11], "subfold": [4, 5, 6], "publish": 4, "hello": [4, 5, 6, 8, 9, 11, 12, 15], "world": [4, 5, 6, 8, 9, 11], "newli": [4, 6, 10], "One": [4, 11, 12], "__": 4, "stream": [4, 5, 6, 14], "partial": [4, 6, 14], "rang": [4, 6, 8, 12, 14], "header": [4, 5, 6, 8, 9, 13, 15], "datetim": [4, 5, 6, 7, 11, 15], "action": [4, 5, 6, 9, 11, 14, 15, 16], "def": [4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "webserv": 4, "prepend": [4, 7, 11, 14, 15], "ambigu": [4, 6], "string": [4, 5, 7, 8, 9, 10, 11, 13], "dictionari": [4, 5, 9, 10, 14], "serial": [4, 5, 6, 8, 9, 11], "end": [4, 6, 8, 9, 11, 12, 13, 14, 15], "color": [4, 6, 8, 9, 11, 15], "blue": [4, 6, 11, 14], "green": [4, 6, 14], "visibl": 4, "chose": 4, "convent": [4, 6, 8, 11, 14], "often": [4, 6, 12, 15], "shortli": 4, "possibl": [4, 5, 6, 8, 11, 12, 13, 14], "map": [4, 6, 9, 10, 11, 14], "pattern": [4, 7], "pick": [4, 5, 12], "unknown": 4, "wildcard": 4, "filter": [4, 7, 11, 12], "int": [4, 6, 11, 14], "match": [4, 5, 6, 7, 8, 9, 10, 11], "digit": [4, 6, 11, 12], "float": [4, 11], "decim": [4, 6, 11], "charact": [4, 6, 9, 11], "non": [4, 5, 6, 11, 13, 14], "greedi": 4, "segment": 4, "exp": [4, 6], "express": [4, 7, 8, 9, 10, 11, 13, 15], "variabl": [4, 5, 6, 9, 10, 11, 13, 15], "method": [4, 5, 7, 8, 9, 11, 12, 13, 15, 16], "post": [4, 6, 7, 9, 11, 12, 13, 14, 15], "paint": [4, 11], "queri": [4, 5, 7, 9, 11, 12, 13, 14, 15], "equival": [4, 5, 6, 9, 11, 14], "attribut": [4, 5, 9, 11, 13, 14, 15], "identifi": [4, 5, 6, 9, 11], "head": [4, 8, 11, 13], "style": [4, 8, 11, 15, 16], "bodi": [4, 8, 12, 13, 15], "h1": [4, 8], "dict": [4, 5, 6, 10, 11, 13, 14, 15], "ingredi": 4, "behavior": [4, 6, 9, 11, 14, 15], "scope": 4, "plugin": [4, 5, 11, 13, 15], "tree": [4, 8, 11], "explain": [4, 5, 6, 11, 13], "That": [4, 6, 14], "easili": [4, 5, 6, 8, 9, 11, 13], "pool": [4, 5], "commit": [4, 5, 7, 13, 14], "rollback": 4, "failur": [4, 11, 15], "pars": [4, 5, 6, 10, 11, 12], "retriev": [4, 5, 6, 14, 15], "determin": [4, 5, 6, 8, 10, 11, 12, 13], "optim": [4, 6], "rule": [4, 5, 8, 11, 13], "sane": 4, "outlin": [4, 5], "put": [4, 5, 7, 11, 15], "organ": 4, "properli": 4, "registr": [4, 11], "construct": [4, 6], "metadata": [4, 6], "md": 4, "tabl": [4, 5, 7, 11, 12, 13, 14, 15], "settings_priv": 4, "privat": [4, 5, 11], "ship": [4, 8], "bulma": [4, 11, 13, 15], "agnost": 4, "past": 4, "favicon": 4, "ico": 4, "etc": [4, 5, 6, 7, 10, 14], "layout": [4, 11, 12, 13, 14, 15, 16], "italian": [4, 5, 10], "respons": [4, 5, 6, 8, 13, 14, 15, 16], "abort": [4, 6], "redirect": [4, 5, 11, 12, 13, 15], "get_us": [4, 5, 12, 14], "first_nam": [4, 5, 12, 13], "format": [4, 5, 7, 9, 10, 12, 13], "bottlepi": [4, 5], "counterpart": 4, "div": [4, 5, 8, 11, 14, 15], "span": [4, 14], "img": 4, "pretti": [4, 6, 11, 14], "indic": [4, 6, 11, 14, 15], "probabl": [4, 11], "line": [4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16], "whole": [4, 11], "anoth": [4, 5, 8, 10, 11], "my_app": 4, "Then": [4, 5, 6, 9, 11, 12, 13, 15], "upper": [4, 5, 11], "As": [4, 5, 6, 7, 8, 9, 11, 12, 13, 15], "facilit": 4, "fact": [4, 5, 6, 14], "handler": 4, "app_watch_handl": 4, "report": [4, 8], "worri": [4, 6], "sass": 4, "compil": [4, 8, 9, 11], "libsass": 4, "static_dev": 4, "overrid": [4, 6, 8, 9, 12, 13, 14, 15], "sass_compil": 4, "changed_fil": 4, "print": [4, 6, 9, 10, 12, 14], "abov": [4, 5, 6, 7, 8, 11, 12, 13], "compiled_css": 4, "filep": 4, "include_path": 4, "output_styl": 4, "dest": [4, 6], "o": [4, 5, 7, 11, 13], "join": [4, 5, 7, 11, 12, 13, 14, 16], "esprima": 4, "implement": [4, 5, 6, 8, 11, 12, 14, 15], "node": 4, "dbadmin": 4, "validate_j": 4, "cf": 4, "abspath": 4, "parsemodul": 4, "filepath": 4, "rel": [4, 6, 8, 13, 14], "ignor": [4, 6, 8, 9, 11, 13, 15], "termin": [4, 8, 15], "equip": 5, "furnitur": 5, "fix": [5, 14], "posit": [5, 9], "vehicl": 5, "someth": [5, 6, 7, 8, 9, 11], "attach": [5, 6, 12, 14], "transact": 5, "lookup": [5, 7, 11], "proper": [5, 6, 13], "back": [5, 6, 11], "accomplish": [5, 6, 12, 14], "skip": [5, 15], "manner": [5, 14], "boilerpl": 5, "wsgi": 5, "middlewar": 5, "authent": [5, 6, 13, 16], "return": [5, 6, 7, 9, 11, 12, 13, 15], "otherwis": [5, 6, 8, 11, 12, 13], "variou": [5, 6], "transform": [5, 6, 11, 15], "jinja2": 5, "syntact": [5, 11], "sugar": 5, "ram": [5, 6], "Be": [5, 6, 8], "care": [5, 6, 8, 14, 15], "exactli": [5, 6, 8], "opposit": [5, 6], "earli": [5, 6], "februari": 5, "2022": 5, "combin": [5, 9, 11, 13], "implic": 5, "cleaner": 5, "my_var": [5, 9], "t_folder": 5, "dirnam": [5, 7, 11, 13], "__file__": [5, 7, 11, 13], "class": [5, 6, 8, 9, 11, 12, 14, 15], "counter": [5, 6, 15], "count": [5, 7, 12, 13, 15], "dbstore": 5, "memori": 5, "storag": [5, 6, 7, 11, 13], "n": [5, 6, 10, 15], "en": [5, 7], "2": [5, 6, 7, 8, 9, 10, 11, 12, 14, 15], "twice": [5, 6], "6": [5, 6, 7, 11, 12, 14], "5": [5, 6, 7, 8, 10, 11, 12, 13, 15], "english": 5, "ti": 5, "ho": 5, "visto": 5, "prima": 5, "gia": 5, "volt": 5, "piu": 5, "alert": [5, 8, 9, 11, 14], "state": [5, 6, 7, 14, 15], "dismiss": [5, 14], "_class": [5, 9, 11, 15], "sanit": [5, 9, 14], "src": [5, 6, 8, 9, 15], "xml": [5, 8, 11, 14, 15], "achiev": [5, 6, 14], "temporarili": 5, "sent": [5, 6, 12, 15], "overwritten": [5, 14], "hardcod": 5, "speak": 5, "desir": [5, 8, 11, 12], "persist": [5, 6, 12], "throughout": 5, "word": [5, 6, 10, 13], "render": [5, 7, 8, 9, 11, 13, 14, 15], "stateless": [5, 15], "secret": [5, 12], "my": [5, 8, 9, 11, 12, 15], "increas": 5, "close": [5, 6, 8, 9], "reopen": 5, "relat": [5, 16], "usernam": [5, 6, 12], "shop": 5, "cart": 5, "jwt": 5, "token": [5, 11], "__str__": [5, 8, 9], "minim": [5, 13, 16], "never": [5, 6, 8, 11, 14, 15], "expir": [5, 6], "3600": [5, 6], "algorithm": [5, 11], "hs256": 5, "same_sit": 5, "lax": 5, "_sesson": 5, "passphras": 5, "maximum": [5, 6, 11], "lifetim": 5, "second": [5, 9, 11, 12, 14], "timeout": 5, "signatur": [5, 7, 9, 11], "csrf": [5, 11], "attack": [5, 9], "cross": [5, 6, 9], "forgeri": 5, "uuid": [5, 6], "why": [5, 6, 8, 14], "appname_sess": 5, "encod": [5, 6, 11, 15], "tamper": [5, 6], "trivial": [5, 6], "disk": [5, 6], "sensit": [5, 6, 11], "vice": 5, "versa": 5, "small": [5, 11], "size": [5, 6, 8, 11], "kbyte": 5, "conn": 5, "11211": 5, "6379": 5, "lambda": [5, 6, 9, 11, 13, 15], "k": [5, 8, 14], "v": [5, 9, 11, 15], "ct": 5, "ttl": 5, "monkei": 5, "patch": 5, "multiprocess": 5, "quirk": 5, "determinist": 5, "unsaf": [5, 9], "imagin": [5, 6, 8, 15], "fsstorag": 5, "fp": 5, "dump": [5, 6, 15], "tmp": [5, 6], "leav": [5, 6, 12], "exercis": [5, 12], "lock": [5, 6], "ineffici": [5, 6], "scale": [5, 8], "app1": 5, "app2": 5, "sesson": 5, "session_secret_kei": 5, "app1_sess": 5, "between": [5, 6, 9, 11, 14], "consist": [5, 6, 8, 13, 14], "session_app1": 5, "restrict": [5, 6, 7, 11, 15], "enforc": [5, 6, 11, 14], "workflow": [5, 16], "step1": 5, "step_complet": 5, "_href": [5, 8, 9, 11, 13], "step2": 5, "step3": 5, "on_request": 5, "evalu": [5, 6, 7, 8, 11, 15], "rais": [5, 6, 11, 12, 14], "404": [5, 11, 12], "cond": 5, "400": [5, 14], "on_fals": 5, "13": [5, 6, 11], "auth_us": [5, 6, 12], "requires_membership": 5, "group_nam": [5, 12], "user_id": [5, 6, 12, 14], "payrol": 5, "employe": [5, 13], "signer": 5, "url_sign": 5, "somepath": 5, "signed_url": 5, "anotherpath": 5, "verifi": [5, 11, 12], "abstract": [5, 14, 16], "layer": [5, 14, 16], "pleas": [5, 6], "doesn": [5, 6, 13], "db_folder": [5, 7, 11, 13], "pool_siz": [5, 6], "define_t": [5, 7, 11, 12, 13, 14], "visit_log": 5, "client_ip": 5, "timestamp": [5, 7, 15], "remote_addr": [5, 12], "utcnow": [5, 6], "wrap": [5, 10, 11], "on_success": 5, "roll": [5, 6], "on_error": 5, "Their": [5, 6, 14], "constructor": [5, 9, 12, 16], "last_nam": [5, 12, 13], "sso_id": [5, 12], "action_token": [5, 12], "mostli": 5, "presenc": [5, 6], "_scaffold": [5, 8, 9, 11, 12, 13, 14, 16], "author": [5, 6, 7, 16], "writabl": [5, 6, 11, 14], "readabl": [5, 6, 7, 13, 14], "threadsafevari": 5, "myfixtur": 5, "eventu": 5, "inner": [5, 8, 15], "b": [5, 6, 8, 9, 11, 14, 15], "circumst": 5, "think": [5, 6, 8, 13, 15], "onion": 5, "center": [5, 8], "outer": [5, 11, 15], "previous": [5, 6, 11], "uppercas": [5, 11], "upper_cas": 5, "traceback": [5, 6], "logerror": 5, "errlog": 5, "myerror": 5, "__prerequisite__": 5, "append": [5, 6, 9, 11, 13, 15], "__prerequisites__": 5, "guarante": [5, 6, 8, 14], "prerequisit": [5, 16], "singleton": [5, 14], "consid": [5, 6, 8, 9, 11, 13, 14], "httrespons": 5, "complic": 5, "whether": [5, 6, 8, 11, 12, 13, 14], "mandatori": [5, 6, 8], "happen": [5, 6], "sequenc": [5, 6], "revers": [5, 6], "extra": [5, 6, 11, 12], "almost": 5, "futur": [5, 14, 15], "lru": 5, "via": [5, 6, 8, 9, 12, 15], "1000": [5, 6, 11, 15], "60": [5, 6], "uuid4": [5, 6], "mention": [5, 12, 15], "unauthent": [5, 6, 9], "below": [5, 6, 7, 11, 13], "separ": [5, 6, 8, 11, 12, 13, 15], "preced": [5, 6, 7, 8, 11], "dynam": [6, 7, 8, 9, 11, 12, 16], "dialect": 6, "term": [6, 11], "portabl": 6, "among": [6, 11], "choosen": 6, "pure": 6, "conceiv": 6, "tast": 6, "aggreg": 6, "nest": [6, 8, 9], "caveat": [6, 8, 14, 16], "startup": [6, 14, 16], "downsid": [6, 14], "approach": [6, 14], "modern": [6, 12, 15], "driver": 6, "sqlite3": 6, "mac": 6, "binari": 6, "appropri": [6, 11], "pysqlite2": 6, "zxjdbc": 6, "jython": 6, "psycopg2": 6, "pymysql": 6, "mysqldb": 6, "cx_oracl": 6, "pyodbc": 6, "pypyodbc": 6, "firebird": 6, "kinterbasdb": 6, "fdb": 6, "db2": 6, "informix": 6, "informixdb": 6, "ingr": 6, "ingresdbi": 6, "cubrid": 6, "cubriddb": 6, "sybas": 6, "teradata": 6, "sapdb": 6, "mongodb": 6, "pymongo": 6, "imap": 6, "imaplib": 6, "treat": [6, 14], "instanti": [6, 12, 13, 14], "mytabl": 6, "myfield": 6, "truncat": 6, "import_from_csv_fil": 6, "claus": [6, 8], "myqueri": 6, "myset": 6, "somevalu": 6, "deriv": 6, "myorder": 6, "advis": [6, 13], "NOT": [6, 11, 12], "hesit": 6, "snippet": 6, "auth_user_tag_group": [6, 12], "superhero": [6, 7, 11, 13, 15], "superpow": [6, 7], "superman": [6, 7, 11, 13], "real_ident": [6, 7], "zero": [6, 8, 11, 13], "sake": 6, "simplic": [6, 15], "engin": [6, 11], "At": [6, 8], "_uri": 6, "_dbname": 6, "instanc": [6, 9, 11, 13, 15], "uniform": 6, "resourc": [6, 12, 16], "situat": 6, "dummi": [6, 8], "db_codec": 6, "utf": 6, "check_reserv": 6, "migrate_en": 6, "fake_migrate_al": 6, "decode_credenti": 6, "driver_arg": 6, "adapter_arg": 6, "auto_import": 6, "bigint_id": 6, "lazy_t": 6, "db_uid": 6, "do_connect": 6, "after_connect": 6, "ignore_field_cas": 6, "entity_quot": 6, "table_hash": 6, "establish": [6, 14], "set_encod": 6, "utf8mb4": 6, "postgr": 6, "2005": 6, "mssql3": 6, "2012": 6, "mssql4": 6, "dsn": 6, "uid": 6, "pwd": 6, "ndb": 6, "alter": 6, "utf8": 6, "unicod": [6, 11], "byte": [6, 11], "buffer": 6, "had": 6, "_select": [6, 9], "_insert": 6, "_updat": 6, "_delet": 6, "behav": [6, 13], "latin1": 6, "unicodedecodeerror": 6, "rather": [6, 8, 9, 11, 15], "slow": 6, "goe": [6, 11], "recycl": 6, "minimum": [6, 11], "receiv": 6, "share": [6, 14], "sequenti": 6, "simultan": 6, "yield": 6, "benefit": [6, 15], "wait": 6, "stai": 6, "unus": 6, "retri": 6, "major": 6, "boost": [6, 8], "defer": [6, 15], "referenc": [6, 7, 9], "possibli": 6, "howev": [6, 8, 9, 11, 13, 15], "demand": 6, "housekeep": 6, "definit": [6, 7, 11, 13, 14], "maintain": [6, 8, 13, 15], "workload": 6, "slave": 6, "column": [6, 16], "against": [6, 7, 9, 11, 13], "target": [6, 9, 15], "scan": 6, "known": [6, 8], "_nonreserv": 6, "postgres_nonreserv": 6, "backend": 6, "entiti": 6, "unquot": [6, 9], "insensit": [6, 11], "thu": [6, 8], "fold": 6, "accord": [6, 8], "compliant": [6, 15], "schema": 6, "arrang": [6, 11], "table1": 6, "sometim": [6, 8, 9, 11, 13], "necessari": [6, 8, 9], "user_nam": 6, "user_password": 6, "server_addr": 6, "db_name": 6, "sslmode": 6, "sslrootcert": 6, "root": [6, 8, 12, 13], "sslcert": 6, "sslkei": 6, "boolean": [6, 13], "affect": 6, "disabl": [6, 7, 9, 11, 13], "fake": 6, "aren": 6, "ever": 6, "granular": 6, "bob": 6, "enclos": [6, 8], "pseudo": 6, "visitor": [6, 9, 11], "tablenam": [6, 7, 11, 15], "kwarg": [6, 15], "subclass": [6, 11], "common_filt": 6, "catch": 6, "anywai": 6, "auto": [6, 13], "increment": 6, "uniqu": [6, 7, 11], "element": [6, 8, 9, 11, 13, 15], "redefinit": 6, "anonym": [6, 8, 11], "down": [6, 11, 15], "othert": 6, "otherfield": 6, "alia": [6, 11], "illustr": [6, 8], "qualifi": 6, "db1": 6, "dbo": 6, "part": [6, 9, 11, 14], "sub": 6, "relev": 6, "numer": [6, 11], "lose": [6, 11], "delai": [6, 15], "ag": 6, "set_attribut": 6, "is_not_empti": 6, "is_int_in_rang": 6, "120": 6, "is_in_db": [6, 13], "somet": 6, "somefield": 6, "some_valu": 6, "caus": [6, 11], "underscor": [6, 9, 11], "_extra": 6, "condit": [6, 8, 11, 16], "easiest": [6, 12], "met": 6, "accnum": 6, "acctyp": 6, "accdesc": 6, "null": [6, 7, 11, 15], "fieldnam": [6, 15], "length": [6, 11], "ondelet": 6, "notnul": 6, "uploadfield": 6, "widget": [6, 16], "label": [6, 7, 8, 11, 13, 14, 15], "comment": [6, 9], "searchabl": 6, "listabl": 6, "autodelet": 6, "uploadfold": 6, "uploadsepar": 6, "uploadf": 6, "custom_qualifi": 6, "map_non": 6, "Not": 6, "upgrad": [6, 16], "popul": 6, "seem": 6, "redund": [6, 11], "ON": [6, 11], "statement": [6, 8, 11], "NO": 6, "somewher": 6, "blob": 6, "upload_fold": [6, 11], "attent": 6, "either": [6, 9, 11], "move": 6, "amazon": 6, "s3": 6, "sftp": 6, "pyfilesystem": 6, "due": [6, 7, 11], "associ": [6, 10, 11, 12], "autogener": 6, "neither": [6, 11], "reset": 6, "is_length": 6, "512": 6, "32768": 6, "31": [6, 7, 11], "gib": 6, "is_float_in_rang": 6, "1e100": 6, "is_decimal_in_rang": 6, "is_dat": 6, "is_tim": 6, "is_datetim": 6, "_id": [6, 9, 11, 15], "is_empty_or": 6, "is_json": 6, "bigint": 6, "63": [6, 11], "big": [6, 14], "total": [6, 7], "respect": [6, 9, 11, 13], "certain": [6, 8, 11, 13], "denorm": [6, 7], "listproperti": 6, "stringlistproperti": 6, "item": [6, 7, 8, 9, 11], "escap": [6, 8, 9], "explanatori": 6, "backport": 6, "base64": [6, 8, 15], "decod": 6, "extract": [6, 11, 15], "neg": [6, 11], "33": [6, 11], "space": [6, 8, 11, 13], "_format": 6, "similarli": [6, 9], "32": [6, 11], "_tabl": [6, 11, 15], "_tablenam": 6, "_db": 6, "tupl": [6, 8, 9], "myfil": 6, "imag": [6, 8, 9, 11], "assign": [6, 8, 11, 12, 14], "duplic": 6, "file_cont": [6, 15], "file_nam": [6, 15], "occasion": [6, 11], "programmat": [6, 9, 11], "rb": 6, "simpler": [6, 8, 13], "temp": 6, "image_fil": 6, "plain": 6, "fullnam": 6, "nameonli": 6, "origin": [6, 8, 9, 10, 11], "readi": 6, "contextlib": 6, "shutil": 6, "wb": 6, "copyfileobj": 6, "logfil": 6, "unnam": [6, 9], "recov": 6, "junk": 6, "complain": 6, "corrupt": 6, "smaller": 6, "involv": [6, 8, 13, 14], "confus": 6, "rebuild": 6, "prudent": 6, "yourapp": 6, "narrow": 6, "summar": 6, "alex": 6, "ident": [6, 7, 11, 14], "bulk_insert": 6, "tim": 6, "oppos": [6, 9], "loop": [6, 8], "speed": [6, 7, 8], "carl": 6, "q": [6, 13], "far": [6, 15], "birthplac": 6, "chicago": 6, "born": 6, "hi": [6, 11], "criteria": [6, 11], "pet": 6, "rover": 6, "ret": 6, "bail": 6, "hold": [6, 15], "whose": [6, 8, 11], "rare": 6, "num": 6, "properti": [6, 11], "id1": 6, "chair": 6, "id2": 6, "materi": 6, "wood": 6, "assert": 6, "thing_tags_default": 6, "tail": 6, "u": [6, 9, 11], "five": 6, "placehold": [6, 10, 11, 15], "colnam": 6, "as_ordered_dict": 6, "substitut": [6, 8], "cursor": [6, 15], "field1": 6, "val1_row1": 6, "field2": 6, "val2_row1": 6, "val1_row2": 6, "val2_row2": 6, "former": 6, "ensur": [6, 11], "ordereddict": 6, "_time": 6, "took": 6, "recurr": 6, "IF": 6, "myidx": 6, "INTO": 6, "_count": 6, "susan": 6, "moreov": [6, 15], "act": [6, 9, 11], "latter": [6, 11, 14], "over": [6, 8, 13, 15], "particularli": 6, "handi": 6, "compact": 6, "notat": [6, 9], "unusu": 6, "delete_record": 6, "feed": 6, "entir": [6, 8, 14, 15], "larg": [6, 11], "dramat": 6, "iterselect": 6, "machin": 6, "rewrit": 6, "repr_row": 6, "slice": 6, "wouldn": 6, "myrecord": 6, "del": [6, 9], "19": [6, 7, 11], "02": [6, 11], "permit": 6, "conveni": [6, 16], "appar": 6, "safer": [6, 11, 13], "meet": 6, "owner_id": 6, "nevertheless": 6, "tild": 6, "appear": [6, 11, 13], "random": [6, 8, 11, 12, 15], "overcom": 6, "concaten": [6, 9], "conjunct": 6, "condition": 6, "query1": 6, "query2": 6, "offset": [6, 7], "implicitli": [6, 11], "pagin": [6, 13], "trade": 6, "AND": 6, "OR": [6, 9, 11, 13], "negat": 6, "invert": [6, 11], "unari": 6, "overload": 6, "higher": 6, "comparison": [6, 11], "parenthes": 6, "william": 6, "ken": 6, "yes_or_no": 6, "curt": 6, "philip": 6, "modified_on": 6, "retain": 6, "first_row": 6, "last_row": 6, "obvious": [6, 11], "won": 6, "forget": [6, 13], "table_nam": 6, "optimis": 6, "rows_list": 6, "first_row_dict": 6, "themselv": [6, 8], "rows1": 6, "rows2": 6, "union": 6, "rows3": 6, "intersect": 6, "pointless": 6, "manipul": 6, "unchang": [6, 11], "obviou": [6, 7, 8, 12], "cache_db_select": 6, "lack": [6, 11, 14], "unit_pric": 6, "quantiti": [6, 11], "total_pric": 6, "rid": 6, "99": 6, "9": [6, 7, 11, 13, 14], "95": 6, "1l": 6, "wiki": [6, 7], "subsect": 6, "mark": [6, 12], "calcul": 6, "discounted_tot": 6, "discount": 6, "implicit": 6, "price": 6, "percentag": 6, "sai": [6, 12], "15": [6, 11, 12, 13], "myvirtualfield": 6, "virtualfield": 6, "order_item": 6, "setvirtualfield": 6, "myvirtualfields1": 6, "discounted_unit_pric": 6, "90": [6, 7], "myvirtualfields2": 6, "discounted_total_pric": 6, "lazy_total_pric": 6, "shorter": [6, 11], "owner": [6, 11], "intend": [6, 15], "cyclic": 6, "boat": 6, "shoe": 6, "acquir": 6, "transpar": [6, 8, 11], "observ": 6, "owner_id1": 6, "owner_id2": 6, "with_alia": 6, "he": 6, "clearli": [6, 15], "equal": [6, 7, 9, 12, 15], "realiz": 6, "intermedi": 6, "ownership": 6, "relationship": 6, "rewritten": 6, "co": [6, 11], "persons_and_th": 6, "lighter": [6, 14], "father_id": 6, "mother_id": 6, "father": 6, "temporari": 6, "fid": 6, "mid": 6, "claudia": 6, "marco": 6, "mother": 6, "AS": 6, "chosen": 6, "subtl": 6, "clear": [6, 11], "event_tim": 6, "sever": 6, "few": [6, 8, 12, 15], "xss": [6, 8, 9], "inject": [6, 8, 11, 16], "unauthor": 6, "percent": 6, "wild": 6, "card": 6, "ansi": 6, "collat": 6, "case_sensit": 6, "roughli": 6, "value1": 6, "value2": 6, "degre": 6, "2018": 6, "IN": 6, "bad_dai": 6, "jonathan": 6, "verbos": 6, "nested_select": 6, "averag": 6, "plu": [6, 8, 12, 13], "43": 6, "sysus": 6, "power": [6, 7, 12, 14, 15], "coa": 6, "mathemat": 6, "rescu": 6, "dumpfil": 6, "newlin": [6, 11], "export_to_csv_fil": 6, "explict": 6, "restor": 6, "somefil": 6, "field3": 6, "suffic": 6, "nid": 6, "across": [6, 8], "merg": 6, "64": [6, 8, 15], "stringio": 6, "set_head": 6, "getvalu": 6, "import_and_sync": 6, "_type": [6, 9, 11, 15], "_name": [6, 9, 11, 15], "var": [6, 9, 11, 14, 15], "rpc": 6, "therein": 6, "thead": 6, "tr": 6, "th": 6, "tbodi": 6, "w2p_odd": 6, "odd": [6, 8], "td": 6, "w2p_even": 6, "univers": [6, 9, 11], "f": [6, 12, 13, 14, 15], "parser": 6, "quotechar": 6, "quote_minim": 6, "oufil": 6, "quote_nonnumer": 6, "35": 6, "descript": [6, 7, 11, 12, 13], "2013": 6, "consult": 6, "is_in_set": 6, "toi": 6, "car": 6, "comma": [6, 15], "suffici": 6, "gender": 6, "doctor": 6, "reus": 6, "is_act": 6, "created_on": 6, "created_bi": 6, "modified_bi": 6, "payment": 6, "amount": 6, "anyobj": 6, "obj": [6, 8], "myobj": 6, "aid": 6, "myobjnam": 6, "sqlcustomtyp": 6, "six": 6, "_before_insert": 6, "_after_insert": 6, "_before_upd": 6, "_after_upd": 6, "_before_delet": 6, "_after_delet": 6, "pprint": 6, "before_insert": 6, "after_insert": 6, "oprow": 6, "before_upd": 6, "after_upd": 6, "before_delet": 6, "after_delet": 6, "pair": [6, 9], "_before_": 6, "fire": 6, "infinit": 6, "update_na": 6, "consequ": [6, 11, 15], "enable_record_vers": 6, "stored_item": 6, "hidden": [6, 11, 15], "_enable_record_vers": 6, "archive_db": 6, "archive_nam": 6, "stored_item_arch": 6, "current_record": 6, "archiv": 6, "hide": [6, 13], "tenanc": 6, "idea": 6, "repeat": [6, 11], "blog_post": 6, "subject": [6, 7, 12], "post_text": 6, "is_publ": 6, "public": 6, "_common_filt": 6, "phrase": 6, "enhanc": 6, "disallow": [6, 11], "ignore_common_filt": [6, 11], "asid": 6, "suppos": 6, "ip": [6, 11], "ip2int": 6, "sv": 6, "ipv4": [6, 11], "sp": 6, "split": [6, 7, 8, 11], "iip": 6, "int2ip": 6, "iv": 6, "ov": 6, "divmod": 6, "256": 6, "nativ": 6, "websit": [6, 15], "ipaddr": 6, "wikipedia": [6, 7], "91": 6, "198": 6, "174": 6, "192": [6, 11], "172": [6, 11], "217": 6, "11": [6, 11], "74": 6, "125": 6, "65": 6, "207": 6, "97": 6, "227": 6, "239": 6, "factori": [6, 9], "concern": 6, "awai": 6, "phase": 6, "db_a": 6, "db_b": 6, "distributed_transaction_commit": 6, "succe": 6, "mydb": 6, "2010": 6, "connectionpool": 6, "baseadapt": 6, "deleg": 6, "myvalu": 6, "_adapt": 6, "_listifi": 6, "list_of_field": 6, "moment": 6, "sqliteadapt": 6, "jdbcsqliteadapt": 6, "mysqladapt": 6, "postgresqladapt": 6, "jdbcpostgresqladapt": 6, "oracleadapt": 6, "mssqladapt": 6, "mssql2adapt": 6, "mssql3adapt": 6, "mssql4adapt": 6, "firebirdadapt": 6, "firebirdembeddedadapt": 6, "informixadapt": 6, "db2adapt": 6, "ingresadapt": 6, "ingresunicodeadapt": 6, "googlesqladapt": 6, "nosqladapt": 6, "googledatastoreadapt": 6, "cubridadapt": 6, "teradataadapt": 6, "sapdbadapt": 6, "couchdbadapt": 6, "imapadapt": 6, "mongodbadapt": 6, "verticaadapt": 6, "sybaseadapt": 6, "char": [6, 12], "varchar": 6, "longtext": 6, "credential_decod": 6, "pool_connect": 6, "foreign_key_check": 6, "sql_mode": 6, "no_backslash_escap": 6, "lastrowid": 6, "last_insert_id": 6, "fetchon": 6, "couchdb": 6, "ibm_db_dbi": 6, "db2ibm": 6, "db2pyodbc": 6, "firebird_embed": 6, "firebirdembed": 6, "googlemysql": 6, "googledatastor": 6, "googlepostgr": 6, "googlesql": 6, "se": 6, "informixs": 6, "ingresu": 6, "ingresunicod": 6, "jdbc": 6, "jdbcpostgr": 6, "jdbcsqlite": 6, "mongo": 6, "mssql1": 6, "mssql2": 6, "mssql1n": 6, "mssql3n": 6, "mssql4n": 6, "mssqln": 6, "postgres2": 6, "postgrenew": 6, "postgrepsyconew": 6, "postgres3": 6, "postgreboolean": 6, "postgrepsycoboolean": 6, "postgrepsyco": 6, "pytd": 6, "sap": 6, "spatialit": 6, "vertica": 6, "sqladapt": 6, "mysqldv": 6, "invis": 6, "decid": [6, 11, 13], "reinstat": 6, "rebuilt": 6, "awar": 6, "continu": [6, 8, 15], "unfortun": [6, 13], "aftermath": 6, "revert": 6, "py4web_filesystem": 6, "discard": 6, "consider": 6, "overhead": 6, "resultset": 6, "superseed": 6, "onward": 6, "deprec": [6, 11, 15], "circular": 6, "on_delete_act": 6, "run_in_transact": 6, "liststringproperti": 6, "rest": [7, 12], "cit0801": 7, "inspir": 7, "graphql": 7, "cit0802": 7, "less": [7, 11, 14], "spirit": 7, "impli": 7, "might": [7, 11], "isdir": [7, 11, 13], "job": [7, 11, 13], "strength": 7, "clark": [7, 13], "kent": [7, 13], "journalist": [7, 13], "peter": [7, 13], "park": [7, 13], "photograph": [7, 13], "bruce": [7, 13], "wayn": [7, 13], "ceo": [7, 13], "spiderman": [7, 13], "batman": [7, 11, 13], "flight": 7, "durabl": 7, "75": 7, "80": [7, 11], "70": 7, "allowed_pattern": 7, "rec_id": 7, "deni": 7, "record_id": [7, 15], "get_var": [7, 14], "post_var": [7, 14], "diagram": 7, "formdata": 7, "eq": 7, "stand": [7, 9, 11], "gt": [7, 9], "greater": 7, "record": [7, 11, 12, 13, 14, 15], "said": 7, "statu": 7, "200": [7, 11, 14, 15], "2019": 7, "05": 7, "19t05": 7, "38": 7, "00": 7, "132635": 7, "api_vers": 7, "2021": 7, "01": 7, "04t07": 7, "466030": 7, "regex": [7, 9, 11], "post_writ": 7, "referenced_bi": 7, "put_writ": 7, "178974": 7, "123218": 7, "collaps": [7, 9], "559918": 7, "201988": 7, "322494": 7, "309903": 7, "355181": 7, "34": 7, "974953": 7, "405515": 7, "366288": 7, "451907": 7, "453020": 7, "iso": 7, "8601": 7, "org": [7, 9, 15], "representational_state_transf": 7, "distinct": [8, 11], "renoir": 8, "newer": 8, "minor": [8, 14], "trickeri": 8, "seamlessli": 8, "embed": [8, 11], "angl": 8, "mix": 8, "soon": [8, 15], "indent": 8, "un": [8, 9, 10, 15], "keyword": [8, 9], "colon": 8, "begin": [8, 11, 12, 13], "emac": 8, "signifi": 8, "divis": [8, 9, 11], "br": [8, 9], "dom": [8, 16], "inspector": 8, "recurs": 8, "vulner": 8, "dummyrespons": 8, "new_app": [8, 9], "iter": [8, 11], "ul": [8, 11, 12, 15], "li": [8, 11, 12, 15], "row": [8, 9, 11, 13, 14, 15], "randint": [8, 12], "h2": [8, 11], "45": [8, 11], "incorrect": 8, "recal": 8, "itemize1": 8, "href": [8, 9, 12, 13], "itemize2": 8, "footer": [8, 9], "minimalist": [8, 14], "minimalist_pag": 8, "bytecod": 8, "pyc": 8, "sidebar_en": 8, "home": 8, "excerpt": 8, "sidebar": 8, "anywher": [8, 14], "worth": 8, "though": 8, "impos": 8, "signific": 8, "some_condit": 8, "this_templ": 8, "that_templ": 8, "encapsul": [8, 9], "menu": [8, 11, 12], "mysidebar": 8, "predefin": 8, "ride": 8, "doctyp": [8, 13], "meta": [8, 9], "viewport": 8, "width": [8, 11], "devic": 8, "shortcut": [8, 11], "icon": [8, 13], "aaabaaeaaqeaaaeaiaawaaaafgaaacgaaaabaaaaagaaaaeaiaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaapaaaaaa": 8, "stylesheet": [8, 13], "cdnj": [8, 13], "cloudflar": [8, 13], "ajax": [8, 13, 15], "font": [8, 11, 13], "awesom": [8, 13], "14": [8, 11, 13], "min": [8, 11, 13], "sha512": [8, 11], "1pkogiy59xj8co8": 8, "ne6fz": 8, "loazkji": 8, "ky8iq0g4b3cyey6wyhn3yt9pw0xpsrivlkmxe40ptknxrlnz9": 8, "fkdaog": 8, "crossorigin": 8, "margin": [8, 15], "top": [8, 10, 11, 12], "16px": 8, "8em": [8, 15], "page_head": 8, "navig": [8, 13, 15], "bar": [8, 13], "nav": 8, "black": [8, 11], "touch": 8, "hamburg": 8, "checkbox": [8, 9], "left": [8, 11, 13, 15], "page_left_menu": 8, "navbar": [8, 12], "primari": [8, 12], "change_password": [8, 12], "flash": [8, 15, 16], "pad": [8, 14, 15], "contect": 8, "gotta": 8, "page_script": 8, "html5": 8, "58": 8, "accordingli": 8, "54": 8, "Of": 8, "123": [9, 11], "myclass": 9, "thisisatest": 9, "metatag": 9, "tagger": 9, "xmlescap": 9, "shell": 9, "represent": 9, "ab": [9, 11], "yb": 9, "hyphen": 9, "_data": 9, "soap": 9, "whatev": [9, 15], "_xmln": 9, "xmln": 9, "permitted_tag": 9, "allowed_attribut": 9, "blockquot": 9, "cite": [9, 11], "alt": 9, "colspan": 9, "me": [9, 11, 13, 15], "_bgcolor": 9, "bgcolor": 9, "bold": 9, "emphas": 9, "_action": 9, "_method": 9, "subhead": 9, "ital": 9, "emb": 9, "_src": 9, "png": [9, 11], "_alt": 9, "radio": [9, 11], "_valu": [9, 11, 15], "_check": 9, "ok": [9, 14], "inlin": [9, 15], "block": [9, 12, 15], "white": [9, 15], "arrai": [9, 15], "_col": 9, "_row": 9, "col": 9, "typewrit": 9, "monospac": 9, "unord": 9, "_c": 9, "suppress": 9, "ref": [9, 11], "compound": 9, "nice": 9, "0x7fa533ff7640": 9, "karg": 9, "suppli": 9, "first_onli": 9, "z": [9, 11], "jqueri": [9, 11, 15], "selector": [9, 15], "selector1": 9, "selector2": 9, "selectorn": 9, "descend": 9, "ancestor": 9, "_u": 9, "_disabl": 9, "abc": [9, 11], "xyz": [9, 11], "callabl": [9, 11], "el": 9, "textual": 9, "efg": 9, "timeoffset": 9, "sidebar_menu": 9, "i18n": 10, "p10n": 10, "IT": 10, "fr": 10, "dog": [10, 11, 15], "cane": [10, 15], "cani": [10, 15], "tantissimi": 10, "bed": 10, "czech": 10, "postel": 10, "postel\u00ed": 10, "warp": 10, "max": [10, 11, 15], "find_match": 10, "discov": 10, "update_languag": 10, "german": 10, "known_express": 10, "high": [11, 12], "formstyl": [11, 13, 15], "formstyledefault": [11, 13], "dbio": 11, "keep_valu": 11, "form_nam": 11, "csrf_session": 11, "csrf_protect": 11, "lifespan": 11, "signing_info": 11, "formstylebulma": [11, 13, 15], "formstylebootstrap4": 11, "form_minim": 11, "product_nam": 11, "product_quant": 11, "not_accept": 11, "form_exampl": 11, "intention": 11, "form_bas": 11, "realnam": 11, "dc": [11, 12], "comic": 11, "marvel": 11, "dual": 11, "bottom": 11, "dropdown": [11, 13, 15], "prototyp": [11, 15], "your_app": 11, "form_upload": 11, "required_fold": 11, "checkboxwidget": 11, "datetimewidget": 11, "fileuploadwidget": 11, "listwidget": 11, "passwordwidget": 11, "radiowidget": 11, "selectwidget": 11, "textareawidget": 11, "improv": [11, 12, 13], "form_widget": 11, "form_custom_widget": 11, "mycustomwidget": 11, "no_tabl": [11, 15], "s_": [11, 15], "_placehold": [11, 15], "_titl": [11, 15], "_style": [11, 15], "mystyl": 11, "foreground": 11, "granulari": 11, "submiss": [11, 15], "detail_field": 11, "clash": 11, "isn": [11, 13], "surround": 11, "correctli": 11, "stuff": [11, 13], "param": [11, 12, 13, 14, 15], "_onclick": 11, "doh": 11, "cancel": [11, 15], "attr": [11, 13, 15], "histori": 11, "drop": 11, "error_messag": 11, "fist": 11, "fill": [11, 15], "letter": 11, "alphanumer": 11, "lower": 11, "phone": 11, "strict": 11, "substr": 11, "fit": 11, "boundari": 11, "maxsiz": 11, "255": 11, "minsiz": 11, "16": 11, "1kb": 11, "1mb": 11, "1048576": 11, "1024": 11, "cgi": 11, "fieldstorag": 11, "intuit": 11, "reject": 11, "scheme": 11, "domain": [11, 12], "rfc": 11, "2616": 11, "semant": [11, 12], "abbrevi": 11, "ca": 11, "2396": 11, "allowed_schem": 11, "exclud": 11, "prepend_schem": 11, "idn": 11, "3490": 11, "ascii": 11, "punycod": 11, "3492": 11, "bit": 11, "beyond": 11, "hex": 11, "0x4e86": 11, "becom": 11, "4e": 11, "86": 11, "ftp": 11, "maxlen": 11, "slug": 11, "dash": 11, "native_json": 11, "hh": 11, "mm": 11, "ss": 11, "yyyi": 11, "dd": 11, "symbol": 11, "year": [11, 15], "centuri": 11, "1963": 11, "dai": 11, "month": 11, "28": 11, "08": 11, "aug": 11, "august": 11, "hour": 11, "24": 11, "clock": 11, "12": 11, "am": 11, "pm": 11, "minut": 11, "59": 11, "2008": 11, "2009": 11, "empty_regex": 11, "dot": 11, "fall": 11, "arithmet": 11, "ie": 11, "convers": [11, 16], "prime": 11, "appl": 11, "banana": 11, "cherri": 11, "alphabet": 11, "hulk": 11, "06": 11, "multiselect": 11, "forbidden": 11, "clever": 11, "enough": [11, 12, 13], "entropi": 11, "53": 11, "pbkdf2": 11, "md5": 11, "hmac": 11, "thisisthekei": 11, "useless": [11, 14], "salt": 11, "constant": 11, "mysaltvalu": 11, "Or": 11, "somewhat": 11, "min_length": 11, "alg": 11, "filter_in": 11, "split_email": 11, "findal": 11, "mailto": 11, "textarea": 11, "blank": [11, 13], "onvalid": 11, "emails_onvalid": 11, "attempt": [11, 12], "through": 11, "dimens": 11, "height": [11, 13, 15], "bmp": 11, "gif": 11, "jpeg": 11, "taken": 11, "source1": 11, "lowercas": 11, "bypass": [11, 12, 13], "200x200": 11, "pixel": 11, "lastdot": 11, "tar": 11, "gz": 11, "thumbnail": 11, "jpg": 11, "older": 11, "regexlib": 11, "minip": 11, "maxip": 11, "is_localhost": 11, "is_priv": 11, "is_automat": 11, "lowest": 11, "highest": 11, "flag": 11, "168": 11, "199": 11, "forbid": 11, "169": 11, "254": 11, "network": [11, 12], "is_link_loc": 11, "is_reserv": 11, "is_multicast": 11, "is_rout": 11, "is_6to4": 11, "is_teredo": 11, "subnet": 11, "ipv6": 11, "alloc": 11, "reserv": 11, "fe80": 11, "ietf": 11, "multicast": 11, "ff00": 11, "6to4": 11, "2002": 11, "teredo": 11, "2001": 11, "member": [11, 12], "fb00": 11, "456": 11, "123456": 11, "synopsi": 11, "her": 11, "race": 11, "operationalerror": 11, "dbset": 11, "allowed_overrid": 11, "registration_stamp": 11, "timedelta": 11, "value_field": 11, "representing_field": 11, "fourth": 11, "ten": 11, "orderbi": [11, 12, 13, 15], "groupbi": 11, "useful": 11, "_and": 11, "check_nonnegative_quant": 11, "vital": 12, "multius": 12, "interchang": 12, "guidelin": 12, "approv": 12, "request_reset_password": 12, "reset_password": 12, "verify_email": 12, "change_email": 12, "allowed_act": 12, "verif": 12, "successfulli": 12, "challeng": 12, "two_factor_filt": 12, "sampl": 12, "user_outside_network": 12, "ipaddress": 12, "22": 12, "ip_list": 12, "ipv4network": 12, "ipv4address": 12, "mfa": 12, "send_two_factor_email": 12, "sender": 12, "from_address": 12, "youremail": 12, "flow": 12, "two_factor": 12, "endpoint": [12, 15], "_next_url": 12, "auth_plugin": 12, "hierarch": 12, "saml": 12, "oauth": 12, "adapt": [12, 15], "pam_plugin": 12, "pamplugin": 12, "register_plugin": 12, "mount": 12, "directori": 12, "ldap_plugin": 12, "ldapplugin": 12, "ldap_set": 12, "base_dn": 12, "cn": 12, "ubuntu": 12, "apt": 12, "libldap2": 12, "dev": 12, "libsasl2": 12, "oauth2googl": 12, "client_id": 12, "client_secret": 12, "callback_url": 12, "callback": [12, 15], "oauth2facebook": 12, "oauth2discord": 12, "discord_client_id": 12, "discord_client_secret": 12, "uri": 12, "discrimin": 12, "overkil": 12, "tagged_db": 12, "_tag": 12, "tagged_nam": 12, "dancer": 12, "teacher": 12, "auth_user_tagged_group": 12, "foot": 12, "not_author": 12, "find_by_tag": 12, "has_membership": 12, "school": 12, "physic": 12, "creativ": 12, "auth_group": 12, "zapper": 12, "zap_id": 12, "zap": 12, "belong": [12, 14], "further": 12, "switch_imperson": 12, "is_imperson": 12, "stop_imperson": 12, "next_url": 12, "corner": 13, "stone": 13, "sort": 13, "desc": 13, "search_queri": 13, "search_form": 13, "jpsteil": 13, "grid_tutori": 13, "doubt": 13, "preciou": 13, "hint": [13, 16], "gridclassstylebulma": 13, "grid_class_styl": 13, "gridclassstyl": 13, "val": [13, 15], "perfectli": 13, "usabl": 13, "refresh": 13, "lead": 13, "topic": [13, 16], "htmx": [13, 16], "field_id": 13, "show_id": 13, "pre_action_button": 13, "post_action_button": 13, "auto_process": [13, 15], "rows_per_pag": 13, "include_action_button_text": 13, "search_button_text": 13, "action_button": 13, "gather": 13, "dure": 13, "addition": 13, "fifth": 13, "clickabl": 13, "portion": 13, "primarili": 13, "class_styl": 13, "bootstrap": 13, "init": 13, "gridactionbutton": 13, "additional_class": 13, "additional_styl": 13, "override_class": 13, "override_styl": 13, "append_id": 13, "ignore_attribute_plugin": 13, "fa": 13, "calendar": 13, "id_field_nam": 13, "id_valu": 13, "querystr": 13, "10px": 13, "foo": 13, "coupl": [13, 15], "filter_out": 13, "compani": 13, "is_null_or": 13, "downfal": 13, "search_text": 13, "migrat": [14, 16], "predetermin": 14, "constrain": 14, "my_url_path": 14, "postfix": 14, "matter": 14, "wrapper": [14, 15], "hard": 14, "analogi": 14, "hous": 14, "preprocess": 14, "postprocess": 14, "carri": 14, "underli": 14, "exact": 14, "danger": 14, "pyweb": 14, "abil": 14, "requires_": 14, "rocket": 14, "301": 14, "sophist": 14, "file_path": 14, "csv": 14, "app_fold": 14, "requires_login": 14, "user_email": 14, "fetch": [14, 15], "websocket": 15, "async": 15, "great": 15, "react": 15, "reap": 15, "ecosystem": 15, "road": 15, "reactiv": 15, "emerg": 15, "leader": 15, "technic": 15, "transit": 15, "socket": 15, "hypertext": 15, "cit1601": 15, "frontend": 15, "hx": 15, "_hx": 15, "url_to_post_to": 15, "htmx_form_demo": 15, "htmx_list": 15, "htmx_form": 15, "cancel_attr": 15, "sidecar": 15, "unpkg": 15, "sh": 15, "mainten": 15, "anchor": 15, "fanci": 15, "htmx_grid": 15, "attributes_plugin": 15, "attributespluginhtmx": 15, "new_sidecar": 15, "edit_sidecar": 15, "functool": 15, "autocomplete_queri": 15, "fk_tabl": 15, "ktabl": 15, "fk_field": 15, "kfield": 15, "_autocomplete_search_field": 15, "sf": 15, "_search": 15, "len": 15, "data_label": 15, "htmxautocompletewidget": 15, "simple_queri": 15, "pop": 15, "todo": 15, "hidden_input": 15, "hidden_div": 15, "keyup": 15, "500m": 15, "s_autocomplete_result": 15, "search_valu": 15, "s_search": 15, "_autocomplet": 15, "onload": 15, "elt": 15, "queryselector": 15, "onkeydown": 15, "check_": 15, "s_down_kei": 15, "keycod": 15, "s_autocomplet": 15, "focu": 15, "selectedindex": 15, "formatt": 15, "formstylefactori": 15, "class_inner_except": 15, "vendor": 15, "vendor_typ": 15, "product_record": 15, "earlier": 15, "whichev": 15, "subqueri": 15, "builder": 15, "selected_el": 15, "queryselectoral": 15, "eval": 15, "sandbox": 15, "math": 15, "nicer": 15, "recereiv": 15, "get_cooki": 15, "register_vue_compon": 15, "lazili": 15, "upload_help": 15, "bind": 15, "my_id": 15, "reimplement": 15, "tanti": 15, "clientsid": 15, "serversid": 15, "debounc": 15, "setinterv": 15, "500": 15, "200m": 15, "onclick": 15, "1000m": 15, "tags_input": 15, "jsl": 15, "zip_cod": 15, "freetext": 15, "safari": 15, "edg": 15, "datalist": 15, "firfox": 15, "undocu": 15, "border": 15, "radiu": 15, "100px": 15, "111111": 15, "3em": 15, "2em": 15, "2px": 15, "pointer": 15, "opac": 15, "capit": 15, "tag_input": 15, "score_input": 15, "score": 15, "new_password": 15, "poor": 15, "man": 15, "trap": 15, "component_1": 15, "mycompon": 15, "blink": 15, "envelop": 15, "other_pag": 15, "acknowledg": 16, "procedur": 16, "scratch": 16, "urlsign": 16, "memoiz": 16, "raw": 16, "sql": 16, "export": 16, "gotcha": 16, "overview": 16, "imperson": 16, "asyncio": 16}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"what": 0, "i": [0, 9], "py4web": [0, 1, 6, 14, 15, 16], "acknowledg": 0, "help": 1, "resourc": 1, "hint": 1, "thi": 1, "manual": [1, 16], "The": [1, 3, 4, 5, 6, 7, 11, 13, 15], "googl": [1, 2, 6, 12], "group": [1, 6], "discord": [1, 12], "server": [1, 5, 6, 9], "tutori": 1, "video": 1, "sourc": [1, 2], "github": 1, "tip": 1, "prerequisit": [1, 2], "A": [1, 9, 11], "modern": 1, "python": 1, "workplac": 1, "debug": 1, "vscode": 1, "pycharm": 1, "how": 1, "contribut": 1, "instal": 2, "startup": 2, "understand": 2, "design": [2, 11], "support": [2, 6], "platform": 2, "setup": 2, "procedur": 2, "from": [2, 4, 6, 14], "binari": 2, "pip": 2, "us": [2, 5, 6, 8, 9, 12, 13, 15], "virtual": [2, 6], "environ": 2, "global": 2, "local": 2, "upgrad": 2, "first": [2, 4, 6], "run": [2, 6], "command": [2, 6], "line": 2, "option": [2, 9, 11], "call": [2, 14], "new_app": 2, "set_password": 2, "shell": [2, 6], "version": [2, 6], "special": [2, 11], "http": 2, "wsgi": 2, "deploy": 2, "gcloud": 2, "aka": 2, "gae": 2, "app": [2, 4], "engin": 2, "pythonanywher": 2, "com": 2, "docker": 2, "podman": 2, "ubuntu": 2, "dashboard": 3, "main": 3, "web": [3, 4], "page": [3, 4, 8], "login": 3, "creat": 4, "your": 4, "scratch": 4, "static": 4, "dynam": 4, "On": 4, "return": [4, 8, 14], "valu": [4, 6], "rout": 4, "request": 4, "object": [4, 12, 13, 15], "templat": [4, 5, 8, 13], "_scaffold": 4, "copi": [4, 6], "watch": 4, "file": [4, 10, 11, 14], "chang": 4, "fixtur": 5, "inject": [5, 9], "translat": [5, 10], "flash": [5, 14], "session": 5, "client": 5, "side": [5, 9], "cooki": 5, "memcach": 5, "redi": 5, "databas": [5, 6, 11], "anywher": 5, "share": 5, "condit": 5, "urlsign": 5, "dal": [5, 6], "auth": [5, 12, 14], "caveat": 5, "about": [5, 6], "custom": [5, 6, 9, 11, 13], "multipl": [5, 12], "cach": [5, 6], "memoiz": 5, "conveni": 5, "decor": 5, "abstract": 6, "layer": 6, "introduct": 6, "model": 6, "quick": 6, "tour": 6, "stand": 6, "alon": 6, "experi": 6, "constructor": [6, 11], "signatur": 6, "connect": 6, "string": [6, 15], "uri": 6, "paramet": [6, 11, 13], "pool": 6, "failur": 6, "attempt": 6, "lazi": 6, "tabl": [6, 9, 16], "less": 6, "applic": 6, "replic": 6, "reserv": 6, "keyword": 6, "quot": 6, "case": 6, "set": [6, 11, 13, 14], "make": 6, "secur": [6, 11], "other": [6, 11], "folder": 6, "locat": 6, "default": [6, 8], "migrat": 6, "commit": 6, "rollback": 6, "define_t": 6, "id": 6, "note": 6, "primari": 6, "kei": [6, 13], "plural": [6, 10], "singular": 6, "redefin": 6, "format": [6, 11, 15], "record": 6, "represent": 6, "rname": 6, "real": 6, "name": 6, "primarykei": 6, "legaci": 6, "fake_migr": 6, "table_class": 6, "sequence_nam": 6, "trigger_nam": 6, "polymodel": 6, "on_defin": 6, "ad": 6, "attribut": 6, "field": [6, 11, 13], "type": [6, 11], "valid": [6, 11], "time": [6, 11], "modif": 6, "more": 6, "upload": [6, 11], "fix": 6, "broken": 6, "control": 6, "summari": 6, "method": [6, 14], "insert": 6, "queri": 6, "row": 6, "update_or_insert": 6, "validate_and_insert": 6, "validate_and_upd": 6, "drop": 6, "tag": [6, 9, 11, 12], "raw": 6, "sql": 6, "executesql": 6, "_lastsql": 6, "index": 6, "gener": 6, "select": [6, 9], "an": 6, "iter": 6, "base": 6, "lower": 6, "memori": 6, "render": 6, "repres": 6, "shortcut": 6, "fetch": 6, "recurs": 6, "orderbi": 6, "groupbi": 6, "limitbi": 6, "distinct": 6, "have": 6, "orderby_on_limitbi": 6, "join": 6, "left": 6, "cacheabl": 6, "logic": 6, "oper": 6, "count": 6, "isempti": 6, "delet": 6, "updat": [6, 10], "express": 6, "update_record": 6, "dictionari": [6, 11], "last": 6, "as_dict": 6, "as_list": 6, "combin": 6, "find": [6, 9], "exclud": 6, "sort": [6, 11], "comput": 6, "new": 6, "style": [6, 9, 13], "experiment": 6, "old": 6, "relat": 6, "One": 6, "mani": 6, "inner": 6, "outer": 6, "self": 6, "refer": [6, 13, 16], "alias": 6, "like": 6, "ilik": 6, "regexp": 6, "startswith": 6, "endswith": 6, "contain": 6, "upper": 6, "year": 6, "month": 6, "dai": 6, "hour": 6, "minut": 6, "second": 6, "belong": 6, "sum": 6, "avg": 6, "min": 6, "max": 6, "len": 6, "substr": 6, "coalesc": 6, "coalesce_zero": 6, "export": 6, "import": 6, "data": 6, "csv": 6, "one": 6, "all": 6, "onc": 6, "remot": 6, "synchron": 6, "html": [6, 9], "xml": [6, 9], "advanc": [6, 11, 15], "featur": [6, 13], "list": 6, "inherit": 6, "filter_in": 6, "filter_out": 6, "callback": 6, "cascad": 6, "common": 6, "filter": [6, 13], "without": [6, 11], "defin": 6, "distribut": 6, "transact": 6, "db": 6, "anoth": 6, "gotcha": 6, "adapt": 6, "sqlite": 6, "mysql": 6, "mssql": 6, "microsoft": 6, "oracl": 6, "nosql": 6, "datastor": 6, "restapi": 7, "polici": 7, "action": [7, 12, 13], "get": 7, "practic": 7, "exampl": [7, 11, 13, 14, 15], "respons": 7, "yatl": [8, 9], "languag": 8, "basic": [8, 11, 13], "syntax": 8, "while": 8, "elif": 8, "els": 8, "try": 8, "except": 8, "final": 8, "def": 8, "inform": 8, "workflow": 8, "extend": 8, "includ": 8, "variabl": [8, 14], "function": [8, 11], "block": 8, "super": 8, "layout": 8, "standard": [8, 11], "structur": [8, 11], "mobil": 8, "develop": 8, "helper": 9, "overview": 9, "built": 9, "bodi": 9, "cat": 9, "div": 9, "em": 9, "form": [9, 11, 14, 15], "h1": 9, "h2": 9, "h3": 9, "h4": 9, "h5": 9, "h6": 9, "head": 9, "img": 9, "input": 9, "label": 9, "li": 9, "ol": 9, "p": 9, "pre": 9, "script": 9, "span": 9, "tr": 9, "td": 9, "tbodi": 9, "textarea": 9, "th": 9, "thead": 9, "titl": 9, "tt": 9, "ul": 9, "url": 9, "beautifi": 9, "dom": 9, "children": 9, "internation": 10, "minim": 11, "widget": [11, 15], "manipul": 11, "sidecar": 11, "text": 11, "is_alphanumer": 11, "is_low": 11, "is_upp": 11, "is_email": 11, "is_match": 11, "is_length": 11, "is_url": 11, "is_slug": 11, "is_json": 11, "date": 11, "is_tim": 11, "is_dat": 11, "is_datetim": 11, "is_date_in_rang": 11, "is_datetime_in_rang": 11, "rang": 11, "equal": 11, "is_equal_to": 11, "is_not_empti": 11, "is_null_or": 11, "is_empty_or": 11, "is_expr": 11, "is_decimal_in_rang": 11, "is_float_in_rang": 11, "is_int_in_rang": 11, "is_in_set": 11, "checkbox": 11, "tupl": 11, "complex": 11, "is_strong": 11, "crypt": 11, "is_list_of": 11, "is_list_of_email": 11, "any_of": 11, "is_imag": 11, "is_fil": 11, "is_upload_filenam": 11, "is_ipv4": 11, "is_ipv6": 11, "is_ipaddress": 11, "cleanup": 11, "is_not_in_db": 11, "is_in_db": 11, "authent": 12, "author": 12, "ui": 12, "insid": 12, "two": 12, "factor": 12, "two_factor_requir": 12, "two_factor_send": 12, "two_factor_tri": 12, "plugin": 12, "pam": 12, "ldap": 12, "oauth2": 12, "facebook": 12, "permiss": 12, "user": 12, "imperson": 12, "grid": [13, 14, 15], "search": 13, "crud": 13, "column": 13, "button": 13, "sampl": 13, "class": 13, "callabl": 13, "web2pi": 14, "simpl": 14, "convers": 14, "hello": 14, "world": 14, "redirect": 14, "arg": 14, "up": 14, "counter": 14, "view": 14, "access": 14, "o": 14, "topic": 15, "asyncio": 15, "htmx": 15, "usag": 15, "autocomplet": 15, "util": 15, "j": 15, "q": 15, "t": 15, "content": 16, "indic": 16}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"What is py4web?": [[0, "what-is-py4web"]], "Acknowledgments": [[0, "acknowledgments"]], "Help, resources and hints": [[1, "help-resources-and-hints"]], "Resources": [[1, "resources"]], "This manual": [[1, "this-manual"]], "The Google group": [[1, "the-google-group"]], "The Discord server": [[1, "the-discord-server"]], "Tutorials and video": [[1, "tutorials-and-video"]], "The sources on GitHub": [[1, "the-sources-on-github"]], "Hints and tips": [[1, "hints-and-tips"]], "Prerequisites": [[1, "prerequisites"]], "A modern python workplace": [[1, "a-modern-python-workplace"]], "Debugging py4web with VScode": [[1, "debugging-py4web-with-vscode"]], "Debugging py4web with PyCharm": [[1, "debugging-py4web-with-pycharm"]], "How to contribute": [[1, "how-to-contribute"]], "Installation and Startup": [[2, "installation-and-startup"]], "Understanding the design": [[2, "understanding-the-design"]], "Supported platforms and prerequisites": [[2, "supported-platforms-and-prerequisites"]], "Setup procedures": [[2, "setup-procedures"]], "Installing from binaries": [[2, "installing-from-binaries"]], "Installing from pip": [[2, "installing-from-pip"]], "Installing using a virtual environment": [[2, "installing-using-a-virtual-environment"]], "Installing from source (globally)": [[2, "installing-from-source-globally"]], "Installing from source (locally)": [[2, "installing-from-source-locally"]], "Upgrading": [[2, "upgrading"]], "First run": [[2, "first-run"]], "Command line options": [[2, "command-line-options"]], "call command option": [[2, "call-command-option"]], "new_app command option": [[2, "new-app-command-option"]], "run command option": [[2, "run-command-option"]], "set_password command option": [[2, "set-password-command-option"]], "setup command option": [[2, "setup-command-option"]], "shell command option": [[2, "shell-command-option"]], "version command option": [[2, "version-command-option"]], "Special installations": [[2, "special-installations"]], "HTTPS": [[2, "https"]], "WSGI": [[2, "wsgi"]], "Deployment on GCloud (aka GAE - Google App Engine)": [[2, "deployment-on-gcloud-aka-gae-google-app-engine"]], "Deployment on PythonAnywhere.com": [[2, "deployment-on-pythonanywhere-com"]], "Deployment on Docker/Podman": [[2, "deployment-on-docker-podman"]], "Deployment on Ubuntu": [[2, "deployment-on-ubuntu"]], "The Dashboard": [[3, "the-dashboard"]], "The main Web page": [[3, "the-main-web-page"]], "Login into the Dashboard": [[3, "login-into-the-dashboard"]], "Creating your first app": [[4, "creating-your-first-app"]], "From scratch": [[4, "from-scratch"]], "Static web pages": [[4, "static-web-pages"]], "Dynamic Web Pages": [[4, "dynamic-web-pages"]], "On return values": [[4, "on-return-values"]], "Routes": [[4, "routes"]], "The request object": [[4, "the-request-object"]], "Templates": [[4, "templates"]], "The _scaffold app": [[4, "the-scaffold-app"]], "Copying the _scaffold app": [[4, "copying-the-scaffold-app"]], "Watch for files change": [[4, "watch-for-files-change"]], "Fixtures": [[5, "fixtures"]], "Using Fixtures": [[5, "using-fixtures"]], "The Template fixture": [[5, "the-template-fixture"]], "The Inject fixture": [[5, "the-inject-fixture"]], "The Translator fixture": [[5, "the-translator-fixture"]], "The Flash fixture": [[5, "the-flash-fixture"]], "The Session fixture": [[5, "the-session-fixture"]], "Client-side session in cookies": [[5, "client-side-session-in-cookies"]], "Server-side session in memcache": [[5, "server-side-session-in-memcache"]], "Server-side session in Redis": [[5, "server-side-session-in-redis"]], "Server-side session in database": [[5, "server-side-session-in-database"]], "Server-side session anywhere": [[5, "server-side-session-anywhere"]], "Sharing sessions": [[5, "sharing-sessions"]], "The Condition fixture": [[5, "the-condition-fixture"]], "The URLsigner fixture": [[5, "the-urlsigner-fixture"]], "The DAL fixture": [[5, "the-dal-fixture"]], "The Auth fixture": [[5, "the-auth-fixture"]], "Caveats about fixtures": [[5, "caveats-about-fixtures"]], "Custom fixtures": [[5, "custom-fixtures"]], "Multiple fixtures": [[5, "multiple-fixtures"]], "Caching and Memoize": [[5, "caching-and-memoize"]], "Convenience Decorators": [[5, "convenience-decorators"]], "The Database Abstraction Layer (DAL)": [[6, "the-database-abstraction-layer-dal"]], "DAL introduction": [[6, "dal-introduction"]], "py4web model": [[6, "py4web-model"]], "Supported databases": [[6, "supported-databases"]], "The DAL: a quick tour": [[6, "the-dal-a-quick-tour"]], "Using the DAL \u201cstand-alone\u201d": [[6, "using-the-dal-stand-alone"]], "Experiment with the py4web shell": [[6, "experiment-with-the-py4web-shell"]], "DAL constructor": [[6, "dal-constructor"]], "DAL signature": [[6, "dal-signature"]], "Connection strings (the uri parameter)": [[6, "connection-strings-the-uri-parameter"]], "Connection pooling": [[6, "connection-pooling"]], "Connection failures (attempts parameter)": [[6, "connection-failures-attempts-parameter"]], "Lazy Tables": [[6, "lazy-tables"]], "Model-less applications": [[6, "model-less-applications"]], "Replicated databases": [[6, "replicated-databases"]], "Reserved keywords": [[6, "reserved-keywords"]], "Database quoting and case settings": [[6, "database-quoting-and-case-settings"]], "Making a secure connection": [[6, "making-a-secure-connection"]], "Other DAL constructor parameters": [[6, "other-dal-constructor-parameters"]], "Database folder location": [[6, "database-folder-location"]], "Default migration settings": [[6, "default-migration-settings"]], "commit and rollback": [[6, "commit-and-rollback"]], "Table constructor": [[6, "table-constructor"]], "define_table signature": [[6, "define-table-signature"]], "id: Notes about the primary key": [[6, "id-notes-about-the-primary-key"]], "plural and singular": [[6, "plural-and-singular"]], "redefine": [[6, "redefine"]], "format: Record representation": [[6, "format-record-representation"]], "rname: Real name": [[6, "rname-real-name"]], "primarykey: Support for legacy tables": [[6, "primarykey-support-for-legacy-tables"]], "migrate, fake_migrate": [[6, "migrate-fake-migrate"]], "table_class": [[6, "table-class"]], "sequence_name": [[6, "sequence-name"]], "trigger_name": [[6, "trigger-name"]], "polymodel": [[6, "polymodel"]], "on_define": [[6, "on-define"]], "Adding attributes to fields and tables": [[6, "adding-attributes-to-fields-and-tables"]], "Legacy databases and keyed tables": [[6, "legacy-databases-and-keyed-tables"]], "Field constructor": [[6, "field-constructor"]], "Field types and validators": [[6, "field-types-and-validators"]], "Run-time field and table modification": [[6, "run-time-field-and-table-modification"]], "More on uploads": [[6, "more-on-uploads"]], "Migrations": [[6, "migrations"]], "Fixing broken migrations": [[6, "fixing-broken-migrations"]], "Migration control summary": [[6, "migration-control-summary"]], "Table methods": [[6, "table-methods"]], "insert": [[6, "insert"]], "Query, Set, Rows": [[6, "query-set-rows"]], "update_or_insert": [[6, "update-or-insert"]], "validate_and_insert, validate_and_update": [[6, "validate-and-insert-validate-and-update"]], "drop": [[6, "drop"]], "Tagging records": [[6, "tagging-records"]], "Raw SQL": [[6, "raw-sql"]], "executesql": [[6, "executesql"]], "_lastsql": [[6, "lastsql"]], "Timing queries": [[6, "timing-queries"]], "Indexes": [[6, "indexes"]], "Generating raw SQL": [[6, "generating-raw-sql"]], "select command": [[6, "select-command"]], "Using an iterator-based select for lower memory use": [[6, "using-an-iterator-based-select-for-lower-memory-use"]], "Rendering rows using represent": [[6, "rendering-rows-using-represent"]], "Shortcuts": [[6, "shortcuts"]], "Fetching a Row": [[6, "fetching-a-row"]], "Recursive selects": [[6, "recursive-selects"]], "orderby, groupby, limitby, distinct, having, orderby_on_limitby, join, left, cache": [[6, "orderby-groupby-limitby-distinct-having-orderby-on-limitby-join-left-cache"]], "orderby": [[6, "orderby"]], "groupby, having": [[6, "groupby-having"]], "distinct": [[6, "distinct"]], "limitby": [[6, "limitby"]], "orderby_on_limitby": [[6, "orderby-on-limitby"]], "join, left": [[6, "join-left"]], "cache, cacheable": [[6, "cache-cacheable"]], "Logical operators": [[6, "logical-operators"]], "count, isempty, delete, update": [[6, "count-isempty-delete-update"]], "Expressions": [[6, "expressions"]], "case": [[6, "case"]], "update_record": [[6, "update-record"]], "Inserting and updating from a dictionary": [[6, "inserting-and-updating-from-a-dictionary"]], "first and last": [[6, "first-and-last"]], "as_dict and as_list": [[6, "as-dict-and-as-list"]], "Combining rows": [[6, "combining-rows"]], "find, exclude, sort": [[6, "find-exclude-sort"]], "Caching selects": [[6, "caching-selects"]], "Computed and Virtual fields": [[6, "computed-and-virtual-fields"]], "Computed fields": [[6, "computed-fields"]], "Virtual fields": [[6, "virtual-fields"]], "New style virtual fields (experimental)": [[6, "new-style-virtual-fields-experimental"]], "Old style virtual fields": [[6, "old-style-virtual-fields"]], "Joins and Relations": [[6, "joins-and-relations"]], "One to many relation": [[6, "one-to-many-relation"]], "Inner join": [[6, "inner-join"]], "Left outer join": [[6, "left-outer-join"]], "Grouping and counting": [[6, "grouping-and-counting"]], "Many to many relation": [[6, "many-to-many-relation"]], "Self-Reference and aliases": [[6, "self-reference-and-aliases"]], "Other operators": [[6, "other-operators"]], "like, ilike, regexp, startswith, endswith, contains, upper, lower": [[6, "like-ilike-regexp-startswith-endswith-contains-upper-lower"]], "year, month, day, hour, minutes, seconds": [[6, "year-month-day-hour-minutes-seconds"]], "belongs": [[6, "belongs"]], "sum, avg, min, max and len": [[6, "sum-avg-min-max-and-len"]], "Substrings": [[6, "substrings"]], "Default values with coalesce and coalesce_zero": [[6, "default-values-with-coalesce-and-coalesce-zero"]], "Exporting and importing data": [[6, "exporting-and-importing-data"]], "CSV (one Table at a time)": [[6, "csv-one-table-at-a-time"]], "CSV (all tables at once)": [[6, "csv-all-tables-at-once"]], "CSV and remote database synchronization": [[6, "csv-and-remote-database-synchronization"]], "HTML and XML (one Table at a time)": [[6, "html-and-xml-one-table-at-a-time"]], "Data representation": [[6, "data-representation"]], "Advanced features": [[6, "advanced-features"]], "list: and contains": [[6, "list-type-and-contains"]], "Table inheritance": [[6, "table-inheritance"]], "filter_in and filter_out": [[6, "filter-in-and-filter-out"]], "callbacks on record insert, delete and update": [[6, "callbacks-on-record-insert-delete-and-update"]], "Database cascades": [[6, "database-cascades"]], "Record versioning": [[6, "record-versioning"]], "Common filters": [[6, "common-filters"]], "Custom Field types": [[6, "custom-field-types"]], "Using DAL without define tables": [[6, "using-dal-without-define-tables"]], "Distributed transaction": [[6, "distributed-transaction"]], "Copy data from one db into another": [[6, "copy-data-from-one-db-into-another"]], "Gotchas": [[6, "gotchas"]], "Note on new DAL and adapters": [[6, "note-on-new-dal-and-adapters"]], "SQLite": [[6, "sqlite"]], "MySQL": [[6, "mysql"]], "Google SQL": [[6, "google-sql"]], "MSSQL (Microsoft SQL Server)": [[6, "mssql-microsoft-sql-server"]], "Oracle": [[6, "oracle"]], "Google NoSQL (Datastore)": [[6, "google-nosql-datastore"]], "The RestAPI": [[7, "the-restapi"]], "RestAPI policies and actions": [[7, "restapi-policies-and-actions"]], "RestAPI GET": [[7, "restapi-get"]], "RestAPI practical examples": [[7, "restapi-practical-examples"]], "The RestAPI response": [[7, "the-restapi-response"]], "YATL Template Language": [[8, "yatl-template-language"]], "Basic syntax": [[8, "basic-syntax"]], "for...in": [[8, "for-in"]], "while": [[8, "while"]], "if...elif...else": [[8, "if-elif-else"]], "try...except...else...finally": [[8, "try-except-else-finally"]], "def...return": [[8, "def-return"]], "Information workflow": [[8, "information-workflow"]], "extend and include": [[8, "extend-and-include"]], "Extending using variables": [[8, "extending-using-variables"]], "Template Functions": [[8, "template-functions"]], "block and super": [[8, "block-and-super"]], "Page layout standard structure": [[8, "page-layout-standard-structure"]], "Default page layout": [[8, "default-page-layout"]], "Mobile development": [[8, "mobile-development"]], "YATL helpers": [[9, "yatl-helpers"]], "Helpers overview": [[9, "helpers-overview"]], "Built-in helpers": [[9, "built-in-helpers"]], "XML": [[9, "xml"]], "A": [[9, "a"]], "BODY": [[9, "body"]], "CAT": [[9, "cat"]], "DIV": [[9, "div"]], "EM": [[9, "em"]], "FORM": [[9, "form"]], "H1, H2, H3, H4, H5, H6": [[9, "h1-h2-h3-h4-h5-h6"]], "HEAD": [[9, "head"]], "HTML": [[9, "html"]], "I": [[9, "i"]], "IMG": [[9, "img"]], "INPUT": [[9, "input"]], "LABEL": [[9, "label"]], "LI": [[9, "li"]], "OL": [[9, "ol"]], "OPTION": [[9, "option"]], "P": [[9, "p"]], "PRE": [[9, "pre"]], "SCRIPT": [[9, "script"]], "SELECT": [[9, "select"]], "SPAN": [[9, "span"]], "STYLE": [[9, "style"]], "TABLE, TR, TD": [[9, "table-tr-td"]], "TBODY": [[9, "tbody"]], "TEXTAREA": [[9, "textarea"]], "TH": [[9, "th"]], "THEAD": [[9, "thead"]], "TITLE": [[9, "title"]], "TT": [[9, "tt"]], "UL": [[9, "ul"]], "URL": [[9, "url"]], "Custom helpers": [[9, "custom-helpers"]], "TAG": [[9, "tag"]], "BEAUTIFY": [[9, "beautify"]], "Server-side DOM": [[9, "server-side-dom"]], "children": [[9, "children"]], "find": [[9, "find"]], "Using Inject": [[9, "using-inject"]], "Internationalization": [[10, "internationalization"]], "Pluralize": [[10, "pluralize"]], "Update the translation files": [[10, "update-the-translation-files"]], "Forms": [[11, "forms"]], "The Form constructor": [[11, "the-form-constructor"]], "A minimal form example without a database": [[11, "a-minimal-form-example-without-a-database"]], "Basic form example": [[11, "basic-form-example"]], "File upload field": [[11, "file-upload-field"]], "Widgets": [[11, "widgets"]], "Standard widgets": [[11, "standard-widgets"]], "Custom widgets": [[11, "custom-widgets"]], "Advanced form design": [[11, "advanced-form-design"]], "Form structure manipulation": [[11, "form-structure-manipulation"]], "Custom forms": [[11, "custom-forms"]], "The sidecar parameter": [[11, "the-sidecar-parameter"]], "Form validation": [[11, "form-validation"]], "Text format validators": [[11, "text-format-validators"]], "IS_ALPHANUMERIC": [[11, "is-alphanumeric"]], "IS_LOWER": [[11, "is-lower"]], "IS_UPPER": [[11, "is-upper"]], "IS_EMAIL": [[11, "is-email"]], "IS_MATCH": [[11, "is-match"]], "IS_LENGTH": [[11, "is-length"]], "IS_URL": [[11, "is-url"]], "IS_SLUG": [[11, "is-slug"]], "IS_JSON": [[11, "is-json"]], "Date and time validators": [[11, "date-and-time-validators"]], "IS_TIME": [[11, "is-time"]], "IS_DATE": [[11, "is-date"]], "IS_DATETIME": [[11, "is-datetime"]], "IS_DATE_IN_RANGE": [[11, "is-date-in-range"]], "IS_DATETIME_IN_RANGE": [[11, "is-datetime-in-range"]], "Range, set and equality validators": [[11, "range-set-and-equality-validators"]], "IS_EQUAL_TO": [[11, "is-equal-to"]], "IS_NOT_EMPTY": [[11, "is-not-empty"]], "IS_NULL_OR": [[11, "is-null-or"]], "IS_EMPTY_OR": [[11, "is-empty-or"]], "IS_EXPR": [[11, "is-expr"]], "IS_DECIMAL_IN_RANGE": [[11, "is-decimal-in-range"]], "IS_FLOAT_IN_RANGE": [[11, "is-float-in-range"]], "IS_INT_IN_RANGE": [[11, "is-int-in-range"]], "IS_IN_SET": [[11, "is-in-set"]], "Checkbox validation": [[11, "checkbox-validation"]], "Dictionaries and tuples with IS_IN_SET": [[11, "dictionaries-and-tuples-with-is-in-set"]], "Sorted options": [[11, "sorted-options"]], "IS_IN_SET and Tagging": [[11, "is-in-set-and-tagging"]], "Complexity and security validators": [[11, "complexity-and-security-validators"]], "IS_STRONG": [[11, "is-strong"]], "CRYPT": [[11, "crypt"]], "Special type validators": [[11, "special-type-validators"]], "IS_LIST_OF": [[11, "is-list-of"]], "IS_LIST_OF_EMAILS": [[11, "is-list-of-emails"]], "ANY_OF": [[11, "any-of"]], "IS_IMAGE": [[11, "is-image"]], "IS_FILE": [[11, "is-file"]], "IS_UPLOAD_FILENAME": [[11, "is-upload-filename"]], "IS_IPV4": [[11, "is-ipv4"]], "IS_IPV6": [[11, "is-ipv6"]], "IS_IPADDRESS": [[11, "is-ipaddress"]], "Other validators": [[11, "other-validators"]], "CLEANUP": [[11, "cleanup"]], "Database validators": [[11, "database-validators"]], "IS_NOT_IN_DB": [[11, "is-not-in-db"]], "IS_IN_DB": [[11, "is-in-db"]], "IS_IN_DB and Tagging": [[11, "is-in-db-and-tagging"]], "Validation functions": [[11, "validation-functions"]], "Authentication and authorization": [[12, "authentication-and-authorization"]], "Authentication using Auth": [[12, "authentication-using-auth"]], "Auth UI": [[12, "auth-ui"]], "Using Auth inside actions": [[12, "using-auth-inside-actions"]], "Two Factor Authentication": [[12, "two-factor-authentication"]], "two_factor_required": [[12, "two-factor-required"]], "two_factor_send": [[12, "two-factor-send"]], "two_factor_tries": [[12, "two-factor-tries"]], "Auth Plugins": [[12, "auth-plugins"]], "PAM": [[12, "pam"]], "LDAP": [[12, "ldap"]], "OAuth2 with Google": [[12, "oauth2-with-google"]], "OAuth2 with Facebook": [[12, "oauth2-with-facebook"]], "OAuth2 with Discord": [[12, "oauth2-with-discord"]], "Authorization using Tags": [[12, "authorization-using-tags"]], "Tags and Permissions": [[12, "tags-and-permissions"]], "Multiple Tags objects": [[12, "multiple-tags-objects"]], "User Impersonation": [[12, "user-impersonation"]], "Grid": [[13, "grid"]], "Key features": [[13, "key-features"]], "Basic grid example": [[13, "basic-grid-example"]], "The Grid object": [[13, "the-grid-object"]], "Searching and filtering": [[13, "searching-and-filtering"]], "CRUD settings": [[13, "crud-settings"]], "Custom columns": [[13, "custom-columns"]], "Using templates": [[13, "using-templates"]], "Customizing style": [[13, "customizing-style"]], "Custom Action Buttons": [[13, "custom-action-buttons"]], "Sample Action Button Class": [[13, "sample-action-button-class"]], "Using callable parameters": [[13, "using-callable-parameters"]], "Reference Fields": [[13, "reference-fields"]], "From web2py to py4web": [[14, "from-web2py-to-py4web"]], "Simple conversion examples": [[14, "simple-conversion-examples"]], "\u201cHello world\u201d example": [[14, "hello-world-example"]], "\u201cRedirect with variables\u201d example": [[14, "redirect-with-variables-example"]], "\u201cReturning variables\u201d example": [[14, "returning-variables-example"]], "\u201cReturning args\u201d example": [[14, "returning-args-example"]], "\u201cReturn calling methods\u201d example": [[14, "return-calling-methods-example"]], "\u201cSetting up a counter\u201d example": [[14, "setting-up-a-counter-example"]], "\u201cView\u201d example": [[14, "view-example"]], "\u201cForm and flash\u201d example": [[14, "form-and-flash-example"]], "\u201cgrid\u201d example": [[14, "grid-example"]], "\u201cAccessing OS files\u201d example": [[14, "accessing-os-files-example"]], "\u201cauth\u201d example": [[14, "auth-example"]], "Advanced topics and examples": [[15, "advanced-topics-and-examples"]], "py4web and asyncio": [[15, "py4web-and-asyncio"]], "htmx": [[15, "htmx"]], "htmx usage in Form": [[15, "htmx-usage-in-form"]], "htmx usage in Grid": [[15, "htmx-usage-in-grid"]], "Autocomplete Widget using htmx": [[15, "autocomplete-widget-using-htmx"]], "utils.js": [[15, "utils-js"]], "string.format": [[15, "string-format"]], "The Q object": [[15, "the-q-object"]], "The T object": [[15, "the-t-object"]], "py4web: the reference Manual": [[16, "py4web-the-reference-manual"]], "Contents:": [[16, null]], "Indices and tables": [[16, "indices-and-tables"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/apps/_documentation/static/pt/.buildinfo b/apps/_documentation/static/pt/.buildinfo index b8d235cb5..2017727df 100644 --- a/apps/_documentation/static/pt/.buildinfo +++ b/apps/_documentation/static/pt/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 9f04100a6a58698928add7415905ba84 +config: 11af2d5ac683425f4c63647016f0d2e3 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/apps/_documentation/static/pt/_static/basic.css b/apps/_documentation/static/pt/_static/basic.css index 7577acb1a..30fee9d0f 100644 --- a/apps/_documentation/static/pt/_static/basic.css +++ b/apps/_documentation/static/pt/_static/basic.css @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -670,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -738,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/apps/_documentation/static/pt/_static/css/theme.css b/apps/_documentation/static/pt/_static/css/theme.css index c03c88f06..19a446a0e 100644 --- a/apps/_documentation/static/pt/_static/css/theme.css +++ b/apps/_documentation/static/pt/_static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/apps/_documentation/static/pt/_static/documentation_options.js b/apps/_documentation/static/pt/_static/documentation_options.js index 131e1834e..e7ce8654a 100644 --- a/apps/_documentation/static/pt/_static/documentation_options.js +++ b/apps/_documentation/static/pt/_static/documentation_options.js @@ -1,6 +1,5 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.20230507.1', +const DOCUMENTATION_OPTIONS = { + VERSION: '1.20230718.1', LANGUAGE: 'pt', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/apps/_documentation/static/pt/_static/pygments.css b/apps/_documentation/static/pt/_static/pygments.css index 08bec689d..84ab3030a 100644 --- a/apps/_documentation/static/pt/_static/pygments.css +++ b/apps/_documentation/static/pt/_static/pygments.css @@ -17,6 +17,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #008400 } /* Generic.Inserted */ diff --git a/apps/_documentation/static/pt/_static/searchtools.js b/apps/_documentation/static/pt/_static/searchtools.js index 97d56a74d..7918c3fab 100644 --- a/apps/_documentation/static/pt/_static/searchtools.js +++ b/apps/_documentation/static/pt/_static/searchtools.js @@ -57,12 +57,12 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, searchTerms) => { +const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; const [docName, title, anchor, descr, score, _filename] = item; @@ -75,20 +75,24 @@ const _displayItem = (item, searchTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; + requestUrl = contentRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; + requestUrl = contentRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + anchor; linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) + if (descr) { listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) @@ -97,6 +101,9 @@ const _displayItem = (item, searchTerms) => { listItem.appendChild( Search.makeSearchSummary(data, searchTerms) ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -115,14 +122,15 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, - searchTerms + searchTerms, + highlightTerms, ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), searchTerms); + _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( - () => _displayNextItem(results, resultCount, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), 5 ); } @@ -360,7 +368,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, searchTerms); + _displayNextItem(results, results.length, searchTerms, highlightTerms); }, /** diff --git a/apps/_documentation/static/pt/_static/translations.js b/apps/_documentation/static/pt/_static/translations.js index b1ae839f6..71c62bb83 100644 --- a/apps/_documentation/static/pt/_static/translations.js +++ b/apps/_documentation/static/pt/_static/translations.js @@ -2,8 +2,7 @@ Documentation.addTranslations({ "locale": "pt", "messages": { "%(filename)s — %(docstitle)s": "", - "© Copyright %(copyright)s.": "", - "© Copyright %(copyright)s.": "", + "© %(copyright_prefix)s %(copyright)s.": "", ", in ": "", "About these documents": "", "Automatically generated list of changes in version %(version)s": "", diff --git a/apps/_documentation/static/pt/chapter-01.html b/apps/_documentation/static/pt/chapter-01.html index 01915e804..9e2ef3c3c 100644 --- a/apps/_documentation/static/pt/chapter-01.html +++ b/apps/_documentation/static/pt/chapter-01.html @@ -1,10 +1,10 @@ - + - O que é py4web? — Documentação py4web 1.20230507.1 + O que é py4web? — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
            - 1.20230507.1 + 1.20230718.1
            @@ -99,7 +99,7 @@
            -

            O que é py4web?

            +

            O que é py4web?

            PY4WEB is a web framework for rapid development of efficient database driven web applications. It is an evolution of the popular web2py framework, but much faster and slicker. Its internal design has been much @@ -173,7 +173,7 @@

            O que é py4web? -

            Acknowledgments

            +

            Acknowledgments

            Many thanks to everyone who has contributed to the project, and especially:

      Type

      @@ -1171,7 +1171,7 @@

      Field types and validators -

      modificação da tabela e campo em tempo de execução

      +

      modificação da tabela e campo em tempo de execução

      A maioria dos atributos de campos e tabelas podem ser modificados depois que eles são definidos:

      >>> db.define_table('person', Field('name', default=''), format='%(name)s')
       <Table person (id, name)>
      @@ -1235,7 +1235,7 @@ 

      modificação da tabela e campo em tempo de execuçãoque retorna um tuplo `` (valor, erro) . `` `` Error é None`` se a entrada passa a validação.

      -

      Mais sobre envios

      +

      Mais sobre envios

      Considere o seguinte modelo:

      db.define_table('myfile',
                       Field('image', 'upload', default='path/to/file'))
      @@ -1293,7 +1293,7 @@ 

      Mais sobre envios -

      Migrações

      +

      Migrações

      With our example table definition:

      db.define_table('person')
       
      @@ -1346,7 +1346,7 @@

      Migrações -

      Fixação migrações quebrados

      +

      Fixação migrações quebrados

      Há dois problemas comuns com as migrações e existem formas de recuperar a partir deles.

      Um problema é específico com SQLite. SQLite não impor tipos de coluna e não pode soltar colunas. Isto significa que se você tiver uma coluna do tipo string e você removê-lo, não é realmente removido. Se você adicionar a coluna novamente com um tipo diferente (por exemplo, data e hora) você acaba com uma coluna de data e hora que contém strings (lixo para fins práticos). não py4web não reclamar sobre isso, porque ele não sabe o que está no banco de dados, até que ele tenta recuperar registros e falha.

      Se py4web retorna um erro em alguma função de análise ao selecionar registros, muito provavelmente isso é devido a dados corrompidos em uma coluna por causa da questão acima.

      @@ -1366,7 +1366,7 @@

      Fixação migrações quebrados -

      Migração resumo controle

      +

      Migração resumo controle

      A lógica dos vários argumentos de migração estão resumidos neste pseudo-código:

      if DAL.migrate_enabled and table.migrate:
          if DAL.fake_migrate_all or table.fake_migrate:
      @@ -1378,9 +1378,9 @@ 

      Migração resumo controle -

      Table methods

      +

      Table methods

      -

      `` Insert``

      +

      `` Insert``

      Dada uma tabela, você pode inserir registros

      >>> db.person.insert(name="Alex")
       1
      @@ -1411,7 +1411,7 @@ 

      `` Insert`` -

      `` Query``, `` Set``, `` Rows``

      +

      `` Query``, `` Set``, `` Rows``

      Vamos considerar novamente a tabela definida (e caiu) anteriormente e inserir três registros:

      -

      `` Update_or_insert``

      +

      `` Update_or_insert``

      Algumas vezes você precisa executar uma inserção somente se não há nenhum registro com os mesmos valores como aqueles que estão sendo inseridos. Isso pode ser feito com

      db.define_table('person',
                       Field('name'),
      @@ -1468,7 +1468,7 @@ 

      `` Update_or_insert`` -

      `` Validate_and_insert``, `` validate_and_update``

      +

      `` Validate_and_insert``, `` validate_and_update``

      A função

      -

      `` Drop``

      +

      `` Drop``

      Finalmente, você pode soltar tabelas e todos os dados serão perdidos:

      db.person.drop()
       
      -

      Marcação de registros

      +

      Marcação de registros

      Etiquetas permite adicionar ou encontrar propriedades anexadas aos registros em seu banco de dados.

      from py4web import DAL, Field
       from pydal.tools.tags import Tags
      @@ -1534,9 +1534,9 @@ 

      Marcação de registros -

      Raw SQL

      +

      Raw SQL

      -

      `` executesql``

      +

      `` executesql``

      A DAL permite emitir explicitamente instruções SQL.

      >>> db.executesql('SELECT * FROM person;')
       [(1, u'Massimo'), (2, u'Massimo')]
      @@ -1563,7 +1563,7 @@ 

      `` executesql`` -

      `` _Lastsql``

      +

      `` _Lastsql``

      Se SQL foi executado manualmente usando ExecuteSQL ou foi SQL gerado pelo DAL, você sempre pode encontrar o código SQL em `` db._lastsql``. Isso é útil para fins de depuração:

      >>> rows = db().select(db.person.ALL)
       >>> db._lastsql
      @@ -1576,14 +1576,14 @@ 

      `` _Lastsql`` -

      Temporização de consultas

      +

      Temporização de consultas

      All queries are automatically timed by py4web. The variable db._timings is a list of tuples. Each tuple contains the raw SQL query as passed to the database driver and the time it took to execute in seconds.

      -

      Índices

      +

      Índices

      Atualmente, a API DAL não fornece um comando para criar índices em tabelas, mas isso pode ser feito usando o comando `` executesql``. Isso ocorre porque a existência de índices pode fazer migrações complexa, e é melhor para lidar com eles de forma explícita. Os índices podem ser necessários para esses campos que são usados ​​em consultas recorrentes.

      Aqui está um exemplo de como:

      db = DAL('sqlite://storage.sqlite')
      @@ -1594,7 +1594,7 @@ 

      Índices -

      Generating raw SQL

      +

      Generating raw SQL

      Às vezes você precisa para gerar o SQL, mas não executá-lo. Isso é fácil de fazer com py4web uma vez que cada comando que executa banco de dados IO tem um comando equivalente que não, e simplesmente retorna o SQL que teriam sido executados. Estes comandos têm os mesmos nomes e sintaxe como os funcionais, mas eles começam com um sublinhado:

      Aqui é `` _insert``

      >>> print(db.person._insert(name='Alex'))
      @@ -1627,7 +1627,7 @@ 

      Generating raw SQL -

      `` Comando SELECT``

      +

      `` Comando SELECT``

      Dado um conjunto, `` s``, você pode buscar os registros com o comando `` SELECT``:

      >>> rows = s.select()
       
      @@ -1717,7 +1717,7 @@

      `` Comando SELECT`` -

      Usando um seleto para uso de memória inferior à base de iterador

      +

      Usando um seleto para uso de memória inferior à base de iterador

      Python “iterators” são um tipo de “preguiçoso-avaliação”. Eles dados ‘alimentar’ um passo de tempo; laços tradicionais Python criar todo o conjunto de dados na memória antes de looping.

      O uso tradicional de selecionar é:

      for row in db(db.table).select():
      @@ -1732,7 +1732,7 @@ 

      Usando um seleto para uso de memória inferior à base de iterador -

      Renderizando Rows com represent

      +

      Renderizando Rows com represent

      Você pode querer reescrever linhas retornadas por seleção para tirar proveito de informações de formatação contida na representa a criação dos campos.

      rows = db(query).select()
       repr_row = rows.render(0)
      @@ -1756,7 +1756,7 @@ 

      Renderizando Rows com represent -

      Atalhos

      +

      Atalhos

      A DAL suporta vários atalhos-simplificando código. Em particular:

      -

      Recursivas `` s SELECT``

      +

      Recursivas `` s SELECT``

      Considere a pessoa tabela anterior e uma nova tabela “coisa” fazendo referência a uma “pessoa”:

      -

      `` Orderby``, `` groupby``, `` limitby``, `` distinct``, `` having``, `` orderby_on_limitby``, `` join``, `` left``, `` cache``

      +

      `` Orderby``, `` groupby``, `` limitby``, `` distinct``, `` having``, `` orderby_on_limitby``, `` join``, `` left``, `` cache``

      O comando `` SELECT`` leva uma série de argumentos opcionais.

      -

      ordenar por

      +

      ordenar por

      Você pode buscar os registros classificados pelo nome:

      >>> for row in db().select(db.person.ALL, orderby=db.person.name):
       ...     print(row.name)
      @@ -1891,7 +1891,7 @@ 

      ordenar por -

      groupby, tendo

      +

      groupby, tendo

      Usando `` groupby`` juntamente com `` orderby``, você pode agrupar registros com o mesmo valor para o campo especificado (isto é back-end específico, e não é sobre o Google NoSQL):

      >>> for row in db().select(db.person.ALL,
       ...                        orderby=db.person.name,
      @@ -1910,7 +1910,7 @@ 

      groupby, tendo -

      distinto

      +

      distinto

      Com o argumento `` distinta = True``, você pode especificar que você só quer selecionar registros distintos. Isto tem o mesmo efeito que o agrupamento usando todos os campos especificados, exceto que ele não necessita de classificação. Ao usar distinta é importante não para selecionar todos os campos, e em particular para não selecionar o campo “id”, senão todos os registros serão sempre distintas.

      Aqui está um exemplo:

      >>> for row in db().select(db.person.name, distinct=True):
      @@ -1932,7 +1932,7 @@ 

      distinto -

      limitby

      +

      limitby

      Com `` limitby = (min, max) ``, pode seleccionar um subconjunto dos registos de deslocamento = min, mas não incluindo offset = máx. No próximo exemplo nós selecionamos os dois primeiros registros a partir de zero:

      >>> for row in db().select(db.person.ALL, limitby=(0, 2)):
       ...     print(row.name)
      @@ -1943,16 +1943,16 @@ 

      limitby -

      orderby_on_limitby

      +

      orderby_on_limitby

      Note-se que os padrões DAL de adicionar implicitamente um orderby ao usar um limitby. Isso garante a mesma consulta retorna os mesmos resultados de cada vez, importante para a paginação. Mas pode causar problemas de desempenho. use `` orderby_on_limitby = False`` para mudar isso (isso o padrão é True).

      -

      juntar-se, deixou

      +

      juntar-se, deixou

      These are involved in managing One to many relation. They are described in Inner join and Left outer join sections respectively.

      -

      cache, em cache

      +

      cache, em cache

      An example use which gives much faster selects is:

      rows = db(query).select(cache=(cache.ram, 3600), cacheable=True)
       
      @@ -1961,7 +1961,7 @@

      cache, em cache -

      Operadores lógicos

      +

      Operadores lógicos

      As consultas podem ser combinados usando o binário operador AND “` & `”:

      >>> rows = db((db.person.name=='Alex') & (db.person.id > 3)).select()
       >>> for row in rows: print row.id, row.name
      @@ -2000,7 +2000,7 @@ 

      Operadores lógicos -

      `` Count``, `` isempty``, `` DELETE``, `` update``

      +

      `` Count``, `` isempty``, `` DELETE``, `` update``

      Você pode contar registros em um conjunto:

      >>> db(db.person.name != 'William').count()
       3
      @@ -2026,7 +2026,7 @@ 

      `` Count``, `` isempty``, `` DELETE``, `` update``O método update` retorna o número de registros que foram atualizados.

      -

      Expressões

      +

      Expressões

      O valor atribuído uma instrução de atualização pode ser uma expressão. Por exemplo, considere este modelo

      db.define_table('person',
                       Field('name'),
      @@ -2046,7 +2046,7 @@ 

      Expressões -

      `` case``

      +

      `` case``

      Uma expressão pode conter uma cláusula case, por exemplo:

      >>> condition = db.person.name.startswith('B')
       >>> yes_or_no = condition.case('Yes', 'No')
      @@ -2060,7 +2060,7 @@ 

      `` case`` -

      `` Update_record``

      +

      `` Update_record``

      py4web também permite actualizar um único registro que já está na memória usando `` update_record``

      >>> row = db(db.person.id == 2).select().first()
       >>> row.update_record(name='Curt')
      @@ -2092,7 +2092,7 @@ 

      `` Update_record`` -

      Inserir e atualizar a partir de um dicionário

      +

      Inserir e atualizar a partir de um dicionário

      Um problema comum é composto de precisar inserir ou atualizar registros em uma tabela onde o nome da tabela, o campo para ser atualizado, eo valor para o campo são armazenados em variáveis. Por exemplo: `` tablename``, `` fieldname``, e `` value``.

      A inserção pode ser feito usando a seguinte sintaxe:

      db[tablename].insert(**{fieldname:value})
      @@ -2105,7 +2105,7 @@ 

      Inserir e atualizar a partir de um dicionário -

      `` `` First`` e last``

      +

      `` `` First`` e last``

      Dado um objecto linhas contendo registos:

      rows = db(query).select()
       first_row = rows.first()
      @@ -2120,7 +2120,7 @@ 

      `` `` First`` e last`` -

      `` `` As_dict`` e as_list``

      +

      `` `` As_dict`` e as_list``

      Fila objecto pode ser serializados em um dicionário normal usando a `` as_dict () `` método e um objecto de linhas pode ser serializados em uma lista de dicionários usando a `` as_list () `` método. aqui estão alguns exemplos:

      rows = db(query).select()
       rows_list = rows.as_list()
      @@ -2137,7 +2137,7 @@ 

      `` `` As_dict`` e as_list``

      -

      Combinando Rows

      +

      Combinando Rows

      Fileiras objectos podem ser combinadas no nível Python. Aqui assumimos:

      >>> print(rows1)
       person.name
      @@ -2178,7 +2178,7 @@ 

      Combinando Rows -

      `` Find``, `` exclude``, `` sort``

      +

      `` Find``, `` exclude``, `` sort``

      Algumas vezes você precisa executar duas seleciona e um contém um subconjunto de um seleto anterior. Neste case, é inútil para acessar o banco de dados novamente. Os `` find``, `` exclude`` e `` objetos sort`` permitem manipular fileiras objeto e gerar outro sem acessar o banco de dados. Mais especificamente: - `` retorna find`` um novo conjunto de linhas filtradas por uma condição e deixa o inalterados originais. - `` retornos exclude`` um novo conjunto de linhas filtrados por uma condição e remove-los das linhas originais. - `` retorna sort`` um novo conjunto de linhas classificadas por uma condição e deixa o inalterados originais.

      Todos estes métodos dar um único argumento, uma função que age em cada linha individual.

      Aqui está um exemplo de uso:

      @@ -2224,7 +2224,7 @@

      `` Find``, `` exclude``, `` sort`` -

      Selects com cache

      +

      Selects com cache

      O método de seleção também leva um argumento cache`` , cujo padrão é None. Para fins de armazenamento em cache, deve ser definido como um tuplo em que o primeiro elemento é o modelo do cache ( `` cache.ram, `` cache.disk``, etc), e o segundo elemento é o tempo de validade em segundo .

      No exemplo a seguir, você vê um controlador que armazena em cache um seleto sobre a mesa db.log previamente definido. As buscas reais dados selecionados do banco de dados back-end não mais do que uma vez a cada 60 segundos e armazena o resultado na memória. Se a próxima chamada para este controlador ocorre em menos de 60 segundos desde o último banco de dados IO, ele simplesmente vai buscar os dados anteriores da memória.

      def cache_db_select():
      @@ -2244,9 +2244,9 @@ 

      Selects com cache -

      Computed and Virtual fields

      +

      Computed and Virtual fields

      -

      Campos computados

      +

      Campos computados

      Campos DAL podem ter um atributo `` compute``. Esta deve ser uma função (ou lambda) que recebe um objeto Row e retorna um valor para o campo. Quando um novo registo é modificado, incluindo inserções e atualizações, se um valor para o campo não é fornecido, py4web tenta calcular a partir dos outros valores de campo utilizando a função `` compute``. Aqui está um exemplo:

      >>> db.define_table('item',
       ...                 Field('unit_price', 'double'),
      @@ -2272,11 +2272,11 @@ 

      Campos computados -

      Campos virtuais

      +

      Campos virtuais

      Campos virtuais também são computados campos (como na subseção anterior), mas eles diferem daquelas porque são * * virtual no sentido de que não são armazenadas no db e eles são calculados a cada vez registros são extraídos do banco de dados. Eles podem ser usados ​​para simplificar o código do usuário sem usar armazenamento adicional, mas eles não podem ser usados ​​para pesquisa.

      -

      Campos virtuais novo estilo (experimental)

      +

      Campos virtuais novo estilo (experimental)

      py4web fornece uma nova e mais fácil maneira de definir campos virtuais e campos virtuais preguiçosos. Esta seção é marcado experimental porque as APIs ainda podem mudar um pouco do que é descrito aqui.

      Aqui vamos considerar o mesmo exemplo na subseção anterior. Em particular, considere o seguinte modelo:

      db.define_table('item',
      @@ -2324,7 +2324,7 @@ 

      Campos virtuais novo estilo (experimental) -

      Campos virtuais velho antigo

      +

      Campos virtuais velho antigo

      A fim de definir um ou mais virtuais campos, você também pode definir uma classe de contêiner, instanciá-lo e vinculá-lo a uma tabela ou a um seleto. Por exemplo, considere a seguinte tabela:

      db.define_table('item',
                       Field('unit_price', 'double'),
      @@ -2413,9 +2413,9 @@ 

      Campos virtuais velho antigo -

      Joins and Relations

      +

      Joins and Relations

      -

      Um para muitos relação

      +

      Um para muitos relação

      Para ilustrar como implementar um para muitos relação com a DAL, definir outra mesa “coisa” que refere-se à mesa “pessoa” que redefinir aqui:

      >>> db.define_table('person',
       ...                 Field('name'))
      @@ -2472,7 +2472,7 @@ 

      Um para muitos relação

      -

      Inner join

      +

      Inner join

      Outra forma de conseguir um resultado semelhante é usando uma junção, especificamente um INNER JOIN. executa py4web junta-se automaticamente e de forma transparente quando a consulta liga dois ou mais tabelas como no exemplo a seguir:

      >>> rows = db(db.person.id == db.thing.owner_id).select()
       >>> for row in rows:
      @@ -2519,7 +2519,7 @@ 

      Inner join -

      Left outer join

      +

      Left outer join

      Observe que Carl não aparecer na lista acima, porque ele não tem as coisas. Se você pretende selecionar sobre as pessoas (se eles têm coisas ou não) e as suas coisas (se tiver algum), então você precisa para realizar um LEFT OUTER JOIN. Isso é feito usando o argumento de “esquerda” da seleção. Aqui está um exemplo:

      >>> rows = db().select(db.person.ALL, db.thing.ALL,
       ...                    left=db.thing.on(db.person.id == db.thing.owner_id))
      @@ -2540,7 +2540,7 @@ 

      Left outer join -

      Agrupamento e contando

      +

      Agrupamento e contando

      Ao fazer junta-se, às vezes você quer agrupar linhas de acordo com certos critérios e contá-los. Por exemplo, contar o número de coisas pertencentes a cada pessoa. py4web permite isso também. Primeiro, você precisa de um operador de contagem. Em segundo lugar, você quer se juntar a tabela a pessoa com o quadro de coisa pelo proprietário. Terceiro, você quer selecionar todas as linhas (pessoa + coisa), agrupá-los por pessoa, e contá-los enquanto agrupamento:

      >>> count = db.person.id.count()
       >>> for row in db(db.person.id == db.thing.owner_id
      @@ -2555,7 +2555,7 @@ 

      Agrupamento e contandoO método count` do objeto campo tem um argumento` distinct` opcional. Quando ajustado para `` True`` especifica que apenas os valores distintos de campo em questão estão a ser contadas.

      -

      Many to many relation

      +

      Many to many relation

      Nos exemplos anteriores, que permitiram uma coisa para ter um proprietário, mas uma pessoa pode ter muitas coisas. E se barco era propriedade de Alex e Curt? Isso requer uma relação muitos-para-muitos, e é realizada através de uma tabela intermediária que liga uma pessoa a uma coisa através de uma relação de propriedade.

      Aqui está como fazê-lo:

      -

      A auto-referência e aliases

      +

      A auto-referência e aliases

      É possível definir tabelas com campos que se referem a si mesmos, aqui está um exemplo:

      db.define_table('person',
                       Field('name'),
      @@ -2688,7 +2688,7 @@ 

      A auto-referência e aliases -

      Outros operadores

      +

      Outros operadores

      py4web tem outros operadores que fornecem uma API para operadores SQL equivalentes de acesso. Vamos definir outra mesa “log” para eventos loja de segurança, sua event_time e gravidade, onde a gravidade é um número inteiro.

      >>> db.define_table('log', Field('event'),
       ...                        Field('event_time', 'datetime'),
      @@ -2708,7 +2708,7 @@ 

      Outros operadores -

      `` Like``, `` ilike``, `` regexp``, `` startswith``, `` endswith``, `` contains``, `` upper``, `` lower``

      +

      `` Like``, `` ilike``, `` regexp``, `` startswith``, `` endswith``, `` contains``, `` upper``, `` lower``

      Campos tem um `` operador like`` que você pode usar para combinar strings:

      >>> for row in db(db.log.event.like('port%')).select():
       ...     print(row.event)
      @@ -2757,7 +2757,7 @@ 

      `` Like``, `` ilike``, `` regexp``, `` startswith``, `` endswith``, `` conta

      -

      `` Year``, `` month``, `` day``, `` hour``, `` minutes``, `` seconds``

      +

      `` Year``, `` month``, `` day``, `` hour``, `` minutes``, `` seconds``

      A data ea data e hora campos têm `` day``, `` month`` e `` métodos year``. Os campos de data e hora e de tempo têm `` hour``, `` `` minutes`` e métodos seconds``. Aqui está um exemplo:

      >>> for row in db(db.log.event_time.year() > 2018).select():
       ...     print(row.event)
      @@ -2769,7 +2769,7 @@ 

      `` Year``, `` month``, `` day``, `` hour``, `` minutes``, `` seconds``

      -

      `` Belongs``

      +

      `` Belongs``

      O operador IN SQL é realizado através do método belongs` que devolve verdadeiro quando o valor do campo pertence ao conjunto especificado (lista ou tuplos):

      >>> for row in db(db.log.severity.belongs((1, 2))).select():
       ...     print(row.event)
      @@ -2807,7 +2807,7 @@ 

      `` Belongs`` -

      `` Sum``, `` avg``, `` min``, `` `` max`` e len``

      +

      `` Sum``, `` avg``, `` min``, `` `` max`` e len``

      Anteriormente, você usou o `` operador count`` para contar registros. Da mesma forma, você pode usar o `` operador sum`` para adicionar (soma) os valores de um campo específico de um grupo de registros. Tal como no case de contagem, o resultado de uma soma é recuperado através do objecto de armazenamento:

      >>> sum = db.log.severity.sum()
       >>> print(db().select(sum).first()[sum])
      @@ -2835,14 +2835,14 @@ 

      `` Sum``, `` avg``, `` min``, `` `` max`` e len``

      -

      Substrings

      +

      Substrings

      Pode-se construir uma expressão para se referir a uma substring. Por exemplo, podemos agrupar as coisas cujo nome começa com os mesmos três personagens e selecione apenas um de cada grupo:

      db(db.thing).select(distinct = db.thing.name[:3])
       
      -

      Os valores por defeito com `` `` coalesce`` e coalesce_zero``

      +

      Os valores por defeito com `` `` coalesce`` e coalesce_zero``

      Há momentos em que você precisa para puxar um valor de banco de dados, mas também precisa de valores padrão se o valor para um registro é definido como NULL. Em SQL existe uma função, `` COALESCE``, para isso. py4web tem um método coalesce` equivalente:

      >>> db.define_table('sysuser', Field('username'), Field('fullname'))
       <Table sysuser (id, username, fullname)>
      @@ -2877,9 +2877,9 @@ 

      Os valores por defeito com `` `` coalesce`` e coalesce_zero`` -

      Exportar e importar dados

      +

      Exportar e importar dados

      -

      CSV (uma tabela de cada vez)

      +

      CSV (uma tabela de cada vez)

      Quando um objeto linhas é convertido para uma string é automaticamente serializado na CSV:

      >>> rows = db(db.person.id == db.thing.owner_id).select()
       >>> print(rows)
      @@ -2929,7 +2929,7 @@ 

      CSV (uma tabela de cada vez) -

      CSV (todas as tabelas ao mesmo tempo)

      +

      CSV (todas as tabelas ao mesmo tempo)

      Em py4web, você pode backup / restaurar um banco de dados inteiro com dois comandos:

      Exportar:

      with open('somefile.csv', 'w', encoding='utf-8', newline='') as dumpfile:
      @@ -2956,7 +2956,7 @@ 

      CSV (todas as tabelas ao mesmo tempo) -

      CSV e sincronização de banco de dados remoto

      +

      CSV e sincronização de banco de dados remoto

      Considere mais uma vez o seguinte modelo:

      db.define_table('person',
                       Field('name'))
      @@ -3038,7 +3038,7 @@ 

      CSV e sincronização de banco de dados remoto -

      HTML e XML (uma tabela de cada vez)

      +

      HTML e XML (uma tabela de cada vez)

      Linhas objetos também têm um método xml` (como ajudantes) que serializa-lo para XML / HTML:

      >>> rows = db(db.person.id == db.thing.owner_id).select()
       >>> print(rows.xml())
      @@ -3089,7 +3089,7 @@ 

      HTML e XML (uma tabela de cada vez) -

      Representação de dados

      +

      Representação de dados

      O método Rows.export_to_csv_file` aceita um argumento de palavra-chave chamada` represent`. Quando `` True`` ele usará as colunas função `` represent`` ao exportar os dados, em vez dos dados brutos.

      A função também aceita um argumento de palavra-chave chamada `` colnames`` que deve conter uma lista de nomes de colunas um desejo para exportação. O padrão é todas as colunas.

      Ambos `` export_to_csv_file`` e `` import_from_csv_file`` aceitar argumentos de palavra-chave que contam o analisador CSV o formato para salvar / carregar os arquivos: - `` delimiter``: delimitador para separar valores (padrão “”) - `` quotechar : personagem para usar para citar valores String (default para aspas) - `` quoting: sistema de cotação (padrão `` csv.QUOTE_MINIMAL``)

      @@ -3111,9 +3111,9 @@

      Representação de dados

      -

      Características avançadas

      +

      Características avançadas

      -

      `` Lista: <type> `` e `` contains``

      +

      `` Lista: <type> `` e `` contains``

      py4web fornece os seguintes tipos de campos especiais:

      list:string
       list:integer
      @@ -3179,7 +3179,7 @@ 

      Características avançadas

      -

      Herança de tabela

      +

      Herança de tabela

      É possível criar uma tabela que contém todos os campos de outra tabela. É suficiente para passar a outra tabela no lugar de um campo para `` define_table``. Por exemplo

      >>> db.define_table('person', Field('name'), Field('gender'))
       <Table person (id, name, gender)>
      @@ -3209,7 +3209,7 @@ 

      Herança de tabela -

      `` `` Filter_in`` e filter_out``

      +

      `` `` Filter_in`` e filter_out``

      É possível definir um filtro para cada campo a ser chamada antes de um valor é inserido na banco de dados para esse campo e depois de um valor é recuperado a partir da banco de dados.

      Imagine for example that you want to store a serializable Python data structure in a field in the JSON format. Here is how it could be @@ -3232,7 +3232,7 @@

      Herança de tabelaSQLCustomType, as discussed in Personalizados `` tipos Field``.

      -

      retornos de chamada no registro de inserção, exclusão e atualização

      +

      retornos de chamada no registro de inserção, exclusão e atualização

      PY4WEB fornece um mecanismo para registrar retornos de chamada para ser chamado antes e / ou após a inserção, atualização e exclusão de registros.

      Cada tabela armazena seis listas de chamadas de retorno:

      db.mytable._before_insert
      @@ -3275,7 +3275,7 @@ 

      retornos de chamada no registro de inserção, exclusão e atualizaçãoAlgumas vezes uma chamada de retorno pode precisar executar uma atualização na mesma ou em uma tabela diferente e se quer evitar disparar outras chamadas de retorno, o que poderia causar um loop infinito.

      Para este efeito, há os objetos `` Set`` tem um método update_naive` que funciona como` update` mas ignora antes e depois de retornos de chamada.

      -

      Cascades no banco de dados

      +

      Cascades no banco de dados

      Database schema can define relationships which trigger deletions of related records, known as cascading. The DAL is not informed when a record is deleted due to a cascade. So no *_delete callback will ever @@ -3283,7 +3283,7 @@

      Cascades no banco de dados

      -

      versionamento recorde

      +

      versionamento recorde

      É possível pedir py4web para salvar cada cópia de um registro quando o registro é modificado individualmente. Existem diferentes maneiras de fazer isso e que pode ser feito para todas as tabelas ao mesmo tempo usando a sintaxe:

      auth.enable_record_versioning(db)
       
      @@ -3314,7 +3314,7 @@

      versionamento recorde -

      filtros comuns

      +

      filtros comuns

      Um filtro comum é uma generalização da ideia multi-tenancy acima. Ele fornece uma maneira fácil de evitar a repetição da mesma consulta. Considere, por exemplo, a tabela a seguir:

      db.define_table('blog_post',
                       Field('subject'),
      @@ -3341,7 +3341,7 @@ 

      filtros comuns -

      Personalizados `` tipos Field``

      +

      Personalizados `` tipos Field``

      Além de usar o `` filter_in`` e `` filter_out``, é possível definir novos tipos de campos / personalizados. Por exemplo, suponha que você deseja definir um tipo personalizado para armazenar um endereço IP:

      >>> def ip2int(sv):
       ...     "Convert an IPV4 to an integer."
      @@ -3391,7 +3391,7 @@ 

      filtros comuns -

      Usando DAL sem definir tabelas

      +

      Usando DAL sem definir tabelas

      A DAL pode ser usado a partir de qualquer programa Python simplesmente fazendo isso:

      from pydal import DAL, Field
       db = DAL('sqlite://storage.sqlite', folder='path/to/app/databases')
      @@ -3407,7 +3407,7 @@ 

      Usando DAL sem definir tabelas -

      Transação distribuída

      +

      Transação distribuída

      No momento da escrita deste recurso só é suportado pelo PostgreSQL, MySQL e Firebird, uma vez que expõem API para commits de duas fases.

      @@ -3424,7 +3424,7 @@

      Transação distribuída -

      Copiar dados de um para outro db

      +

      Copiar dados de um para outro db

      Considere a situação em que você estiver usando o seguinte banco de dados:

      db = DAL('sqlite://storage.sqlite')
       
      @@ -3437,9 +3437,9 @@

      Copiar dados de um para outro db -

      Pegadinhas

      +

      Pegadinhas

      -

      Nota sobre novo DAL e adaptadores

      +

      Nota sobre novo DAL e adaptadores

      O código fonte do Banco de Dados Camada de Abstração foi completamente reescrito em 2010. Enquanto ele permanece compatível com versões anteriores, a reescrita tornou mais modular e mais fácil de estender. Aqui nós explicamos a lógica principal.

      The module “dal.py” defines, among other, the following classes.

      ConnectionPool
      @@ -3704,7 +3704,7 @@ 

      Nota sobre novo DAL e adaptadores -

      SQLite

      +

      SQLite

      SQLite does not support dropping and altering columns. That means that py4web migrations will work up to a point. If you delete a field from a table, the column will remain in the database but will be invisible to @@ -3719,7 +3719,7 @@

      SQLiteSQLite não tem um tipo booleano. py4web mapeia internamente booleans para uma strings de 1 carácter, com ‘T’ e ‘F’ representar Verdadeiro e Falso. A DAL lida com isso completamente; a abstração de um verdadeiro valor booleano funciona bem. Mas se você estiver atualizando a tabela SQLite com o SQL diretamente, estar ciente da implementação py4web, e evitar o uso de 0 e 1 valores.

      -

      MySQL

      +

      MySQL

      MySQL does not support multiple ALTER TABLE within a single transaction. This means that any migration process is broken into multiple commits. If something happens that causes a failure it is possible to break a @@ -3732,7 +3732,7 @@

      MySQL again).

      -

      Google SQL

      +

      Google SQL

      Google SQL has the same problems as MySQL and more. In particular table metadata itself must be stored in the database in a table that is not migrated by py4web. This is because Google App Engine has a read-only @@ -3745,7 +3745,7 @@

      Google SQLpy4web_filesystem.

      -

      MSSQL (Microsoft SQL Server)

      +

      MSSQL (Microsoft SQL Server)

      não MSSQL <2012 não suporta o SQL OFFSET palavra-chave. Portanto, o banco de dados não pode fazer a paginação. Ao fazer um `` limitby = (a, b) `` py4web vai buscar a primeira `` a + b`` linhas e descartar o primeiro `` a``. Isto pode resultar numa sobrecarga considerável quando comparado com outros bancos de dados. Se você estiver usando MSSQL> = 2005, o prefixo recomendado para uso é `` mssql3: // `` que fornece um método para evitar o problema de buscar todo o conjunto de resultados não-paginado. Se você estiver em MSSQL> = 2012, use `` mssql4: // `` que usa o `` OFFSET … ROWS … FETCH PRÓXIMO … ROWS ONLY`` construção para apoiar a paginação nativamente, sem sucessos de desempenho como outros backends. O `` mssql: // `` uri também reforça (por razões históricas) o uso de `` colunas text``, que são superseeded em versões mais recentes (a partir de 2005) por `` varchar (max) . `` Mssql3: // `` e `` mssql4: // `` deve ser usado se você não quer enfrentar algumas limitações do - oficialmente obsoleto - `` colunas text.

      MSSQL tem problemas com referências circulares em tabelas que têm onDelete CASCADE. Este é um bug MSSQL e você trabalhar em torno dele, definindo o atributo onDelete para todos os campos de referência a “nenhuma acção”. Você também pode fazê-lo uma vez por todas, antes de definir tabelas:

      db = DAL('mssql://....')
      @@ -3764,11 +3764,11 @@ 

      MSSQL (Microsoft SQL Server) -

      Oráculo

      +

      Oráculo

      A Oracle também não suporta a paginação. Ele não suporta nem a OFFSET nem as palavras-chave limite. PY4WEB alcança a paginação, traduzindo um `` db (…). Select (limitby = (a, b)) `` em um complexo de três vias SELECT aninhada (como sugerido por documentação oficial Oracle). Isso funciona para simples escolha, mas pode quebrar para seleciona complexos envolvendo campos e ou junta alias.

      -

      Google NoSQL (Datastore)

      +

      Google NoSQL (Datastore)

      Google NoSQL (Datastore) não permite que se junta, deixou junta, agregados, expressão ou envolvendo mais de uma tabela, o ‘como’ pesquisas operador em campos “texto”.

      As transações são limitados e não fornecida automaticamente pelo py4web (você precisa usar a API do Google `` run_in_transaction`` que você pode procurar na documentação do Google App Engine online).

      O Google também limita o número de registros que você pode recuperar em cada uma consulta (1000, no momento da escrita). No Google armazenamento de dados IDs de registro são inteiro, mas eles não são seqüenciais. Enquanto em SQL “lista: string” tipo é mapeado em um tipo de “texto”, no Google Datastore é mapeado em um `` ListStringProperty``. Da mesma forma “lista: número inteiro” e “lista: referência” são mapeados para `` ListProperty``. Isso faz buscas por conteúdo dentro desses campos tipos mais eficientes no Google NoSQL que em bancos de dados SQL.

      @@ -3812,7 +3812,7 @@

      Google NoSQL (Datastore) - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/pt/chapter-08.html b/apps/_documentation/static/pt/chapter-08.html index 2ffa46285..f5c4fa098 100644 --- a/apps/_documentation/static/pt/chapter-08.html +++ b/apps/_documentation/static/pt/chapter-08.html @@ -1,10 +1,10 @@ - + - The RestAPI — Documentação py4web 1.20230507.1 + The RestAPI — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -102,7 +102,7 @@
      -

      The RestAPI

      +

      The RestAPI

      Since version 19.5.10 pyDAL includes a restful API [CIT0801] called RestAPI. It is inspired by GraphQL [CIT0802] and while it’s not quite the same due to it being less powerful, it is in the spirit of py4web since it’s more practical and easier to use.

      @@ -199,7 +199,7 @@

      The RestAPI -

      RestAPI policies and actions

      +

      RestAPI policies and actions

      The policy is per table (or * for all tables) and per method. authorize can be True (allow), False (deny) or a function with the signature (method, tablename, record_id, get_vars, post_vars) which returns @@ -224,7 +224,7 @@

      RestAPI policies and actions -

      RestAPI GET

      +

      RestAPI GET

      A consulta geral tem a forma `` {} algo .eq = value`` onde `` eq = `` significa “igual”, `` gt = `` significa “maior que”, etc. A expressão pode ser prefixado por `` not.``.

      {something} can be:

      -

      RestAPI practical examples

      +

      RestAPI practical examples

      Aqui estão alguns exemplos práticos:

      URL:

      /superheroes/api/superhero
      @@ -1084,7 +1084,7 @@ 

      RestAPI practical examples -

      The RestAPI response

      +

      The RestAPI response

      All RestAPI response have the fields:

      api_version:
      @@ -1167,7 +1167,7 @@

      The RestAPI response - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/pt/chapter-09.html b/apps/_documentation/static/pt/chapter-09.html index 68cc6b56a..f56c9383d 100644 --- a/apps/_documentation/static/pt/chapter-09.html +++ b/apps/_documentation/static/pt/chapter-09.html @@ -1,10 +1,10 @@ - + - Linguagem de template YATL — Documentação py4web 1.20230507.1 + Linguagem de template YATL — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -118,7 +118,7 @@
      -

      Linguagem de template YATL

      +

      Linguagem de template YATL

      py4web uses two distinct template languages for rendering dynamic HTML pages that contain Python code:

      • yatl (Yet Another Template Language) , which is considered the original reference implementation

      • @@ -215,7 +215,7 @@

        Linguagem de template YATL -

        Sintaxe básica

        +

        Sintaxe básica

        The py4web template language supports all Python control structures. Here we provide some examples of each of them. They can be nested according to usual programming practice. @@ -223,7 +223,7 @@

        Sintaxe básicaCopying the _scaffold app) and then editing the file new_app/template/index.html.

        -

        `` Para … in``

        +

        `` Para … in``

        Em templates você pode fazer um loop sobre qualquer objeto iterável:

        [[items = ['a', 'b', 'c'] ]]
         <ul>
        @@ -242,7 +242,7 @@ 

        `` Para … in`` -

        `` While``

        +

        `` While``

        Você pode criar um loop usando a palavra-chave, enquanto:

        [[k = 3]]
         <ul>
        @@ -260,7 +260,7 @@ 

        `` While`` -

        `` If … elif … else``

        +

        `` If … elif … else``

        Você pode usar cláusulas condicionais:

        [[
         import random
        @@ -301,7 +301,7 @@ 

        `` If … elif … else`` -

        `` Tentar … exceto … else … finally``

        +

        `` Tentar … exceto … else … finally``

        It is also possible to use try...except statements in templates with one caveat. Consider the following example:

        [[try:]]
        @@ -323,7 +323,7 @@ 

        `` Tentar … exceto … else … finally`` -

        `` Def … return``

        +

        `` Def … return``

        O linguagem de template py4web permite ao desenvolvedor definir e implementar funções que podem retornar qualquer objeto Python ou uma cadeia de texto / html. Aqui, consideramos dois exemplos:

        [[def itemize1(link): return LI(A(link, _href="http://" + link))]]
         <ul>
        @@ -353,13 +353,13 @@ 

        `` Def … return`` -

        Information workflow

        +

        Information workflow

        For dynamically modifying the workflow of the information there are custom commands available: extend, include, block and super. Note that they are special template directives, not Python commands.

        In addition, you can use normal Python functions inside templates.

        -

        extend and include

        +

        extend and include

        Templates can extend and include other templates in a tree-like structure.

        For example, we can think of a template “index.html” that extends “layout.html” and includes “body.html”. At the same time, “layout.html” @@ -433,7 +433,7 @@

        extend

        -

        Extending using variables

        +

        Extending using variables

        The argument of an extend or include (i.e., the extended or included template name) can be a Python variable (though not a Python expression). However, this imposes a limitation – templates that use @@ -468,7 +468,7 @@

        Extending using variables -

        Template Functions

        +

        Template Functions

        Consider this “layout.html”:

        <!--layout.html-->
         <html>
        @@ -514,7 +514,7 @@ 

        Template Functions[[=mysidebar()]]. Functions defined in this way can take arguments.

        -

        block and super

        +

        block and super

        The main way to make a template more modular is by using [[block ...]]s and this mechanism is an alternative to the mechanism discussed in the previous section.

        @@ -594,9 +594,9 @@

        block

        -

        Page layout standard structure

        +

        Page layout standard structure

        -

        Default page layout

        +

        Default page layout

        The “templates/layout.html” that currently ships with the py4web _scaffold application is quite complex but it has the following structure:

         1 <!DOCTYPE html>
        @@ -688,7 +688,7 @@ 

        Default page layout -

        Mobile development

        +

        Mobile development

        Although the default layout.html is designed to be mobile-friendly, one may sometimes need to use different templates when a page is visited by a mobile device.

        @@ -732,7 +732,7 @@

        Mobile development - v: 1.20230507.1 + v: 1.20230718.1
        diff --git a/apps/_documentation/static/pt/chapter-10.html b/apps/_documentation/static/pt/chapter-10.html index eda2733b6..da81ab31a 100644 --- a/apps/_documentation/static/pt/chapter-10.html +++ b/apps/_documentation/static/pt/chapter-10.html @@ -1,10 +1,10 @@ - + - Helpers YATL — Documentação py4web 1.20230507.1 + Helpers YATL — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
        - 1.20230507.1 + 1.20230718.1
        @@ -145,9 +145,9 @@
        -

        Helpers YATL

        +

        Helpers YATL

        -

        Helpers overview

        +

        Helpers overview

        Consider the following code in a template:

        [[=DIV('this', 'is', 'a', 'test', _id='123', _class='myclass')]]
         
        @@ -257,9 +257,9 @@

        Helpers overview -

        Built-in helpers

        +

        Built-in helpers

        -

        `` XML``

        +

        `` XML``

        XML is an helper object used to encapsulate text that should not be escaped. The text may or may not contain valid XML; for example it could contain JavaScript.

        @@ -301,7 +301,7 @@

        Built-in helpers -

        `` A``

        +

        `` A``

        Este assistente é usado para construir ligações.

        >>> print(A('<click>', XML('<strong>me</strong>'),
                     _href='http://www.py4web.com'))
        @@ -310,7 +310,7 @@ 

        `` A``<

        -

        `` BODY``

        +

        `` BODY``

        Este assistente faz com que o corpo de uma página.

        >>> print(BODY('<hello>', XML('<strong>world</strong>'), _bgcolor='red'))
         <body bgcolor="red">&lt;hello&gt;<strong>world</strong></body>
        @@ -318,7 +318,7 @@ 

        `` BODY`` -

        `` CAT``

        +

        `` CAT``

        This helper concatenates other helpers.

        >>> print(CAT('Here is a ', A('link', _href='target'), ', and here is some ', STRONG('bold text'), '.'))
         Here is a <a href="target">link</a>, and here is some <strong>bold text</strong>.
        @@ -326,7 +326,7 @@ 

        `` CAT``

        -

        `` Div``

        +

        `` Div``

        This is the content division element.

        >>> print(DIV('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <div id="0" class="test">&lt;hello&gt;<strong>world</strong></div>
        @@ -334,7 +334,7 @@ 

        `` Div``

        -

        `` EM``

        +

        `` EM``

        Insiste no seu conteúdo.

        >>> print(EM('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <em id="0" class="test">&lt;hello&gt;<strong>world</strong></em>
        @@ -342,7 +342,7 @@ 

        `` EM``

        -

        `` Form``

        +

        `` Form``

        Use this helper to make a FORM for user input. Forms will be later discussed in detail in the dedicated Forumlários chapter.

        >>> print(FORM(INPUT(_type='submit'), _action='', _method='post'))
        @@ -351,7 +351,7 @@ 

        `` Form`` -

        `` H1``, `` h2``, `` H3``, `` H4``, `` H5``, `` H6``

        +

        `` H1``, `` h2``, `` H3``, `` H4``, `` H5``, `` H6``

        These helpers are for paragraph headings and subheadings.

        >>> print(H1('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <h1 id="0" class="test">&lt;hello&gt;<strong>world</strong></h1>
        @@ -359,7 +359,7 @@ 

        `` H1``, `` h2``, `` H3``, `` H4``, `` H5``, `` H6``

        -

        `` IMG``

        +

        `` IMG``

        It can be used to embed images into HTML.

        >>> print(IMG(_src='http://example.com/image.png', _alt='test'))
         <img alt="test" src="http://example.com/image.png"/>
        @@ -397,7 +397,7 @@ 

        `` IMG``

        -

        `` INPUT``

        +

        `` INPUT``

        Cria um `` <input … /> `` tag. Uma tag de entrada não pode conter outras tags, e é fechada por `` /> `` em vez de > ``. A tag de entrada tem um atributo opcional `` _type que pode ser definido como “texto” (o padrão), “enviar”, “caixa”, ou “rádio”.

        >>> print(INPUT(_name='test', _value='a'))
         <input name="test" value="a"/>
        @@ -421,7 +421,7 @@ 

        `` INPUT`` -

        `` Label``

        +

        `` Label``

        Ele é usado para criar uma tag rótulo para um campo de entrada.

        >>> print(LABEL('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <label id="0" class="test">&lt;hello&gt;<strong>world</strong></label>
        @@ -429,7 +429,7 @@ 

        `` Label`` -

        `` LI``

        +

        `` LI``

        Faz um item da lista e deve estar contido em um `` UL`` ou `` tag OL``.

        >>> print(LI('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <li id="0" class="test">&lt;hello&gt;<strong>world</strong></li>
        @@ -437,7 +437,7 @@ 

        `` LI``

        -

        `` OL``

        +

        `` OL``

        It stands for ordered list. The list should contain LI tags.

        >>> print(OL(LI('<hello>'), LI(XML('<strong>world</strong>')), _class='test', _id=0))
         <ol class="test" id="0"><li>&lt;hello&gt;</li><li><strong>world</strong></li></ol>
        @@ -445,7 +445,7 @@ 

        `` OL``

        -

        `` OPTION``

        +

        `` OPTION``

        This should only be used as argument of a SELECT.

        >>> print(OPTION('<hello>', XML('<strong>world</strong>'), _value='a'))
         <option value="a">&lt;hello&gt;<strong>world</strong></option>
        @@ -458,7 +458,7 @@ 

        `` OPTION`` -

        `` P``

        +

        `` P``

        Isto é para marcar um parágrafo.

        >>> print(P('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <p id="0" class="test">&lt;hello&gt;<strong>world</strong></p>
        @@ -466,7 +466,7 @@ 

        `` P``<

        -

        `` PRE``

        +

        `` PRE``

        Gera um `` <pre> … </ pre> `` tag para exibir texto pré-formatado. O `` CODE`` auxiliar é geralmente preferível para listagens de código.

        >>> print(SELECT(OPTION('first', _value='1'), OPTION('second', _value='2'), _class='test', _id=0))
         <pre id="0" class="test">&lt;hello&gt;<strong>world</strong></pre>
        @@ -474,7 +474,7 @@ 

        `` PRE``

        -

        `` SCRIPT``

        +

        `` SCRIPT``

        This is for include or link a script, such as JavaScript.

        >>> print(SCRIPT('console.log("hello world");', _type='text/javascript'))
         <script type="text/javascript">console.log("hello world");</script>
        @@ -482,7 +482,7 @@ 

        `` SCRIPT`` -

        `` SELECT``

        +

        `` SELECT``

        Makes a <select>...</select> tag. This is used with the OPTION helper.

        >>> print(SELECT(OPTION('first', _value='1'), OPTION('second', _value='2'),
        @@ -492,7 +492,7 @@ 

        `` SELECT`` -

        `` SPAN``

        +

        `` SPAN``

        Semelhante a `` div`` mas utilizado para marcação em linha (em vez de bloco) conteúdo.

        >>> print(SPAN('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <span id="0" class="test">&lt;hello&gt;<strong>world</strong></span>
        @@ -500,7 +500,7 @@ 

        `` SPAN`` -

        `` STYLE``

        +

        `` STYLE``

        Semelhante ao script, mas usadas para incluir ou código do link CSS. Aqui, o CSS está incluído:

        >>> print(STYLE(XML('body {color: white}')))
         <style>body {color: white}</style>
        @@ -513,7 +513,7 @@ 

        `` STYLE`` -

        `` TABLE``, `` TR``, `` TD``

        +

        `` TABLE``, `` TR``, `` TD``

        Estas tags (juntamente com o opcional `` THEAD`` e `` helpers TBODY``) são utilizados para tabelas de construção HTML.

        >>> print(TABLE(TR(TD('a'), TD('b')), TR(TD('c'), TD('d'))))
         <table><tr><td>a</td><td>b</td></tr><tr><td>c</td><td>d</td></tr></table>
        @@ -535,7 +535,7 @@ 

        `` TABLE``, `` TR``, `` TD``

        -

        `` TBODY``

        +

        `` TBODY``

        Isto é usado para linhas tag contidos no corpo de mesa, em oposição a linhas de cabeçalho ou de rodapé. É opcional.

        >>> print(TBODY(TR(TD('<hello>')), _class='test', _id=0))
         <tbody id="0" class="test"><tr><td>&lt;hello&gt;</td></tr></tbody>
        @@ -543,7 +543,7 @@ 

        `` TBODY`` -

        `` TEXTAREA``

        +

        `` TEXTAREA``

        Este assistente faz uma <textarea> … </ textarea> tag ``.

        >>> print(TEXTAREA('<hello>', XML('<strong>world</strong>'), _class='test',
         ... _cols="40", _rows="10"))
        @@ -552,7 +552,7 @@ 

        `` TEXTAREA`` -

        `` TH``

        +

        `` TH``

        Este é utilizado em vez de `` TD`` em cabeçalhos de tabela.

        >>> print(TH('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <th id="0" class="test">&lt;hello&gt;<strong>world</strong></th>
        @@ -560,7 +560,7 @@ 

        `` TH``

        -

        `` THEAD``

        +

        `` THEAD``

        Isto é usado para linhas de cabeçalho da tabela tag.

        >>> print(THEAD(TR(TH('<hello>')), _class='test', _id=0))
         <thead id="0" class="test"><tr><th>&lt;hello&gt;</th></tr></thead>
        @@ -568,7 +568,7 @@ 

        `` THEAD`` -

        `` TITLE``

        +

        `` TITLE``

        Isto é usado para marcar o título de uma página em um cabeçalho HTML.

        >>> print(TITLE('<hello>', XML('<strong>world</strong>')))
         <title>&lt;hello&gt;<strong>world</strong></title>
        @@ -576,7 +576,7 @@ 

        `` TITLE`` -

        `` TT``

        +

        `` TT``

        Etiquetas de texto como máquina de escrever texto (monoespaçada).

        >>> print(TT('<hello>', XML('<strong>world</strong>'), _class='test', _id=0))
         <tt id="0" class="test">&lt;hello&gt;<strong>world</strong></tt>
        @@ -584,7 +584,7 @@ 

        `` TT``

        -

        `` UL``

        +

        `` UL``

        It stands for unordered list. The list should contain LI tags.

        >>> print(UL(LI('<hello>'), LI(XML('<strong>world</strong>')), _class='test', _id=0))
         <ul class="test" id="0"><li>&lt;hello&gt;</li><li><strong>world</strong></li></ul>
        @@ -592,14 +592,14 @@ 

        `` UL``

        -

        `` URL``

        +

        `` URL``

        The URL helper is not part of yatl package, instead it is provided by py4web.

        -

        Helpers personalizados

        +

        Helpers personalizados

        -

        `` TAG``

        +

        `` TAG``

        Sometimes you need to generate custom XML tags*. For this purpose py4web provides TAG, a universal tag generator.

        [[=TAG.name('a', 'b', _c='d')]]
        @@ -625,7 +625,7 @@ 

        Helpers personalizados -

        `` BEAUTIFY``

        +

        `` BEAUTIFY``

        `` BEAUTIFY`` é usado para representações de construção HTML de objetos compostos, incluindo listas, tuplas e dicionários:

        [[=BEAUTIFY({"a": ["hello", STRONG("world")], "b": (1, 2)})]]
         
        @@ -644,10 +644,10 @@

        `` BEAUTIFY`` -

        Server-side DOM

        +

        Server-side DOM

        As we’ve already seen the helpers mechanism in py4web also provides a server-side representation of the document object model (DOM).

        -

        children

        +

        children

        Each helper object keep the list of its components into the children attribute.

        >>> CAT('hello', STRONG('world')).children
        @@ -656,7 +656,7 @@ 

        children

        -

        find

        +

        find

        To help searching into the DOM, all helpers have a find method with the following signature:

        def find(self, query=None, **kargs)
        @@ -750,7 +750,7 @@ 

        find

        -

        Using Inject

        +

        Using Inject

        Normally all the code should be called from the controller program, and only the necessary data is passed to the template in order to be displayed. But sometimes it’s useful to pass variables or even use a python function as a helper called from a template.

        @@ -841,7 +841,7 @@

        Using Inject - v: 1.20230507.1 + v: 1.20230718.1
        diff --git a/apps/_documentation/static/pt/chapter-11.html b/apps/_documentation/static/pt/chapter-11.html index a9f4d6f45..41be0808f 100644 --- a/apps/_documentation/static/pt/chapter-11.html +++ b/apps/_documentation/static/pt/chapter-11.html @@ -1,10 +1,10 @@ - + - Internacionalização — Documentação py4web 1.20230507.1 + Internacionalização — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
        - 1.20230507.1 + 1.20230718.1
        @@ -100,9 +100,9 @@
        -

        Internacionalização

        +

        Internacionalização

        -

        Pluralizar

        +

        Pluralizar

        Pluralizar é uma biblioteca Python para a Internacionalização (i18n) e Pluralização (p10n).

        The library assumes a folder (for example “translations”) that contains files like:

        @@ -146,7 +146,7 @@

        Pluralizar -

        Atualizar os arquivos de tradução

        +

        Atualizar os arquivos de tradução

        Encontrar todas as cordas envoltas em T (…) em .py, .html e arquivos .js:

        matches = T.find_matches('path/to/app/folder')
         
        @@ -210,7 +210,7 @@

        Atualizar os arquivos de tradução - v: 1.20230507.1 + v: 1.20230718.1
        diff --git a/apps/_documentation/static/pt/chapter-12.html b/apps/_documentation/static/pt/chapter-12.html index 6f80acc00..b7b1f2925 100644 --- a/apps/_documentation/static/pt/chapter-12.html +++ b/apps/_documentation/static/pt/chapter-12.html @@ -1,10 +1,10 @@ - + - Forumlários — Documentação py4web 1.20230507.1 + Forumlários — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
        - 1.20230507.1 + 1.20230718.1
        @@ -182,13 +182,13 @@
        -

        Forumlários

        +

        Forumlários

        The Form class provides a high-level API for quickly building CRUD (create, update and delete) forms, especially for working on an existing database table. It can generate and process a form from a list of desired fields and/or from an existing database table. It is a pretty much equivalent to web2py’s SQLFORM.

        -

        The Form constructor

        +

        The Form constructor

        O `` construtor Form`` aceita os seguintes argumentos:

        Form(self,
              table,
        @@ -227,7 +227,7 @@ 

        The Form constructor

        -

        A minimal form example without a database

        +

        A minimal form example without a database

        Let’s start with a minimal working form example. Create a new minimal app called form_minimal :

        # in form_minimal/__init__.py
        @@ -280,7 +280,7 @@ 

        A minimal form example without a database -

        Basic form example

        +

        Basic form example

        In this next basic example we generate a form from a database. Create a new minimal app called form_basic :

        # in form_basic/__init__.py
        @@ -342,7 +342,7 @@ 

        Basic form example -

        File upload field

        +

        File upload field

        The file upload field is quite particular. The standard way to use it (as in the _scaffold app) is to have the UPLOAD_FOLDER defined in the common.py file. But if you don’t specify it, then the default value of your_app/upload folder will be used (and the folder will also be created if needed). @@ -395,9 +395,9 @@

        File upload field -

        Widgets

        +

        Widgets

        -

        Standard widgets

        +

        Standard widgets

        Py4web provides many widgets in the py4web.utility.form library. They are simple plugins that easily allow you to specify the type of the input elements in a form, along with some of their properties.

        @@ -474,7 +474,7 @@

        Standard widgets -

        Custom widgets

        +

        Custom widgets

        You can also customize the widgets properties by subclassing the FormStyleDefault class. Let’s have a quick look, improving again our Superhero example:

        #
        @@ -551,9 +551,9 @@ 

        Custom widgets -

        Advanced form design

        +

        Advanced form design

        -

        Form structure manipulation

        +

        Form structure manipulation

        In py4web a form is rendered by YATL helpers. This means the tree structure of a form can be manipulated before the form is serialized in HTML. Here is an example of how to manipulate the generate HTML structure:

        @@ -568,7 +568,7 @@

        Form structure manipulation -

        Custom forms

        +

        Custom forms

        Custom forms allow you to granulary control how the form is processed. In the template file, you can execute specific instructions before the form is displayed or after its data submission by inserting code among the following statements:

        [[=form.custom.begin ]]
        @@ -604,7 +604,7 @@ 

        Custom forms -

        The sidecar parameter

        +

        The sidecar parameter

        The sidecar is the stuff injected in the form along with the submit button.

        For example, you can inject a simple click me button in your form with the following code:

        @@ -622,7 +622,7 @@

        The sidecar parameter

        -

        Validação de formulário

        +

        Validação de formulário

        Validators are classes used to validate input fields (including forms generated from database tables). They are normally assigned using the requires attribute of a table Field object, as already shown on the Construtor Field paragraph of the DAL chapter. Also, you can use advanced validators @@ -711,37 +711,37 @@

        Validação de formulário

        -

        Text format validators

        +

        Text format validators

        -

        IS_ALPHANUMERIC

        +

        IS_ALPHANUMERIC

        This validator checks that a field value contains only characters in the ranges a-z, A-Z, 0-9, and underscores.

        requires = IS_ALPHANUMERIC(error_message='must be alphanumeric!')
         
        -

        IS_LOWER

        +

        IS_LOWER

        This validator never returns an error. It just converts the value to lower case.

        requires = IS_LOWER()
         
        -

        IS_UPPER

        +

        IS_UPPER

        This validator never returns an error. It converts the value to upper case.

        requires = IS_UPPER()
         
        -

        IS_EMAIL

        +

        IS_EMAIL

        It checks that the field value looks like an email address. It does not try to send email to confirm.

        requires = IS_EMAIL(error_message='invalid email!')
         
        -

        IS_MATCH

        +

        IS_MATCH

        This validator matches the value against a regular expression and returns an error if it does not match. Here is an example of usage to validate a US zip code:

        requires = IS_MATCH('^\d{5}(-\d{4})?$',
        @@ -771,7 +771,7 @@ 

        IS_MATCH substring rather than the original value.

        -

        IS_LENGTH

        +

        IS_LENGTH

        Checks if length of field’s value fits between given boundaries. Works for both text and file inputs.

        Its arguments are:

        @@ -800,7 +800,7 @@

        IS_LENGTH

        -

        IS_URL

        +

        IS_URL

        Rejects a URL string if any of the following is true:

        • The string is empty or None

        • @@ -846,7 +846,7 @@

          IS_URL

        -

        IS_SLUG

        +

        IS_SLUG

        requires = IS_SLUG(maxlen=80, check=False, error_message='must be slug')
         
        @@ -854,7 +854,7 @@

        IS_SLUG<

        If check is set to False (default) it converts the input value to a slug.

        -

        IS_JSON

        +

        IS_JSON

        requires = IS_JSON(error_message='Invalid json', native_json=False)
         
        @@ -863,16 +863,16 @@

        IS_JSON<

        -

        Date and time validators

        +

        Date and time validators

        -

        IS_TIME

        +

        IS_TIME

        This validator checks that a field value contains a valid time in the specified format.

        requires = IS_TIME(error_message='must be HH:MM:SS!')
         
        -

        IS_DATE

        +

        IS_DATE

        This validator checks that a field value contains a valid date in the specified format. It is good practice to specify the format using the translation operator, in order to support different formats in different locales.

        requires = IS_DATE(format=T('%Y-%m-%d'),
             error_message='must be YYYY-MM-DD!')
        @@ -881,7 +881,7 @@ 

        IS_DATE<

        For the full description on % directives look under the IS_DATETIME validator.

        -

        IS_DATETIME

        +

        IS_DATETIME

        This validator checks that a field value contains a valid datetime in the specified format. It is good practice to specify the format using the translation operator, in order to support different formats in different locales.

        requires = IS_DATETIME(format=T('%Y-%m-%d %H:%M:%S'),
                            error_message='must be YYYY-MM-DD HH:MM:SS!')
        @@ -903,7 +903,7 @@ 

        IS_DATETIME

        -

        IS_DATE_IN_RANGE

        +

        IS_DATE_IN_RANGE

        Works very much like the previous validator but allows to specify a range:

        requires = IS_DATE_IN_RANGE(format=T('%Y-%m-%d'),
                         minimum=datetime.date(2008, 1, 1),
        @@ -914,7 +914,7 @@ 

        IS_DATE_IN_RANG

        For the full description on % directives look under the IS_DATETIME validator.

        -

        IS_DATETIME_IN_RANGE

        +

        IS_DATETIME_IN_RANGE

        Works very much like the previous validator but allows to specify a range:

        requires = IS_DATETIME_IN_RANGE(format=T('%Y-%m-%d %H:%M:%S'),
                             minimum=datetime.datetime(2008, 1, 1, 10, 30),
        @@ -926,9 +926,9 @@ 

        IS_DATETIME_IN_

        -

        Range, set and equality validators

        +

        Range, set and equality validators

        -

        IS_EQUAL_TO

        +

        IS_EQUAL_TO

        Checks whether the validated value is equal to a given value (which can be a variable):

        requires = IS_EQUAL_TO(request.vars.password,
                             error_message='passwords do not match')
        @@ -936,7 +936,7 @@ 

        IS_EQUAL_TO

        -

        IS_NOT_EMPTY

        +

        IS_NOT_EMPTY

        This validator checks that the content of the field value is neither None nor an empty string nor an empty list. A string value is checked for after a .strip().

        requires = IS_NOT_EMPTY(error_message='cannot be empty!')
         
        @@ -947,11 +947,11 @@

        IS_NOT_EMPTY

        -

        IS_NULL_OR

        +

        IS_NULL_OR

        Deprecated, an alias for IS_EMPTY_OR described below.

        -

        IS_EMPTY_OR

        +

        IS_EMPTY_OR

        Sometimes you need to allow empty values on a field along with other requirements. For example a field may be a date but it can also be empty. The IS_EMPTY_OR validator allows this:

        requires = IS_EMPTY_OR(IS_DATE())
        @@ -965,7 +965,7 @@ 

        IS_EMPTY_OR

        -

        IS_EXPR

        +

        IS_EXPR

        This validator let you express a general condition by means of a callable which takes a value to validate and returns the error message or None to accept the input value.

        requires = IS_EXPR(lambda v: T('not divisible by 3') if int(v) % 3 else None)
         
        @@ -983,7 +983,7 @@

        IS_EXPR<

        -

        IS_DECIMAL_IN_RANGE

        +

        IS_DECIMAL_IN_RANGE

        INPUT(_type='text', _name='name', requires=IS_DECIMAL_IN_RANGE(0, 10, dot="."))
         
        @@ -995,7 +995,7 @@

        IS_DECIMAL_IN_R

        The dot argument is optional and allows you to internationalize the symbol used to separate the decimals.

        -

        IS_FLOAT_IN_RANGE

        +

        IS_FLOAT_IN_RANGE

        Checks that the field value is a floating point number within a definite range, 0 <= value <= 100 in the following example:

        requires = IS_FLOAT_IN_RANGE(0, 100, dot=".",
                                     error_message='negative or too large!')
        @@ -1004,7 +1004,7 @@ 

        IS_FLOAT_IN_RAN

        The dot argument is optional and allows you to internationalize the symbol used to separate the decimals.

        -

        IS_INT_IN_RANGE

        +

        IS_INT_IN_RANGE

        Checks that the field value is an integer number within a definite range,

        0 <= value < 100 in the following example:

        requires = IS_INT_IN_RANGE(0, 100,
        @@ -1015,7 +1015,7 @@ 

        IS_INT_IN_RANGE

        -

        IS_IN_SET

        +

        IS_IN_SET

        This validator will automatically set the form field to an option field (ie, with a drop-down menu).

        IS_IN_SET checks that the field values are in a set:

        requires = IS_IN_SET(['a', 'b', 'c'], zero=T('choose one'),
        @@ -1033,14 +1033,14 @@ 

        IS_IN_SET

        -

        Checkbox validation

        +

        Checkbox validation

        To force a filled-in form checkbox (such as an acceptance of terms and conditions), use this:

        -
        requires=IS_IN_SET(['on'])
        +
        requires=IS_IN_SET(['ON'])
         
        -

        Dictionaries and tuples with IS_IN_SET

        +

        Dictionaries and tuples with IS_IN_SET

        You may also use a dictionary or a list of tuples to make the drop down list more descriptive:

        # Dictionary example:
         requires = IS_IN_SET({'A':'Apple', 'B':'Banana', 'C':'Cherry'}, zero=None)
        @@ -1051,14 +1051,14 @@ 

        Dictionaries and tuples with IS_IN_SET -

        Sorted options

        +

        Sorted options

        To keep the options alphabetically sorted by their labels into the drop down list, use the sort argument with IS_IN_SET.

        IS_IN_SET([('H', 'Hulk'), ('S', 'Superman'), ('B', 'Batman')], sort=True)
         
        -

        IS_IN_SET and Tagging

        +

        IS_IN_SET and Tagging

        The IS_IN_SET validator has an optional attribute multiple=False. If set to True, multiple values can be stored in one field. The field should be of type list:integer or list:string as discussed in [[Chapter 6 ../06#list-type-and-contains]]. An explicit example of tagging is discussed there. We strongly suggest using the jQuery multiselect plugin to render multiple fields.

        @@ -1068,9 +1068,9 @@

        IS_IN_SET

        -

        Complexity and security validators

        +

        Complexity and security validators

        -

        IS_STRONG

        +

        IS_STRONG

        Enforces complexity requirements on a field (usually a password field).

        Example:

        requires = IS_STRONG(min=10, special=2, upper=2)
        @@ -1100,7 +1100,7 @@ 

        IS_STRONGnumber = 1, special = 1 which otherwise are all sets to None.

        -

        CRYPT

        +

        CRYPT

        This is also a filter. It performs a secure hash on the input and it is used to prevent passwords from being passed in the clear to the database.

        requires = CRYPT()
         
        @@ -1132,9 +1132,9 @@

        CRYPT

        -

        Special type validators

        +

        Special type validators

        -

        IS_LIST_OF

        +

        IS_LIST_OF

        This validator helps you to ensure length limits on values of type list, for this purpose use its minimum, maximum, and error_message arguments, for example:

        requires = IS_LIST_OF(minimum=2)
        @@ -1153,7 +1153,7 @@ 

        IS_LIST_OF

        -

        IS_LIST_OF_EMAILS

        +

        IS_LIST_OF_EMAILS

        This validator is specifically designed to work with the following field:

        Field('emails', 'list:string',
               widget=SQLFORM.widgets.text.widget,
        @@ -1179,7 +1179,7 @@ 

        IS_LIST_OF_EMAI

        The effect of the represent argument (at lines 6 and 7) is to add a «mailto:…» link to each email address when the record is rendered in HTML pages.

        -

        ANY_OF

        +

        ANY_OF

        This validator takes a list of validators and accepts a value if any of the validators in the list does (i.e. it acts like a logical OR with respect to given validators).

        requires = ANY_OF([IS_ALPHANUMERIC(), IS_EMAIL()])
        @@ -1196,7 +1196,7 @@ 

        ANY_OF

        -

        IS_IMAGE

        +

        IS_IMAGE

        This validator checks if a file uploaded through the file input was saved in one of the selected image formats and has dimensions (width and height) within given limits.

        It does not check for maximum file size (use IS_LENGTH for that). It returns @@ -1231,7 +1231,7 @@

        IS_IMAGE

        -

        IS_FILE

        +

        IS_FILE

        Checks if name and extension of file uploaded through file input matches given criteria.

        Does not ensure the file type in any way. Returns validation failure if no data was uploaded.

        Its arguments are:

        @@ -1271,7 +1271,7 @@

        IS_FILE<

        -

        IS_UPLOAD_FILENAME

        +

        IS_UPLOAD_FILENAME

        This is the older implementation for checking files, included for backwards compatibility. For new applications, use IS_FILE().

        This validator checks if the name and extension of a file uploaded through the file input matches the given criteria.

        It does not ensure the file type in any way. Returns validation failure @@ -1300,7 +1300,7 @@

        IS_UPLOAD_FILEN

        -

        IS_IPV4

        +

        IS_IPV4

        This validator checks if a field’s value is an IP version 4 address in decimal form. Can be set to force addresses from a certain range.

        IPv4 regex taken from regexlib. The signature for the IS_IPV4 constructor is the following:

        @@ -1348,7 +1348,7 @@

        IS_IPV4<

        -

        IS_IPV6

        +

        IS_IPV6

        This validator checks if a field’s value is an IP version 6 address.

        The signature for the IS_IPV6 constructor is the following:

        IS_IPV6(is_private=None,
        @@ -1395,7 +1395,7 @@ 

        IS_IPV6<

        -

        IS_IPADDRESS

        +

        IS_IPADDRESS

        This validator checks if a field’s value is an IP address (either version 4 or version 6). Can be set to force addresses from within a specific range. Checks are done using the appropriate IS_IPV4 or IS_IPV6 validator.

        @@ -1427,9 +1427,9 @@

        IS_IPADDRESS

        -

        Other validators

        +

        Other validators

        -

        CLEANUP

        +

        CLEANUP

        This is a filter. It never fails. By default it just removes all characters whose decimal ASCII codes are not in the list [10, 13, 32-127]. It always perform an initial strip (i.e. heading and trailing blank characters removal) on the value.

        requires = CLEANUP()
        @@ -1443,9 +1443,9 @@ 

        CLEANUP<

        -

        Database validators

        +

        Database validators

        -

        IS_NOT_IN_DB

        +

        IS_NOT_IN_DB

        Synopsis: IS_NOT_IN_DB(db|set, 'table.field')

        Consider the following example:

        @@ -1481,7 +1481,7 @@

        IS_NOT_IN_DB

        -

        IS_IN_DB

        +

        IS_IN_DB

        Synopsis: IS_IN_DB(db|set, 'table.value_field', '%(representing_field)s', zero='choose one') where the third and fourth arguments are optional.

        @@ -1540,7 +1540,7 @@

        IS_IN_DB

        -

        IS_IN_DB and Tagging

        +

        IS_IN_DB and Tagging

        The IS_IN_DB validator has an optional attribute multiple=False. If set to True multiple values can be stored in one field. This field should be of type list:reference as discussed in `` Lista: <type> `` e `` contains``. An explicit example of tagging is discussed there. Multiple references are handled automatically in create and update forms, but they are transparent to @@ -1548,7 +1548,7 @@

        IS_IN_DB

        -

        Validation functions

        +

        Validation functions

        In order to explicitly define a validation function, we pass to the validation parameter a function that takes the form and returns a dictionary, mapping field names to errors. If the dictionary is non-empty, the errors will be @@ -1616,7 +1616,7 @@

        Validation functions - v: 1.20230507.1 + v: 1.20230718.1

      +
    • User Impersonation
    • Rede
    • @@ -122,7 +123,7 @@
      -

      Authentication and authorization

      +

      Authentication and authorization

      Strong authentication and authorization methods are vital for a modern, multiuser web application. While they are often used interchangeably, authentication and authorization @@ -132,7 +133,7 @@

      Authentication and authorization -

      Authentication using Auth

      +

      Authentication using Auth

      py4web comes with a an object Auth and a system of plugins for user authentication. It has the same name as the corresponding web2py one and serves the same purpose but the API and @@ -180,7 +181,7 @@

      Authentication using Auth -

      Interface de autenticação

      +

      Interface de autenticação

      Você pode criar sua própria interface do usuário da web para usuários de login usando as APIs acima, mas py4web fornece um como exemplo, implementada nos seguintes arquivos:

      • _Scaffold / templates / auth.html

      • @@ -223,7 +224,7 @@

        Interface de autenticação -

        Using Auth inside actions

        +

        Using Auth inside actions

        There two ways to use the Auth object in an action.

        The first one does not force a login. With @action.uses(auth) we tell py4web that this action should have information about the user, @@ -246,7 +247,7 @@

        Using Auth inside actions -

        Two Factor Authentication

        +

        Two Factor Authentication

        Two factor authentication (or Two-step verification) is a way of improving authentication security. When activated an extra step is added in the login process. In the first step, users are shown the standard username/password form. If they successfully pass this challenge by submitting the correct username and password, and two factor authentication is enabled for the user, the server will present a second form before logging them in.

        There are a few Auth settings available to control how two factor authentication works.

        The follow can be specified on Auth instantiation:

        @@ -255,7 +256,7 @@

        Two Factor Authentication -

        two_factor_required

        +

        two_factor_required

        When you pass a method name to the two_factor_filter parameter you are telling py4web to call that method to determine whether or not this login should be use or bypass two factor authentication. If your method returns True, then this login requires two factor. If it returns False, two factor authentication is bypassed for this login.

        Sample two_factor_filter method

        This example shows how to allow users that are on a specific network.

        @@ -277,7 +278,7 @@

        two_factor_required -

        two_factor_send

        +

        two_factor_send

        When two factor authentication is active, py4web generates a 6 digit code (using random.randint) and sends it to you. How this code is sent, is up to you. The two_factor_send argument to the Auth class allows you to specify the method that sends the two factor code to the user.

        This example shows how to send an email with the two factor code:

        def send_two_factor_email(user, code):
        @@ -301,7 +302,7 @@ 

        two_factor_send -

        two_factor_tries

        +

        two_factor_tries

        By default, the user has 3 attempts to pass two factor authentication. You can override this after using:

        auth.param.two_factor_tries = 5
         
        @@ -324,7 +325,7 @@

        two_factor_tries -

        Plugins de Autenticação

        +

        Plugins de Autenticação

        Plugins are defined in “py4web/utils/auth_plugins” and they have a hierarchical structure. Some are exclusive and some are not. For example, default, LDAP, PAM, and SAML are exclusive (the developer has to pick @@ -335,7 +336,7 @@

        Plugins de Autenticação -

        PAM

        +

        PAM

        Configurando PAM é o mais fácil:

        from py4web.utils.auth_plugins.pam_plugin import PamPlugin
         auth.register_plugin(PamPlugin())
        @@ -352,7 +353,7 @@ 

        PAM

      -

      LDAP

      +

      LDAP

      This is a common authentication method, especially using Microsoft Active Directory in enterprises.

      from py4web.utils.auth_plugins.ldap_plugin import LDAPPlugin
       LDAP_SETTING = {
      @@ -370,7 +371,7 @@ 

      LDAP

      -

      OAuth2 with Google

      +

      OAuth2 with Google

      from py4web.utils.auth_plugins.oauth2google import OAuth2Google # TESTED
       auth.register_plugin(OAuth2Google(
           client_id=CLIENT_ID,
      @@ -381,7 +382,7 @@ 

      OAuth2 with Google -

      OAuth2 with Facebook

      +

      OAuth2 with Facebook

      from py4web.utils.auth_plugins.oauth2facebook import OAuth2Facebook # UNTESTED
       auth.register_plugin(OAuth2Facebook(
           client_id=CLIENT_ID,
      @@ -392,7 +393,7 @@ 

      OAuth2 with FacebookO ID de cliente e segredo do cliente deve ser fornecido pelo Facebook.

      -

      OAuth2 with Discord

      +

      OAuth2 with Discord

      from py4web.utils.auth_plugins.oauth2discord import OAuth2Discord
       auth.register_plugin(OAuth2Discord(
           client_id=DISCORD_CLIENT_ID,
      @@ -412,12 +413,12 @@ 

      OAuth2 with Discord -

      Authorization using Tags

      +

      Authorization using Tags

      As already mentioned, authorization is the process of verifying what specific applications, files, and data a user has access to. This is accomplished in py4web using Tags.

      -

      Etiquetas e permissões

      +

      Etiquetas e permissões

      Py4web provides a general purpose tagging mechanism that allows the developer to tag any record of any table, check for the existence of tags, as well as checking for records @@ -492,7 +493,7 @@

      Etiquetas e permissõesThis means that slashes have a special meaning for tags.

      -

      Multiple Tags objects

      +

      Multiple Tags objects

      +
      +

      User Impersonation

      +

      It is possible to impersonate a user. As an example here is an action that, when called with ?user_id={number} +start impersonation and when called without ?user_id will stop impersonation:

      +
      @action("impersonate")
      +@action.uses(auth.user)
      +def switch_impersonation():
      +    id = request.query.get("user_id")
      +    if auth.is_impersonating():
      +        if not user_id or auth.user_id != user_id:
      +         auth.stop_impersonation(next_url=URL("index"))
      +    # if we are not impersonating and a user email is specificed
      +    if not auth.is_impersonating() and user_id:
      +        if db(db.auth_user.id == user_id),count() == 0:
      +             raise HTTP(404)
      +        auth.impersonate(user_id, next_url=URL("index"))
      +
      +
      +
      @@ -572,7 +592,7 @@

      Multiple Tags objects - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/pt/chapter-14.html b/apps/_documentation/static/pt/chapter-14.html index 934dc443c..cfbff65b1 100644 --- a/apps/_documentation/static/pt/chapter-14.html +++ b/apps/_documentation/static/pt/chapter-14.html @@ -1,10 +1,10 @@ - + - Rede — Documentação py4web 1.20230507.1 + Rede — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -41,7 +41,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -114,12 +114,12 @@
      -

      Rede

      +

      Rede

      py4web comes with a Grid object providing grid and CRUD (create, update and delete) capabilities. This allows you to quickly and safely provide an interface to your data. Since it’s also highly customizable, it’s the corner stone of most py4web’s applications.

      -

      Key features

      +

      Key features

      • CRUD completa com Confirmação de exclusão

      • Clique cabeças de coluna para classificar - clique novamente para DESC

      • @@ -138,7 +138,7 @@

        Key features -

        Basic grid example

        +

        Basic grid example

        In this simple example we will make a grid over the superhero table.

        Create a new minimal app called grid. Change it with the following content.

        # in grid/__init__.py
        @@ -250,7 +250,7 @@ 

        Basic grid examplehttps://github.com/jpsteil/grid_tutorial.

      -

      The Grid object

      +

      The Grid object

      class Grid:
          def __init__(
             self,
      @@ -329,7 +329,7 @@ 

      The Grid objectUsing callable parameters later on.

      -

      Searching and filtering

      +

      Searching and filtering

      There are two ways to build a search form:

      -

      CRUD settings

      +

      CRUD settings

      The grid provides CRUD (create, read, update and delete) capabilities utilizing py4web Form. You can turn off CRUD features by setting @@ -354,7 +354,7 @@

      CRUD settings -

      Custom columns

      +

      Custom columns

      If the grid does not involve a join but displays results from a single table you can specify a list of columns. Columns are highly customizable.

      from py4web.utils.grid import Column
      @@ -389,7 +389,7 @@ 

      Custom columns -

      Usando templates

      +

      Usando templates

      Use o seguinte para tornar a sua grid ou formas CRUD em seus templates.

      Mostrar a grid ou um formulário CRUD

      [[=grid.render()]]
      @@ -420,7 +420,7 @@ 

      Usando templates -

      Customizing style

      +

      Customizing style

      Você pode fornecer suas próprias formstyle ou grid classes e estilo ao grid.

      -

      Simple conversion examples

      +

      Simple conversion examples

      -

      “Hello world” example

      +

      “Hello world” example

      web2py

      # in controllers/default.py
       def index():
      @@ -217,7 +217,7 @@ 

      “Hello world” example

      -

      “Redirect with variables” example

      +

      “Redirect with variables” example

      web2py

      request.get_vars.name
       request.post_vars.name
      @@ -238,7 +238,7 @@ 

      “Redirect with variables” example -

      “Returning variables” example

      +

      “Returning variables” example

      web2py

      def index():
          a = request.get_vars.a
      @@ -254,7 +254,7 @@ 

      “Returning variables” example -

      “Returning args” example

      +

      “Returning args” example

      web2py

      def index():
          a, b, c = request.args
      @@ -270,7 +270,7 @@ 

      “Returning args” example -

      “Return calling methods” example

      +

      “Return calling methods” example

      web2py

      def index():
          if request.method == "GET":
      @@ -292,7 +292,7 @@ 

      “Return calling methods” example -

      “Setting up a counter” example

      +

      “Setting up a counter” example

      web2py

      def counter():
          session.counter = (session.counter or 0) + 1
      @@ -307,7 +307,7 @@ 

      “Setting up a counter” example -

      “View” example

      +

      “View” example

      web2py

      {{ extend 'layout.html' }}
       <div>
      @@ -328,7 +328,7 @@ 

      “View” example -

      “Form and flash” example

      +

      “Form and flash” example

      web2py

      db.define_table('thing', Field('name'))
       
      @@ -368,7 +368,7 @@ 

      “Form and flash” example -

      “grid” example

      +

      “grid” example

      web2py

      def index():
          grid = SQLFORM.grid(db.thing, editable=True)
      @@ -386,7 +386,7 @@ 

      “grid” example -

      “Accessing OS files” example

      +

      “Accessing OS files” example

      web2py

      file_path = os.path.join(request.folder, 'file.csv')
       
      @@ -398,7 +398,7 @@

      “Accessing OS files” example -

      “auth” example

      +

      “auth” example

      web2py

      auth = Auth()
       auth.define_tables()
      @@ -489,7 +489,7 @@ 

      “auth” example - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/pt/chapter-16.html b/apps/_documentation/static/pt/chapter-16.html index 41ac0c4cf..ed33513cd 100644 --- a/apps/_documentation/static/pt/chapter-16.html +++ b/apps/_documentation/static/pt/chapter-16.html @@ -1,10 +1,10 @@ - + - Advanced topics and examples — Documentação py4web 1.20230507.1 + Advanced topics and examples — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -110,9 +110,9 @@
      -

      Advanced topics and examples

      +

      Advanced topics and examples

      -

      py4web and asyncio

      +

      py4web and asyncio

      Asyncio is not strictly needed, at least for most of the normal use cases where it will add problems more than value because of its concurrency model. On the other hand, we think py4web needs a built-in websocket async based solution.

      @@ -121,7 +121,7 @@

      py4web and asyncio -

      htmx

      +

      htmx

      There are many javascript front-end frameworks available today that allow you great flexibility over how you design your web client. Vue, React and Angular are just a few. However, the complexity in building one of these systems prevents many developers from reaping those benefits. @@ -140,7 +140,7 @@

      htmx
    • Includes an htmx attributes plugin for the py4web grid

    • -

      htmx usage in Form

      +

      htmx usage in Form

      The py4web Form class allows you to pass **kwargs to it that will be passed along as attributes to the html form. For example, to add the hx-post and hx-target to the <form> element you would use:

      attrs = {
      @@ -232,7 +232,7 @@ 

      htmx usage in Form -

      htmx usage in Grid

      +

      htmx usage in Grid

      The py4web grid provides an attributes plugin system that allows you to build plugins to provide custom attributes for form elements, anchor elements or confirmation messages. py4web also provide an attributes plugin specifically for htmx.

      @@ -303,7 +303,7 @@

      htmx usage in Grid -

      Autocomplete Widget using htmx

      +

      Autocomplete Widget using htmx

      htmx can be used for much more than just form/grid processing. In this example we’ll take advantage of htmx and the py4web form widgets to build an autocomplete widget that can be used in your forms. NOTE: this is just an example, none of this code comes with py4web

      @@ -507,18 +507,18 @@

      Autocomplete Widget using htmx -

      utils.js

      +

      utils.js

      Multiple times in this documentation we have mentioned utils.js which comes with the scaffolding application, yet we never clearly listed what is in there. So here it is.

      -

      string.format

      +

      string.format

      It extends the String object prototype to allow expressions like this:

      var a = "hello {name}".format(name="Max");
       
      -

      The Q object

      +

      The Q object

      The Q object can be used like a selector supporting jQuery like syntax:

      var element = Q("#element-id")[0];
       var selected_elements = Q(".element-class");
      @@ -602,7 +602,7 @@ 

      The Q object -

      The T object

      +

      The T object

      This is a Javascript reimplementation of the Python pluralize library in Python which is used by the Python T object in py4web. So basically a client-side T.

      T.translations = {'dog': {0: 'no cane', 1: 'un case', 2: '{n} cani', 10: 'tanti cani'}};
      @@ -757,7 +757,7 @@ 

      The T object - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/pt/genindex.html b/apps/_documentation/static/pt/genindex.html index 127eb801e..9f3ff1a45 100644 --- a/apps/_documentation/static/pt/genindex.html +++ b/apps/_documentation/static/pt/genindex.html @@ -3,7 +3,7 @@ - Índice — Documentação py4web 1.20230507.1 + Índice — Documentação py4web 1.20230718.1 @@ -13,14 +13,14 @@ - - - - - - - - + + + + + + + + @@ -39,7 +39,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -133,7 +133,7 @@

      Índice

      - v: 1.20230507.1 + v: 1.20230718.1
      diff --git a/apps/_documentation/static/pt/index.html b/apps/_documentation/static/pt/index.html index 2e5d37860..9ec44f504 100644 --- a/apps/_documentation/static/pt/index.html +++ b/apps/_documentation/static/pt/index.html @@ -1,10 +1,10 @@ - + - py4web: o manual de referência — Documentação py4web 1.20230507.1 + py4web: o manual de referência — Documentação py4web 1.20230718.1 @@ -14,13 +14,13 @@ - - - - - - - + + + + + + + @@ -40,7 +40,7 @@
      - 1.20230507.1 + 1.20230718.1
      @@ -95,7 +95,7 @@
      -

      py4web: o manual de referência

      +

      py4web: o manual de referência

      Conteúdo:

        @@ -206,6 +206,7 @@

        py4web: o manual de referênciaAuthentication and authorization
      • Rede
          @@ -233,7 +234,7 @@

          py4web: o manual de referência -

          Índices e tabelas

          +

          Índices e tabelas

          • : Ref: genindex

          • : Ref: modindex

          • @@ -276,7 +277,7 @@

            Índices e tabelas - v: 1.20230507.1 + v: 1.20230718.1
            diff --git a/apps/_documentation/static/pt/objects.inv b/apps/_documentation/static/pt/objects.inv index 45d5e01e8..a25a2310d 100644 Binary files a/apps/_documentation/static/pt/objects.inv and b/apps/_documentation/static/pt/objects.inv differ diff --git a/apps/_documentation/static/pt/search.html b/apps/_documentation/static/pt/search.html index 5a8463000..007f18d2d 100644 --- a/apps/_documentation/static/pt/search.html +++ b/apps/_documentation/static/pt/search.html @@ -3,7 +3,7 @@ - Pesquisar — Documentação py4web 1.20230507.1 + Pesquisar — Documentação py4web 1.20230718.1 @@ -14,14 +14,14 @@ - - - - - - - - + + + + + + + + @@ -42,7 +42,7 @@
            - 1.20230507.1 + 1.20230718.1
            @@ -140,7 +140,7 @@ - v: 1.20230507.1 + v: 1.20230718.1
            diff --git a/apps/_documentation/static/pt/searchindex.js b/apps/_documentation/static/pt/searchindex.js index 483023026..34f663ba2 100644 --- a/apps/_documentation/static/pt/searchindex.js +++ b/apps/_documentation/static/pt/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["chapter-01", "chapter-02", "chapter-03", "chapter-04", "chapter-05", "chapter-06", "chapter-07", "chapter-08", "chapter-09", "chapter-10", "chapter-11", "chapter-12", "chapter-13", "chapter-14", "chapter-15", "chapter-16", "index"], "filenames": ["chapter-01.rst", "chapter-02.rst", "chapter-03.rst", "chapter-04.rst", "chapter-05.rst", "chapter-06.rst", "chapter-07.rst", "chapter-08.rst", "chapter-09.rst", "chapter-10.rst", "chapter-11.rst", "chapter-12.rst", "chapter-13.rst", "chapter-14.rst", "chapter-15.rst", "chapter-16.rst", "index.rst"], "titles": ["O que \u00e9 py4web?", "Ajuda, recursos e dicas", "Instala\u00e7\u00e3o e coloca\u00e7\u00e3o em funcionamento", "O Dashboard", "Criando seu primeiro aplicativo", "Fixures", "The Database Abstraction Layer (DAL)", "The RestAPI", "Linguagem de template YATL", "Helpers YATL", "Internacionaliza\u00e7\u00e3o", "Foruml\u00e1rios", "Authentication and authorization", "Rede", "De web2py para py4web", "Advanced topics and examples", "py4web: o manual de refer\u00eancia"], "terms": {"is": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "web": [0, 1, 2, 5, 6, 8, 12, 13, 14, 15, 16], "framework": [0, 2, 11, 12, 13, 14, 15], "rapid": [0, 11, 15], "development": [0, 1, 4, 6], "of": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "efficient": 0, "databas": [0, 1, 3, 4, 7, 12, 13, 14, 15, 16], "driven": 0, "applications": [0, 2, 3, 4, 6, 11, 12, 13], "it": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "evolution": 0, "the": [0, 3, 8, 9, 10, 12, 14, 16], "popul": [0, 6], "web2py": [0, 1, 2, 3, 4, 6, 11, 12, 13, 16], "but": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "much": [0, 1, 5, 6, 8, 11, 13, 14, 15], "fast": [0, 4, 6, 8, 14, 15], "and": [0, 1, 2, 3, 4, 5, 9, 16], "slick": 0, "its": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "internal": [0, 1, 8, 12], "design": [0, 12, 15, 16], "has": [0, 2, 4, 5, 6, 8, 11, 12, 13, 14, 15], "been": [0, 2, 5, 6, 8, 11], "simplified": [0, 4, 8], "compared": 0, "to": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "be": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "seen": [0, 5, 7, 9, 11, 13, 15], "competitor": 0, "other": [0, 1, 2, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15], "frameworks": [0, 2, 5, 14, 15], "lik": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "djang": [0, 1, 14], "or": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "flask": [0, 14], "indeed": [0, 5], "serv": [0, 2, 3, 4, 7, 8, 12, 14, 15, 16], "sam": [0, 2, 5, 6, 7, 8, 11, 12, 14, 15], "purpos": [0, 4, 6, 9, 11, 12, 14], "yet": [0, 2, 4, 5, 8, 11, 15], "aims": 0, "provid": [0, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "larg": [0, 11], "featur": [0, 4, 6, 7, 8, 14, 16], "set": [0, 2, 5, 7, 8, 9, 10, 13, 14, 15], "out": [0, 1, 5, 8, 11, 15], "box": [0, 6, 11], "reduc": [0, 15], "tim": [0, 4, 5, 6, 8, 13, 14, 15], "new": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "apps": [0, 1, 2, 3, 4, 5, 6, 8, 12, 14], "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "historical": 0, "perspectiv": 0, "our": [0, 1, 2, 5, 6, 9, 11, 15], "story": 0, "starts": [0, 3, 5, 8, 14], "in": [0, 1, 2, 3, 4, 6, 7, 10, 11, 12, 13, 14, 16], "2007": 0, "when": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "was": [0, 5, 6, 11, 12], "first": [0, 2, 3, 5, 7, 8, 9, 11, 12, 13, 14, 15], "released": 0, "designed": [0, 4, 6, 8, 11], "all": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "inclusiv": [0, 11], "solution": [0, 15], "one": [0, 2, 4, 5, 6, 7, 8, 11, 12, 13, 15], "zip": [0, 2, 6, 11], "fil": [0, 1, 2, 3, 5, 6, 8, 9, 10, 12, 13, 15, 16], "containing": [0, 2, 5, 11, 12, 13, 15], "python": [0, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "interpret": [0, 6], "based": [0, 3, 4, 5, 7, 8, 11, 12, 13, 14, 15], "ide": [0, 1, 2, 3, 6], "collection": [0, 14], "battl": 0, "tested": [0, 2, 9, 12], "packag": [0, 6, 9], "that": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "work": [0, 2, 4, 5, 6, 8, 9, 11, 15], "well": [0, 5, 6, 8, 11, 12, 15], "togeth": [0, 8], "many": [0, 1, 2, 4, 5, 7, 8, 11, 13, 14, 15], "ways": [0, 4, 6, 12, 13, 15], "immensely": 0, "successful": [0, 12], "succeeded": 0, "providing": [0, 13, 14], "low": [0, 11], "barri": 0, "entry": [0, 6, 14], "developers": [0, 1, 6, 12, 15], "very": [0, 4, 8, 9, 11, 12, 14], "secur": [0, 11], "platform": [0, 1], "remains": 0, "backwards": [0, 11], "compatibl": [0, 1, 9, 11], "until": [0, 5, 6, 8, 11], "today": [0, 11, 15], "always": [0, 2, 4, 5, 6, 11, 15], "suffered": 0, "probl": [0, 6, 8, 13], "monolithic": 0, "most": [0, 4, 5, 6, 11, 12, 13, 14, 15], "experienced": 0, "did": [0, 4, 15], "not": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "understand": [0, 2, 4, 6, 7, 8], "how": [0, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15], "use": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "components": [0, 3, 9, 11, 15], "outsid": [0, 5, 6, 11, 13, 14, 15], "third": [0, 5, 11], "party": [0, 5], "within": [0, 1, 5, 6, 8, 9, 11, 15], "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "thought": [0, 6, 12], "perfect": 0, "tool": 0, "hav": [0, 1, 2, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "broken": [0, 6, 11], "into": [0, 2, 4, 5, 6, 8, 9, 11, 14, 15], "piec": [0, 11], "becaus": [0, 4, 5, 6, 8, 9, 11, 13, 15], "would": [0, 5, 6, 9, 11, 15], "compromis": 0, "security": [0, 7, 12], "turned": 0, "wer": [0, 4], "wrong": [0, 5, 6], "playing": 0, "with": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 15], "others": [0, 6, 14], "important": [0, 2, 4, 5, 6, 11, 12], "henc": [0, 2, 5, 6, 11], "sinc": [0, 2, 4, 5, 7, 8, 11, 13, 14], "2015": 0, "worked": 0, "on": [0, 1, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15], "thre": [0, 5, 6], "fronts": 0, "N\u00f3s": [0, 1, 5], "port": [0, 2, 3, 5, 6, 14], "par": [0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 15, 16], "3": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "quebr": 0, "m\u00f3dul": [0, 1, 2, 5, 6], "pod": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13], "ser": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13], "usad": [0, 4, 6, 9, 10, 12, 13], "form": [0, 2, 4, 5, 6, 7, 10, 12, 13, 16], "independent": [0, 5, 6, 12], "reagrup": 0, "alguns": [0, 2, 4, 5, 6, 7, 8, 9], "dess": [0, 5, 6, 12], "nov": [0, 1, 2, 3, 4, 13], "modul": [0, 2, 4, 6, 8, 9, 11, 12, 13, 14], "quadr": [0, 1, 6], "mor": [0, 2, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15], "than": [0, 5, 6, 8, 9, 11, 12, 13, 15], "repackaging": 0, "complet": [0, 2, 6, 9, 11, 13], "redesign": 0, "uses": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "som": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 14], "them": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14], "cas": [0, 1, 2, 3, 4, 5, 8, 9, 11, 12, 13, 14, 15], "bett": [0, 1, 2, 4, 6, 13, 14], "functionality": [0, 8, 14], "removed": [0, 6, 9, 11], "added": [0, 2, 5, 11, 12, 15], "tried": 0, "preserv": [0, 5], "syntax": [0, 1, 4, 5, 6, 7, 8, 9, 11, 14, 15], "users": [0, 1, 4, 5, 12, 14], "loved": 0, "her": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15], "explicit": [0, 2, 4, 5, 6, 8, 11], "list": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 15], "see": [0, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15], "De": [0, 1, 4, 6, 16], "details": [0, 1, 5, 6, 7, 8, 11, 13], "if": [0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "come": [0, 5], "contr\u00e1ri": [0, 4, 6, 8], "requ": [0, 2, 5, 6, 11, 12, 13, 14, 15], "unlik": [0, 2, 7, 8, 14, 15], "installed": [0, 1, 2, 3, 4, 5, 6], "using": [0, 1, 3, 4, 6, 7, 11, 14, 16], "pip": [0, 1, 6], "dependenc": [0, 2, 5, 14], "are": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "managed": 0, "requirements": [0, 2, 11], "txt": [0, 2, 4, 6], "regul": [0, 2, 4, 6, 7, 8, 10, 11, 13, 14, 15], "this": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "different": [0, 2, 5, 6, 8, 11, 12, 14, 15], "particul": [0, 1, 6, 11, 13, 14, 15], "ditched": 0, "custom": [0, 4, 6, 8, 9, 14, 15, 16], "import": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "rely": [0, 4, 6], "now": [0, 4, 5, 6, 11, 13, 15], "exclusively": [0, 5, 6], "mechanism": [0, 6, 8, 9, 12, 14], "m\u00faltipl": [0, 6], "aplic": [0, 2, 3, 5, 13, 14, 16], "concorrent": 0, "enquant": [0, 6, 8], "s\u00e3": [0, 1, 3, 4, 5, 6, 8, 9, 10, 12, 13], "subm\u00f3dul": 0, "ombott": [0, 4, 14], "reduced": 0, "spin": [0, 4], "off": [0, 2, 4, 13, 15], "bottl": [0, 4, 5, 8, 14], "request": [0, 1, 2, 5, 6, 7, 11, 12, 13, 14, 15], "object": [0, 4, 5, 6, 7, 8, 9, 11, 12, 14, 16], "routing": [0, 4, 14], "does": [0, 2, 5, 6, 8, 11, 12, 13, 14, 15], "creat": [0, 1, 2, 4, 5, 6, 8, 11, 12, 13, 15], "environment": [0, 1, 4, 5, 6], "at": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "every": [0, 5, 6, 12, 13, 14, 15], "introduc": 0, "concept": [0, 12], "fixtur": [0, 2, 6, 9, 14, 16], "explicitly": [0, 2, 5, 6, 8, 9, 11], "declar": [0, 4, 5, 6, 8], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "objects": [0, 4, 5, 6, 9, 11, 13, 14, 15], "need": [0, 1, 2, 5, 6, 8, 9, 11, 12, 13, 14, 15], "re": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "initialized": 0, "http": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "arriv": [0, 6], "needs": [0, 4, 5, 6, 12, 14, 15], "cleanup": 0, "completed": [0, 6], "mak": [0, 1, 2, 5, 6, 8, 9, 11, 12, 13, 14, 15], "session": [0, 2, 4, 6, 9, 11, 12, 13, 14, 15, 16], "s": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15], "strong": [0, 9, 12], "encryption": 0, "dat": [0, 2, 5, 6, 7, 8, 9, 12, 13, 14, 15], "sessions": [0, 6, 14], "long": [0, 6, 11], "stored": [0, 5, 6, 11, 12, 14, 15], "system": [0, 2, 5, 6, 9, 12, 15], "created": [0, 2, 4, 5, 6, 8, 11, 12], "performanc": [0, 5, 6, 14], "issu": [0, 6], "cooki": [0, 4, 6, 15], "red": [0, 3, 4, 6, 8, 9, 11, 16], "memcach": [0, 6], "optionally": [0, 2], "also": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "limited": [0, 5, 14, 15], "json": [0, 1, 2, 4, 5, 6, 7, 10, 11, 14, 15], "serializabl": [0, 5, 6], "built": [0, 1, 4, 6, 8, 11, 15, 16], "sistem": [0, 2, 5, 6], "bilh\u00e9t": 0, "global": [0, 6, 14, 15], "n\u00e3": [0, 1, 2, 3, 4, 5, 6, 8, 9, 12, 13], "Os": [0, 3, 4, 8, 9, 12, 16], "bilhet": [0, 3, 6], "armazen": [0, 2, 5, 6, 9], "arquiv": [0, 2, 3, 4, 5, 6, 12, 16], "individu": [0, 2, 5, 6], "Eles": [0, 4, 6], "\u00fanic": [0, 2, 6, 9], "banc": [0, 1, 3, 4, 5, 12], "dad": [0, 1, 3, 4, 5, 12, 16], "pydal": [0, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15], "leverag": 0, "restap": [0, 3, 16], "usa": [0, 4, 5, 6, 8], "linguag": [0, 4, 5, 16], "templat": [0, 4, 9, 11, 12, 14, 15, 16], "yatl": [0, 4, 5, 6, 11, 13, 15, 16], "padr\u00e3": [0, 2, 4, 5, 8, 9, 13], "suport": [0, 10, 16], "delimit": [0, 6, 8], "evit": [0, 1, 2, 6, 8, 11], "conflit": [0, 2, 4, 6], "model": [0, 3, 7, 9, 14, 15], "js": [0, 4, 5, 8, 10, 14, 16], "vue": [0, 4, 15], "angularjs": 0, "inclu": [0, 4, 6, 8, 9, 13], "subconjunt": [0, 6], "ajud": [0, 2, 4, 6, 14, 16], "bibliotec": [0, 4, 10], "pluraliz": [0, 4, 5, 13, 15, 16], "internacionaliz": [0, 4, 16], "Na": 0, "pr\u00e1tic": [0, 6, 7], "exp\u00f5": [0, 3, 4, 6, 12], "objet": [0, 5, 6, 8, 9, 10], "t": [0, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14], "muit": [0, 1, 2, 4, 5], "semelh": [0, 4, 5, 6, 9], "fornec": [0, 2, 3, 4, 5, 6, 9, 12, 13], "melhor": [0, 1, 6, 10, 13, 16], "cach": [0, 2, 4, 5, 11], "capac": 0, "flex\u00edv": 0, "vem": [0, 4, 6], "painel": [0, 2, 3], "app": [0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "administr": [0, 2, 6], "substitu": [0, 2, 6, 8, 9], "Esta": [0, 1, 2, 4, 6], "carreg": [0, 6], "gest\u00e3": [0, 1], "edi\u00e7\u00e3": 0, "interfac": [0, 3, 5, 6, 13, 14, 15], "bas": [0, 2, 4, 8, 13, 15], "Isto": [0, 2, 3, 4, 5, 6, 9, 13], "funcional": [0, 2, 5, 6], "appadmin": [0, 6], "comes": [0, 5, 8, 11, 12, 13, 14, 15], "grid": [0, 16], "simil": [0, 11, 14], "sqlform": [0, 11, 14], "auth": [0, 2, 4, 6, 8, 9, 15, 16], "f\u00e1cil": [0, 6, 8, 9, 12], "estend": [0, 5, 6], "Fora": 0, "caix": [0, 6, 9], "b\u00e1sic": [0, 1, 6, 16], "regist": [0, 4, 5, 6, 8, 12, 13, 14], "login": [0, 2, 3, 4, 5, 6, 8, 11, 12, 14], "logout": [0, 8, 12], "alter": [0, 2, 4, 5, 6, 10], "senh": [0, 2, 3, 5, 6, 12], "solicit": [0, 6], "edit": [0, 2, 3, 4, 8, 11, 12, 13, 14, 15], "perfil": [0, 12], "bem": [0, 4, 5, 6, 12], "integr": 0, "pam": [0, 5], "saml2": 0, "ldap": [0, 5], "oauth2": [0, 5], "googl": [0, 3, 5, 8, 11, 13], "facebook": [0, 5], "twitt": [0, 5, 12], "tags": [0, 5, 6, 8, 9, 14, 15, 16], "tag": [0, 6, 7, 8, 12, 14, 15], "groups": [0, 1, 3, 5, 12, 14], "search": [0, 6, 11, 12, 13, 16], "by": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "apply": [0, 5, 11, 12, 13], "permissions": [0, 5, 6, 12, 14], "membership": [0, 5, 11, 12, 14], "component": [0, 4, 5, 8, 9, 11, 12, 15], "personaliz": [0, 2, 16], "projet": [0, 2], "interag": 0, "geral": [0, 2, 6, 7, 9], "Essas": 0, "apis": [0, 6, 12, 14], "permit": [0, 3, 5, 6, 8, 9, 12, 13], "servidor": [0, 4, 5, 6], "defin": [0, 4, 5, 8, 9, 11, 13, 15], "pol\u00edt": 0, "sobr": [0, 8], "qua": [0, 6], "oper": [0, 3, 10, 16], "client": [0, 7, 11, 12, 15], "execut": [0, 2, 3, 6, 11], "d\u00e1": [0, 2, 13], "flexibil": [0, 2, 13], "dentr": [0, 2, 4, 6, 13], "restri\u00e7\u00f5": [0, 6], "dois": [0, 5, 6, 8], "princip": 0, "mtabl": 0, "grad": 0, "api": [0, 6, 7, 9, 11, 12, 15], "continu": [0, 6, 8, 15], "mesm": [0, 1, 2, 4, 5, 8, 9, 10, 13], "desenvolv": 0, "acess": [0, 2, 4, 5, 6], "produ\u00e7\u00e3": 0, "r\u00e1p": [0, 6], "segur": [0, 5], "thanks": 0, "everyon": [0, 1], "who": [0, 12], "contributed": 0, "project": [0, 2, 4, 5, 6], "especially": [0, 2, 5, 11, 12], "massim": [0, 6], "di": [0, 5], "pierr": 0, "luc": [0, 1], "alfar": [0, 1], "cassi": 0, "botar": 0, "dan": 0, "carroll": 0, "jim": [0, 1, 13], "steil": [0, 1, 13], "john": [0, 6], "m": [0, 2, 6, 9, 11], "wolf": 0, "micah": 0, "beasley": 0, "nic": [0, 15], "zanferrar": 0, "pirsch": 0, "sugiz": 0, "valq7711": [0, 4], "kevin": 0, "kell": 0, "log": [0, 2, 4, 5, 6, 8, 9, 12, 14, 15], "special": [0, 5, 6, 8, 12, 14, 16], "official": [0, 11, 15], "friendly": [0, 5, 8], "call": [0, 5, 6, 8, 11, 12, 15], "axel": 0, "axolotl": 0, "magically": 0, "represents": [0, 6], "sens": [0, 11], "kindness": 0, "inclusion": 0, "believ": [0, 5], "cornerston": 0, "growing": [0, 15], "community": [0, 6], "fiz": 1, "noss": [1, 4, 5, 6], "torn": [1, 2, 5, 6, 9, 13], "simpl": [1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16], "limp": 1, "Mas": [1, 4, 6], "voc": [1, 2, 3, 4, 5, 6, 8, 9, 12, 13], "sab": [1, 2, 6, 8], "program": [1, 3, 6, 8], "\u00e9": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16], "taref": [1, 5, 6, 12], "dif\u00edcil": [1, 2], "Ela": [1, 6, 8], "exig": [1, 2, 6, 12], "ment": [1, 6], "abert": [1, 3, 6], "capaz": [1, 2], "salt": [1, 11], "frequ\u00eanc": 1, "perd": [1, 2, 6], "html": [1, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15], "javascript": [1, 4, 7, 9, 15], "css": [1, 4, 5, 8, 9, 11, 12, 13, 15], "tenh": [1, 5, 6], "med": 1, "nest": [1, 6, 8, 9], "vam": [1, 2, 6, 9], "lo": [1, 2, 3, 4, 6, 7, 8, 9], "lad": [1, 2, 5, 6], "jorn": 1, "E": [1, 6, 12], "outr": [1, 2, 4, 5, 9, 10, 12, 13, 16], "valios": 1, "mostr": [1, 4, 6, 13], "referenc": [1, 6, 7, 8, 9, 11, 13], "availabl": [1, 2, 6, 8, 9, 12, 14, 15], "onlin": [1, 6], "https": [1, 3, 4, 5, 7, 8, 11, 12, 13, 15], "_documentation": [1, 3], "static": [1, 4, 8, 9, 14], "index": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "wher": [1, 2, 4, 6, 8, 11, 12, 14, 15], "ll": [1, 2, 3, 5, 6, 8, 11, 13, 15], "find": [1, 2, 4, 11, 12, 13], "pdf": [1, 11], "ebook": 1, "version": [1, 3, 7, 8, 11, 15], "multipl": [1, 2, 6, 8, 9, 11, 14, 15, 16], "languag": [1, 4, 5, 8, 10, 14, 15], "written": [1, 8, 11, 13], "restructuredtext": 1, "generated": [1, 5, 6, 8, 11, 13, 15], "sphinx": 1, "exist": [1, 2, 4, 5, 6, 8, 11, 15], "discuss\u00e3": 1, "dedic": [1, 4, 14], "hosped": 1, "consult": [1, 7, 12, 13], "g": [1, 6, 9, 11], "principal": [1, 5, 6, 16], "discuss\u00f5": 1, "desenvolvedor": [1, 8, 12, 13], "usu\u00e1ri": [1, 2, 3, 4, 5, 6, 12, 14], "qualqu": [1, 2, 4, 5, 6, 7, 8, 12], "problem": [1, 6], "dev": [1, 2, 3, 4, 5, 6, 8, 9, 12, 13], "enfrent": [1, 6], "lug": [1, 5, 6], "cert": [1, 2, 6, 13], "procur": [1, 6], "solu\u00e7\u00e3": [1, 2, 6], "For": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15], "quick": [1, 11], "questions": [1, 2], "chats": 1, "fre": [1, 5, 12], "dedicated": [1, 5, 9], "could": [1, 2, 4, 6, 8, 9, 11, 12, 14], "usually": [1, 5, 7, 11], "hanging": 1, "channel": 1, "ther": [1, 2, 5, 6, 8, 11, 12, 13, 14, 15], "tutorials": 1, "vid": [1, 2, 15], "learn": [1, 6], "sit": [1, 2, 4, 5, 6, 9, 13, 15], "lots": 1, "excellent": [1, 13], "training": 1, "cours": [1, 8], "2020": 1, "uc": 1, "sant": 1, "cruz": [1, 6], "blog": [1, 6, 9], "andrew": 1, "gavgavian": 1, "replicat": [1, 5], "famous": 1, "corey": 1, "schaf": 1, "tutorial": [1, 2, 4, 13, 15], "seri": 1, "creating": [1, 2, 6, 12, 14], "south": 1, "breez": 1, "enterpris": [1, 12], "dem": [1, 2, 15], "around": [1, 14], "structur": [1, 4, 6, 12, 13, 14, 16], "microsoft": [1, 12], "northwind": 1, "converted": [1, 6, 11], "sqlit": [1, 4, 5, 7, 11, 12, 13], "view": [1, 5, 6], "final": [1, 2, 5, 6, 10], "result": [1, 4, 6, 7, 8, 11, 13, 15], "last": [1, 5, 8, 11, 12, 13, 15], "least": [1, 2, 11, 14, 15], "open": [1, 2, 4, 5, 6, 9], "sourc": [1, 2, 3, 4, 6, 11], "bsd": 1, "v3": 1, "licens": 1, "hosted": 1, "means": [1, 3, 5, 6, 8, 11, 12, 14], "read": [1, 4, 5, 6, 7, 13, 15], "study": 1, "experiment": [1, 11], "yourself": [1, 11], "par\u00e1graf": [1, 9], "prelimin": 1, "\u00fate": [1, 6], "antes": [1, 6, 8, 9, 12, 13], "comec": [1, 2, 4, 6], "aprend": 1, "A": [1, 2, 4, 5, 7, 8, 10, 12, 13, 14, 15, 16], "fim": [1, 2, 5, 6], "compreend": [1, 13], "precis": [1, 2, 4, 5, 6, 13], "pel": [1, 4, 5, 6, 8, 9, 10, 12], "men": [1, 2, 5, 6], "conhec": [1, 6], "H\u00e1": [1, 5, 6, 13], "livr": [1, 6], "curs": 1, "dispon\u00edv": 1, "escolh": [1, 4, 6], "decor": [1, 4, 16], "marc": [1, 6, 9, 12], "total": [1, 6, 7], "following": [1, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "chapters": [1, 5], "will": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "start": [1, 2, 3, 4, 5, 6, 9, 11, 13], "coding": 1, "your": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "comput": 1, "suggest": [1, 11], "setup": [1, 3, 4, 12, 15], "workplac": 1, "plan": [1, 15], "efficiently": [1, 14], "safely": [1, 13], "even": [1, 4, 5, 6, 8, 9, 11, 13, 14], "running": [1, 2, 5], "exampl": [1, 2, 4, 5, 6, 8, 9, 10, 12, 16], "experimenting": 1, "littl": [1, 5, 6], "strongly": [1, 5, 11, 13], "integrated": 1, "programming": [1, 6, 8, 15], "experienc": [1, 12], "allowing": [1, 11], "checking": [1, 11, 12, 14], "linting": 1, "visual": 1, "debugging": [1, 4], "nowadays": 1, "two": [1, 2, 4, 5, 6, 8, 11, 13, 14, 15], "mult": [1, 2, 6, 14], "main": [1, 2, 3, 4, 6, 8, 13, 14, 15], "choic": [1, 11, 13], "studi": 1, "cod": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "aka": 1, "jetbrains": 1, "quand": [1, 4, 6, 8, 13], "vai": [1, 4, 6, 8], "lid": [1, 4, 5, 6, 13], "complex": [1, 2, 4, 5, 6, 8, 9, 12, 14, 15], "confiabil": 1, "necess": [1, 2, 4, 5, 6, 8], "suger": [1, 6], "usar": [1, 2, 4, 5, 6, 8, 9, 13], "ambient": [1, 2], "virtu": 1, "cham": [1, 2, 4, 5, 7, 8, 10, 13], "virtualenv": [1, 2], "vej": [1, 2, 3], "aqu": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "docs": [1, 2, 4], "org": [1, 2, 4, 7, 9, 15], "7": [1, 2, 7, 8, 11, 14], "venv": [1, 2], "__": [1, 2, 4], "introdu": [1, 2], "Em": [1, 2, 5, 6, 8, 9], "confus": [1, 6], "git": [1, 2], "keep": [1, 2, 4, 5, 6, 7, 8, 9, 11, 14], "track": [1, 14], "progr": [1, 2, 3, 9], "chang": [1, 2, 3, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16], "sav": [1, 5, 6, 10, 11], "saf": [1, 6, 11, 13, 14], "plac": [1, 5, 6, 8, 11, 13, 15], "gitlat": 1, "bitbucket": 1, "editor": [1, 8], "highlighting": [1, 8], "highly": [1, 13], "recommend": [1, 5], "quit": [1, 5, 7, 8, 11, 13], "run": [1, 3, 4, 6, 8, 12], "debug": [1, 2, 5, 6, 8], "just": [1, 2, 4, 5, 6, 7, 8, 11, 13, 15], "fold": [1, 2, 3, 4, 5, 6, 7, 10, 11, 13, 14], "add": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "args": [1, 2, 6], "your_full_path_to_py4web": 1, "py": [1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15], "launch": [1, 2], "configuration": 1, "windows": [1, 2, 4, 6], "paramet": [1, 2, 4, 5, 6, 12, 13, 15], "must": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 14], "forward": 1, "slash": [1, 4, 5, 12], "only": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "c": [1, 2, 3, 5, 6, 8, 9, 11, 14], "your_nam": [1, 15], "instead": [1, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "copy": [1, 3, 4, 6, 13], "standard": [1, 2, 3, 6, 7, 12, 13, 14, 15, 16], "insid": [1, 2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "renam": 1, "order": [1, 2, 4, 5, 6, 7, 9, 11, 13, 14], "avoid": [1, 2, 5, 6, 11], "errors": [1, 5, 6, 7, 11, 14], "lat": [1, 2, 4, 5, 6, 8, 9, 11, 13], "usr": 1, "bin": [1, 2], "env": [1, 14], "python3": [1, 2], "cor": [1, 2, 4, 5, 11], "cli": [1, 2], "both": [1, 5, 6, 8, 11, 14], "should": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "get": [1, 2, 4, 5, 6, 8, 11, 12, 13, 14, 15, 16], "gevent": [1, 2], "tru": [1, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "enabl": [1, 5, 7, 9, 12, 14, 15], "settings": [1, 4, 5, 6, 9, 12, 14], "build": [1, 2, 4, 5, 9, 13, 15], "execution": 1, "deployment": 1, "debugg": 1, "help": [1, 2, 5, 6, 7, 8, 9, 11, 13, 14], "support": [1, 2, 6, 11, 14], "efforts": 1, "participat": 1, "group": [1, 3, 5, 12, 14], "trying": [1, 12], "answer": 1, "submit": [1, 5, 6, 9, 11, 13], "bugs": 1, "pull": 1, "requests": [1, 4, 5, 14], "repository": [1, 2, 3], "Se": [1, 2, 3, 4, 6, 8, 9, 13], "desej": [1, 2, 5, 6, 12, 13], "corrig": 1, "ampli": 1, "traduz": [1, 6, 8, 10], "l\u00edngu": 1, "estrangeir": [1, 13], "ler": [1, 6], "tod": [1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 15], "inform": [1, 4, 5, 6, 11], "necess\u00e1r": [1, 5, 6], "diret": [1, 5, 6, 8], "readm": [1, 4, 11], "espec\u00edf": [1, 2, 6], "blob": [1, 6], "mast": [1, 2, 13], "md": [1, 4], "really": [1, 4], "rst": 1, "doc": 1, "brows": [1, 2, 3, 5, 7, 8, 13, 15], "once": [1, 2, 5, 6, 11, 12, 15], "pr": 1, "accepted": [1, 6, 11, 14, 15], "branch": [1, 2], "reflected": 1, "pag": [1, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16], "epub": 1, "next": [1, 5, 6, 8, 11], "output": [1, 5, 8, 11, 15], "generation": 1, "befor": [2, 5, 6, 8, 11, 12, 13], "everything": [2, 4, 14], "else": [2, 4, 6, 11, 12, 13, 14, 15], "imported": [2, 11, 12, 14], "charg": [2, 14], "starting": [2, 4, 6, 11], "reason": [2, 5, 6, 13, 14], "things": [2, 5, 6], "py4web": [2, 3, 4, 5, 7, 8, 9, 11, 12, 13], "download": 2, "pypi": 2, "github": [2, 3, 4, 6, 13], "folders": 2, "collections": 2, "want": [2, 4, 5, 6, 8, 11, 15], "command": [2, 4, 6, 8], "lin": [2, 4, 5, 7, 8, 9, 11, 12, 13, 15], "options": [2, 6, 7, 9, 12, 14, 15], "initializ": 2, "existing": [2, 5, 6, 11], "scaffolding": [2, 4, 5, 6, 8, 14, 15], "under": [2, 3, 4, 5, 6, 11], "concurrently": [2, 11], "served": [2, 6], "process": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "address": [2, 11, 12], "each": [2, 5, 6, 7, 8, 9, 11, 12, 13, 14], "runs": [2, 4, 12, 14], "fin": [2, 12, 13], "mac": [2, 6], "linux": 2, "prerequisit": [2, 5], "advanc": [2, 12, 13], "except": [2, 5, 6, 8, 9, 11, 12, 15], "binari": 2, "quatr": 2, "altern": [2, 6], "diferent": [2, 5, 6, 10, 13], "n\u00edv": 2, "dificuldad": 2, "olhar": 2, "pr\u00f3s": 2, "contr": [2, 6], "real": [2, 4, 7, 8, 11], "porqu": [2, 4, 5, 6, 8, 10], "acab": [2, 6], "copi": 2, "mont": [2, 12], "modific": [2, 4], "maneir": [2, 5, 6, 13], "da\u00ed": 2, "especial": [2, 4, 6, 10], "inic": [2, 4], "alun": 2, "direit": [2, 3, 6], "Por": [2, 3, 4, 5, 6, 9], "experimental": [2, 5], "cont": [2, 5, 9, 10, 12], "liber": 2, "idad": 2, "adicion": [2, 5, 10, 11, 12, 13], "us\u00e1": [2, 6, 8], "faz": [2, 5, 8, 9, 11, 12], "recent": [2, 3, 6, 11, 13], "reposit\u00f3ri": 2, "extern": 2, "nicozanf": 2, "pyinstall": 2, "descompact": 2, "past": [2, 4], "abrir": 2, "l\u00e1": [2, 4], "Com": [2, 6], "tip": [2, 4, 13], "lembr": [2, 3, 6, 8, 11], "sempr": [2, 6, 8], "vez": [2, 4, 5, 8, 9, 12, 13], "seguint": [2, 4, 5, 6, 8, 9, 10, 11, 12, 13], "document": [2, 6, 8, 9, 11, 15], "notic": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "correspond": [2, 4, 6, 10], "latest": [2, 6, 14], "stabl": 2, "although": [2, 8, 11], "best": [2, 5, 6], "up": [2, 5, 6, 8, 12, 15], "installation": 2, "procedur": 2, "quickly": [2, 11, 13], "install": [2, 6, 12], "releas": 2, "upgrad": [2, 6], "dir": [2, 11, 15], "user": [2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "try": [2, 5, 6, 8, 11, 12], "specify": [2, 4, 5, 6, 7, 11, 12, 13], "full": [2, 4, 6, 8, 11, 15], "8": [2, 6, 7, 11], "ir\u00e1": [2, 3, 4, 6, 8, 12, 13], "dependent": [2, 3, 4, 5], "caminh": [2, 4, 6, 13], "ativ": [2, 6], "cont\u00e9m": [2, 4, 5, 6], "cri": [2, 3, 5, 6, 8, 9, 12, 13, 16], "ap\u00f3s": [2, 6, 13], "trabalh": [2, 4, 6, 7], "aceit": [2, 6, 10, 11], "signif": [2, 5, 6, 7], "No": [2, 5, 6, 8, 13], "exe": 2, "apont": [2, 6], "digit": [2, 11, 12], "engan": 2, "indesej": [2, 6], "bom": 2, "h\u00e1bit": 2, "Este": [2, 6, 8, 9, 13, 14], "recurs": [2, 8, 16], "aind": [2, 6, 12], "moment": [2, 6], "descobert": [2, 10], "instructions": [2, 11], "activating": 2, "activat": [2, 12], "without": [2, 6, 8, 9, 15, 16], "traditional": 2, "way": [2, 3, 5, 6, 8, 9, 11, 12, 14], "works": [2, 8, 11, 12, 13, 14, 15], "normally": [2, 6, 8, 9, 11, 13], "utility": [2, 11], "path": [2, 4, 5, 6, 7, 10, 11, 13, 14, 15], "along": [2, 4, 9, 11, 15], "links": [2, 6, 13, 15], "clon": [2, 4, 6, 15], "cd": 2, "assets": 2, "test": [2, 6, 8, 9, 11, 13], "content": [2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "missing": [2, 12, 13], "manually": [2, 4, 6, 9, 12, 13], "upgraded": 2, "itself": [2, 6, 11, 15], "copied": 2, "useful": [2, 4, 8, 9, 11, 13, 15], "already": [2, 4, 5, 9, 11, 12, 13], "working": [2, 11], "locally": 2, "globally": [2, 6], "present": [2, 6, 8, 11, 12], "gain": 2, "potentially": 2, "untested": [2, 12], "go": [2, 4, 13], "given": [2, 5, 6, 8, 11], "then": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "r": [2, 6, 11], "tiv": [2, 6], "tant": [2, 6, 15], "observ": [2, 4, 6, 8], "forc": [2, 6, 7, 11, 12], "praz": 2, "programs": [2, 11], "executed": [2, 5, 6, 8, 14, 15], "ones": [2, 7, 11, 14], "don": [2, 4, 6, 8, 11, 12, 13, 14], "directly": [2, 4, 6, 7, 9, 11, 12, 13, 15], "usual": [2, 8, 9, 11], "atualiz": [2, 16], "automat": [2, 4, 6, 8, 9, 12, 13], "dashboard": [2, 4, 6, 8, 11, 16], "remov": [2, 4, 6, 9, 11, 12], "manual": [2, 3, 4, 6], "los": [2, 4, 6, 11], "precau\u00e7\u00e3": 2, "seguranc": [2, 5, 6, 9], "fez": [2, 6], "any": [2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "backup": [2, 6, 11], "personal": 2, "ve": [2, 3, 5, 8, 9, 11, 13, 15], "delet": [2, 4, 7, 11, 13, 15], "old": [2, 5, 11, 14], "again": [2, 4, 5, 6, 11, 15], "utiliz": [2, 3, 4, 5, 6, 9, 12, 13], "anterior": [2, 6], "produz": [2, 5, 6, 8, 9], "sa\u00edd": [2, 4, 6, 8, 9], "generally": [2, 5, 8], "nam": [2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "wit": 2, "nothing": [2, 5, 6, 11, 15], "prevents": [2, 5, 15], "grouping": 2, "expects": [2, 9], "_dashboard": [2, 3], "default": [2, 3, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "_default": [2, 4], "installs": 2, "Ele": [2, 3, 5, 6, 9], "descrit": [2, 4, 6, 13], "pr\u00f3xim": [2, 6], "cap\u00edtul": [2, 4, 5, 14], "nad": [2, 4, 6], "boas": 2, "vind": 2, "t\u00eam": [2, 4, 6, 12], "papel": 2, "portant": [2, 4, 5, 6, 9], "nom": [2, 4, 5, 7, 9, 11, 12, 13], "_": [2, 11, 15], "Uma": [2, 4, 6, 8, 9], "send": [2, 6, 11, 12], "urls": [2, 11, 14], "localhost": [2, 4, 5, 6, 11], "8000": [2, 3, 4, 11, 13], "yourappnam": 2, "stop": 2, "acert": 2, "kbd": 2, "control": [2, 8, 11, 12, 13, 15], "janel": 2, "onde": [2, 6, 7, 8, 11], "soment": [2, 4, 6, 8], "appnam": [2, 5, 12, 14], "prefix": [2, 4, 6, 7, 8, 11, 14], "quer": [2, 4, 5, 6, 9], "lig": [2, 5, 6, 9], "simbol": 2, "trailing": [2, 11], "optional": [2, 4, 5, 6, 7, 8, 11, 12, 13, 14], "ctrl": [2, 3], "break": [2, 6], "fn": 2, "paus": 2, "v\u00e1r": [2, 4, 5, 6], "argument": [2, 4, 5, 6, 8, 9, 11, 12], "ter": [2, 4, 5, 6, 9], "adicional": [2, 5, 6], "h": [2, 11], "usag": [2, 3, 4, 5, 6, 9, 11, 12, 13], "apps_fold": 2, "func": [2, 5], "function": [2, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15], "y": [2, 9, 11], "yes": [2, 6], "prompt": [2, 4, 6], "assum": [2, 5, 6, 7, 10], "fals": [2, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "text": [2, 5, 6, 8, 9, 13, 15], "arguments": [2, 5, 6, 8, 9, 11, 12, 14], "passed": [2, 4, 5, 6, 9, 11, 12, 13, 15], "show": [2, 5, 6], "messag": [2, 4, 5, 7, 8, 11, 13, 14, 15], "exit": 2, "myfunction": 2, "x": [2, 6, 8, 9, 11, 13], "100": [2, 6, 7, 8, 11], "singl": [2, 5, 6, 7, 8, 11, 12, 13], "doubl": [2, 6, 8], "quot": [2, 9], "shown": [2, 6, 11, 12], "parameters": [2, 6], "app_nam": [2, 4, 5, 6], "copying": [2, 8, 9, 16], "scaffold_zip": 2, "erro": [2, 3, 6], "orig": [2, 10], "host": [2, 5, 11, 12], "127": [2, 3, 5, 11, 13], "0": [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "1": [2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15], "p": [2, 8, 11], "integ": [2, 6, 7, 9, 11, 15], "numb": [2, 5, 6, 8, 11], "password_fil": 2, "encrypted": [2, 5], "password": [2, 6, 8, 11, 12, 14, 15], "wsgiref": 2, "gunicorn": 2, "waitress": 2, "geventwebsocketserv": 2, "wsgirefthreadingserv": 2, "rocketserv": 2, "w": [2, 4, 5, 6], "number_workers": 2, "workers": 2, "d": [2, 7, 9, 11], "dashboard_mod": 2, "mod": [2, 4, 5, 6, 11, 12], "readonly": [2, 11, 15], "non": [2, 4, 5, 6, 7, 9, 11, 13, 14, 15], "watch": [2, 3, 16], "sync": [2, 6], "lazy": [2, 4, 6], "reload": [2, 3, 4, 5, 11], "automatically": [2, 3, 4, 5, 6, 11, 12, 13, 14, 15], "ssl_cert": 2, "ssl": 2, "certificat": 2, "ssl_key": 2, "key": [2, 4, 5, 6, 7, 9, 11, 12, 16], "errorlog": 2, "error": [2, 3, 5, 6, 7, 8, 9, 11, 15], "logs": [2, 5, 6], "stdout": 2, "stderr": 2, "tickets_only": 2, "filenam": [2, 4, 5, 6, 11], "l": [2, 11], "logging_level": 2, "level": [2, 6, 7, 11, 12], "50": [2, 7], "30": [2, 6, 8, 11], "warning": [2, 5], "switch": [2, 5, 6], "application": [2, 5, 6, 8, 12, 14, 15], "upon": [2, 12, 14], "reloading": [2, 4, 5], "occur": [2, 11, 15], "incoming": 2, "changed": [2, 3, 4, 5, 6, 8, 11, 14, 15], "pref": [2, 15], "immediat": 2, "production": [2, 4], "servers": [2, 6], "unneded": 2, "checks": [2, 6, 8, 11, 12], "restart": [2, 4, 5, 6, 13], "directiv": [2, 8, 11], "looks": [2, 6, 11], "occurring": 2, "modifications": 2, "requir": [2, 5, 6, 11, 12], "used": [2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "currently": [2, 5, 8], "behaviour": [2, 11, 13], "option": [2, 3, 5, 6, 11, 12, 15], "rocket3": [2, 14], "threaded": [2, 14], "stripped": [2, 14], "python2": [2, 14], "logic": [2, 4, 5, 12, 14], "valu": [2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15], "defined": [2, 4, 5, 6, 8, 11, 12, 13, 14, 15], "logging": [2, 12], "corresponds": [2, 6, 9], "common": [2, 4, 5, 8, 11, 12, 14, 15], "notset": 2, "10": [2, 6, 7, 8, 9, 10, 11, 12, 15], "20": [2, 7, 10, 11], "info": [2, 4, 5, 12], "40": [2, 9, 15], "critical": 2, "telling": [2, 12], "library": [2, 6, 10, 11, 14, 15], "handl": [2, 4, 5, 6, 14, 15], "events": [2, 15], "sets": [2, 5, 6, 11], "calls": [2, 6, 8, 15], "functions": [2, 5, 9, 15], "found": [2, 11], "invalid": [2, 6, 11], "saved": [2, 5, 6, 11], "administrator": 2, "asked": 2, "cad": [2, 4, 5, 8, 10, 13], "ped": [2, 4, 5, 6, 13], "uso": [2, 5, 13], "Isso": [2, 4, 6], "chat": 2, "pdkdf2": 2, "hash": [2, 6, 11], "vou": 2, "exclu\u00edd": [2, 6], "my_password_fil": 2, "depo": [2, 3, 6], "reutiliz": [2, 6], "temp": [2, 8], "execu": [2, 4], "validators": [2, 14], "crypt": 2, "writ": [2, 4, 5, 6, 8], "str": [2, 5, 6, 9, 14, 15], "input": [2, 5, 6, 8, 11, 15], "reinstall": 2, "reinstal": 2, "necess\u00e1ri": [2, 4, 5, 6], "confirm": [2, 11, 13], "cria\u00e7\u00e3": [2, 6, 13], "segu": [2, 4, 5, 6, 8], "atual": [2, 6], "existent": [2, 6, 12, 13], "parent": [2, 6, 8, 15], "O": [2, 8, 9, 11, 12, 16], "apen": [2, 5, 6, 7], "pesquis": [2, 3, 6, 13], "ent\u00e3": [2, 4, 6, 12], "exempl": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "conch": 2, "pud": 2, "myapp": [2, 4], "db": [2, 3, 4, 5, 7, 9, 11, 12, 13, 14, 15], "translator": [2, 10, 16], "dal": [2, 4, 7, 11, 13, 15, 16], "field": [2, 4, 5, 7, 12, 13, 14, 15, 16], "utils": [2, 4, 5, 8, 9, 11, 12, 13, 14, 16], "versions": [2, 5, 11], "too": [2, 5, 6, 11, 15], "cannot": [2, 5, 6, 8, 11, 15], "generic": [2, 4, 5, 6, 11], "described": [2, 4, 5, 6, 11], "called": [2, 5, 6, 7, 8, 9, 11, 13, 14, 15], "deployment_tools": 2, "collects": 2, "recip": 2, "they": [2, 4, 5, 6, 7, 8, 11, 12, 14, 15], "briefly": 2, "tips": [2, 13], "tricks": 2, "thes": [2, 4, 5, 6, 8, 9, 11, 13, 15], "steps": 2, "generat": [2, 6, 8, 9, 11, 12, 13, 14, 15], "followed": [2, 5, 11], "www": [2, 8, 9, 13], "section": [2, 4, 6, 8, 11, 12], "io": [2, 6], "engineering": 2, "education": 2, "securely": 2, "vscod": 2, "may": [2, 4, 5, 6, 8, 9, 11, 14, 15], "updat": [2, 5, 11, 13, 14, 15], "contain": [2, 4, 5, 6, 8, 9, 11, 12, 15], "configurations": 2, "type": [2, 5, 7, 8, 9, 12, 15], "workspacefold": 2, "path_t": 2, "crt": [2, 6], "absolut": [2, 6, 14], "location": [2, 4, 6, 8, 14], "so": [2, 5, 6, 8, 9, 11, 13, 14, 15], "feasibl": [2, 11], "simply": [2, 4, 5, 6, 8, 15], "py4web_wsg": 2, "4": [2, 5, 6, 7, 8, 11, 13], "tak": [2, 3, 5, 6, 8, 11, 12, 13, 15], "consol": [2, 9, 12, 15], "obtain": [2, 12, 15], "id": [2, 5, 7, 8, 9, 11, 12, 13, 14, 15], "project_nam": 2, "mkdir": [2, 4, 7, 11, 13], "supond": [2, 6], "cp": 2, "development_tools": 2, "talvez": [2, 5], "__init": 2, "vazi": [2, 6], "ver": [2, 6, 12], "makefil": 2, "__init__": [2, 4, 5, 6, 7, 11, 13, 14, 15], "lib": 2, "yaml": 2, "sdk": 2, "config": [2, 4], "email": [2, 8, 11, 12, 14], "mail": [2, 3, 5, 11, 12], "obtid": [2, 6], "agor": [2, 4, 5, 6, 8], "bast": 2, "deploy": 2, "atend": [2, 6], "youtub": [2, 6], "follow": [2, 4, 7, 12, 13, 14], "detailed": [2, 13], "bottle_app": 2, "script": [2, 5, 8, 15], "dockerfil": 2, "compos": 2, "yml": 2, "setting": [2, 4, 5, 6, 11, 13], "postgresql": [2, 6], "advantag": [2, 6, 8, 15], "requiring": [2, 14], "sud": [2, 12], "background": [2, 4, 11, 15], "daemon": 2, "bash": 2, "04": 2, "03": [2, 6, 7], "lts": 2, "nginx": 2, "self": [2, 5, 6, 9, 11, 13, 15], "signed": [2, 5, 11], "manag": [2, 3, 4, 5, 6, 12], "iptabl": 2, "surely": [3, 4], "extensively": 3, "check": [3, 4, 5, 6, 11, 12, 13], "looking": 3, "good": [3, 11], "exploring": 3, "listening": 3, "tcp": 3, "local": [3, 5, 8, 11, 12, 13], "pc": 3, "protocol": 3, "connect": [3, 6], "firefox": [3, 15], "chrom": [3, 15], "bot\u00f5": [3, 16], "describ": [3, 11], "chapt": [3, 4, 5, 6, 8, 9, 11, 13], "documentation": [3, 11, 15], "20201112": 3, "browsing": 3, "pointing": [3, 8], "discuss": 3, "forum": 3, "pression": 3, "bot\u00e3": 3, "transmit": 3, "inser": [3, 8], "ref": [3, 5, 6, 9, 11, 16], "comando": [3, 4, 6, 9, 16], "set_password": 3, "configur": [3, 12, 13, 14, 16], "exib": [3, 6, 8, 9, 13], "abas": 3, "comprim": 3, "cliqu": [3, 13], "t\u00edtul": [3, 9, 13], "gui": 3, "expand": 3, "As": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], "context": [3, 5, 6, 8], "aba": 3, "instal": [3, 6, 12, 16], "selecion": [3, 6], "rot": [3, 13], "tab": [3, 5, 11], "allows": [3, 4, 5, 6, 7, 8, 11, 12, 13, 15], "contains": [3, 5, 7, 8, 10, 11, 13, 14, 15], "selected": [3, 4, 7, 9, 11, 15], "compris": 3, "reloaded": [3, 4, 15], "unless": [3, 5, 6, 8, 11], "op\u00e7\u00e3": [3, 4, 6, 8, 9], "click": [3, 9, 11, 13, 15], "effect": [3, 6, 11], "fails": [3, 11], "load": [3, 5, 15], "corresponding": [3, 6, 11, 12, 13, 14], "button": [3, 4, 5, 11, 13, 15], "displayed": [3, 6, 9, 11, 13, 15], "realiz": [3, 4, 5, 6], "busc": [3, 6, 13], "crud": [3, 11, 15], "visit": [3, 5, 11], "desencad": 3, "emit": [3, 6], "registr": [3, 4, 11, 12, 13], "edi\u00e7\u00f5": 3, "comuns": 3, "filesyst": [4, 5, 6], "going": [4, 15], "own": [4, 5, 6, 8, 11, 12, 13, 14, 15], "mind": [4, 6, 7, 8, 11], "therefor": [4, 5, 8, 11, 14], "empty": [4, 11, 15], "strictly": [4, 15], "needed": [4, 5, 6, 9, 11, 12, 15], "enter": [4, 11, 12], "commands": [4, 6, 8, 9], "echo": 4, "backslash": 4, "i": [4, 5, 6, 7, 8, 11, 12, 15], "press": [4, 13], "recogniz": 4, "automatic": [4, 6, 8, 14], "whenev": 4, "required": [4, 5, 6, 7, 11, 15], "anything": 4, "arbitrary": [4, 12], "access": [4, 5, 9, 12, 14, 15], "typically": [4, 8], "expos": [4, 5], "dynamic": [4, 8, 12], "expor": [4, 12], "simples": [4, 6, 10], "subpast": 4, "public": 4, "hell": [4, 5, 6, 8, 9, 11, 12, 15], "world": [4, 5, 6, 8, 9, 11], "rec\u00e9m": [4, 6, 10], "sob": [4, 6], "internally": [4, 5, 6, 13], "supports": [4, 5, 8, 9, 11, 15], "streaming": [4, 14], "partial": [4, 6, 14], "rang": [4, 6, 8, 12, 14], "modified": [4, 11, 14], "handled": [4, 5, 11, 15], "headers": [4, 8, 15], "fun\u00e7\u00e3": [4, 6, 8, 9], "conte\u00fad": [4, 6, 9], "novaaplicaca": 4, "init": [4, 13], "seg": 4, "datetim": [4, 5, 6, 7, 11, 15], "action": [4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "def": [4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "return": [4, 5, 6, 7, 9, 11, 12, 13, 15], "accessibl": 4, "\u00edndic": 4, "opcional": [4, 6, 9, 11], "Ao": [4, 6, 8, 13], "estrutur": [4, 5, 6, 10], "c\u00f3dig": [4, 5, 6, 8, 9], "ocorr": [4, 6, 8], "v\u00e1ri": [4, 5, 6, 10], "fun\u00e7\u00f5": [4, 8], "prepends": 4, "sej": [4, 6], "url": [4, 5, 7, 8, 11, 12, 13, 14, 15], "a\u00e7\u00e3": [4, 5, 6, 12, 16], "anteced": 4, "ambigu": [4, 6], "exce\u00e7\u00e3": [4, 5, 6, 8], "link": [4, 7, 8, 9, 11, 12, 13], "simb\u00f3l": 4, "actions": [4, 5, 6, 13, 14, 16], "string": [4, 5, 6, 7, 9, 10, 11, 13], "dictionary": [4, 5, 6, 9, 11, 14], "tell": [4, 12, 15], "what": [4, 5, 6, 8, 11, 12, 14, 15], "serializ": [4, 6, 8, 9], "end": [4, 6, 8, 11, 12, 13, 15], "colors": [4, 6], "blu": [4, 6, 11, 14], "green": [4, 6, 14], "vis\u00edvel": 4, "vermelh": 4, "azul": 4, "verd": 4, "conven\u00e7\u00e3": 4, "transform": [4, 5, 6, 11, 15], "inteir": [4, 6], "tard": [4, 6], "irem": [4, 5], "brev": 4, "poss\u00edvel": [4, 6], "map": [4, 6, 9, 10], "padr\u00f5": [4, 6, 9], "color": [4, 6, 8, 9, 11, 15], "picked": 4, "unknown": 4, "sintax": [4, 6, 9, 12, 16], "garraf": 4, "bottlepy": [4, 5], "wildcard": 4, "filt": [4, 7, 11, 13], "possibl": [4, 5, 6, 8, 11, 13, 14], "filters": [4, 11], "int": [4, 6, 11, 14], "d\u00edgit": [4, 6], "assinatur": [4, 5], "convert": [4, 6, 9], "n\u00famer": [4, 6, 10, 13], "float": [4, 11], "decim": 4, "personagens": [4, 6], "caracter": 4, "barr": 4, "gananc": 4, "combin": [4, 5, 9, 13], "segment": 4, "exp": [4, 6], "expression": [4, 6, 8, 10, 11, 13], "matched": [4, 7, 9, 11], "harmoniz": 4, "car\u00e1ct": [4, 6], "universal": [4, 6, 9], "pass": [4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "vari\u00e1vel": [4, 6, 9, 10], "especific": [4, 5, 6], "al\u00e9m": [4, 6, 13], "diss": [4, 6, 13], "ac\u00e7\u00e3": [4, 5, 6, 7], "method": [4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "m\u00e9tod": [4, 5, 6, 8, 13], "post": [4, 6, 7, 9, 11, 12, 13, 14, 15], "paint": [4, 11], "query": [4, 5, 7, 9, 11, 13, 14, 15], "painting": 4, "equivalent": [4, 5, 6, 9, 11, 14], "additional": [4, 5, 7, 8, 11, 13], "attribut": [4, 5, 6, 9, 11, 13, 14, 15], "identify": 4, "decl": [4, 6], "head": [4, 5, 6, 8, 13, 15], "style": [4, 6, 8, 11, 15, 16], "body": [4, 8, 12, 13, 15], "h1": [4, 8], "tint": 4, "dict": [4, 5, 6, 10, 11, 13, 14, 15], "fund": 4, "correspondent": [4, 6, 9], "ingredient": 4, "chav": [4, 8, 9, 10, 13], "lumin\u00e1r": 4, "disposit": [4, 5, 12], "el\u00e9tr": [4, 5, 12], "comport": [4, 6, 9, 13], "inicializ": [4, 5], "filtrag": [4, 13], "entrad": [4, 6, 9, 10], "depend": [4, 5, 6], "\u00e2mbit": 4, "encaix": 4, "\u00e1rvor": 4, "explic": [4, 6], "acess\u00f3ri": 4, "especif": [4, 6], "dand": 4, "Esse": 4, "estar": [4, 6, 9], "localiz": 4, "diret\u00f3ri": 4, "ser\u00e3": [4, 6, 9], "cord": [4, 6, 10], "facil": [4, 5, 6], "linguagens": 4, "diz": [4, 6, 12, 13], "obter": [4, 6], "conex\u00e3": 4, "part": [4, 9, 14], "piscin": [4, 6], "compromet": [4, 6], "sucess": [4, 6], "revers\u00e3": 4, "falh": 4, "sess\u00e3": [4, 16], "analis": [4, 6, 10], "recuper": [4, 6], "salv": [4, 6, 10], "tradutor": 4, "cabe\u00e7alh": [4, 9], "accept": [4, 5, 11, 15], "determin": [4, 5, 6, 10, 11, 12, 13], "\u00f3ptim": 4, "regr": [4, 5], "liga\u00e7\u00e3": [4, 5, 6], "ambos": [4, 5, 6], "trat": [4, 6], "writing": [4, 6, 14], "scratch": 4, "san": 4, "conventions": [4, 6], "outlined": [4, 5], "putting": 4, "organized": 4, "properly": 4, "pre": [4, 5, 13], "shows": [4, 8, 11, 12], "registration": [4, 11], "building": [4, 11, 15], "construction": 4, "giv": [4, 5, 6, 8, 11, 12], "kind": 4, "normal": [4, 5, 6, 8, 11, 13, 15], "encontr": [4, 6, 8, 10, 12], "andaim": 4, "la": [4, 6], "usand": [4, 5, 8, 9, 12, 16], "imports": 4, "controllers": [4, 6, 8, 9, 11, 14, 15], "metadat": [4, 6], "models": [4, 6, 7, 13, 14], "tabl": [4, 5, 7, 11, 12, 13, 14, 15, 16], "settings_privat": 4, "privat": [4, 5, 11], "ship": 4, "bulm": [4, 11, 13, 15], "agnostic": 4, "favicon": 4, "ico": 4, "replac": [4, 6, 8, 9, 13, 15], "tasks": [4, 6], "etc": [4, 5, 6, 7, 10, 14], "general": [4, 5, 6, 11, 12], "layout": [4, 11, 12, 13, 14, 15, 16], "translations": [4, 5, 10, 15], "internationalization": [4, 5, 11, 14], "pluralization": [4, 14], "italian": [4, 5, 10], "respons": [4, 5, 6, 8, 14, 15, 16], "abort": [4, 6], "redirect": [4, 5, 11, 12, 13, 15], "helpers": [4, 6, 8, 11, 13, 14, 16], "welcom": [4, 5, 8, 14, 15], "get_us": [4, 5, 12, 14], "first_nam": [4, 5, 12, 13], "format": [4, 5, 7, 9, 10, 12, 13], "hom\u00f3log": 4, "div": [4, 5, 8, 11, 14, 15], "span": [4, 14], "img": 4, "indic": [4, 6], "esper": [4, 5, 6], "v\u00e1l": 4, "redirecion": [4, 12, 13], "provavel": [4, 5, 6], "mud": [4, 5, 6], "agn\u00f3st": 4, "algum": [4, 6, 9], "exce\u00e7\u00f5": 4, "quis": [4, 6], "scaffold": [4, 15], "lot": [4, 6], "point": [4, 5, 6, 11, 14, 15], "testing": [4, 6], "developing": 4, "whol": [4, 11], "anoth": [4, 5, 6, 8, 11], "my_app": 4, "loaded": [4, 8, 13, 15], "select": [4, 7, 10, 11, 12, 13, 14, 15, 16], "upload": [4, 6], "upper": [4, 5, 11], "finally": [4, 13], "facilitat": 4, "reloads": [4, 5], "fact": [4, 5, 14], "watched": 4, "app_watch_handl": 4, "decorator": [4, 5, 6, 14], "reported": 4, "worry": 4, "fully": [4, 5, 6, 11], "assist": 4, "sass": 4, "compil": [4, 8, 9, 11], "libsass": 4, "static_dev": 4, "overrid": [4, 6, 8, 12, 13, 14, 15], "sass_compil": 4, "changed_fil": 4, "print": [4, 6, 9, 10, 12, 14], "abov": [4, 5, 6, 7, 8, 11, 13], "compiled_css": 4, "filep": 4, "include_paths": 4, "includ": [4, 6, 7, 9, 13, 15], "output_styl": 4, "compressed": 4, "dest": [4, 6, 11], "join": [4, 5, 7, 11, 13, 14], "compiled": [4, 8, 9, 11], "valid": [4, 6, 9, 14, 16], "esprim": 4, "implementation": [4, 8, 11, 14], "nod": 4, "dbadmin": 4, "validate_js": 4, "cf": 4, "validation": [4, 7, 8, 13], "abspath": 4, "parsemodul": 4, "filepaths": 4, "relativ": [4, 14], "ignored": [4, 8, 9, 13, 15], "exceptions": [4, 5, 15], "handlers": 4, "printed": 4, "terminal": 4, "Um": 5, "pec": [5, 6], "equip": 5, "mobili\u00e1ri": 5, "fix": [5, 6], "posi\u00e7\u00e3": [5, 9], "edif\u00edci": 5, "ve\u00edcul": 5, "algo": [5, 6, 7, 8], "respost": [5, 8], "processing": [5, 6, 8, 11, 15], "operations": [5, 6], "perform": [5, 6, 11, 12], "pars": [5, 6, 11, 12], "look": [5, 6, 7, 11, 12], "information": [5, 6, 7, 11, 12, 14, 16], "commit": [5, 7, 13], "transaction": [5, 6], "preferred": [5, 6], "lookup": [5, 7], "prop": [5, 6, 13], "pick": [5, 12], "connection": [5, 6, 11], "pool": 5, "after": [5, 6, 8, 11, 12, 13], "back": [5, 6, 11], "mecan": [5, 6, 8], "ignor": [5, 6, 8, 11, 13], "eficient": [5, 6], "reduz": 5, "clich": 5, "middlewar": 5, "wsgi": 5, "plug": 5, "excet": [5, 6], "a\u00e7\u00f5": 5, "uns": 5, "signing": 5, "explained": [5, 6, 11, 13], "connections": [5, 6, 14], "authentication": [5, 13, 16], "develop": [5, 6, 8, 12, 13, 14], "paragraph": [5, 9, 11, 13], "previous": [5, 8, 9, 11, 15], "decorators": [5, 14], "applied": [5, 11, 13, 15], "knows": 5, "depends": [5, 6, 14], "exception": [5, 6, 11, 12], "otherwis": [5, 6, 8, 11, 12, 13], "various": 5, "delimiters": [5, 14], "retorn": [5, 8, 9], "posterior": 5, "jinja2": 5, "comum": [5, 6], "pouc": [5, 6], "a\u00e7\u00fac": 5, "sint\u00e1t": 5, "duas": [5, 6], "linh": [5, 6, 8, 9, 13, 16], "cached": 5, "ram": [5, 6], "right": [5, 6, 8], "careful": [5, 6, 8, 14, 15], "documentations": 5, "exactly": 5, "opposit": 5, "early": 5, "february": 5, "2022": 5, "extend": [5, 6, 12, 14, 15], "passing": [5, 6, 9], "implications": 5, "avoiding": [5, 11], "clean": [5, 9], "able": [5, 6, 11], "variabl": [5, 6, 9, 11, 13, 15], "my_var": [5, 9], "t_fold": 5, "dirnam": [5, 7, 11, 13], "__file__": [5, 7, 11, 13], "translated": [5, 8, 11], "specified": [5, 6, 8, 9, 11, 12, 13, 14, 15], "match": [5, 6, 8, 9, 10, 11], "class": [5, 6, 8, 9, 11, 12, 14, 15], "implement": [5, 6, 8, 12], "contador": [5, 6], "dbstor": 5, "memory": [5, 6], "storag": [5, 6, 7, 11, 13], "count": [5, 7, 12, 13, 15], "n": [5, 6, 10, 15], "tradu\u00e7\u00e3": [5, 16], "tradu\u00e7\u00f5": [5, 10], "en": [5, 7], "2": [5, 6, 7, 8, 9, 10, 11, 12, 14, 15], "twic": [5, 6], "6": [5, 6, 7, 11, 12, 14], "5": [5, 6, 7, 8, 10, 11, 12, 13, 15], "visiting": [5, 12], "preferenc": 5, "english": 5, "tent": [5, 6], "ti": 5, "ho": 5, "mai": 5, "vist": [5, 6, 9], "prim": [5, 11], "gia": 5, "volt": [5, 6], "piu": 5, "display": [5, 11, 12, 13, 15], "alerts": [5, 8, 14], "displaying": [5, 11, 13], "stat": [5, 7, 14, 15], "preserved": 5, "redirection": [5, 14], "dismissibl": 5, "auxili": [5, 6, 8, 9], "del": [5, 6, 9], "_class": [5, 9, 11, 15], "sanitiz": [5, 9, 14], "src": [5, 6, 8, 9, 15], "globals": [5, 6, 8, 12, 14], "xml": [5, 8, 11, 14, 15], "returned": [5, 6, 7, 8, 9, 11, 15], "triggers": 5, "position": 5, "convenienc": 5, "injected": [5, 8, 9, 11], "redirected": [5, 15], "remembered": 5, "achieved": [5, 14], "asking": 5, "temporarily": 5, "sent": [5, 6, 12, 15], "returning": 5, "overwritten": [5, 14], "mensagens": [5, 6], "defaults": [5, 11, 13, 14], "alert": [5, 8, 9, 11, 14], "success": [5, 7, 15], "hardcod": 5, "thos": [5, 6, 8, 9, 12, 14, 15], "basic": [5, 16], "speaking": 5, "desired": [5, 11], "persist": 5, "throughout": 5, "interaction": 5, "words": [5, 13], "rend": [5, 6, 11, 13, 14, 15], "stateless": [5, 15], "stateful": 5, "secret": [5, 12], "my": [5, 8, 9, 11, 12, 15], "increased": 5, "opening": 5, "updated": [5, 6, 11], "closing": [5, 6], "reopening": 5, "window": [5, 8, 11], "related": [5, 6], "usernam": [5, 6, 12], "visited": [5, 8], "shopping": 5, "cart": 5, "jwt": 5, "specifically": [5, 6, 11, 15], "token": [5, 11], "stor": [5, 6, 12], "serialized": [5, 6, 9, 11], "__str__": [5, 8, 9], "operator": [5, 6, 11], "lost": [5, 14], "composing": 5, "still": [5, 6, 9, 11, 13, 14], "minimal": [5, 13, 16], "identifying": [5, 11], "clients": 5, "sess\u00f5": 5, "nunc": [5, 6], "expir": 5, "contenh": 5, "hist\u00f3r": [5, 6], "par\u00e2metr": [5, 13], "expiration": 5, "3600": [5, 6], "algorithm": [5, 11], "hs256": 5, "same_sit": 5, "lax": 5, "_sesson": 5, "passphras": 5, "sign": [5, 8, 12], "maximum": [5, 11], "lifetim": 5, "seconds": [5, 11], "timeout": 5, "signatur": [5, 6, 7, 9, 11], "alternat": [5, 15], "csrf": [5, 11], "attacks": [5, 9], "cross": [5, 9], "forgery": 5, "enabled": [5, 7, 12, 14], "provided": [5, 6, 8, 9, 11, 13], "uuid": [5, 6], "why": [5, 8, 14], "appname_session": 5, "encoded": [5, 6, 11, 15], "preventing": 5, "tampering": [5, 6], "trivial": [5, 6], "communications": 5, "disk": [5, 6], "sensitiv": [5, 11], "invalidated": 5, "vic": 5, "vers": 5, "small": [5, 11], "siz": [5, 8, 11], "limit": [5, 6, 7, 11, 12], "kbytes": 5, "being": [5, 6, 7, 8, 11, 15], "put": [5, 7, 11, 15], "configured": [5, 11, 14], "conn": 5, "11211": 5, "6379": 5, "lambd": [5, 6, 9, 11, 13, 15], "k": [5, 8, 14], "v": [5, 9, 11, 15], "cs": 5, "ct": 5, "ttl": 5, "avis": [5, 6, 12], "rem": 5, "macac": 5, "multiprocess": 5, "quirk": 5, "deterministic": 5, "unsaf": [5, 9], "tud": [5, 6], "imagin": [5, 6, 8, 15], "fsstorag": 5, "exists": [5, 6, 11], "fp": 5, "dump": 5, "tmp": [5, 6], "leav": [5, 6], "exercis": 5, "per": [5, 7], "subfolders": [5, 6], "locking": 5, "storing": 5, "inefficient": 5, "scal": [5, 8], "app1": 5, "app2": 5, "wants": 5, "shar": [5, 6, 14], "assuming": 5, "sessons": 5, "session_secret_key": 5, "app1_session": 5, "tells": [5, 15], "sur": [5, 11, 15], "shared": 5, "between": [5, 9, 11, 14], "consistent": 5, "session_app1": 5, "restrict": [5, 7, 11, 15], "enforc": [5, 11], "workflow": [5, 16], "step1": 5, "step_completed": 5, "_href": [5, 8, 9, 11, 13], "step2": 5, "locals": [5, 14], "step3": 5, "on_request": 5, "evaluat": [5, 11, 15], "listed": [5, 11, 15], "rais": [5, 11, 14], "404": [5, 11], "cond": 5, "400": [5, 14], "raised": 5, "on_fals": 5, "13": [5, 6, 11], "giving": 5, "memberships": 5, "specific": [5, 6, 8, 9, 11, 12, 14, 15], "auth_us": [5, 6, 12], "requires_membership": 5, "group_nam": [5, 12], "user_id": [5, 6, 14], "payroll": 5, "employ": 5, "permission": [5, 12], "typical": [5, 6, 11], "follows": [5, 6, 11], "url_sign": 5, "somepath": 5, "controll": [5, 6, 8, 9, 11, 12, 13, 14, 15], "signs": 5, "signed_url": 5, "anotherpath": 5, "verify": 5, "verified": [5, 11], "usou": [5, 6], "queir": 5, "abstraction": [5, 14, 16], "lay": [5, 14, 16], "documented": [5, 11], "pleas": [5, 6], "rememb": [5, 6], "doesn": 5, "db_fold": [5, 7, 11, 13], "pool_siz": [5, 6], "define_tabl": [5, 7, 11, 12, 13, 14], "visit_log": 5, "client_ip": 5, "timestamp": [5, 7, 15], "environ": [5, 14], "remote_addr": [5, 12], "insert": [5, 7, 8, 11, 12, 13, 15], "utcnow": [5, 6], "picks": 5, "wrapped": 5, "commits": [5, 6], "on_success": 5, "rolls": 5, "on_error": 5, "rol": [5, 9], "construtor": [5, 9, 11, 16], "tabel": [5, 9, 12, 13, 14], "camp": [5, 7, 9, 11, 16], "last_nam": [5, 12, 13], "sso_id": [5, 12], "action_token": [5, 12], "\u00faltim": [5, 6, 12], "intern": [5, 6], "registers": 5, "including": [5, 11, 13, 14, 15], "presenc": [5, 6], "_scaffold": [5, 8, 9, 11, 12, 13, 14, 16], "returns": [5, 6, 7, 9, 11, 12, 14, 15], "logged": [5, 8, 12, 14], "redirects": [5, 12], "desd": [5, 6], "verific": [5, 6, 12], "plugin": [5, 11, 12, 13, 15], "methods": [5, 7, 9, 11, 12, 13, 16], "authorization": [5, 16], "compartilh": [5, 6], "permiss\u00e3": [5, 6, 12], "estad": [5, 6], "threads": [5, 6], "atribut": [5, 9], "thing": [5, 6, 14], "writabl": [5, 6, 11, 14], "readabl": [5, 6, 13, 14], "espec": [5, 6, 9], "threadsafevariabl": 5, "Esses": [5, 6], "parec": [5, 6], "rosc": 5, "loc": 5, "est\u00e3": [5, 6, 7, 9, 12], "valor": [5, 9, 10, 11, 13], "m\u00ednim": [5, 6], "myfixtur": 5, "transforms": 5, "determining": 5, "eventually": 5, "accessing": [5, 6], "inner": [5, 15], "layers": 5, "coming": 5, "calling": [5, 6, 8], "b": [5, 6, 8, 9, 11, 14, 15], "circumstanc": 5, "think": [5, 8, 13, 15], "onion": 5, "cent": [5, 6, 8], "entering": 5, "exiting": 5, "processed": [5, 6, 8, 11], "previously": [5, 6, 11], "current": [5, 6, 9, 12, 13, 14, 15], "uppercas": [5, 11], "upper_cas": 5, "tracebacks": 5, "logerrors": 5, "stre": [5, 6], "errlog": 5, "myerrors": 5, "__prerequisite__": 5, "appended": [5, 6], "__prerequisites__": 5, "guarant": 5, "singleton": [5, 14], "declared": 5, "considered": [5, 6, 8, 14], "httrespons": 5, "whil": [5, 6, 7, 11, 12, 14], "actual": [5, 6, 8, 12, 13], "complicated": 5, "individual": [5, 6, 7, 8, 11], "know": [5, 13], "wheth": [5, 6, 11, 12, 14], "keeps": [5, 13], "easy": [5, 8, 11], "communicat": 5, "retriev": [5, 6, 15], "stated": 5, "mandatory": [5, 8], "consid": [5, 8, 9, 11, 13], "happen": 5, "sequenc": [5, 6], "revers": [5, 6], "transformed": [5, 6], "extra": [5, 6, 11, 12], "almost": 5, "contexts": 5, "futur": [5, 14, 15], "implements": [5, 6], "recently": 5, "lru": 5, "via": [5, 6, 8, 9, 15], "1000": [5, 6, 11, 15], "60": [5, 6], "uuid4": [5, 6], "registered": [5, 12], "mention": 5, "rendered": [5, 7, 8, 11, 13, 14, 15], "unauthenticated": [5, 6, 9], "authenticated": [5, 6], "below": [5, 6, 7, 11, 13], "rout": [5, 13, 14, 15], "separated": [5, 6, 13, 15], "combined": [5, 6, 11], "preced": [5, 6, 8], "maps": [6, 9], "such": [6, 9, 11, 13, 14], "queri": [6, 7, 13, 14, 15], "records": [6, 7, 11, 12, 13], "dynamically": [6, 7, 8, 11], "dialect": 6, "dialects": 6, "term": 6, "generically": 6, "portabl": 6, "among": [6, 11], "choosen": 6, "pur": 6, "conceived": 6, "tast": 6, "transactions": 6, "aggregat": 6, "nested": [6, 8], "differenc": [6, 11, 14], "caveat": [6, 8, 14], "startup": [6, 14], "downsid": [6, 14], "approach": [6, 14], "nev": [6, 8, 11, 14, 15], "thread": [6, 14], "practical": [6, 11, 14, 16], "mailing": 6, "adapters": [6, 15], "modern": [6, 12, 15], "distribution": 6, "actually": [6, 8], "driv": 6, "sqlite3": 6, "included": [6, 8, 11, 13], "binary": 6, "appropriat": [6, 11], "drivers": 6, "pysqlite2": 6, "zxjdbc": 6, "jython": 6, "psycopg2": 6, "pymysql": 6, "mysqldb": 6, "cx_oracl": 6, "pyodbc": 6, "pypyodbc": 6, "firebird": 6, "kinterbasdb": 6, "fdb": 6, "db2": 6, "informix": 6, "informixdb": 6, "ingres": 6, "ingresdb": 6, "cubrid": 6, "cubriddb": 6, "sybas": 6, "teradat": 6, "sapdb": 6, "mongodb": 6, "pymong": 6, "imap": 6, "imaplib": 6, "treated": [6, 14], "gotch": 6, "about": [6, 7, 12, 13, 14, 15, 16], "comp\u00f5": 6, "instantiat": [6, 12, 14], "mytabl": 6, "myfield": 6, "truncat": 6, "import_from_csv_fil": 6, "instantiated": 6, "claus": 6, "myquery": 6, "myset": 6, "somevalu": 6, "something": [6, 7, 8, 9, 11], "derived": 6, "myord": 6, "advisabl": 6, "persistent": [6, 12], "hesitat": 6, "doing": [6, 11, 15], "snippets": 6, "executabl": [6, 9], "auth_user_tag_groups": [6, 12], "person": [6, 7, 11, 13], "superher": [6, 7, 11, 13, 15], "superpow": [6, 7], "product": [6, 11, 15], "superman": [6, 7, 11, 13], "real_identity": [6, 7], "zer": [6, 8, 11, 13], "sak": 6, "simplicity": [6, 15], "discussion": 6, "engin": [6, 11], "conect": [6, 12], "_ur": 6, "_dbnam": 6, "instanc": [6, 9, 11, 13, 15], "uniform": 6, "resourc": [6, 12], "identifi": 6, "liga\u00e7\u00f5": [6, 9], "supor": 6, "situa\u00e7\u00e3": 6, "dummy": [6, 8], "db_codec": 6, "utf": 6, "check_reserved": 6, "migrate_enabled": 6, "fake_migrate_all": 6, "decode_credentials": 6, "driver_args": 6, "adapter_args": 6, "attempts": [6, 12], "auto_import": 6, "bigint_id": 6, "lazy_tabl": 6, "db_uid": 6, "do_connect": 6, "after_connection": 6, "ignore_field_cas": 6, "entity_quoting": 6, "table_hash": 6, "estabelec": 6, "atrav\u00e9s": [6, 8, 9, 12], "inst\u00e2nc": [6, 13], "dar": 6, "seq\u00fc\u00eanc": 6, "set_encoding": 6, "utf8mb4": 6, "postgr": 6, "2005": 6, "mssql3": 6, "2012": 6, "mssql4": 6, "oracl": 6, "dsn": 6, "uid": 6, "pwd": 6, "ndb": 6, "consists": [6, 13], "locked": 6, "accessed": [6, 9, 11], "established": 6, "appropriately": 6, "encoding": 6, "avoids": 6, "utf8": 6, "charact": [6, 11], "unicod": [6, 11], "characters": [6, 11], "consist": [6, 14], "four": 6, "bytes": 6, "turns": [6, 15], "buff": 6, "often": [6, 12, 15], "completely": [6, 8, 12], "had": 6, "connecting": 6, "_select": 6, "_insert": 6, "_updat": 6, "_delet": 6, "usos": 6, "codific": 6, "caract": [6, 9], "latin1": 6, "unicodedecodeerror": 6, "rath": [6, 8, 11, 15], "slow": 6, "establish": 6, "pooling": 6, "closed": [6, 8], "goes": [6, 11], "tri": [6, 14], "recycl": 6, "cresc": 6, "m\u00e1xim": 6, "simult\u00e2n": 6, "receb": [6, 8], "tamanh": 6, "sequencial": 6, "t\u00f3pic": 6, "benef\u00edci": 6, "conseg": 6, "segund": 6, "fracass": 6, "permanec": 6, "fech": [6, 8, 9], "grac": 6, "repeti\u00e7\u00e3": 6, "restabelec": 6, "interromp": 6, "major": 6, "boost": [6, 8], "creation": 6, "deferred": [6, 15], "referenced": [6, 7], "possibly": 6, "concurrency": [6, 15], "problems": [6, 12, 15], "howev": [6, 8, 11, 15], "demand": 6, "referred": [6, 7], "responsibility": 6, "housekeeping": 6, "definitions": [6, 7, 14], "maintainability": 6, "expect": [6, 11], "uris": 6, "deal": [6, 15], "distribut": 6, "workload": 6, "primeir": [6, 8, 12, 16], "eo": 6, "terceir": 6, "distribu": 6, "carg": 6, "mestr": 6, "escrav": 6, "colun": [6, 13], "alvo": 6, "nenhum": [6, 12], "cont\u00eam": [6, 10], "against": [6, 7, 9, 11, 13], "ordem": 6, "op\u00e7\u00f5": [6, 16], "extras": 6, "tais": 6, "ends": [6, 8, 14], "reserved": [6, 11], "keywords": 6, "append": [6, 9, 11, 13, 15], "_nonreserved": 6, "postgres_nonreserved": 6, "backends": 6, "cit": [6, 9, 11], "entidad": 6, "identific": [6, 9], "ger": [6, 8, 9, 12, 13], "n\u00edvel": [6, 10], "cot": 6, "mai\u00fascul": 6, "min\u00fascul": 6, "assim": [6, 8], "dobr": 6, "motor": 6, "acord": 6, "norm": 6, "conform": [6, 12], "dobrag": 6, "certez": 6, "esquem": 6, "organiz": 6, "ambas": 6, "acim": [6, 7, 8, 12], "table1": 6, "column": [6, 13], "\u00c0s": [6, 9], "recomend": 6, "detalh": [6, 13], "user_nam": 6, "user_password": 6, "server_addr": 6, "db_nam": 6, "sslmod": 6, "sslrootcert": 6, "root": [6, 8, 12, 13], "sslcert": 6, "sslkey": 6, "migration": 6, "migrations": 6, "booleans": 6, "afet": 6, "migr": 6, "desat": 6, "verdadeir": [6, 11, 13], "aren": 6, "committed": [6, 14], "immediately": 6, "depending": [6, 8, 11, 13], "activiti": 6, "ever": 6, "granul": 6, "bob": 6, "roll": 6, "revert": 6, "views": 6, "enclosed": 6, "pseud": 6, "traceback": 6, "ticket": 6, "visitor": 6, "tablenam": [6, 7, 11, 15], "kwargs": [6, 15], "preenchiment": 6, "obrigat\u00f3ri": 6, "subcl": 6, "defini\u00e7\u00e3": 6, "opcion": [6, 9], "common_filt": 6, "discut": 6, "abaix": 6, "loj": 6, "pesso": 6, "peg": 6, "increment": 6, "original": [6, 8, 9, 11], "external": 6, "elements": [6, 9, 11, 15], "redefini\u00e7\u00e3": 6, "provoc": 6, "anonymous": [6, 8, 11], "downs": 6, "othertabl": 6, "otherfield": 6, "referencing": 6, "constructor": [6, 12, 16], "representation": [6, 9], "backend": 6, "ali": [6, 11], "constructing": 6, "illustrat": 6, "qualified": 6, "belonging": 6, "db1": 6, "dbo": 6, "helps": [6, 8, 11], "legacy": 6, "primary": [6, 8, 12], "keys": [6, 7], "keyed": 6, "sub": 6, "refer": [6, 7], "relev": 6, "num\u00e9r": 6, "acion": 6, "embor": 6, "mudanc": 6, "din\u00e2m": [6, 16], "mes": [6, 9], "vantagens": 6, "adi": 6, "age": 6, "set_attribut": 6, "is_not_empty": 6, "is_int_in_rang": 6, "120": 6, "realment": 6, "defini\u00e7\u00f5": 6, "ea": 6, "entant": [6, 8, 9, 13], "tom": 6, "is_in_db": [6, 13], "sometabl": 6, "somefield": 6, "some_valu": 6, "caus": [6, 11], "in\u00edci": 6, "keyword": [6, 8, 9], "attached": [6, 12], "preceded": [6, 11], "underscor": [6, 9, 11], "naming": 6, "conflicts": 6, "_extr": 6, "condi\u00e7\u00f5": 6, "easiest": 6, "conditions": [6, 11], "met": [6, 8, 9], "uniqu": [6, 7, 11], "autom\u00e1t": 6, "account": 6, "accnum": 6, "acctype": 6, "accdesc": 6, "null": [6, 7, 11, 15], "fieldnam": [6, 15], "dispon": 6, "escrit": [6, 8], "garant": [6, 8], "obras": 6, "simplific": 6, "vis\u00e3": 6, "Estes": 6, "length": [6, 11], "ondelet": 6, "notnull": 6, "uploadfield": 6, "widget": [6, 11], "label": [6, 7, 8, 11, 15], "comment": [6, 9], "searchabl": 6, "listabl": 6, "authoriz": [6, 7], "autodelet": 6, "uploadfold": 6, "uploadseparat": 6, "uploadfs": 6, "custom_qualifi": 6, "map_non": 6, "Nem": 6, "compriment": 6, "compat": 6, "constru\u00edd": [6, 13], "preench": 6, "previ": [6, 11], "apropri": 6, "ness": 6, "validator": [6, 11], "foruml\u00e1ri": [6, 9, 16], "enforced": [6, 11, 14], "forms": [6, 9, 13, 14, 15], "addition": [6, 8], "sometim": [6, 8, 9, 11], "seem": 6, "redundant": 6, "maintain": [6, 8, 15], "distinction": 6, "efet": 6, "instru\u00e7\u00e3": 6, "cascat": 6, "exclu": 6, "desativ": 6, "conjunt": [6, 9, 10, 13], "imped": [6, 9], "nul": 6, "exclus": 6, "appli": [6, 11, 15], "somewher": 6, "uploads": 6, "discussed": [6, 8, 9, 11], "detail": [6, 9, 13, 15], "uploaded": [6, 11, 14], "upload_fold": [6, 11], "points": [6, 7, 11, 13], "optimized": 6, "subfold": 6, "attention": 6, "breaking": 6, "eith": [6, 11], "separat": [6, 11, 12, 15], "changing": 6, "behavior": [6, 11, 14, 15], "prevent": [6, 9, 11], "happens": 6, "mov": 6, "amazon": 6, "s3": 6, "sftp": 6, "pyfilesyst": 6, "funcion": [6, 16], "deleted": 6, "due": [6, 7, 11], "operation": [6, 12], "trigg": [6, 15], "associated": [6, 11, 12], "autogenerated": 6, "grav\u00e1vel": 6, "formul\u00e1ri": [6, 12, 13, 16], "leg\u00edvel": 6, "autentic": 6, "autoriz": 6, "guaranteed": [6, 14], "reset": 6, "is_length": 6, "512": 6, "32": [6, 11], "768": 6, "31": [6, 7, 11], "gib": 6, "boolean": [6, 13], "is_float_in_rang": 6, "1e100": 6, "decimal": [6, 11], "is_decimal_in_rang": 6, "is_dat": 6, "is_tim": 6, "is_datetim": 6, "_id": [6, 9, 11, 15], "is_empty_or": 6, "is_json": 6, "bigint": 6, "63": [6, 11], "grand": 6, "devolv": [6, 8], "pont": 6, "respect": [6, 11, 13], "certain": [6, 8, 11, 13], "denormalization": 6, "listproperty": 6, "stringlistproperty": 6, "relational": 6, "lists": [6, 13], "items": [6, 7, 8, 11], "item": [6, 8, 9], "escaped": [6, 8, 9], "pretty": [6, 11, 14], "explanatory": 6, "backported": 6, "portability": 6, "base64": [6, 8, 15], "decoded": 6, "extracted": 6, "negativ": [6, 11], "33": [6, 11], "spac": [6, 8, 11, 13], "necessary": [6, 8, 9], "making": [6, 8], "communication": 6, "escaping": [6, 8], "maior": [6, 7], "_format": 6, "sublinh": 6, "poss\u00edv": 6, "Da": 6, "pai": 6, "_tabl": [6, 11, 15], "_tablenam": 6, "_db": 6, "constru\u00e7\u00e3": [6, 9, 13], "v\u00ea": 6, "validat": [6, 11], "tupl": [6, 8, 9], "consider": [6, 8, 9], "myfil": 6, "imag": [6, 8, 9, 11], "relat": 6, "atribu\u00edd": 6, "habilit": 6, "duplicat": 6, "file_content": [6, 15], "file_nam": [6, 15], "feit": 6, "ocasional": 6, "mei": 6, "rb": 6, "Tamb\u00e9m": 6, "ficheir": 6, "corrent": 6, "lev": [6, 9], "flux": 6, "extens\u00e3": 6, "tempor\u00e1ri": 6, "assoc": [6, 10], "inv\u00e9s": 6, "image_fil": 6, "opost": 6, "fullnam": 6, "nameonly": 6, "recup": 6, "pront": 6, "clos": [6, 9], "contextlib": 6, "shutil": 6, "wb": 6, "copyfileobj": 6, "definition": [6, 7, 11, 13], "differs": [6, 13], "letting": 6, "removing": 6, "second": [6, 9, 11, 12, 14], "adding": [6, 11, 13], "newly": 6, "referim": 6, "logfil": 6, "unnamed": 6, "Nos": 6, "descart": 6, "columns": [6, 16], "recommended": [6, 11], "disabl": [6, 13], "impor": 6, "solt": 6, "hor": 6, "lix": 6, "fins": 6, "reclam": 6, "an\u00e1lis": 6, "corromp": 6, "quest\u00e3": 6, "cons": 6, "actualiz": 6, "gen\u00e9r": 6, "t\u00edpic": 6, "transa\u00e7\u00f5": 6, "menor": 6, "\u00e9poc": 6, "comet": 6, "fic": 6, "envolv": 6, "convers\u00e3": 6, "acontec": 6, "exat": [6, 8], "reconstru": 6, "metad": 6, "aquel": [6, 12], "attempting": 6, "prudent": 6, "yourapp": 6, "descrev": 6, "estreit": 6, "fak": 6, "alex": 6, "trunc": 6, "reinic": 6, "recomec": 6, "identity": [6, 7, 11, 14], "bulk_insert": 6, "inser\u00e7\u00f5": 6, "relacion": 6, "vantag": 6, "looping": 6, "veloc": 6, "caiu": 6, "tr\u00eas": 6, "carl": 6, "pertenc": 6, "q": [6, 13], "tal": 6, "escrev": [6, 8, 9], "fat": 6, "birthplac": 6, "chicag": 6, "houv": 6, "nasc": 6, "terr": 6, "natal": 6, "crit\u00e9ri": 6, "selec\u00e7\u00e3": 6, "pet": [6, 7, 13], "rov": 6, "ret": 6, "fianc": 6, "erros": 6, "mant\u00e9m": 6, "mapeament": 6, "cuj": 6, "rar": 6, "similar": [6, 9], "etiquet": [6, 9], "propriedad": 6, "anex": 6, "tools": [6, 12, 15], "properti": [6, 11], "id1": 6, "cha": 6, "id2": 6, "material": 6, "wood": 6, "assert": 6, "implemented": 6, "thing_tags_default": 6, "tail": 6, "flexibl": [6, 12], "instru\u00e7\u00f5": 6, "u": [6, 9], "seleccion": 6, "cinc": 6, "placeholders": 6, "colnam": 6, "as_ordered_dict": 6, "substitu\u00edd": 6, "espac": [6, 10, 13], "results": [6, 8, 11, 13], "cursor": [6, 15], "dictionari": 6, "applying": [6, 13], "field1": 6, "val1_row1": 6, "field2": 6, "val2_row1": 6, "val1_row2": 6, "val2_row2": 6, "bonit": 6, "tecl": [6, 10], "ordereddict": 6, "reflet": 6, "adi\u00e7\u00e3": 6, "extra\u00edd": 6, "express\u00e3": [6, 7, 10, 13], "quaisqu": [6, 11], "r\u00f3tul": [6, 9, 13], "arbitr\u00e1ri": 6, "fict\u00edci": 6, "rea": 6, "\u00fatil": 6, "depur": [6, 8], "selecting": 6, "timed": 6, "_timings": 6, "took": 6, "expl\u00edcit": [6, 12], "recorrent": 6, "myidx": 6, "dialet": 6, "SE": 6, "direct": 6, "sid": [6, 15, 16], "comand": 6, "_count": 6, "susan": 6, "iterabl": [6, 11], "whos": [6, 8, 11], "act": 6, "diff": 6, "latt": [6, 11, 14], "fileir": 6, "loop": [6, 8], "imprim": 6, "etap": 6, "entend": 6, "pergunt": 6, "particularly": 6, "handy": 6, "compact": 6, "nota\u00e7\u00e3": [6, 9], "sim": 6, "incomum": 6, "delete_record": 6, "iterators": 6, "avali": [6, 8], "aliment": 6, "lac": 6, "tradicion": 6, "tradicional": 6, "dramat": 6, "iterselect": 6, "cerc": 6, "m\u00e1quin": [6, 9], "reescrev": 6, "sele\u00e7\u00e3": [6, 9], "tir": 6, "proveit": 6, "repr_row": 6, "gerador": 6, "wouldn": 6, "anyway": 6, "myrecord": 6, "shortcut": [6, 8, 11], "19": [6, 7, 11], "02": [6, 11], "convenient": [6, 16], "aparent": 6, "flex\u00edvel": 6, "verif": 6, "levant": 6, "cois": 6, "owner_id": 6, "vincul": 6, "ineficient": 6, "tr\u00e1s": 6, "owns": 6, "actu": 6, "decomp\u00f5": 6, "s\u00e9ri": 6, "classific": [6, 13], "invers": 6, "til": 6, "aparec": 6, "aleat\u00f3r": 6, "random": [6, 8, 11, 12, 15], "super": 6, "concaten": 6, "grup": [6, 12], "condicional": 6, "condi\u00e7\u00e3": 6, "query1": 6, "query2": 6, "consulta1": 6, "efeit": 6, "necessit": 6, "sen\u00e3": 6, "desloc": 6, "offset": [6, 7], "m\u00e1x": 6, "implicit": 6, "pagin": [6, 13], "desempenh": 6, "involved": [6, 8], "managing": 6, "sections": 6, "respectively": [6, 11], "cacheabl": 6, "caching": [6, 16], "trad": 6, "offs": 6, "bin\u00e1ri": 6, "neg": 6, "invert": [6, 11], "nega\u00e7\u00e3": 6, "un\u00e1ri": 6, "sobrecarg": 6, "forma\u00e7\u00e3": 6, "precedent": 6, "compar": [6, 14], "par\u00eantes": 6, "unit\u00e1ri": 6, "elev": 6, "negated": 6, "constru": [6, 9, 13], "vaz": 6, "contag": 6, "jog": [6, 10], "elimin": [6, 13], "ken": 6, "visits": 6, "clicks": [6, 15], "cl\u00e1usul": [6, 8], "condition": [6, 11, 16], "yes_or_n": 6, "curt": 6, "confund": 6, "philip": 6, "modified_on": 6, "retain": 6, "mindful": 6, "inclu\u00edd": [6, 9], "compost": [6, 9], "vari": 6, "usam": 6, "first_row": 6, "last_row": 6, "obvi": 6, "indo": 6, "pretend": 6, "esquec": 6, "table_nam": 6, "consegu": 6, "otimiz": 6, "rows_list": 6, "first_row_dict": 6, "themselv": [6, 8], "allowed": [6, 7, 11, 12], "rows1": 6, "rows2": 6, "uni\u00e3": 6, "rows3": 6, "remo\u00e7\u00e3": 6, "intersec\u00e7\u00e3": 6, "in\u00fatil": 6, "manipul": 6, "inalter": 6, "origin": 6, "signific": [6, 8], "\u00f3bvi": [6, 8], "element": [6, 8, 9, 11, 13, 15], "validad": 6, "cache_db_select": 6, "cache\u00e1vel": 6, "falt": 6, "aceler": 6, "calcul": 6, "unit_pric": 6, "quantity": [6, 11], "total_pric": 6, "rid": 6, "99": 6, "9": [6, 7, 11, 13, 14], "95": 6, "1l": 6, "retrieval": 6, "wik": [6, 7], "searching": [6, 9], "normalized": 6, "evaluated": [6, 7], "subse\u00e7\u00e3": 6, "dif": 6, "daquel": 6, "se\u00e7\u00e3": 6, "discounted_total": 6, "discount": 6, "impl\u00edcit": 6, "pens": 6, "niss": 6, "percentual": 6, "dig": 6, "15": [6, 11, 12, 13], "appe": [6, 11], "cont\u00eain": 6, "instanci": 6, "myvirtualfields": 6, "virtualfields": 6, "order_it": 6, "agir": [6, 9], "setvirtualfields": 6, "myvirtualfields1": 6, "discounted_unit_pric": 6, "90": [6, 7], "myvirtualfields2": 6, "discounted_total_pric": 6, "lazy_total_pric": 6, "ilustr": [6, 8], "owner": [6, 11], "intended": [6, 15], "ex": 6, "c\u00edclic": 6, "insir": 6, "boat": 6, "sho": 6, "adquir": 6, "jun\u00e7\u00e3": [6, 12], "transparent": [6, 8, 11], "si": [6, 13], "unid": 6, "owner_id1": 6, "owner_id2": 6, "with_al": 6, "particip": 6, "esquerd": [6, 13], "jun\u00e7\u00f5": 6, "pertencent": 6, "propriet\u00e1ri": 6, "incorpor": 6, "clar": 6, "igual": [6, 7], "pr\u00f3pri": [6, 13], "ajust": 6, "barc": 6, "intermedi\u00e1r": 6, "ownership": 6, "reescrit": 6, "co": [6, 11], "propriet\u00e1r": 6, "vias": 6, "persons_and_things": 6, "rela\u00e7\u00f5": 6, "father_id": 6, "mother_id": 6, "deriv": 6, "fid": 6, "mid": 6, "claud": 6, "fath": 6, "moth": 6, "AS": 6, "opt\u00e1m": 6, "distin\u00e7\u00e3": 6, "comunic": 6, "diferenc": 6, "sutil": 6, "errad": 6, "corret": 6, "event": 6, "event_tim": 6, "gravidad": 6, "severity": 6, "Como": [6, 16], "varredur": 6, "inje\u00e7\u00e3": 6, "xss": [6, 8, 9], "scan": 6, "injection": 6, "unauthorized": 6, "personag": 6, "sinal": 6, "wild": 6, "card": 6, "sequ\u00eanc": 6, "ansi": 6, "COMO": 6, "sens\u00edvel": 6, "case_sensitiv": 6, "aproxim": 6, "meaning": [6, 11, 12], "value1": 6, "value2": 6, "grau": 6, "apoi": 6, "gost": 6, "2018": 6, "aninh": [6, 9], "bad_days": 6, "jonathan": 6, "nested_select": 6, "m\u00e9d": 6, "estam": 6, "43": 6, "substring": [6, 11], "pux": 6, "sysus": 6, "pow": [6, 15], "coa": 6, "matem\u00e1t": 6, "resgat": 6, "dumpfil": 6, "converting": 6, "produc": [6, 9, 11, 12], "newlin": [6, 11], "export_to_csv_fil": 6, "explict": 6, "exporting": 6, "importing": 6, "finds": 6, "assigned": [6, 11, 12, 14], "ids": 6, "restaur": 6, "somefil": 6, "field3": 6, "separ": [6, 13], "extrem": 6, "despej": 6, "suficient": [6, 13], "ter\u00e3": 6, "nid": 6, "c\u00f3p": 6, "mescl": 6, "acompanh": 6, "64": [6, 8, 15], "stringi": 6, "set_head": 6, "getvalu": 6, "import_and_sync": 6, "_type": [6, 9, 11, 15], "_nam": [6, 9, 11, 15], "vars": [6, 9, 11, 14], "rpc": 6, "nel": 6, "rotul": 6, "uuids": 6, "preocup": 6, "thead": 6, "tr": 6, "th": 6, "tbody": 6, "w2p_odd": 6, "odd": [6, 8], "td": 6, "w2p_even": 6, "easily": [6, 8, 9, 11, 13], "f": [6, 12, 13, 14, 15], "brut": 6, "quotech": 6, "aspas": 6, "cota\u00e7\u00e3": 6, "quote_minimal": 6, "oufil": 6, "quote_nonnumeric": 6, "35": 6, "description": [6, 7, 11, 12], "2013": 6, "oficial": 6, "itens": 6, "escap": [6, 8, 9], "is_in_set": 6, "toy": 6, "car": 6, "products": 6, "costum": 6, "requisit": [6, 16], "particular": 6, "normaliz": 6, "restri\u00e7\u00e3": 6, "got": 6, "v\u00edrgul": 6, "leitur": 6, "gend": 6, "doctor": 6, "specialization": 6, "fict\u00edc": 6, "is_activ": 6, "created_on": 6, "created_by": 6, "modified_by": 6, "payment": 6, "amount": 6, "princ\u00edpi": [6, 16], "activ": [6, 12], "herd": 6, "certifiqu": [6, 10], "accomplished": [6, 12, 14], "anyobj": 6, "obj": [6, 8], "dumps": [6, 15], "loads": [6, 15], "myobj": 6, "aid": 6, "myobjnam": 6, "accomplish": 6, "sqlcustomtyp": 6, "seis": 6, "_before_insert": 6, "_after_insert": 6, "_before_updat": 6, "_after_updat": 6, "_before_delet": 6, "_after_delet": 6, "acrescent": 6, "ressalv": 6, "pprint": 6, "callback": [6, 12, 15], "before_insert": 6, "after_insert": 6, "oprow": 6, "before_updat": 6, "after_updat": 6, "before_delet": 6, "after_delet": 6, "especializ": 6, "_antes_": 6, "dispar": 6, "infinit": 6, "update_naiv": 6, "schem": [6, 11], "relationships": 6, "deletions": 6, "known": [6, 8], "cascading": 6, "informed": 6, "consequenc": [6, 11, 15], "deletion": 6, "enable_record_versioning": 6, "stored_it": 6, "ocult": [6, 11], "padroniz": 6, "vers\u00f5": 6, "_enable_record_versioning": 6, "archive_db": 6, "archive_nam": 6, "stored_item_archiv": 6, "current_record": 6, "grav": 6, "escond": 6, "generaliz": 6, "tenancy": 6, "blog_post": 6, "subject": [6, 7, 12], "post_text": 6, "is_public": 6, "posts": 6, "p\u00fablic": 6, "_common_filt": 6, "fras": 6, "visualiz": 6, "ignore_common_filters": [6, 11], "common_filters": 6, "suponh": 6, "enderec": 6, "ip": [6, 11], "ip2int": 6, "sv": 6, "ipv4": [6, 11], "sp": 6, "split": [6, 7, 8, 11], "iip": 6, "int2ip": 6, "iv": 6, "ov": 6, "divmod": 6, "256": 6, "nativ": 6, "encod": 6, "decod": 6, "websit": [6, 15], "ipaddr": 6, "wikiped": [6, 7], "91": 6, "198": 6, "174": 6, "192": [6, 11], "172": [6, 11], "217": 6, "11": [6, 11], "74": 6, "125": 6, "65": 6, "207": 6, "97": 6, "227": 6, "239": 6, "f\u00e1bric": 6, "Seu": 6, "quant": 6, "marked": 6, "across": [6, 8], "v\u00e3": 6, "fug": [6, 8], "fas": 6, "db_a": 6, "db_b": 6, "simultan": 6, "distributed_transaction_commit": 6, "desfaz": 6, "possibil": 6, "suced": 6, "estiv": 6, "mydb": 6, "font": [6, 8, 11, 13], "cam": [6, 10], "abstra\u00e7\u00e3": 6, "2010": 6, "connectionpool": 6, "baseadapt": 6, "extends": [6, 8, 15], "se\u00e7\u00f5": 6, "conf": 6, "myvalu": 6, "deleg": 6, "_adapt": 6, "_listify": 6, "list_of_fields": 6, "constr\u00f3": 6, "book": 6, "sqliteadapt": 6, "jdbcsqliteadapt": 6, "mysqladapt": 6, "postgresqladapt": 6, "jdbcpostgresqladapt": 6, "oracleadapt": 6, "mssqladapt": 6, "mssql2adapt": 6, "mssql3adapt": 6, "mssql4adapt": 6, "firebirdadapt": 6, "firebirdembeddedadapt": 6, "informixadapt": 6, "db2adapt": 6, "ingresadapt": 6, "ingresunicodeadapt": 6, "googlesqladapt": 6, "nosqladapt": 6, "googledatastoreadapt": 6, "cubridadapt": 6, "teradataadapt": 6, "sapdbadapt": 6, "couchdbadapt": 6, "imapadapt": 6, "mongodbadapt": 6, "verticaadapt": 6, "sybaseadapt": 6, "char": 6, "varch": 6, "longtext": 6, "credential_decod": 6, "pool_connection": 6, "foreign_key_checks": 6, "sql_mod": 6, "no_backslash_escap": 6, "lastrowid": 6, "last_insert_id": 6, "fetchon": 6, "olhand": 6, "mapping": [6, 11, 14], "couchdb": 6, "ibm_db_dbi": 6, "db2ibm": 6, "db2pyodbc": 6, "firebird_embedded": 6, "firebirdembedded": 6, "googlemysql": 6, "googledatastor": 6, "googlepostgr": 6, "googlesql": 6, "informixs": 6, "ingresu": 6, "ingresunicod": 6, "jdbc": 6, "jdbcpostgr": 6, "jdbcsqlit": 6, "mong": 6, "mssql1": 6, "mssql2": 6, "mssql1n": 6, "mssql3n": 6, "mssql4n": 6, "mssqln": 6, "postgres2": 6, "postgrenew": 6, "postgrepsyconew": 6, "postgres3": 6, "postgreboolean": 6, "postgrepsycoboolean": 6, "postgrepsyc": 6, "pytds": 6, "sap": 6, "spatialit": 6, "vertic": 6, "parsed": 6, "obtained": 6, "sqladapt": 6, "recognized": 6, "mysqldv": 6, "dropping": 6, "altering": 6, "remain": [6, 11], "invisibl": 6, "decid": [6, 11, 13], "reinstat": 6, "fail": [6, 8, 11], "rebuilt": 6, "awar": 6, "extract": [6, 11], "cient": 6, "failur": [6, 11, 15], "unfortunat": 6, "prevented": 6, "fixed": [6, 14], "aftermath": 6, "migrated": 6, "corruption": 6, "migrating": [6, 14], "deleting": [6, 13], "corrupted": 6, "py4web_filesyst": 6, "fetch": [6, 14, 15], "reforc": 6, "raz\u00f5": 6, "superseeded": 6, "obsolet": 6, "circul": 6, "bug": 6, "on_delete_action": 6, "NO": 6, "alcanc": 6, "agreg": 6, "run_in_transaction": 6, "seq\u00fcenc": 6, "liststringproperty": 6, "restful": [7, 12], "cit0801": 7, "inspired": 7, "graphql": 7, "cit0802": 7, "less": [7, 11, 14], "powerful": [7, 12, 14], "spirit": 7, "easi": [7, 8], "denormaliz": 7, "policy": 7, "impli": 7, "disabled": [7, 9, 11], "fields": [7, 11, 12, 13, 14, 16], "specifications": 7, "might": [7, 11], "superhero": 7, "isdir": [7, 11, 13], "job": [7, 11, 13], "strength": 7, "entri": [7, 11, 13], "clark": [7, 13], "kent": [7, 13], "journalist": [7, 13], "park": [7, 13], "photograph": [7, 13], "bruc": [7, 13], "wayn": [7, 13], "ceo": [7, 13], "spiderman": [7, 13], "batman": [7, 11, 13], "flight": 7, "speed": [7, 8], "durability": 7, "75": 7, "80": [7, 11], "70": 7, "allowed_patterns": 7, "reasons": 7, "rec_id": 7, "allow": [7, 8, 9, 11, 12, 13, 15], "deny": 7, "record_id": [7, 15], "get_vars": [7, 14], "post_vars": [7, 14], "patterns": 7, "pattern": 7, "expost": 7, "let": [7, 11, 15], "diagr": 7, "interpreting": 7, "posted": 7, "formdat": 7, "eq": 7, "gt": [7, 9], "queried": 7, "sup": 7, "her\u00f3": 7, "ident": 7, "refers": 7, "superpotent": 7, "preceding": 7, "linked": 7, "v\u00f4o": 7, "said": 7, "record": [7, 11, 12, 14, 15], "equal": [7, 11, 12, 15], "modifiers": 7, "obvious": [7, 8, 12], "status": 7, "200": [7, 11, 14, 15], "2019": 7, "05": 7, "19t05": 7, "38": 7, "00": 7, "132635": 7, "api_version": 7, "2021": 7, "01": 7, "04t07": 7, "466030": 7, "regex": [7, 9, 11], "post_writabl": 7, "referenced_by": 7, "put_writabl": 7, "178974": 7, "desnormaliz": 7, "renom": 7, "123218": 7, "recolh": [7, 13], "559918": 7, "201988": 7, "322494": 7, "readability": 7, "powers": 7, "309903": 7, "355181": 7, "34": 7, "974953": 7, "405515": 7, "366288": 7, "451907": 7, "453020": 7, "iso": 7, "8601": 7, "matching": [7, 9, 11], "representational_state_transf": 7, "distinct": [8, 11], "rendering": [8, 9], "reno": 8, "plus": [8, 12, 13], "minor": [8, 14], "trickery": 8, "seamlessly": 8, "squar": 8, "brackets": [8, 11], "embedded": [8, 11], "angle": 8, "editors": 8, "mix": 8, "soon": [8, 15], "bracket": 8, "separating": [8, 11], "embedding": 8, "indented": 8, "according": 8, "rul": [8, 11, 13], "un": [8, 9, 10, 15], "indentation": 8, "blocks": 8, "ending": 8, "colon": 8, "beginning": [8, 11, 12], "palavr": [8, 9, 10], "emacs": 8, "divis\u00e3": 8, "bloc": [8, 9], "indent": 8, "br": [8, 9], "report": 8, "debugged": 8, "dom": [8, 16], "inspector": 8, "introduz": 8, "mediant": 8, "corp": [8, 9], "interior": 8, "p\u00e1gin": [8, 9, 13, 16], "vulner": 8, "transparently": 8, "replaced": [8, 9, 11, 15], "dummyrespons": 8, "practic": [8, 11], "editing": [8, 9, 11, 12, 13], "new_app": [8, 9], "iter": 8, "ul": [8, 11, 12, 15], "li": [8, 11, 12, 15], "apresent": 8, "condicion": 8, "randint": [8, 12], "h2": [8, 11], "45": [8, 11], "encerr": 8, "incorret": 8, "divisibl": [8, 11], "statements": [8, 11], "division": [8, 9], "excep\u00e7\u00e3": 8, "ol\u00e1": 8, "itemize1": 8, "href": [8, 9, 12, 13], "itemize2": 8, "exact": [8, 14], "represent": [8, 9, 11], "pedac": 8, "frent": 8, "terminat": [8, 15], "statement": 8, "modifying": 8, "tre": [8, 11], "foot": 8, "convention": [8, 11, 14], "minimalist": [8, 14], "minimalist_pag": 8, "extended": 8, "titl": [8, 11, 15], "recursively": 8, "resulting": [8, 11, 15], "bytecod": 8, "pyc": 8, "entir": [8, 14, 15], "inserted": 8, "sidebar_enabled": 8, "hom": 8, "excerpt": 8, "sideb": 8, "assignment": 8, "gets": [8, 12], "anywher": [8, 14], "worth": 8, "though": 8, "impos": 8, "limitation": 8, "noted": 8, "determined": [8, 11], "compiling": 8, "significant": 8, "avoided": 8, "alternativ": [8, 11], "some_condition": 8, "this_templat": 8, "that_templat": 8, "compilation": 8, "layouts": [8, 13], "encapsulat": [8, 9], "commonality": 8, "footers": 8, "menus": [8, 11], "mysideb": 8, "contents": [8, 9, 15], "predefin": 8, "enclosing": 8, "over": [8, 13, 15], "riding": 8, "consistency": 8, "desir": 8, "substitutions": 8, "ships": 8, "doctyp": [8, 13], "viewport": 8, "width": [8, 11], "devic": 8, "initial": [8, 11], "rel": [8, 13], "icon": [8, 13], "aaabaaeaaqeaaaeaiaawaaaafgaaacgaaaabaaaaagaaaaeaiaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaapaaaaa": 8, "stylesheet": [8, 13], "cdnjs": [8, 13], "cloudflar": [8, 13], "ajax": [8, 13, 15], "libs": [8, 9, 13], "awesom": [8, 13], "14": [8, 11, 13], "min": [8, 11, 13], "integrity": 8, "sha512": [8, 11], "1pkogiy59xj8co8": 8, "ne6fz": 8, "loazkjy": 8, "ky8iq0g4b3cyey6wyhn3yt9pw0xpsrivlkmxe40ptknxrlnz9": 8, "fkdaog": 8, "crossorigin": 8, "margin": [8, 15], "top": [8, 11, 12], "16px": 8, "8em": [8, 15], "page_head": 8, "customiz": [8, 11, 13], "navigation": [8, 15], "bar": [8, 13], "nav": 8, "black": [8, 11], "Do": [8, 11, 13, 16], "touch": 8, "hamburg": 8, "checkbox": [8, 9], "left": [8, 11, 13, 15], "menu": [8, 11, 12], "page_left_menu": 8, "navb": [8, 12], "profil": [8, 12, 14], "change_password": [8, 12], "flash": [8, 15, 16], "padded": [8, 14], "contect": 8, "mad": [8, 11, 13], "gott": 8, "page_scripts": 8, "scripts": [8, 9], "few": [8, 12, 15], "html5": 8, "58": 8, "accordingly": 8, "54": 8, "123": [9, 11], "myclass": 9, "thisisatest": 9, "programmatically": [9, 11], "positional": 9, "interpreted": 9, "contained": [9, 11, 13], "named": 9, "dicion\u00e1ri": [9, 10, 11], "metatag": 9, "tagg": 9, "xmlescap": 9, "expressions": [9, 11, 15], "prest": 9, "lt": 9, "strings": [9, 11, 13], "equivalently": 9, "shell": 9, "concatenating": 9, "rela\u00e7\u00e3": 9, "ab": [9, 11], "yb": 9, "h\u00edfens": 9, "_dat": 9, "collapsibl": 9, "hyphen": 9, "notation": 9, "pairs": 9, "dinam": 9, "soap": 9, "whatev": [9, 15], "_xmlns": 9, "xmlns": 9, "renderiz": 9, "insegur": 9, "entered": 9, "scripting": 9, "visitors": [9, 11], "injections": 9, "permitted_tags": 9, "allowed_attribut": 9, "blockquot": 9, "target": [9, 15], "alt": 9, "colspan": 9, "assistent": 9, "_bgcolor": 9, "bgcolor": 9, "concatenat": 9, "bold": 9, "insist": 9, "_action": 9, "_method": 9, "headings": [9, 13], "subheadings": 9, "cabec": [9, 13], "tagging": [9, 12], "it\u00e1l": 9, "embed": 9, "_src": 9, "png": [9, 11], "_alt": 9, "inclus\u00e3": 9, "est\u00e1t": [9, 16], "envi": [9, 13], "r\u00e1di": 9, "_valu": [9, 11, 15], "radi": [9, 11], "buttons": [9, 11, 13, 15], "_checked": 9, "checked": [9, 11], "stands": 9, "ordered": 9, "_selected": 9, "thank": 9, "ok": [9, 14], "pr\u00e9": [9, 13, 16], "prefer": 9, "listagens": 9, "marca\u00e7\u00e3": 9, "whit": [9, 15], "Estas": 9, "junt": [9, 13], "matriz": 9, "posicion": 9, "rows": [9, 11, 13, 14], "oposi\u00e7\u00e3": 9, "rodap": 9, "_cols": 9, "_rows": 9, "cols": 9, "monoespac": 9, "unordered": 9, "generator": 9, "_c": 9, "suprim": 9, "aut": 9, "fechament": 9, "termin": 9, "agrad": 9, "retribu": 9, "0x7fa533ff7640": 9, "kargs": 9, "supplied": 9, "first_only": 9, "z": [9, 11], "jquery": [9, 11, 15], "accepting": 9, "selector": [9, 15], "selector1": 9, "selector2": 9, "selectorn": 9, "descendant": 9, "ancestor": 9, "equals": [9, 12], "unquoted": 9, "_u": 9, "_disabled": 9, "specifying": 9, "abc": [9, 11], "xyz": [9, 11], "callabl": [9, 11], "el": 9, "searched": [9, 13], "textual": 9, "efg": 9, "factori": 9, "injecting": 9, "timeoffset": 9, "sidebar_menu": 9, "i18n": 10, "p10n": 10, "fr": 10, "dog": [10, 11, 15], "tantissim": 10, "superior": 10, "express\u00f5": 10, "plural": 10, "chec": 10, "bed": 10, "postel": 10, "cachorr": 10, "deform": 10, "reserv": 10, "max": [10, 11, 15], "idiom": 10, "envolt": 10, "find_match": 10, "update_languag": 10, "supported": [10, 11, 12], "german": 10, "known_expressions": 10, "high": [11, 12], "deletabl": [11, 13], "formstyl": [11, 13, 15], "formstyledefault": [11, 13], "dbi": 11, "keep_valu": 11, "form_nam": 11, "hidden": [11, 15], "csrf_session": 11, "csrf_protection": 11, "lifespan": 11, "signing_inf": 11, "apag": 11, "disallow": 11, "renders": 11, "formstylebulm": [11, 13, 15], "formstylebootstrap4": 11, "grava\u00e7\u00f5": 11, "submet": 11, "validity": 11, "form_minimal": 11, "product_nam": 11, "product_quantity": 11, "not_accepted": 11, "form_exampl": 11, "intentionally": 11, "nor": 11, "management": 11, "form_basic": 11, "realnam": 11, "univers": 11, "dc": [11, 12], "comics": 11, "marvel": 11, "dual": 11, "explain": 11, "row": [11, 13, 15], "bottom": 11, "choos": [11, 12], "dropdown": [11, 13, 15], "prototyping": 11, "hand": [11, 15], "your_app": 11, "form_upload": 11, "required_fold": 11, "hashed": 11, "plugins": [11, 15], "checkboxwidget": 11, "datetimewidget": 11, "fileuploadwidget": 11, "listwidget": 11, "passwordwidget": 11, "radiowidget": 11, "selectwidget": 11, "textareawidget": 11, "improved": 11, "form_widgets": 11, "subclassing": 11, "improving": [11, 12], "form_custom_widgets": 11, "mycustomwidget": 11, "placehold": [11, 15], "no_tabl": [11, 15], "s_": [11, 15], "_placehold": [11, 15], "_titl": [11, 15], "_style": [11, 15], "mystyle": 11, "foreground": 11, "manipulated": 11, "manipulat": 11, "modify": [11, 13, 15], "granulary": 11, "submission": [11, 15], "inserting": 11, "begin": [11, 13], "detail_fields": 11, "frequently": 11, "redundancy": 11, "types": 11, "clash": 11, "isn": [11, 13], "ensur": 11, "surrounding": 11, "controls": 11, "correctly": 11, "stuff": [11, 13], "inject": [11, 16], "_onclick": 11, "doh": 11, "cancel": [11, 15], "attrs": [11, 13, 15], "history": 11, "drop": 11, "down": [11, 15], "lookups": 11, "selection": 11, "constructors": 11, "error_messag": 11, "fist": 11, "wrap": 11, "fill": [11, 15], "translation": [11, 14], "letters": 11, "numbers": 11, "alphanumeric": 11, "converts": 11, "us": 11, "phon": 11, "strict": 11, "fits": 11, "boundari": 11, "inputs": [11, 15], "maxsiz": 11, "255": 11, "minsiz": 11, "minimum": 11, "short": 11, "16": 11, "1kb": 11, "1mb": 11, "1048576": 11, "1024": 11, "cgi": 11, "fieldstorag": 11, "intuitively": 11, "rejects": 11, "breaks": 11, "syntactic": 11, "domain": [11, 12], "rfc": 11, "2616": 11, "semantic": [11, 12], "prepend": [11, 15], "front": [11, 15], "abbreviated": 11, "ca": 11, "2396": 11, "customizabl": [11, 13], "allowed_schem": 11, "exclud": 11, "lacking": 11, "rejected": 11, "prepended": [11, 14], "prepend_schem": 11, "prepending": 11, "internationalized": 11, "idn": 11, "3490": 11, "asci": 11, "punycod": 11, "3492": 11, "bit": 11, "beyond": 11, "standards": [11, 13], "hex": 11, "0x4e86": 11, "becom": 11, "4e": 11, "86": 11, "ftps": 11, "maxlen": 11, "slug": 11, "validated": 11, "repeated": 11, "dash": 11, "native_json": 11, "unchanged": 11, "hh": 11, "mm": 11, "ss": 11, "formats": 11, "yyyy": 11, "dd": 11, "symbols": 11, "symbol": 11, "year": [11, 15], "century": 11, "1963": 11, "day": 11, "month": 11, "28": 11, "08": 11, "aug": 11, "august": 11, "hour": 11, "24": 11, "clock": 11, "12": 11, "am": 11, "pm": 11, "minut": 11, "59": 11, "2008": 11, "2009": 11, "passwords": 11, "neith": 11, "strip": 11, "empty_regex": 11, "deprecated": [11, 15], "express": 11, "arrang": 11, "backward": 11, "compatibility": 11, "expressed": 11, "logical": 11, "terms": 11, "dot": 11, "fall": 11, "comparison": 11, "arithmetic": 11, "limits": 11, "internationaliz": 11, "decimals": 11, "floating": 11, "definit": 11, "ie": 11, "numerical": 11, "conversion": [11, 16], "filled": 11, "acceptanc": 11, "descriptiv": 11, "apple": 11, "banan": 11, "cherry": 11, "alphabetically": 11, "labels": 11, "sort": 11, "hulk": 11, "06": 11, "multiselect": 11, "exclusiv": [11, 12], "specials": 11, "forbidden": 11, "obviously": 11, "clev": 11, "enough": [11, 12], "cle": 11, "entropy": 11, "53": 11, "implicitly": 11, "performs": 11, "iterations": 11, "pbkdf2": 11, "byte": 11, "md5": 11, "hmac": 11, "thisisthekey": 11, "useless": [11, 14], "constant": 11, "mysaltvalu": 11, "somewhat": 11, "min_length": 11, "alg": 11, "consequently": 11, "invalidating": 11, "valued": 11, "emails": 11, "filter_in": 11, "split_emails": 11, "findall": 11, "mailt": 11, "customization": 11, "textar": 11, "sqlforms": 11, "blanks": 11, "operat": 11, "stand": 11, "onvalidation": 11, "accepts": 11, "emails_onvalidation": 11, "acts": 11, "attempted": 11, "through": 11, "dimensions": 11, "height": [11, 13, 15], "bmp": 11, "gif": 11, "jpeg": 11, "imaging": 11, "parts": 11, "taken": 11, "source1": 11, "extensions": 11, "lowercas": 11, "bypass": [11, 12], "200x200": 11, "pixels": 11, "extension": [11, 14], "crit": 11, "lastdot": 11, "separator": 11, "indicat": [11, 14], "tar": 11, "gz": 11, "insensitiv": 11, "thumbnail": 11, "jpg": 11, "older": 11, "regexlib": 11, "minip": 11, "maxip": 11, "is_localhost": 11, "is_privat": 11, "is_automatic": 11, "lowest": 11, "highest": 11, "flag": 11, "168": 11, "integers": 11, "boundary": 11, "199": 11, "forbid": 11, "meanings": 11, "169": 11, "254": 11, "network": [11, 12], "is_link_local": 11, "is_reserved": 11, "is_multicast": 11, "is_routeabl": 11, "is_6to4": 11, "is_tered": 11, "subnets": 11, "ipv6": 11, "allocated": 11, "networks": [11, 12], "fe80": 11, "ietf": 11, "multicast": 11, "ff00": 11, "6to4": 11, "2002": 11, "tered": 11, "2001": 11, "forcing": 11, "subnet": 11, "memb": [11, 12], "fb00": 11, "heading": 11, "blank": [11, 13], "removal": 11, "456": 11, "123456": 11, "synops": 11, "his": 11, "requirement": 11, "probability": 11, "rac": 11, "occurs": 11, "operationalerror": 11, "inserts": 11, "dbset": 11, "allowed_overrid": 11, "persons": 11, "days": 11, "registration_stamp": 11, "timedelt": 11, "value_field": 11, "representing_field": 11, "fourth": 11, "ten": 11, "selections": 11, "represented": 11, "orderby": [11, 12, 13, 15], "groupby": 11, "sorting": 11, "usefull": 11, "wishing": 11, "occasionally": 11, "_and": 11, "owners": 11, "subset": 11, "check_nonnegative_quantity": 11, "vital": 12, "multius": 12, "interchangeably": 12, "proc": 12, "confirms": 12, "say": 12, "guidelin": 12, "approv": 12, "step": [12, 14], "adiant": 12, "bloqu": 12, "nomeaplic": 12, "request_reset_password": 12, "reset_password": 12, "verify_email": 12, "sair": 12, "change_email": 12, "pr\u00f3pr": [12, 13], "allowed_actions": 12, "turn": [12, 13, 15], "verification": 12, "activated": 12, "successfully": 12, "challeng": 12, "submitting": 12, "correct": 12, "instantiation": [12, 13], "two_factor_filt": 12, "bypassed": 12, "sampl": 12, "user_outside_network": 12, "ipaddress": 12, "22": 12, "ip_list": 12, "ipv4network": 12, "ipv4address": 12, "mfa": 12, "sends": 12, "send_two_factor_email": 12, "from_address": 12, "youremail": 12, "flow": 12, "two_factor": 12, "endpoint": [12, 15], "_next_url": 12, "auth_plugins": 12, "hierarchical": 12, "saml": 12, "oauth": 12, "ui": 12, "adapt": 12, "exibi\u00e7\u00e3": [12, 13], "pam_plugin": 12, "pamplugin": 12, "register_plugin": 12, "vir": 12, "authenticat": 12, "directory": 12, "ldap_plugin": 12, "ldapplugin": 12, "ldap_setting": 12, "ad": 12, "base_dn": 12, "cn": 12, "ldap_settings": 12, "ubuntu": 12, "librari": 12, "apt": 12, "libldap2": 12, "libsasl2": 12, "oauth2googl": 12, "client_id": 12, "client_secret": 12, "callback_url": 12, "segred": 12, "oauth2facebook": 12, "oauth2discord": 12, "discord_client_id": 12, "discord_client_secret": 12, "uri": 12, "discriminator": 12, "mentioned": [12, 15], "verifying": 12, "existenc": 12, "showed": 12, "suffers": 12, "overkill": 12, "tagged_db": 12, "_tag": 12, "tagged_nam": 12, "danc": 12, "teach": 12, "auth_user_tagged_groups": 12, "chars": 12, "footing": 12, "authorized": 12, "displays": [12, 13], "not_authorized": 12, "find_by_tag": 12, "deix": 12, "exerc\u00edci": 12, "has_membership": 12, "school": 12, "physics": 12, "professor": 12, "ensin": 12, "m\u00e9di": 12, "f\u00edsic": 12, "colegial": 12, "creativity": 12, "auth_group": 12, "auth_groups": 12, "zapp": 12, "zap_id": 12, "zap": 12, "belongs": 12, "zapped": 12, "belong": [12, 14], "filtr": [12, 13], "membr": 12, "capabiliti": [13, 15], "corn": 13, "ston": 13, "exclus\u00e3": 13, "desc": 13, "search_queri": 13, "OU": 13, "search_form": 13, "p\u00f3s": 13, "substitui\u00e7\u00f5": 13, "jpsteil": 13, "grid_tutorial": 13, "advised": 13, "doubt": 13, "finding": 13, "precious": 13, "hints": 13, "gridclassstylebulm": 13, "grid_class_styl": 13, "gridclassstyl": 13, "val": 13, "perfectly": 13, "usabl": 13, "refresh": 13, "icons": 13, "showing": 13, "placing": 13, "maintainabl": 13, "lead": [13, 15], "advanced": [13, 16], "topics": [13, 16], "htmx": [13, 16], "forget": 13, "field_id": 13, "show_id": 13, "editabl": [13, 14], "pre_action_buttons": 13, "post_action_buttons": 13, "auto_process": [13, 15], "rows_per_pag": 13, "include_action_button_text": 13, "search_button_text": 13, "responsibl": 13, "especifiqu": 13, "action_button": 13, "imediat": 13, "estil": 13, "styling": 13, "styles": 13, "utilizing": 13, "during": 13, "involv": [13, 14], "fifth": 13, "clickabl": 13, "hid": 13, "modifi": 13, "handling": 13, "por\u00e7\u00f5": 13, "grelh": 13, "primarily": 13, "class_styl": 13, "unfortunately": 13, "bootstrap": 13, "gridactionbutton": 13, "additional_cl": 13, "additional_styl": 13, "override_cl": 13, "override_styl": 13, "append_id": 13, "ignore_attribute_plugin": 13, "naveg": 13, "clic": 13, "fa": 13, "calend": 13, "aul": 13, "mensag": 13, "verdad": 13, "id_field_nam": 13, "id_valu": 13, "querystring": 13, "defining": 13, "improvement": 13, "10px": 13, "foo": 13, "filter_out": 13, "foreign": 13, "company": 13, "is_null_or": 13, "empres": 13, "qued": 13, "empreg": 13, "joined": 13, "employe": 13, "joins": [13, 16], "clicked": [13, 15], "sorted": 13, "search_text": 13, "far": [13, 15], "grids": 13, "antig": 14, "similariti": 14, "identical": 14, "light": 14, "predetermined": 14, "debuggers": 14, "ides": 14, "constraining": 14, "mann": 14, "admin": 14, "locat": 14, "my_url_path": 14, "assumed": 14, "postfix": 14, "matters": 14, "expected": 14, "wrappers": 14, "hard": 14, "analogy": 14, "hous": 14, "preprocessing": 14, "postprocessing": 14, "carry": 14, "underlying": 14, "preguic": 14, "dangerous": 14, "pyweb": 14, "ability": 14, "extensibl": 14, "lacks": 14, "requires_": 14, "mean": 14, "establishing": 14, "attaching": 14, "labeling": 14, "assigning": 14, "rocket": 14, "301": 14, "sophisticated": 14, "dismissal": 14, "file_path": 14, "csv": 14, "app_fold": 14, "requires_login": 14, "user_email": 14, "retrieved": 14, "big": 14, "decorated": 14, "websocket": 15, "async": 15, "play": 15, "compliant": 15, "great": 15, "flexibility": 15, "react": 15, "angul": 15, "complexity": 15, "systems": 15, "reaping": 15, "benefits": 15, "ecosyst": 15, "difficult": 15, "road": 15, "reactivity": 15, "emerging": 15, "complexiti": 15, "technically": 15, "transitions": 15, "sockets": 15, "hypertext": 15, "cit1601": 15, "frontends": 15, "integration": 15, "coupl": 15, "hx": 15, "_hx": 15, "url_to_post_t": 15, "submitted": 15, "started": 15, "htmx_form_dem": 15, "htmx_list": 15, "htmx_form": 15, "cancel_attrs": 15, "sidec": 15, "unpkg": 15, "sh": 15, "functional": 15, "maintenanc": 15, "navigat": 15, "anchor": 15, "fancy": 15, "confirmation": 15, "htmx_grid": 15, "attributes_plugin": 15, "attributespluginhtmx": 15, "new_sidec": 15, "edit_sidec": 15, "confirmations": 15, "widgets": [15, 16], "dropdowns": 15, "functools": 15, "params": 15, "autocomplete_query": 15, "fk_tabl": 15, "ktabl": 15, "fk_field": 15, "kfield": 15, "_autocomplete_search_fields": 15, "sf": 15, "_search": 15, "len": 15, "data_label": 15, "htmxautocompletewidget": 15, "simple_query": 15, "pop": 15, "hold": 15, "hidden_input": 15, "hidden_div": 15, "keyup": 15, "delay": 15, "500ms": 15, "s_autocomplete_results": 15, "indicator": 15, "vals": 15, "search_valu": 15, "s_search": 15, "_autocomplet": 15, "onload": 15, "elt": 15, "queryselector": 15, "onkeydown": 15, "check_": 15, "s_down_key": 15, "keycod": 15, "s_autocomplet": 15, "focus": 15, "selectedindex": 15, "formatt": 15, "formstylefactory": 15, "class_inner_exceptions": 15, "vendor": 15, "vendor_typ": 15, "product_record": 15, "earli": 15, "whichev": 15, "wish": 15, "overriding": 15, "vendors": 15, "limiting": 15, "subqueri": 15, "clearly": 15, "prototyp": 15, "var": 15, "supporting": 15, "selected_elements": 15, "queryselectorall": 15, "array": 15, "eval": 15, "sandbox": 15, "math": 15, "wrapp": 15, "recereived": 15, "get_cooki": 15, "extracts": 15, "register_vue_component": 15, "lazily": 15, "res": 15, "upload_help": 15, "bind": 15, "my_id": 15, "reimplementation": 15, "basically": 15, "translat": 15, "clientsid": 15, "serversid": 15, "debounc": 15, "stepping": 15, "setinterval": 15, "500": 15, "skip": 15, "implementations": 15, "delaying": 15, "200ms": 15, "onclick": 15, "1000ms": 15, "tags_inputs": 15, "comm": 15, "browsers": 15, "jsl": 15, "tags_input": 15, "zip_cod": 15, "freetext": 15, "safar": 15, "edge": 15, "datalist": 15, "firfox": 15, "undocumented": 15, "padding": 15, "inlin": 15, "block": 15, "bord": 15, "radius": 15, "100px": 15, "111111": 15, "3em": 15, "2em": 15, "2px": 15, "opacity": 15, "capitaliz": 15, "tag_input": 15, "score_input": 15, "scor": 15, "new_password": 15, "poor": 15, "man": 15, "trapped": 15, "component_1": 15, "mycomponent": 15, "blink": 15, "loading": 15, "serving": 15, "envelop": 15, "moreov": 15, "other_pag": 15, "acknowledgments": 16, "dic": 16, "sugest\u00f5": 16, "contribu": 16, "coloc": 16, "understanding": 16, "plataform": 16, "proced": 16, "corr": 16, "installations": 16, "fixur": 16, "urlsign": 16, "caveats": 16, "memoiz": 16, "introduction": 16, "migra\u00e7\u00f5": 16, "raw": 16, "sql": 16, "Comando": 16, "computed": 16, "virtual": 16, "relations": 16, "export": 16, "caracter\u00edst": 16, "avanc": 16, "pegadinh": 16, "polic": 16, "overview": 16, "customizing": 16, "asynci": 16, "genindex": 16, "modindex": 16}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"O": [0, 1, 3, 4, 5, 6], "\u00e9": 0, "py4web": [0, 1, 6, 14, 15, 16], "acknowledgments": 0, "ajud": 1, "recurs": [1, 6], "dic": 1, "Este": 1, "manual": [1, 16], "grup": 1, "googl": [1, 2, 6, 12], "the": [1, 2, 4, 5, 6, 7, 11, 13, 15], "discord": [1, 12], "serv": [1, 5, 6, 9], "tutori": 1, "v\u00edd": 1, "As": 1, "font": [1, 2], "github": 1, "sugest\u00f5": 1, "pr\u00e9": [1, 2], "requisit": [1, 2], "Um": [1, 6], "local": [1, 2, 6], "trabalh": 1, "python": 1, "modern": 1, "depur": 1, "vscod": 1, "pycharm": 1, "Como": 1, "contribu": 1, "instal": 2, "coloc": 2, "funcion": 2, "understanding": 2, "design": [2, 11], "plataform": 2, "suport": [2, 6], "proced": 2, "configur": [2, 6], "part": [2, 6], "bin\u00e1ri": 2, "pip": 2, "installing": 2, "using": [2, 5, 8, 9, 12, 13, 15], "virtual": [2, 6], "environment": 2, "global": 2, "melhor": 2, "primeir": [2, 4], "corr": 2, "op\u00e7\u00f5": 2, "linh": 2, "comando": 2, "op\u00e7\u00e3": 2, "call": 2, "new_app": 2, "run": 2, "set_password": 2, "setup": 2, "shell": [2, 6], "version": [2, 6], "special": [2, 11], "installations": 2, "https": 2, "wsgi": 2, "deployment": 2, "on": 2, "gcloud": 2, "aka": 2, "gae": 2, "app": [2, 4], "engin": 2, "implant": 2, "pythonanywher": 2, "dock": 2, "podman": 2, "ubuntu": 2, "dashboard": 3, "A": [3, 6, 9, 11], "p\u00e1gin": [3, 4], "web": [3, 4], "principal": 3, "sess\u00e3": 3, "cri": 4, "aplic": [4, 6], "Do": 4, "princ\u00edpi": 4, "est\u00e1t": 4, "din\u00e2m": 4, "Em": 4, "valor": [4, 6], "retorn": [4, 6], "rot": 4, "objet": 4, "request": 4, "model": [4, 6], "_scaffold": 4, "copying": 4, "watch": 4, "fil": [4, 11, 14], "chang": 4, "fixur": 5, "fixtur": 5, "templat": [5, 8, 13], "inject": [5, 9], "translator": 5, "flash": [5, 14], "session": 5, "client": 5, "sid": [5, 9], "in": [5, 8, 9, 15], "cooki": 5, "memcach": 5, "red": [5, 13], "databas": [5, 6, 11], "anywher": 5, "sharing": 5, "sessions": 5, "condition": 5, "urlsign": 5, "dal": [5, 6], "auth": [5, 12, 14], "caveats": 5, "about": 5, "personaliz": [5, 6, 9, 13], "multipl": [5, 12], "caching": 5, "memoiz": 5, "decor": 5, "convenient": 5, "abstraction": 6, "lay": 6, "introduction": 6, "supported": 6, "quick": 6, "tour": 6, "usand": [6, 13], "stand": 6, "alon": 6, "experiment": 6, "construtor": 6, "assinatur": 6, "strings": 6, "conex\u00e3": 6, "par\u00e2metr": 6, "uri": 6, "pool": 6, "conex\u00f5": 6, "falh": 6, "tentat": 6, "tabel": [6, 16], "preguic": 6, "less": 6, "banc": 6, "dad": 6, "replic": 6, "palavr": 6, "chav": 6, "reserv": 6, "quoting": 6, "cas": 6, "faz": 6, "segur": 6, "outr": 6, "past": 6, "padr\u00e3": 6, "migra\u00e7\u00e3": 6, "commit": 6, "rollback": 6, "tabl": [6, 9], "define_tabl": 6, "id": 6, "not": 6, "sobr": 6, "prim\u00e1r": 6, "plural": 6, "singul": 6, "redefin": 6, "format": [6, 11, 15], "represent": 6, "fich": 6, "rnam": 6, "nom": 6, "real": 6, "primarykey": 6, "par": [6, 8, 14], "leg": 6, "migrat": 6, "fake_migrat": 6, "table_class": 6, "sequence_nam": 6, "trigger_nam": 6, "polymodel": 6, "on_defin": 6, "adicion": 6, "atribut": 6, "camp": [6, 13], "field": [6, 11], "types": 6, "and": [6, 7, 8, 11, 12, 13, 14, 15], "validators": [6, 11], "modific": 6, "temp": 6, "execu": 6, "Mais": 6, "envi": 6, "migra\u00e7\u00f5": 6, "fixa\u00e7\u00e3": 6, "quebr": 6, "resum": 6, "control": 6, "methods": [6, 14], "insert": 6, "query": 6, "set": [6, 11], "rows": 6, "update_or_insert": 6, "validate_and_insert": 6, "validate_and_updat": 6, "drop": 6, "marca\u00e7\u00e3": 6, "registr": 6, "raw": 6, "sql": 6, "executesql": 6, "_lastsql": 6, "temporiz": 6, "consult": 6, "\u00edndic": [6, 16], "generating": 6, "Comando": 6, "select": [6, 9], "selet": 6, "uso": 6, "mem\u00f3r": 6, "inferior": 6, "bas": 6, "iter": 6, "renderiz": 6, "atalh": 6, "obten\u00e7\u00e3": 6, "row": 6, "s": 6, "orderby": 6, "groupby": 6, "limitby": 6, "distinct": 6, "having": 6, "orderby_on_limitby": 6, "join": 6, "left": 6, "cach": 6, "orden": 6, "tend": 6, "distint": 6, "junt": 6, "deix": 6, "oper": 6, "l\u00f3gic": 6, "count": [6, 14], "isempty": 6, "delet": 6, "updat": 6, "express\u00f5": 6, "update_record": 6, "inser": 6, "atualiz": [6, 10], "dicion\u00e1ri": 6, "first": 6, "last": 6, "as_dict": 6, "as_list": 6, "combin": 6, "find": [6, 9], "exclud": 6, "sort": 6, "selects": 6, "computed": 6, "fields": 6, "comput": 6, "virtu": 6, "nov": 6, "estil": 6, "experimental": 6, "velh": 6, "antig": 6, "joins": 6, "relations": 6, "muit": 6, "rela\u00e7\u00e3": 6, "inner": 6, "out": 6, "agrup": 6, "cont": 6, "many": 6, "to": 6, "relation": 6, "aut": 6, "referent": [6, 13, 16], "alias": 6, "lik": 6, "ilik": 6, "regexp": 6, "startswith": 6, "endswith": 6, "contains": 6, "upper": 6, "low": 6, "year": 6, "month": 6, "day": 6, "hour": 6, "minut": 6, "seconds": 6, "belongs": 6, "sum": 6, "avg": 6, "min": 6, "max": 6, "len": 6, "substrings": 6, "Os": [6, 13], "defeit": 6, "coalesc": 6, "coalesce_zer": 6, "export": 6, "import": 6, "csv": 6, "cad": 6, "vez": 6, "tod": 6, "mesm": 6, "sincroniz": 6, "remot": 6, "html": [6, 9], "xml": [6, 9], "caracter\u00edst": 6, "avanc": 6, "list": 6, "type": [6, 11], "heranc": 6, "filter_in": 6, "filter_out": 6, "cham": 6, "inser\u00e7\u00e3": 6, "exclus\u00e3": 6, "cascad": 6, "record": 6, "filtr": 6, "comuns": 6, "tip": 6, "defin": 6, "transa\u00e7\u00e3": 6, "distribu\u00edd": 6, "copi": 6, "db": 6, "pegadinh": 6, "adapt": 6, "sqlit": 6, "mysql": 6, "mssql": 6, "microsoft": 6, "or\u00e1cul": 6, "nosql": 6, "datastor": 6, "restap": 7, "polic": 7, "actions": [7, 12], "get": 7, "practical": 7, "exampl": [7, 11, 13, 14, 15], "respons": 7, "linguag": 8, "yatl": [8, 9], "sintax": 8, "b\u00e1sic": 8, "whil": 8, "if": 8, "elif": 8, "else": 8, "tent": 8, "excet": 8, "finally": 8, "def": 8, "return": [8, 14], "information": 8, "workflow": 8, "extend": 8, "includ": 8, "extending": 8, "variabl": [8, 14], "functions": [8, 11], "block": 8, "sup": 8, "pag": 8, "layout": 8, "standard": [8, 11], "structur": [8, 11], "default": 8, "mobil": 8, "development": 8, "helpers": 9, "overview": 9, "built": 9, "body": 9, "cat": 9, "div": 9, "EM": 9, "form": [9, 11, 14, 15], "h1": 9, "h2": 9, "h3": 9, "h4": 9, "h5": 9, "h6": 9, "head": 9, "i": 9, "img": 9, "input": 9, "label": 9, "li": 9, "ol": 9, "option": 9, "p": 9, "pre": 9, "script": 9, "span": 9, "style": [9, 13], "tr": 9, "td": 9, "tbody": 9, "textar": 9, "th": 9, "thead": 9, "titl": 9, "tt": 9, "ul": 9, "url": 9, "tag": 9, "beautify": 9, "dom": 9, "children": 9, "internacionaliz": 10, "pluraliz": 10, "arquiv": 10, "tradu\u00e7\u00e3": 10, "foruml\u00e1ri": 11, "constructor": 11, "minimal": 11, "without": 11, "basic": [11, 13], "upload": 11, "widgets": 11, "custom": [11, 13], "advanced": [11, 15], "manipulation": 11, "forms": 11, "sidec": 11, "paramet": 11, "valid": 11, "formul\u00e1ri": 11, "text": 11, "is_alphanumeric": 11, "is_low": 11, "is_upp": 11, "is_email": 11, "is_match": 11, "is_length": 11, "is_url": 11, "is_slug": 11, "is_json": 11, "dat": 11, "tim": 11, "is_tim": 11, "is_dat": 11, "is_datetim": 11, "is_date_in_rang": 11, "is_datetime_in_rang": 11, "rang": 11, "equality": 11, "is_equal_t": 11, "is_not_empty": 11, "is_null_or": 11, "is_empty_or": 11, "is_expr": 11, "is_decimal_in_rang": 11, "is_float_in_rang": 11, "is_int_in_rang": 11, "is_in_set": 11, "checkbox": 11, "validation": 11, "dictionari": 11, "tupl": 11, "with": [11, 12, 14], "sorted": 11, "options": 11, "tagging": 11, "complexity": 11, "security": 11, "is_strong": 11, "crypt": 11, "is_list_of": 11, "is_list_of_emails": 11, "any_of": 11, "is_imag": 11, "is_fil": 11, "is_upload_filenam": 11, "is_ipv4": 11, "is_ipv6": 11, "is_ipaddress": 11, "other": 11, "cleanup": 11, "is_not_in_db": 11, "is_in_db": 11, "authentication": 12, "authorization": 12, "interfac": 12, "autentic": 12, "insid": 12, "two": 12, "factor": 12, "two_factor_required": 12, "two_factor_send": 12, "two_factor_tri": 12, "plugins": 12, "pam": 12, "ldap": 12, "oauth2": 12, "facebook": 12, "tags": 12, "etiquet": 12, "permiss\u00f5": 12, "objects": 12, "key": 13, "featur": 13, "grid": [13, 14, 15], "object": [13, 15], "searching": 13, "filtering": 13, "crud": 13, "settings": 13, "columns": 13, "customizing": 13, "a\u00e7\u00e3": 13, "bot\u00f5": 13, "bot\u00e3": 13, "class": 13, "amostr": 13, "callabl": 13, "parameters": 13, "De": 14, "web2py": 14, "simpl": 14, "conversion": 14, "hell": 14, "world": 14, "redirect": 14, "returning": 14, "args": 14, "calling": 14, "setting": 14, "up": 14, "view": 14, "accessing": 14, "OS": 14, "topics": 15, "asynci": 15, "htmx": 15, "usag": 15, "autocomplet": 15, "widget": 15, "utils": 15, "js": 15, "string": 15, "q": 15, "t": 15, "conte\u00fad": 16}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"O que \u00e9 py4web?": [[0, "what-is-py4web"]], "Acknowledgments": [[0, "acknowledgments"]], "Ajuda, recursos e dicas": [[1, "help-resources-and-hints"]], "Recursos": [[1, "resources"]], "Este manual": [[1, "this-manual"]], "O grupo Google": [[1, "the-google-group"]], "The Discord server": [[1, "the-discord-server"]], "Tutoriais e v\u00eddeo": [[1, "tutorials-and-video"]], "As fontes no GitHub": [[1, "the-sources-on-github"]], "Dicas e sugest\u00f5es": [[1, "hints-and-tips"]], "Pr\u00e9-requisitos": [[1, "prerequisites"]], "Um local de trabalho python moderna": [[1, "a-modern-python-workplace"]], "Depura\u00e7\u00e3o py4web com VScode": [[1, "debugging-py4web-with-vscode"]], "Depura\u00e7\u00e3o py4web com PyCharm": [[1, "debugging-py4web-with-pycharm"]], "Como contribuir": [[1, "how-to-contribute"]], "Instala\u00e7\u00e3o e coloca\u00e7\u00e3o em funcionamento": [[2, "installation-and-startup"]], "Understanding the design": [[2, "understanding-the-design"]], "Plataformas e pr\u00e9-requisitos suportados": [[2, "supported-platforms-and-prerequisites"]], "Procedimentos de configura\u00e7\u00e3o": [[2, "setup-procedures"]], "Instalando a partir de bin\u00e1rios": [[2, "installing-from-binaries"]], "Instalando a partir de pip": [[2, "installing-from-pip"]], "Installing using a virtual environment": [[2, "installing-using-a-virtual-environment"]], "Instala\u00e7\u00e3o de fonte (globalmente)": [[2, "installing-from-source-globally"]], "Instalando a partir de fonte (localmente)": [[2, "installing-from-source-locally"]], "Melhoramento": [[2, "upgrading"]], "Primeira corrida": [[2, "first-run"]], "Op\u00e7\u00f5es de linha de comando": [[2, "command-line-options"]], "Op\u00e7\u00e3o `` comando call``": [[2, "call-command-option"]], "Op\u00e7\u00e3o `` comando new_app``": [[2, "new-app-command-option"]], "Op\u00e7\u00e3o `` comando run``": [[2, "run-command-option"]], "Op\u00e7\u00e3o `` comando set_password``": [[2, "set-password-command-option"]], "Op\u00e7\u00e3o `` comando setup``": [[2, "setup-command-option"]], "Op\u00e7\u00e3o `` comando shell``": [[2, "shell-command-option"]], "Op\u00e7\u00e3o `` comando version``": [[2, "version-command-option"]], "Special installations": [[2, "special-installations"]], "HTTPS": [[2, "https"]], "WSGI": [[2, "wsgi"]], "Deployment on GCloud (aka GAE - Google App Engine)": [[2, "deployment-on-gcloud-aka-gae-google-app-engine"]], "Implanta\u00e7\u00e3o em PythonAnywhere.com": [[2, "deployment-on-pythonanywhere-com"]], "Deployment on Docker/Podman": [[2, "deployment-on-docker-podman"]], "Deployment on Ubuntu": [[2, "deployment-on-ubuntu"]], "O Dashboard": [[3, "the-dashboard"]], "A p\u00e1gina Web principal": [[3, "the-main-web-page"]], "Sess\u00e3o no Dashboard": [[3, "login-into-the-dashboard"]], "Criando seu primeiro aplicativo": [[4, "creating-your-first-app"]], "Do princ\u00edpio": [[4, "from-scratch"]], "P\u00e1ginas est\u00e1ticas": [[4, "static-web-pages"]], "P\u00e1ginas web din\u00e2micas": [[4, "dynamic-web-pages"]], "Em valores de retorno": [[4, "on-return-values"]], "Rotas": [[4, "routes"]], "O objeto `` request``": [[4, "the-request-object"]], "Modelos": [[4, "templates"]], "The _scaffold app": [[4, "the-scaffold-app"]], "Copying the _scaffold app": [[4, "copying-the-scaffold-app"]], "Watch for files change": [[4, "watch-for-files-change"]], "Fixures": [[5, "fixtures"]], "Using Fixtures": [[5, "using-fixtures"]], "The Template fixture": [[5, "the-template-fixture"]], "The Inject fixture": [[5, "the-inject-fixture"]], "The Translator fixture": [[5, "the-translator-fixture"]], "O fixture flash": [[5, "the-flash-fixture"]], "The Session fixture": [[5, "the-session-fixture"]], "Client-side session in cookies": [[5, "client-side-session-in-cookies"]], "Server-side session in memcache": [[5, "server-side-session-in-memcache"]], "Server-side session in Redis": [[5, "server-side-session-in-redis"]], "Server-side session in database": [[5, "server-side-session-in-database"]], "Server-side session anywhere": [[5, "server-side-session-anywhere"]], "Sharing sessions": [[5, "sharing-sessions"]], "The Condition fixture": [[5, "the-condition-fixture"]], "The URLsigner fixture": [[5, "the-urlsigner-fixture"]], "O fixture DAL": [[5, "the-dal-fixture"]], "The Auth fixture": [[5, "the-auth-fixture"]], "Caveats about fixtures": [[5, "caveats-about-fixtures"]], "Fixtures personalizados": [[5, "custom-fixtures"]], "Multiple fixtures": [[5, "multiple-fixtures"]], "Caching e Memoize": [[5, "caching-and-memoize"]], "Decoradores de conveni\u00eancia": [[5, "convenience-decorators"]], "The Database Abstraction Layer (DAL)": [[6, "the-database-abstraction-layer-dal"]], "DAL introduction": [[6, "dal-introduction"]], "py4web model": [[6, "py4web-model"]], "Supported databases": [[6, "supported-databases"]], "The DAL: a quick tour": [[6, "the-dal-a-quick-tour"]], "Usando o DAL \u201cstand-alone\u201d": [[6, "using-the-dal-stand-alone"]], "Experimentar com o shell py4web": [[6, "experiment-with-the-py4web-shell"]], "Construtor DAL": [[6, "dal-constructor"]], "Assinatura da DAL": [[6, "dal-signature"]], "Strings de conex\u00e3o (o par\u00e2metro uri)": [[6, "connection-strings-the-uri-parameter"]], "O pool de conex\u00f5es": [[6, "connection-pooling"]], "Falhas de conex\u00e3o (par\u00e2metro tentativas)": [[6, "connection-failures-attempts-parameter"]], "Tabelas pregui\u00e7osos": [[6, "lazy-tables"]], "Aplicativos de modelo-less": [[6, "model-less-applications"]], "Bancos de dados replicados": [[6, "replicated-databases"]], "Palavras-chave reservadas": [[6, "reserved-keywords"]], "Configura\u00e7\u00f5es de quoting e case e do banco de dados": [[6, "database-quoting-and-case-settings"]], "Fazendo uma conex\u00e3o segura": [[6, "making-a-secure-connection"]], "Outros par\u00e2metros do construtor DAL": [[6, "other-dal-constructor-parameters"]], "Local de pasta do banco de dados": [[6, "database-folder-location"]], "Configura\u00e7\u00f5es padr\u00e3o de migra\u00e7\u00e3o": [[6, "default-migration-settings"]], "`` `` commit`` e rollback``": [[6, "commit-and-rollback"]], "Construtor Table": [[6, "table-constructor"]], "assinatura define_table": [[6, "define-table-signature"]], "`` Id``: Notas sobre a chave prim\u00e1ria": [[6, "id-notes-about-the-primary-key"]], "`` `` Plural`` e singular``": [[6, "plural-and-singular"]], "`` Redefine``": [[6, "redefine"]], "`` Format``: representa\u00e7\u00e3o da ficha": [[6, "format-record-representation"]], "`` Rname``: nome real": [[6, "rname-real-name"]], "`` Primarykey``: Suporte para tabelas legadas": [[6, "primarykey-support-for-legacy-tables"]], "`` Migrate``, `` fake_migrate``": [[6, "migrate-fake-migrate"]], "`` Table_class``": [[6, "table-class"]], "`` Sequence_name``": [[6, "sequence-name"]], "`` Trigger_name``": [[6, "trigger-name"]], "`` polymodel``": [[6, "polymodel"]], "`` On_define``": [[6, "on-define"]], "Adicionando atributos para campos e tabelas": [[6, "adding-attributes-to-fields-and-tables"]], "Bancos de dados legados e tabelas com chave": [[6, "legacy-databases-and-keyed-tables"]], "Construtor Field": [[6, "field-constructor"]], "Field types and validators": [[6, "field-types-and-validators"]], "modifica\u00e7\u00e3o da tabela e campo em tempo de execu\u00e7\u00e3o": [[6, "run-time-field-and-table-modification"]], "Mais sobre envios": [[6, "more-on-uploads"]], "Migra\u00e7\u00f5es": [[6, "migrations"]], "Fixa\u00e7\u00e3o migra\u00e7\u00f5es quebrados": [[6, "fixing-broken-migrations"]], "Migra\u00e7\u00e3o resumo controle": [[6, "migration-control-summary"]], "Table methods": [[6, "table-methods"]], "`` Insert``": [[6, "insert"]], "`` Query``, `` Set``, `` Rows``": [[6, "query-set-rows"]], "`` Update_or_insert``": [[6, "update-or-insert"]], "`` Validate_and_insert``, `` validate_and_update``": [[6, "validate-and-insert-validate-and-update"]], "`` Drop``": [[6, "drop"]], "Marca\u00e7\u00e3o de registros": [[6, "tagging-records"]], "Raw SQL": [[6, "raw-sql"]], "`` executesql``": [[6, "executesql"]], "`` _Lastsql``": [[6, "lastsql"]], "Temporiza\u00e7\u00e3o de consultas": [[6, "timing-queries"]], "\u00cdndices": [[6, "indexes"]], "Generating raw SQL": [[6, "generating-raw-sql"]], "`` Comando SELECT``": [[6, "select-command"]], "Usando um seleto para uso de mem\u00f3ria inferior \u00e0 base de iterador": [[6, "using-an-iterator-based-select-for-lower-memory-use"]], "Renderizando Rows com represent": [[6, "rendering-rows-using-represent"]], "Atalhos": [[6, "shortcuts"]], "A obten\u00e7\u00e3o de um `` row``": [[6, "fetching-a-row"]], "Recursivas `` s SELECT``": [[6, "recursive-selects"]], "`` Orderby``, `` groupby``, `` limitby``, `` distinct``, `` having``, `` orderby_on_limitby``, `` join``, `` left``, `` cache``": [[6, "orderby-groupby-limitby-distinct-having-orderby-on-limitby-join-left-cache"]], "ordenar por": [[6, "orderby"]], "groupby, tendo": [[6, "groupby-having"]], "distinto": [[6, "distinct"]], "limitby": [[6, "limitby"]], "orderby_on_limitby": [[6, "orderby-on-limitby"]], "juntar-se, deixou": [[6, "join-left"]], "cache, em cache": [[6, "cache-cacheable"]], "Operadores l\u00f3gicos": [[6, "logical-operators"]], "`` Count``, `` isempty``, `` DELETE``, `` update``": [[6, "count-isempty-delete-update"]], "Express\u00f5es": [[6, "expressions"]], "`` case``": [[6, "case"]], "`` Update_record``": [[6, "update-record"]], "Inserir e atualizar a partir de um dicion\u00e1rio": [[6, "inserting-and-updating-from-a-dictionary"]], "`` `` First`` e last``": [[6, "first-and-last"]], "`` `` As_dict`` e as_list``": [[6, "as-dict-and-as-list"]], "Combinando Rows": [[6, "combining-rows"]], "`` Find``, `` exclude``, `` sort``": [[6, "find-exclude-sort"]], "Selects com cache": [[6, "caching-selects"]], "Computed and Virtual fields": [[6, "computed-and-virtual-fields"]], "Campos computados": [[6, "computed-fields"]], "Campos virtuais": [[6, "virtual-fields"]], "Campos virtuais novo estilo (experimental)": [[6, "new-style-virtual-fields-experimental"]], "Campos virtuais velho antigo": [[6, "old-style-virtual-fields"]], "Joins and Relations": [[6, "joins-and-relations"]], "Um para muitos rela\u00e7\u00e3o": [[6, "one-to-many-relation"]], "Inner join": [[6, "inner-join"]], "Left outer join": [[6, "left-outer-join"]], "Agrupamento e contando": [[6, "grouping-and-counting"]], "Many to many relation": [[6, "many-to-many-relation"]], "A auto-refer\u00eancia e aliases": [[6, "self-reference-and-aliases"]], "Outros operadores": [[6, "other-operators"]], "`` Like``, `` ilike``, `` regexp``, `` startswith``, `` endswith``, `` contains``, `` upper``, `` lower``": [[6, "like-ilike-regexp-startswith-endswith-contains-upper-lower"]], "`` Year``, `` month``, `` day``, `` hour``, `` minutes``, `` seconds``": [[6, "year-month-day-hour-minutes-seconds"]], "`` Belongs``": [[6, "belongs"]], "`` Sum``, `` avg``, `` min``, `` `` max`` e len``": [[6, "sum-avg-min-max-and-len"]], "Substrings": [[6, "substrings"]], "Os valores por defeito com `` `` coalesce`` e coalesce_zero``": [[6, "default-values-with-coalesce-and-coalesce-zero"]], "Exportar e importar dados": [[6, "exporting-and-importing-data"]], "CSV (uma tabela de cada vez)": [[6, "csv-one-table-at-a-time"]], "CSV (todas as tabelas ao mesmo tempo)": [[6, "csv-all-tables-at-once"]], "CSV e sincroniza\u00e7\u00e3o de banco de dados remoto": [[6, "csv-and-remote-database-synchronization"]], "HTML e XML (uma tabela de cada vez)": [[6, "html-and-xml-one-table-at-a-time"]], "Representa\u00e7\u00e3o de dados": [[6, "data-representation"]], "Caracter\u00edsticas avan\u00e7adas": [[6, "advanced-features"]], "`` Lista: `` e `` contains``": [[6, "list-type-and-contains"]], "Heran\u00e7a de tabela": [[6, "table-inheritance"]], "`` `` Filter_in`` e filter_out``": [[6, "filter-in-and-filter-out"]], "retornos de chamada no registro de inser\u00e7\u00e3o, exclus\u00e3o e atualiza\u00e7\u00e3o": [[6, "callbacks-on-record-insert-delete-and-update"]], "Cascades no banco de dados": [[6, "database-cascades"]], "versionamento recorde": [[6, "record-versioning"]], "filtros comuns": [[6, "common-filters"]], "Personalizados `` tipos Field``": [[6, "custom-field-types"]], "Usando DAL sem definir tabelas": [[6, "using-dal-without-define-tables"]], "Transa\u00e7\u00e3o distribu\u00edda": [[6, "distributed-transaction"]], "Copiar dados de um para outro db": [[6, "copy-data-from-one-db-into-another"]], "Pegadinhas": [[6, "gotchas"]], "Nota sobre novo DAL e adaptadores": [[6, "note-on-new-dal-and-adapters"]], "SQLite": [[6, "sqlite"]], "MySQL": [[6, "mysql"]], "Google SQL": [[6, "google-sql"]], "MSSQL (Microsoft SQL Server)": [[6, "mssql-microsoft-sql-server"]], "Or\u00e1culo": [[6, "oracle"]], "Google NoSQL (Datastore)": [[6, "google-nosql-datastore"]], "The RestAPI": [[7, "the-restapi"]], "RestAPI policies and actions": [[7, "restapi-policies-and-actions"]], "RestAPI GET": [[7, "restapi-get"]], "RestAPI practical examples": [[7, "restapi-practical-examples"]], "The RestAPI response": [[7, "the-restapi-response"]], "Linguagem de template YATL": [[8, "yatl-template-language"]], "Sintaxe b\u00e1sica": [[8, "basic-syntax"]], "`` Para \u2026 in``": [[8, "for-in"]], "`` While``": [[8, "while"]], "`` If \u2026 elif \u2026 else``": [[8, "if-elif-else"]], "`` Tentar \u2026 exceto \u2026 else \u2026 finally``": [[8, "try-except-else-finally"]], "`` Def \u2026 return``": [[8, "def-return"]], "Information workflow": [[8, "information-workflow"]], "extend and include": [[8, "extend-and-include"]], "Extending using variables": [[8, "extending-using-variables"]], "Template Functions": [[8, "template-functions"]], "block and super": [[8, "block-and-super"]], "Page layout standard structure": [[8, "page-layout-standard-structure"]], "Default page layout": [[8, "default-page-layout"]], "Mobile development": [[8, "mobile-development"]], "Helpers YATL": [[9, "yatl-helpers"]], "Helpers overview": [[9, "helpers-overview"]], "Built-in helpers": [[9, "built-in-helpers"]], "`` XML``": [[9, "xml"]], "`` A``": [[9, "a"]], "`` BODY``": [[9, "body"]], "`` CAT``": [[9, "cat"]], "`` Div``": [[9, "div"]], "`` EM``": [[9, "em"]], "`` Form``": [[9, "form"]], "`` H1``, `` h2``, `` H3``, `` H4``, `` H5``, `` H6``": [[9, "h1-h2-h3-h4-h5-h6"]], "`` HEAD``": [[9, "head"]], "`` HTML``": [[9, "html"]], "`` I``": [[9, "i"]], "`` IMG``": [[9, "img"]], "`` INPUT``": [[9, "input"]], "`` Label``": [[9, "label"]], "`` LI``": [[9, "li"]], "`` OL``": [[9, "ol"]], "`` OPTION``": [[9, "option"]], "`` P``": [[9, "p"]], "`` PRE``": [[9, "pre"]], "`` SCRIPT``": [[9, "script"]], "`` SELECT``": [[9, "select"]], "`` SPAN``": [[9, "span"]], "`` STYLE``": [[9, "style"]], "`` TABLE``, `` TR``, `` TD``": [[9, "table-tr-td"]], "`` TBODY``": [[9, "tbody"]], "`` TEXTAREA``": [[9, "textarea"]], "`` TH``": [[9, "th"]], "`` THEAD``": [[9, "thead"]], "`` TITLE``": [[9, "title"]], "`` TT``": [[9, "tt"]], "`` UL``": [[9, "ul"]], "`` URL``": [[9, "url"]], "Helpers personalizados": [[9, "custom-helpers"]], "`` TAG``": [[9, "tag"]], "`` BEAUTIFY``": [[9, "beautify"]], "Server-side DOM": [[9, "server-side-dom"]], "children": [[9, "children"]], "find": [[9, "find"]], "Using Inject": [[9, "using-inject"]], "Internacionaliza\u00e7\u00e3o": [[10, "internationalization"]], "Pluralizar": [[10, "pluralize"]], "Atualizar os arquivos de tradu\u00e7\u00e3o": [[10, "update-the-translation-files"]], "Foruml\u00e1rios": [[11, "forms"]], "The Form constructor": [[11, "the-form-constructor"]], "A minimal form example without a database": [[11, "a-minimal-form-example-without-a-database"]], "Basic form example": [[11, "basic-form-example"]], "File upload field": [[11, "file-upload-field"]], "Widgets": [[11, "widgets"]], "Standard widgets": [[11, "standard-widgets"]], "Custom widgets": [[11, "custom-widgets"]], "Advanced form design": [[11, "advanced-form-design"]], "Form structure manipulation": [[11, "form-structure-manipulation"]], "Custom forms": [[11, "custom-forms"]], "The sidecar parameter": [[11, "the-sidecar-parameter"]], "Valida\u00e7\u00e3o de formul\u00e1rio": [[11, "form-validation"]], "Text format validators": [[11, "text-format-validators"]], "IS_ALPHANUMERIC": [[11, "is-alphanumeric"]], "IS_LOWER": [[11, "is-lower"]], "IS_UPPER": [[11, "is-upper"]], "IS_EMAIL": [[11, "is-email"]], "IS_MATCH": [[11, "is-match"]], "IS_LENGTH": [[11, "is-length"]], "IS_URL": [[11, "is-url"]], "IS_SLUG": [[11, "is-slug"]], "IS_JSON": [[11, "is-json"]], "Date and time validators": [[11, "date-and-time-validators"]], "IS_TIME": [[11, "is-time"]], "IS_DATE": [[11, "is-date"]], "IS_DATETIME": [[11, "is-datetime"]], "IS_DATE_IN_RANGE": [[11, "is-date-in-range"]], "IS_DATETIME_IN_RANGE": [[11, "is-datetime-in-range"]], "Range, set and equality validators": [[11, "range-set-and-equality-validators"]], "IS_EQUAL_TO": [[11, "is-equal-to"]], "IS_NOT_EMPTY": [[11, "is-not-empty"]], "IS_NULL_OR": [[11, "is-null-or"]], "IS_EMPTY_OR": [[11, "is-empty-or"]], "IS_EXPR": [[11, "is-expr"]], "IS_DECIMAL_IN_RANGE": [[11, "is-decimal-in-range"]], "IS_FLOAT_IN_RANGE": [[11, "is-float-in-range"]], "IS_INT_IN_RANGE": [[11, "is-int-in-range"]], "IS_IN_SET": [[11, "is-in-set"]], "Checkbox validation": [[11, "checkbox-validation"]], "Dictionaries and tuples with IS_IN_SET": [[11, "dictionaries-and-tuples-with-is-in-set"]], "Sorted options": [[11, "sorted-options"]], "IS_IN_SET and Tagging": [[11, "is-in-set-and-tagging"]], "Complexity and security validators": [[11, "complexity-and-security-validators"]], "IS_STRONG": [[11, "is-strong"]], "CRYPT": [[11, "crypt"]], "Special type validators": [[11, "special-type-validators"]], "IS_LIST_OF": [[11, "is-list-of"]], "IS_LIST_OF_EMAILS": [[11, "is-list-of-emails"]], "ANY_OF": [[11, "any-of"]], "IS_IMAGE": [[11, "is-image"]], "IS_FILE": [[11, "is-file"]], "IS_UPLOAD_FILENAME": [[11, "is-upload-filename"]], "IS_IPV4": [[11, "is-ipv4"]], "IS_IPV6": [[11, "is-ipv6"]], "IS_IPADDRESS": [[11, "is-ipaddress"]], "Other validators": [[11, "other-validators"]], "CLEANUP": [[11, "cleanup"]], "Database validators": [[11, "database-validators"]], "IS_NOT_IN_DB": [[11, "is-not-in-db"]], "IS_IN_DB": [[11, "is-in-db"]], "IS_IN_DB and Tagging": [[11, "is-in-db-and-tagging"]], "Validation functions": [[11, "validation-functions"]], "Authentication and authorization": [[12, "authentication-and-authorization"]], "Authentication using Auth": [[12, "authentication-using-auth"]], "Interface de autentica\u00e7\u00e3o": [[12, "auth-ui"]], "Using Auth inside actions": [[12, "using-auth-inside-actions"]], "Two Factor Authentication": [[12, "two-factor-authentication"]], "two_factor_required": [[12, "two-factor-required"]], "two_factor_send": [[12, "two-factor-send"]], "two_factor_tries": [[12, "two-factor-tries"]], "Plugins de Autentica\u00e7\u00e3o": [[12, "auth-plugins"]], "PAM": [[12, "pam"]], "LDAP": [[12, "ldap"]], "OAuth2 with Google": [[12, "oauth2-with-google"]], "OAuth2 with Facebook": [[12, "oauth2-with-facebook"]], "OAuth2 with Discord": [[12, "oauth2-with-discord"]], "Authorization using Tags": [[12, "authorization-using-tags"]], "Etiquetas e permiss\u00f5es": [[12, "tags-and-permissions"]], "Multiple Tags objects": [[12, "multiple-tags-objects"]], "Rede": [[13, "grid"]], "Key features": [[13, "key-features"]], "Basic grid example": [[13, "basic-grid-example"]], "The Grid object": [[13, "the-grid-object"]], "Searching and filtering": [[13, "searching-and-filtering"]], "CRUD settings": [[13, "crud-settings"]], "Custom columns": [[13, "custom-columns"]], "Usando templates": [[13, "using-templates"]], "Customizing style": [[13, "customizing-style"]], "A\u00e7\u00e3o personalizada Bot\u00f5es": [[13, "custom-action-buttons"]], "Bot\u00e3o Classe A\u00e7\u00e3o Amostra": [[13, "sample-action-button-class"]], "Using callable parameters": [[13, "using-callable-parameters"]], "Os campos de refer\u00eancia": [[13, "reference-fields"]], "De web2py para py4web": [[14, "from-web2py-to-py4web"]], "Simple conversion examples": [[14, "simple-conversion-examples"]], "\u201cHello world\u201d example": [[14, "hello-world-example"]], "\u201cRedirect with variables\u201d example": [[14, "redirect-with-variables-example"]], "\u201cReturning variables\u201d example": [[14, "returning-variables-example"]], "\u201cReturning args\u201d example": [[14, "returning-args-example"]], "\u201cReturn calling methods\u201d example": [[14, "return-calling-methods-example"]], "\u201cSetting up a counter\u201d example": [[14, "setting-up-a-counter-example"]], "\u201cView\u201d example": [[14, "view-example"]], "\u201cForm and flash\u201d example": [[14, "form-and-flash-example"]], "\u201cgrid\u201d example": [[14, "grid-example"]], "\u201cAccessing OS files\u201d example": [[14, "accessing-os-files-example"]], "\u201cauth\u201d example": [[14, "auth-example"]], "Advanced topics and examples": [[15, "advanced-topics-and-examples"]], "py4web and asyncio": [[15, "py4web-and-asyncio"]], "htmx": [[15, "htmx"]], "htmx usage in Form": [[15, "htmx-usage-in-form"]], "htmx usage in Grid": [[15, "htmx-usage-in-grid"]], "Autocomplete Widget using htmx": [[15, "autocomplete-widget-using-htmx"]], "utils.js": [[15, "utils-js"]], "string.format": [[15, "string-format"]], "The Q object": [[15, "the-q-object"]], "The T object": [[15, "the-t-object"]], "py4web: o manual de refer\u00eancia": [[16, "py4web-the-reference-manual"]], "Conte\u00fado:": [[16, null]], "\u00cdndices e tabelas": [[16, "indices-and-tables"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["chapter-01", "chapter-02", "chapter-03", "chapter-04", "chapter-05", "chapter-06", "chapter-07", "chapter-08", "chapter-09", "chapter-10", "chapter-11", "chapter-12", "chapter-13", "chapter-14", "chapter-15", "chapter-16", "index"], "filenames": ["chapter-01.rst", "chapter-02.rst", "chapter-03.rst", "chapter-04.rst", "chapter-05.rst", "chapter-06.rst", "chapter-07.rst", "chapter-08.rst", "chapter-09.rst", "chapter-10.rst", "chapter-11.rst", "chapter-12.rst", "chapter-13.rst", "chapter-14.rst", "chapter-15.rst", "chapter-16.rst", "index.rst"], "titles": ["O que \u00e9 py4web?", "Ajuda, recursos e dicas", "Instala\u00e7\u00e3o e coloca\u00e7\u00e3o em funcionamento", "O Dashboard", "Criando seu primeiro aplicativo", "Fixures", "The Database Abstraction Layer (DAL)", "The RestAPI", "Linguagem de template YATL", "Helpers YATL", "Internacionaliza\u00e7\u00e3o", "Foruml\u00e1rios", "Authentication and authorization", "Rede", "De web2py para py4web", "Advanced topics and examples", "py4web: o manual de refer\u00eancia"], "terms": {"is": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "web": [0, 1, 2, 5, 6, 8, 12, 13, 14, 15, 16], "framework": [0, 2, 11, 12, 13, 14, 15], "rapid": [0, 11, 15], "development": [0, 1, 4, 6], "of": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "efficient": 0, "databas": [0, 1, 3, 4, 7, 12, 13, 14, 15, 16], "driven": 0, "applications": [0, 2, 3, 4, 6, 11, 12, 13], "it": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "evolution": 0, "the": [0, 3, 8, 9, 10, 12, 14, 16], "popul": [0, 6], "web2py": [0, 1, 2, 3, 4, 6, 11, 12, 13, 16], "but": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "much": [0, 1, 5, 6, 8, 11, 13, 14, 15], "fast": [0, 4, 6, 8, 14, 15], "and": [0, 1, 2, 3, 4, 5, 9, 16], "slick": 0, "its": [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "internal": [0, 1, 8, 12], "design": [0, 12, 15, 16], "has": [0, 2, 4, 5, 6, 8, 11, 12, 13, 14, 15], "been": [0, 2, 5, 6, 8, 11], "simplified": [0, 4, 8], "compared": 0, "to": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "be": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "seen": [0, 5, 7, 9, 11, 13, 15], "competitor": 0, "other": [0, 1, 2, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15], "frameworks": [0, 2, 5, 14, 15], "lik": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "djang": [0, 1, 14], "or": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "flask": [0, 14], "indeed": [0, 5], "serv": [0, 2, 3, 4, 7, 8, 12, 14, 15, 16], "sam": [0, 2, 5, 6, 7, 8, 11, 12, 14, 15], "purpos": [0, 4, 6, 9, 11, 12, 14], "yet": [0, 2, 4, 5, 8, 11, 15], "aims": 0, "provid": [0, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "larg": [0, 11], "featur": [0, 4, 6, 7, 8, 14, 16], "set": [0, 2, 5, 7, 8, 9, 10, 13, 14, 15], "out": [0, 1, 5, 8, 11, 15], "box": [0, 6, 11], "reduc": [0, 15], "tim": [0, 4, 5, 6, 8, 13, 14, 15], "new": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "apps": [0, 1, 2, 3, 4, 5, 6, 8, 12, 14], "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "historical": 0, "perspectiv": 0, "our": [0, 1, 2, 5, 6, 9, 11, 15], "story": 0, "starts": [0, 3, 5, 8, 14], "in": [0, 1, 2, 3, 4, 6, 7, 10, 11, 12, 13, 14, 16], "2007": 0, "when": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "was": [0, 5, 6, 11, 12], "first": [0, 2, 3, 5, 7, 8, 9, 11, 12, 13, 14, 15], "released": 0, "designed": [0, 4, 6, 8, 11], "all": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "inclusiv": [0, 11], "solution": [0, 15], "one": [0, 2, 4, 5, 6, 7, 8, 11, 12, 13, 15], "zip": [0, 2, 6, 11], "fil": [0, 1, 2, 3, 5, 6, 8, 9, 10, 12, 13, 15, 16], "containing": [0, 2, 5, 11, 12, 13, 15], "python": [0, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "interpret": [0, 6], "based": [0, 3, 4, 5, 7, 8, 11, 12, 13, 14, 15], "ide": [0, 1, 2, 3, 6], "collection": [0, 14], "battl": 0, "tested": [0, 2, 9, 12], "packag": [0, 6, 9], "that": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "work": [0, 2, 4, 5, 6, 8, 9, 11, 15], "well": [0, 5, 6, 8, 11, 12, 15], "togeth": [0, 8], "many": [0, 1, 2, 4, 5, 7, 8, 11, 13, 14, 15], "ways": [0, 4, 6, 12, 13, 15], "immensely": 0, "successful": [0, 12], "succeeded": 0, "providing": [0, 13, 14], "low": [0, 11], "barri": 0, "entry": [0, 6, 14], "developers": [0, 1, 6, 12, 15], "very": [0, 4, 8, 9, 11, 12, 14], "secur": [0, 11], "platform": [0, 1], "remains": 0, "backwards": [0, 11], "compatibl": [0, 1, 9, 11], "until": [0, 5, 6, 8, 11], "today": [0, 11, 15], "always": [0, 2, 4, 5, 6, 11, 15], "suffered": 0, "probl": [0, 6, 8, 13], "monolithic": 0, "most": [0, 4, 5, 6, 11, 12, 13, 14, 15], "experienced": 0, "did": [0, 4, 15], "not": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15], "understand": [0, 2, 4, 6, 7, 8], "how": [0, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15], "use": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "components": [0, 3, 9, 11, 15], "outsid": [0, 5, 6, 11, 13, 14, 15], "third": [0, 5, 11], "party": [0, 5], "within": [0, 1, 5, 6, 8, 9, 11, 15], "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "thought": [0, 6, 12], "perfect": 0, "tool": 0, "hav": [0, 1, 2, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "broken": [0, 6, 11], "into": [0, 2, 4, 5, 6, 8, 9, 11, 14, 15], "piec": [0, 11], "becaus": [0, 4, 5, 6, 8, 9, 11, 13, 15], "would": [0, 5, 6, 9, 11, 15], "compromis": 0, "security": [0, 7, 12], "turned": 0, "wer": [0, 4], "wrong": [0, 5, 6], "playing": 0, "with": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 15], "others": [0, 6, 14], "important": [0, 2, 4, 5, 6, 11, 12], "henc": [0, 2, 5, 6, 11], "sinc": [0, 2, 4, 5, 7, 8, 11, 13, 14], "2015": 0, "worked": 0, "on": [0, 1, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15], "thre": [0, 5, 6], "fronts": 0, "N\u00f3s": [0, 1, 5], "port": [0, 2, 3, 5, 6, 14], "par": [0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 15, 16], "3": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "quebr": 0, "m\u00f3dul": [0, 1, 2, 5, 6], "pod": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13], "ser": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13], "usad": [0, 4, 6, 9, 10, 12, 13], "form": [0, 2, 4, 5, 6, 7, 10, 12, 13, 16], "independent": [0, 5, 6, 12], "reagrup": 0, "alguns": [0, 2, 4, 5, 6, 7, 8, 9], "dess": [0, 5, 6, 12], "nov": [0, 1, 2, 3, 4, 13], "modul": [0, 2, 4, 6, 8, 9, 11, 12, 13, 14], "quadr": [0, 1, 6], "mor": [0, 2, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15], "than": [0, 5, 6, 8, 9, 11, 12, 13, 15], "repackaging": 0, "complet": [0, 2, 6, 9, 11, 13], "redesign": 0, "uses": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "som": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 14], "them": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14], "cas": [0, 1, 2, 3, 4, 5, 8, 9, 11, 12, 13, 14, 15], "bett": [0, 1, 2, 4, 6, 13, 14], "functionality": [0, 8, 14], "removed": [0, 6, 9, 11], "added": [0, 2, 5, 11, 12, 15], "tried": 0, "preserv": [0, 5], "syntax": [0, 1, 4, 5, 6, 7, 8, 9, 11, 14, 15], "users": [0, 1, 4, 5, 12, 14], "loved": 0, "her": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15], "explicit": [0, 2, 4, 5, 6, 8, 11], "list": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 15], "see": [0, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15], "De": [0, 1, 4, 6, 16], "details": [0, 1, 5, 6, 7, 8, 11, 13], "if": [0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "come": [0, 5], "contr\u00e1ri": [0, 4, 6, 8], "requ": [0, 2, 5, 6, 11, 12, 13, 14, 15], "unlik": [0, 2, 7, 8, 14, 15], "installed": [0, 1, 2, 3, 4, 5, 6], "using": [0, 1, 3, 4, 6, 7, 11, 14, 16], "pip": [0, 1, 6], "dependenc": [0, 2, 5, 14], "are": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "managed": 0, "requirements": [0, 2, 11], "txt": [0, 2, 4, 6], "regul": [0, 2, 4, 6, 7, 8, 10, 11, 13, 14, 15], "this": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "different": [0, 2, 5, 6, 8, 11, 12, 14, 15], "particul": [0, 1, 6, 11, 13, 14, 15], "ditched": 0, "custom": [0, 4, 6, 8, 9, 14, 15, 16], "import": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "rely": [0, 4, 6], "now": [0, 4, 5, 6, 11, 13, 15], "exclusively": [0, 5, 6], "mechanism": [0, 6, 8, 9, 12, 14], "m\u00faltipl": [0, 6], "aplic": [0, 2, 3, 5, 13, 14, 16], "concorrent": 0, "enquant": [0, 6, 8], "s\u00e3": [0, 1, 3, 4, 5, 6, 8, 9, 10, 12, 13], "subm\u00f3dul": 0, "ombott": [0, 4, 14], "reduced": 0, "spin": [0, 4], "off": [0, 2, 4, 13, 15], "bottl": [0, 4, 5, 8, 14], "request": [0, 1, 2, 5, 6, 7, 11, 12, 13, 14, 15], "object": [0, 4, 5, 6, 7, 8, 9, 11, 12, 14, 16], "routing": [0, 4, 14], "does": [0, 2, 5, 6, 8, 11, 12, 13, 14, 15], "creat": [0, 1, 2, 4, 5, 6, 8, 11, 12, 13, 15], "environment": [0, 1, 4, 5, 6], "at": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "every": [0, 5, 6, 12, 13, 14, 15], "introduc": 0, "concept": [0, 12], "fixtur": [0, 2, 6, 9, 14, 16], "explicitly": [0, 2, 5, 6, 8, 9, 11], "declar": [0, 4, 5, 6, 8], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "objects": [0, 4, 5, 6, 9, 11, 13, 14, 15], "need": [0, 1, 2, 5, 6, 8, 9, 11, 12, 13, 14, 15], "re": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "initialized": 0, "http": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "arriv": [0, 6], "needs": [0, 4, 5, 6, 12, 14, 15], "cleanup": 0, "completed": [0, 6], "mak": [0, 1, 2, 5, 6, 8, 9, 11, 12, 13, 14, 15], "session": [0, 2, 4, 6, 9, 11, 12, 13, 14, 15, 16], "s": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15], "strong": [0, 9, 12], "encryption": 0, "dat": [0, 2, 5, 6, 7, 8, 9, 12, 13, 14, 15], "sessions": [0, 6, 14], "long": [0, 6, 11], "stored": [0, 5, 6, 11, 12, 14, 15], "system": [0, 2, 5, 6, 9, 12, 15], "created": [0, 2, 4, 5, 6, 8, 11, 12], "performanc": [0, 5, 6, 14], "issu": [0, 6], "cooki": [0, 4, 6, 15], "red": [0, 3, 4, 6, 8, 9, 11, 16], "memcach": [0, 6], "optionally": [0, 2], "also": [0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "limited": [0, 5, 14, 15], "json": [0, 1, 2, 4, 5, 6, 7, 10, 11, 14, 15], "serializabl": [0, 5, 6], "built": [0, 1, 4, 6, 8, 11, 15, 16], "sistem": [0, 2, 5, 6], "bilh\u00e9t": 0, "global": [0, 6, 14, 15], "n\u00e3": [0, 1, 2, 3, 4, 5, 6, 8, 9, 12, 13], "Os": [0, 3, 4, 8, 9, 12, 16], "bilhet": [0, 3, 6], "armazen": [0, 2, 5, 6, 9], "arquiv": [0, 2, 3, 4, 5, 6, 12, 16], "individu": [0, 2, 5, 6], "Eles": [0, 4, 6], "\u00fanic": [0, 2, 6, 9], "banc": [0, 1, 3, 4, 5, 12], "dad": [0, 1, 3, 4, 5, 12, 16], "pydal": [0, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15], "leverag": 0, "restap": [0, 3, 16], "usa": [0, 4, 5, 6, 8], "linguag": [0, 4, 5, 16], "templat": [0, 4, 9, 11, 12, 14, 15, 16], "yatl": [0, 4, 5, 6, 11, 13, 15, 16], "padr\u00e3": [0, 2, 4, 5, 8, 9, 13], "suport": [0, 10, 16], "delimit": [0, 6, 8], "evit": [0, 1, 2, 6, 8, 11], "conflit": [0, 2, 4, 6], "model": [0, 3, 7, 9, 14, 15], "js": [0, 4, 5, 8, 10, 14, 16], "vue": [0, 4, 15], "angularjs": 0, "inclu": [0, 4, 6, 8, 9, 13], "subconjunt": [0, 6], "ajud": [0, 2, 4, 6, 14, 16], "bibliotec": [0, 4, 10], "pluraliz": [0, 4, 5, 13, 15, 16], "internacionaliz": [0, 4, 16], "Na": 0, "pr\u00e1tic": [0, 6, 7], "exp\u00f5": [0, 3, 4, 6, 12], "objet": [0, 5, 6, 8, 9, 10], "t": [0, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14], "muit": [0, 1, 2, 4, 5], "semelh": [0, 4, 5, 6, 9], "fornec": [0, 2, 3, 4, 5, 6, 9, 12, 13], "melhor": [0, 1, 6, 10, 13, 16], "cach": [0, 2, 4, 5, 11], "capac": 0, "flex\u00edv": 0, "vem": [0, 4, 6], "painel": [0, 2, 3], "app": [0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "administr": [0, 2, 6], "substitu": [0, 2, 6, 8, 9], "Esta": [0, 1, 2, 4, 6], "carreg": [0, 6], "gest\u00e3": [0, 1], "edi\u00e7\u00e3": 0, "interfac": [0, 3, 5, 6, 13, 14, 15], "bas": [0, 2, 4, 8, 13, 15], "Isto": [0, 2, 3, 4, 5, 6, 9, 13], "funcional": [0, 2, 5, 6], "appadmin": [0, 6], "comes": [0, 5, 8, 11, 12, 13, 14, 15], "grid": [0, 16], "simil": [0, 11, 14], "sqlform": [0, 11, 14], "auth": [0, 2, 4, 6, 8, 9, 15, 16], "f\u00e1cil": [0, 6, 8, 9, 12], "estend": [0, 5, 6], "Fora": 0, "caix": [0, 6, 9], "b\u00e1sic": [0, 1, 6, 16], "regist": [0, 4, 5, 6, 8, 12, 13, 14], "login": [0, 2, 3, 4, 5, 6, 8, 11, 12, 14], "logout": [0, 8, 12], "alter": [0, 2, 4, 5, 6, 10], "senh": [0, 2, 3, 5, 6, 12], "solicit": [0, 6], "edit": [0, 2, 3, 4, 8, 11, 12, 13, 14, 15], "perfil": [0, 12], "bem": [0, 4, 5, 6, 12], "integr": 0, "pam": [0, 5], "saml2": 0, "ldap": [0, 5], "oauth2": [0, 5], "googl": [0, 3, 5, 8, 11, 13], "facebook": [0, 5], "twitt": [0, 5, 12], "tags": [0, 5, 6, 8, 9, 14, 15, 16], "tag": [0, 6, 7, 8, 12, 14, 15], "groups": [0, 1, 3, 5, 12, 14], "search": [0, 6, 11, 12, 13, 16], "by": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "apply": [0, 5, 11, 12, 13], "permissions": [0, 5, 6, 12, 14], "membership": [0, 5, 11, 12, 14], "component": [0, 4, 5, 8, 9, 11, 12, 15], "personaliz": [0, 2, 16], "projet": [0, 2], "interag": 0, "geral": [0, 2, 6, 7, 9], "Essas": 0, "apis": [0, 6, 12, 14], "permit": [0, 3, 5, 6, 8, 9, 12, 13], "servidor": [0, 4, 5, 6], "defin": [0, 4, 5, 8, 9, 11, 13, 15], "pol\u00edt": 0, "sobr": [0, 8], "qua": [0, 6], "oper": [0, 3, 10, 16], "client": [0, 7, 11, 12, 15], "execut": [0, 2, 3, 6, 11], "d\u00e1": [0, 2, 13], "flexibil": [0, 2, 13], "dentr": [0, 2, 4, 6, 13], "restri\u00e7\u00f5": [0, 6], "dois": [0, 5, 6, 8], "princip": 0, "mtabl": 0, "grad": 0, "api": [0, 6, 7, 9, 11, 12, 15], "continu": [0, 6, 8, 15], "mesm": [0, 1, 2, 4, 5, 8, 9, 10, 13], "desenvolv": 0, "acess": [0, 2, 4, 5, 6], "produ\u00e7\u00e3": 0, "r\u00e1p": [0, 6], "segur": [0, 5], "thanks": 0, "everyon": [0, 1], "who": [0, 12], "contributed": 0, "project": [0, 2, 4, 5, 6], "especially": [0, 2, 5, 11, 12], "massim": [0, 6], "di": [0, 5], "pierr": 0, "luc": [0, 1], "alfar": [0, 1], "cassi": 0, "botar": 0, "dan": 0, "carroll": 0, "jim": [0, 1, 13], "steil": [0, 1, 13], "john": [0, 6], "m": [0, 2, 6, 9, 11], "wolf": 0, "micah": 0, "beasley": 0, "nic": [0, 15], "zanferrar": 0, "pirsch": 0, "sugiz": 0, "valq7711": [0, 4], "kevin": 0, "kell": 0, "log": [0, 2, 4, 5, 6, 8, 9, 12, 14, 15], "special": [0, 5, 6, 8, 12, 14, 16], "official": [0, 11, 15], "friendly": [0, 5, 8], "call": [0, 5, 6, 8, 11, 12, 15], "axel": 0, "axolotl": 0, "magically": 0, "represents": [0, 6], "sens": [0, 11], "kindness": 0, "inclusion": 0, "believ": [0, 5], "cornerston": 0, "growing": [0, 15], "community": [0, 6], "fiz": 1, "noss": [1, 4, 5, 6], "torn": [1, 2, 5, 6, 9, 13], "simpl": [1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16], "limp": 1, "Mas": [1, 4, 6], "voc": [1, 2, 3, 4, 5, 6, 8, 9, 12, 13], "sab": [1, 2, 6, 8], "program": [1, 3, 6, 8], "\u00e9": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16], "taref": [1, 5, 6, 12], "dif\u00edcil": [1, 2], "Ela": [1, 6, 8], "exig": [1, 2, 6, 12], "ment": [1, 6], "abert": [1, 3, 6], "capaz": [1, 2], "salt": [1, 11], "frequ\u00eanc": 1, "perd": [1, 2, 6], "html": [1, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15], "javascript": [1, 4, 7, 9, 15], "css": [1, 4, 5, 8, 9, 11, 12, 13, 15], "tenh": [1, 5, 6], "med": 1, "nest": [1, 6, 8, 9], "vam": [1, 2, 6, 9], "lo": [1, 2, 3, 4, 6, 7, 8, 9], "lad": [1, 2, 5, 6], "jorn": 1, "E": [1, 6, 12], "outr": [1, 2, 4, 5, 9, 10, 12, 13, 16], "valios": 1, "mostr": [1, 4, 6, 13], "referenc": [1, 6, 7, 8, 9, 11, 13], "availabl": [1, 2, 6, 8, 9, 12, 14, 15], "onlin": [1, 6], "https": [1, 3, 4, 5, 7, 8, 11, 12, 13, 15], "_documentation": [1, 3], "static": [1, 4, 8, 9, 14], "index": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "wher": [1, 2, 4, 6, 8, 11, 12, 14, 15], "ll": [1, 2, 3, 5, 6, 8, 11, 13, 15], "find": [1, 2, 4, 11, 12, 13], "pdf": [1, 11], "ebook": 1, "version": [1, 3, 7, 8, 11, 15], "multipl": [1, 2, 6, 8, 9, 11, 14, 15, 16], "languag": [1, 4, 5, 8, 10, 14, 15], "written": [1, 8, 11, 13], "restructuredtext": 1, "generated": [1, 5, 6, 8, 11, 13, 15], "sphinx": 1, "exist": [1, 2, 4, 5, 6, 8, 11, 15], "discuss\u00e3": 1, "dedic": [1, 4, 14], "hosped": 1, "consult": [1, 7, 12, 13], "g": [1, 6, 9, 11], "principal": [1, 5, 6, 16], "discuss\u00f5": 1, "desenvolvedor": [1, 8, 12, 13], "usu\u00e1ri": [1, 2, 3, 4, 5, 6, 12, 14], "qualqu": [1, 2, 4, 5, 6, 7, 8, 12], "problem": [1, 6], "dev": [1, 2, 3, 4, 5, 6, 8, 9, 12, 13], "enfrent": [1, 6], "lug": [1, 5, 6], "cert": [1, 2, 6, 13], "procur": [1, 6], "solu\u00e7\u00e3": [1, 2, 6], "For": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15], "quick": [1, 11], "questions": [1, 2], "chats": 1, "fre": [1, 5, 12], "dedicated": [1, 5, 9], "could": [1, 2, 4, 6, 8, 9, 11, 12, 14], "usually": [1, 5, 7, 11], "hanging": 1, "channel": 1, "ther": [1, 2, 5, 6, 8, 11, 12, 13, 14, 15], "tutorials": 1, "vid": [1, 2, 15], "learn": [1, 6], "sit": [1, 2, 4, 5, 6, 9, 13, 15], "lots": 1, "excellent": [1, 13], "training": 1, "cours": [1, 8], "2020": 1, "uc": 1, "sant": 1, "cruz": [1, 6], "blog": [1, 6, 9], "andrew": 1, "gavgavian": 1, "replicat": [1, 5], "famous": 1, "corey": 1, "schaf": 1, "tutorial": [1, 2, 4, 13, 15], "seri": 1, "creating": [1, 2, 6, 12, 14], "south": 1, "breez": 1, "enterpris": [1, 12], "dem": [1, 2, 15], "around": [1, 14], "structur": [1, 4, 6, 12, 13, 14, 16], "microsoft": [1, 12], "northwind": 1, "converted": [1, 6, 11], "sqlit": [1, 4, 5, 7, 11, 12, 13], "view": [1, 5, 6], "final": [1, 2, 5, 6, 10], "result": [1, 4, 6, 7, 8, 11, 13, 15], "last": [1, 5, 8, 11, 12, 13, 15], "least": [1, 2, 11, 14, 15], "open": [1, 2, 4, 5, 6, 9], "sourc": [1, 2, 3, 4, 6, 11], "bsd": 1, "v3": 1, "licens": 1, "hosted": 1, "means": [1, 3, 5, 6, 8, 11, 12, 14], "read": [1, 4, 5, 6, 7, 13, 15], "study": 1, "experiment": [1, 11], "yourself": [1, 11], "par\u00e1graf": [1, 9], "prelimin": 1, "\u00fate": [1, 6], "antes": [1, 6, 8, 9, 12, 13], "comec": [1, 2, 4, 6], "aprend": 1, "A": [1, 2, 4, 5, 7, 8, 10, 12, 13, 14, 15, 16], "fim": [1, 2, 5, 6], "compreend": [1, 13], "precis": [1, 2, 4, 5, 6, 13], "pel": [1, 4, 5, 6, 8, 9, 10, 12], "men": [1, 2, 5, 6], "conhec": [1, 6], "H\u00e1": [1, 5, 6, 13], "livr": [1, 6], "curs": 1, "dispon\u00edv": 1, "escolh": [1, 4, 6], "decor": [1, 4, 16], "marc": [1, 6, 9, 12], "total": [1, 6, 7], "following": [1, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "chapters": [1, 5], "will": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "start": [1, 2, 3, 4, 5, 6, 9, 11, 12, 13], "coding": 1, "your": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "comput": 1, "suggest": [1, 11], "setup": [1, 3, 4, 12, 15], "workplac": 1, "plan": [1, 15], "efficiently": [1, 14], "safely": [1, 13], "even": [1, 4, 5, 6, 8, 9, 11, 13, 14], "running": [1, 2, 5], "exampl": [1, 2, 4, 5, 6, 8, 9, 10, 12, 16], "experimenting": 1, "littl": [1, 5, 6], "strongly": [1, 5, 11, 13], "integrated": 1, "programming": [1, 6, 8, 15], "experienc": [1, 12], "allowing": [1, 11], "checking": [1, 11, 12, 14], "linting": 1, "visual": 1, "debugging": [1, 4], "nowadays": 1, "two": [1, 2, 4, 5, 6, 8, 11, 13, 14, 15], "mult": [1, 2, 6, 14], "main": [1, 2, 3, 4, 6, 8, 13, 14, 15], "choic": [1, 11, 13], "studi": 1, "cod": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "aka": 1, "jetbrains": 1, "quand": [1, 4, 6, 8, 13], "vai": [1, 4, 6, 8], "lid": [1, 4, 5, 6, 13], "complex": [1, 2, 4, 5, 6, 8, 9, 12, 14, 15], "confiabil": 1, "necess": [1, 2, 4, 5, 6, 8], "suger": [1, 6], "usar": [1, 2, 4, 5, 6, 8, 9, 13], "ambient": [1, 2], "virtu": 1, "cham": [1, 2, 4, 5, 7, 8, 10, 13], "virtualenv": [1, 2], "vej": [1, 2, 3], "aqu": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "docs": [1, 2, 4], "org": [1, 2, 4, 7, 9, 15], "7": [1, 2, 7, 8, 11, 14], "venv": [1, 2], "__": [1, 2, 4], "introdu": [1, 2], "Em": [1, 2, 5, 6, 8, 9], "confus": [1, 6], "git": [1, 2], "keep": [1, 2, 4, 5, 6, 7, 8, 9, 11, 14], "track": [1, 14], "progr": [1, 2, 3, 9], "chang": [1, 2, 3, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16], "sav": [1, 5, 6, 10, 11], "saf": [1, 6, 11, 13, 14], "plac": [1, 5, 6, 8, 11, 13, 15], "gitlat": 1, "bitbucket": 1, "editor": [1, 8], "highlighting": [1, 8], "highly": [1, 13], "recommend": [1, 5], "quit": [1, 5, 7, 8, 11, 13], "run": [1, 3, 4, 6, 8, 12], "debug": [1, 2, 5, 6, 8], "just": [1, 2, 4, 5, 6, 7, 8, 11, 13, 15], "fold": [1, 2, 3, 4, 5, 6, 7, 10, 11, 13, 14], "add": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "args": [1, 2, 6], "your_full_path_to_py4web": 1, "py": [1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15], "launch": [1, 2], "configuration": 1, "windows": [1, 2, 4, 6], "paramet": [1, 2, 4, 5, 6, 12, 13, 15], "must": [1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 14], "forward": 1, "slash": [1, 4, 5, 12], "only": [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "c": [1, 2, 3, 5, 6, 8, 9, 11, 14], "your_nam": [1, 15], "instead": [1, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "copy": [1, 3, 4, 6, 13], "standard": [1, 2, 3, 6, 7, 12, 13, 14, 15, 16], "insid": [1, 2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "renam": 1, "order": [1, 2, 4, 5, 6, 7, 9, 11, 13, 14], "avoid": [1, 2, 5, 6, 11], "errors": [1, 5, 6, 7, 11, 14], "lat": [1, 2, 4, 5, 6, 8, 9, 11, 13], "usr": 1, "bin": [1, 2], "env": [1, 14], "python3": [1, 2], "cor": [1, 2, 4, 5, 11], "cli": [1, 2], "both": [1, 5, 6, 8, 11, 14], "should": [1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "get": [1, 2, 4, 5, 6, 8, 11, 12, 13, 14, 15, 16], "gevent": [1, 2], "tru": [1, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "enabl": [1, 5, 7, 9, 12, 14, 15], "settings": [1, 4, 5, 6, 9, 12, 14], "build": [1, 2, 4, 5, 9, 13, 15], "execution": 1, "deployment": 1, "debugg": 1, "help": [1, 2, 5, 6, 7, 8, 9, 11, 13, 14], "support": [1, 2, 6, 11, 14], "efforts": 1, "participat": 1, "group": [1, 3, 5, 12, 14], "trying": [1, 12], "answer": 1, "submit": [1, 5, 6, 9, 11, 13], "bugs": 1, "pull": 1, "requests": [1, 4, 5, 14], "repository": [1, 2, 3], "Se": [1, 2, 3, 4, 6, 8, 9, 13], "desej": [1, 2, 5, 6, 12, 13], "corrig": 1, "ampli": 1, "traduz": [1, 6, 8, 10], "l\u00edngu": 1, "estrangeir": [1, 13], "ler": [1, 6], "tod": [1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 15], "inform": [1, 4, 5, 6, 11], "necess\u00e1r": [1, 5, 6], "diret": [1, 5, 6, 8], "readm": [1, 4, 11], "espec\u00edf": [1, 2, 6], "blob": [1, 6], "mast": [1, 2, 13], "md": [1, 4], "really": [1, 4], "rst": 1, "doc": 1, "brows": [1, 2, 3, 5, 7, 8, 13, 15], "once": [1, 2, 5, 6, 11, 12, 15], "pr": 1, "accepted": [1, 6, 11, 14, 15], "branch": [1, 2], "reflected": 1, "pag": [1, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16], "epub": 1, "next": [1, 5, 6, 8, 11], "output": [1, 5, 8, 11, 15], "generation": 1, "befor": [2, 5, 6, 8, 11, 12, 13], "everything": [2, 4, 14], "else": [2, 4, 6, 11, 12, 13, 14, 15], "imported": [2, 11, 12, 14], "charg": [2, 14], "starting": [2, 4, 6, 11], "reason": [2, 5, 6, 13, 14], "things": [2, 5, 6], "py4web": [2, 3, 4, 5, 7, 8, 9, 11, 12, 13], "download": 2, "pypi": 2, "github": [2, 3, 4, 6, 13], "folders": 2, "collections": 2, "want": [2, 4, 5, 6, 8, 11, 15], "command": [2, 4, 6, 8], "lin": [2, 4, 5, 7, 8, 9, 11, 12, 13, 15], "options": [2, 6, 7, 9, 12, 14, 15], "initializ": 2, "existing": [2, 5, 6, 11], "scaffolding": [2, 4, 5, 6, 8, 14, 15], "under": [2, 3, 4, 5, 6, 11], "concurrently": [2, 11], "served": [2, 6], "process": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "address": [2, 11, 12], "each": [2, 5, 6, 7, 8, 9, 11, 12, 13, 14], "runs": [2, 4, 12, 14], "fin": [2, 12, 13], "mac": [2, 6], "linux": 2, "prerequisit": [2, 5], "advanc": [2, 12, 13], "except": [2, 5, 6, 8, 9, 11, 12, 15], "binari": 2, "quatr": 2, "altern": [2, 6], "diferent": [2, 5, 6, 10, 13], "n\u00edv": 2, "dificuldad": 2, "olhar": 2, "pr\u00f3s": 2, "contr": [2, 6], "real": [2, 4, 7, 8, 11], "porqu": [2, 4, 5, 6, 8, 10], "acab": [2, 6], "copi": 2, "mont": [2, 12], "modific": [2, 4], "maneir": [2, 5, 6, 13], "da\u00ed": 2, "especial": [2, 4, 6, 10], "inic": [2, 4], "alun": 2, "direit": [2, 3, 6], "Por": [2, 3, 4, 5, 6, 9], "experimental": [2, 5], "cont": [2, 5, 9, 10, 12], "liber": 2, "idad": 2, "adicion": [2, 5, 10, 11, 12, 13], "us\u00e1": [2, 6, 8], "faz": [2, 5, 8, 9, 11, 12], "recent": [2, 3, 6, 11, 13], "reposit\u00f3ri": 2, "extern": 2, "nicozanf": 2, "pyinstall": 2, "descompact": 2, "past": [2, 4], "abrir": 2, "l\u00e1": [2, 4], "Com": [2, 6], "tip": [2, 4, 13], "lembr": [2, 3, 6, 8, 11], "sempr": [2, 6, 8], "vez": [2, 4, 5, 8, 9, 12, 13], "seguint": [2, 4, 5, 6, 8, 9, 10, 11, 12, 13], "document": [2, 6, 8, 9, 11, 15], "notic": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "correspond": [2, 4, 6, 10], "latest": [2, 6, 14], "stabl": 2, "although": [2, 8, 11], "best": [2, 5, 6], "up": [2, 5, 6, 8, 12, 15], "installation": 2, "procedur": 2, "quickly": [2, 11, 13], "install": [2, 6, 12], "releas": 2, "upgrad": [2, 6], "dir": [2, 11, 15], "user": [2, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16], "try": [2, 5, 6, 8, 11, 12], "specify": [2, 4, 5, 6, 7, 11, 12, 13], "full": [2, 4, 6, 8, 11, 15], "8": [2, 6, 7, 11], "ir\u00e1": [2, 3, 4, 6, 8, 12, 13], "dependent": [2, 3, 4, 5], "caminh": [2, 4, 6, 13], "ativ": [2, 6], "cont\u00e9m": [2, 4, 5, 6], "cri": [2, 3, 5, 6, 8, 9, 12, 13, 16], "ap\u00f3s": [2, 6, 13], "trabalh": [2, 4, 6, 7], "aceit": [2, 6, 10, 11], "signif": [2, 5, 6, 7], "No": [2, 5, 6, 8, 13], "exe": 2, "apont": [2, 6], "digit": [2, 11, 12], "engan": 2, "indesej": [2, 6], "bom": 2, "h\u00e1bit": 2, "Este": [2, 6, 8, 9, 13, 14], "recurs": [2, 8, 16], "aind": [2, 6, 12], "moment": [2, 6], "descobert": [2, 10], "instructions": [2, 11], "activating": 2, "activat": [2, 12], "without": [2, 6, 8, 9, 12, 15, 16], "traditional": 2, "way": [2, 3, 5, 6, 8, 9, 11, 12, 14], "works": [2, 8, 11, 12, 13, 14, 15], "normally": [2, 6, 8, 9, 11, 13], "utility": [2, 11], "path": [2, 4, 5, 6, 7, 10, 11, 13, 14, 15], "along": [2, 4, 9, 11, 15], "links": [2, 6, 13, 15], "clon": [2, 4, 6, 15], "cd": 2, "assets": 2, "test": [2, 6, 8, 9, 11, 13], "content": [2, 4, 5, 6, 8, 9, 11, 13, 14, 15], "missing": [2, 12, 13], "manually": [2, 4, 6, 9, 12, 13], "upgraded": 2, "itself": [2, 6, 11, 15], "copied": 2, "useful": [2, 4, 8, 9, 11, 13, 15], "already": [2, 4, 5, 9, 11, 12, 13], "working": [2, 11], "locally": 2, "globally": [2, 6], "present": [2, 6, 8, 11, 12], "gain": 2, "potentially": 2, "untested": [2, 12], "go": [2, 4, 13], "given": [2, 5, 6, 8, 11], "then": [2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "r": [2, 6, 11], "tiv": [2, 6], "tant": [2, 6, 15], "observ": [2, 4, 6, 8], "forc": [2, 6, 7, 11, 12], "praz": 2, "programs": [2, 11], "executed": [2, 5, 6, 8, 14, 15], "ones": [2, 7, 11, 14], "don": [2, 4, 6, 8, 11, 12, 13, 14], "directly": [2, 4, 6, 7, 9, 11, 12, 13, 15], "usual": [2, 8, 9, 11], "atualiz": [2, 16], "automat": [2, 4, 6, 8, 9, 12, 13], "dashboard": [2, 4, 6, 8, 11, 16], "remov": [2, 4, 6, 9, 11, 12], "manual": [2, 3, 4, 6], "los": [2, 4, 6, 11], "precau\u00e7\u00e3": 2, "seguranc": [2, 5, 6, 9], "fez": [2, 6], "any": [2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "backup": [2, 6, 11], "personal": 2, "ve": [2, 3, 5, 8, 9, 11, 13, 15], "delet": [2, 4, 7, 11, 13, 15], "old": [2, 5, 11, 14], "again": [2, 4, 5, 6, 11, 15], "utiliz": [2, 3, 4, 5, 6, 9, 12, 13], "anterior": [2, 6], "produz": [2, 5, 6, 8, 9], "sa\u00edd": [2, 4, 6, 8, 9], "generally": [2, 5, 8], "nam": [2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "wit": 2, "nothing": [2, 5, 6, 11, 15], "prevents": [2, 5, 15], "grouping": 2, "expects": [2, 9], "_dashboard": [2, 3], "default": [2, 3, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "_default": [2, 4], "installs": 2, "Ele": [2, 3, 5, 6, 9], "descrit": [2, 4, 6, 13], "pr\u00f3xim": [2, 6], "cap\u00edtul": [2, 4, 5, 14], "nad": [2, 4, 6], "boas": 2, "vind": 2, "t\u00eam": [2, 4, 6, 12], "papel": 2, "portant": [2, 4, 5, 6, 9], "nom": [2, 4, 5, 7, 9, 11, 12, 13], "_": [2, 11, 15], "Uma": [2, 4, 6, 8, 9], "send": [2, 6, 11, 12], "urls": [2, 11, 14], "localhost": [2, 4, 5, 6, 11], "8000": [2, 3, 4, 11, 13], "yourappnam": 2, "stop": [2, 12], "acert": 2, "kbd": 2, "control": [2, 8, 11, 12, 13, 15], "janel": 2, "onde": [2, 6, 7, 8, 11], "soment": [2, 4, 6, 8], "appnam": [2, 5, 12, 14], "prefix": [2, 4, 6, 7, 8, 11, 14], "quer": [2, 4, 5, 6, 9], "lig": [2, 5, 6, 9], "simbol": 2, "trailing": [2, 11], "optional": [2, 4, 5, 6, 7, 8, 11, 12, 13, 14], "ctrl": [2, 3], "break": [2, 6], "fn": 2, "paus": 2, "v\u00e1r": [2, 4, 5, 6], "argument": [2, 4, 5, 6, 8, 9, 11, 12], "ter": [2, 4, 5, 6, 9], "adicional": [2, 5, 6], "h": [2, 11], "usag": [2, 3, 4, 5, 6, 9, 11, 12, 13], "apps_fold": 2, "func": [2, 5], "function": [2, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15], "y": [2, 9, 11], "yes": [2, 6], "prompt": [2, 4, 6], "assum": [2, 5, 6, 7, 10], "fals": [2, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "text": [2, 5, 6, 8, 9, 13, 15], "arguments": [2, 5, 6, 8, 9, 11, 12, 14], "passed": [2, 4, 5, 6, 9, 11, 12, 13, 15], "show": [2, 5, 6], "messag": [2, 4, 5, 7, 8, 11, 13, 14, 15], "exit": 2, "myfunction": 2, "x": [2, 6, 8, 9, 11, 13], "100": [2, 6, 7, 8, 11], "singl": [2, 5, 6, 7, 8, 11, 12, 13], "doubl": [2, 6, 8], "quot": [2, 9], "shown": [2, 6, 11, 12], "parameters": [2, 6], "app_nam": [2, 4, 5, 6], "copying": [2, 8, 9, 16], "scaffold_zip": 2, "erro": [2, 3, 6], "orig": [2, 10], "host": [2, 5, 11, 12], "127": [2, 3, 5, 11, 13], "0": [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "1": [2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15], "p": [2, 8, 11], "integ": [2, 6, 7, 9, 11, 15], "numb": [2, 5, 6, 8, 11, 12], "password_fil": 2, "encrypted": [2, 5], "password": [2, 6, 8, 11, 12, 14, 15], "wsgiref": 2, "gunicorn": 2, "waitress": 2, "geventwebsocketserv": 2, "wsgirefthreadingserv": 2, "rocketserv": 2, "w": [2, 4, 5, 6], "number_workers": 2, "workers": 2, "d": [2, 7, 9, 11], "dashboard_mod": 2, "mod": [2, 4, 5, 6, 11, 12], "readonly": [2, 11, 15], "non": [2, 4, 5, 6, 7, 9, 11, 13, 14, 15], "watch": [2, 3, 16], "sync": [2, 6], "lazy": [2, 4, 6], "reload": [2, 3, 4, 5, 11], "automatically": [2, 3, 4, 5, 6, 11, 12, 13, 14, 15], "ssl_cert": 2, "ssl": 2, "certificat": 2, "ssl_key": 2, "key": [2, 4, 5, 6, 7, 9, 11, 12, 16], "errorlog": 2, "error": [2, 3, 5, 6, 7, 8, 9, 11, 15], "logs": [2, 5, 6], "stdout": 2, "stderr": 2, "tickets_only": 2, "filenam": [2, 4, 5, 6, 11], "l": [2, 11], "logging_level": 2, "level": [2, 6, 7, 11, 12], "50": [2, 7], "30": [2, 6, 8, 11], "warning": [2, 5], "switch": [2, 5, 6], "application": [2, 5, 6, 8, 12, 14, 15], "upon": [2, 12, 14], "reloading": [2, 4, 5], "occur": [2, 11, 15], "incoming": 2, "changed": [2, 3, 4, 5, 6, 8, 11, 14, 15], "pref": [2, 15], "immediat": 2, "production": [2, 4], "servers": [2, 6], "unneded": 2, "checks": [2, 6, 8, 11, 12], "restart": [2, 4, 5, 6, 13], "directiv": [2, 8, 11], "looks": [2, 6, 11], "occurring": 2, "modifications": 2, "requir": [2, 5, 6, 11, 12], "used": [2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "currently": [2, 5, 8], "behaviour": [2, 11, 13], "option": [2, 3, 5, 6, 11, 12, 15], "rocket3": [2, 14], "threaded": [2, 14], "stripped": [2, 14], "python2": [2, 14], "logic": [2, 4, 5, 12, 14], "valu": [2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15], "defined": [2, 4, 5, 6, 8, 11, 12, 13, 14, 15], "logging": [2, 12], "corresponds": [2, 6, 9], "common": [2, 4, 5, 8, 11, 12, 14, 15], "notset": 2, "10": [2, 6, 7, 8, 9, 10, 11, 12, 15], "20": [2, 7, 10, 11], "info": [2, 4, 5, 12], "40": [2, 9, 15], "critical": 2, "telling": [2, 12], "library": [2, 6, 10, 11, 14, 15], "handl": [2, 4, 5, 6, 14, 15], "events": [2, 15], "sets": [2, 5, 6, 11], "calls": [2, 6, 8, 15], "functions": [2, 5, 9, 15], "found": [2, 11], "invalid": [2, 6, 11], "saved": [2, 5, 6, 11], "administrator": 2, "asked": 2, "cad": [2, 4, 5, 8, 10, 13], "ped": [2, 4, 5, 6, 13], "uso": [2, 5, 13], "Isso": [2, 4, 6], "chat": 2, "pdkdf2": 2, "hash": [2, 6, 11], "vou": 2, "exclu\u00edd": [2, 6], "my_password_fil": 2, "depo": [2, 3, 6], "reutiliz": [2, 6], "temp": [2, 8], "execu": [2, 4], "validators": [2, 14], "crypt": 2, "writ": [2, 4, 5, 6, 8], "str": [2, 5, 6, 9, 14, 15], "input": [2, 5, 6, 8, 11, 15], "reinstall": 2, "reinstal": 2, "necess\u00e1ri": [2, 4, 5, 6], "confirm": [2, 11, 13], "cria\u00e7\u00e3": [2, 6, 13], "segu": [2, 4, 5, 6, 8], "atual": [2, 6], "existent": [2, 6, 12, 13], "parent": [2, 6, 8, 15], "O": [2, 8, 9, 11, 12, 16], "apen": [2, 5, 6, 7], "pesquis": [2, 3, 6, 13], "ent\u00e3": [2, 4, 6, 12], "exempl": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "conch": 2, "pud": 2, "myapp": [2, 4], "db": [2, 3, 4, 5, 7, 9, 11, 12, 13, 14, 15], "translator": [2, 10, 16], "dal": [2, 4, 7, 11, 13, 15, 16], "field": [2, 4, 5, 7, 12, 13, 14, 15, 16], "utils": [2, 4, 5, 8, 9, 11, 12, 13, 14, 16], "versions": [2, 5, 11], "too": [2, 5, 6, 11, 15], "cannot": [2, 5, 6, 8, 11, 15], "generic": [2, 4, 5, 6, 11], "described": [2, 4, 5, 6, 11], "called": [2, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "deployment_tools": 2, "collects": 2, "recip": 2, "they": [2, 4, 5, 6, 7, 8, 11, 12, 14, 15], "briefly": 2, "tips": [2, 13], "tricks": 2, "thes": [2, 4, 5, 6, 8, 9, 11, 13, 15], "steps": 2, "generat": [2, 6, 8, 9, 11, 12, 13, 14, 15], "followed": [2, 5, 11], "www": [2, 8, 9, 13], "section": [2, 4, 6, 8, 11, 12], "io": [2, 6], "engineering": 2, "education": 2, "securely": 2, "vscod": 2, "may": [2, 4, 5, 6, 8, 9, 11, 14, 15], "updat": [2, 5, 11, 13, 14, 15], "contain": [2, 4, 5, 6, 8, 9, 11, 12, 15], "configurations": 2, "type": [2, 5, 7, 8, 9, 12, 15], "workspacefold": 2, "path_t": 2, "crt": [2, 6], "absolut": [2, 6, 14], "location": [2, 4, 6, 8, 14], "so": [2, 5, 6, 8, 9, 11, 13, 14, 15], "feasibl": [2, 11], "simply": [2, 4, 5, 6, 8, 15], "py4web_wsg": 2, "4": [2, 5, 6, 7, 8, 11, 13], "tak": [2, 3, 5, 6, 8, 11, 12, 13, 15], "consol": [2, 9, 12, 15], "obtain": [2, 12, 15], "id": [2, 5, 7, 8, 9, 11, 12, 13, 14, 15], "project_nam": 2, "mkdir": [2, 4, 7, 11, 13], "supond": [2, 6], "cp": 2, "development_tools": 2, "talvez": [2, 5], "__init": 2, "vazi": [2, 6], "ver": [2, 6, 12], "makefil": 2, "__init__": [2, 4, 5, 6, 7, 11, 13, 14, 15], "lib": 2, "yaml": 2, "sdk": 2, "config": [2, 4], "email": [2, 8, 11, 12, 14], "mail": [2, 3, 5, 11, 12], "obtid": [2, 6], "agor": [2, 4, 5, 6, 8], "bast": 2, "deploy": 2, "atend": [2, 6], "youtub": [2, 6], "follow": [2, 4, 7, 12, 13, 14], "detailed": [2, 13], "bottle_app": 2, "script": [2, 5, 8, 15], "dockerfil": 2, "compos": 2, "yml": 2, "setting": [2, 4, 5, 6, 11, 13], "postgresql": [2, 6], "advantag": [2, 6, 8, 15], "requiring": [2, 14], "sud": [2, 12], "background": [2, 4, 11, 15], "daemon": 2, "bash": 2, "04": 2, "03": [2, 6, 7], "lts": 2, "nginx": 2, "self": [2, 5, 6, 9, 11, 13, 15], "signed": [2, 5, 11], "manag": [2, 3, 4, 5, 6, 12], "iptabl": 2, "surely": [3, 4], "extensively": 3, "check": [3, 4, 5, 6, 11, 12, 13], "looking": 3, "good": [3, 11], "exploring": 3, "listening": 3, "tcp": 3, "local": [3, 5, 8, 11, 12, 13], "pc": 3, "protocol": 3, "connect": [3, 6], "firefox": [3, 15], "chrom": [3, 15], "bot\u00f5": [3, 16], "describ": [3, 11], "chapt": [3, 4, 5, 6, 8, 9, 11, 13], "documentation": [3, 11, 15], "20201112": 3, "browsing": 3, "pointing": [3, 8], "discuss": 3, "forum": 3, "pression": 3, "bot\u00e3": 3, "transmit": 3, "inser": [3, 8], "ref": [3, 5, 6, 9, 11, 16], "comando": [3, 4, 6, 9, 16], "set_password": 3, "configur": [3, 12, 13, 14, 16], "exib": [3, 6, 8, 9, 13], "abas": 3, "comprim": 3, "cliqu": [3, 13], "t\u00edtul": [3, 9, 13], "gui": 3, "expand": 3, "As": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], "context": [3, 5, 6, 8], "aba": 3, "instal": [3, 6, 12, 16], "selecion": [3, 6], "rot": [3, 13], "tab": [3, 5, 11], "allows": [3, 4, 5, 6, 7, 8, 11, 12, 13, 15], "contains": [3, 5, 7, 8, 10, 11, 13, 14, 15], "selected": [3, 4, 7, 9, 11, 15], "compris": 3, "reloaded": [3, 4, 15], "unless": [3, 5, 6, 8, 11], "op\u00e7\u00e3": [3, 4, 6, 8, 9], "click": [3, 9, 11, 13, 15], "effect": [3, 6, 11], "fails": [3, 11], "load": [3, 5, 15], "corresponding": [3, 6, 11, 12, 13, 14], "button": [3, 4, 5, 11, 13, 15], "displayed": [3, 6, 9, 11, 13, 15], "realiz": [3, 4, 5, 6], "busc": [3, 6, 13], "crud": [3, 11, 15], "visit": [3, 5, 11], "desencad": 3, "emit": [3, 6], "registr": [3, 4, 11, 12, 13], "edi\u00e7\u00f5": 3, "comuns": 3, "filesyst": [4, 5, 6], "going": [4, 15], "own": [4, 5, 6, 8, 11, 12, 13, 14, 15], "mind": [4, 6, 7, 8, 11], "therefor": [4, 5, 8, 11, 14], "empty": [4, 11, 15], "strictly": [4, 15], "needed": [4, 5, 6, 9, 11, 12, 15], "enter": [4, 11, 12], "commands": [4, 6, 8, 9], "echo": 4, "backslash": 4, "i": [4, 5, 6, 7, 8, 11, 12, 15], "press": [4, 13], "recogniz": 4, "automatic": [4, 6, 8, 14], "whenev": 4, "required": [4, 5, 6, 7, 11, 15], "anything": 4, "arbitrary": [4, 12], "access": [4, 5, 9, 12, 14, 15], "typically": [4, 8], "expos": [4, 5], "dynamic": [4, 8, 12], "expor": [4, 12], "simples": [4, 6, 10], "subpast": 4, "public": 4, "hell": [4, 5, 6, 8, 9, 11, 12, 15], "world": [4, 5, 6, 8, 9, 11], "rec\u00e9m": [4, 6, 10], "sob": [4, 6], "internally": [4, 5, 6, 13], "supports": [4, 5, 8, 9, 11, 15], "streaming": [4, 14], "partial": [4, 6, 14], "rang": [4, 6, 8, 12, 14], "modified": [4, 11, 14], "handled": [4, 5, 11, 15], "headers": [4, 8, 15], "fun\u00e7\u00e3": [4, 6, 8, 9], "conte\u00fad": [4, 6, 9], "novaaplicaca": 4, "init": [4, 13], "seg": 4, "datetim": [4, 5, 6, 7, 11, 15], "action": [4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "def": [4, 5, 6, 7, 9, 11, 12, 13, 14, 15], "return": [4, 5, 6, 7, 9, 11, 12, 13, 15], "accessibl": 4, "\u00edndic": 4, "opcional": [4, 6, 9, 11], "Ao": [4, 6, 8, 13], "estrutur": [4, 5, 6, 10], "c\u00f3dig": [4, 5, 6, 8, 9], "ocorr": [4, 6, 8], "v\u00e1ri": [4, 5, 6, 10], "fun\u00e7\u00f5": [4, 8], "prepends": 4, "sej": [4, 6], "url": [4, 5, 7, 8, 11, 12, 13, 14, 15], "a\u00e7\u00e3": [4, 5, 6, 12, 16], "anteced": 4, "ambigu": [4, 6], "exce\u00e7\u00e3": [4, 5, 6, 8], "link": [4, 7, 8, 9, 11, 12, 13], "simb\u00f3l": 4, "actions": [4, 5, 6, 13, 14, 16], "string": [4, 5, 6, 7, 9, 10, 11, 13], "dictionary": [4, 5, 6, 9, 11, 14], "tell": [4, 12, 15], "what": [4, 5, 6, 8, 11, 12, 14, 15], "serializ": [4, 6, 8, 9], "end": [4, 6, 8, 11, 12, 13, 15], "colors": [4, 6], "blu": [4, 6, 11, 14], "green": [4, 6, 14], "vis\u00edvel": 4, "vermelh": 4, "azul": 4, "verd": 4, "conven\u00e7\u00e3": 4, "transform": [4, 5, 6, 11, 15], "inteir": [4, 6], "tard": [4, 6], "irem": [4, 5], "brev": 4, "poss\u00edvel": [4, 6], "map": [4, 6, 9, 10], "padr\u00f5": [4, 6, 9], "color": [4, 6, 8, 9, 11, 15], "picked": 4, "unknown": 4, "sintax": [4, 6, 9, 12, 16], "garraf": 4, "bottlepy": [4, 5], "wildcard": 4, "filt": [4, 7, 11, 13], "possibl": [4, 5, 6, 8, 11, 12, 13, 14], "filters": [4, 11], "int": [4, 6, 11, 14], "d\u00edgit": [4, 6], "assinatur": [4, 5], "convert": [4, 6, 9], "n\u00famer": [4, 6, 10, 13], "float": [4, 11], "decim": 4, "personagens": [4, 6], "caracter": 4, "barr": 4, "gananc": 4, "combin": [4, 5, 9, 13], "segment": 4, "exp": [4, 6], "expression": [4, 6, 8, 10, 11, 13], "matched": [4, 7, 9, 11], "harmoniz": 4, "car\u00e1ct": [4, 6], "universal": [4, 6, 9], "pass": [4, 5, 6, 8, 9, 11, 12, 13, 14, 15], "vari\u00e1vel": [4, 6, 9, 10], "especific": [4, 5, 6], "al\u00e9m": [4, 6, 13], "diss": [4, 6, 13], "ac\u00e7\u00e3": [4, 5, 6, 7], "method": [4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15], "m\u00e9tod": [4, 5, 6, 8, 13], "post": [4, 6, 7, 9, 11, 12, 13, 14, 15], "paint": [4, 11], "query": [4, 5, 7, 9, 11, 12, 13, 14, 15], "painting": 4, "equivalent": [4, 5, 6, 9, 11, 14], "additional": [4, 5, 7, 8, 11, 13], "attribut": [4, 5, 6, 9, 11, 13, 14, 15], "identify": 4, "decl": [4, 6], "head": [4, 5, 6, 8, 13, 15], "style": [4, 6, 8, 11, 15, 16], "body": [4, 8, 12, 13, 15], "h1": [4, 8], "tint": 4, "dict": [4, 5, 6, 10, 11, 13, 14, 15], "fund": 4, "correspondent": [4, 6, 9], "ingredient": 4, "chav": [4, 8, 9, 10, 13], "lumin\u00e1r": 4, "disposit": [4, 5, 12], "el\u00e9tr": [4, 5, 12], "comport": [4, 6, 9, 13], "inicializ": [4, 5], "filtrag": [4, 13], "entrad": [4, 6, 9, 10], "depend": [4, 5, 6], "\u00e2mbit": 4, "encaix": 4, "\u00e1rvor": 4, "explic": [4, 6], "acess\u00f3ri": 4, "especif": [4, 6], "dand": 4, "Esse": 4, "estar": [4, 6, 9], "localiz": 4, "diret\u00f3ri": 4, "ser\u00e3": [4, 6, 9], "cord": [4, 6, 10], "facil": [4, 5, 6], "linguagens": 4, "diz": [4, 6, 12, 13], "obter": [4, 6], "conex\u00e3": 4, "part": [4, 9, 14], "piscin": [4, 6], "compromet": [4, 6], "sucess": [4, 6], "revers\u00e3": 4, "falh": 4, "sess\u00e3": [4, 16], "analis": [4, 6, 10], "recuper": [4, 6], "salv": [4, 6, 10], "tradutor": 4, "cabe\u00e7alh": [4, 9], "accept": [4, 5, 11, 15], "determin": [4, 5, 6, 10, 11, 12, 13], "\u00f3ptim": 4, "regr": [4, 5], "liga\u00e7\u00e3": [4, 5, 6], "ambos": [4, 5, 6], "trat": [4, 6], "writing": [4, 6, 14], "scratch": 4, "san": 4, "conventions": [4, 6], "outlined": [4, 5], "putting": 4, "organized": 4, "properly": 4, "pre": [4, 5, 13], "shows": [4, 8, 11, 12], "registration": [4, 11], "building": [4, 11, 15], "construction": 4, "giv": [4, 5, 6, 8, 11, 12], "kind": 4, "normal": [4, 5, 6, 8, 11, 13, 15], "encontr": [4, 6, 8, 10, 12], "andaim": 4, "la": [4, 6], "usand": [4, 5, 8, 9, 12, 16], "imports": 4, "controllers": [4, 6, 8, 9, 11, 14, 15], "metadat": [4, 6], "models": [4, 6, 7, 13, 14], "tabl": [4, 5, 7, 11, 12, 13, 14, 15, 16], "settings_privat": 4, "privat": [4, 5, 11], "ship": 4, "bulm": [4, 11, 13, 15], "agnostic": 4, "favicon": 4, "ico": 4, "replac": [4, 6, 8, 9, 13, 15], "tasks": [4, 6], "etc": [4, 5, 6, 7, 10, 14], "general": [4, 5, 6, 11, 12], "layout": [4, 11, 12, 13, 14, 15, 16], "translations": [4, 5, 10, 15], "internationalization": [4, 5, 11, 14], "pluralization": [4, 14], "italian": [4, 5, 10], "respons": [4, 5, 6, 8, 14, 15, 16], "abort": [4, 6], "redirect": [4, 5, 11, 12, 13, 15], "helpers": [4, 6, 8, 11, 13, 14, 16], "welcom": [4, 5, 8, 14, 15], "get_us": [4, 5, 12, 14], "first_nam": [4, 5, 12, 13], "format": [4, 5, 7, 9, 10, 12, 13], "hom\u00f3log": 4, "div": [4, 5, 8, 11, 14, 15], "span": [4, 14], "img": 4, "indic": [4, 6], "esper": [4, 5, 6], "v\u00e1l": 4, "redirecion": [4, 12, 13], "provavel": [4, 5, 6], "mud": [4, 5, 6], "agn\u00f3st": 4, "algum": [4, 6, 9], "exce\u00e7\u00f5": 4, "quis": [4, 6], "scaffold": [4, 15], "lot": [4, 6], "point": [4, 5, 6, 11, 14, 15], "testing": [4, 6], "developing": 4, "whol": [4, 11], "anoth": [4, 5, 6, 8, 11], "my_app": 4, "loaded": [4, 8, 13, 15], "select": [4, 7, 10, 11, 12, 13, 14, 15, 16], "upload": [4, 6], "upper": [4, 5, 11], "finally": [4, 13], "facilitat": 4, "reloads": [4, 5], "fact": [4, 5, 14], "watched": 4, "app_watch_handl": 4, "decorator": [4, 5, 6, 14], "reported": 4, "worry": 4, "fully": [4, 5, 6, 11], "assist": 4, "sass": 4, "compil": [4, 8, 9, 11], "libsass": 4, "static_dev": 4, "overrid": [4, 6, 8, 12, 13, 14, 15], "sass_compil": 4, "changed_fil": 4, "print": [4, 6, 9, 10, 12, 14], "abov": [4, 5, 6, 7, 8, 11, 13], "compiled_css": 4, "filep": 4, "include_paths": 4, "includ": [4, 6, 7, 9, 13, 15], "output_styl": 4, "compressed": 4, "dest": [4, 6, 11], "join": [4, 5, 7, 11, 13, 14], "compiled": [4, 8, 9, 11], "valid": [4, 6, 9, 14, 16], "esprim": 4, "implementation": [4, 8, 11, 14], "nod": 4, "dbadmin": 4, "validate_js": 4, "cf": 4, "validation": [4, 7, 8, 13], "abspath": 4, "parsemodul": 4, "filepaths": 4, "relativ": [4, 14], "ignored": [4, 8, 9, 13, 15], "exceptions": [4, 5, 15], "handlers": 4, "printed": 4, "terminal": 4, "Um": 5, "pec": [5, 6], "equip": 5, "mobili\u00e1ri": 5, "fix": [5, 6], "posi\u00e7\u00e3": [5, 9], "edif\u00edci": 5, "ve\u00edcul": 5, "algo": [5, 6, 7, 8], "respost": [5, 8], "processing": [5, 6, 8, 11, 15], "operations": [5, 6], "perform": [5, 6, 11, 12], "pars": [5, 6, 11, 12], "look": [5, 6, 7, 11, 12], "information": [5, 6, 7, 11, 12, 14, 16], "commit": [5, 7, 13], "transaction": [5, 6], "preferred": [5, 6], "lookup": [5, 7], "prop": [5, 6, 13], "pick": [5, 12], "connection": [5, 6, 11], "pool": 5, "after": [5, 6, 8, 11, 12, 13], "back": [5, 6, 11], "mecan": [5, 6, 8], "ignor": [5, 6, 8, 11, 13], "eficient": [5, 6], "reduz": 5, "clich": 5, "middlewar": 5, "wsgi": 5, "plug": 5, "excet": [5, 6], "a\u00e7\u00f5": 5, "uns": 5, "signing": 5, "explained": [5, 6, 11, 13], "connections": [5, 6, 14], "authentication": [5, 13, 16], "develop": [5, 6, 8, 12, 13, 14], "paragraph": [5, 9, 11, 13], "previous": [5, 8, 9, 11, 15], "decorators": [5, 14], "applied": [5, 11, 13, 15], "knows": 5, "depends": [5, 6, 14], "exception": [5, 6, 11, 12], "otherwis": [5, 6, 8, 11, 12, 13], "various": 5, "delimiters": [5, 14], "retorn": [5, 8, 9], "posterior": 5, "jinja2": 5, "comum": [5, 6], "pouc": [5, 6], "a\u00e7\u00fac": 5, "sint\u00e1t": 5, "duas": [5, 6], "linh": [5, 6, 8, 9, 13, 16], "cached": 5, "ram": [5, 6], "right": [5, 6, 8], "careful": [5, 6, 8, 14, 15], "documentations": 5, "exactly": 5, "opposit": 5, "early": 5, "february": 5, "2022": 5, "extend": [5, 6, 12, 14, 15], "passing": [5, 6, 9], "implications": 5, "avoiding": [5, 11], "clean": [5, 9], "able": [5, 6, 11], "variabl": [5, 6, 9, 11, 13, 15], "my_var": [5, 9], "t_fold": 5, "dirnam": [5, 7, 11, 13], "__file__": [5, 7, 11, 13], "translated": [5, 8, 11], "specified": [5, 6, 8, 9, 11, 12, 13, 14, 15], "match": [5, 6, 8, 9, 10, 11], "class": [5, 6, 8, 9, 11, 12, 14, 15], "implement": [5, 6, 8, 12], "contador": [5, 6], "dbstor": 5, "memory": [5, 6], "storag": [5, 6, 7, 11, 13], "count": [5, 7, 12, 13, 15], "n": [5, 6, 10, 15], "tradu\u00e7\u00e3": [5, 16], "tradu\u00e7\u00f5": [5, 10], "en": [5, 7], "2": [5, 6, 7, 8, 9, 10, 11, 12, 14, 15], "twic": [5, 6], "6": [5, 6, 7, 11, 12, 14], "5": [5, 6, 7, 8, 10, 11, 12, 13, 15], "visiting": [5, 12], "preferenc": 5, "english": 5, "tent": [5, 6], "ti": 5, "ho": 5, "mai": 5, "vist": [5, 6, 9], "prim": [5, 11], "gia": 5, "volt": [5, 6], "piu": 5, "display": [5, 11, 12, 13, 15], "alerts": [5, 8, 14], "displaying": [5, 11, 13], "stat": [5, 7, 14, 15], "preserved": 5, "redirection": [5, 14], "dismissibl": 5, "auxili": [5, 6, 8, 9], "del": [5, 6, 9], "_class": [5, 9, 11, 15], "sanitiz": [5, 9, 14], "src": [5, 6, 8, 9, 15], "globals": [5, 6, 8, 12, 14], "xml": [5, 8, 11, 14, 15], "returned": [5, 6, 7, 8, 9, 11, 15], "triggers": 5, "position": 5, "convenienc": 5, "injected": [5, 8, 9, 11], "redirected": [5, 15], "remembered": 5, "achieved": [5, 14], "asking": 5, "temporarily": 5, "sent": [5, 6, 12, 15], "returning": 5, "overwritten": [5, 14], "mensagens": [5, 6], "defaults": [5, 11, 13, 14], "alert": [5, 8, 9, 11, 14], "success": [5, 7, 15], "hardcod": 5, "thos": [5, 6, 8, 9, 12, 14, 15], "basic": [5, 16], "speaking": 5, "desired": [5, 11], "persist": 5, "throughout": 5, "interaction": 5, "words": [5, 13], "rend": [5, 6, 11, 13, 14, 15], "stateless": [5, 15], "stateful": 5, "secret": [5, 12], "my": [5, 8, 9, 11, 12, 15], "increased": 5, "opening": 5, "updated": [5, 6, 11], "closing": [5, 6], "reopening": 5, "window": [5, 8, 11], "related": [5, 6], "usernam": [5, 6, 12], "visited": [5, 8], "shopping": 5, "cart": 5, "jwt": 5, "specifically": [5, 6, 11, 15], "token": [5, 11], "stor": [5, 6, 12], "serialized": [5, 6, 9, 11], "__str__": [5, 8, 9], "operator": [5, 6, 11], "lost": [5, 14], "composing": 5, "still": [5, 6, 9, 11, 13, 14], "minimal": [5, 13, 16], "identifying": [5, 11], "clients": 5, "sess\u00f5": 5, "nunc": [5, 6], "expir": 5, "contenh": 5, "hist\u00f3r": [5, 6], "par\u00e2metr": [5, 13], "expiration": 5, "3600": [5, 6], "algorithm": [5, 11], "hs256": 5, "same_sit": 5, "lax": 5, "_sesson": 5, "passphras": 5, "sign": [5, 8, 12], "maximum": [5, 11], "lifetim": 5, "seconds": [5, 11], "timeout": 5, "signatur": [5, 6, 7, 9, 11], "alternat": [5, 15], "csrf": [5, 11], "attacks": [5, 9], "cross": [5, 9], "forgery": 5, "enabled": [5, 7, 12, 14], "provided": [5, 6, 8, 9, 11, 13], "uuid": [5, 6], "why": [5, 8, 14], "appname_session": 5, "encoded": [5, 6, 11, 15], "preventing": 5, "tampering": [5, 6], "trivial": [5, 6], "communications": 5, "disk": [5, 6], "sensitiv": [5, 11], "invalidated": 5, "vic": 5, "vers": 5, "small": [5, 11], "siz": [5, 8, 11], "limit": [5, 6, 7, 11, 12], "kbytes": 5, "being": [5, 6, 7, 8, 11, 15], "put": [5, 7, 11, 15], "configured": [5, 11, 14], "conn": 5, "11211": 5, "6379": 5, "lambd": [5, 6, 9, 11, 13, 15], "k": [5, 8, 14], "v": [5, 9, 11, 15], "cs": 5, "ct": 5, "ttl": 5, "avis": [5, 6, 12], "rem": 5, "macac": 5, "multiprocess": 5, "quirk": 5, "deterministic": 5, "unsaf": [5, 9], "tud": [5, 6], "imagin": [5, 6, 8, 15], "fsstorag": 5, "exists": [5, 6, 11], "fp": 5, "dump": 5, "tmp": [5, 6], "leav": [5, 6], "exercis": 5, "per": [5, 7], "subfolders": [5, 6], "locking": 5, "storing": 5, "inefficient": 5, "scal": [5, 8], "app1": 5, "app2": 5, "wants": 5, "shar": [5, 6, 14], "assuming": 5, "sessons": 5, "session_secret_key": 5, "app1_session": 5, "tells": [5, 15], "sur": [5, 11, 15], "shared": 5, "between": [5, 9, 11, 14], "consistent": 5, "session_app1": 5, "restrict": [5, 7, 11, 15], "enforc": [5, 11], "workflow": [5, 16], "step1": 5, "step_completed": 5, "_href": [5, 8, 9, 11, 13], "step2": 5, "locals": [5, 14], "step3": 5, "on_request": 5, "evaluat": [5, 11, 15], "listed": [5, 11, 15], "rais": [5, 11, 12, 14], "404": [5, 11, 12], "cond": 5, "400": [5, 14], "raised": 5, "on_fals": 5, "13": [5, 6, 11], "giving": 5, "memberships": 5, "specific": [5, 6, 8, 9, 11, 12, 14, 15], "auth_us": [5, 6, 12], "requires_membership": 5, "group_nam": [5, 12], "user_id": [5, 6, 12, 14], "payroll": 5, "employ": 5, "permission": [5, 12], "typical": [5, 6, 11], "follows": [5, 6, 11], "url_sign": 5, "somepath": 5, "controll": [5, 6, 8, 9, 11, 12, 13, 14, 15], "signs": 5, "signed_url": 5, "anotherpath": 5, "verify": 5, "verified": [5, 11], "usou": [5, 6], "queir": 5, "abstraction": [5, 14, 16], "lay": [5, 14, 16], "documented": [5, 11], "pleas": [5, 6], "rememb": [5, 6], "doesn": 5, "db_fold": [5, 7, 11, 13], "pool_siz": [5, 6], "define_tabl": [5, 7, 11, 12, 13, 14], "visit_log": 5, "client_ip": 5, "timestamp": [5, 7, 15], "environ": [5, 14], "remote_addr": [5, 12], "insert": [5, 7, 8, 11, 12, 13, 15], "utcnow": [5, 6], "picks": 5, "wrapped": 5, "commits": [5, 6], "on_success": 5, "rolls": 5, "on_error": 5, "rol": [5, 9], "construtor": [5, 9, 11, 16], "tabel": [5, 9, 12, 13, 14], "camp": [5, 7, 9, 11, 16], "last_nam": [5, 12, 13], "sso_id": [5, 12], "action_token": [5, 12], "\u00faltim": [5, 6, 12], "intern": [5, 6], "registers": 5, "including": [5, 11, 13, 14, 15], "presenc": [5, 6], "_scaffold": [5, 8, 9, 11, 12, 13, 14, 16], "returns": [5, 6, 7, 9, 11, 12, 14, 15], "logged": [5, 8, 12, 14], "redirects": [5, 12], "desd": [5, 6], "verific": [5, 6, 12], "plugin": [5, 11, 12, 13, 15], "methods": [5, 7, 9, 11, 12, 13, 16], "authorization": [5, 16], "compartilh": [5, 6], "permiss\u00e3": [5, 6, 12], "estad": [5, 6], "threads": [5, 6], "atribut": [5, 9], "thing": [5, 6, 14], "writabl": [5, 6, 11, 14], "readabl": [5, 6, 13, 14], "espec": [5, 6, 9], "threadsafevariabl": 5, "Esses": [5, 6], "parec": [5, 6], "rosc": 5, "loc": 5, "est\u00e3": [5, 6, 7, 9, 12], "valor": [5, 9, 10, 11, 13], "m\u00ednim": [5, 6], "myfixtur": 5, "transforms": 5, "determining": 5, "eventually": 5, "accessing": [5, 6], "inner": [5, 15], "layers": 5, "coming": 5, "calling": [5, 6, 8], "b": [5, 6, 8, 9, 11, 14, 15], "circumstanc": 5, "think": [5, 8, 13, 15], "onion": 5, "cent": [5, 6, 8], "entering": 5, "exiting": 5, "processed": [5, 6, 8, 11], "previously": [5, 6, 11], "current": [5, 6, 9, 12, 13, 14, 15], "uppercas": [5, 11], "upper_cas": 5, "tracebacks": 5, "logerrors": 5, "stre": [5, 6], "errlog": 5, "myerrors": 5, "__prerequisite__": 5, "appended": [5, 6], "__prerequisites__": 5, "guarant": 5, "singleton": [5, 14], "declared": 5, "considered": [5, 6, 8, 14], "httrespons": 5, "whil": [5, 6, 7, 11, 12, 14], "actual": [5, 6, 8, 12, 13], "complicated": 5, "individual": [5, 6, 7, 8, 11], "know": [5, 13], "wheth": [5, 6, 11, 12, 14], "keeps": [5, 13], "easy": [5, 8, 11], "communicat": 5, "retriev": [5, 6, 15], "stated": 5, "mandatory": [5, 8], "consid": [5, 8, 9, 11, 13], "happen": 5, "sequenc": [5, 6], "revers": [5, 6], "transformed": [5, 6], "extra": [5, 6, 11, 12], "almost": 5, "contexts": 5, "futur": [5, 14, 15], "implements": [5, 6], "recently": 5, "lru": 5, "via": [5, 6, 8, 9, 15], "1000": [5, 6, 11, 15], "60": [5, 6], "uuid4": [5, 6], "registered": [5, 12], "mention": 5, "rendered": [5, 7, 8, 11, 13, 14, 15], "unauthenticated": [5, 6, 9], "authenticated": [5, 6], "below": [5, 6, 7, 11, 13], "rout": [5, 13, 14, 15], "separated": [5, 6, 13, 15], "combined": [5, 6, 11], "preced": [5, 6, 8], "maps": [6, 9], "such": [6, 9, 11, 13, 14], "queri": [6, 7, 13, 14, 15], "records": [6, 7, 11, 12, 13], "dynamically": [6, 7, 8, 11], "dialect": 6, "dialects": 6, "term": 6, "generically": 6, "portabl": 6, "among": [6, 11], "choosen": 6, "pur": 6, "conceived": 6, "tast": 6, "transactions": 6, "aggregat": 6, "nested": [6, 8], "differenc": [6, 11, 14], "caveat": [6, 8, 14], "startup": [6, 14], "downsid": [6, 14], "approach": [6, 14], "nev": [6, 8, 11, 14, 15], "thread": [6, 14], "practical": [6, 11, 14, 16], "mailing": 6, "adapters": [6, 15], "modern": [6, 12, 15], "distribution": 6, "actually": [6, 8], "driv": 6, "sqlite3": 6, "included": [6, 8, 11, 13], "binary": 6, "appropriat": [6, 11], "drivers": 6, "pysqlite2": 6, "zxjdbc": 6, "jython": 6, "psycopg2": 6, "pymysql": 6, "mysqldb": 6, "cx_oracl": 6, "pyodbc": 6, "pypyodbc": 6, "firebird": 6, "kinterbasdb": 6, "fdb": 6, "db2": 6, "informix": 6, "informixdb": 6, "ingres": 6, "ingresdb": 6, "cubrid": 6, "cubriddb": 6, "sybas": 6, "teradat": 6, "sapdb": 6, "mongodb": 6, "pymong": 6, "imap": 6, "imaplib": 6, "treated": [6, 14], "gotch": 6, "about": [6, 7, 12, 13, 14, 15, 16], "comp\u00f5": 6, "instantiat": [6, 12, 14], "mytabl": 6, "myfield": 6, "truncat": 6, "import_from_csv_fil": 6, "instantiated": 6, "claus": 6, "myquery": 6, "myset": 6, "somevalu": 6, "something": [6, 7, 8, 9, 11], "derived": 6, "myord": 6, "advisabl": 6, "persistent": [6, 12], "hesitat": 6, "doing": [6, 11, 15], "snippets": 6, "executabl": [6, 9], "auth_user_tag_groups": [6, 12], "person": [6, 7, 11, 13], "superher": [6, 7, 11, 13, 15], "superpow": [6, 7], "product": [6, 11, 15], "superman": [6, 7, 11, 13], "real_identity": [6, 7], "zer": [6, 8, 11, 13], "sak": 6, "simplicity": [6, 15], "discussion": 6, "engin": [6, 11], "conect": [6, 12], "_ur": 6, "_dbnam": 6, "instanc": [6, 9, 11, 13, 15], "uniform": 6, "resourc": [6, 12], "identifi": 6, "liga\u00e7\u00f5": [6, 9], "supor": 6, "situa\u00e7\u00e3": 6, "dummy": [6, 8], "db_codec": 6, "utf": 6, "check_reserved": 6, "migrate_enabled": 6, "fake_migrate_all": 6, "decode_credentials": 6, "driver_args": 6, "adapter_args": 6, "attempts": [6, 12], "auto_import": 6, "bigint_id": 6, "lazy_tabl": 6, "db_uid": 6, "do_connect": 6, "after_connection": 6, "ignore_field_cas": 6, "entity_quoting": 6, "table_hash": 6, "estabelec": 6, "atrav\u00e9s": [6, 8, 9, 12], "inst\u00e2nc": [6, 13], "dar": 6, "seq\u00fc\u00eanc": 6, "set_encoding": 6, "utf8mb4": 6, "postgr": 6, "2005": 6, "mssql3": 6, "2012": 6, "mssql4": 6, "oracl": 6, "dsn": 6, "uid": 6, "pwd": 6, "ndb": 6, "consists": [6, 13], "locked": 6, "accessed": [6, 9, 11], "established": 6, "appropriately": 6, "encoding": 6, "avoids": 6, "utf8": 6, "charact": [6, 11], "unicod": [6, 11], "characters": [6, 11], "consist": [6, 14], "four": 6, "bytes": 6, "turns": [6, 15], "buff": 6, "often": [6, 12, 15], "completely": [6, 8, 12], "had": 6, "connecting": 6, "_select": 6, "_insert": 6, "_updat": 6, "_delet": 6, "usos": 6, "codific": 6, "caract": [6, 9], "latin1": 6, "unicodedecodeerror": 6, "rath": [6, 8, 11, 15], "slow": 6, "establish": 6, "pooling": 6, "closed": [6, 8], "goes": [6, 11], "tri": [6, 14], "recycl": 6, "cresc": 6, "m\u00e1xim": 6, "simult\u00e2n": 6, "receb": [6, 8], "tamanh": 6, "sequencial": 6, "t\u00f3pic": 6, "benef\u00edci": 6, "conseg": 6, "segund": 6, "fracass": 6, "permanec": 6, "fech": [6, 8, 9], "grac": 6, "repeti\u00e7\u00e3": 6, "restabelec": 6, "interromp": 6, "major": 6, "boost": [6, 8], "creation": 6, "deferred": [6, 15], "referenced": [6, 7], "possibly": 6, "concurrency": [6, 15], "problems": [6, 12, 15], "howev": [6, 8, 11, 15], "demand": 6, "referred": [6, 7], "responsibility": 6, "housekeeping": 6, "definitions": [6, 7, 14], "maintainability": 6, "expect": [6, 11], "uris": 6, "deal": [6, 15], "distribut": 6, "workload": 6, "primeir": [6, 8, 12, 16], "eo": 6, "terceir": 6, "distribu": 6, "carg": 6, "mestr": 6, "escrav": 6, "colun": [6, 13], "alvo": 6, "nenhum": [6, 12], "cont\u00eam": [6, 10], "against": [6, 7, 9, 11, 13], "ordem": 6, "op\u00e7\u00f5": [6, 16], "extras": 6, "tais": 6, "ends": [6, 8, 14], "reserved": [6, 11], "keywords": 6, "append": [6, 9, 11, 13, 15], "_nonreserved": 6, "postgres_nonreserved": 6, "backends": 6, "cit": [6, 9, 11], "entidad": 6, "identific": [6, 9], "ger": [6, 8, 9, 12, 13], "n\u00edvel": [6, 10], "cot": 6, "mai\u00fascul": 6, "min\u00fascul": 6, "assim": [6, 8], "dobr": 6, "motor": 6, "acord": 6, "norm": 6, "conform": [6, 12], "dobrag": 6, "certez": 6, "esquem": 6, "organiz": 6, "ambas": 6, "acim": [6, 7, 8, 12], "table1": 6, "column": [6, 13], "\u00c0s": [6, 9], "recomend": 6, "detalh": [6, 13], "user_nam": 6, "user_password": 6, "server_addr": 6, "db_nam": 6, "sslmod": 6, "sslrootcert": 6, "root": [6, 8, 12, 13], "sslcert": 6, "sslkey": 6, "migration": 6, "migrations": 6, "booleans": 6, "afet": 6, "migr": 6, "desat": 6, "verdadeir": [6, 11, 13], "aren": 6, "committed": [6, 14], "immediately": 6, "depending": [6, 8, 11, 13], "activiti": 6, "ever": 6, "granul": 6, "bob": 6, "roll": 6, "revert": 6, "views": 6, "enclosed": 6, "pseud": 6, "traceback": 6, "ticket": 6, "visitor": 6, "tablenam": [6, 7, 11, 15], "kwargs": [6, 15], "preenchiment": 6, "obrigat\u00f3ri": 6, "subcl": 6, "defini\u00e7\u00e3": 6, "opcion": [6, 9], "common_filt": 6, "discut": 6, "abaix": 6, "loj": 6, "pesso": 6, "peg": 6, "increment": 6, "original": [6, 8, 9, 11], "external": 6, "elements": [6, 9, 11, 15], "redefini\u00e7\u00e3": 6, "provoc": 6, "anonymous": [6, 8, 11], "downs": 6, "othertabl": 6, "otherfield": 6, "referencing": 6, "constructor": [6, 12, 16], "representation": [6, 9], "backend": 6, "ali": [6, 11], "constructing": 6, "illustrat": 6, "qualified": 6, "belonging": 6, "db1": 6, "dbo": 6, "helps": [6, 8, 11], "legacy": 6, "primary": [6, 8, 12], "keys": [6, 7], "keyed": 6, "sub": 6, "refer": [6, 7], "relev": 6, "num\u00e9r": 6, "acion": 6, "embor": 6, "mudanc": 6, "din\u00e2m": [6, 16], "mes": [6, 9], "vantagens": 6, "adi": 6, "age": 6, "set_attribut": 6, "is_not_empty": 6, "is_int_in_rang": 6, "120": 6, "realment": 6, "defini\u00e7\u00f5": 6, "ea": 6, "entant": [6, 8, 9, 13], "tom": 6, "is_in_db": [6, 13], "sometabl": 6, "somefield": 6, "some_valu": 6, "caus": [6, 11], "in\u00edci": 6, "keyword": [6, 8, 9], "attached": [6, 12], "preceded": [6, 11], "underscor": [6, 9, 11], "naming": 6, "conflicts": 6, "_extr": 6, "condi\u00e7\u00f5": 6, "easiest": 6, "conditions": [6, 11], "met": [6, 8, 9], "uniqu": [6, 7, 11], "autom\u00e1t": 6, "account": 6, "accnum": 6, "acctype": 6, "accdesc": 6, "null": [6, 7, 11, 15], "fieldnam": [6, 15], "dispon": 6, "escrit": [6, 8], "garant": [6, 8], "obras": 6, "simplific": 6, "vis\u00e3": 6, "Estes": 6, "length": [6, 11], "ondelet": 6, "notnull": 6, "uploadfield": 6, "widget": [6, 11], "label": [6, 7, 8, 11, 15], "comment": [6, 9], "searchabl": 6, "listabl": 6, "authoriz": [6, 7], "autodelet": 6, "uploadfold": 6, "uploadseparat": 6, "uploadfs": 6, "custom_qualifi": 6, "map_non": 6, "Nem": 6, "compriment": 6, "compat": 6, "constru\u00edd": [6, 13], "preench": 6, "previ": [6, 11], "apropri": 6, "ness": 6, "validator": [6, 11], "foruml\u00e1ri": [6, 9, 16], "enforced": [6, 11, 14], "forms": [6, 9, 13, 14, 15], "addition": [6, 8], "sometim": [6, 8, 9, 11], "seem": 6, "redundant": 6, "maintain": [6, 8, 15], "distinction": 6, "efet": 6, "instru\u00e7\u00e3": 6, "cascat": 6, "exclu": 6, "desativ": 6, "conjunt": [6, 9, 10, 13], "imped": [6, 9], "nul": 6, "exclus": 6, "appli": [6, 11, 15], "somewher": 6, "uploads": 6, "discussed": [6, 8, 9, 11], "detail": [6, 9, 13, 15], "uploaded": [6, 11, 14], "upload_fold": [6, 11], "points": [6, 7, 11, 13], "optimized": 6, "subfold": 6, "attention": 6, "breaking": 6, "eith": [6, 11], "separat": [6, 11, 12, 15], "changing": 6, "behavior": [6, 11, 14, 15], "prevent": [6, 9, 11], "happens": 6, "mov": 6, "amazon": 6, "s3": 6, "sftp": 6, "pyfilesyst": 6, "funcion": [6, 16], "deleted": 6, "due": [6, 7, 11], "operation": [6, 12], "trigg": [6, 15], "associated": [6, 11, 12], "autogenerated": 6, "grav\u00e1vel": 6, "formul\u00e1ri": [6, 12, 13, 16], "leg\u00edvel": 6, "autentic": 6, "autoriz": 6, "guaranteed": [6, 14], "reset": 6, "is_length": 6, "512": 6, "32": [6, 11], "768": 6, "31": [6, 7, 11], "gib": 6, "boolean": [6, 13], "is_float_in_rang": 6, "1e100": 6, "decimal": [6, 11], "is_decimal_in_rang": 6, "is_dat": 6, "is_tim": 6, "is_datetim": 6, "_id": [6, 9, 11, 15], "is_empty_or": 6, "is_json": 6, "bigint": 6, "63": [6, 11], "grand": 6, "devolv": [6, 8], "pont": 6, "respect": [6, 11, 13], "certain": [6, 8, 11, 13], "denormalization": 6, "listproperty": 6, "stringlistproperty": 6, "relational": 6, "lists": [6, 13], "items": [6, 7, 8, 11], "item": [6, 8, 9], "escaped": [6, 8, 9], "pretty": [6, 11, 14], "explanatory": 6, "backported": 6, "portability": 6, "base64": [6, 8, 15], "decoded": 6, "extracted": 6, "negativ": [6, 11], "33": [6, 11], "spac": [6, 8, 11, 13], "necessary": [6, 8, 9], "making": [6, 8], "communication": 6, "escaping": [6, 8], "maior": [6, 7], "_format": 6, "sublinh": 6, "poss\u00edv": 6, "Da": 6, "pai": 6, "_tabl": [6, 11, 15], "_tablenam": 6, "_db": 6, "constru\u00e7\u00e3": [6, 9, 13], "v\u00ea": 6, "validat": [6, 11], "tupl": [6, 8, 9], "consider": [6, 8, 9], "myfil": 6, "imag": [6, 8, 9, 11], "relat": 6, "atribu\u00edd": 6, "habilit": 6, "duplicat": 6, "file_content": [6, 15], "file_nam": [6, 15], "feit": 6, "ocasional": 6, "mei": 6, "rb": 6, "Tamb\u00e9m": 6, "ficheir": 6, "corrent": 6, "lev": [6, 9], "flux": 6, "extens\u00e3": 6, "tempor\u00e1ri": 6, "assoc": [6, 10], "inv\u00e9s": 6, "image_fil": 6, "opost": 6, "fullnam": 6, "nameonly": 6, "recup": 6, "pront": 6, "clos": [6, 9], "contextlib": 6, "shutil": 6, "wb": 6, "copyfileobj": 6, "definition": [6, 7, 11, 13], "differs": [6, 13], "letting": 6, "removing": 6, "second": [6, 9, 11, 12, 14], "adding": [6, 11, 13], "newly": 6, "referim": 6, "logfil": 6, "unnamed": 6, "Nos": 6, "descart": 6, "columns": [6, 16], "recommended": [6, 11], "disabl": [6, 13], "impor": 6, "solt": 6, "hor": 6, "lix": 6, "fins": 6, "reclam": 6, "an\u00e1lis": 6, "corromp": 6, "quest\u00e3": 6, "cons": 6, "actualiz": 6, "gen\u00e9r": 6, "t\u00edpic": 6, "transa\u00e7\u00f5": 6, "menor": 6, "\u00e9poc": 6, "comet": 6, "fic": 6, "envolv": 6, "convers\u00e3": 6, "acontec": 6, "exat": [6, 8], "reconstru": 6, "metad": 6, "aquel": [6, 12], "attempting": 6, "prudent": 6, "yourapp": 6, "descrev": 6, "estreit": 6, "fak": 6, "alex": 6, "trunc": 6, "reinic": 6, "recomec": 6, "identity": [6, 7, 11, 14], "bulk_insert": 6, "inser\u00e7\u00f5": 6, "relacion": 6, "vantag": 6, "looping": 6, "veloc": 6, "caiu": 6, "tr\u00eas": 6, "carl": 6, "pertenc": 6, "q": [6, 13], "tal": 6, "escrev": [6, 8, 9], "fat": 6, "birthplac": 6, "chicag": 6, "houv": 6, "nasc": 6, "terr": 6, "natal": 6, "crit\u00e9ri": 6, "selec\u00e7\u00e3": 6, "pet": [6, 7, 13], "rov": 6, "ret": 6, "fianc": 6, "erros": 6, "mant\u00e9m": 6, "mapeament": 6, "cuj": 6, "rar": 6, "similar": [6, 9], "etiquet": [6, 9], "propriedad": 6, "anex": 6, "tools": [6, 12, 15], "properti": [6, 11], "id1": 6, "cha": 6, "id2": 6, "material": 6, "wood": 6, "assert": 6, "implemented": 6, "thing_tags_default": 6, "tail": 6, "flexibl": [6, 12], "instru\u00e7\u00f5": 6, "u": [6, 9], "seleccion": 6, "cinc": 6, "placeholders": 6, "colnam": 6, "as_ordered_dict": 6, "substitu\u00edd": 6, "espac": [6, 10, 13], "results": [6, 8, 11, 13], "cursor": [6, 15], "dictionari": 6, "applying": [6, 13], "field1": 6, "val1_row1": 6, "field2": 6, "val2_row1": 6, "val1_row2": 6, "val2_row2": 6, "bonit": 6, "tecl": [6, 10], "ordereddict": 6, "reflet": 6, "adi\u00e7\u00e3": 6, "extra\u00edd": 6, "express\u00e3": [6, 7, 10, 13], "quaisqu": [6, 11], "r\u00f3tul": [6, 9, 13], "arbitr\u00e1ri": 6, "fict\u00edci": 6, "rea": 6, "\u00fatil": 6, "depur": [6, 8], "selecting": 6, "timed": 6, "_timings": 6, "took": 6, "expl\u00edcit": [6, 12], "recorrent": 6, "myidx": 6, "dialet": 6, "SE": 6, "direct": 6, "sid": [6, 15, 16], "comand": 6, "_count": 6, "susan": 6, "iterabl": [6, 11], "whos": [6, 8, 11], "act": 6, "diff": 6, "latt": [6, 11, 14], "fileir": 6, "loop": [6, 8], "imprim": 6, "etap": 6, "entend": 6, "pergunt": 6, "particularly": 6, "handy": 6, "compact": 6, "nota\u00e7\u00e3": [6, 9], "sim": 6, "incomum": 6, "delete_record": 6, "iterators": 6, "avali": [6, 8], "aliment": 6, "lac": 6, "tradicion": 6, "tradicional": 6, "dramat": 6, "iterselect": 6, "cerc": 6, "m\u00e1quin": [6, 9], "reescrev": 6, "sele\u00e7\u00e3": [6, 9], "tir": 6, "proveit": 6, "repr_row": 6, "gerador": 6, "wouldn": 6, "anyway": 6, "myrecord": 6, "shortcut": [6, 8, 11], "19": [6, 7, 11], "02": [6, 11], "convenient": [6, 16], "aparent": 6, "flex\u00edvel": 6, "verif": 6, "levant": 6, "cois": 6, "owner_id": 6, "vincul": 6, "ineficient": 6, "tr\u00e1s": 6, "owns": 6, "actu": 6, "decomp\u00f5": 6, "s\u00e9ri": 6, "classific": [6, 13], "invers": 6, "til": 6, "aparec": 6, "aleat\u00f3r": 6, "random": [6, 8, 11, 12, 15], "super": 6, "concaten": 6, "grup": [6, 12], "condicional": 6, "condi\u00e7\u00e3": 6, "query1": 6, "query2": 6, "consulta1": 6, "efeit": 6, "necessit": 6, "sen\u00e3": 6, "desloc": 6, "offset": [6, 7], "m\u00e1x": 6, "implicit": 6, "pagin": [6, 13], "desempenh": 6, "involved": [6, 8], "managing": 6, "sections": 6, "respectively": [6, 11], "cacheabl": 6, "caching": [6, 16], "trad": 6, "offs": 6, "bin\u00e1ri": 6, "neg": 6, "invert": [6, 11], "nega\u00e7\u00e3": 6, "un\u00e1ri": 6, "sobrecarg": 6, "forma\u00e7\u00e3": 6, "precedent": 6, "compar": [6, 14], "par\u00eantes": 6, "unit\u00e1ri": 6, "elev": 6, "negated": 6, "constru": [6, 9, 13], "vaz": 6, "contag": 6, "jog": [6, 10], "elimin": [6, 13], "ken": 6, "visits": 6, "clicks": [6, 15], "cl\u00e1usul": [6, 8], "condition": [6, 11, 16], "yes_or_n": 6, "curt": 6, "confund": 6, "philip": 6, "modified_on": 6, "retain": 6, "mindful": 6, "inclu\u00edd": [6, 9], "compost": [6, 9], "vari": 6, "usam": 6, "first_row": 6, "last_row": 6, "obvi": 6, "indo": 6, "pretend": 6, "esquec": 6, "table_nam": 6, "consegu": 6, "otimiz": 6, "rows_list": 6, "first_row_dict": 6, "themselv": [6, 8], "allowed": [6, 7, 11, 12], "rows1": 6, "rows2": 6, "uni\u00e3": 6, "rows3": 6, "remo\u00e7\u00e3": 6, "intersec\u00e7\u00e3": 6, "in\u00fatil": 6, "manipul": 6, "inalter": 6, "origin": 6, "signific": [6, 8], "\u00f3bvi": [6, 8], "element": [6, 8, 9, 11, 13, 15], "validad": 6, "cache_db_select": 6, "cache\u00e1vel": 6, "falt": 6, "aceler": 6, "calcul": 6, "unit_pric": 6, "quantity": [6, 11], "total_pric": 6, "rid": 6, "99": 6, "9": [6, 7, 11, 13, 14], "95": 6, "1l": 6, "retrieval": 6, "wik": [6, 7], "searching": [6, 9], "normalized": 6, "evaluated": [6, 7], "subse\u00e7\u00e3": 6, "dif": 6, "daquel": 6, "se\u00e7\u00e3": 6, "discounted_total": 6, "discount": 6, "impl\u00edcit": 6, "pens": 6, "niss": 6, "percentual": 6, "dig": 6, "15": [6, 11, 12, 13], "appe": [6, 11], "cont\u00eain": 6, "instanci": 6, "myvirtualfields": 6, "virtualfields": 6, "order_it": 6, "agir": [6, 9], "setvirtualfields": 6, "myvirtualfields1": 6, "discounted_unit_pric": 6, "90": [6, 7], "myvirtualfields2": 6, "discounted_total_pric": 6, "lazy_total_pric": 6, "ilustr": [6, 8], "owner": [6, 11], "intended": [6, 15], "ex": 6, "c\u00edclic": 6, "insir": 6, "boat": 6, "sho": 6, "adquir": 6, "jun\u00e7\u00e3": [6, 12], "transparent": [6, 8, 11], "si": [6, 13], "unid": 6, "owner_id1": 6, "owner_id2": 6, "with_al": 6, "particip": 6, "esquerd": [6, 13], "jun\u00e7\u00f5": 6, "pertencent": 6, "propriet\u00e1ri": 6, "incorpor": 6, "clar": 6, "igual": [6, 7], "pr\u00f3pri": [6, 13], "ajust": 6, "barc": 6, "intermedi\u00e1r": 6, "ownership": 6, "reescrit": 6, "co": [6, 11], "propriet\u00e1r": 6, "vias": 6, "persons_and_things": 6, "rela\u00e7\u00f5": 6, "father_id": 6, "mother_id": 6, "deriv": 6, "fid": 6, "mid": 6, "claud": 6, "fath": 6, "moth": 6, "AS": 6, "opt\u00e1m": 6, "distin\u00e7\u00e3": 6, "comunic": 6, "diferenc": 6, "sutil": 6, "errad": 6, "corret": 6, "event": 6, "event_tim": 6, "gravidad": 6, "severity": 6, "Como": [6, 16], "varredur": 6, "inje\u00e7\u00e3": 6, "xss": [6, 8, 9], "scan": 6, "injection": 6, "unauthorized": 6, "personag": 6, "sinal": 6, "wild": 6, "card": 6, "sequ\u00eanc": 6, "ansi": 6, "COMO": 6, "sens\u00edvel": 6, "case_sensitiv": 6, "aproxim": 6, "meaning": [6, 11, 12], "value1": 6, "value2": 6, "grau": 6, "apoi": 6, "gost": 6, "2018": 6, "aninh": [6, 9], "bad_days": 6, "jonathan": 6, "nested_select": 6, "m\u00e9d": 6, "estam": 6, "43": 6, "substring": [6, 11], "pux": 6, "sysus": 6, "pow": [6, 15], "coa": 6, "matem\u00e1t": 6, "resgat": 6, "dumpfil": 6, "converting": 6, "produc": [6, 9, 11, 12], "newlin": [6, 11], "export_to_csv_fil": 6, "explict": 6, "exporting": 6, "importing": 6, "finds": 6, "assigned": [6, 11, 12, 14], "ids": 6, "restaur": 6, "somefil": 6, "field3": 6, "separ": [6, 13], "extrem": 6, "despej": 6, "suficient": [6, 13], "ter\u00e3": 6, "nid": 6, "c\u00f3p": 6, "mescl": 6, "acompanh": 6, "64": [6, 8, 15], "stringi": 6, "set_head": 6, "getvalu": 6, "import_and_sync": 6, "_type": [6, 9, 11, 15], "_nam": [6, 9, 11, 15], "vars": [6, 9, 11, 14], "rpc": 6, "nel": 6, "rotul": 6, "uuids": 6, "preocup": 6, "thead": 6, "tr": 6, "th": 6, "tbody": 6, "w2p_odd": 6, "odd": [6, 8], "td": 6, "w2p_even": 6, "easily": [6, 8, 9, 11, 13], "f": [6, 12, 13, 14, 15], "brut": 6, "quotech": 6, "aspas": 6, "cota\u00e7\u00e3": 6, "quote_minimal": 6, "oufil": 6, "quote_nonnumeric": 6, "35": 6, "description": [6, 7, 11, 12], "2013": 6, "oficial": 6, "itens": 6, "escap": [6, 8, 9], "is_in_set": 6, "toy": 6, "car": 6, "products": 6, "costum": 6, "requisit": [6, 16], "particular": 6, "normaliz": 6, "restri\u00e7\u00e3": 6, "got": 6, "v\u00edrgul": 6, "leitur": 6, "gend": 6, "doctor": 6, "specialization": 6, "fict\u00edc": 6, "is_activ": 6, "created_on": 6, "created_by": 6, "modified_by": 6, "payment": 6, "amount": 6, "princ\u00edpi": [6, 16], "activ": [6, 12], "herd": 6, "certifiqu": [6, 10], "accomplished": [6, 12, 14], "anyobj": 6, "obj": [6, 8], "dumps": [6, 15], "loads": [6, 15], "myobj": 6, "aid": 6, "myobjnam": 6, "accomplish": 6, "sqlcustomtyp": 6, "seis": 6, "_before_insert": 6, "_after_insert": 6, "_before_updat": 6, "_after_updat": 6, "_before_delet": 6, "_after_delet": 6, "acrescent": 6, "ressalv": 6, "pprint": 6, "callback": [6, 12, 15], "before_insert": 6, "after_insert": 6, "oprow": 6, "before_updat": 6, "after_updat": 6, "before_delet": 6, "after_delet": 6, "especializ": 6, "_antes_": 6, "dispar": 6, "infinit": 6, "update_naiv": 6, "schem": [6, 11], "relationships": 6, "deletions": 6, "known": [6, 8], "cascading": 6, "informed": 6, "consequenc": [6, 11, 15], "deletion": 6, "enable_record_versioning": 6, "stored_it": 6, "ocult": [6, 11], "padroniz": 6, "vers\u00f5": 6, "_enable_record_versioning": 6, "archive_db": 6, "archive_nam": 6, "stored_item_archiv": 6, "current_record": 6, "grav": 6, "escond": 6, "generaliz": 6, "tenancy": 6, "blog_post": 6, "subject": [6, 7, 12], "post_text": 6, "is_public": 6, "posts": 6, "p\u00fablic": 6, "_common_filt": 6, "fras": 6, "visualiz": 6, "ignore_common_filters": [6, 11], "common_filters": 6, "suponh": 6, "enderec": 6, "ip": [6, 11], "ip2int": 6, "sv": 6, "ipv4": [6, 11], "sp": 6, "split": [6, 7, 8, 11], "iip": 6, "int2ip": 6, "iv": 6, "ov": 6, "divmod": 6, "256": 6, "nativ": 6, "encod": 6, "decod": 6, "websit": [6, 15], "ipaddr": 6, "wikiped": [6, 7], "91": 6, "198": 6, "174": 6, "192": [6, 11], "172": [6, 11], "217": 6, "11": [6, 11], "74": 6, "125": 6, "65": 6, "207": 6, "97": 6, "227": 6, "239": 6, "f\u00e1bric": 6, "Seu": 6, "quant": 6, "marked": 6, "across": [6, 8], "v\u00e3": 6, "fug": [6, 8], "fas": 6, "db_a": 6, "db_b": 6, "simultan": 6, "distributed_transaction_commit": 6, "desfaz": 6, "possibil": 6, "suced": 6, "estiv": 6, "mydb": 6, "font": [6, 8, 11, 13], "cam": [6, 10], "abstra\u00e7\u00e3": 6, "2010": 6, "connectionpool": 6, "baseadapt": 6, "extends": [6, 8, 15], "se\u00e7\u00f5": 6, "conf": 6, "myvalu": 6, "deleg": 6, "_adapt": 6, "_listify": 6, "list_of_fields": 6, "constr\u00f3": 6, "book": 6, "sqliteadapt": 6, "jdbcsqliteadapt": 6, "mysqladapt": 6, "postgresqladapt": 6, "jdbcpostgresqladapt": 6, "oracleadapt": 6, "mssqladapt": 6, "mssql2adapt": 6, "mssql3adapt": 6, "mssql4adapt": 6, "firebirdadapt": 6, "firebirdembeddedadapt": 6, "informixadapt": 6, "db2adapt": 6, "ingresadapt": 6, "ingresunicodeadapt": 6, "googlesqladapt": 6, "nosqladapt": 6, "googledatastoreadapt": 6, "cubridadapt": 6, "teradataadapt": 6, "sapdbadapt": 6, "couchdbadapt": 6, "imapadapt": 6, "mongodbadapt": 6, "verticaadapt": 6, "sybaseadapt": 6, "char": 6, "varch": 6, "longtext": 6, "credential_decod": 6, "pool_connection": 6, "foreign_key_checks": 6, "sql_mod": 6, "no_backslash_escap": 6, "lastrowid": 6, "last_insert_id": 6, "fetchon": 6, "olhand": 6, "mapping": [6, 11, 14], "couchdb": 6, "ibm_db_dbi": 6, "db2ibm": 6, "db2pyodbc": 6, "firebird_embedded": 6, "firebirdembedded": 6, "googlemysql": 6, "googledatastor": 6, "googlepostgr": 6, "googlesql": 6, "informixs": 6, "ingresu": 6, "ingresunicod": 6, "jdbc": 6, "jdbcpostgr": 6, "jdbcsqlit": 6, "mong": 6, "mssql1": 6, "mssql2": 6, "mssql1n": 6, "mssql3n": 6, "mssql4n": 6, "mssqln": 6, "postgres2": 6, "postgrenew": 6, "postgrepsyconew": 6, "postgres3": 6, "postgreboolean": 6, "postgrepsycoboolean": 6, "postgrepsyc": 6, "pytds": 6, "sap": 6, "spatialit": 6, "vertic": 6, "parsed": 6, "obtained": 6, "sqladapt": 6, "recognized": 6, "mysqldv": 6, "dropping": 6, "altering": 6, "remain": [6, 11], "invisibl": 6, "decid": [6, 11, 13], "reinstat": 6, "fail": [6, 8, 11], "rebuilt": 6, "awar": 6, "extract": [6, 11], "cient": 6, "failur": [6, 11, 15], "unfortunat": 6, "prevented": 6, "fixed": [6, 14], "aftermath": 6, "migrated": 6, "corruption": 6, "migrating": [6, 14], "deleting": [6, 13], "corrupted": 6, "py4web_filesyst": 6, "fetch": [6, 14, 15], "reforc": 6, "raz\u00f5": 6, "superseeded": 6, "obsolet": 6, "circul": 6, "bug": 6, "on_delete_action": 6, "NO": 6, "alcanc": 6, "agreg": 6, "run_in_transaction": 6, "seq\u00fcenc": 6, "liststringproperty": 6, "restful": [7, 12], "cit0801": 7, "inspired": 7, "graphql": 7, "cit0802": 7, "less": [7, 11, 14], "powerful": [7, 12, 14], "spirit": 7, "easi": [7, 8], "denormaliz": 7, "policy": 7, "impli": 7, "disabled": [7, 9, 11], "fields": [7, 11, 12, 13, 14, 16], "specifications": 7, "might": [7, 11], "superhero": 7, "isdir": [7, 11, 13], "job": [7, 11, 13], "strength": 7, "entri": [7, 11, 13], "clark": [7, 13], "kent": [7, 13], "journalist": [7, 13], "park": [7, 13], "photograph": [7, 13], "bruc": [7, 13], "wayn": [7, 13], "ceo": [7, 13], "spiderman": [7, 13], "batman": [7, 11, 13], "flight": 7, "speed": [7, 8], "durability": 7, "75": 7, "80": [7, 11], "70": 7, "allowed_patterns": 7, "reasons": 7, "rec_id": 7, "allow": [7, 8, 9, 11, 12, 13, 15], "deny": 7, "record_id": [7, 15], "get_vars": [7, 14], "post_vars": [7, 14], "patterns": 7, "pattern": 7, "expost": 7, "let": [7, 11, 15], "diagr": 7, "interpreting": 7, "posted": 7, "formdat": 7, "eq": 7, "gt": [7, 9], "queried": 7, "sup": 7, "her\u00f3": 7, "ident": 7, "refers": 7, "superpotent": 7, "preceding": 7, "linked": 7, "v\u00f4o": 7, "said": 7, "record": [7, 11, 12, 14, 15], "equal": [7, 11, 12, 15], "modifiers": 7, "obvious": [7, 8, 12], "status": 7, "200": [7, 11, 14, 15], "2019": 7, "05": 7, "19t05": 7, "38": 7, "00": 7, "132635": 7, "api_version": 7, "2021": 7, "01": 7, "04t07": 7, "466030": 7, "regex": [7, 9, 11], "post_writabl": 7, "referenced_by": 7, "put_writabl": 7, "178974": 7, "desnormaliz": 7, "renom": 7, "123218": 7, "recolh": [7, 13], "559918": 7, "201988": 7, "322494": 7, "readability": 7, "powers": 7, "309903": 7, "355181": 7, "34": 7, "974953": 7, "405515": 7, "366288": 7, "451907": 7, "453020": 7, "iso": 7, "8601": 7, "matching": [7, 9, 11], "representational_state_transf": 7, "distinct": [8, 11], "rendering": [8, 9], "reno": 8, "plus": [8, 12, 13], "minor": [8, 14], "trickery": 8, "seamlessly": 8, "squar": 8, "brackets": [8, 11], "embedded": [8, 11], "angle": 8, "editors": 8, "mix": 8, "soon": [8, 15], "bracket": 8, "separating": [8, 11], "embedding": 8, "indented": 8, "according": 8, "rul": [8, 11, 13], "un": [8, 9, 10, 15], "indentation": 8, "blocks": 8, "ending": 8, "colon": 8, "beginning": [8, 11, 12], "palavr": [8, 9, 10], "emacs": 8, "divis\u00e3": 8, "bloc": [8, 9], "indent": 8, "br": [8, 9], "report": 8, "debugged": 8, "dom": [8, 16], "inspector": 8, "introduz": 8, "mediant": 8, "corp": [8, 9], "interior": 8, "p\u00e1gin": [8, 9, 13, 16], "vulner": 8, "transparently": 8, "replaced": [8, 9, 11, 15], "dummyrespons": 8, "practic": [8, 11], "editing": [8, 9, 11, 12, 13], "new_app": [8, 9], "iter": 8, "ul": [8, 11, 12, 15], "li": [8, 11, 12, 15], "apresent": 8, "condicion": 8, "randint": [8, 12], "h2": [8, 11], "45": [8, 11], "encerr": 8, "incorret": 8, "divisibl": [8, 11], "statements": [8, 11], "division": [8, 9], "excep\u00e7\u00e3": 8, "ol\u00e1": 8, "itemize1": 8, "href": [8, 9, 12, 13], "itemize2": 8, "exact": [8, 14], "represent": [8, 9, 11], "pedac": 8, "frent": 8, "terminat": [8, 15], "statement": 8, "modifying": 8, "tre": [8, 11], "foot": 8, "convention": [8, 11, 14], "minimalist": [8, 14], "minimalist_pag": 8, "extended": 8, "titl": [8, 11, 15], "recursively": 8, "resulting": [8, 11, 15], "bytecod": 8, "pyc": 8, "entir": [8, 14, 15], "inserted": 8, "sidebar_enabled": 8, "hom": 8, "excerpt": 8, "sideb": 8, "assignment": 8, "gets": [8, 12], "anywher": [8, 14], "worth": 8, "though": 8, "impos": 8, "limitation": 8, "noted": 8, "determined": [8, 11], "compiling": 8, "significant": 8, "avoided": 8, "alternativ": [8, 11], "some_condition": 8, "this_templat": 8, "that_templat": 8, "compilation": 8, "layouts": [8, 13], "encapsulat": [8, 9], "commonality": 8, "footers": 8, "menus": [8, 11], "mysideb": 8, "contents": [8, 9, 15], "predefin": 8, "enclosing": 8, "over": [8, 13, 15], "riding": 8, "consistency": 8, "desir": 8, "substitutions": 8, "ships": 8, "doctyp": [8, 13], "viewport": 8, "width": [8, 11], "devic": 8, "initial": [8, 11], "rel": [8, 13], "icon": [8, 13], "aaabaaeaaqeaaaeaiaawaaaafgaaacgaaaabaaaaagaaaaeaiaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaapaaaaa": 8, "stylesheet": [8, 13], "cdnjs": [8, 13], "cloudflar": [8, 13], "ajax": [8, 13, 15], "libs": [8, 9, 13], "awesom": [8, 13], "14": [8, 11, 13], "min": [8, 11, 13], "integrity": 8, "sha512": [8, 11], "1pkogiy59xj8co8": 8, "ne6fz": 8, "loazkjy": 8, "ky8iq0g4b3cyey6wyhn3yt9pw0xpsrivlkmxe40ptknxrlnz9": 8, "fkdaog": 8, "crossorigin": 8, "margin": [8, 15], "top": [8, 11, 12], "16px": 8, "8em": [8, 15], "page_head": 8, "customiz": [8, 11, 13], "navigation": [8, 15], "bar": [8, 13], "nav": 8, "black": [8, 11], "Do": [8, 11, 13, 16], "touch": 8, "hamburg": 8, "checkbox": [8, 9], "left": [8, 11, 13, 15], "menu": [8, 11, 12], "page_left_menu": 8, "navb": [8, 12], "profil": [8, 12, 14], "change_password": [8, 12], "flash": [8, 15, 16], "padded": [8, 14], "contect": 8, "mad": [8, 11, 13], "gott": 8, "page_scripts": 8, "scripts": [8, 9], "few": [8, 12, 15], "html5": 8, "58": 8, "accordingly": 8, "54": 8, "123": [9, 11], "myclass": 9, "thisisatest": 9, "programmatically": [9, 11], "positional": 9, "interpreted": 9, "contained": [9, 11, 13], "named": 9, "dicion\u00e1ri": [9, 10, 11], "metatag": 9, "tagg": 9, "xmlescap": 9, "expressions": [9, 11, 15], "prest": 9, "lt": 9, "strings": [9, 11, 13], "equivalently": 9, "shell": 9, "concatenating": 9, "rela\u00e7\u00e3": 9, "ab": [9, 11], "yb": 9, "h\u00edfens": 9, "_dat": 9, "collapsibl": 9, "hyphen": 9, "notation": 9, "pairs": 9, "dinam": 9, "soap": 9, "whatev": [9, 15], "_xmlns": 9, "xmlns": 9, "renderiz": 9, "insegur": 9, "entered": 9, "scripting": 9, "visitors": [9, 11], "injections": 9, "permitted_tags": 9, "allowed_attribut": 9, "blockquot": 9, "target": [9, 15], "alt": 9, "colspan": 9, "assistent": 9, "_bgcolor": 9, "bgcolor": 9, "concatenat": 9, "bold": 9, "insist": 9, "_action": 9, "_method": 9, "headings": [9, 13], "subheadings": 9, "cabec": [9, 13], "tagging": [9, 12], "it\u00e1l": 9, "embed": 9, "_src": 9, "png": [9, 11], "_alt": 9, "inclus\u00e3": 9, "est\u00e1t": [9, 16], "envi": [9, 13], "r\u00e1di": 9, "_valu": [9, 11, 15], "radi": [9, 11], "buttons": [9, 11, 13, 15], "_checked": 9, "checked": [9, 11], "stands": 9, "ordered": 9, "_selected": 9, "thank": 9, "ok": [9, 14], "pr\u00e9": [9, 13, 16], "prefer": 9, "listagens": 9, "marca\u00e7\u00e3": 9, "whit": [9, 15], "Estas": 9, "junt": [9, 13], "matriz": 9, "posicion": 9, "rows": [9, 11, 13, 14], "oposi\u00e7\u00e3": 9, "rodap": 9, "_cols": 9, "_rows": 9, "cols": 9, "monoespac": 9, "unordered": 9, "generator": 9, "_c": 9, "suprim": 9, "aut": 9, "fechament": 9, "termin": 9, "agrad": 9, "retribu": 9, "0x7fa533ff7640": 9, "kargs": 9, "supplied": 9, "first_only": 9, "z": [9, 11], "jquery": [9, 11, 15], "accepting": 9, "selector": [9, 15], "selector1": 9, "selector2": 9, "selectorn": 9, "descendant": 9, "ancestor": 9, "equals": [9, 12], "unquoted": 9, "_u": 9, "_disabled": 9, "specifying": 9, "abc": [9, 11], "xyz": [9, 11], "callabl": [9, 11], "el": 9, "searched": [9, 13], "textual": 9, "efg": 9, "factori": 9, "injecting": 9, "timeoffset": 9, "sidebar_menu": 9, "i18n": 10, "p10n": 10, "fr": 10, "dog": [10, 11, 15], "tantissim": 10, "superior": 10, "express\u00f5": 10, "plural": 10, "chec": 10, "bed": 10, "postel": 10, "cachorr": 10, "deform": 10, "reserv": 10, "max": [10, 11, 15], "idiom": 10, "envolt": 10, "find_match": 10, "update_languag": 10, "supported": [10, 11, 12], "german": 10, "known_expressions": 10, "high": [11, 12], "deletabl": [11, 13], "formstyl": [11, 13, 15], "formstyledefault": [11, 13], "dbi": 11, "keep_valu": 11, "form_nam": 11, "hidden": [11, 15], "csrf_session": 11, "csrf_protection": 11, "lifespan": 11, "signing_inf": 11, "apag": 11, "disallow": 11, "renders": 11, "formstylebulm": [11, 13, 15], "formstylebootstrap4": 11, "grava\u00e7\u00f5": 11, "submet": 11, "validity": 11, "form_minimal": 11, "product_nam": 11, "product_quantity": 11, "not_accepted": 11, "form_exampl": 11, "intentionally": 11, "nor": 11, "management": 11, "form_basic": 11, "realnam": 11, "univers": 11, "dc": [11, 12], "comics": 11, "marvel": 11, "dual": 11, "explain": 11, "row": [11, 13, 15], "bottom": 11, "choos": [11, 12], "dropdown": [11, 13, 15], "prototyping": 11, "hand": [11, 15], "your_app": 11, "form_upload": 11, "required_fold": 11, "hashed": 11, "plugins": [11, 15], "checkboxwidget": 11, "datetimewidget": 11, "fileuploadwidget": 11, "listwidget": 11, "passwordwidget": 11, "radiowidget": 11, "selectwidget": 11, "textareawidget": 11, "improved": 11, "form_widgets": 11, "subclassing": 11, "improving": [11, 12], "form_custom_widgets": 11, "mycustomwidget": 11, "placehold": [11, 15], "no_tabl": [11, 15], "s_": [11, 15], "_placehold": [11, 15], "_titl": [11, 15], "_style": [11, 15], "mystyle": 11, "foreground": 11, "manipulated": 11, "manipulat": 11, "modify": [11, 13, 15], "granulary": 11, "submission": [11, 15], "inserting": 11, "begin": [11, 13], "detail_fields": 11, "frequently": 11, "redundancy": 11, "types": 11, "clash": 11, "isn": [11, 13], "ensur": 11, "surrounding": 11, "controls": 11, "correctly": 11, "stuff": [11, 13], "inject": [11, 16], "_onclick": 11, "doh": 11, "cancel": [11, 15], "attrs": [11, 13, 15], "history": 11, "drop": 11, "down": [11, 15], "lookups": 11, "selection": 11, "constructors": 11, "error_messag": 11, "fist": 11, "wrap": 11, "fill": [11, 15], "translation": [11, 14], "letters": 11, "numbers": 11, "alphanumeric": 11, "converts": 11, "us": 11, "phon": 11, "strict": 11, "fits": 11, "boundari": 11, "inputs": [11, 15], "maxsiz": 11, "255": 11, "minsiz": 11, "minimum": 11, "short": 11, "16": 11, "1kb": 11, "1mb": 11, "1048576": 11, "1024": 11, "cgi": 11, "fieldstorag": 11, "intuitively": 11, "rejects": 11, "breaks": 11, "syntactic": 11, "domain": [11, 12], "rfc": 11, "2616": 11, "semantic": [11, 12], "prepend": [11, 15], "front": [11, 15], "abbreviated": 11, "ca": 11, "2396": 11, "customizabl": [11, 13], "allowed_schem": 11, "exclud": 11, "lacking": 11, "rejected": 11, "prepended": [11, 14], "prepend_schem": 11, "prepending": 11, "internationalized": 11, "idn": 11, "3490": 11, "asci": 11, "punycod": 11, "3492": 11, "bit": 11, "beyond": 11, "standards": [11, 13], "hex": 11, "0x4e86": 11, "becom": 11, "4e": 11, "86": 11, "ftps": 11, "maxlen": 11, "slug": 11, "validated": 11, "repeated": 11, "dash": 11, "native_json": 11, "unchanged": 11, "hh": 11, "mm": 11, "ss": 11, "formats": 11, "yyyy": 11, "dd": 11, "symbols": 11, "symbol": 11, "year": [11, 15], "century": 11, "1963": 11, "day": 11, "month": 11, "28": 11, "08": 11, "aug": 11, "august": 11, "hour": 11, "24": 11, "clock": 11, "12": 11, "am": 11, "pm": 11, "minut": 11, "59": 11, "2008": 11, "2009": 11, "passwords": 11, "neith": 11, "strip": 11, "empty_regex": 11, "deprecated": [11, 15], "express": 11, "arrang": 11, "backward": 11, "compatibility": 11, "expressed": 11, "logical": 11, "terms": 11, "dot": 11, "fall": 11, "comparison": 11, "arithmetic": 11, "limits": 11, "internationaliz": 11, "decimals": 11, "floating": 11, "definit": 11, "ie": 11, "numerical": 11, "conversion": [11, 16], "filled": 11, "acceptanc": 11, "descriptiv": 11, "apple": 11, "banan": 11, "cherry": 11, "alphabetically": 11, "labels": 11, "sort": 11, "hulk": 11, "06": 11, "multiselect": 11, "exclusiv": [11, 12], "specials": 11, "forbidden": 11, "obviously": 11, "clev": 11, "enough": [11, 12], "cle": 11, "entropy": 11, "53": 11, "implicitly": 11, "performs": 11, "iterations": 11, "pbkdf2": 11, "byte": 11, "md5": 11, "hmac": 11, "thisisthekey": 11, "useless": [11, 14], "constant": 11, "mysaltvalu": 11, "somewhat": 11, "min_length": 11, "alg": 11, "consequently": 11, "invalidating": 11, "valued": 11, "emails": 11, "filter_in": 11, "split_emails": 11, "findall": 11, "mailt": 11, "customization": 11, "textar": 11, "sqlforms": 11, "blanks": 11, "operat": 11, "stand": 11, "onvalidation": 11, "accepts": 11, "emails_onvalidation": 11, "acts": 11, "attempted": 11, "through": 11, "dimensions": 11, "height": [11, 13, 15], "bmp": 11, "gif": 11, "jpeg": 11, "imaging": 11, "parts": 11, "taken": 11, "source1": 11, "extensions": 11, "lowercas": 11, "bypass": [11, 12], "200x200": 11, "pixels": 11, "extension": [11, 14], "crit": 11, "lastdot": 11, "separator": 11, "indicat": [11, 14], "tar": 11, "gz": 11, "insensitiv": 11, "thumbnail": 11, "jpg": 11, "older": 11, "regexlib": 11, "minip": 11, "maxip": 11, "is_localhost": 11, "is_privat": 11, "is_automatic": 11, "lowest": 11, "highest": 11, "flag": 11, "168": 11, "integers": 11, "boundary": 11, "199": 11, "forbid": 11, "meanings": 11, "169": 11, "254": 11, "network": [11, 12], "is_link_local": 11, "is_reserved": 11, "is_multicast": 11, "is_routeabl": 11, "is_6to4": 11, "is_tered": 11, "subnets": 11, "ipv6": 11, "allocated": 11, "networks": [11, 12], "fe80": 11, "ietf": 11, "multicast": 11, "ff00": 11, "6to4": 11, "2002": 11, "tered": 11, "2001": 11, "forcing": 11, "subnet": 11, "memb": [11, 12], "fb00": 11, "heading": 11, "blank": [11, 13], "removal": 11, "456": 11, "123456": 11, "synops": 11, "his": 11, "requirement": 11, "probability": 11, "rac": 11, "occurs": 11, "operationalerror": 11, "inserts": 11, "dbset": 11, "allowed_overrid": 11, "persons": 11, "days": 11, "registration_stamp": 11, "timedelt": 11, "value_field": 11, "representing_field": 11, "fourth": 11, "ten": 11, "selections": 11, "represented": 11, "orderby": [11, 12, 13, 15], "groupby": 11, "sorting": 11, "usefull": 11, "wishing": 11, "occasionally": 11, "_and": 11, "owners": 11, "subset": 11, "check_nonnegative_quantity": 11, "vital": 12, "multius": 12, "interchangeably": 12, "proc": 12, "confirms": 12, "say": 12, "guidelin": 12, "approv": 12, "step": [12, 14], "adiant": 12, "bloqu": 12, "nomeaplic": 12, "request_reset_password": 12, "reset_password": 12, "verify_email": 12, "sair": 12, "change_email": 12, "pr\u00f3pr": [12, 13], "allowed_actions": 12, "turn": [12, 13, 15], "verification": 12, "activated": 12, "successfully": 12, "challeng": 12, "submitting": 12, "correct": 12, "instantiation": [12, 13], "two_factor_filt": 12, "bypassed": 12, "sampl": 12, "user_outside_network": 12, "ipaddress": 12, "22": 12, "ip_list": 12, "ipv4network": 12, "ipv4address": 12, "mfa": 12, "sends": 12, "send_two_factor_email": 12, "from_address": 12, "youremail": 12, "flow": 12, "two_factor": 12, "endpoint": [12, 15], "_next_url": 12, "auth_plugins": 12, "hierarchical": 12, "saml": 12, "oauth": 12, "ui": 12, "adapt": 12, "exibi\u00e7\u00e3": [12, 13], "pam_plugin": 12, "pamplugin": 12, "register_plugin": 12, "vir": 12, "authenticat": 12, "directory": 12, "ldap_plugin": 12, "ldapplugin": 12, "ldap_setting": 12, "ad": 12, "base_dn": 12, "cn": 12, "ldap_settings": 12, "ubuntu": 12, "librari": 12, "apt": 12, "libldap2": 12, "libsasl2": 12, "oauth2googl": 12, "client_id": 12, "client_secret": 12, "callback_url": 12, "segred": 12, "oauth2facebook": 12, "oauth2discord": 12, "discord_client_id": 12, "discord_client_secret": 12, "uri": 12, "discriminator": 12, "mentioned": [12, 15], "verifying": 12, "existenc": 12, "showed": 12, "suffers": 12, "overkill": 12, "tagged_db": 12, "_tag": 12, "tagged_nam": 12, "danc": 12, "teach": 12, "auth_user_tagged_groups": 12, "chars": 12, "footing": 12, "authorized": 12, "displays": [12, 13], "not_authorized": 12, "find_by_tag": 12, "deix": 12, "exerc\u00edci": 12, "has_membership": 12, "school": 12, "physics": 12, "professor": 12, "ensin": 12, "m\u00e9di": 12, "f\u00edsic": 12, "colegial": 12, "creativity": 12, "auth_group": 12, "auth_groups": 12, "zapp": 12, "zap_id": 12, "zap": 12, "belongs": 12, "zapped": 12, "belong": [12, 14], "filtr": [12, 13], "membr": 12, "impersonat": 12, "switch_impersonation": 12, "is_impersonating": 12, "stop_impersonation": 12, "next_url": 12, "impersonating": 12, "specificed": 12, "capabiliti": [13, 15], "corn": 13, "ston": 13, "exclus\u00e3": 13, "desc": 13, "search_queri": 13, "OU": 13, "search_form": 13, "p\u00f3s": 13, "substitui\u00e7\u00f5": 13, "jpsteil": 13, "grid_tutorial": 13, "advised": 13, "doubt": 13, "finding": 13, "precious": 13, "hints": 13, "gridclassstylebulm": 13, "grid_class_styl": 13, "gridclassstyl": 13, "val": 13, "perfectly": 13, "usabl": 13, "refresh": 13, "icons": 13, "showing": 13, "placing": 13, "maintainabl": 13, "lead": [13, 15], "advanced": [13, 16], "topics": [13, 16], "htmx": [13, 16], "forget": 13, "field_id": 13, "show_id": 13, "editabl": [13, 14], "pre_action_buttons": 13, "post_action_buttons": 13, "auto_process": [13, 15], "rows_per_pag": 13, "include_action_button_text": 13, "search_button_text": 13, "responsibl": 13, "especifiqu": 13, "action_button": 13, "imediat": 13, "estil": 13, "styling": 13, "styles": 13, "utilizing": 13, "during": 13, "involv": [13, 14], "fifth": 13, "clickabl": 13, "hid": 13, "modifi": 13, "handling": 13, "por\u00e7\u00f5": 13, "grelh": 13, "primarily": 13, "class_styl": 13, "unfortunately": 13, "bootstrap": 13, "gridactionbutton": 13, "additional_cl": 13, "additional_styl": 13, "override_cl": 13, "override_styl": 13, "append_id": 13, "ignore_attribute_plugin": 13, "naveg": 13, "clic": 13, "fa": 13, "calend": 13, "aul": 13, "mensag": 13, "verdad": 13, "id_field_nam": 13, "id_valu": 13, "querystring": 13, "defining": 13, "improvement": 13, "10px": 13, "foo": 13, "filter_out": 13, "foreign": 13, "company": 13, "is_null_or": 13, "empres": 13, "qued": 13, "empreg": 13, "joined": 13, "employe": 13, "joins": [13, 16], "clicked": [13, 15], "sorted": 13, "search_text": 13, "far": [13, 15], "grids": 13, "antig": 14, "similariti": 14, "identical": 14, "light": 14, "predetermined": 14, "debuggers": 14, "ides": 14, "constraining": 14, "mann": 14, "admin": 14, "locat": 14, "my_url_path": 14, "assumed": 14, "postfix": 14, "matters": 14, "expected": 14, "wrappers": 14, "hard": 14, "analogy": 14, "hous": 14, "preprocessing": 14, "postprocessing": 14, "carry": 14, "underlying": 14, "preguic": 14, "dangerous": 14, "pyweb": 14, "ability": 14, "extensibl": 14, "lacks": 14, "requires_": 14, "mean": 14, "establishing": 14, "attaching": 14, "labeling": 14, "assigning": 14, "rocket": 14, "301": 14, "sophisticated": 14, "dismissal": 14, "file_path": 14, "csv": 14, "app_fold": 14, "requires_login": 14, "user_email": 14, "retrieved": 14, "big": 14, "decorated": 14, "websocket": 15, "async": 15, "play": 15, "compliant": 15, "great": 15, "flexibility": 15, "react": 15, "angul": 15, "complexity": 15, "systems": 15, "reaping": 15, "benefits": 15, "ecosyst": 15, "difficult": 15, "road": 15, "reactivity": 15, "emerging": 15, "complexiti": 15, "technically": 15, "transitions": 15, "sockets": 15, "hypertext": 15, "cit1601": 15, "frontends": 15, "integration": 15, "coupl": 15, "hx": 15, "_hx": 15, "url_to_post_t": 15, "submitted": 15, "started": 15, "htmx_form_dem": 15, "htmx_list": 15, "htmx_form": 15, "cancel_attrs": 15, "sidec": 15, "unpkg": 15, "sh": 15, "functional": 15, "maintenanc": 15, "navigat": 15, "anchor": 15, "fancy": 15, "confirmation": 15, "htmx_grid": 15, "attributes_plugin": 15, "attributespluginhtmx": 15, "new_sidec": 15, "edit_sidec": 15, "confirmations": 15, "widgets": [15, 16], "dropdowns": 15, "functools": 15, "params": 15, "autocomplete_query": 15, "fk_tabl": 15, "ktabl": 15, "fk_field": 15, "kfield": 15, "_autocomplete_search_fields": 15, "sf": 15, "_search": 15, "len": 15, "data_label": 15, "htmxautocompletewidget": 15, "simple_query": 15, "pop": 15, "hold": 15, "hidden_input": 15, "hidden_div": 15, "keyup": 15, "delay": 15, "500ms": 15, "s_autocomplete_results": 15, "indicator": 15, "vals": 15, "search_valu": 15, "s_search": 15, "_autocomplet": 15, "onload": 15, "elt": 15, "queryselector": 15, "onkeydown": 15, "check_": 15, "s_down_key": 15, "keycod": 15, "s_autocomplet": 15, "focus": 15, "selectedindex": 15, "formatt": 15, "formstylefactory": 15, "class_inner_exceptions": 15, "vendor": 15, "vendor_typ": 15, "product_record": 15, "earli": 15, "whichev": 15, "wish": 15, "overriding": 15, "vendors": 15, "limiting": 15, "subqueri": 15, "clearly": 15, "prototyp": 15, "var": 15, "supporting": 15, "selected_elements": 15, "queryselectorall": 15, "array": 15, "eval": 15, "sandbox": 15, "math": 15, "wrapp": 15, "recereived": 15, "get_cooki": 15, "extracts": 15, "register_vue_component": 15, "lazily": 15, "res": 15, "upload_help": 15, "bind": 15, "my_id": 15, "reimplementation": 15, "basically": 15, "translat": 15, "clientsid": 15, "serversid": 15, "debounc": 15, "stepping": 15, "setinterval": 15, "500": 15, "skip": 15, "implementations": 15, "delaying": 15, "200ms": 15, "onclick": 15, "1000ms": 15, "tags_inputs": 15, "comm": 15, "browsers": 15, "jsl": 15, "tags_input": 15, "zip_cod": 15, "freetext": 15, "safar": 15, "edge": 15, "datalist": 15, "firfox": 15, "undocumented": 15, "padding": 15, "inlin": 15, "block": 15, "bord": 15, "radius": 15, "100px": 15, "111111": 15, "3em": 15, "2em": 15, "2px": 15, "opacity": 15, "capitaliz": 15, "tag_input": 15, "score_input": 15, "scor": 15, "new_password": 15, "poor": 15, "man": 15, "trapped": 15, "component_1": 15, "mycomponent": 15, "blink": 15, "loading": 15, "serving": 15, "envelop": 15, "moreov": 15, "other_pag": 15, "acknowledgments": 16, "dic": 16, "sugest\u00f5": 16, "contribu": 16, "coloc": 16, "understanding": 16, "plataform": 16, "proced": 16, "corr": 16, "installations": 16, "fixur": 16, "urlsign": 16, "caveats": 16, "memoiz": 16, "introduction": 16, "migra\u00e7\u00f5": 16, "raw": 16, "sql": 16, "Comando": 16, "computed": 16, "virtual": 16, "relations": 16, "export": 16, "caracter\u00edst": 16, "avanc": 16, "pegadinh": 16, "polic": 16, "overview": 16, "impersonation": 16, "customizing": 16, "asynci": 16, "genindex": 16, "modindex": 16}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"O": [0, 1, 3, 4, 5, 6], "\u00e9": 0, "py4web": [0, 1, 6, 14, 15, 16], "acknowledgments": 0, "ajud": 1, "recurs": [1, 6], "dic": 1, "Este": 1, "manual": [1, 16], "grup": 1, "googl": [1, 2, 6, 12], "the": [1, 2, 4, 5, 6, 7, 11, 13, 15], "discord": [1, 12], "serv": [1, 5, 6, 9], "tutori": 1, "v\u00edd": 1, "As": 1, "font": [1, 2], "github": 1, "sugest\u00f5": 1, "pr\u00e9": [1, 2], "requisit": [1, 2], "Um": [1, 6], "local": [1, 2, 6], "trabalh": 1, "python": 1, "modern": 1, "depur": 1, "vscod": 1, "pycharm": 1, "Como": 1, "contribu": 1, "instal": 2, "coloc": 2, "funcion": 2, "understanding": 2, "design": [2, 11], "plataform": 2, "suport": [2, 6], "proced": 2, "configur": [2, 6], "part": [2, 6], "bin\u00e1ri": 2, "pip": 2, "installing": 2, "using": [2, 5, 8, 9, 12, 13, 15], "virtual": [2, 6], "environment": 2, "global": 2, "melhor": 2, "primeir": [2, 4], "corr": 2, "op\u00e7\u00f5": 2, "linh": 2, "comando": 2, "op\u00e7\u00e3": 2, "call": 2, "new_app": 2, "run": 2, "set_password": 2, "setup": 2, "shell": [2, 6], "version": [2, 6], "special": [2, 11], "installations": 2, "https": 2, "wsgi": 2, "deployment": 2, "on": 2, "gcloud": 2, "aka": 2, "gae": 2, "app": [2, 4], "engin": 2, "implant": 2, "pythonanywher": 2, "dock": 2, "podman": 2, "ubuntu": 2, "dashboard": 3, "A": [3, 6, 9, 11], "p\u00e1gin": [3, 4], "web": [3, 4], "principal": 3, "sess\u00e3": 3, "cri": 4, "aplic": [4, 6], "Do": 4, "princ\u00edpi": 4, "est\u00e1t": 4, "din\u00e2m": 4, "Em": 4, "valor": [4, 6], "retorn": [4, 6], "rot": 4, "objet": 4, "request": 4, "model": [4, 6], "_scaffold": 4, "copying": 4, "watch": 4, "fil": [4, 11, 14], "chang": 4, "fixur": 5, "fixtur": 5, "templat": [5, 8, 13], "inject": [5, 9], "translator": 5, "flash": [5, 14], "session": 5, "client": 5, "sid": [5, 9], "in": [5, 8, 9, 15], "cooki": 5, "memcach": 5, "red": [5, 13], "databas": [5, 6, 11], "anywher": 5, "sharing": 5, "sessions": 5, "condition": 5, "urlsign": 5, "dal": [5, 6], "auth": [5, 12, 14], "caveats": 5, "about": 5, "personaliz": [5, 6, 9, 13], "multipl": [5, 12], "caching": 5, "memoiz": 5, "decor": 5, "convenient": 5, "abstraction": 6, "lay": 6, "introduction": 6, "supported": 6, "quick": 6, "tour": 6, "usand": [6, 13], "stand": 6, "alon": 6, "experiment": 6, "construtor": 6, "assinatur": 6, "strings": 6, "conex\u00e3": 6, "par\u00e2metr": 6, "uri": 6, "pool": 6, "conex\u00f5": 6, "falh": 6, "tentat": 6, "tabel": [6, 16], "preguic": 6, "less": 6, "banc": 6, "dad": 6, "replic": 6, "palavr": 6, "chav": 6, "reserv": 6, "quoting": 6, "cas": 6, "faz": 6, "segur": 6, "outr": 6, "past": 6, "padr\u00e3": 6, "migra\u00e7\u00e3": 6, "commit": 6, "rollback": 6, "tabl": [6, 9], "define_tabl": 6, "id": 6, "not": 6, "sobr": 6, "prim\u00e1r": 6, "plural": 6, "singul": 6, "redefin": 6, "format": [6, 11, 15], "represent": 6, "fich": 6, "rnam": 6, "nom": 6, "real": 6, "primarykey": 6, "par": [6, 8, 14], "leg": 6, "migrat": 6, "fake_migrat": 6, "table_class": 6, "sequence_nam": 6, "trigger_nam": 6, "polymodel": 6, "on_defin": 6, "adicion": 6, "atribut": 6, "camp": [6, 13], "field": [6, 11], "types": 6, "and": [6, 7, 8, 11, 12, 13, 14, 15], "validators": [6, 11], "modific": 6, "temp": 6, "execu": 6, "Mais": 6, "envi": 6, "migra\u00e7\u00f5": 6, "fixa\u00e7\u00e3": 6, "quebr": 6, "resum": 6, "control": 6, "methods": [6, 14], "insert": 6, "query": 6, "set": [6, 11], "rows": 6, "update_or_insert": 6, "validate_and_insert": 6, "validate_and_updat": 6, "drop": 6, "marca\u00e7\u00e3": 6, "registr": 6, "raw": 6, "sql": 6, "executesql": 6, "_lastsql": 6, "temporiz": 6, "consult": 6, "\u00edndic": [6, 16], "generating": 6, "Comando": 6, "select": [6, 9], "selet": 6, "uso": 6, "mem\u00f3r": 6, "inferior": 6, "bas": 6, "iter": 6, "renderiz": 6, "atalh": 6, "obten\u00e7\u00e3": 6, "row": 6, "s": 6, "orderby": 6, "groupby": 6, "limitby": 6, "distinct": 6, "having": 6, "orderby_on_limitby": 6, "join": 6, "left": 6, "cach": 6, "orden": 6, "tend": 6, "distint": 6, "junt": 6, "deix": 6, "oper": 6, "l\u00f3gic": 6, "count": [6, 14], "isempty": 6, "delet": 6, "updat": 6, "express\u00f5": 6, "update_record": 6, "inser": 6, "atualiz": [6, 10], "dicion\u00e1ri": 6, "first": 6, "last": 6, "as_dict": 6, "as_list": 6, "combin": 6, "find": [6, 9], "exclud": 6, "sort": 6, "selects": 6, "computed": 6, "fields": 6, "comput": 6, "virtu": 6, "nov": 6, "estil": 6, "experimental": 6, "velh": 6, "antig": 6, "joins": 6, "relations": 6, "muit": 6, "rela\u00e7\u00e3": 6, "inner": 6, "out": 6, "agrup": 6, "cont": 6, "many": 6, "to": 6, "relation": 6, "aut": 6, "referent": [6, 13, 16], "alias": 6, "lik": 6, "ilik": 6, "regexp": 6, "startswith": 6, "endswith": 6, "contains": 6, "upper": 6, "low": 6, "year": 6, "month": 6, "day": 6, "hour": 6, "minut": 6, "seconds": 6, "belongs": 6, "sum": 6, "avg": 6, "min": 6, "max": 6, "len": 6, "substrings": 6, "Os": [6, 13], "defeit": 6, "coalesc": 6, "coalesce_zer": 6, "export": 6, "import": 6, "csv": 6, "cad": 6, "vez": 6, "tod": 6, "mesm": 6, "sincroniz": 6, "remot": 6, "html": [6, 9], "xml": [6, 9], "caracter\u00edst": 6, "avanc": 6, "list": 6, "type": [6, 11], "heranc": 6, "filter_in": 6, "filter_out": 6, "cham": 6, "inser\u00e7\u00e3": 6, "exclus\u00e3": 6, "cascad": 6, "record": 6, "filtr": 6, "comuns": 6, "tip": 6, "defin": 6, "transa\u00e7\u00e3": 6, "distribu\u00edd": 6, "copi": 6, "db": 6, "pegadinh": 6, "adapt": 6, "sqlit": 6, "mysql": 6, "mssql": 6, "microsoft": 6, "or\u00e1cul": 6, "nosql": 6, "datastor": 6, "restap": 7, "polic": 7, "actions": [7, 12], "get": 7, "practical": 7, "exampl": [7, 11, 13, 14, 15], "respons": 7, "linguag": 8, "yatl": [8, 9], "sintax": 8, "b\u00e1sic": 8, "whil": 8, "if": 8, "elif": 8, "else": 8, "tent": 8, "excet": 8, "finally": 8, "def": 8, "return": [8, 14], "information": 8, "workflow": 8, "extend": 8, "includ": 8, "extending": 8, "variabl": [8, 14], "functions": [8, 11], "block": 8, "sup": 8, "pag": 8, "layout": 8, "standard": [8, 11], "structur": [8, 11], "default": 8, "mobil": 8, "development": 8, "helpers": 9, "overview": 9, "built": 9, "body": 9, "cat": 9, "div": 9, "EM": 9, "form": [9, 11, 14, 15], "h1": 9, "h2": 9, "h3": 9, "h4": 9, "h5": 9, "h6": 9, "head": 9, "i": 9, "img": 9, "input": 9, "label": 9, "li": 9, "ol": 9, "option": 9, "p": 9, "pre": 9, "script": 9, "span": 9, "style": [9, 13], "tr": 9, "td": 9, "tbody": 9, "textar": 9, "th": 9, "thead": 9, "titl": 9, "tt": 9, "ul": 9, "url": 9, "tag": 9, "beautify": 9, "dom": 9, "children": 9, "internacionaliz": 10, "pluraliz": 10, "arquiv": 10, "tradu\u00e7\u00e3": 10, "foruml\u00e1ri": 11, "constructor": 11, "minimal": 11, "without": 11, "basic": [11, 13], "upload": 11, "widgets": 11, "custom": [11, 13], "advanced": [11, 15], "manipulation": 11, "forms": 11, "sidec": 11, "paramet": 11, "valid": 11, "formul\u00e1ri": 11, "text": 11, "is_alphanumeric": 11, "is_low": 11, "is_upp": 11, "is_email": 11, "is_match": 11, "is_length": 11, "is_url": 11, "is_slug": 11, "is_json": 11, "dat": 11, "tim": 11, "is_tim": 11, "is_dat": 11, "is_datetim": 11, "is_date_in_rang": 11, "is_datetime_in_rang": 11, "rang": 11, "equality": 11, "is_equal_t": 11, "is_not_empty": 11, "is_null_or": 11, "is_empty_or": 11, "is_expr": 11, "is_decimal_in_rang": 11, "is_float_in_rang": 11, "is_int_in_rang": 11, "is_in_set": 11, "checkbox": 11, "validation": 11, "dictionari": 11, "tupl": 11, "with": [11, 12, 14], "sorted": 11, "options": 11, "tagging": 11, "complexity": 11, "security": 11, "is_strong": 11, "crypt": 11, "is_list_of": 11, "is_list_of_emails": 11, "any_of": 11, "is_imag": 11, "is_fil": 11, "is_upload_filenam": 11, "is_ipv4": 11, "is_ipv6": 11, "is_ipaddress": 11, "other": 11, "cleanup": 11, "is_not_in_db": 11, "is_in_db": 11, "authentication": 12, "authorization": 12, "interfac": 12, "autentic": 12, "insid": 12, "two": 12, "factor": 12, "two_factor_required": 12, "two_factor_send": 12, "two_factor_tri": 12, "plugins": 12, "pam": 12, "ldap": 12, "oauth2": 12, "facebook": 12, "tags": 12, "etiquet": 12, "permiss\u00f5": 12, "objects": 12, "user": 12, "impersonation": 12, "key": 13, "featur": 13, "grid": [13, 14, 15], "object": [13, 15], "searching": 13, "filtering": 13, "crud": 13, "settings": 13, "columns": 13, "customizing": 13, "a\u00e7\u00e3": 13, "bot\u00f5": 13, "bot\u00e3": 13, "class": 13, "amostr": 13, "callabl": 13, "parameters": 13, "De": 14, "web2py": 14, "simpl": 14, "conversion": 14, "hell": 14, "world": 14, "redirect": 14, "returning": 14, "args": 14, "calling": 14, "setting": 14, "up": 14, "view": 14, "accessing": 14, "OS": 14, "topics": 15, "asynci": 15, "htmx": 15, "usag": 15, "autocomplet": 15, "widget": 15, "utils": 15, "js": 15, "string": 15, "q": 15, "t": 15, "conte\u00fad": 16}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"O que \u00e9 py4web?": [[0, "what-is-py4web"]], "Acknowledgments": [[0, "acknowledgments"]], "Ajuda, recursos e dicas": [[1, "help-resources-and-hints"]], "Recursos": [[1, "resources"]], "Este manual": [[1, "this-manual"]], "O grupo Google": [[1, "the-google-group"]], "The Discord server": [[1, "the-discord-server"]], "Tutoriais e v\u00eddeo": [[1, "tutorials-and-video"]], "As fontes no GitHub": [[1, "the-sources-on-github"]], "Dicas e sugest\u00f5es": [[1, "hints-and-tips"]], "Pr\u00e9-requisitos": [[1, "prerequisites"]], "Um local de trabalho python moderna": [[1, "a-modern-python-workplace"]], "Depura\u00e7\u00e3o py4web com VScode": [[1, "debugging-py4web-with-vscode"]], "Depura\u00e7\u00e3o py4web com PyCharm": [[1, "debugging-py4web-with-pycharm"]], "Como contribuir": [[1, "how-to-contribute"]], "Instala\u00e7\u00e3o e coloca\u00e7\u00e3o em funcionamento": [[2, "installation-and-startup"]], "Understanding the design": [[2, "understanding-the-design"]], "Plataformas e pr\u00e9-requisitos suportados": [[2, "supported-platforms-and-prerequisites"]], "Procedimentos de configura\u00e7\u00e3o": [[2, "setup-procedures"]], "Instalando a partir de bin\u00e1rios": [[2, "installing-from-binaries"]], "Instalando a partir de pip": [[2, "installing-from-pip"]], "Installing using a virtual environment": [[2, "installing-using-a-virtual-environment"]], "Instala\u00e7\u00e3o de fonte (globalmente)": [[2, "installing-from-source-globally"]], "Instalando a partir de fonte (localmente)": [[2, "installing-from-source-locally"]], "Melhoramento": [[2, "upgrading"]], "Primeira corrida": [[2, "first-run"]], "Op\u00e7\u00f5es de linha de comando": [[2, "command-line-options"]], "Op\u00e7\u00e3o `` comando call``": [[2, "call-command-option"]], "Op\u00e7\u00e3o `` comando new_app``": [[2, "new-app-command-option"]], "Op\u00e7\u00e3o `` comando run``": [[2, "run-command-option"]], "Op\u00e7\u00e3o `` comando set_password``": [[2, "set-password-command-option"]], "Op\u00e7\u00e3o `` comando setup``": [[2, "setup-command-option"]], "Op\u00e7\u00e3o `` comando shell``": [[2, "shell-command-option"]], "Op\u00e7\u00e3o `` comando version``": [[2, "version-command-option"]], "Special installations": [[2, "special-installations"]], "HTTPS": [[2, "https"]], "WSGI": [[2, "wsgi"]], "Deployment on GCloud (aka GAE - Google App Engine)": [[2, "deployment-on-gcloud-aka-gae-google-app-engine"]], "Implanta\u00e7\u00e3o em PythonAnywhere.com": [[2, "deployment-on-pythonanywhere-com"]], "Deployment on Docker/Podman": [[2, "deployment-on-docker-podman"]], "Deployment on Ubuntu": [[2, "deployment-on-ubuntu"]], "O Dashboard": [[3, "the-dashboard"]], "A p\u00e1gina Web principal": [[3, "the-main-web-page"]], "Sess\u00e3o no Dashboard": [[3, "login-into-the-dashboard"]], "Criando seu primeiro aplicativo": [[4, "creating-your-first-app"]], "Do princ\u00edpio": [[4, "from-scratch"]], "P\u00e1ginas est\u00e1ticas": [[4, "static-web-pages"]], "P\u00e1ginas web din\u00e2micas": [[4, "dynamic-web-pages"]], "Em valores de retorno": [[4, "on-return-values"]], "Rotas": [[4, "routes"]], "O objeto `` request``": [[4, "the-request-object"]], "Modelos": [[4, "templates"]], "The _scaffold app": [[4, "the-scaffold-app"]], "Copying the _scaffold app": [[4, "copying-the-scaffold-app"]], "Watch for files change": [[4, "watch-for-files-change"]], "Fixures": [[5, "fixtures"]], "Using Fixtures": [[5, "using-fixtures"]], "The Template fixture": [[5, "the-template-fixture"]], "The Inject fixture": [[5, "the-inject-fixture"]], "The Translator fixture": [[5, "the-translator-fixture"]], "O fixture flash": [[5, "the-flash-fixture"]], "The Session fixture": [[5, "the-session-fixture"]], "Client-side session in cookies": [[5, "client-side-session-in-cookies"]], "Server-side session in memcache": [[5, "server-side-session-in-memcache"]], "Server-side session in Redis": [[5, "server-side-session-in-redis"]], "Server-side session in database": [[5, "server-side-session-in-database"]], "Server-side session anywhere": [[5, "server-side-session-anywhere"]], "Sharing sessions": [[5, "sharing-sessions"]], "The Condition fixture": [[5, "the-condition-fixture"]], "The URLsigner fixture": [[5, "the-urlsigner-fixture"]], "O fixture DAL": [[5, "the-dal-fixture"]], "The Auth fixture": [[5, "the-auth-fixture"]], "Caveats about fixtures": [[5, "caveats-about-fixtures"]], "Fixtures personalizados": [[5, "custom-fixtures"]], "Multiple fixtures": [[5, "multiple-fixtures"]], "Caching e Memoize": [[5, "caching-and-memoize"]], "Decoradores de conveni\u00eancia": [[5, "convenience-decorators"]], "The Database Abstraction Layer (DAL)": [[6, "the-database-abstraction-layer-dal"]], "DAL introduction": [[6, "dal-introduction"]], "py4web model": [[6, "py4web-model"]], "Supported databases": [[6, "supported-databases"]], "The DAL: a quick tour": [[6, "the-dal-a-quick-tour"]], "Usando o DAL \u201cstand-alone\u201d": [[6, "using-the-dal-stand-alone"]], "Experimentar com o shell py4web": [[6, "experiment-with-the-py4web-shell"]], "Construtor DAL": [[6, "dal-constructor"]], "Assinatura da DAL": [[6, "dal-signature"]], "Strings de conex\u00e3o (o par\u00e2metro uri)": [[6, "connection-strings-the-uri-parameter"]], "O pool de conex\u00f5es": [[6, "connection-pooling"]], "Falhas de conex\u00e3o (par\u00e2metro tentativas)": [[6, "connection-failures-attempts-parameter"]], "Tabelas pregui\u00e7osos": [[6, "lazy-tables"]], "Aplicativos de modelo-less": [[6, "model-less-applications"]], "Bancos de dados replicados": [[6, "replicated-databases"]], "Palavras-chave reservadas": [[6, "reserved-keywords"]], "Configura\u00e7\u00f5es de quoting e case e do banco de dados": [[6, "database-quoting-and-case-settings"]], "Fazendo uma conex\u00e3o segura": [[6, "making-a-secure-connection"]], "Outros par\u00e2metros do construtor DAL": [[6, "other-dal-constructor-parameters"]], "Local de pasta do banco de dados": [[6, "database-folder-location"]], "Configura\u00e7\u00f5es padr\u00e3o de migra\u00e7\u00e3o": [[6, "default-migration-settings"]], "`` `` commit`` e rollback``": [[6, "commit-and-rollback"]], "Construtor Table": [[6, "table-constructor"]], "assinatura define_table": [[6, "define-table-signature"]], "`` Id``: Notas sobre a chave prim\u00e1ria": [[6, "id-notes-about-the-primary-key"]], "`` `` Plural`` e singular``": [[6, "plural-and-singular"]], "`` Redefine``": [[6, "redefine"]], "`` Format``: representa\u00e7\u00e3o da ficha": [[6, "format-record-representation"]], "`` Rname``: nome real": [[6, "rname-real-name"]], "`` Primarykey``: Suporte para tabelas legadas": [[6, "primarykey-support-for-legacy-tables"]], "`` Migrate``, `` fake_migrate``": [[6, "migrate-fake-migrate"]], "`` Table_class``": [[6, "table-class"]], "`` Sequence_name``": [[6, "sequence-name"]], "`` Trigger_name``": [[6, "trigger-name"]], "`` polymodel``": [[6, "polymodel"]], "`` On_define``": [[6, "on-define"]], "Adicionando atributos para campos e tabelas": [[6, "adding-attributes-to-fields-and-tables"]], "Bancos de dados legados e tabelas com chave": [[6, "legacy-databases-and-keyed-tables"]], "Construtor Field": [[6, "field-constructor"]], "Field types and validators": [[6, "field-types-and-validators"]], "modifica\u00e7\u00e3o da tabela e campo em tempo de execu\u00e7\u00e3o": [[6, "run-time-field-and-table-modification"]], "Mais sobre envios": [[6, "more-on-uploads"]], "Migra\u00e7\u00f5es": [[6, "migrations"]], "Fixa\u00e7\u00e3o migra\u00e7\u00f5es quebrados": [[6, "fixing-broken-migrations"]], "Migra\u00e7\u00e3o resumo controle": [[6, "migration-control-summary"]], "Table methods": [[6, "table-methods"]], "`` Insert``": [[6, "insert"]], "`` Query``, `` Set``, `` Rows``": [[6, "query-set-rows"]], "`` Update_or_insert``": [[6, "update-or-insert"]], "`` Validate_and_insert``, `` validate_and_update``": [[6, "validate-and-insert-validate-and-update"]], "`` Drop``": [[6, "drop"]], "Marca\u00e7\u00e3o de registros": [[6, "tagging-records"]], "Raw SQL": [[6, "raw-sql"]], "`` executesql``": [[6, "executesql"]], "`` _Lastsql``": [[6, "lastsql"]], "Temporiza\u00e7\u00e3o de consultas": [[6, "timing-queries"]], "\u00cdndices": [[6, "indexes"]], "Generating raw SQL": [[6, "generating-raw-sql"]], "`` Comando SELECT``": [[6, "select-command"]], "Usando um seleto para uso de mem\u00f3ria inferior \u00e0 base de iterador": [[6, "using-an-iterator-based-select-for-lower-memory-use"]], "Renderizando Rows com represent": [[6, "rendering-rows-using-represent"]], "Atalhos": [[6, "shortcuts"]], "A obten\u00e7\u00e3o de um `` row``": [[6, "fetching-a-row"]], "Recursivas `` s SELECT``": [[6, "recursive-selects"]], "`` Orderby``, `` groupby``, `` limitby``, `` distinct``, `` having``, `` orderby_on_limitby``, `` join``, `` left``, `` cache``": [[6, "orderby-groupby-limitby-distinct-having-orderby-on-limitby-join-left-cache"]], "ordenar por": [[6, "orderby"]], "groupby, tendo": [[6, "groupby-having"]], "distinto": [[6, "distinct"]], "limitby": [[6, "limitby"]], "orderby_on_limitby": [[6, "orderby-on-limitby"]], "juntar-se, deixou": [[6, "join-left"]], "cache, em cache": [[6, "cache-cacheable"]], "Operadores l\u00f3gicos": [[6, "logical-operators"]], "`` Count``, `` isempty``, `` DELETE``, `` update``": [[6, "count-isempty-delete-update"]], "Express\u00f5es": [[6, "expressions"]], "`` case``": [[6, "case"]], "`` Update_record``": [[6, "update-record"]], "Inserir e atualizar a partir de um dicion\u00e1rio": [[6, "inserting-and-updating-from-a-dictionary"]], "`` `` First`` e last``": [[6, "first-and-last"]], "`` `` As_dict`` e as_list``": [[6, "as-dict-and-as-list"]], "Combinando Rows": [[6, "combining-rows"]], "`` Find``, `` exclude``, `` sort``": [[6, "find-exclude-sort"]], "Selects com cache": [[6, "caching-selects"]], "Computed and Virtual fields": [[6, "computed-and-virtual-fields"]], "Campos computados": [[6, "computed-fields"]], "Campos virtuais": [[6, "virtual-fields"]], "Campos virtuais novo estilo (experimental)": [[6, "new-style-virtual-fields-experimental"]], "Campos virtuais velho antigo": [[6, "old-style-virtual-fields"]], "Joins and Relations": [[6, "joins-and-relations"]], "Um para muitos rela\u00e7\u00e3o": [[6, "one-to-many-relation"]], "Inner join": [[6, "inner-join"]], "Left outer join": [[6, "left-outer-join"]], "Agrupamento e contando": [[6, "grouping-and-counting"]], "Many to many relation": [[6, "many-to-many-relation"]], "A auto-refer\u00eancia e aliases": [[6, "self-reference-and-aliases"]], "Outros operadores": [[6, "other-operators"]], "`` Like``, `` ilike``, `` regexp``, `` startswith``, `` endswith``, `` contains``, `` upper``, `` lower``": [[6, "like-ilike-regexp-startswith-endswith-contains-upper-lower"]], "`` Year``, `` month``, `` day``, `` hour``, `` minutes``, `` seconds``": [[6, "year-month-day-hour-minutes-seconds"]], "`` Belongs``": [[6, "belongs"]], "`` Sum``, `` avg``, `` min``, `` `` max`` e len``": [[6, "sum-avg-min-max-and-len"]], "Substrings": [[6, "substrings"]], "Os valores por defeito com `` `` coalesce`` e coalesce_zero``": [[6, "default-values-with-coalesce-and-coalesce-zero"]], "Exportar e importar dados": [[6, "exporting-and-importing-data"]], "CSV (uma tabela de cada vez)": [[6, "csv-one-table-at-a-time"]], "CSV (todas as tabelas ao mesmo tempo)": [[6, "csv-all-tables-at-once"]], "CSV e sincroniza\u00e7\u00e3o de banco de dados remoto": [[6, "csv-and-remote-database-synchronization"]], "HTML e XML (uma tabela de cada vez)": [[6, "html-and-xml-one-table-at-a-time"]], "Representa\u00e7\u00e3o de dados": [[6, "data-representation"]], "Caracter\u00edsticas avan\u00e7adas": [[6, "advanced-features"]], "`` Lista: `` e `` contains``": [[6, "list-type-and-contains"]], "Heran\u00e7a de tabela": [[6, "table-inheritance"]], "`` `` Filter_in`` e filter_out``": [[6, "filter-in-and-filter-out"]], "retornos de chamada no registro de inser\u00e7\u00e3o, exclus\u00e3o e atualiza\u00e7\u00e3o": [[6, "callbacks-on-record-insert-delete-and-update"]], "Cascades no banco de dados": [[6, "database-cascades"]], "versionamento recorde": [[6, "record-versioning"]], "filtros comuns": [[6, "common-filters"]], "Personalizados `` tipos Field``": [[6, "custom-field-types"]], "Usando DAL sem definir tabelas": [[6, "using-dal-without-define-tables"]], "Transa\u00e7\u00e3o distribu\u00edda": [[6, "distributed-transaction"]], "Copiar dados de um para outro db": [[6, "copy-data-from-one-db-into-another"]], "Pegadinhas": [[6, "gotchas"]], "Nota sobre novo DAL e adaptadores": [[6, "note-on-new-dal-and-adapters"]], "SQLite": [[6, "sqlite"]], "MySQL": [[6, "mysql"]], "Google SQL": [[6, "google-sql"]], "MSSQL (Microsoft SQL Server)": [[6, "mssql-microsoft-sql-server"]], "Or\u00e1culo": [[6, "oracle"]], "Google NoSQL (Datastore)": [[6, "google-nosql-datastore"]], "The RestAPI": [[7, "the-restapi"]], "RestAPI policies and actions": [[7, "restapi-policies-and-actions"]], "RestAPI GET": [[7, "restapi-get"]], "RestAPI practical examples": [[7, "restapi-practical-examples"]], "The RestAPI response": [[7, "the-restapi-response"]], "Linguagem de template YATL": [[8, "yatl-template-language"]], "Sintaxe b\u00e1sica": [[8, "basic-syntax"]], "`` Para \u2026 in``": [[8, "for-in"]], "`` While``": [[8, "while"]], "`` If \u2026 elif \u2026 else``": [[8, "if-elif-else"]], "`` Tentar \u2026 exceto \u2026 else \u2026 finally``": [[8, "try-except-else-finally"]], "`` Def \u2026 return``": [[8, "def-return"]], "Information workflow": [[8, "information-workflow"]], "extend and include": [[8, "extend-and-include"]], "Extending using variables": [[8, "extending-using-variables"]], "Template Functions": [[8, "template-functions"]], "block and super": [[8, "block-and-super"]], "Page layout standard structure": [[8, "page-layout-standard-structure"]], "Default page layout": [[8, "default-page-layout"]], "Mobile development": [[8, "mobile-development"]], "Helpers YATL": [[9, "yatl-helpers"]], "Helpers overview": [[9, "helpers-overview"]], "Built-in helpers": [[9, "built-in-helpers"]], "`` XML``": [[9, "xml"]], "`` A``": [[9, "a"]], "`` BODY``": [[9, "body"]], "`` CAT``": [[9, "cat"]], "`` Div``": [[9, "div"]], "`` EM``": [[9, "em"]], "`` Form``": [[9, "form"]], "`` H1``, `` h2``, `` H3``, `` H4``, `` H5``, `` H6``": [[9, "h1-h2-h3-h4-h5-h6"]], "`` HEAD``": [[9, "head"]], "`` HTML``": [[9, "html"]], "`` I``": [[9, "i"]], "`` IMG``": [[9, "img"]], "`` INPUT``": [[9, "input"]], "`` Label``": [[9, "label"]], "`` LI``": [[9, "li"]], "`` OL``": [[9, "ol"]], "`` OPTION``": [[9, "option"]], "`` P``": [[9, "p"]], "`` PRE``": [[9, "pre"]], "`` SCRIPT``": [[9, "script"]], "`` SELECT``": [[9, "select"]], "`` SPAN``": [[9, "span"]], "`` STYLE``": [[9, "style"]], "`` TABLE``, `` TR``, `` TD``": [[9, "table-tr-td"]], "`` TBODY``": [[9, "tbody"]], "`` TEXTAREA``": [[9, "textarea"]], "`` TH``": [[9, "th"]], "`` THEAD``": [[9, "thead"]], "`` TITLE``": [[9, "title"]], "`` TT``": [[9, "tt"]], "`` UL``": [[9, "ul"]], "`` URL``": [[9, "url"]], "Helpers personalizados": [[9, "custom-helpers"]], "`` TAG``": [[9, "tag"]], "`` BEAUTIFY``": [[9, "beautify"]], "Server-side DOM": [[9, "server-side-dom"]], "children": [[9, "children"]], "find": [[9, "find"]], "Using Inject": [[9, "using-inject"]], "Internacionaliza\u00e7\u00e3o": [[10, "internationalization"]], "Pluralizar": [[10, "pluralize"]], "Atualizar os arquivos de tradu\u00e7\u00e3o": [[10, "update-the-translation-files"]], "Foruml\u00e1rios": [[11, "forms"]], "The Form constructor": [[11, "the-form-constructor"]], "A minimal form example without a database": [[11, "a-minimal-form-example-without-a-database"]], "Basic form example": [[11, "basic-form-example"]], "File upload field": [[11, "file-upload-field"]], "Widgets": [[11, "widgets"]], "Standard widgets": [[11, "standard-widgets"]], "Custom widgets": [[11, "custom-widgets"]], "Advanced form design": [[11, "advanced-form-design"]], "Form structure manipulation": [[11, "form-structure-manipulation"]], "Custom forms": [[11, "custom-forms"]], "The sidecar parameter": [[11, "the-sidecar-parameter"]], "Valida\u00e7\u00e3o de formul\u00e1rio": [[11, "form-validation"]], "Text format validators": [[11, "text-format-validators"]], "IS_ALPHANUMERIC": [[11, "is-alphanumeric"]], "IS_LOWER": [[11, "is-lower"]], "IS_UPPER": [[11, "is-upper"]], "IS_EMAIL": [[11, "is-email"]], "IS_MATCH": [[11, "is-match"]], "IS_LENGTH": [[11, "is-length"]], "IS_URL": [[11, "is-url"]], "IS_SLUG": [[11, "is-slug"]], "IS_JSON": [[11, "is-json"]], "Date and time validators": [[11, "date-and-time-validators"]], "IS_TIME": [[11, "is-time"]], "IS_DATE": [[11, "is-date"]], "IS_DATETIME": [[11, "is-datetime"]], "IS_DATE_IN_RANGE": [[11, "is-date-in-range"]], "IS_DATETIME_IN_RANGE": [[11, "is-datetime-in-range"]], "Range, set and equality validators": [[11, "range-set-and-equality-validators"]], "IS_EQUAL_TO": [[11, "is-equal-to"]], "IS_NOT_EMPTY": [[11, "is-not-empty"]], "IS_NULL_OR": [[11, "is-null-or"]], "IS_EMPTY_OR": [[11, "is-empty-or"]], "IS_EXPR": [[11, "is-expr"]], "IS_DECIMAL_IN_RANGE": [[11, "is-decimal-in-range"]], "IS_FLOAT_IN_RANGE": [[11, "is-float-in-range"]], "IS_INT_IN_RANGE": [[11, "is-int-in-range"]], "IS_IN_SET": [[11, "is-in-set"]], "Checkbox validation": [[11, "checkbox-validation"]], "Dictionaries and tuples with IS_IN_SET": [[11, "dictionaries-and-tuples-with-is-in-set"]], "Sorted options": [[11, "sorted-options"]], "IS_IN_SET and Tagging": [[11, "is-in-set-and-tagging"]], "Complexity and security validators": [[11, "complexity-and-security-validators"]], "IS_STRONG": [[11, "is-strong"]], "CRYPT": [[11, "crypt"]], "Special type validators": [[11, "special-type-validators"]], "IS_LIST_OF": [[11, "is-list-of"]], "IS_LIST_OF_EMAILS": [[11, "is-list-of-emails"]], "ANY_OF": [[11, "any-of"]], "IS_IMAGE": [[11, "is-image"]], "IS_FILE": [[11, "is-file"]], "IS_UPLOAD_FILENAME": [[11, "is-upload-filename"]], "IS_IPV4": [[11, "is-ipv4"]], "IS_IPV6": [[11, "is-ipv6"]], "IS_IPADDRESS": [[11, "is-ipaddress"]], "Other validators": [[11, "other-validators"]], "CLEANUP": [[11, "cleanup"]], "Database validators": [[11, "database-validators"]], "IS_NOT_IN_DB": [[11, "is-not-in-db"]], "IS_IN_DB": [[11, "is-in-db"]], "IS_IN_DB and Tagging": [[11, "is-in-db-and-tagging"]], "Validation functions": [[11, "validation-functions"]], "Authentication and authorization": [[12, "authentication-and-authorization"]], "Authentication using Auth": [[12, "authentication-using-auth"]], "Interface de autentica\u00e7\u00e3o": [[12, "auth-ui"]], "Using Auth inside actions": [[12, "using-auth-inside-actions"]], "Two Factor Authentication": [[12, "two-factor-authentication"]], "two_factor_required": [[12, "two-factor-required"]], "two_factor_send": [[12, "two-factor-send"]], "two_factor_tries": [[12, "two-factor-tries"]], "Plugins de Autentica\u00e7\u00e3o": [[12, "auth-plugins"]], "PAM": [[12, "pam"]], "LDAP": [[12, "ldap"]], "OAuth2 with Google": [[12, "oauth2-with-google"]], "OAuth2 with Facebook": [[12, "oauth2-with-facebook"]], "OAuth2 with Discord": [[12, "oauth2-with-discord"]], "Authorization using Tags": [[12, "authorization-using-tags"]], "Etiquetas e permiss\u00f5es": [[12, "tags-and-permissions"]], "Multiple Tags objects": [[12, "multiple-tags-objects"]], "User Impersonation": [[12, "user-impersonation"]], "Rede": [[13, "grid"]], "Key features": [[13, "key-features"]], "Basic grid example": [[13, "basic-grid-example"]], "The Grid object": [[13, "the-grid-object"]], "Searching and filtering": [[13, "searching-and-filtering"]], "CRUD settings": [[13, "crud-settings"]], "Custom columns": [[13, "custom-columns"]], "Usando templates": [[13, "using-templates"]], "Customizing style": [[13, "customizing-style"]], "A\u00e7\u00e3o personalizada Bot\u00f5es": [[13, "custom-action-buttons"]], "Bot\u00e3o Classe A\u00e7\u00e3o Amostra": [[13, "sample-action-button-class"]], "Using callable parameters": [[13, "using-callable-parameters"]], "Os campos de refer\u00eancia": [[13, "reference-fields"]], "De web2py para py4web": [[14, "from-web2py-to-py4web"]], "Simple conversion examples": [[14, "simple-conversion-examples"]], "\u201cHello world\u201d example": [[14, "hello-world-example"]], "\u201cRedirect with variables\u201d example": [[14, "redirect-with-variables-example"]], "\u201cReturning variables\u201d example": [[14, "returning-variables-example"]], "\u201cReturning args\u201d example": [[14, "returning-args-example"]], "\u201cReturn calling methods\u201d example": [[14, "return-calling-methods-example"]], "\u201cSetting up a counter\u201d example": [[14, "setting-up-a-counter-example"]], "\u201cView\u201d example": [[14, "view-example"]], "\u201cForm and flash\u201d example": [[14, "form-and-flash-example"]], "\u201cgrid\u201d example": [[14, "grid-example"]], "\u201cAccessing OS files\u201d example": [[14, "accessing-os-files-example"]], "\u201cauth\u201d example": [[14, "auth-example"]], "Advanced topics and examples": [[15, "advanced-topics-and-examples"]], "py4web and asyncio": [[15, "py4web-and-asyncio"]], "htmx": [[15, "htmx"]], "htmx usage in Form": [[15, "htmx-usage-in-form"]], "htmx usage in Grid": [[15, "htmx-usage-in-grid"]], "Autocomplete Widget using htmx": [[15, "autocomplete-widget-using-htmx"]], "utils.js": [[15, "utils-js"]], "string.format": [[15, "string-format"]], "The Q object": [[15, "the-q-object"]], "The T object": [[15, "the-t-object"]], "py4web: o manual de refer\u00eancia": [[16, "py4web-the-reference-manual"]], "Conte\u00fado:": [[16, null]], "\u00cdndices e tabelas": [[16, "indices-and-tables"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/py4web/utils/auth.py b/py4web/utils/auth.py index cb8984750..10560c5f1 100644 --- a/py4web/utils/auth.py +++ b/py4web/utils/auth.py @@ -526,6 +526,7 @@ def current_user(self): return self.get_user() def impersonate(self, impersonated_id, next_url): + """impersonates the new user""" user = self.session.get("user") if not user or "id" not in user: raise RuntimeError("Cannot impersonate if not logged in") @@ -537,11 +538,13 @@ def impersonate(self, impersonated_id, next_url): redirect(next_url) def is_impersonating(self): + """checks if we are impersonating a user""" return self.session.get("user", {}).get("impersonator_id", None) != None def stop_impersonation(self, next_url): + """stops impersonating a user, assuming we are impersonating one""" user = self.session.get("user") - impersonator_id = (user or {}).get("inpersonator_id") + impersonator_id = (user or {}).get("impersonator_id") if impersonator_id is None: raise RuntimeError( "Cannot stop impersonation because not impersonating anybody"

      Type