Repository: MarketSquare/robotframework-requests (language: python)

Issue:
Deprecated urllib3 constant DEFAULT_METHOD_WHITELIST
```
../bla/lib/python3.6/site-packages/urllib3/util/retry.py:41
  /tmp/bla/lib/python3.6/site-packages/urllib3/util/retry.py:41: DeprecationWarning: Using 'Retry.DEFAULT_METHOD_WHITELIST' is deprecated and will be removed in v2.0. Use 'Retry.DEFAULT_METHODS_ALLOWED' instead
    DeprecationWarning,

utests/test_RequestKeywords.py::test_common_request_file_descriptor_closing
  /tmp/bla/lib/python3.6/site-packages/urllib3/util/retry.py:255: DeprecationWarning: Using 'method_whitelist' with Retry is deprecated and will be removed in v2.0. Use 'allowed_methods' instead
    DeprecationWarning,

-- Docs: https://docs.pytest.org/en/stable/warnings.html

```


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml
index 3ddf984f..5f4edb8d 100644
--- a/.github/workflows/pythonapp.yml
+++ b/.github/workflows/pythonapp.yml
@@ -46,24 +46,25 @@ jobs:
         coverage report
         coverage xml
     - name: Update codecov for unit tests
-      uses: codecov/codecov-action@v1.0.6
+      uses: codecov/codecov-action@v1
       with:
         flags: unit
         file: coverage.xml
     - name: Test with Robot Framework and coverage
       run: |
         coverage erase
-        coverage run --branch --source src/ -m robot --exclude skip --pythonpath src --outputdir ./tests-report --consolecolors ansi atests
+        coverage run --branch --source src/ -m robot --loglevel trace:info --exclude skip --pythonpath src --outputdir ./tests-report --consolecolors ansi atests
     - name: Acceptance tests coverage
       run: |
         coverage report
         coverage xml
     - name: Update codecov for acceptance tests
-      uses: codecov/codecov-action@v1.0.6
+      uses: codecov/codecov-action@v1
       with:
         flags: acceptance
         file: coverage.xml
     - name: Archive Robot Framework Tests Report
+      if: ${{ always() }}
       uses: actions/upload-artifact@v1
       with:
         name: rf-tests-report-${{ matrix.os }}-${{ matrix.python-version }}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 78fe2246..39b1c519 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -46,9 +46,9 @@ Test coverage is evaluated for unit and acceptance tests, after test execution
 
 #### Documentation
 
-Keywords documentation can be updated running the following command:
+Keywords documentation (on Linux) can be updated running the following script:
 
-`python -m robot.libdoc src/RequestsLibrary doc/RequestsLibrary.html`
+`doc/generate_doc.sh`
 
 # What can I do?
 
diff --git a/README.md b/README.md
index fcd58f09..ecf26313 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,8 @@
 [![PyPi downloads](https://img.shields.io/pypi/dm/robotframework-requests.svg)](https://pypi.python.org/pypi/robotframework-requests)
 [![Latest Version](https://img.shields.io/pypi/v/robotframework-requests.svg)](https://pypi.python.org/pypi/robotframework-requests)
 
-🏠 ``RequestsLibrary`` is a [Robot Framework](https://robotframework.org/) test library that uses the [Requests](https://github.com/kennethreitz/requests) HTTP client.
+🏠 ``RequestsLibrary`` is a [Robot Framework](https://robotframework.org/) library
+aimed to provide HTTP api testing functionalities by wrapping the well known [Python Requests Library](https://github.com/kennethreitz/requests).
 
 
 ## Install stable version
@@ -11,13 +12,6 @@
 pip install robotframework-requests
 ```
 
-## ✨ Install latest 0.8 pre-release version (recommended) ✨
-```sh
-pip install robotframework-requests --pre
-```
-- [0.8 README](https://github.com/MarketSquare/robotframework-requests/blob/0.8/README.md)
-- [0.8 Keywords documentation](https://robotframework-requests.netlify.app/doc/requestslibrary)
-
 ### What's new in 0.8
 
 **New keywords structure:**
@@ -28,7 +22,8 @@ when a session is not needed.
 
 **Implicit assert on status code:**
 `* On Session` keywords automatically fail if an error status code is returned.
-`expect_status=` could be used to specify a status code (`201`, `OK`, `Bad request`) or `any` if you want to evaluate the response in any case. 
+`expect_status=` could be used to specify a status code (`201`, `OK`, `Bad request`) 
+or `any` if you want to evaluate the response in any case. 
 
 **Closer to the original Requests library:**
 New keywords have the same parameter orders and structure as the original.
@@ -43,18 +38,27 @@ Main keywords file has been split with a more logic division to allow better and
 Library               Collections
 Library               RequestsLibrary
 
+Suite Setup           Create Session    jsonplaceholder    https://jsonplaceholder.typicode.com
+
 *** Test Cases ***
-Get Request
-    Create Session    jsonplaceholder         https://jsonplaceholder.typicode.com
-    ${resp}=          Get request    jsonplaceholder     /posts/1
-    Dictionary Should Contain Value   ${resp.json()}     sunt aut facere repellat provident occaecati excepturi
-
-Post Request
-    Create Session    jsonplaceholder         https://jsonplaceholder.typicode.com
-    &{data}=          Create dictionary       title=Robotframework requests  body=This is a test!  userId=1
-    ${resp}=          Post request    jsonplaceholder     /posts    json=${data}
-    Dictionary Should Contain Key   ${resp.json()}     id
+
+Get Request Test
+    Create Session    google             http://www.google.com
+
+    ${resp_google}=   GET On Session     google             /           expected_status=200
+    ${resp_json}=     GET On Session     jsonplaceholder    /posts/1
+
+    Should Be Equal As Strings           ${resp_google.reason}    OK
+    Dictionary Should Contain Value      ${resp_json.json()}    sunt aut facere repellat provident occaecati excepturi optio reprehenderit
+
+Post Request Test
+    &{data}=          Create dictionary  title=Robotframework requests  body=This is a test!  userId=1
+    ${resp}=          POST On Session    jsonplaceholder     /posts    json=${data}
+    
+    Status Should Be                     201    ${resp}
+    Dictionary Should Contain Key        ${resp.json()}     id
 ```
+
 ### 📖 Keywords documentation
 Robotframework-requests offers a wide set of keywords which can be found in the [Keywords documentation](http://marketsquare.github.io/robotframework-requests/doc/RequestsLibrary.html)
 
diff --git a/doc/RequestsLibrary.html b/doc/RequestsLibrary.html
index 587e2289..482981b3 100644
--- a/doc/RequestsLibrary.html
+++ b/doc/RequestsLibrary.html
@@ -1,165 +1,578 @@
 <!DOCTYPE html>
-<html>
+<html id="library-documentation-top">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=0">
 <meta http-equiv="Pragma" content="no-cache">
 <meta http-equiv="Expires" content="-1">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta content="Robot Framework 3.1.2 (Python 3.6.9 on linux)" name="Generator">
+<meta content="Robot Framework 4.0b1 (Python 3.6.9 on linux)" name="Generator">
 <link rel="icon" type="image/x-icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAqAAAAAAAAAAAAAAAAAAAALIAAAD/AAAA4AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA4AAAAP8AAACxAAAAAAAAAKYAAAD/AAAAuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/AAAA/wAAAKkAAAD6AAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN8AAAD/AAAA+gAAAMMAAAAAAAAAAgAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAADAAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAAIsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANEAAAAAAAAA2gAAAP8AAAD6AAAAwwAAAAAAAAAAAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAFAAAAAAAAANoAAAD/AAAA+gAAAMMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAADwAAAB8AAAAAAAAAGAAAABcAAAAAAAAAH8AAABKAAAAAAAAAAAAAAAAAAAA2gAAAP8AAAD6AAAAwwAAAAAAAADCAAAA/wAAACkAAADqAAAA4QAAAAAAAAD7AAAA/wAAALAAAAAGAAAAAAAAANoAAAD/AAAA+gAAAMMAAAAAAAAAIwAAAP4AAAD/AAAA/wAAAGAAAAAAAAAAAAAAAMkAAAD/AAAAigAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAAAAAAAAIAAAAcAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAA2gAAAP8AAAD7AAAAywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN4AAAD/AAAAqwAAAP8AAACvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAAAD/AAAAsgAAAAAAAAC5AAAA/wAAAMoAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMkAAAD/AAAAvAAAAAAAAAAAAAAAAAAAAKwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArQAAAAAAAAAAwAMAAIABAAAf+AAAP/wAAD/8AAAgBAAAP/wAAD/8AAA//AAAJIwAADHEAAA//AAAP/wAAB/4AACAAQAAwAMAAA==">
 <style media="all" type="text/css">
+:root {
+    --background-color: white;
+    --text-color: black;
+    --border-color: #e0e0e2;
+    --light-background-color: #f3f3f3;
+    --robot-highlight: #00c0b5;
+    --highlighted-color: var(--text-color);
+    --highlighted-background-color: yellow;
+    --less-important-text-color: gray;
+    --link-color: #0000ee;
+}
+@media (prefers-color-scheme: dark) {
+    :root {
+        --background-color: #1c2227;
+        --text-color: #e2e1d7;
+        --border-color: #4e4e4e;
+        --light-background-color: #002b36;
+        --robot-highlight: yellow;
+        --highlighted-color: var(--background-color);
+        --highlighted-background-color: yellow;
+        --less-important-text-color: #5b6a6f;
+        --link-color: #52adff;
+    }
+}
 body {
+    background: var(--background-color);
+    color: var(--text-color);
+    margin: 0;
+    font-family: system-ui, -apple-system, sans-serif;
+}
+input, button, select {
+    background: var(--background-color);
+    color: var(--text-color);
+}
+a {
+    color: var(--link-color);
+}
+.base-container {
+    display: flex;
+}
+.libdoc-overview {
+    height: 100vh;
+    display: flex;
+    flex-direction: column;
     background: white;
-    color: black;
-    font-size: small;
-    font-family: sans-serif;
-    padding: 0 0.5em;
+    background: var(--background-color);
+    position: -webkit-sticky; /* Safari */
+    position: sticky;
+    top: 0;
 }
-.metadata th {
-    text-align: left;
-    padding-right: 1em;
+.libdoc-overview h4 {
+    margin-bottom: 0.5rem;
+    margin-top: 0.5rem;
 }
-a.name, span.name {
-    font-style: italic;
+.keyword-search-box {
+    display: flex;
+    justify-content: space-between;
+    height: 30px;
+    border: 1px solid var(--border-color);
+    border-radius: 3px;
+    margin-top: 0.5rem;
 }
-a, a:link, a:visited {
-    color: #c30;
+#tags-shortcuts-container {
+    margin-top: 0.5rem;
+    height: 30px;
+    border: 1px solid var(--border-color);
+    border-radius: 3px;
 }
-a img {
-    border: 1px solid #c30 !important;
+.search-input {
+    flex: 1;
+    border: none;
+    text-indent: 4px;
 }
-a:hover, a:active {
-    text-decoration: underline;
-    color: black;
+.clear-search {
+    border: none;
 }
-a:hover {
-    text-decoration: underline !important;
+#shortcuts-container {
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+}
+.libdoc-details {
+    margin-top: 60px;
+    padding-left: 2%;
+    padding-right: 2%;
+    overflow: auto;
+    max-width: 1000px;
+}
+.libdoc-title {
+    position: fixed;
+    left: 0;
+    top: 0;
+    width: 300px;
+    height: 36px;
+    padding: 0.5rem;
+    margin: 0.5rem;
+    display: flex;
+    align-items: center;
+    text-decoration: none;
+    color: var(--text-color);
+}
+.hamburger-menu {
+    display: none;
+    position: fixed;
+    z-index: 100;
+}
+input.hamburger-menu
+{
+  display: none;
+  width: 67px;
+  height: 46px;
+  position: fixed;
+  top: 0;
+  right: 0;
+  cursor: pointer;
+  opacity: 0;
+  z-index: 2;
+  -webkit-touch-callout: none;
+}
+span.hamburger-menu
+{
+  width: 31px;
+  height: 2px;
+  margin-bottom: 5px;
+  position: fixed;
+  right: 20px;
+  background: black;
+  background: var(--text-color);
+  border-radius: 2px;
+  z-index: 1;
+  transform-origin: 4px 0;
+  transition: transform 0.3s cubic-bezier(0.77,0.2,0.05,1.0),
+              opacity 0.35s ease;
+}
+span.hamburger-menu-1
+{
+    top: 14px;
+    transform-origin: 0 0;
+}
+span.hamburger-menu-2
+{
+    top: 24px;
+}
+span.hamburger-menu-3
+{
+    top: 34px;
+    transform-origin: 0 100%;
+}
+input.hamburger-menu:checked ~ span.hamburger-menu-1
+{
+  opacity: 1;
+  transform: rotate(45deg) translate(2px, -3px);
+  background: var(--text-color);
+}
+input.hamburger-menu:checked ~ span.hamburger-menu-2
+{
+  opacity: 0;
+  transform: rotate(0deg) scale(0.2, 0.2);
+}
+input.hamburger-menu:checked ~ span.hamburger-menu-3
+{
+  transform: rotate(-45deg) translate(2px, 3px);
+  background: var(--text-color);
+}
+.libdoc-title > svg {
+    padding-top: 2px;
+    height: 42px;
+    width: 42px;
+}
+#robot-svg-path {
+    fill: var(--text-color);
+    stroke: none;
+    fill-opacity:1;
+    fill-rule:nonzero;
+}
+.keywords-overview {
+    display: flex;
+    flex-direction: column;
+    height: 0;
+    max-height: calc(100vh - 60px - 0.5rem);
+    flex: 1;
+    border: 1px solid var(--border-color);
+    border-radius: 3px;
+    padding-right: 0.5rem;
+    padding-left: 0.5rem;
+    margin: 60px 0 0.5rem 0.5rem;
+}
+.keywords-overview-header-row {
+    display: flex;
+    justify-content: space-between;
 }
 .shortcuts {
-    margin: 1em 0;
     font-size: 0.9em;
+    overflow: auto;
+    list-style: none;
+    padding-left: 0;
+    margin: 0;
+    flex: 1;
+    max-width: 320px;
+}
+.shortcuts.keyword-wall{
+    flex: unset;
 }
 .shortcuts a {
-    display: inline-block;
+    display: block;
     text-decoration: none;
     white-space: nowrap;
-    color: black;
+    color: var(--text-color);
+    padding: 0.5rem;
+}
+.shortcuts a:hover {
+    background: var(--light-background-color);
 }
 .shortcuts a::first-letter {
     font-weight: bold;
     letter-spacing: 0.1em;
 }
+.shortcuts.keyword-wall a {
+    padding: 0;
+    padding-right: 0.5rem;
+    padding-bottom: 0.5rem;
+}
+.shortcuts.keyword-wall a::after {
+    content: '·';
+    padding-left: 0.5rem;
+}
+.arguments-list-container {
+    overflow-y: auto;
+}
+.arguments-list {
+    display: -ms-inline-grid;
+    display: inline-grid;
+    -ms-grid-columns: 1fr 1fr 1fr;
+    grid-template-columns: auto auto auto;
+    row-gap: 3px;
+}
+.typed-dict-annotation > span,
+.enum-type-members span,
+.arguments-list .arg-name {
+    -ms-grid-column: 1;
+    grid-column: 1;
+    border-radius: 3px;
+    white-space: nowrap;
+    padding-left: 0.5rem;
+    padding-right: 0.5rem;
+    justify-self: start;
+}
+.arguments-list .arg-default-container {
+    -ms-grid-column: 2;
+    grid-column: 2;
+    display: flex;
+}
+.optional-key,
+.arguments-list .arg-optional {
+    font-style: italic;
+}
+.arguments-list .arg-default-eq {
+    margin-left: 2rem;
+    margin-right: 0.5rem;
+    background: var(--background-color);
+}
+.arguments-list .arg-default-value {
+    padding-left: 0.5rem;
+    padding-right: 0.5rem;
+    border-radius: 3px;
+}
+.arguments-list .base-arg-data {
+    display: flex;
+    min-width: 150px;
+}
+.arguments-list .arg-type {
+    margin-left: 2rem;
+    -ms-grid-column: 3;
+    grid-column: 3;
+    background: var(--background-color);
+    white-space: nowrap;
+    -webkit-text-size-adjust: none;
+}
+@media only screen and (min-width: 900px) {
+    .libdoc-details {
+        z-index: 1;
+        background: var(--background-color);
+    }
+    #toggle-keyword-shortcuts {
+        border: 1px solid var(--border-color);
+        border-radius: 3px;
+        margin-top: 3px;
+        margin-bottom: 3px;
+    }
+    #toggle-keyword-shortcuts:hover {
+        background: var(--light-background-color);
+    }
+    .shortcuts.keyword-wall {
+        display: flex;
+        flex-wrap: wrap;
+        width: 320px;
+        max-width: none;
+    }
+}
+@media only screen and (min-width: 1200px) {
+    .shortcuts.keyword-wall {
+        width: 640px;
+    }
+}
+@media only screen and (max-width: 899px) {
+    .libdoc-overview {
+        display: none;
+    }
+    #toggle-keyword-shortcuts {
+        display: none;
+    }
+    .libdoc-title {
+        width: 100%;
+        padding: 0.5rem;
+        margin: 0;
+        border-bottom: 1px solid var(--border-color);
+        background: white;
+        background: var(--background-color);
+    }
+    .libdoc-title > svg {
+        margin-right: 60px;
+    }
+    .libdoc-details {
+        padding-left: 0.5rem;
+    }
+    input.hamburger-menu {
+        display: block;
+    }
+    .hamburger-menu {
+        display: block;
+    }
+    .hamburger-menu:checked ~ .libdoc-overview {
+        display: block;
+        position: fixed;
+        height: 100vh;
+        width: 100vw;
+    }
+    .keywords-overview {
+        border: none;
+        margin: 60px 0 0;
+    }
+    .shortcuts {
+        max-width: 100vw;
+    }
+}
+.metadata {
+    margin-top: 0.5rem;
+ }
+.metadata th {
+    text-align: left;
+    padding-right: 1em;
+}
+a.name, span.name {
+    font-style: italic;
+}
+.libdoc-details a img {
+    border: 1px solid #c30 !important;
+}
+a:hover, a:active {
+    text-decoration: underline;
+    color: var(--text-color);
+}
+a:hover {
+    text-decoration: underline !important;
+}
 .normal-first-letter::first-letter {
     font-weight: normal !important;
     letter-spacing: 0 !important;
 }
+.shortcut-list-toggle, .tag-list-toggle {
+    margin-bottom: 1em;
+    font-size: 0.9em;
+}
+input.switch {
+    display: none;
+}
+.slider {
+    background-color: var(--border-color);
+    display: inline-block;
+    position: relative;
+    top: 5px;
+    height: 18px;
+    width: 36px;
+}
+.slider:before {
+    background-color: var(--background-color);
+    content: "";
+    position: absolute;
+    top: 3px;
+    left: 3px;
+    height: 12px;
+    width: 12px;
+}
+input.switch:checked + .slider::before {
+    background-color: var(--background-color);
+    left: 21px;
+}
 .keywords {
-    border: 1px solid #ccc;
-    border-collapse: collapse;
-    empty-cells: show;
-    margin: 0.3em 0;
-    width: 100%;
+    display: flex;
+    flex-direction: column;
 }
-.keywords th, .keywords td {
-    border: 1px solid #ccc;
-    padding: 0.2em;
-    vertical-align: top;
+.kw-overview {
+    display: flex;
+    flex-direction: column;
+    justify-content: start;
 }
-.keywords th {
-    background: #ddd;
-    color: black;
+@media only screen and (min-width: 899px) {
+    .kw-overview {
+        max-width: 850px;
+        margin-right: 1.5rem;
+    }
 }
-.kw, .args, .tags {
-    min-width: 100px;
-    max-width: 20%;
+.kw-docs {
+    display: flex;
+    flex-direction: column;
+    overflow-y: auto;
 }
-td.kw a {
-    color: inherit;
+.dt-name:link,
+.kw-name:link {
     text-decoration: none;
-    font-weight: bold;
+    color: var(--text-color);
 }
-.args span {
-    font-style: italic;
-    padding: 0 0.1em;
+.dt-name:visited,
+.kw-name:visited {
+    text-decoration: none;
+    color: var(--text-color);
 }
-.tags a {
+.kw {
+    display: flex;
+    align-items: baseline;
+    min-width: 250px
+}
+h4 {
+    margin-right: 0.5rem;
+}
+.keyword-container {
+    border: 1px solid var(--border-color);
+    border-radius: 3px;
+    padding: 0.5rem 1.0rem 0.5rem 1.0rem;
+    margin-bottom: 0.5rem;
+    display: flex;
+    flex-direction: column;
+    scroll-margin-top: 60px;
+}
+.keyword-container:target {
+    box-shadow: 0 0 4px var(--robot-highlight);
+}
+.data-type-content,
+.keyword-content {
+    display: flex;
+    flex-direction: column;
+}
+.enum-type-members{
+    list-style: none;
+}
+.data-type-container {
+    border-top: 1px solid var(--border-color);
+    padding: 0.5rem 1.0rem 0.5rem 1.0rem;
+    margin-bottom: 0.5rem;
+    display: flex;
+    flex-direction: column;
+    scroll-margin-top: 60px;
+}
+.kw-row {
+    display: flex;
+    flex-direction: column;
+    text-decoration: none;
+    justify-content: start;
+    border: 1px solid var(--border-color);
+    border-radius: 3px;
+    padding: 0.5rem 1.0rem 0.5rem 1.0rem;
+    margin-bottom: 0.5rem;
+}
+.kw a {
     color: inherit;
     text-decoration: none;
-    padding: 0 0.1em;
+    font-weight: bold;
 }
-.footer {
-    font-size: 0.9em;
+.args {
+    min-width: 200px;
 }
-/* Docs originating from HTML and reST are wrapped to divs. */
-.doc div > *:first-child {
-    margin-top: 0;
+.enum-type-members span,
+.args span,
+.args a
+ {
+    font-family: monospace;
+    background: var(--light-background-color);
+    padding: 0 0.1em;
+    font-size: 1.1em;
 }
-.doc div > *:last-child {    /* Does not work with IE8. */
-    margin-bottom: 0;
+span.type,
+a.type {
+    font-size: 1em;
+    background: none;
+    padding: 0 0
 }
-#search, #open-search {
-    position: fixed;
-    bottom: 5px;
-    right: 5px;
-    z-index: 1000;
+.arg-type span.or::after {
+    content: ' or ';
+}
+span.or {
+    background: none;
+    font-size: 0.7em;
+    font-family: system-ui, -apple-system, sans-serif;
 }
-#search {
-    width: 30em;
+.arg-type span.or:nth-last-of-type(1) {
     display: none;
 }
-#open-search {
-    border: 2px solid #ccc;
-    border-radius: 4px;
-    width: 40px;
-    height: 40px;
-    background-color: white;
-    background-repeat: no-repeat;
-    background-position: center;
-    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAY5JREFUSImt1LtrFGEUBfCfURsFHwEr29UNkS3MFklrQK0EIYUk/5IQ0FSmCCKW1mpAommToCKoK+lsLUKeSFbXFLuT3B13Hjt64INvOPeec+fOnUs2mpjHBrbRwQE+YQFTObm5qGMZf0qct7gxjPgM9kqKJ+cAs2XFf4fEX3iOe7iKsxjFHTxFO8R2ikzqqcq/oVFQUANfUm8ynhUce97qVVoGo/gaclcGBTVDQDuvigw09Lfrr+maD+TSkOIJngWNx2lyI5C3KxrcDRof0+R2IC9XNLgSNPbTZDKa7YricFr/v3EqIUZ0xxPO4FxFg0vhnoz7scFmICcqGjTDvRWJEayG57mKBg/C/U2anHDSu5+oDSlex6GTlTE2KOhVMPmACyXFL+qOZZL7Xf/3OMY17KZMrheI13px6e26nmVyX3eDxnYt4lav0qTiaTzp8VkrPNdkNyOpkyM4lEkNL0uK/CjgXw8ySHATD7GGLd0/fgfv8QiTOI93BSb/jCKT/4Isk1ZOTiWTF0H8M8aPANvFyARlADGFAAAAAElFTkSuQmCC);
-    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCA4IDgiPgogIDxwYXRoIGQ9Ik0zLjUgMGMtMS45MyAwLTMuNSAxLjU3LTMuNSAzLjVzMS41NyAzLjUgMy41IDMuNWMuNTkgMCAxLjE3LS4xNCAxLjY2LS40MWExIDEgMCAwIDAgLjEzLjEzbDEgMWExLjAyIDEuMDIgMCAxIDAgMS40NC0xLjQ0bC0xLTFhMSAxIDAgMCAwLS4xNi0uMTNjLjI3LS40OS40NC0xLjA2LjQ0LTEuNjYgMC0xLjkzLTEuNTctMy41LTMuNS0zLjV6bTAgMWMxLjM5IDAgMi41IDEuMTEgMi41IDIuNSAwIC42Ni0uMjQgMS4yNy0uNjYgMS43Mi0uMDEuMDEtLjAyLjAyLS4wMy4wM2ExIDEgMCAwIDAtLjEzLjEzYy0uNDQuNC0xLjA0LjYzLTEuNjkuNjMtMS4zOSAwLTIuNS0xLjExLTIuNS0yLjVzMS4xMS0yLjUgMi41LTIuNXoiCiAgLz4KPC9zdmc+), none;
-    background-size: 24px 24px;
-}
-#open-search:hover {
-    background-color: #ccc;
-}
-fieldset {
-    background: white;
-    border: 2px solid #ccc;
-    border-radius: 4px;
-    padding: 6px 8px;
+.typed-dict-item .td-type::after {
+    content: ',';
 }
-fieldset fieldset {
-    border: 1px solid #ccc;
-    margin: 4px 0;
+.typed-dict-item .td-type:nth-last-child(2)::after {
+    content: '';
 }
-#search-title {
+.td-item::before {
+    content: '  ';
+    white-space: pre;
+}
+.typed-dict-item {
+    display: block;
+    padding: 0.4rem;
+    font-family: monospace;
+    background: var(--light-background-color);
     font-size: 1.1em;
-    font-weight: bold;
-    letter-spacing: 1px;
 }
-#search-string {
-    box-sizing: border-box;
-    width: 100%;
+.args span .highlight {
+    background: var(--highlighted-background-color);
+    color: var(--highlighted-color);
 }
-#hide-unmatched {
-    margin: 0.5em 0 0 1em;
+.tags {
+    display: flex;
+    align-items: baseline;
+}
+.tags a {
+    color: inherit;
+    text-decoration: none;
+    padding: 0 0.1em;
+}
+.footer {
+    font-size: 0.9em;
 }
-#search-buttons {
-    float: right;
+.doc div > *:last-child {
+    margin-bottom: 0;
 }
 .highlight {
-    background: yellow;
+    background: var(--highlighted-background-color);
+    color: var(--highlighted-color);
+}
+.data-type {
+    font-style: italic;
 }
 .no-match {
-    color: gray !important;
+    color: var(--less-important-text-color) !important;
 }
-tr.no-match.hide-unmatched {
-    display: none;
+.no-match .dt-name,
+.no-match .kw-name {
+    color: var(--less-important-text-color);
 }
 </style>
 <style media="all" type="text/css">
 /* Pygments 'default' style sheet. Generated with Pygments 2.1.3 using:
-     pygmentize -S default -f html -a .code > src/robot/htmldata/libdoc/pygments.css
+    pygmentize -S default -f html -a .code > src/robot/htmldata/libdoc/pygments.css
+    and added for dark mode
+    @media (prefers-color-scheme: dark)
+    pygmentize -S solarized-dark -f html -a .code > src/robot/htmldata/libdoc/pygments.css
 */
 .code .hll { background-color: #ffffcc }
 .code  { background: #f8f8f8; }
@@ -210,8 +623,10 @@
 .code .mh { color: #666666 } /* Literal.Number.Hex */
 .code .mi { color: #666666 } /* Literal.Number.Integer */
 .code .mo { color: #666666 } /* Literal.Number.Oct */
+.code .sa { color: #BA2121 } /* Literal.String.Affix */
 .code .sb { color: #BA2121 } /* Literal.String.Backtick */
 .code .sc { color: #BA2121 } /* Literal.String.Char */
+.code .dl { color: #BA2121 } /* Literal.String.Delimiter */
 .code .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
 .code .s2 { color: #BA2121 } /* Literal.String.Double */
 .code .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
@@ -222,10 +637,92 @@
 .code .s1 { color: #BA2121 } /* Literal.String.Single */
 .code .ss { color: #19177C } /* Literal.String.Symbol */
 .code .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.code .fm { color: #0000FF } /* Name.Function.Magic */
 .code .vc { color: #19177C } /* Name.Variable.Class */
 .code .vg { color: #19177C } /* Name.Variable.Global */
 .code .vi { color: #19177C } /* Name.Variable.Instance */
+.code .vm { color: #19177C } /* Name.Variable.Magic */
 .code .il { color: #666666 } /* Literal.Number.Integer.Long */
+@media (prefers-color-scheme: dark) {
+    .code .hll { background-color: #073642 }
+    .code  { background: #002b36; color: #839496 }
+    .code .c { color: #586e75; font-style: italic } /* Comment */
+    .code .err { color: #839496; background-color: #dc322f } /* Error */
+    .code .esc { color: #839496 } /* Escape */
+    .code .g { color: #839496 } /* Generic */
+    .code .k { color: #859900 } /* Keyword */
+    .code .l { color: #839496 } /* Literal */
+    .code .n { color: #839496 } /* Name */
+    .code .o { color: #586e75 } /* Operator */
+    .code .x { color: #839496 } /* Other */
+    .code .p { color: #839496 } /* Punctuation */
+    .code .ch { color: #586e75; font-style: italic } /* Comment.Hashbang */
+    .code .cm { color: #586e75; font-style: italic } /* Comment.Multiline */
+    .code .cp { color: #d33682 } /* Comment.Preproc */
+    .code .cpf { color: #586e75 } /* Comment.PreprocFile */
+    .code .c1 { color: #586e75; font-style: italic } /* Comment.Single */
+    .code .cs { color: #586e75; font-style: italic } /* Comment.Special */
+    .code .gd { color: #dc322f } /* Generic.Deleted */
+    .code .ge { color: #839496; font-style: italic } /* Generic.Emph */
+    .code .gr { color: #dc322f } /* Generic.Error */
+    .code .gh { color: #839496; font-weight: bold } /* Generic.Heading */
+    .code .gi { color: #859900 } /* Generic.Inserted */
+    .code .go { color: #839496 } /* Generic.Output */
+    .code .gp { color: #839496 } /* Generic.Prompt */
+    .code .gs { color: #839496; font-weight: bold } /* Generic.Strong */
+    .code .gu { color: #839496; text-decoration: underline } /* Generic.Subheading */
+    .code .gt { color: #268bd2 } /* Generic.Traceback */
+    .code .kc { color: #2aa198 } /* Keyword.Constant */
+    .code .kd { color: #2aa198 } /* Keyword.Declaration */
+    .code .kn { color: #cb4b16 } /* Keyword.Namespace */
+    .code .kp { color: #859900 } /* Keyword.Pseudo */
+    .code .kr { color: #859900 } /* Keyword.Reserved */
+    .code .kt { color: #b58900 } /* Keyword.Type */
+    .code .ld { color: #839496 } /* Literal.Date */
+    .code .m { color: #2aa198 } /* Literal.Number */
+    .code .s { color: #2aa198 } /* Literal.String */
+    .code .na { color: #839496 } /* Name.Attribute */
+    .code .nb { color: #268bd2 } /* Name.Builtin */
+    .code .nc { color: #268bd2 } /* Name.Class */
+    .code .no { color: #268bd2 } /* Name.Constant */
+    .code .nd { color: #268bd2 } /* Name.Decorator */
+    .code .ni { color: #268bd2 } /* Name.Entity */
+    .code .ne { color: #268bd2 } /* Name.Exception */
+    .code .nf { color: #268bd2 } /* Name.Function */
+    .code .nl { color: #268bd2 } /* Name.Label */
+    .code .nn { color: #268bd2 } /* Name.Namespace */
+    .code .nx { color: #839496 } /* Name.Other */
+    .code .py { color: #839496 } /* Name.Property */
+    .code .nt { color: #268bd2 } /* Name.Tag */
+    .code .nv { color: #268bd2 } /* Name.Variable */
+    .code .ow { color: #859900 } /* Operator.Word */
+    .code .w { color: #839496 } /* Text.Whitespace */
+    .code .mb { color: #2aa198 } /* Literal.Number.Bin */
+    .code .mf { color: #2aa198 } /* Literal.Number.Float */
+    .code .mh { color: #2aa198 } /* Literal.Number.Hex */
+    .code .mi { color: #2aa198 } /* Literal.Number.Integer */
+    .code .mo { color: #2aa198 } /* Literal.Number.Oct */
+    .code .sa { color: #2aa198 } /* Literal.String.Affix */
+    .code .sb { color: #2aa198 } /* Literal.String.Backtick */
+    .code .sc { color: #2aa198 } /* Literal.String.Char */
+    .code .dl { color: #2aa198 } /* Literal.String.Delimiter */
+    .code .sd { color: #586e75 } /* Literal.String.Doc */
+    .code .s2 { color: #2aa198 } /* Literal.String.Double */
+    .code .se { color: #2aa198 } /* Literal.String.Escape */
+    .code .sh { color: #2aa198 } /* Literal.String.Heredoc */
+    .code .si { color: #2aa198 } /* Literal.String.Interpol */
+    .code .sx { color: #2aa198 } /* Literal.String.Other */
+    .code .sr { color: #cb4b16 } /* Literal.String.Regex */
+    .code .s1 { color: #2aa198 } /* Literal.String.Single */
+    .code .ss { color: #2aa198 } /* Literal.String.Symbol */
+    .code .bp { color: #268bd2 } /* Name.Builtin.Pseudo */
+    .code .fm { color: #268bd2 } /* Name.Function.Magic */
+    .code .vc { color: #268bd2 } /* Name.Variable.Class */
+    .code .vg { color: #268bd2 } /* Name.Variable.Global */
+    .code .vi { color: #268bd2 } /* Name.Variable.Instance */
+    .code .vm { color: #268bd2 } /* Name.Variable.Magic */
+    .code .il { color: #2aa198 } /* Literal.Number.Integer.Long */
+}
 </style>
 <style media="print" type="text/css">
 body {
@@ -264,25 +761,40 @@
 }
 </style>
 <style media="all" type="text/css">
-.doc > * {
-    margin: 0.7em 1em 0.1em 1em;
-    padding: 0;
+#introduction-container > h2,
+.doc > h1,
+.doc > h2,
+.section > h1,
+.section > h2 {
+    margin-top: 4rem;
+    margin-bottom: 1rem;
+}
+.doc > h3, .section > h3 {
+    margin-top: 3rem;
+    margin-bottom: 1rem;
 }
-.doc > p, .doc > h1, .doc > h2, .doc > h3, .doc > h4 {
-    margin: 0.7em 0 0.1em 0;
+.doc > h4, .section > h4 {
+    margin-top: 2rem;
+    margin-bottom: 1rem;
+}
+.doc > p, .section > p {
+    margin-top: 1rem;
+    margin-bottom: 0.5rem;
 }
 .doc > *:first-child {
     margin-top: 0.1em;
 }
 .doc table {
-    border: 1px solid #ccc;
+    border: none;
     background: transparent;
     border-collapse: collapse;
     empty-cells: show;
     font-size: 0.9em;
+    overflow-y: auto;
+    display: block;
 }
 .doc table th, .doc table td {
-    border: 1px solid #ccc;
+    border: 1px solid var(--border-color);
     background: transparent;
     padding: 0.1em 0.3em;
     height: 1.2em;
@@ -294,12 +806,18 @@
 .doc pre {
     font-size: 1.1em;
     letter-spacing: 0.05em;
-    background: #f4f4f4;
+    background: var(--light-background-color);
+    overflow-y: auto;
+    padding: 0.3rem;
+    border-radius: 3px;
 }
-.doc code {
-    padding: 0 0.2em;
+.doc code,
+.docutils.literal {
+    font-size: 1.1em;
     letter-spacing: 0.05em;
-    background: #eee;
+    background: var(--light-background-color);
+    padding: 1px;
+    border-radius: 3px;
 }
 .doc li {
     list-style-position: inside;
@@ -315,6 +833,37 @@
 }
 </style>
 <script type="text/javascript">
+storage = function () {
+    var prefix = 'robot-framework-';
+    var storage;
+    function init(user) {
+        prefix += user + '-';
+        storage = getStorage();
+    }
+    function getStorage() {
+        // Use localStorage if it's accessible, normal object otherwise.
+        // Inspired by https://stackoverflow.com/questions/11214404
+        try {
+            localStorage.setItem(prefix, prefix);
+            localStorage.removeItem(prefix);
+            return localStorage;
+        } catch (exception) {
+            return {};
+        }
+    }
+    function get(name, defaultValue) {
+        var value = storage[prefix + name];
+        if (typeof value === 'undefined')
+            return defaultValue;
+        return value;
+    }
+    function set(name, value) {
+        storage[prefix + name] = value;
+    }
+    return {init: init, get: get, set: set};
+}();
+</script>
+<script type="text/javascript">
 window.util = function () {
     function map(elems, func) {
         var ret = [];
@@ -518,8 +1067,8 @@
 }();
 </script>
 <script type="text/javascript">
-/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="<a id='"+b+"'></a><select id='"+b+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ye(){}ye.prototype=r.filters=r.pseudos,r.setFilters=new ye,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=r.preFilter;while(s){n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B," ")}),s=s.slice(n.length));for(a in r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):k(e,u).slice(0)};function ve(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[b]||(t[b]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||be(t||"*",s.nodeType?[s]:s,[]),y=!e||!o&&t?g:we(g,p,e,s,u),v=n?i||(o?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r){l=we(v,d),r(l,[],s,u),c=l.length;while(c--)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f))}if(o){if(i||e){if(i){l=[],c=v.length;while(c--)(f=v[c])&&l.push(y[c]=f);i(null,v=[],l,u)}c=v.length;while(c--)(f=v[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o;i++)if(r.relative[e[i].type])break;return Te(u>1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u<i&&Ce(e.slice(u,i)),i<o&&Ce(e=e.slice(i)),i<o&&ve(e))}p.push(n)}return xe(p)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&w(e);if(!D.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s<o.length)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:"")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&"string"!==x(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw new TypeError("Thenable self-resolution");l=e&&("object"==typeof e||"function"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,I,i),a(o,n,W,i)):(o++,l.call(e,a(o,n,I,i),a(o,n,W,i),a(o,n,I,n.notifyWith))):(r!==I&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,U=/-([a-z])/g;function V(e,t){return t.toUpperCase()}function G(e){return e.replace(X,"ms-").replace(U,V)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Q(){this.expando=w.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[G(t)]=n;else for(r in t)i[G(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][G(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(G):(t=G(t))in r?[t]:t.match(M)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var J=new Q,K=new Q,Z=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ee=/[A-Z]/g;function te(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(ee,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}K.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return K.hasData(e)||J.hasData(e)},data:function(e,t,n){return K.access(e,t,n)},removeData:function(e,t){K.remove(e,t)},_data:function(e,t,n){return J.access(e,t,n)},_removeData:function(e,t){J.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=K.get(o),1===o.nodeType&&!J.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&(r=G(r.slice(5)),ne(o,r,i[r]));J.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){K.set(this,e)}):z(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=K.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){K.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=J.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ie=new RegExp("^(?:([+-])=|)("+re+")([a-z%]*)$","i"),oe=["Top","Right","Bottom","Left"],ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&w.contains(e.ownerDocument,e)&&"none"===w.css(e,"display")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return w.css(e,t,"")},u=s(),l=n&&n[3]||(w.cssNumber[t]?"":"px"),c=(w.cssNumber[t]||"px"!==l&&+u)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"===n&&(i[o]=J.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&ae(r)&&(i[o]=ce(r))):"none"!==n&&(i[o]="none",J.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],"globalEval",!t||J.get(t[n],"globalEval"))}var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))w.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+w.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;w.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n<arguments.length;n++)u[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){s=w.event.handlers.call(this,t,l),n=0;while((o=s[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&N(this,"input"))return this.click(),!1},_default:function(e){return N(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:ke,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:ke,isPropagationStopped:ke,isImmediatePropagationStopped:ke,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=ke),this.each(function(){w.event.remove(this,e,n,t)})}});var Ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/<script|<style|<link/i,je=/checked\s*(?:[^=]|=\s*.checked.)/i,qe=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}K.hasData(e)&&(s=K.access(e),u=w.extend({},s),K.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();"input"===n&&pe.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-1,y=t[0],v=g(y);if(v||p>1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f<p;f++)l=i,f!==d&&(l=w.clone(l,!0,!0),u&&w.merge(s,ye(l,"script"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,w.map(s,Oe),f=0;f<u;f++)l=s[f],he.test(l.type||"")&&!J.access(l,"globalEval")&&w.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(qe,""),c,l))}return e}function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ye(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ve(ye(r,"script")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(Ne,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ye(e),a=a||ye(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ye(s,"script")).length>0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ye(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ye(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),s.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp("^("+re+")(?!px)[a-z%]+$","i"),$e=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(oe.join("|"),"i");!function(){function t(){if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",be.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i="1%"!==t.top,u=12===n(t.marginLeft),c.style.right="60%",s=36===n(t.right),o=36===n(t.width),c.style.position="absolute",a=36===c.offsetWidth||"absolute",be.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,s,u,l=r.createElement("div"),c=r.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",h.clearCloneStyle="content-box"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),s},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var ze=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ue={position:"absolute",visibility:"hidden",display:"block"},Ve={letterSpacing:"0",fontWeight:"400"},Ge=["Webkit","Moz","ms"],Ye=r.createElement("div").style;function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;while(n--)if((e=Ge[n]+t)in Ye)return e}function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ze(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=w.css(e,n+oe[a],!0,i)),r?("content"===n&&(u-=w.css(e,"padding"+oe[a],!0,i)),"margin"!==n&&(u-=w.css(e,"border"+oe[a]+"Width",!0,i))):(u+=w.css(e,"padding"+oe[a],!0,i),"padding"!==n?u+=w.css(e,"border"+oe[a]+"Width",!0,i):s+=w.css(e,"border"+oe[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ct(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),y=J.get(e,"fxshow");n.queue||(null==(a=w._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,w.queue(e,"fx").length||a.empty.fire()})}));for(r in t)if(i=t[r],it.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!y||void 0===y[r])continue;g=!0}d[r]=y&&y[r]||w.style(e,r)}if((u=!w.isEmptyObject(t))||!w.isEmptyObject(d)){f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=y&&y.display)&&(l=J.get(e,"display")),"none"===(c=w.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=w.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===w.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(y?"hidden"in y&&(g=y.hidden):y=J.access(e,"fxshow",{display:l}),o&&(y.hidden=!g),g&&fe([e],!0),p.done(function(){g||fe([e]),J.remove(e,"fxshow");for(r in d)w.style(e,r,d[r])})),u=lt(g?y[r]:0,r,p),r in y||(y[r]=u.start,g&&(u.end=u.start,u.start=0))}}function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=w.cssHooks[r])&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=nt||st(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:w.extend({},t),opts:w.extend(!0,{specialEasing:{},easing:w.easing._default},n),originalProperties:t,originalOptions:n,startTime:nt||st(),duration:n.duration,tweens:[],createTween:function(t,n){var r=w.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(ft(c,l.opts.specialEasing);o<a;o++)if(r=pt.prefilters[o].call(l,e,c,l.opts))return g(r.stop)&&(w._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return w.map(c,lt,l),g(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),w.fx.timer(w.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}w.Animation=w.extend(pt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){g(e)?(t=e,e=["*"]):e=e.match(M);for(var n,r=0,i=e.length;r<i;r++)n=e[r],pt.tweeners[n]=pt.tweeners[n]||[],pt.tweeners[n].unshift(t)},prefilters:[ct],prefilter:function(e,t){t?pt.prefilters.unshift(e):pt.prefilters.push(e)}}),w.speed=function(e,t,n){var r=e&&"object"==typeof e?w.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return w.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in w.fx.speeds?r.duration=w.fx.speeds[r.duration]:r.duration=w.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&w.dequeue(this,r.queue)},r},w.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=w.isEmptyObject(e),o=w.speed(t,n,r),a=function(){var t=pt(this,w.extend({},e),o);(i||J.get(this,"finish"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=w.timers,a=J.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&ot.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||w.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=J.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=w.timers,a=r?r.length:0;for(n.finish=!0,w.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),w.each(["toggle","show","hide"],function(e,t){var n=w.fn[t];w.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ut(t,!0),e,r,i)}}),w.each({slideDown:ut("show"),slideUp:ut("hide"),slideToggle:ut("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){w.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),w.timers=[],w.fx.tick=function(){var e,t=0,n=w.timers;for(nt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||w.fx.stop(),nt=void 0},w.fx.timer=function(e){w.timers.push(e),w.fx.start()},w.fx.interval=13,w.fx.start=function(){rt||(rt=!0,at())},w.fx.stop=function(){rt=null},w.fx.speeds={slow:600,fast:200,_default:400},w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var dt,ht=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return z(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,"optgroup"))){if(t=w(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Yt=[],Qt=/(=)\?(?=&|$)|\?\?/;w.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||w.expando+"_"+Et++;return this[e]=!0,e}}),w.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Qt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Qt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Qt,"$1"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||w.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?w(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(i)),a&&g(o)&&o(a[0]),a=o=void 0}),"script"}),h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="<form></form><form></form>",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=A.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=vt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&w.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?w("<div>").append(w.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},w.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=w.css(e,"position"),f=w(e),p={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=w.css(e,"top"),u=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),g(t)&&(t=t.call(e,n,w.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),"using"in t?t.using.call(e,p):f.css(p)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||be})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return z(this,function(e,r,i){var o;if(y(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=_e(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return z(this,function(t,n,i){var o;return y(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});
+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
 </script>
 <script type="text/javascript">
 /*
@@ -547,7 +1096,7 @@
 jQuery.extend({highlight:function(e,t,n,r){if(e.nodeType===3){var i=e.data.match(t);if(i){var s=document.createElement(n||"span");s.className=r||"highlight";var o=e.splitText(i.index);o.splitText(i[0].length);var u=o.cloneNode(true);s.appendChild(u);o.parentNode.replaceChild(s,o);return 1}}else if(e.nodeType===1&&e.childNodes&&!/(script|style)/i.test(e.tagName)&&!(e.tagName===n.toUpperCase()&&e.className===r)){for(var a=0;a<e.childNodes.length;a++){a+=jQuery.highlight(e.childNodes[a],t,n,r)}}return 0}});jQuery.fn.unhighlight=function(e){var t={className:"highlight",element:"span"};jQuery.extend(t,e);return this.find(t.element+"."+t.className).each(function(){var e=this.parentNode;e.replaceChild(this.firstChild,this);e.normalize()}).end()};jQuery.fn.highlight=function(e,t){var n={className:"highlight",element:"span",caseSensitive:false,wordsOnly:false};jQuery.extend(n,t);if(e.constructor===String){e=[e]}e=jQuery.grep(e,function(e,t){return e!=""});e=jQuery.map(e,function(e,t){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")});if(e.length==0){return this}var r=n.caseSensitive?"":"i";var i="("+e.join("|")+")";if(n.wordsOnly){i="\\b"+i+"\\b"}var s=new RegExp(i,r);return this.each(function(){jQuery.highlight(this,s,n.element,n.className)})}
 </script>
 <script type="text/javascript">
-libdoc = {"all_tags":[],"contains_tags":false,"doc":"<p>Documentation for library <code>RequestsLibrary\x3c/code>.\x3c/p>","generated":"2020-05-01 19:56:47","inits":[],"keywords":[{"args":["alias","url","headers={}","cookies={}","client_certs=None","timeout=None","proxies=None","verify=False","debug=0","max_retries=3","backoff_factor=0.1","disable_warnings=0","retry_status_list=[]","retry_method_list=['DELETE', 'OPTIONS', 'HEAD', 'PUT', 'GET', 'TRACE']"],"doc":"<p>Create Session: create a HTTP session to a server\x3c/p>\n<p><code>url\x3c/code> Base url of the server\x3c/p>\n<p><code>alias\x3c/code> Robot Framework alias to identify the session\x3c/p>\n<p><code>headers\x3c/code> Dictionary of default headers\x3c/p>\n<p><code>cookies\x3c/code> Dictionary of cookies\x3c/p>\n<p><code>client_certs\x3c/code> ['client certificate', 'client key'] PEM files containing the client key and certificate\x3c/p>\n<p><code>timeout\x3c/code> Connection timeout\x3c/p>\n<p><code>proxies\x3c/code> Dictionary that contains proxy urls for HTTP and HTTPS communication\x3c/p>\n<p><code>verify\x3c/code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to False.\x3c/p>\n<p><code>debug\x3c/code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\x3c/a>\x3c/p>\n<p><code>max_retries\x3c/code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.\x3c/p>\n<p><code>disable_warnings\x3c/code> Disable requests warning useful when you have large number of testcases\x3c/p>\n<p><code>backoff_factor\x3c/code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\x3c/a>\x3c/p>\n<p><code>retry_method_list\x3c/code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.\x3c/p>\n<p><code>retry_status_list\x3c/code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.\x3c/p>","matched":true,"name":"Create Client Cert Session","shortdoc":"Create Session: create a HTTP session to a server","tags":[]},{"args":["alias","url","auth","headers={}","cookies={}","timeout=None","proxies=None","verify=False","debug=0","max_retries=3","backoff_factor=0.1","disable_warnings=0","retry_status_list=[]","retry_method_list=['DELETE', 'OPTIONS', 'HEAD', 'PUT', 'GET', 'TRACE']"],"doc":"<p>Create Session: create a HTTP session to a server\x3c/p>\n<p><code>url\x3c/code> Base url of the server\x3c/p>\n<p><code>alias\x3c/code> Robot Framework alias to identify the session\x3c/p>\n<p><code>headers\x3c/code> Dictionary of default headers\x3c/p>\n<p><code>cookies\x3c/code> Dictionary of cookies\x3c/p>\n<p><code>auth\x3c/code> A Custom Authentication object to be passed on to the requests library. <a href=\"http://docs.python-requests.org/en/master/user/advanced/#custom-authentication\">http://docs.python-requests.org/en/master/user/advanced/#custom-authentication\x3c/a>\x3c/p>\n<p><code>timeout\x3c/code> Connection timeout\x3c/p>\n<p><code>proxies\x3c/code> Dictionary that contains proxy urls for HTTP and HTTPS communication\x3c/p>\n<p><code>verify\x3c/code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to False.\x3c/p>\n<p><code>debug\x3c/code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\x3c/a>\x3c/p>\n<p><code>max_retries\x3c/code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.\x3c/p>\n<p><code>disable_warnings\x3c/code> Disable requests warning useful when you have large number of testcases\x3c/p>\n<p><code>backoff_factor\x3c/code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\x3c/a>\x3c/p>\n<p><code>retry_method_list\x3c/code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.\x3c/p>\n<p><code>retry_status_list\x3c/code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.\x3c/p>","matched":true,"name":"Create Custom Session","shortdoc":"Create Session: create a HTTP session to a server","tags":[]},{"args":["alias","url","auth","headers={}","cookies={}","timeout=None","proxies=None","verify=False","debug=0","max_retries=3","backoff_factor=0.1","disable_warnings=0","retry_status_list=[]","retry_method_list=['DELETE', 'OPTIONS', 'HEAD', 'PUT', 'GET', 'TRACE']"],"doc":"<p>Create Session: create a HTTP session to a server\x3c/p>\n<p><code>url\x3c/code> Base url of the server\x3c/p>\n<p><code>alias\x3c/code> Robot Framework alias to identify the session\x3c/p>\n<p><code>headers\x3c/code> Dictionary of default headers\x3c/p>\n<p><code>cookies\x3c/code> Dictionary of cookies\x3c/p>\n<p><code>auth\x3c/code> ['DOMAIN', 'username', 'password'] for NTLM Authentication\x3c/p>\n<p><code>timeout\x3c/code> Connection timeout\x3c/p>\n<p><code>proxies\x3c/code> Dictionary that contains proxy urls for HTTP and HTTPS communication\x3c/p>\n<p><code>verify\x3c/code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to False.\x3c/p>\n<p><code>debug\x3c/code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\x3c/a>\x3c/p>\n<p><code>max_retries\x3c/code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.\x3c/p>\n<p><code>disable_warnings\x3c/code> Disable requests warning useful when you have large number of testcases\x3c/p>\n<p><code>backoff_factor\x3c/code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\x3c/a>\x3c/p>\n<p><code>retry_method_list\x3c/code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.\x3c/p>\n<p><code>retry_status_list\x3c/code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.\x3c/p>","matched":true,"name":"Create Digest Session","shortdoc":"Create Session: create a HTTP session to a server","tags":[]},{"args":["alias","url","auth","headers={}","cookies={}","timeout=None","proxies=None","verify=False","debug=0","max_retries=3","backoff_factor=0.1","disable_warnings=0","retry_status_list=[]","retry_method_list=['DELETE', 'OPTIONS', 'HEAD', 'PUT', 'GET', 'TRACE']"],"doc":"<p>Create Session: create a HTTP session to a server\x3c/p>\n<p><code>url\x3c/code> Base url of the server\x3c/p>\n<p><code>alias\x3c/code> Robot Framework alias to identify the session\x3c/p>\n<p><code>headers\x3c/code> Dictionary of default headers\x3c/p>\n<p><code>cookies\x3c/code> Dictionary of cookies\x3c/p>\n<p><code>auth\x3c/code> ['DOMAIN', 'username', 'password'] for NTLM Authentication\x3c/p>\n<p><code>timeout\x3c/code> Connection timeout\x3c/p>\n<p><code>proxies\x3c/code> Dictionary that contains proxy urls for HTTP and HTTPS communication\x3c/p>\n<p><code>verify\x3c/code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to False.\x3c/p>\n<p><code>debug\x3c/code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\x3c/a>\x3c/p>\n<p><code>max_retries\x3c/code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.\x3c/p>\n<p><code>disable_warnings\x3c/code> Disable requests warning useful when you have large number of testcases\x3c/p>\n<p><code>backoff_factor\x3c/code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\x3c/a>\x3c/p>\n<p><code>retry_method_list\x3c/code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.\x3c/p>\n<p><code>retry_status_list\x3c/code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.\x3c/p>","matched":true,"name":"Create Ntlm Session","shortdoc":"Create Session: create a HTTP session to a server","tags":[]},{"args":["alias","url","headers={}","cookies={}","auth=None","timeout=None","proxies=None","verify=False","debug=0","max_retries=3","backoff_factor=0.1","disable_warnings=0","retry_status_list=[]","retry_method_list=['DELETE', 'OPTIONS', 'HEAD', 'PUT', 'GET', 'TRACE']"],"doc":"<p>Create Session: create a HTTP session to a server\x3c/p>\n<p><code>alias\x3c/code> Robot Framework alias to identify the session\x3c/p>\n<p><code>url\x3c/code> Base url of the server\x3c/p>\n<p><code>headers\x3c/code> Dictionary of default headers\x3c/p>\n<p><code>cookies\x3c/code> Dictionary of cookies\x3c/p>\n<p><code>auth\x3c/code> List of username &amp; password for HTTP Basic Auth\x3c/p>\n<p><code>timeout\x3c/code> Connection timeout\x3c/p>\n<p><code>proxies\x3c/code> Dictionary that contains proxy urls for HTTP and HTTPS communication\x3c/p>\n<p><code>verify\x3c/code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.\x3c/p>\n<p><code>debug\x3c/code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\x3c/a>\x3c/p>\n<p><code>max_retries\x3c/code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.\x3c/p>\n<p><code>disable_warnings\x3c/code> Disable requests warning useful when you have large number of testcases\x3c/p>\n<p><code>backoff_factor\x3c/code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\x3c/a>\x3c/p>\n<p><code>retry_method_list\x3c/code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.\x3c/p>\n<p><code>retry_status_list\x3c/code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.\x3c/p>","matched":true,"name":"Create Session","shortdoc":"Create Session: create a HTTP session to a server","tags":[]},{"args":[],"doc":"<p>Removes all the session objects\x3c/p>","matched":true,"name":"Delete All Sessions","shortdoc":"Removes all the session objects","tags":[]},{"args":["alias","uri","data=None","json=None","params=None","headers=None","allow_redirects=None","timeout=None"],"doc":"<p>Send a DELETE request on the session object found using the given <span class=\"name\">alias\x3c/span>\x3c/p>\n<p><code>alias\x3c/code> that will be used to identify the Session object in the cache\x3c/p>\n<p><code>uri\x3c/code> to send the DELETE request to\x3c/p>\n<p><code>json\x3c/code> a value that will be json encoded and sent as request data if data is not specified\x3c/p>\n<p><code>headers\x3c/code> a dictionary of headers to use with the request\x3c/p>\n<p><code>allow_redirects\x3c/code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.\x3c/p>\n<p><code>timeout\x3c/code> connection timeout\x3c/p>","matched":true,"name":"Delete Request","shortdoc":"Send a DELETE request on the session object found using the given `alias`","tags":[]},{"args":["path"],"doc":"<p>Opens and returns a file descriptor of a specified file to be passed as <code>data\x3c/code> parameter to other requests keywords.\x3c/p>\n<p>This allows streaming upload of large files without reading them into memory.\x3c/p>\n<p>File descriptor is binary mode and read only. Requests keywords will automatically close the file, if used outside this library it's up to the caller to close it.\x3c/p>","matched":true,"name":"Get File For Streaming Upload","shortdoc":"Opens and returns a file descriptor of a specified file to be passed as ``data`` parameter to other requests keywords.","tags":[]},{"args":["alias","uri","headers=None","data=None","json=None","params=None","allow_redirects=None","timeout=None"],"doc":"<p>Send a GET request on the session object found using the given <span class=\"name\">alias\x3c/span>\x3c/p>\n<p><code>alias\x3c/code> that will be used to identify the Session object in the cache\x3c/p>\n<p><code>uri\x3c/code> to send the GET request to\x3c/p>\n<p><code>params\x3c/code> url parameters to append to the uri\x3c/p>\n<p><code>headers\x3c/code> a dictionary of headers to use with the request\x3c/p>\n<p><code>data\x3c/code> a dictionary of key-value pairs that will be urlencoded and sent as GET data or binary data that is sent as the raw body content\x3c/p>\n<p><code>json\x3c/code> a value that will be json encoded and sent as GET data if data is not specified\x3c/p>\n<p><code>allow_redirects\x3c/code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.\x3c/p>\n<p><code>timeout\x3c/code> connection timeout\x3c/p>","matched":true,"name":"Get Request","shortdoc":"Send a GET request on the session object found using the given `alias`","tags":[]},{"args":["alias","uri","headers=None","allow_redirects=None","timeout=None"],"doc":"<p>Send a HEAD request on the session object found using the given <span class=\"name\">alias\x3c/span>\x3c/p>\n<p><code>alias\x3c/code> that will be used to identify the Session object in the cache\x3c/p>\n<p><code>uri\x3c/code> to send the HEAD request to\x3c/p>\n<p><code>allow_redirects\x3c/code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.\x3c/p>\n<p><code>headers\x3c/code> a dictionary of headers to use with the request\x3c/p>\n<p><code>timeout\x3c/code> connection timeout\x3c/p>","matched":true,"name":"Head Request","shortdoc":"Send a HEAD request on the session object found using the given `alias`","tags":[]},{"args":["alias","uri","headers=None","allow_redirects=None","timeout=None"],"doc":"<p>Send an OPTIONS request on the session object found using the given <span class=\"name\">alias\x3c/span>\x3c/p>\n<p><code>alias\x3c/code> that will be used to identify the Session object in the cache\x3c/p>\n<p><code>uri\x3c/code> to send the OPTIONS request to\x3c/p>\n<p><code>allow_redirects\x3c/code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.\x3c/p>\n<p><code>headers\x3c/code> a dictionary of headers to use with the request\x3c/p>\n<p><code>timeout\x3c/code> connection timeout\x3c/p>","matched":true,"name":"Options Request","shortdoc":"Send an OPTIONS request on the session object found using the given `alias`","tags":[]},{"args":["alias","uri","data=None","json=None","params=None","headers=None","files=None","allow_redirects=None","timeout=None"],"doc":"<p>Send a PATCH request on the session object found using the given <span class=\"name\">alias\x3c/span>\x3c/p>\n<p><code>alias\x3c/code> that will be used to identify the Session object in the cache\x3c/p>\n<p><code>uri\x3c/code> to send the PATCH request to\x3c/p>\n<p><code>data\x3c/code> a dictionary of key-value pairs that will be urlencoded and sent as PATCH data or binary data that is sent as the raw body content or file descriptor retrieved by Get File For Streaming Upload\x3c/p>\n<p><code>json\x3c/code> a value that will be json encoded and sent as PATCH data if data is not specified\x3c/p>\n<p><code>headers\x3c/code> a dictionary of headers to use with the request\x3c/p>\n<p><code>files\x3c/code> a dictionary of file names containing file data to PATCH to the server\x3c/p>\n<p><code>allow_redirects\x3c/code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.\x3c/p>\n<p><code>params\x3c/code> url parameters to append to the uri\x3c/p>\n<p><code>timeout\x3c/code> connection timeout\x3c/p>","matched":true,"name":"Patch Request","shortdoc":"Send a PATCH request on the session object found using the given `alias`","tags":[]},{"args":["alias","uri","data=None","json=None","params=None","headers=None","files=None","allow_redirects=None","timeout=None"],"doc":"<p>Send a POST request on the session object found using the given <span class=\"name\">alias\x3c/span>\x3c/p>\n<p><code>alias\x3c/code> that will be used to identify the Session object in the cache\x3c/p>\n<p><code>uri\x3c/code> to send the POST request to\x3c/p>\n<p><code>data\x3c/code> a dictionary of key-value pairs that will be urlencoded and sent as POST data or binary data that is sent as the raw body content or passed as such for multipart form data if <code>files\x3c/code> is also defined or file descriptor retrieved by Get File For Streaming Upload\x3c/p>\n<p><code>json\x3c/code> a value that will be json encoded and sent as POST data if files or data is not specified\x3c/p>\n<p><code>params\x3c/code> url parameters to append to the uri\x3c/p>\n<p><code>headers\x3c/code> a dictionary of headers to use with the request\x3c/p>\n<p><code>files\x3c/code> a dictionary of file names containing file data to POST to the server\x3c/p>\n<p><code>allow_redirects\x3c/code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.\x3c/p>\n<p><code>timeout\x3c/code> connection timeout\x3c/p>","matched":true,"name":"Post Request","shortdoc":"Send a POST request on the session object found using the given `alias`","tags":[]},{"args":["alias","uri","data=None","json=None","params=None","files=None","headers=None","allow_redirects=None","timeout=None"],"doc":"<p>Send a PUT request on the session object found using the given <span class=\"name\">alias\x3c/span>\x3c/p>\n<p><code>alias\x3c/code> that will be used to identify the Session object in the cache\x3c/p>\n<p><code>uri\x3c/code> to send the PUT request to\x3c/p>\n<p><code>data\x3c/code> a dictionary of key-value pairs that will be urlencoded and sent as PUT data or binary data that is sent as the raw body content or file descriptor retrieved by Get File For Streaming Upload\x3c/p>\n<p><code>json\x3c/code> a value that will be json encoded and sent as PUT data if data is not specified\x3c/p>\n<p><code>headers\x3c/code> a dictionary of headers to use with the request\x3c/p>\n<p><code>allow_redirects\x3c/code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.\x3c/p>\n<p><code>params\x3c/code> url parameters to append to the uri\x3c/p>\n<p><code>timeout\x3c/code> connection timeout\x3c/p>","matched":true,"name":"Put Request","shortdoc":"Send a PUT request on the session object found using the given `alias`","tags":[]},{"args":["response"],"doc":"<p>Fails if response status code is a client or server error (4xx, 5xx).\x3c/p>\n<p>The <code>response\x3c/code> is the output of other requests keywords like <code>Get Request\x3c/code>.\x3c/p>\n<p>In case of failure an HTTPError will be automatically raised.\x3c/p>","matched":true,"name":"Request Should Be Successful","shortdoc":"Fails if response status code is a client or server error (4xx, 5xx).","tags":[]},{"args":["alias"],"doc":"<p>Return True if the session has been already created\x3c/p>\n<p><code>alias\x3c/code> that has been used to identify the Session object in the cache\x3c/p>","matched":true,"name":"Session Exists","shortdoc":"Return True if the session has been already created","tags":[]},{"args":["expected_status","response","msg=None"],"doc":"<p>Fails if response status code is different than the expected.\x3c/p>\n<p><code>expected_status\x3c/code> could be the code number as an integer or as string. But it could also be a named status code like 'ok', 'created', 'accepted' or 'bad request', 'not found' etc.\x3c/p>\n<p>The <code>response\x3c/code> is the output of other requests keywords like <code>Get Request\x3c/code>.\x3c/p>\n<p>A custom message <code>msg\x3c/code> can be added to work like built in keywords.\x3c/p>","matched":true,"name":"Status Should Be","shortdoc":"Fails if response status code is different than the expected.","tags":[]},{"args":["content","pretty_print=False"],"doc":"<p>Convert a string to a JSON object\x3c/p>\n<p><code>content\x3c/code> String content to convert into JSON\x3c/p>\n<p><code>pretty_print\x3c/code> If defined, will output JSON is pretty print format\x3c/p>","matched":true,"name":"To Json","shortdoc":"Convert a string to a JSON object","tags":[]},{"args":["alias","headers=None","cookies=None"],"doc":"<p>Update Session Headers: update a HTTP Session Headers\x3c/p>\n<p><code>alias\x3c/code> Robot Framework alias to identify the session\x3c/p>\n<p><code>headers\x3c/code> Dictionary of headers merge into session\x3c/p>","matched":true,"name":"Update Session","shortdoc":"Update Session Headers: update a HTTP Session Headers","tags":[]}],"name":"RequestsLibrary","named_args":true,"scope":"global","version":"0.7.0"};
+libdoc = {"name": "RequestsLibrary", "doc": "<p>RequestsLibrary is a Robot Framework library aimed to provide HTTP api testing functionalities by wrapping the well known Python Requests Library.</p>\n<h3 id=\"Table of contents\">Table of contents</h3>\n<ul>\n<li><a href=\"#Usage\" class=\"name\">Usage</a></li>\n<li><a href=\"#Response%20Object\" class=\"name\">Response Object</a></li>\n<li><a href=\"#Keywords\" class=\"name\">Keywords</a></li>\n</ul>\n<h2 id=\"Usage\">Usage</h2>\n<p>Before making an HTTP request a new connection needs to be prepared this can be done with <a href=\"#Create%20Session\" class=\"name\">Create Session</a> keyword. Then you can execute any <span class=\"name\">* On Session</span> keywords below some examples:</p>\n<pre>\n  <b>*</b> Settings <b>*</b>\n  Library               Collections\n  Library               RequestsLibrary\n\n  Suite Setup           Create Session    jsonplaceholder    <a href=\"https://jsonplaceholder.typicode.com\">https://jsonplaceholder.typicode.com</a>\n\n  <b>*</b> Test Cases <b>*</b>\n\n  Get Request Test\n      Create Session    google             <a href=\"http://www.google.com\">http://www.google.com</a>\n\n      ${resp_google}=   GET On Session     google             /           expected_status=200\n      ${resp_json}=     GET On Session     jsonplaceholder    /posts/1\n\n      Should Be Equal As Strings           ${resp_google.reason}    OK\n      Dictionary Should Contain Value      ${resp_json.json()}    sunt aut facere repellat provident occaecati excepturi optio reprehenderit\n\n  Post Request Test\n      &amp;{data}=          Create dictionary  title=Robotframework requests  body=This is a test!  userId=1\n      ${resp}=          POST On Session    jsonplaceholder     /posts    json=${data}\n\n      Status Should Be                     201    ${resp}\n      Dictionary Should Contain Key        ${resp.json()}     id\n</pre>\n<h2 id=\"Response Object\">Response Object</h2>\n<p>All the HTTP requests keywords (GET, POST, PUT, etc.) return an extremely useful Response object. The Response object contains a server\u2019s response to an HTTP request.</p>\n<p>You can access the different attributes with the dot notation in this way: <code>${response.json()}</code> or <code>${response.text}</code>. Below the list of the most useful attributes:</p>\n<table border=\"1\">\n<tr>\n<th>Attributes</th>\n<th>Explanation</th>\n</tr>\n<tr>\n<td>content</td>\n<td>Content of the response, in bytes.</td>\n</tr>\n<tr>\n<td>cookies</td>\n<td>A CookieJar of Cookies the server sent back.</td>\n</tr>\n<tr>\n<td>elapsed</td>\n<td>The amount of time elapsed between sending the request and the arrival of the response (as a timedelta). This property specifically measures the time taken between sending the first byte of the request and finishing parsing the headers. It is therefore unaffected by consuming the response content or the value of the stream keyword argument.</td>\n</tr>\n<tr>\n<td>encoding</td>\n<td>Encoding to decode with when accessing <code>response.text.</code></td>\n</tr>\n<tr>\n<td>headers</td>\n<td>Case-insensitive Dictionary of Response Headers. For example, <code>headers['content-encoding']</code> will return the value of a `Content-Encoding' response header.</td>\n</tr>\n<tr>\n<td>history</td>\n<td>A list of Response objects from the history of the Request. Any redirect responses will end up here. The list is sorted from the oldest to the most recent request.</td>\n</tr>\n<tr>\n<td>json</td>\n<td>Returns the json-encoded content of a response, if any. Parameters: <code>**kwargs</code> \u2013 Optional arguments that json.loads takes. Raises:        ValueError \u2013 If the response body does not contain valid json.</td>\n</tr>\n<tr>\n<td>ok</td>\n<td>Returns True if status_code is less than 400, False if not.</td>\n</tr>\n<tr>\n<td>reason</td>\n<td>Textual reason of responded HTTP Status, e.g. <code>Not Found</code> or <code>OK</code>.</td>\n</tr>\n<tr>\n<td>status_code</td>\n<td>Integer Code of responded HTTP Status, e.g. 404 or 200.</td>\n</tr>\n<tr>\n<td>text</td>\n<td>Content of the response, in unicode. If <code>response.encoding</code> is <code>None</code>, encoding will be guessed using chardet. The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set <code>response.encoding</code> appropriately before accessing this property.</td>\n</tr>\n<tr>\n<td>url</td>\n<td>Final URL location of Response.</td>\n</tr>\n</table>", "version": "0.8rc1", "generated": "2021-01-02 00:27:46", "type": "LIBRARY", "scope": "GLOBAL", "docFormat": "HTML", "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/__init__.py", "lineno": 19, "tags": [], "inits": [], "keywords": [{"name": "Create Client Cert Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "headers", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers={}"}, {"name": "cookies", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "cookies={}"}, {"name": "client_certs", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "client_certs=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}, {"name": "proxies", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "proxies=None"}, {"name": "verify", "types": [], "default": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "verify=False"}, {"name": "debug", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "debug=0"}, {"name": "max_retries", "types": [], "default": "3", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "max_retries=3"}, {"name": "backoff_factor", "types": [], "default": "0.1", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "backoff_factor=0.1"}, {"name": "disable_warnings", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "disable_warnings=0"}, {"name": "retry_status_list", "types": [], "default": "[]", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_status_list=[]"}, {"name": "retry_method_list", "types": [], "default": "['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_method_list=['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']"}], "doc": "<p>Create Session: create a HTTP session to a server</p>\n<p><code>url</code> Base url of the server</p>\n<p><code>alias</code> Robot Framework alias to identify the session</p>\n<p><code>headers</code> Dictionary of default headers</p>\n<p><code>cookies</code> Dictionary of cookies</p>\n<p><code>client_certs</code> ['client certificate', 'client key'] PEM files containing the client key and certificate</p>\n<p><code>timeout</code> Connection timeout</p>\n<p><code>proxies</code> Dictionary that contains proxy urls for HTTP and HTTPS communication</p>\n<p><code>verify</code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to False.</p>\n<p><code>debug</code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel</a></p>\n<p><code>max_retries</code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.</p>\n<p><code>disable_warnings</code> Disable requests warning useful when you have large number of testcases</p>\n<p><code>backoff_factor</code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html</a></p>\n<p><code>retry_method_list</code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.</p>\n<p><code>retry_status_list</code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.</p>", "shortdoc": "Create Session: create a HTTP session to a server", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/SessionKeywords.py", "lineno": 191}, {"name": "Create Custom Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "auth", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "auth"}, {"name": "headers", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers={}"}, {"name": "cookies", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "cookies={}"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}, {"name": "proxies", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "proxies=None"}, {"name": "verify", "types": [], "default": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "verify=False"}, {"name": "debug", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "debug=0"}, {"name": "max_retries", "types": [], "default": "3", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "max_retries=3"}, {"name": "backoff_factor", "types": [], "default": "0.1", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "backoff_factor=0.1"}, {"name": "disable_warnings", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "disable_warnings=0"}, {"name": "retry_status_list", "types": [], "default": "[]", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_status_list=[]"}, {"name": "retry_method_list", "types": [], "default": "['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_method_list=['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']"}], "doc": "<p>Create Session: create a HTTP session to a server</p>\n<p><code>url</code> Base url of the server</p>\n<p><code>alias</code> Robot Framework alias to identify the session</p>\n<p><code>headers</code> Dictionary of default headers</p>\n<p><code>cookies</code> Dictionary of cookies</p>\n<p><code>auth</code> A Custom Authentication object to be passed on to the requests library. <a href=\"http://docs.python-requests.org/en/master/user/advanced/#custom-authentication\">http://docs.python-requests.org/en/master/user/advanced/#custom-authentication</a></p>\n<p><code>timeout</code> Connection timeout</p>\n<p><code>proxies</code> Dictionary that contains proxy urls for HTTP and HTTPS communication</p>\n<p><code>verify</code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to False.</p>\n<p><code>debug</code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel</a></p>\n<p><code>max_retries</code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.</p>\n<p><code>disable_warnings</code> Disable requests warning useful when you have large number of testcases</p>\n<p><code>backoff_factor</code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html</a></p>\n<p><code>retry_method_list</code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.</p>\n<p><code>retry_status_list</code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.</p>", "shortdoc": "Create Session: create a HTTP session to a server", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/SessionKeywords.py", "lineno": 276}, {"name": "Create Digest Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "auth", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "auth"}, {"name": "headers", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers={}"}, {"name": "cookies", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "cookies={}"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}, {"name": "proxies", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "proxies=None"}, {"name": "verify", "types": [], "default": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "verify=False"}, {"name": "debug", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "debug=0"}, {"name": "max_retries", "types": [], "default": "3", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "max_retries=3"}, {"name": "backoff_factor", "types": [], "default": "0.1", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "backoff_factor=0.1"}, {"name": "disable_warnings", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "disable_warnings=0"}, {"name": "retry_status_list", "types": [], "default": "[]", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_status_list=[]"}, {"name": "retry_method_list", "types": [], "default": "['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_method_list=['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']"}], "doc": "<p>Create Session: create a HTTP session to a server</p>\n<p><code>url</code> Base url of the server</p>\n<p><code>alias</code> Robot Framework alias to identify the session</p>\n<p><code>headers</code> Dictionary of default headers</p>\n<p><code>cookies</code> Dictionary of cookies</p>\n<p><code>auth</code> ['DOMAIN', 'username', 'password'] for NTLM Authentication</p>\n<p><code>timeout</code> Connection timeout</p>\n<p><code>proxies</code> Dictionary that contains proxy urls for HTTP and HTTPS communication</p>\n<p><code>verify</code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to False.</p>\n<p><code>debug</code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel</a></p>\n<p><code>max_retries</code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.</p>\n<p><code>disable_warnings</code> Disable requests warning useful when you have large number of testcases</p>\n<p><code>backoff_factor</code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html</a></p>\n<p><code>retry_method_list</code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.</p>\n<p><code>retry_status_list</code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.</p>", "shortdoc": "Create Session: create a HTTP session to a server", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/SessionKeywords.py", "lineno": 359}, {"name": "Create Ntlm Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "auth", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "auth"}, {"name": "headers", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers={}"}, {"name": "cookies", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "cookies={}"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}, {"name": "proxies", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "proxies=None"}, {"name": "verify", "types": [], "default": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "verify=False"}, {"name": "debug", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "debug=0"}, {"name": "max_retries", "types": [], "default": "3", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "max_retries=3"}, {"name": "backoff_factor", "types": [], "default": "0.1", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "backoff_factor=0.1"}, {"name": "disable_warnings", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "disable_warnings=0"}, {"name": "retry_status_list", "types": [], "default": "[]", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_status_list=[]"}, {"name": "retry_method_list", "types": [], "default": "['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_method_list=['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']"}], "doc": "<p>Create Session: create a HTTP session to a server</p>\n<p><code>url</code> Base url of the server</p>\n<p><code>alias</code> Robot Framework alias to identify the session</p>\n<p><code>headers</code> Dictionary of default headers</p>\n<p><code>cookies</code> Dictionary of cookies</p>\n<p><code>auth</code> ['DOMAIN', 'username', 'password'] for NTLM Authentication</p>\n<p><code>timeout</code> Connection timeout</p>\n<p><code>proxies</code> Dictionary that contains proxy urls for HTTP and HTTPS communication</p>\n<p><code>verify</code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to False.</p>\n<p><code>debug</code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel</a></p>\n<p><code>max_retries</code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.</p>\n<p><code>disable_warnings</code> Disable requests warning useful when you have large number of testcases</p>\n<p><code>backoff_factor</code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html</a></p>\n<p><code>retry_method_list</code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.</p>\n<p><code>retry_status_list</code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.</p>", "shortdoc": "Create Session: create a HTTP session to a server", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/SessionKeywords.py", "lineno": 436}, {"name": "Create Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "headers", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers={}"}, {"name": "cookies", "types": [], "default": "{}", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "cookies={}"}, {"name": "auth", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "auth=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}, {"name": "proxies", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "proxies=None"}, {"name": "verify", "types": [], "default": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "verify=False"}, {"name": "debug", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "debug=0"}, {"name": "max_retries", "types": [], "default": "3", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "max_retries=3"}, {"name": "backoff_factor", "types": [], "default": "0.1", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "backoff_factor=0.1"}, {"name": "disable_warnings", "types": [], "default": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "disable_warnings=0"}, {"name": "retry_status_list", "types": [], "default": "[]", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_status_list=[]"}, {"name": "retry_method_list", "types": [], "default": "['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_method_list=['PUT', 'DELETE', 'OPTIONS', 'TRACE', 'HEAD', 'GET']"}], "doc": "<p>Create Session: create a HTTP session to a server</p>\n<p><code>alias</code> Robot Framework alias to identify the session</p>\n<p><code>url</code> Base url of the server</p>\n<p><code>headers</code> Dictionary of default headers</p>\n<p><code>cookies</code> Dictionary of cookies</p>\n<p><code>auth</code> List of username &amp; password for HTTP Basic Auth</p>\n<p><code>timeout</code> Connection timeout</p>\n<p><code>proxies</code> Dictionary that contains proxy urls for HTTP and HTTPS communication</p>\n<p><code>verify</code> Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.</p>\n<p><code>debug</code> Enable http verbosity option more information <a href=\"https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel\">https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel</a></p>\n<p><code>max_retries</code> Number of maximum retries each connection should attempt. By default it will retry 3 times in case of connection errors only. A 0 value will disable any kind of retries regardless of other retry settings. In case the number of retries is reached a retry exception is raised.</p>\n<p><code>disable_warnings</code> Disable requests warning useful when you have large number of testcases</p>\n<p><code>backoff_factor</code> Introduces a delay time between retries that is longer after each retry. eg. if backoff_factor is set to 0.1 the sleep between attemps will be: 0.0, 0.2, 0.4 More info here: <a href=\"https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html\">https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html</a></p>\n<p><code>retry_method_list</code> List of uppercased HTTP method verbs where retries are allowed. By default retries are allowed only on HTTP requests methods that are considered to be idempotent (multiple requests with the same parameters end with the same state). eg. set to ['POST', 'GET'] to retry only those kind of requests.</p>\n<p><code>retry_status_list</code> List of integer HTTP status codes that, if returned, a retry is attempted. eg. set to [502, 503] to retry requests if those status are returned. Note that max_retries must be greater than 0.</p>", "shortdoc": "Create Session: create a HTTP session to a server", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/SessionKeywords.py", "lineno": 110}, {"name": "Delete All Sessions", "args": [], "doc": "<p>Removes all the session objects</p>", "shortdoc": "Removes all the session objects", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/SessionKeywords.py", "lineno": 540}, {"name": "DELETE On Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "expected_status", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "expected_status=None"}, {"name": "msg", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg=None"}, {"name": "kwargs", "types": [], "default": null, "kind": "VAR_NAMED", "required": false, "repr": "**kwargs"}], "doc": "<p>Sends a DELETE request on a previously created HTTP Session.</p>\n<p>Session will be identified using the <code>alias</code> name. The endpoint used to send the request is the <code>url</code> parameter.</p>\n<p>By default this keyword fails if a status code with error values is returned in the response, this behavior can be modified using the <code>expected_status</code> and <code>msg</code> parameters, read more about it in <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a> keyword documentation. In order to disable this implicit assert mechanism you can pass as <code>expected_status</code> the values <code>any</code> or <code>anything</code>.</p>\n<p>Other optional requests arguments can be passed using <code>**kwargs</code> see the <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a> keyword for the complete list.</p>", "shortdoc": "Sends a DELETE request on a previously created HTTP Session.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsOnSessionKeywords.py", "lineno": 137}, {"name": "Delete Request", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "uri", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "uri"}, {"name": "data", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "data=None"}, {"name": "json", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "json=None"}, {"name": "params", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "params=None"}, {"name": "headers", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers=None"}, {"name": "allow_redirects", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "allow_redirects=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}], "doc": "<p><b>DEPRECATED</b> Please use <a href=\"#DELETE%20On%20Session\" class=\"name\">DELETE On Session</a> instead.</p>\n<p>Send a DELETE request on the session object found using the given <span class=\"name\">alias</span></p>\n<p><code>alias</code> that will be used to identify the Session object in the cache</p>\n<p><code>uri</code> to send the DELETE request to</p>\n<p><code>json</code> a value that will be json encoded and sent as request data if data is not specified</p>\n<p><code>headers</code> a dictionary of headers to use with the request</p>\n<p><code>allow_redirects</code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.</p>\n<p><code>timeout</code> connection timeout</p>", "shortdoc": "*DEPRECATED* Please use `DELETE On Session` instead.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/DeprecatedKeywords.py", "lineno": 261}, {"name": "Get File For Streaming Upload", "args": [{"name": "path", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "path"}], "doc": "<p>Opens and returns a file descriptor of a specified file to be passed as <code>data</code> parameter to other requests keywords.</p>\n<p>This allows streaming upload of large files without reading them into memory.</p>\n<p>File descriptor is binary mode and read only. Requests keywords will automatically close the file, if used outside this library it's up to the caller to close it.</p>", "shortdoc": "Opens and returns a file descriptor of a specified file to be passed as ``data`` parameter to other requests keywords.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsKeywords.py", "lineno": 56}, {"name": "GET On Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "params", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "params=None"}, {"name": "expected_status", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "expected_status=None"}, {"name": "msg", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg=None"}, {"name": "kwargs", "types": [], "default": null, "kind": "VAR_NAMED", "required": false, "repr": "**kwargs"}], "doc": "<p>Sends a GET request on a previously created HTTP Session.</p>\n<p>Session will be identified using the <code>alias</code> name. The endpoint used to retrieve the resource is the <code>url</code>, while query string parameters can be passed as string, dictionary (or list of tuples or bytes) through the <code>params</code>.</p>\n<p>By default this keyword fails if a status code with error values is returned in the response, this behavior can be modified using the <code>expected_status</code> and <code>msg</code> parameters, read more about it in <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a> keyword documentation. In order to disable this implicit assert mechanism you can pass as <code>expected_status</code> the values <code>any</code> or <code>anything</code>.</p>\n<p>Other optional requests arguments can be passed using <code>**kwargs</code> here is a list:</p>\n<table border=\"1\">\n<tr>\n<td><code>data</code></td>\n<td>Dictionary, list of tuples, bytes, or file-like object to send in the body of the request.</td>\n</tr>\n<tr>\n<td><code>json</code></td>\n<td>A JSON serializable Python object to send in the body of the request.</td>\n</tr>\n<tr>\n<td><code>headers</code></td>\n<td>Dictionary of HTTP Headers to send with the request.</td>\n</tr>\n<tr>\n<td><code>cookies</code></td>\n<td>Dict or CookieJar object to send with the request.</td>\n</tr>\n<tr>\n<td><code>files</code></td>\n<td>Dictionary of file-like-objects (or <code>{'name': file-tuple}</code>) for multipart encoding upload.</td>\n</tr>\n<tr>\n<td><code>file-tuple</code></td>\n<td>can be a 2-tuple <code>('filename', fileobj)</code>, 3-tuple <code>('filename', fileobj, 'content_type')</code> or a 4-tuple <code>('filename', fileobj, 'content_type', custom_headers)</code>, where <code>'content-type'</code> is a string defining the content type of the given file and <code>custom_headers</code> a dict-like object containing additional headers to add for the file.</td>\n</tr>\n<tr>\n<td><code>auth</code></td>\n<td>Auth tuple to enable Basic/Digest/Custom HTTP Auth.</td>\n</tr>\n<tr>\n<td><code>timeout</code></td>\n<td>How many seconds to wait for the server to send data before giving up, as a float, or a <code>(connect timeout, read timeout)</code> tuple.</td>\n</tr>\n<tr>\n<td><code>allow_redirects</code></td>\n<td>Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to <code>True</code>.</td>\n</tr>\n<tr>\n<td><code>proxies</code></td>\n<td>Dictionary mapping protocol to the URL of the proxy.</td>\n</tr>\n<tr>\n<td><code>verify</code></td>\n<td>Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to <code>True</code>.</td>\n</tr>\n<tr>\n<td><code>stream</code></td>\n<td>if <code>False</code>, the response content will be immediately downloaded.</td>\n</tr>\n<tr>\n<td><code>cert</code></td>\n<td>if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.</td>\n</tr>\n</table>\n<p>For more updated and complete information verify the official Requests api documentation: <a href=\"https://requests.readthedocs.io/en/latest/api/\">https://requests.readthedocs.io/en/latest/api/</a></p>", "shortdoc": "Sends a GET request on a previously created HTTP Session.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsOnSessionKeywords.py", "lineno": 10}, {"name": "Get Request", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "uri", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "uri"}, {"name": "headers", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers=None"}, {"name": "data", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "data=None"}, {"name": "json", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "json=None"}, {"name": "params", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "params=None"}, {"name": "allow_redirects", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "allow_redirects=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}], "doc": "<p><b>DEPRECATED</b> Please use <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a> instead.</p>\n<p>Send a GET request on the session object found using the given <span class=\"name\">alias</span></p>\n<p><code>alias</code> that will be used to identify the Session object in the cache</p>\n<p><code>uri</code> to send the GET request to</p>\n<p><code>params</code> url parameters to append to the uri</p>\n<p><code>headers</code> a dictionary of headers to use with the request</p>\n<p><code>data</code> a dictionary of key-value pairs that will be urlencoded and sent as GET data or binary data that is sent as the raw body content</p>\n<p><code>json</code> a value that will be json encoded and sent as GET data if data is not specified</p>\n<p><code>allow_redirects</code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.</p>\n<p><code>timeout</code> connection timeout</p>", "shortdoc": "*DEPRECATED* Please use `GET On Session` instead.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/DeprecatedKeywords.py", "lineno": 36}, {"name": "HEAD On Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "expected_status", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "expected_status=None"}, {"name": "msg", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg=None"}, {"name": "kwargs", "types": [], "default": null, "kind": "VAR_NAMED", "required": false, "repr": "**kwargs"}], "doc": "<p>Sends a HEAD request on a previously created HTTP Session.</p>\n<p>Session will be identified using the <code>alias</code> name. The endpoint used to retrieve the HTTP headers is the <code>url</code>.</p>\n<p><code>allow_redirects</code> parameter is not provided, it will be set to <span class=\"name\">False</span> (as opposed to the default behavior).</p>\n<p>By default this keyword fails if a status code with error values is returned in the response, this behavior can be modified using the <code>expected_status</code> and <code>msg</code> parameters, read more about it in <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a> keyword documentation. In order to disable this implicit assert mechanism you can pass as <code>expected_status</code> the values <code>any</code> or <code>anything</code>.</p>\n<p>Other optional requests arguments can be passed using <code>**kwargs</code> see the <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a> keyword for the complete list.</p>", "shortdoc": "Sends a HEAD request on a previously created HTTP Session.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsOnSessionKeywords.py", "lineno": 160}, {"name": "Head Request", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "uri", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "uri"}, {"name": "headers", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers=None"}, {"name": "allow_redirects", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "allow_redirects=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}], "doc": "<p><b>DEPRECATED</b> Please use <a href=\"#HEAD%20On%20Session\" class=\"name\">HEAD On Session</a> instead.</p>\n<p>Send a HEAD request on the session object found using the given <span class=\"name\">alias</span></p>\n<p><code>alias</code> that will be used to identify the Session object in the cache</p>\n<p><code>uri</code> to send the HEAD request to</p>\n<p><code>allow_redirects</code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.</p>\n<p><code>headers</code> a dictionary of headers to use with the request</p>\n<p><code>timeout</code> connection timeout</p>", "shortdoc": "*DEPRECATED* Please use `HEAD On Session` instead.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/DeprecatedKeywords.py", "lineno": 308}, {"name": "OPTIONS On Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "expected_status", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "expected_status=None"}, {"name": "msg", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg=None"}, {"name": "kwargs", "types": [], "default": null, "kind": "VAR_NAMED", "required": false, "repr": "**kwargs"}], "doc": "<p>Sends a OPTIONS request on a previously created HTTP Session.</p>\n<p>Session will be identified using the <code>alias</code> name. The endpoint used to retrieve the resource is the <code>url</code>.</p>\n<p>By default this keyword fails if a status code with error values is returned in the response, this behavior can be modified using the <code>expected_status</code> and <code>msg</code> parameters, read more about it in <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a> keyword documentation. In order to disable this implicit assert mechanism you can pass as <code>expected_status</code> the values <code>any</code> or <code>anything</code>.</p>\n<p>Other optional requests arguments can be passed using <code>**kwargs</code> see the <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a> keyword for the complete list.</p>", "shortdoc": "Sends a OPTIONS request on a previously created HTTP Session.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsOnSessionKeywords.py", "lineno": 186}, {"name": "Options Request", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "uri", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "uri"}, {"name": "headers", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers=None"}, {"name": "allow_redirects", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "allow_redirects=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}], "doc": "<p><b>DEPRECATED</b> Please use <a href=\"#OPTIONS%20On%20Session\" class=\"name\">OPTIONS On Session</a> instead.</p>\n<p>Send an OPTIONS request on the session object found using the given <span class=\"name\">alias</span></p>\n<p><code>alias</code> that will be used to identify the Session object in the cache</p>\n<p><code>uri</code> to send the OPTIONS request to</p>\n<p><code>allow_redirects</code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.</p>\n<p><code>headers</code> a dictionary of headers to use with the request</p>\n<p><code>timeout</code> connection timeout</p>", "shortdoc": "*DEPRECATED* Please use `OPTIONS On Session` instead.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/DeprecatedKeywords.py", "lineno": 344}, {"name": "PATCH On Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "data", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "data=None"}, {"name": "json", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "json=None"}, {"name": "expected_status", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "expected_status=None"}, {"name": "msg", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg=None"}, {"name": "kwargs", "types": [], "default": null, "kind": "VAR_NAMED", "required": false, "repr": "**kwargs"}], "doc": "<p>Sends a PATCH request on a previously created HTTP Session.</p>\n<p>Session will be identified using the <code>alias</code> name. The endpoint used to send the request is the <code>url</code> parameter, while its body can be passed using <code>data</code> or <code>json</code> parameters.</p>\n<p><code>data</code> can be a dictionary, list of tuples, bytes, or file-like object. If you want to pass a json body pass a dictionary as <code>json</code> parameter.</p>\n<p>By default this keyword fails if a status code with error values is returned in the response, this behavior can be modified using the <code>expected_status</code> and <code>msg</code> parameters, read more about it in <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a> keyword documentation. In order to disable this implicit assert mechanism you can pass as <code>expected_status</code> the values <code>any</code> or <code>anything</code>.</p>\n<p>Other optional requests arguments can be passed using <code>**kwargs</code> see the <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a> keyword for the complete list.</p>", "shortdoc": "Sends a PATCH request on a previously created HTTP Session.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsOnSessionKeywords.py", "lineno": 81}, {"name": "Patch Request", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "uri", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "uri"}, {"name": "data", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "data=None"}, {"name": "json", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "json=None"}, {"name": "params", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "params=None"}, {"name": "headers", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers=None"}, {"name": "files", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "files=None"}, {"name": "allow_redirects", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "allow_redirects=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}], "doc": "<p><b>DEPRECATED</b> Please use <a href=\"#PATCH%20On%20Session\" class=\"name\">PATCH On Session</a> instead.</p>\n<p>Send a PATCH request on the session object found using the given <span class=\"name\">alias</span></p>\n<p><code>alias</code> that will be used to identify the Session object in the cache</p>\n<p><code>uri</code> to send the PATCH request to</p>\n<p><code>data</code> a dictionary of key-value pairs that will be urlencoded and sent as PATCH data or binary data that is sent as the raw body content or file descriptor retrieved by Get File For Streaming Upload</p>\n<p><code>json</code> a value that will be json encoded and sent as PATCH data if data is not specified</p>\n<p><code>headers</code> a dictionary of headers to use with the request</p>\n<p><code>files</code> a dictionary of file names containing file data to PATCH to the server</p>\n<p><code>allow_redirects</code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.</p>\n<p><code>params</code> url parameters to append to the uri</p>\n<p><code>timeout</code> connection timeout</p>", "shortdoc": "*DEPRECATED* Please use `PATCH On Session` instead.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/DeprecatedKeywords.py", "lineno": 147}, {"name": "POST On Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "data", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "data=None"}, {"name": "json", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "json=None"}, {"name": "expected_status", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "expected_status=None"}, {"name": "msg", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg=None"}, {"name": "kwargs", "types": [], "default": null, "kind": "VAR_NAMED", "required": false, "repr": "**kwargs"}], "doc": "<p>Sends a POST request on a previously created HTTP Session.</p>\n<p>Session will be identified using the <code>alias</code> name. The endpoint used to send the request is the <code>url</code> parameter, while its body can be passed using <code>data</code> or <code>json</code> parameters.</p>\n<p><code>data</code> can be a dictionary, list of tuples, bytes, or file-like object. If you want to pass a json body pass a dictionary as <code>json</code> parameter.</p>\n<p>By default this keyword fails if a status code with error values is returned in the response, this behavior can be modified using the <code>expected_status</code> and <code>msg</code> parameters, read more about it in <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a> keyword documentation. In order to disable this implicit assert mechanism you can pass as <code>expected_status</code> the values <code>any</code> or <code>anything</code>.</p>\n<p>Other optional requests arguments can be passed using <code>**kwargs</code> see the <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a> keyword for the complete list.</p>", "shortdoc": "Sends a POST request on a previously created HTTP Session.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsOnSessionKeywords.py", "lineno": 53}, {"name": "Post Request", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "uri", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "uri"}, {"name": "data", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "data=None"}, {"name": "json", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "json=None"}, {"name": "params", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "params=None"}, {"name": "headers", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers=None"}, {"name": "files", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "files=None"}, {"name": "allow_redirects", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "allow_redirects=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}], "doc": "<p><b>DEPRECATED</b> Please use <a href=\"#POST%20On%20Session\" class=\"name\">POST On Session</a> instead.</p>\n<p>Send a POST request on the session object found using the given <span class=\"name\">alias</span></p>\n<p><code>alias</code> that will be used to identify the Session object in the cache</p>\n<p><code>uri</code> to send the POST request to</p>\n<p><code>data</code> a dictionary of key-value pairs that will be urlencoded and sent as POST data or binary data that is sent as the raw body content or passed as such for multipart form data if <code>files</code> is also defined or file descriptor retrieved by Get File For Streaming Upload</p>\n<p><code>json</code> a value that will be json encoded and sent as POST data if files or data is not specified</p>\n<p><code>params</code> url parameters to append to the uri</p>\n<p><code>headers</code> a dictionary of headers to use with the request</p>\n<p><code>files</code> a dictionary of file names containing file data to POST to the server</p>\n<p><code>allow_redirects</code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.</p>\n<p><code>timeout</code> connection timeout</p>", "shortdoc": "*DEPRECATED* Please use `POST On Session` instead.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/DeprecatedKeywords.py", "lineno": 88}, {"name": "PUT On Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "url", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "url"}, {"name": "data", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "data=None"}, {"name": "json", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "json=None"}, {"name": "expected_status", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "expected_status=None"}, {"name": "msg", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg=None"}, {"name": "kwargs", "types": [], "default": null, "kind": "VAR_NAMED", "required": false, "repr": "**kwargs"}], "doc": "<p>Sends a PUT request on a previously created HTTP Session.</p>\n<p>Session will be identified using the <code>alias</code> name. The endpoint used to send the request is the <code>url</code> parameter, while its body can be passed using <code>data</code> or <code>json</code> parameters.</p>\n<p><code>data</code> can be a dictionary, list of tuples, bytes, or file-like object. If you want to pass a json body pass a dictionary as <code>json</code> parameter.</p>\n<p>By default this keyword fails if a status code with error values is returned in the response, this behavior can be modified using the <code>expected_status</code> and <code>msg</code> parameters, read more about it in <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a> keyword documentation. In order to disable this implicit assert mechanism you can pass as <code>expected_status</code> the values <code>any</code> or <code>anything</code>.</p>\n<p>Other optional requests arguments can be passed using <code>**kwargs</code> see the <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a> keyword for the complete list.</p>", "shortdoc": "Sends a PUT request on a previously created HTTP Session.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsOnSessionKeywords.py", "lineno": 109}, {"name": "Put Request", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "uri", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "uri"}, {"name": "data", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "data=None"}, {"name": "json", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "json=None"}, {"name": "params", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "params=None"}, {"name": "files", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "files=None"}, {"name": "headers", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers=None"}, {"name": "allow_redirects", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "allow_redirects=None"}, {"name": "timeout", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "timeout=None"}], "doc": "<p><b>DEPRECATED</b> Please use <a href=\"#PUT%20On%20Session\" class=\"name\">PUT On Session</a> instead.</p>\n<p>Send a PUT request on the session object found using the given <span class=\"name\">alias</span></p>\n<p><code>alias</code> that will be used to identify the Session object in the cache</p>\n<p><code>uri</code> to send the PUT request to</p>\n<p><code>data</code> a dictionary of key-value pairs that will be urlencoded and sent as PUT data or binary data that is sent as the raw body content or file descriptor retrieved by Get File For Streaming Upload</p>\n<p><code>json</code> a value that will be json encoded and sent as PUT data if data is not specified</p>\n<p><code>headers</code> a dictionary of headers to use with the request</p>\n<p><code>allow_redirects</code> Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.</p>\n<p><code>params</code> url parameters to append to the uri</p>\n<p><code>timeout</code> connection timeout</p>", "shortdoc": "*DEPRECATED* Please use `PUT On Session` instead.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/DeprecatedKeywords.py", "lineno": 205}, {"name": "Request Should Be Successful", "args": [{"name": "response", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "response"}], "doc": "<p>Fails if response status code is a client or server error (4xx, 5xx).</p>\n<p><code>response</code> is the output of other requests keywords like <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a>.</p>\n<p>In case of failure an HTTPError will be automatically raised. A custom failure message <code>msg</code> can be added like in built-in keywords.</p>\n<p>For a more versatile assert keyword see <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a>.</p>", "shortdoc": "Fails if response status code is a client or server error (4xx, 5xx).", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsKeywords.py", "lineno": 41}, {"name": "Session Exists", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}], "doc": "<p>Return True if the session has been already created</p>\n<p><code>alias</code> that has been used to identify the Session object in the cache</p>", "shortdoc": "Return True if the session has been already created", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/SessionKeywords.py", "lineno": 528}, {"name": "Status Should Be", "args": [{"name": "expected_status", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "expected_status"}, {"name": "response", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "response"}, {"name": "msg", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg=None"}], "doc": "<p>Fails if response status code is different than the expected.</p>\n<p><code>expected_status</code> could be the code number as an integer or as string. But it could also be a named status code like 'ok', 'created', 'accepted' or 'bad request', 'not found' etc.</p>\n<p><code>response</code> is the output of other requests keywords like <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a>.</p>\n<p>In case of failure an HTTPError will be automatically raised. A custom failure message <code>msg</code> can be added like in built-in keywords.</p>\n<p><span class=\"name\">* On Session</span> keywords (like <a href=\"#GET%20On%20Session\" class=\"name\">GET On Session</a>) already have an implicit assert mechanism, that by default, verifies the response status code. <a href=\"#Status%20Should%20Be\" class=\"name\">Status Should Be</a> keyword can be useful to do an explicit assert in case of <span class=\"name\">* On Session</span> keyword with <code>expected_status=anything</code> to disable implicit assert.</p>", "shortdoc": "Fails if response status code is different than the expected.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/RequestsKeywords.py", "lineno": 18}, {"name": "To Json", "args": [{"name": "content", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "content"}, {"name": "pretty_print", "types": [], "default": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "pretty_print=False"}], "doc": "<p><b>DEPRECATED</b> Please use ${resp.json()} instead. Have a look at the improved HTML output as pretty printing replacement.</p>\n<p>Convert a string to a JSON object</p>\n<p><code>content</code> String content to convert into JSON</p>\n<p><code>pretty_print</code> If defined, will output JSON is pretty print format</p>", "shortdoc": "*DEPRECATED* Please use ${resp.json()} instead. Have a look at the improved HTML output as pretty printing replacement.", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/DeprecatedKeywords.py", "lineno": 15}, {"name": "Update Session", "args": [{"name": "alias", "types": [], "default": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias"}, {"name": "headers", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "headers=None"}, {"name": "cookies", "types": [], "default": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "cookies=None"}], "doc": "<p>Update Session Headers: update a HTTP Session Headers</p>\n<p><code>alias</code> Robot Framework alias to identify the session</p>\n<p><code>headers</code> Dictionary of headers merge into session</p>", "shortdoc": "Update Session Headers: update a HTTP Session Headers", "tags": [], "source": "/home/luca/src/robotframework/robotframework-requests/src/RequestsLibrary/SessionKeywords.py", "lineno": 548}], "dataTypes": {"enums": [], "typedDicts": []}}
 </script>
 <title></title>
 </head>
@@ -557,7 +1106,7 @@
   <h1>Opening library documentation failed</h1>
   <ul>
     <li>Verify that you have <b>JavaScript enabled</b> in your browser.</li>
-    <li>Make sure you are using a <b>modern enough browser</b>. If using Internet Explorer, version 8 or newer is required.</li>
+    <li>Make sure you are using a <b>modern enough browser</b>. If using Internet Explorer, version 11 is required.</li>
     <li>Check are there messages in your browser's <b>JavaScript error log</b>. Please report the problem if you suspect you have encountered a bug.</li>
   </ul>
 </div>
@@ -565,26 +1114,72 @@ <h1>Opening library documentation failed</h1>
 <script type="text/javascript">
     // Not using jQuery here for speed and to support ancient browsers.
     document.getElementById('javascript-disabled').style.display = 'none';
+    window.addEventListener("hashchange", function() {
+      document.getElementsByClassName("hamburger-menu")[0].checked = false;
+    }, false);
 </script>
 
 <script type="text/javascript">
+
+    function linkArgs(container, typeNames) {
+      container.forEach(function(k) {
+          k.args.forEach(function (arg) {
+            arg.linked = arg.types.filter(function(value) {return typeNames.indexOf(value) > -1});
+          })
+        }
+      );
+    }
+
     $(document).ready(function() {
         parseTemplates();
         document.title = libdoc.name;
+        storage.init('libdoc');
+        libdoc.dataTypes = libdoc.dataTypes.enums.concat(libdoc.dataTypes.typedDicts);
+        libdoc.dataTypes.sort(compare)
+        const typeNames = libdoc.dataTypes.map(function (d) {return d.name});
+        linkArgs(libdoc.inits, typeNames);
+        linkArgs(libdoc.keywords, typeNames);
         renderTemplate('base', libdoc, $('body'));
         if (libdoc.inits.length) {
             renderTemplate('importing', libdoc);
         }
         renderTemplate('shortcuts', libdoc);
-        if (libdoc.contains_tags) {
-            renderTemplate('tags', libdoc);
-        }
+        renderTemplate('keyword-shortcuts', libdoc);
         renderTemplate('keywords', libdoc);
+        renderTemplate('data-types', libdoc);
         renderTemplate('footer', libdoc);
+        const params = util.parseQueryString(window.location.search.slice(1));
+        let selectedTag = "";
+        if ("tag" in params) {
+            selectedTag = params["tag"];
+            tagSearch(selectedTag, window.location.hash);
+        }
+        if (libdoc.tags.length) {
+          libdoc.selectedTag = selectedTag;
+          renderTemplate('tags-shortcuts', libdoc);
+        }
         scrollToHash();
-        $(document).bind('keydown', handleKeydown);
+        setTimeout(function() {
+          document.getElementById("keyword-statistics-header").innerText = '' + libdoc.keywords.length;
+          if (libdoc.dataTypes.length) {
+            document.getElementById("type-statistics-header").innerText = '' + libdoc.dataTypes.length;
+          }
+          if (storage.get('keyword-wall') === 'open') {
+            openKeywordWall();
+          }
+      }, 0);
     });
 
+     function compare( a, b ) {
+      if ( a.name < b.name ){
+        return -1;
+      }
+      if ( a.name > b.name ){
+        return 1;
+      }
+      return 0;
+    }
+
     function parseTemplates() {
         $('script[type="text/x-jquery-tmpl"]').map(function (idx, elem) {
             $.template(elem.id, elem.text);
@@ -592,23 +1187,14 @@ <h1>Opening library documentation failed</h1>
     }
 
     function renderTemplate(name, arguments, container) {
-        if (!container) {
-            container = $('#' + name + '-container');
-            container.empty();
-        }
-        if (!arguments.search) {
-            arguments.search = false;
-        }
-        $.tmpl(name + '-template', arguments).appendTo(container);
-    }
-
-    function handleKeydown(event) {
-        event = event || window.event;
-        var keyCode = event.keyCode || event.which;
-        if (keyCode === 27)  // esc
-            setTimeout(closeSearch, 0);
-        if (keyCode === 83 && $('#search').is(':hidden'))  // s
-            setTimeout(openSearch, 0);
+      if (!container) {
+          container = $('#' + name + '-container');
+          container.empty();
+      }
+      if (!arguments.search) {
+          arguments.search = false;
+      }
+      $.tmpl(name + '-template', arguments).appendTo(container);
     }
 
     function scrollToHash() {
@@ -619,85 +1205,71 @@ <h1>Opening library documentation failed</h1>
         }
     }
 
-    function tagSearch(tag) {
-        var include = {tags: true, tagsExact: true};
-        markMatches(tag, include);
-        highlightMatches(tag, include);
-        $('#keywords-container').find('.kw-row').addClass('hide-unmatched');
+    function tagSearch(tag, hash) {
+      document.getElementsByClassName('search-input')[0].value = '';
+      const include = {tags: true, tagsExact: true};
+      const url = window.location.pathname + "?tag=" + tag + (hash || "");
+      markMatches(tag, include);
+      highlightMatches(tag, include);
+      history.replaceState && history.replaceState(null, '', url);
+      document.getElementById('keyword-shortcuts-container').scrollTop = 0;
     }
 
-    function doSearch() {
-        var string = $('#search-string').val();
-        var include = getIncludesAndDisableIfOnlyOneLeft();
-        if (string) {
-            markMatches(string, include);
-            highlightMatches(string, include);
-            setMatchVisibility();
-        } else {
-            resetKeywords();
-        }
+    function clearTagSearch() {
+      document.getElementsByClassName('search-input')[0].value = '';
+      history.replaceState && history.replaceState(null, '', window.location.pathname);
+      resetKeywords();
     }
 
-    function getIncludesAndDisableIfOnlyOneLeft() {
-        var name = $('#include-name');
-        var args = $('#include-args');
-        var doc = $('#include-doc');
-        var tags = $('#include-tags');
-        var include = {name: name.prop('checked'),
-                       args: args.prop('checked'),
-                       doc: doc.prop('checked'),
-                       tags: !!tags.prop('checked')};
-        if ((!include.name) && (!include.args) && (!include.doc)) {
-            tags.prop('disabled', true);
-        } else if ((!include.name) && (!include.args) && (!include.tags)) {
-            doc.prop('disabled', true);
-        } else if ((!include.name) && (!include.doc) && (!include.tags)) {
-            args.prop('disabled', true);
-        } else if ((!include.args) && (!include.doc) && (!include.tags)) {
-            name.prop('disabled', true);
-        } else {
-            name.prop('disabled', false);
-            args.prop('disabled', false);
-            doc.prop('disabled', false);
-            tags.prop('disabled', false);
-        }
-        return include;
+    function closeMenu() {
+      document.getElementById('hamburger-menu-input').checked = false;
     }
 
     function markMatches(pattern, include) {
-        pattern = util.regexpEscape(pattern);
+        let patternRegexp = util.regexpEscape(pattern);
         if (include.tagsExact) {
-            pattern = '^' + pattern + '$';
+            patternRegexp = '^' + patternRegexp + '$';
         }
-        var regexp = new RegExp(pattern, 'i');
-        var test = regexp.test.bind(regexp);
-        var result = {contains_tags: libdoc.contains_tags};
-        var matchCount = 0;
+        let regexp = new RegExp(patternRegexp, 'i');
+        let test = regexp.test.bind(regexp);
+        let result = {};
+        let keywordMatchCount = 0;
         result.keywords = util.map(libdoc.keywords, function (kw) {
             kw = $.extend({}, kw);
-            kw.matched = (include.name && test(kw.name) ||
-                          include.args && test(kw.args) ||
-                          include.doc && test($(kw.doc).text()) ||
-                          include.tags && util.any(util.map(kw.tags, test)));
-            if (kw.matched)
-                matchCount++;
-            return kw
+            kw.hidden =  !(include.name && test(kw.name)) &&
+                         !(include.args && test(kw.args)) &&
+                          !(include.doc && test($(kw.doc).text())) &&
+                          !(include.tags && util.any(util.map(kw.tags, test)));
+            if (!kw.hidden)
+                keywordMatchCount++;
+            return kw;
         });
-        renderTemplate('shortcuts', result);
+        let typeMatchCount = 0;
+        result.dataTypes = util.map(libdoc.dataTypes, function (dataType) {
+            dataType = $.extend({}, dataType);
+            dataType.hidden =  !(include.name && test(dataType.name));
+            if (!dataType.hidden)
+                typeMatchCount++;
+            return dataType;
+        });
+        renderTemplate('keyword-shortcuts', result);
         renderTemplate('keywords', result);
-        if (libdoc.contains_tags) {
-            renderTemplate('tags', libdoc);
+        renderTemplate('data-types', result);
+        if (libdoc.tags.length) {
+          libdoc.selectedTag = include.tagsExact ? pattern : "";
+          renderTemplate('tags-shortcuts', libdoc);
         }
-        var ending = matchCount != 1 ? 's.' : '.';
-        $('#match-count').show().text(matchCount + ' matched keyword' + ending);
-        $('#altogether-count').hide();
-        if (matchCount == 0)
+        document.getElementById("keyword-statistics-header").innerText = keywordMatchCount + ' / ' + result.keywords.length;
+        if (libdoc.dataTypes.length) {
+          document.getElementById("type-statistics-header").innerText = typeMatchCount + ' / ' + result.dataTypes.length;
+        }
+        if (keywordMatchCount === 0)
             $('#keywords-container').find('table').empty();
     }
 
     function highlightMatches(string, include) {
-        var shortcuts = $('#shortcuts-container').find('.match');
-        var keywords = $('#keywords-container').find('.match');
+        const shortcuts = $('#shortcuts-container').find('.match');
+        const keywords = $('#keywords-container').find('.match');
         if (include.name) {
             shortcuts.highlight(string);
             keywords.find('.kw').highlight(string);
@@ -710,51 +1282,77 @@ <h1>Opening library documentation failed</h1>
         }
         if (include.tags) {
             var matches = keywords.find('.tags').find('a').add(
-                    $('#tags-container').find('a'));
+                    $('#tags-shortcuts-container').find('a'));
             if (include.tagsExact) {
                 matches = matches.filter(function (index, tag) {
-                    return $(tag).text().toUpperCase() == string.toUpperCase();
+                    return $(tag).text().toUpperCase() === string.toUpperCase();
                 });
             }
             matches.highlight(string);
         }
     }
 
-    function openSearch() {
-        $('#search').show();
-        $('#open-search').hide();
-        $('#search-string').focus().select();
-        $(document).scrollTop($("#Shortcuts").offset().top);
+    function clearSearch() {
+      document.getElementsByClassName('search-input')[0].value = '';
+      const tagsSelect = document.getElementById('tags-shortcuts-container');
+      if (tagsSelect) {
+        tagsSelect.selectedIndex = 0;
+      }
+      resetKeywords();
+    }
+
+    function searching() {
+      const value = document.getElementsByClassName('search-input')[0].value;
+      const include = {name: true,
+                       args: true,
+                       doc: true,
+                       tags: true};
+      if (value) {
+          markMatches(value, include);
+          highlightMatches(value, include);
+          document.getElementById('keyword-shortcuts-container').scrollTop = 0;
+      } else {
+          resetKeywords();
+      }
     }
 
-    function closeSearch() {
-        $('#search').hide();
-        $('#open-search').show();
+    function toggleShortcuts() {
+      const shortcuts = document.getElementsByClassName("shortcuts")[0];
+      if (shortcuts.classList.contains("keyword-wall")) {
+        closeKeywordWall();
+      } else {
+        openKeywordWall();
+      }
     }
 
-    function resetSearch() {
-        $('#search-string').val('');
-        $('#include-name').prop('checked', true);
-        $('#include-args').prop('checked', true);
-        $('#include-doc').prop('checked', true);
-        $('#hide-unmatched').prop('checked', false);
-        resetKeywords();
+    function openKeywordWall() {
+      const shortcuts = document.getElementsByClassName("shortcuts")[0];
+      shortcuts.classList.add("keyword-wall");
+      storage.set("keyword-wall", 'open');
+      const button = document.getElementById("toggle-keyword-shortcuts")
+      button.innerText = '-';
+    }
+
+    function closeKeywordWall() {
+      const shortcuts = document.getElementsByClassName("shortcuts")[0];
+      shortcuts.classList.remove("keyword-wall");
+      storage.set("keyword-wall", 'close');
+      const button = document.getElementById("toggle-keyword-shortcuts")
+      button.innerText = '+';
     }
 
     function resetKeywords() {
-        renderTemplate('shortcuts', libdoc);
+        renderTemplate('keyword-shortcuts', libdoc);
         renderTemplate('keywords', libdoc);
-        if (libdoc.contains_tags) {
+        renderTemplate('data-types', libdoc);
+        if (libdoc.tags.length) {
             renderTemplate('tags', libdoc);
         }
-        $('#match-count').hide();
-        $('#altogether-count').show();
-    }
-
-    function setMatchVisibility() {
-        var kws = $('#keywords-container').find('.kw-row');
-        var hide = $('#hide-unmatched').prop('checked');
-        kws.toggleClass('hide-unmatched', hide);
+        document.getElementById("keyword-statistics-header").innerText = ''+libdoc.keywords.length;
+        if (libdoc.dataTypes.length) {
+          document.getElementById("type-statistics-header").innerText = '' + libdoc.dataTypes.length;
+        }
+        history.replaceState && history.replaceState(null, '', location.pathname);
     }
 
     // http://stackoverflow.com/a/18484799
@@ -769,141 +1367,316 @@ <h1>Opening library documentation failed</h1>
 </script>
 
 <script type="text/x-jquery-tmpl" id="base-template">
-    <h1>${name}</h1>
-    <table class="metadata">
-        {{if version}}<tr><th>Library version:</th><td>${version}</td></tr>{{/if}}
-        {{if scope}}<tr><th>Library scope:</th><td>${scope}</td></tr>{{/if}}
-        <tr><th>Named arguments:</th><td>{{if named_args}}supported{{else}}not supported{{/if}}</td></tr>
-    </table>
-    <div id="introduction-container">
-        <h2 id="Introduction">Introduction</h2>
-        <div class="doc">{{html doc}}</div>
+  <div class="base-container">
+    <input id="hamburger-menu-input" class="hamburger-menu" type="checkbox" />
+    <span class="hamburger-menu hamburger-menu-1"></span>
+    <span class="hamburger-menu hamburger-menu-2"></span>
+    <span class="hamburger-menu hamburger-menu-3"></span>
+    <div class="libdoc-overview"><div id="shortcuts-container"></div></div>
+    <div class="libdoc-details">
+      <table class="metadata">
+          {{if version}}<tr><th>Library version:</th><td>${version}</td></tr>{{/if}}
+          {{if scope}}<tr><th>Library scope:</th><td>${scope}</td></tr>{{/if}}
+          <tr><th>Named arguments:</th><td>{{if named_args}}supported{{else}}not supported{{/if}}</td></tr>
+      </table>
+      <div id="introduction-container">
+          <h2 id="Introduction">Introduction</h2>
+          <div class="doc">{{html doc}}</div>
+      </div>
+      <div id="importing-container"></div>
+      <div id="keywords-container"></div>
+      <div id="data-types-container"></div>
+      <div id="footer-container"></div>
     </div>
-    <div id="importing-container"></div>
-    <div id="shortcuts-container"></div>
-    <div id="tags-container"></div>
-    <div id="keywords-container"></div>
-    <div id="footer-container"></div>
-    <form id="search" action="javascript:void(0)">
-        <fieldset>
-            <legend id="search-title">Search keywords</legend>
-            <input type="text" id="search-string" onkeyup="delay(doSearch, 500)">
-            <fieldset>
-                <legend>Search from</legend>
-                <input type="checkbox" id="include-name" onclick="doSearch()" checked>
-                <label for="include-name">Name</label>
-                <input type="checkbox" id="include-args" onclick="doSearch()" checked>
-                <label for="include-args">Arguments</label>
-                <input type="checkbox" id="include-doc" onclick="doSearch()" checked>
-                <label for="include-doc">Documentation</label>
-                {{if libdoc.contains_tags}}
-                <input type="checkbox" id="include-tags" onclick="doSearch()" checked>
-                <label for="include-tags">Tags</label>
-                {{/if}}
-            </fieldset>
-            <input type="checkbox" id="hide-unmatched" onclick="setMatchVisibility()" checked>
-            <label for="hide-unmatched">Hide unmatched keywords</label>
-            <div id="search-buttons">
-                <input type="button" value="Reset" onclick="resetSearch()"
-                       title="Reset search">
-                <input type="button" value="Close" onclick="closeSearch()"
-                       title="Close search (shortcut: <Esc>)">
-            </div>
-        </fieldset>
-    </form>
-    <div id="open-search" onclick="openSearch()" title="Search keywords (shortcut: s)"></div>
+    <a class="libdoc-title" href="#library-documentation-top">
+          <h1>${name}</h1>
+          <svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   viewBox="0 0 202.4325 202.34125"
+   height="42"
+   width="42"
+   xml:space="preserve"
+   version="1.1"><metadata
+     id="metadata8"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+     id="defs6"><clipPath
+       id="clipPath16"
+       clipPathUnits="userSpaceOnUse"><path
+         id="path18"
+         d="m 0,161.873 161.946,0 L 161.946,0 0,0 0,161.873 Z" /></clipPath></defs><g
+     transform="matrix(1.25,0,0,-1.25,0,202.34125)"
+     id="g10"><g
+       id="g12"><g
+         clip-path="url(#clipPath16)"
+         id="g14"><g
+           transform="translate(52.4477,88.1268)"
+           id="g20"><path
+             id="robot-svg-path"
+             d="m 0,0 c 0,7.6 6.179,13.779 13.77,13.779 7.6,0 13.779,-6.179 13.779,-13.779 0,-2.769 -2.238,-5.007 -4.998,-5.007 -2.761,0 -4.999,2.238 -4.999,5.007 0,2.078 -1.695,3.765 -3.782,3.765 C 11.693,3.765 9.997,2.078 9.997,0 9.997,-2.769 7.76,-5.007 4.999,-5.007 2.238,-5.007 0,-2.769 0,0 m 57.05,-23.153 c 0,-2.771 -2.237,-5.007 -4.998,-5.007 l -46.378,0 c -2.761,0 -4.999,2.236 -4.999,5.007 0,2.769 2.238,5.007 4.999,5.007 l 46.378,0 c 2.761,0 4.998,-2.238 4.998,-5.007 M 35.379,-2.805 c -1.545,2.291 -0.941,5.398 1.35,6.943 l 11.594,7.83 c 2.273,1.58 5.398,0.941 6.943,-1.332 1.545,-2.29 0.941,-5.398 -1.35,-6.943 l -11.594,-7.83 c -0.852,-0.586 -1.829,-0.87 -2.788,-0.87 -1.607,0 -3.187,0.781 -4.155,2.202 m 31.748,-30.786 c 0,-0.945 -0.376,-1.852 -1.045,-2.522 l -8.617,-8.617 c -0.669,-0.668 -1.576,-1.045 -2.523,-1.045 l -52.833,0 c -0.947,0 -1.854,0.377 -2.523,1.045 l -8.617,8.617 c -0.669,0.67 -1.045,1.577 -1.045,2.522 l 0,52.799 c 0,0.947 0.376,1.854 1.045,2.522 l 8.617,8.619 c 0.669,0.668 1.576,1.044 2.523,1.044 l 52.833,0 c 0.947,0 1.854,-0.376 2.523,-1.044 l 8.617,-8.619 c 0.669,-0.668 1.045,-1.575 1.045,-2.522 l 0,-52.799 z m 7.334,61.086 -11.25,11.25 c -1.705,1.705 -4.018,2.663 -6.428,2.663 l -56.523,0 c -2.412,0 -4.725,-0.959 -6.43,-2.665 L -17.412,27.494 c -1.704,-1.705 -2.661,-4.016 -2.661,-6.427 l 0,-56.515 c 0,-2.411 0.958,-4.725 2.663,-6.428 l 11.25,-11.25 c 1.705,-1.705 4.017,-2.662 6.428,-2.662 l 56.515,0 c 2.41,0 4.723,0.957 6.428,2.662 l 11.25,11.25 c 1.705,1.703 2.663,4.017 2.663,6.428 l 0,56.514 c 0,2.412 -0.958,4.724 -2.663,6.429" /></g></g></g></g></svg>
+    </a>
+  </div>
 </script>
 
 <script type="text/x-jquery-tmpl" id="importing-template">
     <h2 id="Importing">Importing</h2>
-    <table border="1" class="keywords">
-        <tr>
-            <th class="args">Arguments</th>
-            <th class="doc">Documentation</th>
-        </tr>
+    <div class="keywords">
         {{each inits}}
-        <tr class="kw-row">
-            <td class="args">
-            {{each args}}
-              <span>${$value}</span>{{if $index < args.length-1}}, {{/if}}
-            {{/each}}
-            </td>
-            <td class="doc">{{html $value.doc}}</td>
-        </tr>
+        <div class="kw-row">
+          <div class="kw-overview">
+          {{if args.length}}
+              <div class="args">
+                <h4>Arguments</h4>
+                <div class="arguments-list-container">
+                  <div class="arguments-list">
+                  {{each args}}
+                    <span class="arg-name {{if $value.required}}arg-required{{else}}arg-optional{{/if}}" title="Argument name">{{if $value.kind === 'VAR_POSITIONAL'}}*{{/if}}{{if $value.kind === 'VAR_NAMED'}}**{{/if}}${$value.name}</span>
+
+                    {{if $value.default !== null}}
+                      <div class="arg-default-container">
+                        <span class="arg-default-eq">=</span>
+                        <span class="arg-default-value" title="Argument default value">${$value.default}</span>
+                      </div>
+                    {{/if}}
+
+                    {{if $value.types.length}}
+                      <span class="arg-type" title="Argument '${$value.name}' will be converter to type ${$value.types}">
+                        ${( $data.linked = $value.linked ),''}
+                        {{each $value.types}}&lt;{{if $data.linked.indexOf($value) > -1}}<a class="type" href="#${$value}">${$value}</a>{{else}}<span class="type">${$value}</span>{{/if}}&gt;{{/each}}
+                      </span>
+                    {{/if}}
+                  {{/each}}
+                  </div>
+                </div>
+              </div>
+          {{/if}}
+          {{if $value.doc}}
+            <div class="kw-docs">
+              <h4>Documentation</h4>
+              <div class="kwdoc doc">{{html $value.doc}}</div>
+            </div>
+          {{/if}}
+        </div>
         {{/each}}
-    </table>
+    </div>
 </script>
 
 <script type="text/x-jquery-tmpl" id="shortcuts-template">
-    <h2 id="Shortcuts">Shortcuts</h2>
-    <div class='shortcuts'>
-        {{each keywords}}
-        <a href="#${encodeURIComponent($value.name)}"
-           class="{{if $value.matched === false}}no-{{/if}}match"
-           title="${$value.shortdoc}">${$value.name}</a>
-        {{if $index < keywords.length-1}} &middot; {{/if}}
-        {{/each}}
+    <div class="keywords-overview">
+      <div class="keyword-search-box">
+        <input placeholder="Search" type="text" class="search-input" onkeyup="delay(searching, 500)"/>
+        <button class="clear-search" onclick="clearSearch()">&#10005;</button>
+      </div>
+      {{if tags.length}}
+      <select id="tags-shortcuts-container" onchange="location = this.value;">
+      </select>
+      {{/if}}
+      <div class="keywords-overview-header-row">
+      <h4>Keywords (<span id="keyword-statistics-header"></span>)
+      {{if dataTypes.length}}& <span class="data-type">Types</span> (<span id="type-statistics-header"></span>){{/if}}
+      </h4>
+      <button id="toggle-keyword-shortcuts" onclick="toggleShortcuts()">+</button>
+      </div>
+      <ul class="shortcuts" id="keyword-shortcuts-container">
+      </ul>
     </div>
 </script>
 
-<script type="text/x-jquery-tmpl" id="tags-template">
-    <h2 id="Tags">Tags</h2>
-    <div class='shortcuts'>
-        {{each all_tags}}
-        <a href="javascript:tagSearch('${$value}')"
-           title="Show tests with this tag">${$value}</a> &middot;
-        {{/each}}
-        <a href="javascript:resetKeywords()" class="normal-first-letter"
-           title="Show all tests">[Reset]</a>
-    </div>
+<script type="text/x-jquery-tmpl" id="keyword-shortcuts-template">
+    {{each keywords}}
+    {{if !$value.hidden}}
+    <li>
+    <a href="#${encodeURIComponent($value.name)}"
+       onclick="closeMenu()"
+       class="match"
+       title="${$value.shortdoc}">${$value.name}</a>
+    </li>
+    {{/if}}
+    {{/each}}
+    {{each dataTypes}}
+    {{if !$value.hidden}}
+    <li>
+      <a href="#${encodeURIComponent($value.name)}"
+       onclick="closeMenu()"
+       class="data-type match"
+       title="${$value.shortdoc}">${$value.name}</a>
+    </li>
+    {{/if}}
+    {{/each}}
+    {{each keywords}}
+    {{if $value.hidden}}
+    <li>
+    <a href="#${encodeURIComponent($value.name)}"
+       onclick="closeMenu()"
+       class="no-match"
+       title="${$value.shortdoc}">${$value.name}</a>
+    </li>
+    {{/if}}
+    {{/each}}
+    {{each dataTypes}}
+    {{if $value.hidden}}
+    <li>
+      <a href="#${encodeURIComponent($value.name)}"
+       onclick="closeMenu()"
+       class="data-type no-match"
+       title="${$value.shortdoc}">${$value.name}</a>
+    </li>
+    {{/if}}
+    {{/each}}
+</script>
+
+
+<script type="text/x-jquery-tmpl" id="tags-shortcuts-template">
+  <option value="javascript:clearTagSearch()" {{if selectedTag === ""}}selected{{/if}}>- Show all tags -</option>
+  {{each tags}}
+    <option value="javascript:tagSearch('${$value}')" {{if selectedTag === $value}}selected{{/if}}>${$value}</a>
+    </option>
+  {{/each}}
 </script>
 
 <script type="text/x-jquery-tmpl" id="keywords-template">
     <h2 id="Keywords">Keywords</h2>
-    <table border="1" class="keywords">
-        <tr>
-            <th class="kw">Keyword</th>
-            <th class="args">Arguments</th>
-            {{if libdoc.contains_tags}}
-            <th class="tags">Tags</th>
-            {{/if}}
-            <th class="doc">Documentation</th>
-        </tr>
+    <div class="keywords">
+        {{each keywords}}
+        {{if !$value.hidden}}
+            {{tmpl($value) 'keyword-template'}}
+        {{/if}}
+        {{/each}}
         {{each keywords}}
+        {{if $value.hidden}}
             {{tmpl($value) 'keyword-template'}}
+        {{/if}}
         {{/each}}
-    </table>
+    </div>
 </script>
 
 <script type="text/x-jquery-tmpl" id="keyword-template">
-    <tr class="kw-row {{if matched === false}}no-{{/if}}match">
-        <td class="kw">
-            <a name="${name}" href="#${encodeURIComponent(name)}"
+    <div class="keyword-container {{if hidden}}no-{{/if}}match" id="${name}">
+       <div class="keyword-name">
+            <h2>
+            <a class="kw-name" href="#${encodeURIComponent(name)}"
                title="Link to this keyword">${name}</a>
-        </td>
-        <td class="args">
-            {{each args}}
-            <span>${$value}</span>{{if $index < args.length-1}}, {{/if}}
-            {{/each}}
-        </td>
-        {{if libdoc.contains_tags}}
-        <td class="tags">
-            {{each tags}}
-            <a href="javascript:tagSearch('${$value}')"
-               title="Show tests with this tag">${$value}</a>{{if $index < tags.length-1}}, {{/if}}
-            {{/each}}
-        </td>
+            </h2>
+       </div>
+       <div class="keyword-content">
+          <div class="kw-overview">
+            {{if args.length}}
+              <div class="args">
+                <h4>Arguments</h4>
+                <div class="arguments-list-container">
+                  <div class="arguments-list">
+                  {{each args}}
+                    <span class="arg-name {{if $value.required}}arg-required{{else}}arg-optional{{/if}}" title="Argument name">{{if $value.kind === 'VAR_POSITIONAL'}}*{{/if}}{{if $value.kind === 'VAR_NAMED'}}**{{/if}}${$value.name}</span>
+
+                    {{if $value.default !== null}}
+                      <div class="arg-default-container">
+                        <span class="arg-default-eq">=</span>
+                        <span class="arg-default-value" title="Argument default value">${$value.default}</span>
+                      </div>
+                    {{/if}}
+
+                    {{if $value.types.length}}
+                      <span class="arg-type" title="Argument '${$value.name}' will be converter to type ${$value.types}">
+                        ${( $data.linked = $value.linked ),''}
+                        {{each $value.types}}&lt;{{if $data.linked.indexOf($value) > -1}}<a class="type" href="#${$value}">${$value}</a>{{else}}<span class="type">${$value}</span>{{/if}}&gt;<span class="or"></span>{{/each}}
+                      </span>
+                    {{/if}}
+                  {{/each}}
+                  </div>
+                </div>
+              </div>
+            {{/if}}
+            {{if libdoc.tags.length}}
+              <div class="tags">
+                <h4>Tags</h4>
+                {{each tags}}
+                  <a href="javascript:tagSearch('${$value}')"
+                    title="Show keywords with this tag">${$value}</a>{{if $index < tags.length-1}},<br>{{/if}}
+                {{/each}}
+              </div>
+            {{/if}}
+          </div>
+          {{if doc}}
+            <div class="kw-docs">
+              <h4>Documentation</h4>
+              <div class="kwdoc doc">{{html doc}}</div>
+            </div>
+          {{/if}}
+       </div>
+    </div>
+</script>
+
+<script type="text/x-jquery-tmpl" id="data-types-template">
+    {{if dataTypes.length}}
+    <h2 id="Data types">Data types</h2>
+    <div class="data-types">
+        {{each dataTypes}}
+        {{if !$value.hidden}}
+            {{tmpl($value) 'data-type-template'}}
+        {{/if}}
+        {{/each}}
+        {{each dataTypes}}
+        {{if $value.hidden}}
+            {{tmpl($value) 'data-type-template'}}
         {{/if}}
-        <td class="doc">{{html doc}}</td>
-    </tr>
+        {{/each}}
+    </div>
+    {{/if}}
 </script>
 
+<script type="text/x-jquery-tmpl" id="data-type-template">
+    <div class="data-type-container {{if hidden}}no-{{/if}}match" id="${name}">
+       <div class="data-type-name">
+            <h2>Type:
+            <a class="dt-name" href="#${encodeURIComponent(name)}"
+               title="Link to this data type">${name}</a>
+            </h2>
+       </div>
+       <div class="data-type-content">
+          {{if members}}
+            <div class="dt-members">
+              <h4>Allowed Values</h4>
+              <ul class="enum-type-members">
+                {{each members}}
+                <li>
+                  <span class="enum-member">${$value.name}</span>
+                </li>
+                {{/each}}
+              </ul>
+            </div>
+          {{else items}}
+            <div class="dt-items">
+              <h4>Dictionary Structure</h4>
+                <div class="typed-dict-annotation">
+                <span class="typed-dict-item"
+                >{{{each items}}<br><span
+                  {{if required !== null}}
+                    class="td-item {{if required}}required-key{{else}}optional-key{{/if}}"
+                    title="{{if required}}required-key{{else}}optional-key{{/if}}"
+                  {{else}}
+                    class="td-item"
+                  {{/if}}
+                 >'${key}': </span>
+                   <span class="td-type">&lt;${type}&gt;</span>{{/each}}<br>}</span>
+                </div>
+            </div>
+          {{/if}}
+          {{if doc}}
+            <div class="dt-docs">
+              <h4>Documentation</h4>
+              <div class="dtdoc doc">{{html doc}}</div>
+            </div>
+          {{/if}}
+       </div>
+    </div>
+</script>
 
 <script type="text/x-jquery-tmpl" id="footer-template">
     <p class="footer">
-        <span id="altogether-count">Altogether ${keywords.length} keywords.</span>
-        <span id="match-count"></span>
-        <br>
         Generated by <a href="http://robotframework.org/robotframework/#built-in-tools">Libdoc</a> on ${generated}.
     </p>
 </script>
diff --git a/doc/generate_doc.sh b/doc/generate_doc.sh
new file mode 100755
index 00000000..18b7f746
--- /dev/null
+++ b/doc/generate_doc.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+# I know it's bad but there is no other way to keep docstring working with this decorator
+SCRIPT_PATH=`dirname "$0"`
+sed -i.bak '/@warn_if_equal_symbol_in_url/d' ${SCRIPT_PATH}/../src/RequestsLibrary/RequestsOnSessionKeywords.py
+python -m robot.libdoc ${SCRIPT_PATH}/../src/RequestsLibrary ${SCRIPT_PATH}/RequestsLibrary.html
+mv ${SCRIPT_PATH}/../src/RequestsLibrary/RequestsOnSessionKeywords.py.bak ${SCRIPT_PATH}/../src/RequestsLibrary/RequestsOnSessionKeywords.py
diff --git a/setup.py b/setup.py
index 9a6bd48d..856b1dfa 100644
--- a/setup.py
+++ b/setup.py
@@ -29,8 +29,8 @@
 Topic :: Software Development :: Testing
 """[1:-1]
 
-TEST_REQUIRE = ['pytest', 'flask', 'coverage', 'flake8'] if PY3 \
-    else ['pytest', 'flask', 'coverage', 'flake8', 'mock']
+TEST_REQUIRE = ['robotframework>=3.2.1', 'pytest', 'flask', 'six', 'coverage', 'flake8'] if PY3 \
+    else ['robotframework>=3.2.1', 'pytest', 'flask', 'coverage', 'flake8', 'mock']
 
 setup(name='robotframework-requests',
       version=VERSION,
diff --git a/src/RequestsLibrary/DeprecatedKeywords.py b/src/RequestsLibrary/DeprecatedKeywords.py
new file mode 100644
index 00000000..e404ff17
--- /dev/null
+++ b/src/RequestsLibrary/DeprecatedKeywords.py
@@ -0,0 +1,378 @@
+import json
+
+from robot.api import logger
+from robot.api.deco import keyword
+
+from RequestsLibrary import utils
+from RequestsLibrary.compat import PY3
+
+from .SessionKeywords import SessionKeywords
+
+
+class DeprecatedKeywords(SessionKeywords):
+
+    @keyword("To Json")
+    def to_json(self, content, pretty_print=False):
+        """
+        *DEPRECATED* Please use ${resp.json()} instead. Have a look at the improved HTML output as pretty printing replacement.
+
+        Convert a string to a JSON object
+
+        ``content`` String content to convert into JSON
+
+        ``pretty_print`` If defined, will output JSON is pretty print format
+        """
+        if PY3:
+            if isinstance(content, bytes):
+                content = content.decode(encoding='utf-8')
+        if pretty_print:
+            json_ = utils.json_pretty_print(content)
+        else:
+            json_ = json.loads(content)
+        logger.info('To JSON using : content=%s ' % (content))
+        logger.info('To JSON using : pretty_print=%s ' % (pretty_print))
+        return json_
+
+    def get_request(
+            self,
+            alias,
+            uri,
+            headers=None,
+            data=None,
+            json=None,
+            params=None,
+            allow_redirects=None,
+            timeout=None):
+        """
+        *DEPRECATED* Please use `GET On Session` instead.
+
+        Send a GET request on the session object found using the
+        given `alias`
+
+        ``alias`` that will be used to identify the Session object in the cache
+
+        ``uri`` to send the GET request to
+
+        ``params`` url parameters to append to the uri
+
+        ``headers`` a dictionary of headers to use with the request
+
+        ``data`` a dictionary of key-value pairs that will be urlencoded
+               and sent as GET data
+               or binary data that is sent as the raw body content
+
+        ``json`` a value that will be json encoded
+               and sent as GET data if data is not specified
+
+        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+
+        ``timeout`` connection timeout
+        """
+        session = self._cache.switch(alias)
+        # XXX workaround to restore library default behaviour. Not needed in new keywords
+        redir = True if allow_redirects is None else allow_redirects
+
+        response = self._common_request(
+            "get",
+            session,
+            uri,
+            params=params,
+            headers=headers,
+            data=data,
+            json=json,
+            allow_redirects=redir,
+            timeout=timeout)
+
+        return response
+
+    def post_request(
+            self,
+            alias,
+            uri,
+            data=None,
+            json=None,
+            params=None,
+            headers=None,
+            files=None,
+            allow_redirects=None,
+            timeout=None):
+        """
+        *DEPRECATED* Please use `POST On Session` instead.
+
+        Send a POST request on the session object found using the
+        given `alias`
+
+        ``alias`` that will be used to identify the Session object in the cache
+
+        ``uri`` to send the POST request to
+
+        ``data`` a dictionary of key-value pairs that will be urlencoded
+               and sent as POST data
+               or binary data that is sent as the raw body content
+               or passed as such for multipart form data if ``files`` is also defined
+               or file descriptor retrieved by Get File For Streaming Upload
+
+        ``json`` a value that will be json encoded
+               and sent as POST data if files or data is not specified
+
+        ``params`` url parameters to append to the uri
+
+        ``headers`` a dictionary of headers to use with the request
+
+        ``files`` a dictionary of file names containing file data to POST to the server
+
+        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+
+        ``timeout`` connection timeout
+        """
+        session = self._cache.switch(alias)
+        if not files:
+            data = utils.format_data_according_to_header(session, data, headers)
+        # XXX workaround to restore library default behaviour. Not needed in new keywords
+        redir = True if allow_redirects is None else allow_redirects
+
+        response = self._common_request(
+            "post",
+            session,
+            uri,
+            data=data,
+            json=json,
+            params=params,
+            files=files,
+            headers=headers,
+            allow_redirects=redir,
+            timeout=timeout)
+        return response
+
+    def patch_request(
+            self,
+            alias,
+            uri,
+            data=None,
+            json=None,
+            params=None,
+            headers=None,
+            files=None,
+            allow_redirects=None,
+            timeout=None):
+        """
+        *DEPRECATED* Please use `PATCH On Session` instead.
+
+        Send a PATCH request on the session object found using the
+        given `alias`
+
+        ``alias`` that will be used to identify the Session object in the cache
+
+        ``uri`` to send the PATCH request to
+
+        ``data`` a dictionary of key-value pairs that will be urlencoded
+               and sent as PATCH data
+               or binary data that is sent as the raw body content
+               or file descriptor retrieved by Get File For Streaming Upload
+
+        ``json`` a value that will be json encoded
+               and sent as PATCH data if data is not specified
+
+        ``headers`` a dictionary of headers to use with the request
+
+        ``files`` a dictionary of file names containing file data to PATCH to the server
+
+        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+
+        ``params`` url parameters to append to the uri
+
+        ``timeout`` connection timeout
+        """
+        session = self._cache.switch(alias)
+        data = utils.format_data_according_to_header(session, data, headers)
+        # XXX workaround to restore library default behaviour. Not needed in new keywords
+        redir = True if allow_redirects is None else allow_redirects
+
+        response = self._common_request(
+            "patch",
+            session,
+            uri,
+            data=data,
+            json=json,
+            params=params,
+            files=files,
+            headers=headers,
+            allow_redirects=redir,
+            timeout=timeout)
+
+        return response
+
+    def put_request(
+            self,
+            alias,
+            uri,
+            data=None,
+            json=None,
+            params=None,
+            files=None,
+            headers=None,
+            allow_redirects=None,
+            timeout=None):
+        """
+        *DEPRECATED* Please use `PUT On Session` instead.
+
+        Send a PUT request on the session object found using the
+        given `alias`
+
+        ``alias`` that will be used to identify the Session object in the cache
+
+        ``uri`` to send the PUT request to
+
+        ``data`` a dictionary of key-value pairs that will be urlencoded
+               and sent as PUT data
+               or binary data that is sent as the raw body content
+               or file descriptor retrieved by Get File For Streaming Upload
+
+        ``json`` a value that will be json encoded
+               and sent as PUT data if data is not specified
+
+        ``headers`` a dictionary of headers to use with the request
+
+        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+
+        ``params`` url parameters to append to the uri
+
+        ``timeout`` connection timeout
+        """
+        session = self._cache.switch(alias)
+        data = utils.format_data_according_to_header(session, data, headers)
+        # XXX workaround to restore library default behaviour. Not needed in new keywords
+        redir = True if allow_redirects is None else allow_redirects
+
+        response = self._common_request(
+            "put",
+            session,
+            uri,
+            data=data,
+            json=json,
+            params=params,
+            files=files,
+            headers=headers,
+            allow_redirects=redir,
+            timeout=timeout)
+
+        return response
+
+    def delete_request(
+            self,
+            alias,
+            uri,
+            data=None,
+            json=None,
+            params=None,
+            headers=None,
+            allow_redirects=None,
+            timeout=None):
+        """
+        *DEPRECATED* Please use `DELETE On Session` instead.
+
+        Send a DELETE request on the session object found using the
+        given `alias`
+
+        ``alias`` that will be used to identify the Session object in the cache
+
+        ``uri`` to send the DELETE request to
+
+        ``json`` a value that will be json encoded
+               and sent as request data if data is not specified
+
+        ``headers`` a dictionary of headers to use with the request
+
+        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+
+        ``timeout`` connection timeout
+        """
+        session = self._cache.switch(alias)
+        data = utils.format_data_according_to_header(session, data, headers)
+        # XXX workaround to restore library default behaviour. Not needed in new keywords
+        redir = True if allow_redirects is None else allow_redirects
+
+        response = self._common_request(
+            "delete",
+            session,
+            uri,
+            data=data,
+            json=json,
+            params=params,
+            headers=headers,
+            allow_redirects=redir,
+            timeout=timeout)
+
+        return response
+
+    def head_request(
+            self,
+            alias,
+            uri,
+            headers=None,
+            allow_redirects=None,
+            timeout=None):
+        """
+        *DEPRECATED* Please use `HEAD On Session` instead.
+
+        Send a HEAD request on the session object found using the
+        given `alias`
+
+        ``alias`` that will be used to identify the Session object in the cache
+
+        ``uri`` to send the HEAD request to
+
+        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+
+        ``headers`` a dictionary of headers to use with the request
+
+        ``timeout`` connection timeout
+        """
+        session = self._cache.switch(alias)
+        # XXX workaround to restore library default behaviour. Not needed in new keywords
+        redir = False if allow_redirects is None else allow_redirects
+        response = self._common_request(
+            "head",
+            session,
+            uri,
+            headers=headers,
+            allow_redirects=redir,
+            timeout=timeout)
+
+        return response
+
+    def options_request(
+            self,
+            alias,
+            uri,
+            headers=None,
+            allow_redirects=None,
+            timeout=None):
+        """
+        *DEPRECATED* Please use `OPTIONS On Session` instead.
+
+        Send an OPTIONS request on the session object found using the
+        given `alias`
+
+        ``alias`` that will be used to identify the Session object in the cache
+
+        ``uri`` to send the OPTIONS request to
+
+        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
+
+        ``headers`` a dictionary of headers to use with the request
+
+        ``timeout`` connection timeout
+        """
+        session = self._cache.switch(alias)
+        # XXX workaround to restore library default behaviour. Not needed in new keywords
+        redir = True if allow_redirects is None else allow_redirects
+        response = self._common_request(
+            "options",
+            session,
+            uri,
+            headers=headers,
+            allow_redirects=redir,
+            timeout=timeout)
+
+        return response
diff --git a/src/RequestsLibrary/RequestsKeywords.py b/src/RequestsLibrary/RequestsKeywords.py
index 61a11bdc..a98b7c26 100644
--- a/src/RequestsLibrary/RequestsKeywords.py
+++ b/src/RequestsLibrary/RequestsKeywords.py
@@ -1,908 +1,20 @@
 import json
-import copy
-import sys
-
-import requests
-from requests.models import Response
-from requests.sessions import merge_setting
-from requests.cookies import merge_cookies
-from requests.packages.urllib3.util import Retry
-import logging
 
 import robot
-from robot.api import logger
+from robot.api.deco import keyword
 from robot.libraries.BuiltIn import BuiltIn
 from robot.utils.asserts import assert_equal
 
-from RequestsLibrary import utils, log
-from RequestsLibrary.compat import httplib, PY3
-from RequestsLibrary.exceptions import InvalidResponse
-from RequestsLibrary.utils import is_file_descriptor
-
-
-try:
-    from requests_ntlm import HttpNtlmAuth
-except ImportError:
-    pass
-
-
-class WritableObject:
-    """ HTTP stream handler """
-
-    def __init__(self):
-        self.content = []
-
-    def write(self, string):
-        self.content.append(string)
-
 
 class RequestsKeywords(object):
     ROBOT_LIBRARY_SCOPE = 'Global'
-    DEFAULT_RETRY_METHOD_LIST = list(copy.copy(Retry.DEFAULT_METHOD_WHITELIST))
 
     def __init__(self):
         self._cache = robot.utils.ConnectionCache('No sessions created')
         self.builtin = BuiltIn()
         self.debug = 0
 
-    def _create_session(
-            self,
-            alias,
-            url,
-            headers,
-            cookies,
-            auth,
-            timeout,
-            proxies,
-            verify,
-            debug,
-            max_retries,
-            backoff_factor,
-            disable_warnings,
-            retry_status_list,
-            retry_method_list):
-
-        logger.debug('Creating session: %s' % alias)
-        s = session = requests.Session()
-        s.headers.update(headers)
-        s.auth = auth if auth else s.auth
-        s.proxies = proxies if proxies else s.proxies
-
-        try:
-            max_retries = int(max_retries)
-            retry_status_list = [int(x) for x in retry_status_list] if retry_status_list else None
-        except ValueError as err:
-            raise ValueError("Error converting session parameter: %s" % err)
-
-        if max_retries > 0:
-            retry = Retry(total=max_retries,
-                          backoff_factor=backoff_factor,
-                          status_forcelist=retry_status_list,
-                          method_whitelist=retry_method_list)
-            http = requests.adapters.HTTPAdapter(max_retries=retry)
-            https = requests.adapters.HTTPAdapter(max_retries=retry)
-
-            # Replace the session's original adapters
-            s.mount('http://', http)
-            s.mount('https://', https)
-
-        # Disable requests warnings, useful when you have large number of testcase
-        # you will observe drastical changes in Robot log.html and output.xml files size
-        if disable_warnings:
-            # you need to initialize logging, otherwise you will not see anything from requests
-            logging.basicConfig()
-            logging.getLogger().setLevel(logging.ERROR)
-            requests_log = logging.getLogger("requests")
-            requests_log.setLevel(logging.ERROR)
-            requests_log.propagate = True
-            if not verify:
-                requests.packages.urllib3.disable_warnings()
-
-        # verify can be a Boolean or a String
-        if isinstance(verify, bool):
-            s.verify = verify
-        elif utils.is_string_type(verify):
-            if verify.lower() == 'true' or verify.lower() == 'false':
-                s.verify = self.builtin.convert_to_boolean(verify)
-            else:
-                # String for CA_BUNDLE, not a Boolean String
-                s.verify = verify
-        else:
-            # not a Boolean nor a String
-            s.verify = verify
-
-        # cant pass these into the Session anymore
-        self.timeout = float(timeout) if timeout is not None else None
-        self.cookies = cookies
-        self.verify = verify if self.builtin.convert_to_boolean(verify) is not True else None
-
-        s.url = url
-
-        # Enable http verbosity
-        if int(debug) >= 1:
-            self.debug = int(debug)
-            httplib.HTTPConnection.debuglevel = self.debug
-
-        self._cache.register(session, alias=alias)
-        return session
-
-    def create_session(self,
-                       alias,
-                       url,
-                       headers={},
-                       cookies={},
-                       auth=None,
-                       timeout=None,
-                       proxies=None,
-                       verify=False,
-                       debug=0,
-                       max_retries=3,
-                       backoff_factor=0.10,
-                       disable_warnings=0,
-                       retry_status_list=[],
-                       retry_method_list=DEFAULT_RETRY_METHOD_LIST):
-        """ Create Session: create a HTTP session to a server
-
-        ``alias`` Robot Framework alias to identify the session
-
-        ``url`` Base url of the server
-
-        ``headers`` Dictionary of default headers
-
-        ``cookies`` Dictionary of cookies
-
-        ``auth`` List of username & password for HTTP Basic Auth
-
-        ``timeout`` Connection timeout
-
-        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
-
-        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
-
-        ``debug`` Enable http verbosity option more information
-                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
-
-        ``max_retries`` Number of maximum retries each connection should attempt.
-                        By default it will retry 3 times in case of connection errors only.
-                        A 0 value will disable any kind of retries regardless of other retry settings.
-                        In case the number of retries is reached a retry exception is raised.
-
-        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
-
-        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
-                           eg. if backoff_factor is set to 0.1
-                           the sleep between attemps will be: 0.0, 0.2, 0.4
-                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
-
-        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
-                              By default retries are allowed only on HTTP requests methods that are considered to be
-                              idempotent (multiple requests with the same parameters end with the same state).
-                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
-
-        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
-                              eg. set to [502, 503] to retry requests if those status are returned.
-                              Note that max_retries must be greater than 0.
-
-        """
-        auth = requests.auth.HTTPBasicAuth(*auth) if auth else None
-
-        logger.info('Creating Session using : alias=%s, url=%s, headers=%s, \
-                    cookies=%s, auth=%s, timeout=%s, proxies=%s, verify=%s, \
-                    debug=%s ' % (alias, url, headers, cookies, auth, timeout,
-                                  proxies, verify, debug))
-        return self._create_session(
-            alias=alias,
-            url=url,
-            headers=headers,
-            cookies=cookies,
-            auth=auth,
-            timeout=timeout,
-            max_retries=max_retries,
-            backoff_factor=backoff_factor,
-            proxies=proxies,
-            verify=verify,
-            debug=debug,
-            disable_warnings=disable_warnings,
-            retry_status_list=retry_status_list,
-            retry_method_list=retry_method_list)
-
-    def create_custom_session(
-            self,
-            alias,
-            url,
-            auth,
-            headers={},
-            cookies={},
-            timeout=None,
-            proxies=None,
-            verify=False,
-            debug=0,
-            max_retries=3,
-            backoff_factor=0.10,
-            disable_warnings=0,
-            retry_status_list=[],
-            retry_method_list=DEFAULT_RETRY_METHOD_LIST):
-        """ Create Session: create a HTTP session to a server
-
-        ``url`` Base url of the server
-
-        ``alias`` Robot Framework alias to identify the session
-
-        ``headers`` Dictionary of default headers
-
-        ``cookies`` Dictionary of cookies
-
-        ``auth`` A Custom Authentication object to be passed on to the requests library.
-                http://docs.python-requests.org/en/master/user/advanced/#custom-authentication
-
-        ``timeout`` Connection timeout
-
-        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
-
-        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
-                 Defaults to False.
-
-        ``debug`` Enable http verbosity option more information
-                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
-
-        ``max_retries`` Number of maximum retries each connection should attempt.
-                        By default it will retry 3 times in case of connection errors only.
-                        A 0 value will disable any kind of retries regardless of other retry settings.
-                        In case the number of retries is reached a retry exception is raised.
-
-        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
-
-        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
-                           eg. if backoff_factor is set to 0.1
-                           the sleep between attemps will be: 0.0, 0.2, 0.4
-                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
-
-        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
-                              By default retries are allowed only on HTTP requests methods that are considered to be
-                              idempotent (multiple requests with the same parameters end with the same state).
-                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
-
-        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
-                              eg. set to [502, 503] to retry requests if those status are returned.
-                              Note that max_retries must be greater than 0.
-        """
-
-        logger.info('Creating Custom Authenticated Session using : alias=%s, url=%s, headers=%s, \
-                    cookies=%s, auth=%s, timeout=%s, proxies=%s, verify=%s, \
-                    debug=%s ' % (alias, url, headers, cookies, auth, timeout,
-                                  proxies, verify, debug))
-
-        return self._create_session(
-            alias=alias,
-            url=url,
-            headers=headers,
-            cookies=cookies,
-            auth=auth,
-            timeout=timeout,
-            max_retries=max_retries,
-            backoff_factor=backoff_factor,
-            proxies=proxies,
-            verify=verify,
-            debug=debug,
-            disable_warnings=disable_warnings,
-            retry_status_list=retry_status_list,
-            retry_method_list=retry_method_list)
-
-    def create_ntlm_session(
-            self,
-            alias,
-            url,
-            auth,
-            headers={},
-            cookies={},
-            timeout=None,
-            proxies=None,
-            verify=False,
-            debug=0,
-            max_retries=3,
-            backoff_factor=0.10,
-            disable_warnings=0,
-            retry_status_list=[],
-            retry_method_list=DEFAULT_RETRY_METHOD_LIST):
-        """ Create Session: create a HTTP session to a server
-
-        ``url`` Base url of the server
-
-        ``alias`` Robot Framework alias to identify the session
-
-        ``headers`` Dictionary of default headers
-
-        ``cookies`` Dictionary of cookies
-
-        ``auth`` ['DOMAIN', 'username', 'password'] for NTLM Authentication
-
-        ``timeout`` Connection timeout
-
-        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
-
-        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
-                 Defaults to False.
-
-        ``debug`` Enable http verbosity option more information
-                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
-
-        ``max_retries`` Number of maximum retries each connection should attempt.
-                        By default it will retry 3 times in case of connection errors only.
-                        A 0 value will disable any kind of retries regardless of other retry settings.
-                        In case the number of retries is reached a retry exception is raised.
-
-        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
-
-        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
-                           eg. if backoff_factor is set to 0.1
-                           the sleep between attemps will be: 0.0, 0.2, 0.4
-                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
-
-        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
-                              By default retries are allowed only on HTTP requests methods that are considered to be
-                              idempotent (multiple requests with the same parameters end with the same state).
-                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
-
-        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
-                              eg. set to [502, 503] to retry requests if those status are returned.
-                              Note that max_retries must be greater than 0.
-        """
-        try:
-            HttpNtlmAuth
-        except NameError:
-            raise AssertionError('requests_ntlm module not installed')
-        if len(auth) != 3:
-            raise AssertionError('Incorrect number of authentication arguments'
-                                 ' - expected 3, got {}'.format(len(auth)))
-        else:
-            ntlm_auth = HttpNtlmAuth('{}\\{}'.format(auth[0], auth[1]),
-                                     auth[2])
-            logger.info('Creating NTLM Session using : alias=%s, url=%s, \
-                        headers=%s, cookies=%s, ntlm_auth=%s, timeout=%s, \
-                        proxies=%s, verify=%s, debug=%s '
-                        % (alias, url, headers, cookies, ntlm_auth,
-                           timeout, proxies, verify, debug))
-
-            return self._create_session(
-                alias=alias,
-                url=url,
-                headers=headers,
-                cookies=cookies,
-                auth=ntlm_auth,
-                timeout=timeout,
-                max_retries=max_retries,
-                backoff_factor=backoff_factor,
-                proxies=proxies,
-                verify=verify,
-                debug=debug,
-                disable_warnings=disable_warnings,
-                retry_status_list=retry_status_list,
-                retry_method_list=retry_method_list)
-
-    def create_digest_session(
-            self,
-            alias,
-            url,
-            auth,
-            headers={},
-            cookies={},
-            timeout=None,
-            proxies=None, verify=False,
-            debug=0,
-            max_retries=3,
-            backoff_factor=0.10,
-            disable_warnings=0,
-            retry_status_list=[],
-            retry_method_list=DEFAULT_RETRY_METHOD_LIST):
-        """ Create Session: create a HTTP session to a server
-
-        ``url`` Base url of the server
-
-        ``alias`` Robot Framework alias to identify the session
-
-        ``headers`` Dictionary of default headers
-
-        ``cookies`` Dictionary of cookies
-
-        ``auth`` ['DOMAIN', 'username', 'password'] for NTLM Authentication
-
-        ``timeout`` Connection timeout
-
-        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
-
-        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
-                 Defaults to False.
-
-        ``debug`` Enable http verbosity option more information
-                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
-
-        ``max_retries`` Number of maximum retries each connection should attempt.
-                        By default it will retry 3 times in case of connection errors only.
-                        A 0 value will disable any kind of retries regardless of other retry settings.
-                        In case the number of retries is reached a retry exception is raised.
-
-        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
-
-        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
-                           eg. if backoff_factor is set to 0.1
-                           the sleep between attemps will be: 0.0, 0.2, 0.4
-                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
-
-        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
-                              By default retries are allowed only on HTTP requests methods that are considered to be
-                              idempotent (multiple requests with the same parameters end with the same state).
-                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
-
-        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
-                              eg. set to [502, 503] to retry requests if those status are returned.
-                              Note that max_retries must be greater than 0.
-        """
-        digest_auth = requests.auth.HTTPDigestAuth(*auth) if auth else None
-
-        return self._create_session(
-            alias=alias,
-            url=url,
-            headers=headers,
-            cookies=cookies,
-            auth=digest_auth,
-            timeout=timeout,
-            max_retries=max_retries,
-            backoff_factor=backoff_factor,
-            proxies=proxies,
-            verify=verify,
-            debug=debug,
-            disable_warnings=disable_warnings,
-            retry_status_list=retry_status_list,
-            retry_method_list=retry_method_list)
-
-    def create_client_cert_session(
-            self,
-            alias,
-            url,
-            headers={},
-            cookies={},
-            client_certs=None,
-            timeout=None,
-            proxies=None,
-            verify=False,
-            debug=0,
-            max_retries=3,
-            backoff_factor=0.10,
-            disable_warnings=0,
-            retry_status_list=[],
-            retry_method_list=DEFAULT_RETRY_METHOD_LIST):
-        """ Create Session: create a HTTP session to a server
-
-        ``url`` Base url of the server
-
-        ``alias`` Robot Framework alias to identify the session
-
-        ``headers`` Dictionary of default headers
-
-        ``cookies`` Dictionary of cookies
-
-        ``client_certs`` ['client certificate', 'client key'] PEM files containing the client key and certificate
-
-        ``timeout`` Connection timeout
-
-        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
-
-        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
-                 Defaults to False.
-
-        ``debug`` Enable http verbosity option more information
-                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
-
-        ``max_retries`` Number of maximum retries each connection should attempt.
-                        By default it will retry 3 times in case of connection errors only.
-                        A 0 value will disable any kind of retries regardless of other retry settings.
-                        In case the number of retries is reached a retry exception is raised.
-
-        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
-
-        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
-                           eg. if backoff_factor is set to 0.1
-                           the sleep between attemps will be: 0.0, 0.2, 0.4
-                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
-
-        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
-                              By default retries are allowed only on HTTP requests methods that are considered to be
-                              idempotent (multiple requests with the same parameters end with the same state).
-                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
-
-        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
-                              eg. set to [502, 503] to retry requests if those status are returned.
-                              Note that max_retries must be greater than 0.
-        """
-
-        logger.info('Creating Session using : alias=%s, url=%s, headers=%s, \
-                    cookies=%s, client_certs=%s, timeout=%s, proxies=%s, verify=%s, \
-                    debug=%s ' % (alias, url, headers, cookies, client_certs, timeout,
-                                  proxies, verify, debug))
-
-        session = self._create_session(
-            alias=alias,
-            url=url,
-            headers=headers,
-            cookies=cookies,
-            auth=None,
-            timeout=timeout,
-            max_retries=max_retries,
-            backoff_factor=backoff_factor,
-            proxies=proxies,
-            verify=verify,
-            debug=debug,
-            disable_warnings=disable_warnings,
-            retry_status_list=retry_status_list,
-            retry_method_list=retry_method_list)
-
-        session.cert = tuple(client_certs)
-        return session
-
-    def session_exists(self, alias):
-        """Return True if the session has been already created
-
-        ``alias`` that has been used to identify the Session object in the cache
-        """
-        try:
-            self._cache[alias]
-            return True
-        except RuntimeError:
-            return False
-
-    def delete_all_sessions(self):
-        """ Removes all the session objects """
-        logger.info('Delete All Sessions')
-
-        self._cache.empty_cache()
-
-    def update_session(self, alias, headers=None, cookies=None):
-        """Update Session Headers: update a HTTP Session Headers
-
-        ``alias`` Robot Framework alias to identify the session
-
-        ``headers`` Dictionary of headers merge into session
-        """
-        session = self._cache.switch(alias)
-        session.headers = merge_setting(headers, session.headers)
-        session.cookies = merge_cookies(session.cookies, cookies)
-
-    def to_json(self, content, pretty_print=False):
-        """ Convert a string to a JSON object
-
-        ``content`` String content to convert into JSON
-
-        ``pretty_print`` If defined, will output JSON is pretty print format
-        """
-        if PY3:
-            if isinstance(content, bytes):
-                content = content.decode(encoding='utf-8')
-        if pretty_print:
-            json_ = utils.json_pretty_print(content)
-        else:
-            json_ = json.loads(content)
-        logger.info('To JSON using : content=%s ' % (content))
-        logger.info('To JSON using : pretty_print=%s ' % (pretty_print))
-
-        return json_
-
-    def get_request(
-            self,
-            alias,
-            uri,
-            headers=None,
-            data=None,
-            json=None,
-            params=None,
-            allow_redirects=None,
-            timeout=None):
-        """ Send a GET request on the session object found using the
-        given `alias`
-
-        ``alias`` that will be used to identify the Session object in the cache
-
-        ``uri`` to send the GET request to
-
-        ``params`` url parameters to append to the uri
-
-        ``headers`` a dictionary of headers to use with the request
-
-        ``data`` a dictionary of key-value pairs that will be urlencoded
-               and sent as GET data
-               or binary data that is sent as the raw body content
-
-        ``json`` a value that will be json encoded
-               and sent as GET data if data is not specified
-
-        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
-
-        ``timeout`` connection timeout
-        """
-        session = self._cache.switch(alias)
-        redir = True if allow_redirects is None else allow_redirects
-
-        response = self._common_request(
-            "get",
-            session,
-            uri,
-            params=params,
-            headers=headers,
-            data=data,
-            json=json,
-            allow_redirects=redir,
-            timeout=timeout)
-
-        return response
-
-    def post_request(
-            self,
-            alias,
-            uri,
-            data=None,
-            json=None,
-            params=None,
-            headers=None,
-            files=None,
-            allow_redirects=None,
-            timeout=None):
-        """ Send a POST request on the session object found using the
-        given `alias`
-
-        ``alias`` that will be used to identify the Session object in the cache
-
-        ``uri`` to send the POST request to
-
-        ``data`` a dictionary of key-value pairs that will be urlencoded
-               and sent as POST data
-               or binary data that is sent as the raw body content
-               or passed as such for multipart form data if ``files`` is also defined
-               or file descriptor retrieved by Get File For Streaming Upload
-
-        ``json`` a value that will be json encoded
-               and sent as POST data if files or data is not specified
-
-        ``params`` url parameters to append to the uri
-
-        ``headers`` a dictionary of headers to use with the request
-
-        ``files`` a dictionary of file names containing file data to POST to the server
-
-        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
-
-        ``timeout`` connection timeout
-        """
-        session = self._cache.switch(alias)
-        if not files:
-            data = utils.format_data_according_to_header(session, data, headers)
-        redir = True if allow_redirects is None else allow_redirects
-
-        response = self._common_request(
-            "post",
-            session,
-            uri,
-            data=data,
-            json=json,
-            params=params,
-            files=files,
-            headers=headers,
-            allow_redirects=redir,
-            timeout=timeout)
-
-        return response
-
-    def patch_request(
-            self,
-            alias,
-            uri,
-            data=None,
-            json=None,
-            params=None,
-            headers=None,
-            files=None,
-            allow_redirects=None,
-            timeout=None):
-        """ Send a PATCH request on the session object found using the
-        given `alias`
-
-        ``alias`` that will be used to identify the Session object in the cache
-
-        ``uri`` to send the PATCH request to
-
-        ``data`` a dictionary of key-value pairs that will be urlencoded
-               and sent as PATCH data
-               or binary data that is sent as the raw body content
-               or file descriptor retrieved by Get File For Streaming Upload
-
-        ``json`` a value that will be json encoded
-               and sent as PATCH data if data is not specified
-
-        ``headers`` a dictionary of headers to use with the request
-
-        ``files`` a dictionary of file names containing file data to PATCH to the server
-
-        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
-
-        ``params`` url parameters to append to the uri
-
-        ``timeout`` connection timeout
-        """
-        session = self._cache.switch(alias)
-        data = utils.format_data_according_to_header(session, data, headers)
-        redir = True if allow_redirects is None else allow_redirects
-
-        response = self._common_request(
-            "patch",
-            session,
-            uri,
-            data=data,
-            json=json,
-            params=params,
-            files=files,
-            headers=headers,
-            allow_redirects=redir,
-            timeout=timeout)
-
-        return response
-
-    def put_request(
-            self,
-            alias,
-            uri,
-            data=None,
-            json=None,
-            params=None,
-            files=None,
-            headers=None,
-            allow_redirects=None,
-            timeout=None):
-        """ Send a PUT request on the session object found using the
-        given `alias`
-
-        ``alias`` that will be used to identify the Session object in the cache
-
-        ``uri`` to send the PUT request to
-
-        ``data`` a dictionary of key-value pairs that will be urlencoded
-               and sent as PUT data
-               or binary data that is sent as the raw body content
-               or file descriptor retrieved by Get File For Streaming Upload
-
-        ``json`` a value that will be json encoded
-               and sent as PUT data if data is not specified
-
-        ``headers`` a dictionary of headers to use with the request
-
-        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
-
-        ``params`` url parameters to append to the uri
-
-        ``timeout`` connection timeout
-        """
-        session = self._cache.switch(alias)
-        data = utils.format_data_according_to_header(session, data, headers)
-        redir = True if allow_redirects is None else allow_redirects
-
-        response = self._common_request(
-            "put",
-            session,
-            uri,
-            data=data,
-            json=json,
-            params=params,
-            files=files,
-            headers=headers,
-            allow_redirects=redir,
-            timeout=timeout)
-
-        return response
-
-    def delete_request(
-            self,
-            alias,
-            uri,
-            data=None,
-            json=None,
-            params=None,
-            headers=None,
-            allow_redirects=None,
-            timeout=None):
-        """ Send a DELETE request on the session object found using the
-        given `alias`
-
-        ``alias`` that will be used to identify the Session object in the cache
-
-        ``uri`` to send the DELETE request to
-
-        ``json`` a value that will be json encoded
-               and sent as request data if data is not specified
-
-        ``headers`` a dictionary of headers to use with the request
-
-        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
-
-        ``timeout`` connection timeout
-        """
-        session = self._cache.switch(alias)
-        data = utils.format_data_according_to_header(session, data, headers)
-        redir = True if allow_redirects is None else allow_redirects
-
-        response = self._common_request(
-            "delete",
-            session,
-            uri,
-            data=data,
-            json=json,
-            params=params,
-            headers=headers,
-            allow_redirects=redir,
-            timeout=timeout)
-
-        return response
-
-    def head_request(
-            self,
-            alias,
-            uri,
-            headers=None,
-            allow_redirects=None,
-            timeout=None):
-        """ Send a HEAD request on the session object found using the
-        given `alias`
-
-        ``alias`` that will be used to identify the Session object in the cache
-
-        ``uri`` to send the HEAD request to
-
-        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
-
-        ``headers`` a dictionary of headers to use with the request
-
-        ``timeout`` connection timeout
-        """
-        session = self._cache.switch(alias)
-        redir = False if allow_redirects is None else allow_redirects
-        response = self._common_request(
-            "head",
-            session,
-            uri,
-            headers=headers,
-            allow_redirects=redir,
-            timeout=timeout)
-
-        return response
-
-    def options_request(
-            self,
-            alias,
-            uri,
-            headers=None,
-            allow_redirects=None,
-            timeout=None):
-        """ Send an OPTIONS request on the session object found using the
-        given `alias`
-
-        ``alias`` that will be used to identify the Session object in the cache
-
-        ``uri`` to send the OPTIONS request to
-
-        ``allow_redirects`` Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
-
-        ``headers`` a dictionary of headers to use with the request
-
-        ``timeout`` connection timeout
-        """
-        session = self._cache.switch(alias)
-        redir = True if allow_redirects is None else allow_redirects
-        response = self._common_request(
-            "options",
-            session,
-            uri,
-            headers=headers,
-            allow_redirects=redir,
-            timeout=timeout)
-
-        return response
-
+    @keyword("Status Should Be")
     def status_should_be(self, expected_status, response, msg=None):
         """
         Fails if response status code is different than the expected.
@@ -911,52 +23,36 @@ def status_should_be(self, expected_status, response, msg=None):
         But it could also be a named status code like 'ok', 'created', 'accepted' or
         'bad request', 'not found' etc.
 
-        The ``response`` is the output of other requests keywords like ``Get Request``.
+        ``response`` is the output of other requests keywords like `GET On Session`.
 
-        A custom message ``msg`` can be added to work like built in keywords.
+        In case of failure an HTTPError will be automatically raised.
+        A custom failure message ``msg`` can be added like in built-in keywords.
+
+        `* On Session` keywords (like `GET On Session`) already have an implicit assert mechanism, that by default,
+        verifies the response status code.
+        `Status Should Be` keyword can be useful to do an explicit assert in case of `* On Session` keyword with
+        ``expected_status=anything`` to disable implicit assert.
         """
+        # TODO add an example in documentation of GET On Session expected=any than assert
+
         self._check_status(expected_status, response, msg)
 
+    @keyword("Request Should Be Successful")
     def request_should_be_successful(self, response):
         """
         Fails if response status code is a client or server error (4xx, 5xx).
 
-        The ``response`` is the output of other requests keywords like ``Get Request``.
+        ``response`` is the output of other requests keywords like `GET On Session`.
 
         In case of failure an HTTPError will be automatically raised.
+        A custom failure message ``msg`` can be added like in built-in keywords.
+
+        For a more versatile assert keyword see `Status Should Be`.
         """
         self._check_status(None, response, msg=None)
 
-    def _common_request(
-            self,
-            method,
-            session,
-            uri,
-            **kwargs):
-
-        method_function = getattr(session, method)
-        self._capture_output()
-
-        resp = method_function(
-            self._get_url(session, uri),
-            params=utils.utf8_urlencode(kwargs.pop('params', None)),
-            timeout=self._get_timeout(kwargs.pop('timeout', None)),
-            cookies=self.cookies,
-            verify=self.verify,
-            **kwargs)
-
-        log.log_request(resp)
-        self._print_debug()
-        session.last_resp = resp
-        log.log_response(resp)
-
-        data = kwargs.get('data', None)
-        if is_file_descriptor(data):
-            data.close()
-
-        return resp
-
     @staticmethod
+    @keyword("Get File For Streaming Upload")
     def get_file_for_streaming_upload(path):
         """
         Opens and returns a file descriptor of a specified file to be passed as ``data`` parameter
@@ -968,64 +64,3 @@ def get_file_for_streaming_upload(path):
         if used outside this library it's up to the caller to close it.
         """
         return open(path, 'rb')
-
-    @staticmethod
-    def _check_status(expected_status, resp, msg=None):
-        """
-        Helper method to check HTTP status
-        """
-        if not isinstance(resp, Response):
-            raise InvalidResponse(resp)
-        if expected_status is None:
-            resp.raise_for_status()
-        else:
-            try:
-                expected_status = int(expected_status)
-            except ValueError:
-
-                expected_status = utils.parse_named_status(expected_status)
-            msg = '' if msg is None else '{} '.format(msg)
-            msg = "{}Url: {} Expected status".format(msg, resp.url)
-            assert_equal(resp.status_code, expected_status, msg)
-
-    @staticmethod
-    def _get_url(session, uri):
-        """
-        Helper method to get the full url
-        """
-        url = session.url
-        if uri:
-            slash = '' if uri.startswith('/') else '/'
-            url = "%s%s%s" % (session.url, slash, uri)
-        return url
-
-    def _get_timeout(self, timeout):
-        return float(timeout) if timeout is not None else self.timeout
-
-    def _capture_output(self):
-        if self.debug >= 1:
-            self.http_log = WritableObject()
-            sys.stdout = self.http_log
-
-    def _print_debug(self):
-        if self.debug >= 1:
-            sys.stdout = sys.__stdout__  # Restore stdout
-            if PY3:
-                debug_info = ''.join(
-                    self.http_log.content).replace(
-                    '\\r',
-                    '').replace(
-                    '\'',
-                    '')
-            else:
-                debug_info = ''.join(
-                    self.http_log.content).replace(
-                    '\\r',
-                    '').decode('string_escape').replace(
-                    '\'',
-                    '')
-
-            # Remove empty lines
-            debug_info = "\n".join(
-                [ll.rstrip() for ll in debug_info.splitlines() if ll.strip()])
-            logger.debug(debug_info)
diff --git a/src/RequestsLibrary/RequestsOnSessionKeywords.py b/src/RequestsLibrary/RequestsOnSessionKeywords.py
new file mode 100644
index 00000000..d48e0659
--- /dev/null
+++ b/src/RequestsLibrary/RequestsOnSessionKeywords.py
@@ -0,0 +1,213 @@
+from robot.api.deco import keyword
+
+from RequestsLibrary.utils import warn_if_equal_symbol_in_url
+from .SessionKeywords import SessionKeywords
+
+
+class RequestsOnSessionKeywords(SessionKeywords):
+
+    @warn_if_equal_symbol_in_url
+    @keyword("GET On Session")
+    def get_on_session(self, alias, url, params=None,
+                       expected_status=None, msg=None, **kwargs):
+        """
+        Sends a GET request on a previously created HTTP Session.
+
+        Session will be identified using the ``alias`` name.
+        The endpoint used to retrieve the resource is the ``url``, while query
+        string parameters can be passed as string, dictionary (or list of tuples or bytes)
+        through the ``params``.
+
+        By default this keyword fails if a status code with error values is returned in the response,
+        this behavior can be modified using the ``expected_status`` and ``msg`` parameters,
+        read more about it in `Status Should Be` keyword documentation.
+        In order to disable this implicit assert mechanism you can pass as ``expected_status`` the values ``any`` or
+        ``anything``.
+
+        Other optional requests arguments can be passed using ``**kwargs`` here is a list:
+
+        | ``data``     | Dictionary, list of tuples, bytes, or file-like object to send in the body of the request. |
+        | ``json``     | A JSON serializable Python object to send in the body of the request. |
+        | ``headers``  | Dictionary of HTTP Headers to send with the request. |
+        | ``cookies``  | Dict or CookieJar object to send with the request. |
+        | ``files``    | Dictionary of file-like-objects (or ``{'name': file-tuple}``) for multipart encoding upload. |
+        | ``file-tuple`` | can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers to add for the file. |
+        | ``auth`` | Auth tuple to enable Basic/Digest/Custom HTTP Auth. |
+        | ``timeout`` | How many seconds to wait for the server to send data before giving up, as a float, or a ``(connect timeout, read timeout)`` tuple. |
+        | ``allow_redirects`` | Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. |
+        | ``proxies`` | Dictionary mapping protocol to the URL of the proxy. |
+        | ``verify``  | Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to ``True``. |
+        | ``stream`` | if ``False``, the response content will be immediately downloaded. |
+        | ``cert`` | if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. |
+
+        For more updated and complete information verify the official Requests api documentation:
+        https://requests.readthedocs.io/en/latest/api/
+
+        """
+        session = self._cache.switch(alias)
+        response = self._common_request("get", session, url,
+                                        params=params, **kwargs)
+        self._check_status(expected_status, response, msg)
+        return response
+
+    @warn_if_equal_symbol_in_url
+    @keyword("POST On Session")
+    def post_on_session(self, alias, url, data=None, json=None,
+                        expected_status=None, msg=None, **kwargs):
+        """
+        Sends a POST request on a previously created HTTP Session.
+
+        Session will be identified using the ``alias`` name.
+        The endpoint used to send the request is the ``url`` parameter, while its body
+        can be passed using ``data`` or ``json`` parameters.
+
+        ``data`` can be a dictionary, list of tuples, bytes, or file-like object.
+        If you want to pass a json body pass a dictionary as ``json`` parameter.
+
+        By default this keyword fails if a status code with error values is returned in the response,
+        this behavior can be modified using the ``expected_status`` and ``msg`` parameters,
+        read more about it in `Status Should Be` keyword documentation.
+        In order to disable this implicit assert mechanism you can pass as ``expected_status`` the values ``any`` or
+        ``anything``.
+
+        Other optional requests arguments can be passed using ``**kwargs``
+        see the `GET On Session` keyword for the complete list.
+        """
+        session = self._cache.switch(alias)
+        response = self._common_request("post", session, url,
+                                        data=data, json=json, **kwargs)
+        self._check_status(expected_status, response, msg)
+        return response
+
+    @warn_if_equal_symbol_in_url
+    @keyword("PATCH On Session")
+    def patch_on_session(self, alias, url, data=None, json=None,
+                         expected_status=None, msg=None, **kwargs):
+        """
+        Sends a PATCH request on a previously created HTTP Session.
+
+        Session will be identified using the ``alias`` name.
+        The endpoint used to send the request is the ``url`` parameter, while its body
+        can be passed using ``data`` or ``json`` parameters.
+
+        ``data`` can be a dictionary, list of tuples, bytes, or file-like object.
+        If you want to pass a json body pass a dictionary as ``json`` parameter.
+
+        By default this keyword fails if a status code with error values is returned in the response,
+        this behavior can be modified using the ``expected_status`` and ``msg`` parameters,
+        read more about it in `Status Should Be` keyword documentation.
+        In order to disable this implicit assert mechanism you can pass as ``expected_status`` the values ``any`` or
+        ``anything``.
+
+        Other optional requests arguments can be passed using ``**kwargs``
+        see the `GET On Session` keyword for the complete list.
+        """
+        session = self._cache.switch(alias)
+        response = self._common_request("patch", session, url,
+                                        data=data, json=json, **kwargs)
+        self._check_status(expected_status, response, msg)
+        return response
+
+    @warn_if_equal_symbol_in_url
+    @keyword("PUT On Session")
+    def put_on_session(self, alias, url, data=None, json=None,
+                       expected_status=None, msg=None, **kwargs):
+        """
+        Sends a PUT request on a previously created HTTP Session.
+
+        Session will be identified using the ``alias`` name.
+        The endpoint used to send the request is the ``url`` parameter, while its body
+        can be passed using ``data`` or ``json`` parameters.
+
+        ``data`` can be a dictionary, list of tuples, bytes, or file-like object.
+        If you want to pass a json body pass a dictionary as ``json`` parameter.
+
+        By default this keyword fails if a status code with error values is returned in the response,
+        this behavior can be modified using the ``expected_status`` and ``msg`` parameters,
+        read more about it in `Status Should Be` keyword documentation.
+        In order to disable this implicit assert mechanism you can pass as ``expected_status`` the values ``any`` or
+        ``anything``.
+
+        Other optional requests arguments can be passed using ``**kwargs``
+        see the `GET On Session` keyword for the complete list.
+        """
+        session = self._cache.switch(alias)
+        response = self._common_request("put", session, url,
+                                        data=data, json=json, **kwargs)
+        self._check_status(expected_status, response, msg)
+        return response
+
+    @warn_if_equal_symbol_in_url
+    @keyword('DELETE On Session')
+    def delete_on_session(self, alias, url,
+                          expected_status=None, msg=None, **kwargs):
+        """
+        Sends a DELETE request on a previously created HTTP Session.
+
+        Session will be identified using the ``alias`` name.
+        The endpoint used to send the request is the ``url`` parameter.
+
+        By default this keyword fails if a status code with error values is returned in the response,
+        this behavior can be modified using the ``expected_status`` and ``msg`` parameters,
+        read more about it in `Status Should Be` keyword documentation.
+        In order to disable this implicit assert mechanism you can pass as ``expected_status`` the values ``any`` or
+        ``anything``.
+
+        Other optional requests arguments can be passed using ``**kwargs``
+        see the `GET On Session` keyword for the complete list.
+        """
+        session = self._cache.switch(alias)
+        response = self._common_request("delete", session, url, **kwargs)
+        self._check_status(expected_status, response, msg)
+        return response
+
+    @warn_if_equal_symbol_in_url
+    @keyword("HEAD On Session")
+    def head_on_session(self, alias, url,
+                        expected_status=None, msg=None, **kwargs):
+        """
+        Sends a HEAD request on a previously created HTTP Session.
+
+        Session will be identified using the ``alias`` name.
+        The endpoint used to retrieve the HTTP headers is the ``url``.
+
+        ``allow_redirects`` parameter is not provided, it will be set to `False` (as
+        opposed to the default behavior).
+
+        By default this keyword fails if a status code with error values is returned in the response,
+        this behavior can be modified using the ``expected_status`` and ``msg`` parameters,
+        read more about it in `Status Should Be` keyword documentation.
+        In order to disable this implicit assert mechanism you can pass as ``expected_status`` the values ``any`` or
+        ``anything``.
+
+        Other optional requests arguments can be passed using ``**kwargs``
+        see the `GET On Session` keyword for the complete list.
+        """
+        session = self._cache.switch(alias)
+        response = self._common_request("head", session, url, **kwargs)
+        self._check_status(expected_status, response, msg)
+        return response
+
+    @warn_if_equal_symbol_in_url
+    @keyword("OPTIONS On Session")
+    def options_on_session(self, alias, url,
+                           expected_status=None, msg=None, **kwargs):
+        """
+        Sends a OPTIONS request on a previously created HTTP Session.
+
+        Session will be identified using the ``alias`` name.
+        The endpoint used to retrieve the resource is the ``url``.
+
+        By default this keyword fails if a status code with error values is returned in the response,
+        this behavior can be modified using the ``expected_status`` and ``msg`` parameters,
+        read more about it in `Status Should Be` keyword documentation.
+        In order to disable this implicit assert mechanism you can pass as ``expected_status`` the values ``any`` or
+        ``anything``.
+
+        Other optional requests arguments can be passed using ``**kwargs``
+        see the `GET On Session` keyword for the complete list.
+        """
+        session = self._cache.switch(alias)
+        response = self._common_request("options", session, url, **kwargs)
+        self._check_status(expected_status, response, msg)
+        return response
diff --git a/src/RequestsLibrary/SessionKeywords.py b/src/RequestsLibrary/SessionKeywords.py
new file mode 100644
index 00000000..c821320a
--- /dev/null
+++ b/src/RequestsLibrary/SessionKeywords.py
@@ -0,0 +1,651 @@
+import sys
+import logging
+
+import requests
+from requests.cookies import merge_cookies
+from requests.sessions import merge_setting
+from requests.models import Response
+
+from robot.api import logger
+from robot.api.deco import keyword
+from robot.utils.asserts import assert_equal
+
+from RequestsLibrary import utils, log
+from RequestsLibrary.compat import httplib, PY3, RetryAdapter
+from .RequestsKeywords import RequestsKeywords
+from RequestsLibrary.exceptions import InvalidResponse, InvalidExpectedStatus
+from RequestsLibrary.utils import is_file_descriptor, is_string_type
+
+try:
+    from requests_ntlm import HttpNtlmAuth
+except ImportError:
+    pass
+
+
+class SessionKeywords(RequestsKeywords):
+    DEFAULT_RETRY_METHOD_LIST = RetryAdapter.get_default_allowed_methods()
+
+    def _create_session(
+            self,
+            alias,
+            url,
+            headers,
+            cookies,
+            auth,
+            timeout,
+            proxies,
+            verify,
+            debug,
+            max_retries,
+            backoff_factor,
+            disable_warnings,
+            retry_status_list,
+            retry_method_list):
+
+        logger.debug('Creating session: %s' % alias)
+        s = session = requests.Session()
+        s.headers.update(headers)
+        s.auth = auth if auth else s.auth
+        s.proxies = proxies if proxies else s.proxies
+
+        try:
+            max_retries = int(max_retries)
+            retry_status_list = [int(x) for x in retry_status_list] if retry_status_list else None
+        except ValueError as err:
+            raise ValueError("Error converting session parameter: %s" % err)
+
+        if max_retries > 0:
+            retry = RetryAdapter(total=max_retries,
+                                 backoff_factor=backoff_factor,
+                                 status_forcelist=retry_status_list,
+                                 allowed_methods=retry_method_list)
+            http = requests.adapters.HTTPAdapter(max_retries=retry)
+            https = requests.adapters.HTTPAdapter(max_retries=retry)
+
+            # Replace the session's original adapters
+            s.mount('http://', http)
+            s.mount('https://', https)
+
+        # Disable requests warnings, useful when you have large number of testcase
+        # you will observe drastical changes in Robot log.html and output.xml files size
+        if disable_warnings:
+            # you need to initialize logging, otherwise you will not see anything from requests
+            logging.basicConfig()
+            logging.getLogger().setLevel(logging.ERROR)
+            requests_log = logging.getLogger("requests")
+            requests_log.setLevel(logging.ERROR)
+            requests_log.propagate = True
+            if not verify:
+                requests.packages.urllib3.disable_warnings()
+
+        # verify can be a Boolean or a String
+        if isinstance(verify, bool):
+            s.verify = verify
+        elif utils.is_string_type(verify):
+            if verify.lower() == 'true' or verify.lower() == 'false':
+                s.verify = self.builtin.convert_to_boolean(verify)
+            else:
+                # String for CA_BUNDLE, not a Boolean String
+                s.verify = verify
+        else:
+            # not a Boolean nor a String
+            s.verify = verify
+
+        # cant pass these into the Session anymore
+        self.timeout = float(timeout) if timeout is not None else None
+        self.cookies = cookies
+        self.verify = verify if self.builtin.convert_to_boolean(verify) is not True else None
+
+        s.url = url
+
+        # Enable http verbosity
+        if int(debug) >= 1:
+            self.debug = int(debug)
+            httplib.HTTPConnection.debuglevel = self.debug
+
+        self._cache.register(session, alias=alias)
+        return session
+
+    @keyword("Create Session")
+    def create_session(self,
+                       alias,
+                       url,
+                       headers={},
+                       cookies={},
+                       auth=None,
+                       timeout=None,
+                       proxies=None,
+                       verify=False,
+                       debug=0,
+                       max_retries=3,
+                       backoff_factor=0.10,
+                       disable_warnings=0,
+                       retry_status_list=[],
+                       retry_method_list=DEFAULT_RETRY_METHOD_LIST):
+        """ Create Session: create a HTTP session to a server
+
+        ``alias`` Robot Framework alias to identify the session
+
+        ``url`` Base url of the server
+
+        ``headers`` Dictionary of default headers
+
+        ``cookies`` Dictionary of cookies
+
+        ``auth`` List of username & password for HTTP Basic Auth
+
+        ``timeout`` Connection timeout
+
+        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
+
+        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
+
+        ``debug`` Enable http verbosity option more information
+                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
+
+        ``max_retries`` Number of maximum retries each connection should attempt.
+                        By default it will retry 3 times in case of connection errors only.
+                        A 0 value will disable any kind of retries regardless of other retry settings.
+                        In case the number of retries is reached a retry exception is raised.
+
+        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
+
+        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
+                           eg. if backoff_factor is set to 0.1
+                           the sleep between attemps will be: 0.0, 0.2, 0.4
+                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
+
+        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
+                              By default retries are allowed only on HTTP requests methods that are considered to be
+                              idempotent (multiple requests with the same parameters end with the same state).
+                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
+
+        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
+                              eg. set to [502, 503] to retry requests if those status are returned.
+                              Note that max_retries must be greater than 0.
+
+        """
+        auth = requests.auth.HTTPBasicAuth(*auth) if auth else None
+
+        logger.info('Creating Session using : alias=%s, url=%s, headers=%s, \
+                    cookies=%s, auth=%s, timeout=%s, proxies=%s, verify=%s, \
+                    debug=%s ' % (alias, url, headers, cookies, auth, timeout,
+                                  proxies, verify, debug))
+        return self._create_session(
+            alias=alias,
+            url=url,
+            headers=headers,
+            cookies=cookies,
+            auth=auth,
+            timeout=timeout,
+            max_retries=max_retries,
+            backoff_factor=backoff_factor,
+            proxies=proxies,
+            verify=verify,
+            debug=debug,
+            disable_warnings=disable_warnings,
+            retry_status_list=retry_status_list,
+            retry_method_list=retry_method_list)
+
+    @keyword("Create Client Cert Session")
+    def create_client_cert_session(
+            self,
+            alias,
+            url,
+            headers={},
+            cookies={},
+            client_certs=None,
+            timeout=None,
+            proxies=None,
+            verify=False,
+            debug=0,
+            max_retries=3,
+            backoff_factor=0.10,
+            disable_warnings=0,
+            retry_status_list=[],
+            retry_method_list=DEFAULT_RETRY_METHOD_LIST):
+        """ Create Session: create a HTTP session to a server
+
+        ``url`` Base url of the server
+
+        ``alias`` Robot Framework alias to identify the session
+
+        ``headers`` Dictionary of default headers
+
+        ``cookies`` Dictionary of cookies
+
+        ``client_certs`` ['client certificate', 'client key'] PEM files containing the client key and certificate
+
+        ``timeout`` Connection timeout
+
+        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
+
+        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
+                 Defaults to False.
+
+        ``debug`` Enable http verbosity option more information
+                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
+
+        ``max_retries`` Number of maximum retries each connection should attempt.
+                        By default it will retry 3 times in case of connection errors only.
+                        A 0 value will disable any kind of retries regardless of other retry settings.
+                        In case the number of retries is reached a retry exception is raised.
+
+        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
+
+        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
+                           eg. if backoff_factor is set to 0.1
+                           the sleep between attemps will be: 0.0, 0.2, 0.4
+                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
+
+        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
+                              By default retries are allowed only on HTTP requests methods that are considered to be
+                              idempotent (multiple requests with the same parameters end with the same state).
+                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
+
+        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
+                              eg. set to [502, 503] to retry requests if those status are returned.
+                              Note that max_retries must be greater than 0.
+        """
+
+        logger.info('Creating Session using : alias=%s, url=%s, headers=%s, \
+                    cookies=%s, client_certs=%s, timeout=%s, proxies=%s, verify=%s, \
+                    debug=%s ' % (alias, url, headers, cookies, client_certs, timeout,
+                                  proxies, verify, debug))
+
+        session = self._create_session(
+            alias=alias,
+            url=url,
+            headers=headers,
+            cookies=cookies,
+            auth=None,
+            timeout=timeout,
+            max_retries=max_retries,
+            backoff_factor=backoff_factor,
+            proxies=proxies,
+            verify=verify,
+            debug=debug,
+            disable_warnings=disable_warnings,
+            retry_status_list=retry_status_list,
+            retry_method_list=retry_method_list)
+
+        session.cert = tuple(client_certs)
+        return session
+
+    @keyword("Create Custom Session")
+    def create_custom_session(
+            self,
+            alias,
+            url,
+            auth,
+            headers={},
+            cookies={},
+            timeout=None,
+            proxies=None,
+            verify=False,
+            debug=0,
+            max_retries=3,
+            backoff_factor=0.10,
+            disable_warnings=0,
+            retry_status_list=[],
+            retry_method_list=DEFAULT_RETRY_METHOD_LIST):
+        """ Create Session: create a HTTP session to a server
+
+        ``url`` Base url of the server
+
+        ``alias`` Robot Framework alias to identify the session
+
+        ``headers`` Dictionary of default headers
+
+        ``cookies`` Dictionary of cookies
+
+        ``auth`` A Custom Authentication object to be passed on to the requests library.
+                http://docs.python-requests.org/en/master/user/advanced/#custom-authentication
+
+        ``timeout`` Connection timeout
+
+        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
+
+        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
+                 Defaults to False.
+
+        ``debug`` Enable http verbosity option more information
+                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
+
+        ``max_retries`` Number of maximum retries each connection should attempt.
+                        By default it will retry 3 times in case of connection errors only.
+                        A 0 value will disable any kind of retries regardless of other retry settings.
+                        In case the number of retries is reached a retry exception is raised.
+
+        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
+
+        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
+                           eg. if backoff_factor is set to 0.1
+                           the sleep between attemps will be: 0.0, 0.2, 0.4
+                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
+
+        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
+                              By default retries are allowed only on HTTP requests methods that are considered to be
+                              idempotent (multiple requests with the same parameters end with the same state).
+                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
+
+        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
+                              eg. set to [502, 503] to retry requests if those status are returned.
+                              Note that max_retries must be greater than 0.
+        """
+
+        logger.info('Creating Custom Authenticated Session using : alias=%s, url=%s, headers=%s, \
+                    cookies=%s, auth=%s, timeout=%s, proxies=%s, verify=%s, \
+                    debug=%s ' % (alias, url, headers, cookies, auth, timeout,
+                                  proxies, verify, debug))
+
+        return self._create_session(
+            alias=alias,
+            url=url,
+            headers=headers,
+            cookies=cookies,
+            auth=auth,
+            timeout=timeout,
+            max_retries=max_retries,
+            backoff_factor=backoff_factor,
+            proxies=proxies,
+            verify=verify,
+            debug=debug,
+            disable_warnings=disable_warnings,
+            retry_status_list=retry_status_list,
+            retry_method_list=retry_method_list)
+
+    @keyword("Create Digest Session")
+    def create_digest_session(
+            self,
+            alias,
+            url,
+            auth,
+            headers={},
+            cookies={},
+            timeout=None,
+            proxies=None, verify=False,
+            debug=0,
+            max_retries=3,
+            backoff_factor=0.10,
+            disable_warnings=0,
+            retry_status_list=[],
+            retry_method_list=DEFAULT_RETRY_METHOD_LIST):
+        """ Create Session: create a HTTP session to a server
+
+        ``url`` Base url of the server
+
+        ``alias`` Robot Framework alias to identify the session
+
+        ``headers`` Dictionary of default headers
+
+        ``cookies`` Dictionary of cookies
+
+        ``auth`` ['DOMAIN', 'username', 'password'] for NTLM Authentication
+
+        ``timeout`` Connection timeout
+
+        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
+
+        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
+                 Defaults to False.
+
+        ``debug`` Enable http verbosity option more information
+                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
+
+        ``max_retries`` Number of maximum retries each connection should attempt.
+                        By default it will retry 3 times in case of connection errors only.
+                        A 0 value will disable any kind of retries regardless of other retry settings.
+                        In case the number of retries is reached a retry exception is raised.
+
+        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
+
+        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
+                           eg. if backoff_factor is set to 0.1
+                           the sleep between attemps will be: 0.0, 0.2, 0.4
+                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
+
+        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
+                              By default retries are allowed only on HTTP requests methods that are considered to be
+                              idempotent (multiple requests with the same parameters end with the same state).
+                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
+
+        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
+                              eg. set to [502, 503] to retry requests if those status are returned.
+                              Note that max_retries must be greater than 0.
+        """
+        digest_auth = requests.auth.HTTPDigestAuth(*auth) if auth else None
+
+        return self._create_session(
+            alias=alias,
+            url=url,
+            headers=headers,
+            cookies=cookies,
+            auth=digest_auth,
+            timeout=timeout,
+            max_retries=max_retries,
+            backoff_factor=backoff_factor,
+            proxies=proxies,
+            verify=verify,
+            debug=debug,
+            disable_warnings=disable_warnings,
+            retry_status_list=retry_status_list,
+            retry_method_list=retry_method_list)
+
+    @keyword("Create Ntlm Session")
+    def create_ntlm_session(
+            self,
+            alias,
+            url,
+            auth,
+            headers={},
+            cookies={},
+            timeout=None,
+            proxies=None,
+            verify=False,
+            debug=0,
+            max_retries=3,
+            backoff_factor=0.10,
+            disable_warnings=0,
+            retry_status_list=[],
+            retry_method_list=DEFAULT_RETRY_METHOD_LIST):
+        """ Create Session: create a HTTP session to a server
+
+        ``url`` Base url of the server
+
+        ``alias`` Robot Framework alias to identify the session
+
+        ``headers`` Dictionary of default headers
+
+        ``cookies`` Dictionary of cookies
+
+        ``auth`` ['DOMAIN', 'username', 'password'] for NTLM Authentication
+
+        ``timeout`` Connection timeout
+
+        ``proxies`` Dictionary that contains proxy urls for HTTP and HTTPS communication
+
+        ``verify`` Whether the SSL cert will be verified. A CA_BUNDLE path can also be provided.
+                 Defaults to False.
+
+        ``debug`` Enable http verbosity option more information
+                https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.set_debuglevel
+
+        ``max_retries`` Number of maximum retries each connection should attempt.
+                        By default it will retry 3 times in case of connection errors only.
+                        A 0 value will disable any kind of retries regardless of other retry settings.
+                        In case the number of retries is reached a retry exception is raised.
+
+        ``disable_warnings`` Disable requests warning useful when you have large number of testcases
+
+        ``backoff_factor`` Introduces a delay time between retries that is longer after each retry.
+                           eg. if backoff_factor is set to 0.1
+                           the sleep between attemps will be: 0.0, 0.2, 0.4
+                           More info here: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
+
+        ``retry_method_list`` List of uppercased HTTP method verbs where retries are allowed.
+                              By default retries are allowed only on HTTP requests methods that are considered to be
+                              idempotent (multiple requests with the same parameters end with the same state).
+                              eg. set to ['POST', 'GET'] to retry only those kind of requests.
+
+        ``retry_status_list`` List of integer HTTP status codes that, if returned, a retry is attempted.
+                              eg. set to [502, 503] to retry requests if those status are returned.
+                              Note that max_retries must be greater than 0.
+        """
+        try:
+            HttpNtlmAuth
+        except NameError:
+            raise AssertionError('requests_ntlm module not installed')
+        if len(auth) != 3:
+            raise AssertionError('Incorrect number of authentication arguments'
+                                 ' - expected 3, got {}'.format(len(auth)))
+        else:
+            ntlm_auth = HttpNtlmAuth('{}\\{}'.format(auth[0], auth[1]),
+                                     auth[2])
+            logger.info('Creating NTLM Session using : alias=%s, url=%s, \
+                        headers=%s, cookies=%s, ntlm_auth=%s, timeout=%s, \
+                        proxies=%s, verify=%s, debug=%s '
+                        % (alias, url, headers, cookies, ntlm_auth,
+                           timeout, proxies, verify, debug))
+
+            return self._create_session(
+                alias=alias,
+                url=url,
+                headers=headers,
+                cookies=cookies,
+                auth=ntlm_auth,
+                timeout=timeout,
+                max_retries=max_retries,
+                backoff_factor=backoff_factor,
+                proxies=proxies,
+                verify=verify,
+                debug=debug,
+                disable_warnings=disable_warnings,
+                retry_status_list=retry_status_list,
+                retry_method_list=retry_method_list)
+
+    @keyword("Session Exists")
+    def session_exists(self, alias):
+        """Return True if the session has been already created
+
+        ``alias`` that has been used to identify the Session object in the cache
+        """
+        try:
+            self._cache[alias]
+            return True
+        except RuntimeError:
+            return False
+
+    @keyword("Delete All Sessions")
+    def delete_all_sessions(self):
+        """ Removes all the session objects """
+        logger.info('Delete All Sessions')
+
+        self._cache.empty_cache()
+
+    # TODO this is not covered by any tests
+    @keyword("Update Session")
+    def update_session(self, alias, headers=None, cookies=None):
+        """Update Session Headers: update a HTTP Session Headers
+
+        ``alias`` Robot Framework alias to identify the session
+
+        ``headers`` Dictionary of headers merge into session
+        """
+        session = self._cache.switch(alias)
+        session.headers = merge_setting(headers, session.headers)
+        session.cookies = merge_cookies(session.cookies, cookies)
+
+    def _common_request(
+            self,
+            method,
+            session,
+            uri,
+            **kwargs):
+
+        method_function = getattr(session, method)
+        self._capture_output()
+
+        resp = method_function(
+            self._get_url(session, uri),
+            params=utils.utf8_urlencode(kwargs.pop('params', None)),
+            timeout=self._get_timeout(kwargs.pop('timeout', None)),
+            cookies=self.cookies,
+            verify=self.verify,
+            **kwargs)
+
+        log.log_request(resp)
+        self._print_debug()
+        session.last_resp = resp
+        log.log_response(resp)
+
+        data = kwargs.get('data', None)
+        if is_file_descriptor(data):
+            data.close()
+
+        return resp
+
+    @staticmethod
+    def _check_status(expected_status, resp, msg=None):
+        """
+        Helper method to check HTTP status
+        """
+        if not isinstance(resp, Response):
+            raise InvalidResponse(resp)
+        if expected_status is None:
+            resp.raise_for_status()
+        else:
+            if not is_string_type(expected_status):
+                raise InvalidExpectedStatus(expected_status)
+            if expected_status.lower() in ['any', 'anything']:
+                return
+            try:
+                expected_status = int(expected_status)
+            except ValueError:
+                expected_status = utils.parse_named_status(expected_status)
+            msg = '' if msg is None else '{} '.format(msg)
+            msg = "{}Url: {} Expected status".format(msg, resp.url)
+            assert_equal(resp.status_code, expected_status, msg)
+
+    @staticmethod
+    def _get_url(session, uri):
+        """
+        Helper method to get the full url
+        """
+        url = session.url
+        if uri:
+            slash = '' if uri.startswith('/') else '/'
+            url = "%s%s%s" % (session.url, slash, uri)
+        return url
+
+    # FIXME might be broken we need a test for this
+    def _get_timeout(self, timeout):
+        return float(timeout) if timeout is not None else self.timeout
+
+    def _capture_output(self):
+        if self.debug >= 1:
+            self.http_log = utils.WritableObject()
+            sys.stdout = self.http_log
+
+    def _print_debug(self):
+        if self.debug >= 1:
+            sys.stdout = sys.__stdout__  # Restore stdout
+            if PY3:
+                debug_info = ''.join(
+                    self.http_log.content).replace(
+                    '\\r',
+                    '').replace(
+                    '\'',
+                    '')
+            else:
+                debug_info = ''.join(
+                    self.http_log.content).replace(
+                    '\\r',
+                    '').decode('string_escape').replace(
+                    '\'',
+                    '')
+
+            # Remove empty lines
+            debug_info = "\n".join(
+                [ll.rstrip() for ll in debug_info.splitlines() if ll.strip()])
+            logger.debug(debug_info)
diff --git a/src/RequestsLibrary/__init__.py b/src/RequestsLibrary/__init__.py
index 08706acf..4a11a717 100644
--- a/src/RequestsLibrary/__init__.py
+++ b/src/RequestsLibrary/__init__.py
@@ -1,7 +1,79 @@
-from .RequestsKeywords import RequestsKeywords
+from .DeprecatedKeywords import DeprecatedKeywords
+from .RequestsOnSessionKeywords import RequestsOnSessionKeywords
 from .version import VERSION
 
+"""
+** Inheritance structure **
+Not exactly a best practice but forced by the fact that RF libraries
+are instance of a class.
 
-class RequestsLibrary(RequestsKeywords):
+RequestsKeywords (common requests and sessionless keywords)
+    |_ SessionKeywords (session creation and data)
+        |_ DeprecatedKeywords (old keywords that need sessions)
+        |_ RequestsOnSessionKeywords (new keywords that use sessions)
+        
+RequestsLibrary (extends RequestsOnSessionKeywords, DeprecatedKeywords)
+"""
+
+
+class RequestsLibrary(RequestsOnSessionKeywords, DeprecatedKeywords):
+    """ RequestsLibrary is a Robot Framework library aimed to provide HTTP api testing functionalities
+     by wrapping the well known Python Requests Library.
+
+        == Table of contents ==
+
+        %TOC%
+
+        = Usage =
+
+        Before making an HTTP request a new connection needs to be prepared this can be done with `Create Session`
+        keyword. Then you can execute any `* On Session` keywords below some examples:
+
+        |   *** Settings ***
+        |   Library               Collections
+        |   Library               RequestsLibrary
+        |
+        |   Suite Setup           Create Session    jsonplaceholder    https://jsonplaceholder.typicode.com
+        |
+        |   *** Test Cases ***
+        |
+        |   Get Request Test
+        |       Create Session    google             http://www.google.com
+        |
+        |       ${resp_google}=   GET On Session     google             /           expected_status=200
+        |       ${resp_json}=     GET On Session     jsonplaceholder    /posts/1
+        |
+        |       Should Be Equal As Strings           ${resp_google.reason}    OK
+        |       Dictionary Should Contain Value      ${resp_json.json()}    sunt aut facere repellat provident occaecati excepturi optio reprehenderit
+        |
+        |   Post Request Test
+        |       &{data}=          Create dictionary  title=Robotframework requests  body=This is a test!  userId=1
+        |       ${resp}=          POST On Session    jsonplaceholder     /posts    json=${data}
+        |
+        |       Status Should Be                     201    ${resp}
+        |       Dictionary Should Contain Key        ${resp.json()}     id
+
+        = Response Object =
+
+        All the HTTP requests keywords (GET, POST, PUT, etc.) return an extremely useful Response object.
+        The Response object contains a server's response to an HTTP request.
+
+        You can access the different attributes with the dot notation in this way: ``${response.json()}`` or
+        ``${response.text}``. Below the list of the most useful attributes:
+
+        | = Attributes = | = Explanation = |
+        | content | Content of the response, in bytes. |
+        | cookies | A CookieJar of Cookies the server sent back. |
+        | elapsed | The amount of time elapsed between sending the request and the arrival of the response (as a timedelta). This property specifically measures the time taken between sending the first byte of the request and finishing parsing the headers. It is therefore unaffected by consuming the response content or the value of the stream keyword argument. |
+        | encoding | Encoding to decode with when accessing ``response.text.`` |
+        | headers | Case-insensitive Dictionary of Response Headers. For example, ``headers['content-encoding']`` will return the value of a `Content-Encoding' response header. |
+        | history | A list of Response objects from the history of the Request. Any redirect responses will end up here. The list is sorted from the oldest to the most recent request. |
+        | json    | Returns the json-encoded content of a response, if any. Parameters:	``**kwargs`` - Optional arguments that json.loads takes. Raises:	ValueError ? If the response body does not contain valid json. |
+        | ok      | Returns True if status_code is less than 400, False if not. |
+        | reason  | Textual reason of responded HTTP Status, e.g. ``Not Found`` or ``OK``. |
+        | status_code | Integer Code of responded HTTP Status, e.g. 404 or 200. |
+        | text    | Content of the response, in unicode. If ``response.encoding`` is ``None``, encoding will be guessed using chardet. The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set ``response.encoding`` appropriately before accessing this property. |
+        | url     | Final URL location of Response. |
+        """
     __version__ = VERSION
     ROBOT_LIBRARY_SCOPE = 'GLOBAL'
diff --git a/src/RequestsLibrary/compat.py b/src/RequestsLibrary/compat.py
index 1afc42db..0ad443c0 100644
--- a/src/RequestsLibrary/compat.py
+++ b/src/RequestsLibrary/compat.py
@@ -1,4 +1,6 @@
+import copy
 import sys
+from requests.packages.urllib3.util import Retry
 
 PY3 = sys.version_info > (3,)
 
@@ -8,3 +10,22 @@
 else:
     import httplib  # noqa
     from urllib import urlencode  # noqa
+
+
+class RetryAdapter(Retry):
+
+    @staticmethod
+    def get_default_allowed_methods():
+        try:
+            return list(copy.copy(Retry.DEFAULT_ALLOWED_METHODS))
+        except AttributeError:
+            return list(copy.copy(Retry.DEFAULT_METHOD_WHITELIST))
+
+    def __init__(self, **kwargs):
+        try:
+            super(RetryAdapter, self).__init__(**kwargs)
+            # FIXME more specific except
+        except TypeError:
+            value = kwargs.pop('allowed_methods', None)
+            kwargs['method_whitelist'] = value
+            super(RetryAdapter, self).__init__(**kwargs)
diff --git a/src/RequestsLibrary/exceptions.py b/src/RequestsLibrary/exceptions.py
index d89fabe4..2a46f7c1 100644
--- a/src/RequestsLibrary/exceptions.py
+++ b/src/RequestsLibrary/exceptions.py
@@ -4,3 +4,7 @@ class UnknownStatusError(Exception):
 
 class InvalidResponse(Exception):
     pass
+
+
+class InvalidExpectedStatus(Exception):
+    pass
diff --git a/src/RequestsLibrary/log.py b/src/RequestsLibrary/log.py
index 03e3d23d..a603b6e2 100644
--- a/src/RequestsLibrary/log.py
+++ b/src/RequestsLibrary/log.py
@@ -12,6 +12,7 @@ def log_response(response):
                                               response.url) +
                 "status=%s, reason=%s \n " % (response.status_code,
                                               response.reason) +
+                "headers=%s \n " % response.headers +
                 "body=%s \n " % format_data_to_log_string(response.text))
 
 
diff --git a/src/RequestsLibrary/utils.py b/src/RequestsLibrary/utils.py
index de282132..70f745d6 100644
--- a/src/RequestsLibrary/utils.py
+++ b/src/RequestsLibrary/utils.py
@@ -4,11 +4,22 @@
 
 from requests.status_codes import codes
 from requests.structures import CaseInsensitiveDict
+from robot.api import logger
 
 from RequestsLibrary.compat import urlencode, PY3
 from RequestsLibrary.exceptions import UnknownStatusError
 
 
+class WritableObject:
+    """ HTTP stream handler """
+
+    def __init__(self):
+        self.content = []
+
+    def write(self, string):
+        self.content.append(string)
+
+
 def parse_named_status(status_code):
     """
     Converts named status from human readable to integer
@@ -112,3 +123,19 @@ def format_data_according_to_header(session, data, headers):
         data = utf8_urlencode(data)
 
     return data
+
+
+def warn_if_equal_symbol_in_url(func):
+    def decorator(*args, **kwargs):
+        try:
+            args[2]
+        except IndexError:
+            if 'url' not in kwargs:
+                logger.warn("You might have an = symbol in url."
+                            " You better place 'url=' before, example: 'url=/your-url/foo?param=a'"
+                            " or use '/your-url/foo  params=param=a' or escape it")
+
+        return func(*args, **kwargs)
+    decorator.__name__ = func.__name__
+    decorator.__doc__ = func.__doc__
+    return decorator
diff --git a/src/RequestsLibrary/version.py b/src/RequestsLibrary/version.py
index 04ad8de7..f8428b83 100644
--- a/src/RequestsLibrary/version.py
+++ b/src/RequestsLibrary/version.py
@@ -1,1 +1,1 @@
-VERSION = '0.7.2'
+VERSION = '0.8.0'


Test patch:
diff --git a/atests/deprecated_test_to_json.robot b/atests/deprecated_test_to_json.robot
new file mode 100644
index 00000000..ef07a507
--- /dev/null
+++ b/atests/deprecated_test_to_json.robot
@@ -0,0 +1,42 @@
+*** Settings ***
+Library  Collections
+Library  RequestsLibrary
+Resource  res_setup.robot
+
+Suite Setup     Run Keywords  Setup Flask Http Server
+...             Setup Response For Json Tests
+Suite Teardown  Teardown Flask Http Server And Sessions
+
+*** Variables ***
+${resp}         created in the setup
+&{dict_params}  key_one=true    key_two=this is a test string
+
+*** Test Cases ***
+
+Do Not Pretty Print a JSON object
+    [Tags]    json
+    ${jsondata}=    To Json    ${resp.content}
+    Dictionaries Should Be Equal   ${jsondata['args']}    ${dict_params}
+
+Pretty Print a JSON object
+    [Tags]    json
+    Comment    Define json variable.
+    ${output}=    To Json    ${resp.content}    pretty_print=True
+    Should Contain    ${output}    "key_one": "true"
+    Should Contain    ${output}    "key_two": "this is a test string"
+    Should Not Contain    ${output}    {u'key_two': u'this is a test string', u'key_one': u'true'}
+
+Set Pretty Print to non-Boolean value
+    [Tags]    json
+    Comment    Define json variable.
+    ${output}=    To Json    ${resp.content}    pretty_print="Hello"
+    Log    ${output}
+    Should Contain    ${output}    "key_one": "true"
+    Should Contain    ${output}    "key_two": "this is a test string"
+    Should Not Contain    ${output}    {u'key_two': u'this is a test string', u'key_one': u'true'}
+
+*** Keywords ***
+
+Setup Response For Json Tests
+    ${resp}=   GET On Session    ${GLOBAL_SESSION}    /anything    params=${dict_params}
+    Set Suite Variable  ${resp}
diff --git a/atests/issues/17.robot b/atests/issues/17.robot
index fbd96030..dc2d704a 100644
--- a/atests/issues/17.robot
+++ b/atests/issues/17.robot
@@ -1,7 +1,7 @@
 *** Settings ***
 Library  Collections
 Library  String
-Library  ../../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 Library  OperatingSystem
 Suite Teardown  Delete All Sessions
 
@@ -11,6 +11,6 @@ ${JSON_DATA}  '{"file":{"path":"/logo1.png"},"token":"some-valid-oauth-token"}'
 *** Test Cases ***
 Delete Request With Data
     Create Session   httpbin   http://httpbin.org
-    &{headers}=  Create Dictionary  Content-Type=application/json
+    ${headers}=  Create Dictionary  Content-Type=application/json
     ${resp}=   Delete Request   httpbin   /delete   data=${JSON_DATA}   headers=${headers}
     ${jsondata}=   To Json   ${resp.content}
diff --git a/atests/issues/18.robot b/atests/issues/18.robot
index 9c773cd3..5da3629f 100644
--- a/atests/issues/18.robot
+++ b/atests/issues/18.robot
@@ -1,7 +1,7 @@
 *** Settings ***
 Library  Collections
 Library  String
-Library  ../../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 Library  OperatingSystem
 Suite Teardown  Delete All Sessions
 
@@ -11,8 +11,8 @@ ${JSON_DATA}  '{"file":{"path":"/logo1.png"},"token":"some-valid-oauth-token"}'
 *** Test Cases ***
 Encoding Error
     Create Session   httpbin   http://httpbin.org
-    &{headers}=  Create Dictionary  Content-Type=application/json
+    ${headers}=  Create Dictionary  Content-Type=application/json
     Set Suite Variable  ${data}   { "elementToken":"token", "matchCriteria":[{"field":"name","dataType":"string","useOr":"false","fieldValue":"Operation check 07", "closeParen": "false", "openParen": "false", "operator": "equalTo"}], "account": { "annualRevenue": "456666", "name": "Account", "numberOfEmployees": "integer", "billingAddress": { "city": "Miami", "country": "US", "countyOrDistrict": "us or fl", "postalCode": "33131", "stateOrProvince": "florida", "street1": "Trade Center", "street2": "North Main rd" }, "number": "432", "industry": "Bank", "type": "string", "shippingAddress": { "city": "denver", "country": "us", "countyOrDistrict": "us or co", "postalCode": "80202", "stateOrProvince": "colorado", "street1": "Main street", "street2": "101 Avenu"}}}
 
     ${resp}=  Post Request  httpbin  /post  data=${data}  headers=${headers}
-    Should Be Equal As Strings  ${resp.status_code}  200 
+    Should Be Equal As Strings  ${resp.status_code}  200
diff --git a/atests/issues/259.robot b/atests/issues/259.robot
index 8359b1de..325d4553 100644
--- a/atests/issues/259.robot
+++ b/atests/issues/259.robot
@@ -1,5 +1,5 @@
 *** Settings ***
-Library  ../../src/RequestsLibrary/RequestsKeywords.py
+Library   RequestsLibrary
 Resource  ../res_setup.robot
 
 Suite Setup     Setup Flask Http Server
@@ -9,9 +9,9 @@ Suite Teardown  Teardown Flask Http Server And Sessions
 *** Test Cases ***
 Post Content application/json With Empty Data Should Have No Body
     ${content-type}=  Create Dictionary  content-type  application/json
-    ${resp}=  Post Request  ${GLOBAL_LOCAL_SESSION}  /anything  data=${EMPTY}  headers=${content-type}
+    ${resp}=  Post Request  ${GLOBAL_SESSION}  /anything  data=${EMPTY}  headers=${content-type}
     Should Be Empty  ${resp.json()['data']}
 
 Post Content With Empty Data Should Have No Body
-    ${resp}=  Post Request  ${GLOBAL_LOCAL_SESSION}  /anything  data=${EMPTY}
+    ${resp}=  Post Request  ${GLOBAL_SESSION}  /anything  data=${EMPTY}
     Should Be Empty  ${resp.json()['data']}
diff --git a/atests/issues/27.robot b/atests/issues/27.robot
index 75eb42f6..0c9a7c56 100644
--- a/atests/issues/27.robot
+++ b/atests/issues/27.robot
@@ -1,7 +1,7 @@
 *** Settings ***
 Library  Collections
 Library  String
-Library  ../../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 Library  OperatingSystem
 Suite Teardown  Delete All Sessions
 
@@ -11,8 +11,8 @@ Post Request With XML File
     Create Session  httpbin  http://httpbin.org
 
     ${file_data}=  Get File  ${CURDIR}${/}test.xml
-    &{files}=  Create Dictionary  xml=${file_data}
-    &{headers}=  Create Dictionary  Authorization=testing-token
+    ${files}=  Create Dictionary  xml=${file_data}
+    ${headers}=  Create Dictionary  Authorization=testing-token
     Log  ${headers}
     ${resp}=  Post Request  httpbin  /post  files=${files}  headers=${headers}
 
diff --git a/atests/issues/305.robot b/atests/issues/305.robot
index 9904658d..b24d3284 100644
--- a/atests/issues/305.robot
+++ b/atests/issues/305.robot
@@ -1,6 +1,5 @@
 *** Settings ***
-Library  ../../src/RequestsLibrary/RequestsKeywords.py
-
+Library   RequestsLibrary
 
 *** Test Cases ***
 Test NTLM Session without installed library
diff --git a/atests/res_setup.robot b/atests/res_setup.robot
index 3ea908ab..6dfef50c 100644
--- a/atests/res_setup.robot
+++ b/atests/res_setup.robot
@@ -1,11 +1,11 @@
 *** Settings ***
 Library  Process
-Library  ../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 
 
 *** Variables ***
-${GLOBAL_LOCAL_SESSION}     global_local_session
-${HTTP_LOCAL_SERVER}        http://localhost:5000
+${GLOBAL_SESSION}       global_session
+${HTTP_LOCAL_SERVER}    http://localhost:5000
 
 
 *** Keywords ***
@@ -23,13 +23,14 @@ Setup Flask Http Server
     ${flask_cmd} =  Set Variable If
     ...  '${platform}'=='win32'  ${CURDIR}/http_server/run.cmd
     ...  ${CURDIR}/http_server/run.sh
+    # No way to have the return code or other data on the process since it's in background
     Start Process  ${flask_cmd}  cwd=${CURDIR}/http_server/  alias=flask
-    Create Session  ${GLOBAL_LOCAL_SESSION}  ${HTTP_LOCAL_SERVER}
+    Create Session  ${GLOBAL_SESSION}  ${HTTP_LOCAL_SERVER}
     Wait Until Http Server Is Up And Running
 
 Wait Until Http Server Is Up And Running
     Create Session  wait-until-up  ${HTTP_LOCAL_SERVER}  max_retries=10
-    Get Request  wait-until-up  /
+    Get On Session  wait-until-up  /
 
 Teardown Flask Http Server And Sessions
     Delete All Sessions
diff --git a/atests/test_headers.robot b/atests/test_headers.robot
index 9e3a6cd1..53bf5fb6 100644
--- a/atests/test_headers.robot
+++ b/atests/test_headers.robot
@@ -1,7 +1,7 @@
 *** Settings ***
 Library  String
 Library  Collections
-Library  ../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 Resource  res_setup.robot
 
 Suite Setup     Setup Flask Http Server
diff --git a/atests/test_redirect.robot b/atests/test_redirect.robot
index c100bc77..2264d0b4 100644
--- a/atests/test_redirect.robot
+++ b/atests/test_redirect.robot
@@ -1,5 +1,5 @@
 *** Settings ***
-Library  ../src/RequestsLibrary/RequestsKeywords.py
+Library   RequestsLibrary
 Resource  res_setup.robot
 
 Suite Setup     Setup Flask Http Server
@@ -8,51 +8,51 @@ Suite Teardown  Teardown Flask Http Server And Sessions
 *** Test Cases ***
 Get Request With Default Redirection
     [Tags]  get
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /redirect-to?url=anything
     Status Should Be  OK  ${resp}
     Length Should Be  ${resp.history}  1
 
 Get Request With Redirection
     [Tags]  get
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  allow_redirects=${true}
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  allow_redirects=${true}
     Status Should Be  OK  ${resp}
     Length Should Be  ${resp.history}  1
 
 Get Request Without Redirection
     [Tags]  get
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  allow_redirects=${false}
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  allow_redirects=${false}
     Status Should Be  302  ${resp}
     Length Should Be  ${resp.history}  0
 
 # TODO understand whether this is the right behavior or not
 Options Request Without Redirection By Default
     [Tags]  options
-    ${resp}=  Options Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything
+    ${resp}=  Options Request  ${GLOBAL_SESSION}  /redirect-to?url=anything
     Status Should Be  OK  ${resp}
     Length Should Be  ${resp.history}  0
 
 # TODO understand whether this is the right behavior or not
 Options Request With Redirection
     [Tags]  options
-    ${resp}=  Options Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  allow_redirects=${true}
+    ${resp}=  Options Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  allow_redirects=${true}
     Status Should Be  OK  ${resp}
     Length Should Be  ${resp.history}  0
 
 Head Request With Redirection
     [Tags]  head
-    ${resp}=  Head Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  allow_redirects=${true}
+    ${resp}=  Head Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  allow_redirects=${true}
     Status Should Be  OK  ${resp}
     Length Should Be  ${resp.history}  1
 
 Head Request Without Redirection By Default
     [Tags]  head
-    ${resp}=  Head Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything
+    ${resp}=  Head Request  ${GLOBAL_SESSION}  /redirect-to?url=anything
     ${status}=  Convert To String  ${resp.status_code}
     Status Should Be  302  ${resp}
     Length Should Be  ${resp.history}  0
 
 Head Request Without Redirection
-    ${resp}=  Head Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  allow_redirects=${false}
+    ${resp}=  Head Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  allow_redirects=${false}
     ${status}=  Convert To String  ${resp.status_code}
     Status Should Be  302  ${resp}
     Length Should Be  ${resp.history}  0
@@ -62,18 +62,18 @@ Post Request With Redirection
     # FIXME should be 2 different tests
     # FIXME should be verifed also the payload is returned
     # FIXME returned http method should be verified
-    ${resp}=  Post Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  data=something
+    ${resp}=  Post Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  data=something
     Status Should be  OK  ${resp}
     ${redirected_url}=  Catenate  ${HTTP_LOCAL_SERVER}/anything
     Should Be Equal As Strings  ${resp.json()['url']}  ${redirected_url}
-    ${resp}=  Post Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  data=something  allow_redirects=${true}
+    ${resp}=  Post Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  data=something  allow_redirects=${true}
     Status Should be  OK  ${resp}
     ${redirected_url}=  Catenate  ${HTTP_LOCAL_SERVER}/anything
     Should Be Equal As Strings  ${resp.json()['url']}  ${redirected_url}
 
 Post Request Without Redirection
     [Tags]  post
-    ${resp}=  Post Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  data=something  allow_redirects=${false}
+    ${resp}=  Post Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  data=something  allow_redirects=${false}
     Status Should be  302  ${resp}
 
 Put Request With Redirection
@@ -81,16 +81,16 @@ Put Request With Redirection
     # FIXME should be 2 different tests
     # FIXME should be verifed also the payload is returned
     # FIXME returned http method should be verified
-    ${resp}=  Put Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything
+    ${resp}=  Put Request  ${GLOBAL_SESSION}  /redirect-to?url=anything
     Status Should be  OK  ${resp}
     ${redirected_url}=  Catenate  ${HTTP_LOCAL_SERVER}/anything
     Should Be Equal As Strings  ${resp.json()['url']}  ${redirected_url}
-    ${resp}=  Put Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  allow_redirects=${true}
+    ${resp}=  Put Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  allow_redirects=${true}
     Status Should be  OK  ${resp}
     ${redirected_url}=  Catenate  ${HTTP_LOCAL_SERVER}/anything
     Should Be Equal As Strings  ${resp.json()['url']}  ${redirected_url}
 
 Put Request Without Redirection
     [Tags]  put
-    ${resp}=  Put Request  ${GLOBAL_LOCAL_SESSION}  /redirect-to?url=anything  allow_redirects=${false}
+    ${resp}=  Put Request  ${GLOBAL_SESSION}  /redirect-to?url=anything  allow_redirects=${false}
     Status Should be  302  ${resp}
diff --git a/atests/test_request_on_session.robot b/atests/test_request_on_session.robot
new file mode 100644
index 00000000..64116243
--- /dev/null
+++ b/atests/test_request_on_session.robot
@@ -0,0 +1,277 @@
+*** Settings ***
+Library  Collections
+Library  String
+Library  RequestsLibrary
+Resource  res_setup.robot
+
+Suite Setup     Setup Flask Http Server
+Suite Teardown  Teardown Flask Http Server And Sessions
+
+*** Test Cases ***
+Get Request On Existing Session
+    [Tags]  get
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything
+    Status Should Be    OK  ${resp}
+
+Get Request Should Have Get Method
+    [Tags]  get
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything
+    Should Be Equal As Strings    ${resp.json()}[method]  GET
+
+Get Request With Url Params As Dictionary
+    [Tags]  get
+    ${params}=          Create Dictionary   param1=1  param2=2
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything  ${params}
+    Status Should Be    OK  ${resp}
+    Dictionaries Should Be Equal  ${params}  ${resp.json()}[args]
+
+Get Request With Url Params As Kwargs String
+    [Tags]  get
+    ${params}=          Create Dictionary   this_is_a_string=1  p2=2
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything
+    ...                     params=this_is_a_string=1&p2=2
+    Status Should Be    OK  ${resp}
+    Dictionaries Should Be Equal  ${params}  ${resp.json()}[args]
+
+Get Request With Url Params As Escaped String
+    [Tags]  get
+    ${params}=          Create Dictionary   this_is_a_string=1  p2=2
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything
+    ...                     this_is_a_string\=1&p2\=2
+    Status Should Be    OK  ${resp}
+    Dictionaries Should Be Equal  ${params}  ${resp.json()}[args]
+
+Get Request With Url Duplicated Keys In Params
+    [Tags]  get
+    ${array}=          Create List   1  2
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything
+    ...                     params=key=1&key=2
+    Status Should Be    OK  ${resp}
+    Lists Should Be Equal  ${array}  ${resp.json()}[args][key]
+
+Get Request With Url Duplicated Keys In Params And PHP Style Array
+    [Tags]  get
+    ${array}=          Create List   1  2
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything
+    ...                     params=key[]=1&key[]=2
+    Status Should Be    OK  ${resp}
+    Lists Should Be Equal  ${array}  ${resp.json()}[args][key[]]
+
+Get Request With Url Params As PHP Style Array
+    [Tags]  get
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything
+    ...                     params=key[]=1,2
+    Status Should Be    OK  ${resp}
+    Should Be Equal As Strings  1,2  ${resp.json()}[args][key[]]
+
+Get Request With Url Params As Array
+    [Tags]  get
+    ${resp}=            GET On Session  ${GLOBAL_SESSION}  /anything
+    ...                     params=key=[1,2]
+    Status Should Be    OK  ${resp}
+    Should Be Equal As Strings  [1,2]  ${resp.json()}[args][key]
+
+Get Request With Unordered Parameters
+    [Tags]  get
+    ${params}=          Create Dictionary   param1=1  param2=2
+    ${resp}=            GET On Session  params=${params}  alias=${GLOBAL_SESSION}
+    ...                 url=/anything  data=data  expected_status=200
+    Status Should Be    OK  ${resp}
+    Dictionaries Should Be Equal  ${params}  ${resp.json()}[args]
+    Should Be Equal As Strings  data  ${resp.json()}[data]
+
+Get Request And Fail By Default On Http Error
+    [Tags]  get
+    Run Keyword And Expect Error  HTTPError: 400*
+    ...                           GET On Session  ${GLOBAL_SESSION}  /status/400
+
+Get Request And Fail By Expecting A 200 Status
+    [Tags]  get
+    Run Keyword And Expect Error  Url: http://localhost:5000/status/404?param Expected status: 404 != 200
+    ...                           GET On Session  ${GLOBAL_SESSION}  /status/404  param  200
+
+Get Request And Fail By Expecting A 200 Status With A Message
+    [Tags]  get
+    Run Keyword And Expect Error  Custom msg Url: http://localhost:5000/status/404?param Expected status: 404 != 200
+    ...                           GET On Session  ${GLOBAL_SESSION}  /status/404  param  200  Custom msg
+
+Get Request Expect An Error And Evaluate Response
+    [Tags]  get
+    ${resp}=    GET On Session  ${GLOBAL_SESSION}  /status/401  expected_status=401
+    Should Be Equal As Strings  UNAUTHORIZED  ${resp.reason}
+
+Get Request Expect Any Status And Continue On Error
+    [Tags]  get
+    ${resp}=    GET On Session  ${GLOBAL_SESSION}  /status/404  expected_status=ANY
+    Should Be Equal As Strings  NOT FOUND  ${resp.reason}
+
+Get Request Expect Anything Status And Continue On Error
+    [Tags]  get
+    ${resp}=    GET On Session  ${GLOBAL_SESSION}  /status/404  expected_status=Anything
+    Should Be Equal As Strings  NOT FOUND  ${resp.reason}
+
+Post Request On Existing Session
+    [Tags]  post
+    ${resp}=            POST On Session  ${GLOBAL_SESSION}  /anything
+    Status Should Be    OK  ${resp}
+
+Post Request Should Have Post Method
+    [Tags]  Post
+    ${resp}=            POST On Session  ${GLOBAL_SESSION}  /anything
+    Should Be Equal As Strings    ${resp.json()}[method]  POST
+
+Post Request With Data
+    [Tags]  post
+    ${resp}=            POST On Session  ${GLOBAL_SESSION}  /anything  string
+    Status Should Be    OK  ${resp}
+    Should Be Equal As Strings  ${resp.json()}[data]  string
+
+Post Request With Json
+    [Tags]  post
+    ${body}=            Create Dictionary  a=1  b=2
+    ${resp}=            POST On Session  ${GLOBAL_SESSION}  /anything  json=${body}
+    Status Should Be    OK  ${resp}
+    ${data}=            To Json  ${resp.json()}[data]
+    Dictionaries Should Be Equal  ${data}  ${body}
+
+Post Request Expect An Error And Evaluate Response
+    [Tags]  post
+    ${resp}=    POST On Session  ${GLOBAL_SESSION}  /status/401  expected_status=401
+    Should Be Equal As Strings  UNAUTHORIZED  ${resp.reason}
+
+Post Request Expect Anything Status And Continue On Error
+    [Tags]  get
+    ${resp}=    POST On Session  ${GLOBAL_SESSION}  /status/400  expected_status=anything
+    Should Be Equal As Strings  BAD REQUEST  ${resp.reason}
+
+Put Request On Existing Session
+    [Tags]  put
+    ${resp}=            PUT On Session  ${GLOBAL_SESSION}  /anything
+    Status Should Be    OK  ${resp}
+
+Put Request Should Have Put Method
+    [Tags]  Put
+    ${resp}=            PUT On Session  ${GLOBAL_SESSION}  /anything
+    Should Be Equal As Strings    ${resp.json()}[method]  PUT
+
+Put Request With Data
+    [Tags]  put
+    ${resp}=            PUT On Session  ${GLOBAL_SESSION}  /anything  string
+    Status Should Be    OK  ${resp}
+    Should Be Equal As Strings  ${resp.json()}[data]  string
+
+Put Request With Json
+    [Tags]  put
+    ${body}=            Create Dictionary  a=1  b=2
+    ${resp}=            PUT On Session  ${GLOBAL_SESSION}  /anything  json=${body}
+    Status Should Be    OK  ${resp}
+    ${data}=            To Json  ${resp.json()}[data]
+    Dictionaries Should Be Equal  ${data}  ${body}
+
+Put Request Expect An Error And Evaluate Response
+    [Tags]  put
+    ${resp}=    PUT On Session  ${GLOBAL_SESSION}  /status/401  expected_status=401
+    Should Be Equal As Strings  UNAUTHORIZED  ${resp.reason}
+
+Head Request On Existing Session
+    [Tags]  head
+    ${resp}=            HEAD On Session  ${GLOBAL_SESSION}  /anything
+    Status Should Be    OK  ${resp}
+
+Head Request Should Not Have A Body
+    [Tags]  head
+    ${resp}=            HEAD On Session  ${GLOBAL_SESSION}  /anything
+    Should Be Equal As Strings     ${resp.content}   ${Empty}
+
+Head Request With Kwargs Params
+    [Tags]  head
+    ${params}=          Create Dictionary   param1=1  param2=2
+    ${resp}=            HEAD On Session  ${GLOBAL_SESSION}  /anything  params=${params}
+    Status Should Be    OK  ${resp}
+
+Head Request With Header
+    [Tags]  head
+    ${accept_type}=     Set Variable                 application/json
+    ${headers}=         Create Dictionary   Accept   ${accept_type}
+    ${resp}=            HEAD On Session  ${GLOBAL_SESSION}  /anything  headers=${headers}
+    Status Should Be    OK  ${resp}
+    ${content_type_response}=  Get From Dictionary      ${resp.headers}   Content-Type
+    Should Be Equal   ${accept_type}  ${content_type_response}
+
+Head Request And Fail By Default On Http Error
+    [Tags]  head
+    Run Keyword And Expect Error  HTTPError: 400*
+    ...                           HEAD On Session  ${GLOBAL_SESSION}  /status/400
+
+Head Request Expect An Error And Evaluate Response
+    [Tags]  head
+    ${resp}=    HEAD On Session  ${GLOBAL_SESSION}  /status/401  expected_status=401
+    Should Be Equal As Strings  UNAUTHORIZED  ${resp.reason}
+
+Patch Request On Existing Session
+    [Tags]  Patch
+    ${resp}=            PATCH On Session  ${GLOBAL_SESSION}  /anything
+    Status Should Be    OK  ${resp}
+
+Patch Request Should Have Patch Method
+    [Tags]  Patch
+    ${resp}=            PATCH On Session  ${GLOBAL_SESSION}  /anything
+    Should Be Equal As Strings    ${resp.json()}[method]  PATCH
+
+Patch Request With Data
+    [Tags]  Patch
+    ${resp}=            PATCH On Session  ${GLOBAL_SESSION}  /anything  string
+    Status Should Be    OK  ${resp}
+    Should Be Equal As Strings  ${resp.json()}[data]  string
+
+Patch Request With Json
+    [Tags]  Patch
+    ${body}=            Create Dictionary  a=1  b=2
+    ${resp}=            PATCH On Session  ${GLOBAL_SESSION}  /anything  json=${body}
+    Status Should Be    OK  ${resp}
+    ${data}=            To Json  ${resp.json()}[data]
+    Dictionaries Should Be Equal  ${data}  ${body}
+
+Patch Request Expect An Error And Evaluate Response
+    [Tags]  Patch
+    ${resp}=    PATCH On Session  ${GLOBAL_SESSION}  /status/401  expected_status=401
+    Should Be Equal As Strings  UNAUTHORIZED  ${resp.reason}
+
+Delete Request On Existing Session
+    [Tags]  Delete
+    ${resp}=            DELETE On Session  ${GLOBAL_SESSION}  /anything
+    Status Should Be    OK  ${resp}
+
+Delete Request Should Have Delete Method
+    [Tags]  Delete
+    ${resp}=            DELETE On Session  ${GLOBAL_SESSION}  /anything
+    Should Be Equal As Strings    ${resp.json()}[method]  DELETE
+
+Delete Request Expect An Error And Evaluate Response
+    [Tags]  Delete
+    ${resp}=    DELETE On Session  ${GLOBAL_SESSION}  /status/202  expected_status=202
+    Should Be Equal As Strings  ACCEPTED  ${resp.reason}
+
+Options Request On Existing Session
+    [Tags]  options
+    ${resp}=            OPTIONS On Session  ${GLOBAL_SESSION}  /anything
+    Status Should Be    OK  ${resp}
+
+Options Request Check Allow Header
+    [Tags]  options
+    ${allow_header}=    Create List   POST  HEAD  PATCH  GET  TRACE  DELETE  OPTIONS  PUT
+    ${resp}=            OPTIONS On Session  ${GLOBAL_SESSION}  /anything
+    Status Should Be    OK  ${resp}
+    ${allow_response_header}=  Get From Dictionary      ${resp.headers}   Allow
+    ${allow_response_header}=  Split String  ${allow_response_header}  ,${SPACE}
+    Lists Should Be Equal   ${allow_header}  ${allow_response_header}  ignore_order=True
+
+Options Request And Bad Request Not Fail
+    [Tags]  options
+    ${resp}=  OPTIONS On Session  ${GLOBAL_SESSION}  /status/400
+    Status Should Be    OK  ${resp}
+
+Options Request Expect A Success On Unauthorized Request
+    [Tags]  options
+    ${resp}=    OPTIONS On Session  ${GLOBAL_SESSION}  /status/401  expected_status=200
+    Status Should Be    OK  ${resp}
diff --git a/atests/test_request_url_warning.robot b/atests/test_request_url_warning.robot
new file mode 100644
index 00000000..013c54ea
--- /dev/null
+++ b/atests/test_request_url_warning.robot
@@ -0,0 +1,23 @@
+*** Settings ***
+Library  Collections
+Library  String
+Library  RequestsLibrary
+Resource  res_setup.robot
+
+Suite Setup     Setup Flask Http Server
+Suite Teardown  Teardown Flask Http Server And Sessions
+
+*** Test Cases ***
+
+Named URL with = symbol should not have warnings
+   GET On Session  ${GLOBAL_SESSION}  url=/anything?a=a&b=b
+
+Positional URL with = symbol
+   Run Keyword And Expect Error   TypeError:*  GET On Session  ${GLOBAL_SESSION}  /anything?a=a&b=b
+
+Positional URL with '' should not have warnings
+   GET On Session  ${GLOBAL_SESSION}  ${Empty}
+
+Positional URL with None should not have warnings
+   GET On Session  ${GLOBAL_SESSION}  ${None}
+
diff --git a/atests/test_retries.robot b/atests/test_retries.robot
index efec1136..73d38151 100644
--- a/atests/test_retries.robot
+++ b/atests/test_retries.robot
@@ -1,7 +1,7 @@
 *** Settings ***
 Library  String
 Library  Collections
-Library  ../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 Resource  res_setup.robot
 
 Suite Setup     Setup Flask Http Server
diff --git a/atests/test_status_assertions.robot b/atests/test_status_assertions.robot
index d1e115d4..16d681d7 100644
--- a/atests/test_status_assertions.robot
+++ b/atests/test_status_assertions.robot
@@ -1,5 +1,5 @@
 *** Settings ***
-Library  ../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 Resource  res_setup.robot
 
 Suite Setup     Setup Flask Http Server
@@ -10,41 +10,47 @@ Suite Teardown  Teardown Flask Http Server And Sessions
 
 Request And Status Should Be Different
     [Tags]  get  status
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /status/404
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /status/404
     Run Keyword And Expect Error  Url: http://localhost:5000/status/404 Expected status: 404 != 201  Status Should Be  201  ${resp}
 
 Request And Status Should Be Equal
     [Tags]  get  status
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /status/404
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /status/404
     Status Should Be  404  ${resp}
 
 Request And Status Should Be A Named Status Code
     [Tags]  get  status
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /status/418
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /status/418
     Status Should Be  I am a teapot  ${resp}
 
-Request And Status Should Be An Invalid Named Status
+Request And Status Should Be An Unknown Named Status
     [Tags]  get  status
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /status/418
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /status/418
     Run Keyword And Expect Error    UnknownStatusError: i am an alien    Status Should Be  i am an alien  ${resp}
 
 Invalid Response
     [Tags]  get  status
-    Run Keyword And Expect Error  InvalidResponse: this-is-not-a-request*
-    ...  Status Should Be  123   this-is-not-a-request
+    Run Keyword And Expect Error  InvalidResponse: this-is-not-a-response*
+    ...  Status Should Be  123   this-is-not-a-response
 
 Request And Status Should Be With A Message
     [Tags]  get  status
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /status/418
-    Run Keyword And Expect Error  He should be a teapot! Url: http://localhost:5000/status/418 Expected status: 418 != 200
-    ...   Status Should Be  OK  ${resp}  He should be a teapot!
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /status/418
+    Run Keyword And Expect Error  It should be a teapot! Url: http://localhost:5000/status/418 Expected status: 418 != 200
+    ...   Status Should Be  OK  ${resp}  It should be a teapot!
 
 Request Should Be Successful
     [Tags]  get  status
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /status/200
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /status/200
     Request Should Be Successful  ${resp}
 
 Request Should Not Be Successful
     [Tags]  get  status
-    ${resp}=  Get Request  ${GLOBAL_LOCAL_SESSION}  /status/500
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /status/500
     Run Keyword And Expect Error  HTTPError: 500*  Request Should Be Successful  ${resp}
+
+Request And Status Should Be An Invalid Expected Status
+    [Tags]  get  status
+    ${invalid_expected_status}=     Create Dictionary  a=1
+    ${resp}=  Get Request  ${GLOBAL_SESSION}  /status/500
+    Run Keyword And Expect Error   InvalidExpectedStatus*  Status Should Be  ${invalid_expected_status}  ${resp}
diff --git a/atests/test_streaming_uploads.robot b/atests/test_streaming_uploads.robot
index d7bdeed4..fdfd6db9 100644
--- a/atests/test_streaming_uploads.robot
+++ b/atests/test_streaming_uploads.robot
@@ -1,5 +1,5 @@
 *** Settings ***
-Library  ../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 Library  OperatingSystem
 Library  base64Decode.py
 Resource  res_setup.robot
diff --git a/atests/testcase.robot b/atests/testcase.robot
index 808f8c53..66f4b7c0 100644
--- a/atests/testcase.robot
+++ b/atests/testcase.robot
@@ -1,25 +1,37 @@
 *** Settings ***
 Library  Collections
 Library  String
-Library  ../src/RequestsLibrary/RequestsKeywords.py
+Library  RequestsLibrary
 Library  OperatingSystem
 Library  customAuthenticator.py
 Library  base64Decode.py
 Resource  res_setup.robot
 
+Test Setup      Setup Test Session
+Test Teardown   Teardown Test Session
 Suite Setup     Setup Flask Http Server
 Suite Teardown  Teardown Flask Http Server And Sessions
 
+*** Variables ***
+${test_session}     local test session created in Test Setup
+
 *** Test Cases ***
 Readme Test
     [Tags]  get    skip
-    Create Session    github         http://api.github.com
-    Create Session    google         http://www.google.com
-    ${resp}=          Get Request    google               /
-    Status Should Be  200            ${resp}
-    ${resp}=          Get Request    github               /users/bulkan
-    Request Should Be Successful     ${resp}
-    Dictionary Should Contain Value  ${resp.json()}       Bulkan Evcimen
+    Create Session    google             http://www.google.com
+    Create Session    jsonplaceholder    https://jsonplaceholder.typicode.com
+
+    ${resp_google}=   GET On Session     google             /           expected_status=200
+    ${resp_json}=     GET On Session     jsonplaceholder    /posts/1
+
+    Should Be Equal As Strings           ${resp_google.reason}    OK
+    Dictionary Should Contain Value      ${resp_json.json()}    sunt aut facere repellat provident occaecati excepturi optio reprehenderit
+
+    &{data}=        Create dictionary  title=Robotframework requests  body=This is a test!  userId=1
+    ${resp}=        POST On Session    jsonplaceholder     /posts    json=${data}
+
+    Status Should Be                 201    ${resp}
+    Dictionary Should Contain Key    ${resp.json()}     id
 
 Get Requests
     [Tags]  get    skip
@@ -31,23 +43,23 @@ Get Requests
     Should Be Equal As Strings  ${resp.status_code}  200
     Dictionary Should Contain Value  ${resp.json()}  Bulkan Evcimen
 
-Get Requests with Url Parameters
+Get Request with Url Parameters
     [Tags]  get
-    Create Session  httpbin     http://httpbin.org
-    &{params}=   Create Dictionary   key=value     key2=value2
-    ${resp}=     Get Request  httpbin  /get    params=${params}
+    ${params}=   Create Dictionary   key=value     key2=value2
+    ${resp}=     Get Request  ${test_session}  /anything    params=${params}
     Should Be Equal As Strings  ${resp.status_code}  200
-    ${jsondata}=  To Json  ${resp.content}
+    ${jsondata}=  Set Variable  ${resp.json()}
+    Should Be Equal As Strings     ${jsondata['method']}   GET
     Should Be Equal     ${jsondata['args']}     ${params}
 
-Get Requests with Json Data
+Get Request with Json Data
     [Tags]  get
-    Create Session  httpbin     http://httpbin.org
-    &{data}=    Create Dictionary   latitude=30.496346  longitude=-87.640356
-    ${resp}=     Get Request  httpbin  /get    json=${data}
+    ${data}=    Create Dictionary   latitude=30.496346  longitude=-87.640356
+    ${resp}=     Get Request  ${test_session}  /anything    json=${data}
     Should Be Equal As Strings  ${resp.status_code}  200
-    ${jsondata}=  To Json  ${resp.content}
-    # httpbin does not support this... Should Be Equal     ${jsondata['json]}     ${data}
+    ${jsondata}=  Set Variable  ${resp.json()}
+    Should Be Equal As Strings     ${jsondata['method']}   GET
+    Should Be Equal     ${jsondata['json']}     ${data}
 
 Get HTTPS & Verify Cert
     [Tags]  get     get-cert
@@ -94,125 +106,129 @@ Get With Digest Auth
 
 Post Request With URL Params
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org
-    &{params}=   Create Dictionary   key=value     key2=value2
-    ${resp}=  Post Request  httpbin  /post		params=${params}
+    ${params}=   Create Dictionary   key=value     key2=value2
+    ${resp}=  Post Request  ${test_session}  /anything		params=${params}
     Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
 
 Post Requests with Json Data
     [Tags]  post
-    Create Session  httpbin     http://httpbin.org
-    &{data}=    Create Dictionary   latitude=30.496346  longitude=-87.640356
-    ${resp}=     Post Request  httpbin  /post    json=${data}
+    ${data}=    Create Dictionary   latitude=30.496346  longitude=-87.640356
+    ${resp}=     Post Request  ${test_session}  /anything    json=${data}
     Should Be Equal As Strings  ${resp.status_code}  200
-    ${jsondata}=  To Json  ${resp.content}
+    ${jsondata}=  Set Variable  ${resp.json()}
+    Should Be Equal As Strings     ${jsondata['method']}   POST
     Should Be Equal     ${jsondata['json']}     ${data}
 
 Put Requests with Json Data
     [Tags]  put
-    Create Session  httpbin     http://httpbin.org
-    &{data}=    Create Dictionary   latitude=30.496346  longitude=-87.640356
-    ${resp}=     Put Request  httpbin  /put    json=${data}
+    ${data}=    Create Dictionary   latitude=30.496346  longitude=-87.640356
+    ${resp}=     Put Request  ${test_session}  /anything    json=${data}
     Should Be Equal As Strings  ${resp.status_code}  200
-    ${jsondata}=  To Json  ${resp.content}
+    ${jsondata}=  Set Variable  ${resp.json()}
+    Should Be Equal As Strings     ${jsondata['method']}   PUT
     Should Be Equal     ${jsondata['json']}     ${data}
 
 Post Request With No Data
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org
-    ${resp}=  Post Request  httpbin  /post
+    ${resp}=  Post Request  ${test_session}  /anything
     Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
 
 Put Request With No Data
     [Tags]  put
-    Create Session  httpbin  http://httpbin.org
-    ${resp}=  Put Request  httpbin  /put
+    ${resp}=  Put Request  ${test_session}  /anything
     Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   PUT
 
 Post Request With No Dictionary
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org    debug=3
-    Set Test Variable  ${data}  some content
-    ${resp}=  Post Request  httpbin  /post  data=${data}
+    ${data}=  Set Variable  some content
+    ${resp}=  Post Request  ${test_session}  /anything  data=${data}
     Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
     Should Contain  ${resp.text}  ${data}
 
 Put Request With URL Params
     [Tags]  put
-    Create Session  httpbin  http://httpbin.org
-    &{params}=   Create Dictionary   key=value     key2=value2
-    ${resp}=  Put Request  httpbin  /put  params=${params}
+    ${params}=   Create Dictionary   key=value     key2=value2
+    ${resp}=  Put Request  ${test_session}  /anything  params=${params}
     Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   PUT
+
 
 Put Request With No Dictionary
     [Tags]  put
-    Create Session  httpbin  http://httpbin.org
     Set Test Variable  ${data}  some content
-    ${resp}=  Put Request  httpbin  /put  data=${data}
+    ${resp}=  Put Request  ${test_session}  /anything  data=${data}
     Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   PUT
     Should Contain  ${resp.text}  ${data}
 
-Post Requests
+Post Request
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org
-    &{data}=  Create Dictionary  name=bulkan  surname=evcimen
-    &{headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
-    ${resp}=  Post Request  httpbin  /post  data=${data}  headers=${headers}
+    ${data}=  Create Dictionary  name=bulkan  surname=evcimen
+    ${headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
+    ${resp}=  Post Request  ${test_session}  /anything  data=${data}  headers=${headers}
+    Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
     Dictionary Should Contain Value  ${resp.json()['form']}  bulkan
     Dictionary Should Contain Value  ${resp.json()['form']}  evcimen
 
 Post With Unicode Data
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org    debug=3
-    &{data}=  Create Dictionary  name=度假村
-    &{headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
-    ${resp}=  Post Request  httpbin  /post  data=${data}  headers=${headers}
+    ${data}=  Create Dictionary  name=度假村
+    ${headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
+    ${resp}=  Post Request  ${test_session}  /anything  data=${data}  headers=${headers}
+    Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
     Dictionary Should Contain Value  ${resp.json()['form']}  度假村
 
 Post Request With Unicode Data
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org    debug=3
-    &{data}=  Create Dictionary  name=度假村
-    &{headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
-    ${resp}=  Post Request  httpbin  /post  data=${data}  headers=${headers}
+    ${data}=  Create Dictionary  name=度假村
+    ${headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
+    ${resp}=  Post Request  ${test_session}  /anything  data=${data}  headers=${headers}
+    Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
     Dictionary Should Contain Value  ${resp.json()['form']}  度假村
 
 Post Request With Binary Data in Dictionary
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org    debug=3
     ${file_data}=  Get Binary File  ${CURDIR}${/}data.json
-    &{data}=  Create Dictionary  name=${file_data.strip()}
-    &{headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
-    ${resp}=  Post Request  httpbin  /post  data=${data}  headers=${headers}
-    Log  ${resp.json()['form']}
+    ${data}=  Create Dictionary  name=${file_data.strip()}
+    ${headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
+    ${resp}=  Post Request  ${test_session}  /anything  data=${data}  headers=${headers}
+    Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
     Should Contain  ${resp.json()['form']['name']}  \u5ea6\u5047\u6751
 
 Post Request With Binary Data
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org    debug=3
     ${data}=  Get Binary File  ${CURDIR}${/}data.json
-    &{headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
-    ${resp}=  Post Request  httpbin  /post  data=${data}  headers=${headers}
-    Log  ${resp.json()['form']}
+    ${headers}=  Create Dictionary  Content-Type=application/x-www-form-urlencoded
+    ${resp}=  Post Request  ${test_session}  /anything  data=${data}  headers=${headers}
+    Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
     ${value}=  evaluate  list(${resp.json()['form']}.keys())[0]
     Should Contain  ${value}  度假村
 
 Post Request With Arbitrary Binary Data
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org    debug=3
     ${data}=  Get Binary File  ${CURDIR}${/}randombytes.bin
     &{headers}=  Create Dictionary  Content-Type=application/octet-stream   Accept=application/octet-stream
-    ${resp}=  Post Request  httpbin  /post  data=${data}  headers=&{headers}
+    ${resp}=  Post Request  ${test_session}  /anything  data=${data}  headers=&{headers}
     ${receivedData}=  Base64 Decode Data  ${resp.json()['data']}
     Should Be Equal  ${receivedData}  ${data}
 
 Post Request With File
     [Tags]  post
-    Create Session  httpbin  http://httpbin.org
     ${file_data}=  Get Binary File  ${CURDIR}${/}data.json
-    &{files}=  Create Dictionary  file=${file_data}
-    ${resp}=  Post Request  httpbin  /post  files=${files}
-    ${file}=  To Json  ${resp.json()['files']['file']}
+    ${files}=  Create Dictionary  file=${file_data}
+    ${resp}=  Post Request  ${test_session}  /anything  files=${files}
+    Should Be Equal As Strings  ${resp.status_code}  200
+    Should Be Equal As Strings     ${resp.json()['method']}   POST
+    ${file}=  Set Variable  ${{dict(${resp.json()['files']['file']})}}
     Dictionary Should Contain Key  ${file}  one
     Dictionary Should Contain Key  ${file}  two
 
@@ -277,7 +293,7 @@ Delete Requests with Json Data
     &{data}=    Create Dictionary   latitude=30.496346  longitude=-87.640356
     ${resp}=     Delete Request  httpbin  /delete    json=${data}
     Should Be Equal As Strings  ${resp.status_code}  200
-    ${jsondata}=  To Json  ${resp.content}
+    ${jsondata}=  Set Variable  ${resp.json()}
     Should Be Equal     ${jsondata['json']}     ${data}
 
 Patch Requests
@@ -295,39 +311,9 @@ Patch Requests with Json Data
     &{data}=    Create Dictionary   latitude=30.496346  longitude=-87.640356
     ${resp}=     Patch Request  httpbin  /patch    json=${data}
     Should Be Equal As Strings  ${resp.status_code}  200
-    ${jsondata}=  To Json  ${resp.content}
+    ${jsondata}=  Set Variable  ${resp.json()}
     Should Be Equal     ${jsondata['json']}     ${data}
 
-Do Not Pretty Print a JSON object
-    [Tags]    json
-    Comment    Define json variable.
-    &{var}=    Create Dictionary    key_one=true    key_two=this is a test string
-    ${resp}=    Get Request    httpbin    /get    params=${var}
-    Set Suite Variable    ${resp}
-    Should Be Equal As Strings    ${resp.status_code}    200
-    ${jsondata}=    To Json    ${resp.content}
-    Dictionaries Should Be Equal   ${jsondata['args']}    ${var}
-
-Pretty Print a JSON object
-    [Tags]    json
-    Comment    Define json variable.
-    Log    ${resp}
-    ${output}=    To Json    ${resp.content}    pretty_print=True
-    Log    ${output}
-    Should Contain    ${output}    "key_one": "true"
-    Should Contain    ${output}    "key_two": "this is a test string"
-    Should Not Contain    ${output}    {u'key_two': u'this is a test string', u'key_one': u'true'}
-
-Set Pretty Print to non-Boolean value
-    [Tags]    json
-    Comment    Define json variable.
-    Log    ${resp}
-    ${output}=    To Json    ${resp.content}    pretty_print="Hello"
-    Log    ${output}
-    Should Contain    ${output}    "key_one": "true"
-    Should Contain    ${output}    "key_two": "this is a test string"
-    Should Not Contain    ${output}    {u'key_two': u'this is a test string', u'key_one': u'true'}
-
 Create a session and make sure it exists
     [Tags]    session
     Create Session     existing_session  ${HTTP_LOCAL_SERVER}
@@ -342,5 +328,5 @@ Verify a non existing session
 Post Request With Large Truncated Body
     [Tags]  post
     ${html}=  Get File  ${CURDIR}${/}index.html
-    ${resp}=  Post Request  ${GLOBAL_LOCAL_SESSION}  /anything  data=${html}
+    ${resp}=  Post Request  ${test_session}  /anything  data=${html}
     Status Should be  200  ${resp}
diff --git a/utests/test_RequestKeywords.py b/utests/test_RequestKeywords.py
index 9468ee0b..1ec9d00e 100644
--- a/utests/test_RequestKeywords.py
+++ b/utests/test_RequestKeywords.py
@@ -1,13 +1,13 @@
 import os
 
+from RequestsLibrary import RequestsLibrary
 from utests import mock
 
-from RequestsLibrary import RequestsKeywords
 from utests import SCRIPT_DIR
 
 
 def test_common_request_file_descriptor_closing():
-    keywords = RequestsKeywords()
+    keywords = RequestsLibrary()
     session = keywords.create_session('alias', 'http://mocking.rules')
     # this prevents a real network call from being executed
     session.get = mock.MagicMock()
diff --git a/utests/test_RequestsLibrary.py b/utests/test_RequestsLibrary.py
new file mode 100644
index 00000000..86246315
--- /dev/null
+++ b/utests/test_RequestsLibrary.py
@@ -0,0 +1,34 @@
+from RequestsLibrary import RequestsLibrary, DeprecatedKeywords, RequestsOnSessionKeywords
+from RequestsLibrary.RequestsKeywords import RequestsKeywords
+from RequestsLibrary.SessionKeywords import SessionKeywords
+
+
+class TestRequestsLibraryInheritance():
+
+    @classmethod
+    def setup_class(cls):
+        cls.requests_library = RequestsLibrary()
+
+    def test_make_sure_is_instance_of_requests_keywords(self):
+        assert isinstance(self.requests_library, RequestsKeywords)
+
+    def test_make_sure_is_instance_of_session_keywords(self):
+        assert isinstance(self.requests_library, SessionKeywords)
+
+    def test_make_sure_is_instance_of_deprecated_keywords(self):
+        assert isinstance(self.requests_library, DeprecatedKeywords)
+
+    def test_make_sure_is_instance_of_requests_on_session_keywords(self):
+        assert isinstance(self.requests_library, RequestsOnSessionKeywords)
+
+    def test_make_sure_it_has_methods_from_requests_keywords(self):
+        assert hasattr(self.requests_library, '_common_request')
+
+    def test_make_sure_it_has_methods_from_session_keywords(self):
+        assert hasattr(self.requests_library, '_create_session')
+
+    def test_make_sure_it_has_methods_from_deprecated_keywords(self):
+        assert hasattr(self.requests_library, 'get_request')
+
+    def test_make_sure_it_has_methods_from_requests_on_session_keywords(self):
+        assert hasattr(self.requests_library, 'get_on_session')
diff --git a/utests/test_SessionKeywords.py b/utests/test_SessionKeywords.py
new file mode 100644
index 00000000..fef0c5eb
--- /dev/null
+++ b/utests/test_SessionKeywords.py
@@ -0,0 +1,39 @@
+import sys
+import unittest
+
+from RequestsLibrary import compat
+from RequestsLibrary.RequestsKeywords import RequestsKeywords
+from RequestsLibrary.SessionKeywords import SessionKeywords
+
+
+def test_session_class_extends_keywords_class():
+    keywords = SessionKeywords()
+    assert isinstance(keywords, RequestsKeywords)
+
+
+class TestUrlLibWarnings(unittest.TestCase):
+
+    @unittest.skipIf(sys.version_info < (3, 2), "python version doesn't support assertWarns")
+    def test_get_default_retry_method_list_not_raise_warning(self):
+        with self.assertRaises(AssertionError):
+            with self.assertWarns(DeprecationWarning):
+                DEFAULT_RETRY_METHOD_LIST = compat.RetryAdapter.get_default_allowed_methods()
+                assert "GET" in DEFAULT_RETRY_METHOD_LIST
+
+    @unittest.skipIf(sys.version_info < (3, 2), "python version doesn't support assertWarns")
+    def test_init_retry_adapter_not_raise_warning(self):
+        with self.assertRaises(AssertionError):
+            with self.assertWarns(DeprecationWarning):
+                compat.RetryAdapter(total=1,
+                                    backoff_factor=1,
+                                    status_forcelist=[500],
+                                    allowed_methods=['GET'])
+
+    @unittest.skipIf(sys.version_info < (3, 2), "python version doesn't support assertWarns")
+    def test_create_session_retry_not_raise_warning(self):
+        keywords = SessionKeywords()
+        with self.assertRaises(AssertionError):
+            with self.assertWarns(DeprecationWarning):
+                keywords.create_session('alias', 'http://mocking.rules')
+
+
diff --git a/utests/test_log.py b/utests/test_log.py
index 564f3508..9e63a7a8 100644
--- a/utests/test_log.py
+++ b/utests/test_log.py
@@ -87,11 +87,13 @@ def test_log_response(mocked_logger):
     response.status_code = 200
     response.reason = 'OK'
     response.text = "<html>body</html>"
+    response.headers = {'Date': 'Sun, 10 May 2020 22:31:21 GMT', 'Expires': '-1', 'Cache-Control': 'private, max-age=0', 'Content-Type': 'text/html; charset=ISO-8859-1', 'P3P': 'CP="This is not a P3P policy! See g.co/p3phelp for more info."', 'Content-Encoding': 'gzip', 'Server': 'gws', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'Set-Cookie': '1P_JAR=2020-05-10-22; expires=Tue, 09-Jun-2020 22:31:21 GMT; path=/; domain=.google.it; Secure, NID=204=1JvfFtAYLcnQfWYzh5h0K-PttJP8IvuJdcaej_-utCvMHqavyFkwmthddhQZ-sQ6nZkNCWybVUuzTtaNoEK4TD1FG-TA7QIUR2P6-kj-vN0zkjiS4VdfQbxFnfwtIgkBxFDuoAZsoa_oYm0ODjJ4JAZfdXueqrZJ38tDtIOXpVU; expires=Mon, 09-Nov-2020 22:31:21 GMT; path=/; domain=.google.it; HttpOnly', 'Alt-Svc': 'h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"', 'Transfer-Encoding': 'chunked'}
     log_response(response)
     assert mocked_logger.info.call_args[0][0] == ("%s Response : url=%s \n " % (response.request.method.upper(),
                                                                                 response.url) +
                                                   "status=%s, reason=%s \n " % (response.status_code,
                                                                                 response.reason) +
+                                                  "headers=%s \n " % response.headers +
                                                   "body=%s \n " % response.text)
 
 
diff --git a/utests/test_utils.py b/utests/test_utils.py
index 798bf115..51858dbc 100644
--- a/utests/test_utils.py
+++ b/utests/test_utils.py
@@ -1,9 +1,12 @@
 import os
 
+import pytest
 from requests import Session
 
-from RequestsLibrary.utils import is_file_descriptor, merge_headers
+from RequestsLibrary import RequestsLibrary
+from RequestsLibrary.utils import is_file_descriptor, merge_headers, warn_if_equal_symbol_in_url
 from utests import SCRIPT_DIR
+from utests import mock
 
 
 def test_none():
@@ -39,3 +42,33 @@ def test_merge_headers_with_all():
     merged = merge_headers(session, headers)
     session.headers.update(headers)
     assert merged == session.headers
+
+
+@pytest.fixture(scope='function')
+def mocked_keywords():
+    keywords = RequestsLibrary()
+    keywords._cache = mock.MagicMock()
+    keywords._common_request = mock.MagicMock()
+    keywords._check_status = mock.MagicMock()
+    return keywords
+
+
+@mock.patch('RequestsLibrary.utils.logger')
+def test_no_warn_if_url_passed_as_named(mocked_logger, mocked_keywords):
+    mocked_keywords.get_on_session('alias', url='http://this.is.an.url')
+    mocked_logger.warn.assert_not_called()
+
+
+@mock.patch('RequestsLibrary.utils.logger')
+def test_no_warn_if_url_passed_as_positional(mocked_logger, mocked_keywords):
+    mocked_keywords.get_on_session('alias', 'http://this.is.an.url')
+    mocked_logger.warn.assert_not_called()
+
+
+@mock.patch('RequestsLibrary.utils.logger')
+def test_warn_that_url_is_missing(mocked_logger, mocked_keywords):
+    try:
+        mocked_keywords.get_on_session(alias=None)
+    except TypeError:
+        pass
+    mocked_logger.warn.assert_called()