diff --git a/README.md b/README.md index e05a6a3..359869a 100644 --- a/README.md +++ b/README.md @@ -48,18 +48,20 @@ CAUTION: Working inside NuBank will screw up `package-lock.json` file, polluting ### Pedestal API Documentation Pedestal API documentation should be updated after each Pedestal release; this is accomplished via -the `script/gen-api-doc.sh` script. +the `script/gen-api-doc` script. -This generates API documentation into the `api` directory. When deploying, the contents of -the `api` directory are merged with the generated content in `output`. +You must have [Babashka](https://github.com/babashka/babashka) installed to run this script. + +This generates API documentation into the `api` directory; a subdirectory is created, if necessary, +based on the first two terms of the Pedestal version number (e.g., version `0.7.1-alpha-2` would be +written to directory `api/0.7`). + +When deploying, the contents of the `api` directory are merged with the generated content in `output`. The `api` directory is tracked by Git; you should commit and push the changes to ensure that the official CI (Continuous Integration, via a GitHub action) build generates the `pedestal.io` site using the updated API documentation. -NOTE: May change this to a more Antora-friendly approach soon! - - ### Antora Notes On OS X, Antora stores Git repos in `~/Library/Caches/antora/` by default. @@ -76,11 +78,9 @@ Some old directories from the jBake build are still present, such as `content`, and `templates`. They are being kept for reference as UI updates to the Antora-generated site continue. -Publishing of the site is currently to http://pedestal.io/antora/pedestal/0.7-pre/index.html (note the `antora` directory), to keep the current (jBake-generated) site stable. - License ------- -Copyright 2014-2023 Cognitect, Inc. +Copyright 2014-2023 NuBank NA The use and distribution terms for this software are covered by the [Eclipse Public License 1.0](http://opensource.org/licenses/eclipse-1.0) diff --git a/api/0.6/css/default.css b/api/0.6/css/default.css new file mode 100644 index 0000000..33f78fe --- /dev/null +++ b/api/0.6/css/default.css @@ -0,0 +1,551 @@ +body { + font-family: Helvetica, Arial, sans-serif; + font-size: 15px; +} + +pre, code { + font-family: Monaco, DejaVu Sans Mono, Consolas, monospace; + font-size: 9pt; + margin: 15px 0; +} + +h1 { + font-weight: normal; + font-size: 29px; + margin: 10px 0 2px 0; + padding: 0; +} + +h2 { + font-weight: normal; + font-size: 25px; +} + +h5.license { + margin: 9px 0 22px 0; + color: #555; + font-weight: normal; + font-size: 12px; + font-style: italic; +} + +.document h1, .namespace-index h1 { + font-size: 32px; + margin-top: 12px; +} + +#header, #content, .sidebar { + position: fixed; +} + +#header { + top: 0; + left: 0; + right: 0; + height: 22px; + color: #f5f5f5; + padding: 5px 7px; +} + +#content { + top: 32px; + right: 0; + bottom: 0; + overflow: auto; + background: #fff; + color: #333; + padding: 0 18px; +} + +.sidebar { + position: fixed; + top: 32px; + bottom: 0; + overflow: auto; +} + +.sidebar.primary { + background: #e2e2e2; + border-right: solid 1px #cccccc; + left: 0; + width: 250px; +} + +.sidebar.secondary { + background: #f2f2f2; + border-right: solid 1px #d7d7d7; + left: 251px; + width: 200px; +} + +#content.namespace-index, #content.document { + left: 251px; +} + +#content.namespace-docs { + left: 452px; +} + +#content.document { + padding-bottom: 10%; +} + +#header { + background: #3f3f3f; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.4); + z-index: 100; +} + +#header h1 { + margin: 0; + padding: 0; + font-size: 18px; + font-weight: lighter; + text-shadow: -1px -1px 0px #333; +} + +#header h1 .project-version { + font-weight: normal; +} + +.project-version { + padding-left: 0.15em; +} + +#header a, .sidebar a { + display: block; + text-decoration: none; +} + +#header a { + color: #f5f5f5; +} + +.sidebar a { + color: #333; +} + +#header h2 { + float: right; + font-size: 9pt; + font-weight: normal; + margin: 4px 3px; + padding: 0; + color: #bbb; +} + +#header h2 a { + display: inline; +} + +.sidebar h3 { + margin: 0; + padding: 10px 13px 0 13px; + font-size: 19px; + font-weight: lighter; +} + +.sidebar h3 a { + color: #444; +} + +.sidebar h3.no-link { + color: #636363; +} + +.sidebar ul { + padding: 7px 0 6px 0; + margin: 0; +} + +.sidebar ul.index-link { + padding-bottom: 4px; +} + +.sidebar li { + display: block; + vertical-align: middle; +} + +.sidebar li a, .sidebar li .no-link { + border-left: 3px solid transparent; + padding: 0 10px; + white-space: nowrap; +} + +.sidebar li .no-link { + display: block; + color: #777; + font-style: italic; +} + +.sidebar li .inner { + display: inline-block; + padding-top: 7px; + height: 24px; +} + +.sidebar li a, .sidebar li .tree { + height: 31px; +} + +.depth-1 .inner { padding-left: 2px; } +.depth-2 .inner { padding-left: 6px; } +.depth-3 .inner { padding-left: 20px; } +.depth-4 .inner { padding-left: 34px; } +.depth-5 .inner { padding-left: 48px; } +.depth-6 .inner { padding-left: 62px; } + +.sidebar li .tree { + display: block; + float: left; + position: relative; + top: -10px; + margin: 0 4px 0 0; + padding: 0; +} + +.sidebar li.depth-1 .tree { + display: none; +} + +.sidebar li .tree .top, .sidebar li .tree .bottom { + display: block; + margin: 0; + padding: 0; + width: 7px; +} + +.sidebar li .tree .top { + border-left: 1px solid #aaa; + border-bottom: 1px solid #aaa; + height: 19px; +} + +.sidebar li .tree .bottom { + height: 22px; +} + +.sidebar li.branch .tree .bottom { + border-left: 1px solid #aaa; +} + +.sidebar.primary li.current a { + border-left: 3px solid #a33; + color: #a33; +} + +.sidebar.secondary li.current a { + border-left: 3px solid #33a; + color: #33a; +} + +.namespace-index h2 { + margin: 30px 0 0 0; +} + +.namespace-index h3 { + font-size: 16px; + font-weight: bold; + margin-bottom: 0; +} + +.namespace-index .topics { + padding-left: 30px; + margin: 11px 0 0 0; +} + +.namespace-index .topics li { + padding: 5px 0; +} + +.namespace-docs h3 { + font-size: 18px; + font-weight: bold; +} + +.public h3 { + margin: 0; + float: left; +} + +.usage { + clear: both; +} + +.public { + margin: 0; + border-top: 1px solid #e0e0e0; + padding-top: 14px; + padding-bottom: 6px; +} + +.public:last-child { + margin-bottom: 20%; +} + +.members .public:last-child { + margin-bottom: 0; +} + +.members { + margin: 15px 0; +} + +.members h4 { + color: #555; + font-weight: normal; + font-variant: small-caps; + margin: 0 0 5px 0; +} + +.members .inner { + padding-top: 5px; + padding-left: 12px; + margin-top: 2px; + margin-left: 7px; + border-left: 1px solid #bbb; +} + +#content .members .inner h3 { + font-size: 12pt; +} + +.members .public { + border-top: none; + margin-top: 0; + padding-top: 6px; + padding-bottom: 0; +} + +.members .public:first-child { + padding-top: 0; +} + +h4.type, +h4.dynamic, +h4.added, +h4.deprecated { + float: left; + margin: 3px 10px 15px 0; + font-size: 15px; + font-weight: bold; + font-variant: small-caps; +} + +.public h4.type, +.public h4.dynamic, +.public h4.added, +.public h4.deprecated { + font-size: 13px; + font-weight: bold; + margin: 3px 0 0 10px; +} + +.members h4.type, +.members h4.added, +.members h4.deprecated { + margin-top: 1px; +} + +h4.type { + color: #717171; +} + +h4.dynamic { + color: #9933aa; +} + +h4.added { + color: #508820; +} + +h4.deprecated { + color: #880000; +} + +.namespace { + margin-bottom: 30px; +} + +.namespace:last-child { + margin-bottom: 10%; +} + +.index { + padding: 0; + font-size: 80%; + margin: 15px 0; + line-height: 16px; +} + +.index * { + display: inline; +} + +.index p { + padding-right: 3px; +} + +.index li { + padding-right: 5px; +} + +.index ul { + padding-left: 0; +} + +.type-sig { + clear: both; + color: #088; +} + +.type-sig pre { + padding-top: 10px; + margin: 0; +} + +.usage code { + display: block; + color: #008; + margin: 2px 0; +} + +.usage code:first-child { + padding-top: 10px; +} + +p { + margin: 15px 0; +} + +.public p:first-child, .public pre.plaintext { + margin-top: 12px; +} + +.doc { + margin: 0 0 26px 0; + clear: both; +} + +.public .doc { + margin: 0; +} + +.namespace-index .doc { + margin-bottom: 20px; +} + +.namespace-index .namespace .doc { + margin-bottom: 10px; +} + +.markdown p, .markdown li, .markdown dt, .markdown dd, .markdown td { + line-height: 22px; +} + +.markdown li { + padding: 2px 0; +} + +.markdown h2 { + font-weight: normal; + font-size: 25px; + margin: 30px 0 10px 0; +} + +.markdown h3 { + font-weight: normal; + font-size: 20px; + margin: 30px 0 0 0; +} + +.markdown h4 { + font-size: 15px; + margin: 22px 0 -4px 0; +} + +.doc, .public, .namespace .index { + max-width: 680px; + overflow-x: visible; +} + +.markdown pre > code { + display: block; + padding: 10px; +} + +.markdown pre > code, .src-link a { + border: 1px solid #e4e4e4; + border-radius: 2px; +} + +.markdown code:not(.hljs), .src-link a { + background: #f6f6f6; +} + +pre.deps { + display: inline-block; + margin: 0 10px; + border: 1px solid #e4e4e4; + border-radius: 2px; + padding: 10px; + background-color: #f6f6f6; +} + +.markdown hr { + border-style: solid; + border-top: none; + color: #ccc; +} + +.doc ul, .doc ol { + padding-left: 30px; +} + +.doc table { + border-collapse: collapse; + margin: 0 10px; +} + +.doc table td, .doc table th { + border: 1px solid #dddddd; + padding: 4px 6px; +} + +.doc table th { + background: #f2f2f2; +} + +.doc dl { + margin: 0 10px 20px 10px; +} + +.doc dl dt { + font-weight: bold; + margin: 0; + padding: 3px 0; + border-bottom: 1px solid #ddd; +} + +.doc dl dd { + padding: 5px 0; + margin: 0 0 5px 10px; +} + +.doc abbr { + border-bottom: 1px dotted #333; + font-variant: none; + cursor: help; +} + +.src-link { + margin-bottom: 15px; +} + +.src-link a { + font-size: 70%; + padding: 1px 4px; + text-decoration: none; + color: #5555bb; +} diff --git a/api/0.6/css/highlight.css b/api/0.6/css/highlight.css new file mode 100644 index 0000000..d0cdaa3 --- /dev/null +++ b/api/0.6/css/highlight.css @@ -0,0 +1,97 @@ +/* +github.com style (c) Vasily Polovnyov +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/api/0.6/index.html b/api/0.6/index.html new file mode 100644 index 0000000..ec8df1c --- /dev/null +++ b/api/0.6/index.html @@ -0,0 +1,15 @@ + +io.pedestal libraries 0.6.1

io.pedestal libraries 0.6.1

Namespaces

io.pedestal.http.aws.lambda

Public variables and functions:

    io.pedestal.http.container

    Deeper Pedestal<->Container integration and cooperation for HTTP handling

    +

    Public variables and functions:

    io.pedestal.http.cors

    Public variables and functions:

    io.pedestal.http.immutant.container

    Public variables and functions:

      io.pedestal.http.jetty

      Public variables and functions:

      io.pedestal.http.jetty.container

      Public variables and functions:

        io.pedestal.http.route.linear-search

        Public variables and functions:

        io.pedestal.http.route.router

        Public variables and functions:

        io.pedestal.http.servlet

        Generic Servlet adapter that closes over its implementation functions.

        +

        Public variables and functions:

        io.pedestal.interceptor

        Public API for creating interceptors, and various utility fns for common interceptor creation patterns.

        +

        io.pedestal.interceptor.chain

        Interceptor pattern. Executes a chain of Interceptor functions on a common “context” map, maintaining a virtual “stack”, with error handling and support for asynchronous execution.

        +

        Public variables and functions:

        io.pedestal.interceptor.error

        Public variables and functions:

        io.pedestal.log

        Logging via slf4j. Each logging level is a macro: trace, debug, info, warn, and error. Each namespace gets its own Logger. Arguments are key-value pairs, which will be printed as with ‘pr’. The special key :exception should have a java.lang.Throwable as its value, and will be passed separately to the underlying logging API. One can override the logger via JVM or ENVAR settings.

        +

        io.pedestal.service-tools.dev

        Public variables and functions:

        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.aws.lambda.html b/api/0.6/io.pedestal.http.aws.lambda.html new file mode 100644 index 0000000..3aa9257 --- /dev/null +++ b/api/0.6/io.pedestal.http.aws.lambda.html @@ -0,0 +1,3 @@ + +io.pedestal.http.aws.lambda documentation

        io.pedestal.http.aws.lambda

        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.aws.lambda.utils.html b/api/0.6/io.pedestal.http.aws.lambda.utils.html new file mode 100644 index 0000000..c192c51 --- /dev/null +++ b/api/0.6/io.pedestal.http.aws.lambda.utils.html @@ -0,0 +1,10 @@ + +io.pedestal.http.aws.lambda.utils documentation

        io.pedestal.http.aws.lambda.utils

        apigw-request-map

        (apigw-request-map apigw-event)(apigw-request-map apigw-event process-headers?)

        Given a parsed JSON event from API Gateway, return a Ring compatible request map.

        +

        Optionally, you can decide to process-headers?, lower-casing them all to conform with the Ring spec defaults to true

        +

        This assumes the apigw event has strings as keys – no conversion has taken place on the JSON object other than the original parse. – This ensures parse optimizations can be made without affecting downstream code.

        +

        apigw-response

        (apigw-response ring-response)(apigw-response ring-response body-process-fn)

        direct-apigw-provider

        (direct-apigw-provider service-map)

        Given a service map, return a service map with a provider function for an AWS API Gateway event, under :io.pedestal.aws.lambda/apigw-handler.

        +

        This provider function takes the apigw-event map and the runtime.Context and returns an AWS API Gateway response map (containing – :statusCode :body :headers) You may want to add a custom interceptor in your chain to handle Scheduled Events.

        +

        This chain terminates if a Ring :response is found in the context or an API Gateway :apigw-response map is found.

        +

        All additional conversion, coercion, writing, and extension should be handled by interceptors in the interceptor chain.

        +

        resolve-body-processor

        (resolve-body-processor)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.body-params.html b/api/0.6/io.pedestal.http.body-params.html new file mode 100644 index 0000000..8017c76 --- /dev/null +++ b/api/0.6/io.pedestal.http.body-params.html @@ -0,0 +1,16 @@ + +io.pedestal.http.body-params documentation

        io.pedestal.http.body-params

        add-parser

        (add-parser parser-map content-type parser-fn)

        add-ring-middleware

        (add-ring-middleware parser-map content-type middleware)

        body-params

        (body-params)(body-params parser-map)

        custom-edn-parser

        (custom-edn-parser & options)

        Return an edn-parser fn that, given a request, will read the body of that request with edn/read. options are key-val pairs that will be passed as a hash-map to edn/read.

        +

        custom-json-parser

        (custom-json-parser & options)

        Return a json-parser fn that, given a request, will read the body of that request with json/read. options are key-val pairs that will be passed along to json/read.

        +

        custom-transit-parser

        (custom-transit-parser & options)

        Return a transit-parser fn that, given a request, will read the body of that request with transit/read. options is a sequence to pass to transit/reader along with the body of the request.

        +

        default-parser-map

        (default-parser-map & parser-options)

        Return a map of MIME-type to parsers. Included types are edn, json and form-encoding. parser-options are key-val pairs, valid options are:

        +

        :edn-options A hash-map of options to be used when invoking edn/read. :json-options A hash-map of options to be used when invoking json/parse-stream. :transit-options A vector of options to be used when invoking transit/reader - must apply to both json and msgpack

        +

        Examples:

        +

        (default-parser-map :json-options {:key-fn keyword}) ;; This parser-map would parse the json body ‘{“foo”: “bar”}’ as ;; {:foo “bar”}

        +

        (default-parser-map :edn-options {:readers data-readers}) ;; This parser-map will parse edn bodies using any custom edn readers you ;; define (in a data_readers.clj file, for example.)

        +

        (default-parser-map :transit-options {:handlers {“custom/model” custom-model-read-handler}}) ;; This parser-map will parse the transit body using a handler defined by ;; custom-model-read-handler.

        +

        edn-parser

        Take a request and parse its body as edn.

        +

        form-parser

        (form-parser request)

        Take a request and parse its body as a form.

        +

        json-parser

        Take a request and parse its body as json.

        +

        transit-parser

        Take a request and parse its body as transit.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.container.html b/api/0.6/io.pedestal.http.container.html new file mode 100644 index 0000000..92c06b4 --- /dev/null +++ b/api/0.6/io.pedestal.http.container.html @@ -0,0 +1,4 @@ + +io.pedestal.http.container documentation

        io.pedestal.http.container

        Deeper Pedestal<->Container integration and cooperation for HTTP handling

        +

        WriteNIOByteBody

        protocol

        members

        write-byte-buffer-body

        (write-byte-buffer-body servlet-response body resume-chan context)

        write-byte-channel-body

        (write-byte-channel-body servlet-response body resume-chan context)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.content-negotiation.html b/api/0.6/io.pedestal.http.content-negotiation.html new file mode 100644 index 0000000..334ad79 --- /dev/null +++ b/api/0.6/io.pedestal.http.content-negotiation.html @@ -0,0 +1,6 @@ + +io.pedestal.http.content-negotiation documentation

        io.pedestal.http.content-negotiation

        best-match

        (best-match match-fn parsed-accept-maps)

        best-match-fn

        (best-match-fn supported-type-strs)

        negotiate-content

        (negotiate-content supported-type-strs)(negotiate-content supported-type-strs opts-map)

        Given a vector of strings (supported types mime-types) and optionally a map of additional options, return an interceptor that will parse client-request response formats, and add an :accept key on the request, of the most acceptable response format.

        +

        The format of the :accept value is a map containing :field, :type, and :subtype - all strings

        +

        Additional options: :no-match-fn - A function that takes a context; Called when no acceptable format/mime-type is found :content-param-paths - a vector of vectors; paths into the context to find ‘accept’ format strings

        +

        parse-accept-*

        (parse-accept-* accept-str)

        parse-accept-element

        (parse-accept-element accept-elem-str)

        weighted-accept-qs

        (weighted-accept-qs supported-types accept-elem)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.cors.html b/api/0.6/io.pedestal.http.cors.html new file mode 100644 index 0000000..c81f19c --- /dev/null +++ b/api/0.6/io.pedestal.http.cors.html @@ -0,0 +1,19 @@ + +io.pedestal.http.cors documentation

        io.pedestal.http.cors

        allow-origin

        (allow-origin allowed-origins)

        Builds a CORS interceptor that allows calls from the specified allowed-origins, which is one of the following:

        +
          +
        • +

          a sequence of strings

          +
        • +
        • +

          a function of one argument that returns a truthy value when an origin is allowed

          +
        • +
        • +

          a map containing the following keys and values

          +
        • +
        +

        :allowed-origins - either sequence of strings or a function as above

        +

        :creds - true or false, indicates whether client is allowed to send credentials

        +

        :max-age - a long, indicates the number of seconds a client should cache the response from a preflight request

        +

        :methods - a string, indicates the accepted HTTP methods. Defaults to “GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS”

        +

        dev-allow-origin

        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.csrf.html b/api/0.6/io.pedestal.http.csrf.html new file mode 100644 index 0000000..7f963f5 --- /dev/null +++ b/api/0.6/io.pedestal.http.csrf.html @@ -0,0 +1,9 @@ + +io.pedestal.http.csrf documentation

        io.pedestal.http.csrf

        CSRF protection interceptor support, compatible with ring-anti-forgery

        +

        access-denied-response

        (access-denied-response body)

        anti-forgery

        (anti-forgery)(anti-forgery options)

        Interceptor that prevents CSRF attacks. Any POST/PUT/PATCH/DELETE request to the handler returned by this function must contain a valid anti-forgery token, or else an access-denied response is returned.

        +

        The anti-forgery token can be placed into a HTML page via the ::anti-forgery-token within the request, which is bound to a random key unique to the current session. By default, the token is expected to be in a form field named ‘__anti-forgery-token’, or in the ‘X-CSRF-Token’ or ‘X-XSRF-Token’ headers.

        +

        This behavior can be customized by supplying a map of options: :read-token a function that takes a request and returns an anti-forgery token, or nil if the token does not exist. :cookie-token a truthy value, if you want a CSRF double-submit cookie set :error-response the response to return if the anti-forgery token is incorrect or missing. :error-handler a handler function (passed the context) to call if the anti-forgery token is incorrect or missing (intended to return a valid response). :body-params a body-params parser map to use; If none is supplied, the default parsers will be used (standard body-params behavior) :cookie-attrs a map of attributes to associate with the csrf cookie.

        +

        Only one of :error-response, :error-handler may be specified.

        +

        anti-forgery-rotate-token

        anti-forgery-token

        anti-forgery-token-str

        default-error-response

        denied-msg

        existing-token

        (existing-token request)

        new-token

        (new-token)

        rotate-token

        (rotate-token response)

        Rotate the csrf token, e.g. after login succeeds.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.html b/api/0.6/io.pedestal.http.html new file mode 100644 index 0000000..2bc1c72 --- /dev/null +++ b/api/0.6/io.pedestal.http.html @@ -0,0 +1,49 @@ + +io.pedestal.http documentation

        io.pedestal.http

        Namespace which ties all the pedestal components together in a sensible default way to make a full blown application.

        +

        create-provider

        (create-provider service-map)

        Creates the base Interceptor Chain provider, connecting a backend to the interceptor chain.

        +

        create-server

        (create-server service-map)(create-server service-map init-fn)

        Given a service map, creates an returns an initialized service map which is ready to be started via io.pedestal.http/start. If init-fn, a zero arg function, is provided, it is invoked first.

        +

        Notes: - The returned, initialized service map contains the io.pedestal.http/start-fn and io.pedestal.http/stop-fn keys whose values are zero arg functions which are used to start/stop the http service, respectively. - If the service map option :io.pedestal.http/chain-provider is present, it is used to create the server, otherwise a servlet provider will be used. In this case, the type of servlet container created is determined by the :io.pedestal.http/type option. - For servlet containers, the resulting service-map will contain the io.pedestal.http/service-fn key which is useful for testing the service without starting it.

        +

        create-servlet

        (create-servlet service-map)

        Creates a servlet given an options map with keyword keys prefixed by namespace e.g. :io.pedestal.http/interceptors or ::bootstrap/interceptors if the namespace is aliased to bootstrap.

        +

        Options:

        +
          +
        • :io.pedestal.http/interceptors: A vector of interceptors that defines a service.
        • +
        +

        Note: Additional options are passed to default-interceptors if :interceptors is not set.

        +

        default-interceptors

        (default-interceptors service-map)

        Builds interceptors given an options map with keyword keys prefixed by namespace e.g. :io.pedestal.http/routes or ::bootstrap/routes if the namespace is aliased to bootstrap.

        +

        Note: No additional interceptors are added if :interceptors key is set.

        +

        Options:

        +
          +
        • :routes: Something that satisfies the io.pedestal.http.route/ExpandableRoutes protocol a function that returns routes when called, or a seq of route maps that defines a service’s routes. If passing in a seq of route maps, it’s recommended to use io.pedestal.http.route/expand-routes.
        • +
        • :router: The router implementation to to use. Can be :linear-search, :map-tree :prefix-tree, or a custom Router constructor function. Defaults to :map-tree, which fallsback on :prefix-tree
        • +
        • :file-path: File path used as root by the middlewares/file interceptor. If nil, this interceptor is not added. Default is nil.
        • +
        • :resource-path: File path used as root by the middlewares/resource interceptor. If nil, this interceptor is not added. Default is nil.
        • +
        • :method-param-name: Query string parameter used to set the current HTTP verb. Default is _method.
        • +
        • :allowed-origins: Determines what origins are allowed for the cors/allow-origin interceptor. If nil, this interceptor is not added. Default is nil.
        • +
        • :not-found-interceptor: Interceptor to use when returning a not found response. Default is the not-found interceptor. nil to disable.
        • +
        • :request-logger: Interceptor to log requests entering the interceptor chain. Default is the log-request interceptor. nil to disable.
        • +
        • :mime-types: Mime-types map used by the middlewares/content-type interceptor. Default is {}.
        • +
        • :enable-session: A settings map to include the session middleware interceptor. If nil, this interceptor is not added. Default is nil.
        • +
        • :enable-csrf: A settings map to include the csrf-protection interceptor. This implies sessions are enabled. If nil, this interceptor is not added. Default is nil.
        • +
        • :secure-headers: A settings map for various secure headers. Keys are: :hsts-settings :frame-options-settings :content-type-settings :xss-protection-settings :download-options-settings :cross-domain-policies-settings :content-security-policy-settings If nil, this interceptor is not added. Default is the default secure-headers settings
        • +
        • :path-params-decoder: An Interceptor to decode path params. Default is URL Decoding via `io.pedestal.http.route/path-params-decoder. If nil, this interceptor is not added.
        • +
        +

        dev-interceptors

        (dev-interceptors service-map)

        edn-response

        (edn-response obj)

        Return a Ring response that will print the given obj to the HTTP output stream in EDN format.

        +

        html-body

        Set the Content-Type header to “text/html” if the body is a string and a type has not been set.

        +

        interceptor-chain-provider

        (interceptor-chain-provider service-map)

        json-body

        Set the Content-Type header to “application/json” and convert the body to JSON if the body is a collection and a type has not been set.

        +

        json-print

        (json-print obj)

        Print object as JSON to out

        +

        json-response

        (json-response obj)

        Return a Ring response that will print the given obj to the HTTP output stream in JSON format.

        +

        log-request

        Log the request’s method and uri.

        +

        not-found

        An interceptor that returns a 404 when routing failed to resolve a route.

        +

        response?

        (response? resp)

        A valid response is any map that includes an integer :status value.

        +

        server

        (server service-map)

        service-fn

        (service-fn {interceptors :io.pedestal.http/interceptors, :as service-map})

        servlet

        (servlet {service-fn :io.pedestal.http/service-fn, :as service-map})

        servlet-destroy

        (servlet-destroy service)

        servlet-init

        (servlet-init service config)

        servlet-service

        (servlet-service service servlet-req servlet-resp)

        start

        (start service-map)

        Given service-map, an initialized service map returned by create-server, invokes the zero-arg function assoc’d to the service map via :io.pedestal.http/start-fn.

        +

        Returns service-map on success.

        +

        stop

        (stop service-map)

        Given service-map, an initialized service map returned by create-server, invokes the zero-arg function assoc’d to the service map via :io.pedestal.http/stop-fn.

        +

        Returns service-map on success.

        +

        transit-body

        Same as transit-json-body – Set the Content-Type header to “application/transit+json” and convert the body to transit+json if the body is a collection and a type has not been set.

        +

        transit-body-interceptor

        (transit-body-interceptor iname default-content-type transit-format)(transit-body-interceptor iname default-content-type transit-format transit-opts)

        Returns an interceptor which sets the Content-Type header to the appropriate value depending on the transit format. Converts the body to the specified Transit format if the body is a collection and a type has not been set. Optionally accepts transit-opts which are handed to trasit/writer and may contain custom write handlers.

        +

        Expects the following arguments:

        +

        iname - namespaced keyword for the interceptor name default-content-type - content-type string to set in the response transit-format - either :json or :msgpack transit-options - optional. map of options for transit/writer

        +

        transit-json-body

        Set the Content-Type header to “application/transit+json” and convert the body to transit+json if the body is a collection and a type has not been set.

        +

        transit-msgpack-body

        Set the Content-Type header to “application/transit+msgpack” and convert the body to transit+msgpack if the body is a collection and a type has not been set.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.immutant.container.html b/api/0.6/io.pedestal.http.immutant.container.html new file mode 100644 index 0000000..289529e --- /dev/null +++ b/api/0.6/io.pedestal.http.immutant.container.html @@ -0,0 +1,3 @@ + +io.pedestal.http.immutant.container documentation

        io.pedestal.http.immutant.container

        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.immutant.html b/api/0.6/io.pedestal.http.immutant.html new file mode 100644 index 0000000..fb06d5f --- /dev/null +++ b/api/0.6/io.pedestal.http.immutant.html @@ -0,0 +1,7 @@ + +io.pedestal.http.immutant documentation

        io.pedestal.http.immutant

        ctx-config-hookup

        (ctx-config-hookup request service-map)

        Apply a context configurator to result of web/run, before web/server is called. This is currently only used for connecting Immutant WebSocket support.

        +

        server

        (server service-map)(server service-map options)

        Standard options :port 8080 :host localhost

        +

        Undertow tuning options (defaults depend on available resources) :io-threads :worker-threads :buffer-size :buffers-per-region :direct-buffers?

        +

        SSL-related options :ssl-port :ssl-context :key-managers :trust-managers :keystore (either file path or KeyStore) :key-password :truststore (either file path or KeyStore) :trust-password :client-auth (either :want or :need)

        +

        start

        (start server)

        stop

        (stop server)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.immutant.websockets.html b/api/0.6/io.pedestal.http.immutant.websockets.html new file mode 100644 index 0000000..c04af68 --- /dev/null +++ b/api/0.6/io.pedestal.http.immutant.websockets.html @@ -0,0 +1,4 @@ + +io.pedestal.http.immutant.websockets documentation

        io.pedestal.http.immutant.websockets

        add-ws-endpoints

        (add-ws-endpoints request ws-paths)

        make-ws-listener

        (make-ws-listener ws-map)

        Creates an Immutant listener (map) for a WebSocket connection. Note that on-text and on-binary will override each other in this implementation, and you should use on-message if you need a single handler to fulfill both binary and text messages.

        +

        start-ws-connection

        (start-ws-connection on-connect-fn)(start-ws-connection on-connect-fn send-buffer-or-n)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.impl.servlet-interceptor.html b/api/0.6/io.pedestal.http.impl.servlet-interceptor.html new file mode 100644 index 0000000..0630459 --- /dev/null +++ b/api/0.6/io.pedestal.http.impl.servlet-interceptor.html @@ -0,0 +1,15 @@ + +io.pedestal.http.impl.servlet-interceptor documentation

        io.pedestal.http.impl.servlet-interceptor

        Interceptors for adapting the Java HTTP Servlet interfaces.

        +

        exception-debug

        An interceptor which catches errors, renders them to readable text and sends them to the user. This interceptor is intended for development time assistance in debugging problems in pedestal services. Including it in interceptor paths on production systems may present a security risk by exposing call stacks of the application when exceptions are encountered.

        +

        http-interceptor-service-fn

        (http-interceptor-service-fn interceptors)(http-interceptor-service-fn interceptors default-context)

        Returns a function which can be used as an implementation of the Servlet.service method. It executes the interceptors on an initial context map containing :servlet, :servlet-config, :servlet-request, and :servlet-response. The terminator-injector, stylobate, and ring-response are prepended to the sequence of interceptors.

        +

        ring-response

        An interceptor which transmits a Ring specified response map to an HTTP response.

        +

        If a later interceptor in this context throws an exception which is not caught, this interceptor will set the HTTP response status code to 500 with a generic error message. Also, if later interceptors fail to furnish the context with a :response map, this interceptor will set the HTTP response to a 500 error.

        +

        set-response

        (set-response servlet-resp resp-map)

        stylobate

        An interceptor which creates favorable pre-conditions for further io.pedestal.interceptors, and handles all post-conditions for processing an interceptor chain. It expects a context map with :servlet-request, :servlet-response, and :servlet keys.

        +

        After entering this interceptor, the context will contain a new key :request, the value will be a request map adhering to the Ring specification1.

        +

        This interceptor supports asynchronous responses as defined in the Java Servlet Specification2 version 3.0. On leaving this interceptor, if the servlet request has been set asynchronous, all asynchronous resources will be closed. Pausing this interceptor will inform the servlet container that the response will be delivered asynchronously.

        +

        If a later interceptor in this context throws an exception which is not caught, this interceptor will log the error but not communicate any details to the client.

        +

        terminator-injector

        An interceptor which causes a interceptor to terminate when one of the interceptors produces a response, as defined by ring.util.response/response?

        +

        WriteableBody

        protocol

        members

        default-content-type

        (default-content-type body)

        Get default HTTP content-type for body.

        +

        write-body-to-stream

        (write-body-to-stream body output-stream)

        Write body to the stream output-stream.

        +

        WriteableBodyAsync

        protocol

        members

        write-body-async

        (write-body-async body servlet-response resume-chan context)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.jetty.container.html b/api/0.6/io.pedestal.http.jetty.container.html new file mode 100644 index 0000000..c7b2cd0 --- /dev/null +++ b/api/0.6/io.pedestal.http.jetty.container.html @@ -0,0 +1,3 @@ + +io.pedestal.http.jetty.container documentation

        io.pedestal.http.jetty.container

        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.jetty.html b/api/0.6/io.pedestal.http.jetty.html new file mode 100644 index 0000000..e3c189c --- /dev/null +++ b/api/0.6/io.pedestal.http.jetty.html @@ -0,0 +1,3 @@ + +io.pedestal.http.jetty documentation

        io.pedestal.http.jetty

        server

        (server service-map)(server service-map options)

        start

        (start server {:keys [join?], :or {join? true}, :as options})

        stop

        (stop server)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.jetty.util.html b/api/0.6/io.pedestal.http.jetty.util.html new file mode 100644 index 0000000..8e5d488 --- /dev/null +++ b/api/0.6/io.pedestal.http.jetty.util.html @@ -0,0 +1,5 @@ + +io.pedestal.http.jetty.util documentation

        io.pedestal.http.jetty.util

        add-server-filters

        (add-server-filters context & more-filter-opts)

        add-servlet-filter

        (add-servlet-filter context filter-opts)

        Add a ServletFilter to a ServletContextHandler, given the context and a map that contains: :filter - A FilterHolder, Filter class, or a String of a Filter class and optionally contains: :path - The pathSpec string that applies to the filter; defaults to ‘/*’ :dispatches - A keyword signaling the defaults to :request

        +

        dispatch-types

        dispatcher-set

        (dispatcher-set dispatches)

        Return a dispatch EnumSet given one of: - an EnumSet (no-op) - servlet DispatcherType - a keyword representation of DispatcherType (see dispatch-types) - :all which generates an EnumSet of all DispatcherTypes

        +

        filter-holder

        (filter-holder servlet-filter init-params)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.jetty.websockets.html b/api/0.6/io.pedestal.http.jetty.websockets.html new file mode 100644 index 0000000..5343ceb --- /dev/null +++ b/api/0.6/io.pedestal.http.jetty.websockets.html @@ -0,0 +1,14 @@ + +io.pedestal.http.jetty.websockets documentation

        io.pedestal.http.jetty.websockets

        add-ws-endpoints

        (add-ws-endpoints ctx ws-paths)(add-ws-endpoints ctx ws-paths opts)

        Given a ServletContextHandler and a map of WebSocket (String) paths to action maps, produce corresponding Servlets per path and add them to the context. Return the context when complete.

        +

        You may optionally also pass in a map of options. Currently supported options: :listener-fn - A function of 3 args, the ServletUpgradeRequest, ServletUpgradeResponse, and the WS-Map that returns a WebSocketListener.

        +

        make-ws-listener

        (make-ws-listener ws-map)

        Given a map representing WebSocket actions (:on-connect, :on-close, :on-error, :on-text, :on-binary), return a WebSocketConnectionListener. Values for the map are functions with the same arity as the interface.

        +

        start-ws-connection

        (start-ws-connection on-connect-fn)(start-ws-connection on-connect-fn send-buffer-or-n)

        Given a function of two arguments (the Jetty WebSocket Session and its paired core.async ‘send’ channel), and optionall a buffer-or-n for the ‘send’ channel, return a function that can be used as an OnConnect handler.

        +

        Notes: - You can control the entire WebSocket Session per client with the session object. - If you close the send channel, Pedestal will close the WS connection.

        +

        start-ws-connection-with-fc-support

        (start-ws-connection-with-fc-support on-connect-fn)(start-ws-connection-with-fc-support on-connect-fn send-buffer-or-n)

        Like start-ws-connection but transmission is non-blocking and supports conveying transmission results. This allows services to implement flow control.

        +

        Notes:

        +

        Putting a sequential value on the send channel signals that a transmission response is desired. In this case the value is expected to be a 2-tuple of msg resp-ch where msg is the message to be sent and resp-ch is the channel in which the transmission result will be put.

        +

        WebSocketSend

        protocol

        members

        ws-send

        (ws-send msg remote-endpoint)

        Sends msg to remote-endpoint. May block.

        +

        WebSocketSendAsync

        protocol

        members

        ws-send-async

        (ws-send-async msg remote-endpoint)

        Sends msg to remote-endpoint. Returns a promise channel from which the result can be taken.

        +

        ws-servlet

        (ws-servlet creation-fn)

        Given a function (that takes a ServletUpgradeRequest and ServletUpgradeResponse and returns a WebSocketListener), return a WebSocketServlet that uses the function to create new WebSockets (via a factory).

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.params.html b/api/0.6/io.pedestal.http.params.html new file mode 100644 index 0000000..9a61f82 --- /dev/null +++ b/api/0.6/io.pedestal.http.params.html @@ -0,0 +1,5 @@ + +io.pedestal.http.params documentation

        io.pedestal.http.params

        keyword-body-params

        Interceptor that converts the :body-params map to be keyed by keywords

        +

        keyword-params

        Interceptor that converts the :params map to be keyed by keywords

        +

        keywordize-keys

        (keywordize-keys x)

        keywordize-request-body-params

        keywordize-request-element

        (keywordize-request-element element context)

        keywordize-request-params

        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.request.html b/api/0.6/io.pedestal.http.request.html new file mode 100644 index 0000000..436061e --- /dev/null +++ b/api/0.6/io.pedestal.http.request.html @@ -0,0 +1,4 @@ + +io.pedestal.http.request documentation

        io.pedestal.http.request

        base-request-map

        (base-request-map req)

        ContainerRequest

        protocol

        members

        async-started?

        (async-started? x)

        async-supported?

        (async-supported? x)

        body

        (body x)

        header

        (header x header-string)

        headers

        (headers x)

        path-info

        (path-info x)

        protocol

        (protocol x)

        query-string

        (query-string x)

        remote-addr

        (remote-addr x)

        request-method

        (request-method x)

        scheme

        (scheme x)

        server-name

        (server-name x)

        server-port

        (server-port x)

        ssl-client-cert

        (ssl-client-cert x)

        uri

        (uri x)

        ProxyDatastructure

        protocol

        members

        realized

        (realized this)

        Return fully-realized version of underlying data structure.

        +

        ResponseBuffer

        protocol

        members

        response-buffer-size

        (response-buffer-size x)

        ring-dispatch

        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.request.lazy.html b/api/0.6/io.pedestal.http.request.lazy.html new file mode 100644 index 0000000..f36cfb3 --- /dev/null +++ b/api/0.6/io.pedestal.http.request.lazy.html @@ -0,0 +1,14 @@ + +io.pedestal.http.request.lazy documentation

        io.pedestal.http.request.lazy

        classify-keys

        (classify-keys [k v])

        Classify key-value pair based on whether its value is delayed, realized, or normal.

        +

        derefing-map-entry

        (derefing-map-entry kv)(derefing-map-entry k v)

        Create a new MapEntry-like object, but allow for values to be transparently derefed when accessed.

        +

        Does not provide the same level of ‘equivalency’ checking that MapEntry does. Use ‘seq’ to get a realized pair of key-value.

        +

        IntoLazyRequest

        protocol

        members

        -lazy-request

        (-lazy-request t)

        Create a lazy request

        +

        lazy-request

        (lazy-request m)

        Return a LazyRequest map that transparently derefs values that are delays.

        +

        Example: (:foo (lazy-request {:foo (delay :bar)})) ;; => :bar

        +

        LazyRequest’s are value-equal to other LazyRequest’s that share the same underlying map, but not to raw maps. Use raw or realized to return plain maps of original key-vals or realized key-vals, respectively.

        +

        LazyDatastructure

        protocol

        Utilities for manipulating/realizing lazy data structures.

        +

        members

        touch

        (touch this)

        Realize all portions of the underlying data structure. Returns this.

        +

        RawAccess

        protocol

        Utilities for exposing raw access to advanced data structures that layer new semantics onto simpler types.

        +

        members

        raw

        (raw this)

        Return the raw data structure underlying a more advanced wrapper

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.request.map.html b/api/0.6/io.pedestal.http.request.map.html new file mode 100644 index 0000000..aa27f51 --- /dev/null +++ b/api/0.6/io.pedestal.http.request.map.html @@ -0,0 +1,3 @@ + +io.pedestal.http.request.map documentation

        io.pedestal.http.request.map

        add-character-encoding

        (add-character-encoding req-map servlet-req)

        add-content-length

        (add-content-length req-map servlet-req)

        add-content-type

        (add-content-type req-map servlet-req)

        add-ssl-client-cert

        (add-ssl-client-cert req-map servlet-req)

        servlet-request-map

        (servlet-request-map servlet servlet-req servlet-resp)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.request.servlet-support.html b/api/0.6/io.pedestal.http.request.servlet-support.html new file mode 100644 index 0000000..19e81e4 --- /dev/null +++ b/api/0.6/io.pedestal.http.request.servlet-support.html @@ -0,0 +1,3 @@ + +io.pedestal.http.request.servlet-support documentation

        io.pedestal.http.request.servlet-support

        servlet-path-info

        (servlet-path-info request)

        servlet-request-headers

        (servlet-request-headers servlet-req)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.request.zerocopy.html b/api/0.6/io.pedestal.http.request.zerocopy.html new file mode 100644 index 0000000..0e2cfd7 --- /dev/null +++ b/api/0.6/io.pedestal.http.request.zerocopy.html @@ -0,0 +1,3 @@ + +io.pedestal.http.request.zerocopy documentation

        io.pedestal.http.request.zerocopy

        call-through-request

        (call-through-request container-req)(call-through-request container-req override-map)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.ring-middlewares.html b/api/0.6/io.pedestal.http.ring-middlewares.html new file mode 100644 index 0000000..f7ed96e --- /dev/null +++ b/api/0.6/io.pedestal.http.ring-middlewares.html @@ -0,0 +1,19 @@ + +io.pedestal.http.ring-middlewares documentation

        io.pedestal.http.ring-middlewares

        This namespace creates interceptors for ring-core middlewares.

        +

        content-type

        (content-type & [opts])

        Interceptor for content-type ring middleware.

        +

        cookies

        Interceptor for cookies ring middleware. Be sure to persist :cookies from the request to response.

        +

        fast-resource

        (fast-resource root-path)(fast-resource root-path opts)

        Interceptor for resource handling. This interceptor will return async responses for large files (files larger than the HTTP Buffer) If your container doesn’t recognize FileChannel response bodies, this interceptor will cause errors Supports a map of options: :index? - If path is a directory, will attempt to find an ‘index.*’ file to serve. Defaults to true :follow-symlinks? - Serve files through symbolic links. Defaults to false :loader - A class loader specific for these resource fetches. Default to nil (use the main class loader)

        +

        file

        (file root-path & [opts])

        Interceptor for file ring middleware.

        +

        file-info

        (file-info & [mime-types])

        Interceptor for file-info ring middleware.

        +

        flash

        (flash)

        Interceptor for flash ring middleware. Be sure to persist keys needed by session and cookie interceptors.

        +

        head

        (head)

        Interceptor to handle head requests. If used with defroutes, it will not work if specified in an interceptor’s meta-key.

        +

        keyword-params

        Retained for backward compatibility. io.pedestal.http.params/keyword-params is recommended

        +

        multipart-params

        (multipart-params & [opts])

        Interceptor for multipart-params ring middleware.

        +

        nested-params

        (nested-params & [opts])

        Interceptor for nested-params ring middleware.

        +

        not-modified

        (not-modified)

        Interceptor for not-modified ring middleware.

        +

        params

        (params & [opts])

        Interceptor for params ring middleware.

        +

        resource

        (resource root-path)

        Interceptor for resource ring middleware

        +

        response-fn-adapter

        (response-fn-adapter response-fn)(response-fn-adapter response-fn opts)

        Adapts a ring middleware fn taking a response and request to an interceptor context.

        +

        session

        (session)(session options)

        Interceptor for session ring middleware. Be sure to persist :session and :session/key from request to the response.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.definition.html b/api/0.6/io.pedestal.http.route.definition.html new file mode 100644 index 0000000..2fb4d00 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.definition.html @@ -0,0 +1,8 @@ + +io.pedestal.http.route.definition documentation

        io.pedestal.http.route.definition

        allowed-keys

        capture-constraint

        (capture-constraint [k v])

        Add parenthesis to a regex in order to capture its value during evaluation.

        +

        defroutes

        macro

        (defroutes name route-spec)

        Deprecated. – Prefer def and program against ExpandableRoutes Define a routing table from the terse routing syntax.

        +

        ensure-routes-integrity

        (ensure-routes-integrity route-maps)

        prioritize-constraints

        (prioritize-constraints routing-table)

        Sort a flat routing table of entries to guarantee that the most constrained route entries appear in the table prior to entries which have fewer constraints or no constraints.

        +

        sort-by-constraints

        (sort-by-constraints groupings route-path)

        Sort the grouping of route entries which all correspond to route-path from groupings such that the most constrained route table entries appear first and the least constrained appear last.

        +

        symbol->keyword

        (symbol->keyword s)

        uniquely-add-route-path

        (uniquely-add-route-path route-paths route-path)

        Append route-path to route-paths if route-paths doesn’t contain it already.

        +

        verify-unique-route-names

        (verify-unique-route-names routing-table)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.definition.table.html b/api/0.6/io.pedestal.http.route.definition.table.html new file mode 100644 index 0000000..0ca22b7 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.definition.table.html @@ -0,0 +1,3 @@ + +io.pedestal.http.route.definition.table documentation

        io.pedestal.http.route.definition.table

        attach-constraints

        attach-path-regex

        (attach-path-regex ctx)

        attach-route-name

        ensure-unique-route-names

        (ensure-unique-route-names routes)

        finalize

        (finalize ctx)

        make-parse-context

        (make-parse-context opts row route)

        parse-constraints

        (parse-constraints {:keys [constraints path-params], :as ctx})

        parse-handlers

        (parse-handlers ctx)

        parse-path

        (parse-path ctx)

        parse-route-name

        (parse-route-name {:keys [route-name interceptors last-handler], :as ctx})

        parse-verb

        (parse-verb ctx)

        route-name

        (route-name route)

        route-table-row

        (route-table-row opts row route)

        table-routes

        (table-routes routes)(table-routes opts routes)

        take-next-pair

        (take-next-pair argname expected-pred expected-str ctx)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.definition.terse.html b/api/0.6/io.pedestal.http.route.definition.terse.html new file mode 100644 index 0000000..b3782d4 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.definition.terse.html @@ -0,0 +1,8 @@ + +io.pedestal.http.route.definition.terse documentation

        io.pedestal.http.route.definition.terse

        constraint-map?

        dissoc-when

        (dissoc-when pred m)

        Dissoc those keys from m whose values in m satisfy pred.

        +

        expand-constraint

        multimethod

        Expand into additional nodes which reflect constraints and apply them to specs.

        +

        ExpandableVerbAction

        protocol

        members

        expand-verb-action

        (expand-verb-action expandable-verb-action)

        Expand expandable-verb-action into a verbose-form verb-map.

        +

        first-of

        (first-of p coll)

        flatten-terse-app-routes

        (flatten-terse-app-routes route-spec)

        Return a vector of maps that are equivalent to the terse routing syntax, but expanded for consumption by the verbose route parser.

        +

        interceptor-vector?

        map-routes->vec-routes

        (map-routes->vec-routes route-map)

        Given a map-based route description, return Pedestal’s terse, vector-based routes, with interceptors correctly setup. These generated routes can be consumed by expand-routes

        +

        preamble?

        terse-routes

        (terse-routes route-spec)

        valid-handler?

        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.definition.verbose.html b/api/0.6/io.pedestal.http.route.definition.verbose.html new file mode 100644 index 0000000..29517a6 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.definition.verbose.html @@ -0,0 +1,4 @@ + +io.pedestal.http.route.definition.verbose documentation

        io.pedestal.http.route.definition.verbose

        default-dna

        expand-verbose-routes

        (expand-verbose-routes route-maps)

        Expand route-maps into a routing table of route entries.

        +

        handler-interceptor

        (handler-interceptor handler name)

        handler-map

        (handler-map m)

        path-join

        (path-join parent-path path)

        resolve-interceptor

        (resolve-interceptor interceptor name)

        undoubleslash

        (undoubleslash s)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.html b/api/0.6/io.pedestal.http.route.html new file mode 100644 index 0000000..b3d95e2 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.html @@ -0,0 +1,64 @@ + +io.pedestal.http.route documentation

        io.pedestal.http.route

        decode-query-part

        (decode-query-part string)

        Decodes one key or value of URL-encoded UTF-8 characters in a URL query string.

        +

        encode-query-part

        (encode-query-part string)

        Encodes one key or value for a UTF-8 URL-encoded query string. Encodes space as +.

        +

        expand-routes

        (expand-routes route-spec)

        Given a value (the route specification), produce and return a routing table, a seq of verbose routing maps.

        +

        A route specification is any type that satisfies ExpandableRoutes; this includes Clojure vectors, maps, and sets (for terse, table, and verbose routes).

        +

        Ensures the integrity of expanded routes (even if they’ve already been checked):

        +
          +
        • Constraints are correctly ordered (most specific to least specific)
        • +
        • Route names are unique
        • +
        +

        ExpandableRoutes

        protocol

        A protocol extended onto types that can be used to convert instances into a seq of verbose route maps, the routing table.

        +

        Built-in implementations map vectors to terse-routes, sets to table-routes, and maps to map-routes->vec-routes.

        +

        members

        -expand-routes

        (-expand-routes expandable-route-spec)

        Generate and return the routing table from a given expandable form of routing data.

        +

        form-action-for-routes

        (form-action-for-routes routes & default-options)

        Like ‘url-for-routes’ but the returned function returns a map with the keys :action, the URL string; and :method, the HTTP verb as a lower-case string. Also, the :method-param is :_method by default, so HTTP verbs other than GET and POST will be converted to POST with the actual verb in the query string.

        +

        method-param

        (method-param)(method-param query-param-or-param-path)

        Returns an interceptor that smuggles HTTP verbs through a value in the request. Must come after the interceptor that populates that value (e.g. query-params or body-params).

        +

        query-param-or-param-path may be one of two things:

        + +

        The path :query-params :_method is used by default.

        +

        parse-param-map

        (parse-param-map m)

        parse-path-params

        (parse-path-params request)

        parse-query-params

        (parse-query-params request)

        parse-query-string

        (parse-query-string string & options)

        Parses URL query string (not including the leading ‘?’) into a map. options are key-value pairs, valid options are:

        +

        :key-fn Function to call on parameter keys (after URL decoding), returns key for the map, default converts to a keyword.

        +

        :value-fn Function to call on the key (after passing through key-fn) and parameter value (after URL decoding), returns value for the map, default does nothing.

        +

        path-params-decoder

        An Interceptor which URL-decodes path parameters.

        +

        print-routes

        (print-routes routing-table)

        Prints a route table (from expand-routes) in an easier to read format.

        +

        query-params

        Returns an interceptor which parses query-string parameters from an HTTP request into a map. Keys in the map are query-string parameter names, as keywords, and values are strings. The map is assoc’d into the request at :query-params.

        +

        router

        (router routing-table)(router routing-table router-type)

        Given the routing table and, optionally, what kind of router to construct, returns a RouterSpecification instance, from which a routing interceptor can be obtained.

        +

        router-type may be a keyword identifying a known router-implementation, or function that accepts a routing table, and returns a Router.

        +

        The default router type is :map-tree, which is the fastest built-in router; however, if the expanded routes contain path paramters or wildcards, the result is equivalent to the slower :prefix-tree implementation.

        +

        router-implementations

        Maps from the common router implemenations (:map-tree, :prefix-tree, or :linear-search) to a router constructor function (which accepts expanded routes, and returns a Router instance).

        +

        RouterSpecification

        protocol

        members

        router-spec

        (router-spec routing-table router-ctor)

        Returns an interceptor which attempts to match each route against a :request in context. For the first route that matches, it will:

        +
          +
        • enqueue the matched route’s interceptors
        • +
        • associate the route into the context at :route
        • +
        • associate a map of :path-params into the :request
        • +
        +

        If no route matches, returns context with :route nil.

        +

        try-routing-for

        (try-routing-for routing-table router-type path verb)

        Used for testing; constructs a router from the routing-table and router-type and perform routing, returning the matched route (from the expanded routes), or nil if routing was unsuccessful.

        +

        url-for

        (url-for route-name & options)

        Invokes currently bound contextual linker to generate url based on

        +
          +
        • The routing table in use.
        • +
        • The incoming request being routed.
        • +
        +

        where options are as described in url-for-routes.

        +

        url-for-routes

        (url-for-routes routes & default-options)

        Returns a function that generates URL routes (as strings) from the routes table. The returned function has the signature:

        +

        route-name & options

        +

        Where ‘options’ are key-value pairs from:

        +

        :app-name Application name specified for this route

        +

        :request The original request; it will be merged into the generated link.

        +

        :params A map of all parameters; any params not used as path parameters will be added to the query string

        +

        :path-params A map of path parameters only

        +

        :strict-path-params? A boolean, when true will throw an exception if all path-params aren’t fulfilled for the url

        +

        :query-params A map of query-string parameters only

        +

        :method-param Keyword naming the query-string parameter in which to place the HTTP method name, if it is neither GET nor POST. If nil, the HTTP method name will not be included in the query string. Default is nil.

        +

        :context A string, function that returns a string, or symbol that resolves to a function that returns a string that specifies a root context for the URL. Default is nil.

        +

        :fragment A string for the fragment part of the url.

        +

        :absolute? Boolean, whether or not to force an absolute URL

        +

        :scheme Keyword (:http | :https) used to override the scheme portion of the url.

        +

        :host A string used to override the host portion of the URL.

        +

        :port An integer used to override the port in the URL.

        +

        In addition, you may supply default-options to the ‘url-for-routes’ function, which are merged with the options supplied to the returned function.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.linear-search.html b/api/0.6/io.pedestal.http.route.linear-search.html new file mode 100644 index 0000000..243b0a3 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.linear-search.html @@ -0,0 +1,4 @@ + +io.pedestal.http.route.linear-search documentation

        io.pedestal.http.route.linear-search

        router

        (router routes)

        Given a sequence of routes, return a router which satisfies the io.pedestal.http.route.router/Router protocol.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.map-tree.html b/api/0.6/io.pedestal.http.route.map-tree.html new file mode 100644 index 0000000..36790d4 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.map-tree.html @@ -0,0 +1,5 @@ + +io.pedestal.http.route.map-tree documentation

        io.pedestal.http.route.map-tree

        matching-route-map

        (matching-route-map routes)

        Given the full sequence of route-maps, return a single map, keyed by path, whose value is a function matching on the req. The function takes a request, matches criteria and constraints, and returns the most specific match. This function only processes the routes if all routes are static.

        +

        router

        (router routes)

        Given a sequence of routes, return a router which satisfies the io.pedestal.http.route.router/Router protocol.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.path.html b/api/0.6/io.pedestal.http.route.path.html new file mode 100644 index 0000000..618cef1 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.path.html @@ -0,0 +1,3 @@ + +io.pedestal.http.route.path documentation

        io.pedestal.http.route.path

        merge-path-regex

        (merge-path-regex route)

        parse-path

        (parse-path pattern)(parse-path accumulated-info pattern)

        path-regex

        (path-regex {:keys [path-parts path-constraints], :as route})
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.prefix-tree.html b/api/0.6/io.pedestal.http.route.prefix-tree.html new file mode 100644 index 0000000..bb031ca --- /dev/null +++ b/api/0.6/io.pedestal.http.route.prefix-tree.html @@ -0,0 +1,10 @@ + +io.pedestal.http.route.prefix-tree documentation

        io.pedestal.http.route.prefix-tree

        add-satisfies-constraints?

        (add-satisfies-constraints? {:keys [query-constraints path-constraints], :as route})

        Given a route, add a function of the request which returns true if the request satisfies all path and query constraints.

        +

        contains-wilds?

        (contains-wilds? path-spec)

        Return true if the given path-spec contains any wildcard params or catch-alls.

        +

        create-payload-fn

        (create-payload-fn routes)

        Given a sequence of routes, return a function of a request which will return a matching route. When the returned function is called we already know that the path matches. The function only considers method, host, scheme and port and will return the most specific match.

        +

        insert

        (insert node path-spec o)

        Given a tree node, a path-spec and a payload object, return a new tree with payload inserted.

        +

        lookup

        (lookup node path)

        Given a tree node and request path, find a matching leaf node and return the path params and payload or return nil if no match is found. Returns a map with :path-params and :payload keys.

        +

        partition-wilds

        (partition-wilds path-spec)

        Given a path-spec string, return a seq of strings with wildcards and catch-alls separated into their own strings. Eats the forward slash following a wildcard.

        +

        router

        (router routes)

        Given a sequence of routes, return a router which satisfies the io.pedestal.http.route.router/Router protocol.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.route.router.html b/api/0.6/io.pedestal.http.route.router.html new file mode 100644 index 0000000..302d154 --- /dev/null +++ b/api/0.6/io.pedestal.http.route.router.html @@ -0,0 +1,5 @@ + +io.pedestal.http.route.router documentation

        io.pedestal.http.route.router

        Router

        protocol

        A Router is created from a routing table (see expand-routes). Each implementation of Router represents a different strategy for dispatching incoming requests, balancing a number of tradeoffs.

        +

        members

        find-route

        (find-route this req)

        Given an incoming request, find the matching route (one route map from the routing routes).

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.secure-headers.html b/api/0.6/io.pedestal.http.secure-headers.html new file mode 100644 index 0000000..c017d18 --- /dev/null +++ b/api/0.6/io.pedestal.http.secure-headers.html @@ -0,0 +1,12 @@ + +io.pedestal.http.secure-headers documentation

        io.pedestal.http.secure-headers

        Secure header settings applied in interceptors

        +

        content-security-policy-header

        (content-security-policy-header)(content-security-policy-header options)

        Create a custom value for the Content-Security-Policy header. No arg version returns a semi-‘Strict’ or script-focused policy: object-src ‘none’; script-src ‘unsafe-inline’ ‘unsafe-eval’ ‘strict-dynamic’ https: http:; To lock your resources to only those served by your domain (subdomains not included), consider: object-src ‘none’; default-src ‘self’

        +

        content-type-header

        (content-type-header)(content-type-header value)

        Create a custom value for content-type options. No arg version returns most secure setting: nosniff

        +

        create-headers

        (create-headers)(create-headers hsts-settings frame-options-settings content-type-settings xss-protection-settings download-options-settings cross-domain-policies-settings content-security-policy-settings)

        cross-domain-policies-header

        (cross-domain-policies-header)(cross-domain-policies-header value)

        Create a custom value for the X-Permitted-Cross-Domain-Policies header. No arg version returns the most secure setting: none.

        +

        csp-map->str

        (csp-map->str options)

        download-options-header

        (download-options-header)(download-options-header value)

        Create a custom value for the X-Download-Options header. No arg version returns the most secure setting: noopen. Passing a nil value will return nil, and the header won’t be added.

        +

        frame-options-header

        (frame-options-header)(frame-options-header policy)(frame-options-header allow-from-policy origin)

        Create a custom polic value for Frame-Options header. No arg version returns most secure setting: DENY

        +

        header-names

        header-names-vec

        hsts-header

        (hsts-header)(hsts-header max-age-secs)(hsts-header max-age-secs include-subdomains?)

        Create a max-age (and optionally include subdomains) Strict-Transport header No arg version sets age at 1 year (31536000 seconds) and includes subdomains. You may want to use 1 hour (3600 secs), 1 day (86400 secs), 1 week (604800 secs), or 1 month (2628000 secs)

        +

        secure-headers

        (secure-headers)(secure-headers options)

        Options are header values, which can be generated by the helper functions here

        +

        xss-protection-header

        (xss-protection-header)(xss-protection-header value)(xss-protection-header value mode)

        Create a custom value (and optionally mode) XSS-Protection header. No arg version returns the most secure setting: 1; block.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.servlet.html b/api/0.6/io.pedestal.http.servlet.html new file mode 100644 index 0000000..2cc598d --- /dev/null +++ b/api/0.6/io.pedestal.http.servlet.html @@ -0,0 +1,10 @@ + +io.pedestal.http.servlet documentation

        io.pedestal.http.servlet

        Generic Servlet adapter that closes over its implementation functions.

        +

        servlet

        (servlet & {:keys [init service destroy]})

        Returns an instance of javax.servlet.Servlet using provided functions for its implementation. Arguments are key-value pairs of:

        +

        :init optional, initialization function taking two arguments: the Servlet and its ServletConfig

        +

        :service required, handler function taking three arguments: the Servlet, ServletRequest, and ServletResponse

        +

        :destroy optional, shutdown function taking one argument: the Servlet

        +

        The :init, :service, and :destroy options correspond to the Servlet interface methods of the same names.

        +

        Note: this function returns an instance, not a class. If you need a class with a static name (for example, to deploy to a Servlet container) use the Java class pedestal.servlet.ClojureVarServlet.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.sse.html b/api/0.6/io.pedestal.http.sse.html new file mode 100644 index 0000000..b85446b --- /dev/null +++ b/api/0.6/io.pedestal.http.sse.html @@ -0,0 +1,11 @@ + +io.pedestal.http.sse documentation

        io.pedestal.http.sse

        COMMENT_FIELD

        counted-thread-factory

        (counted-thread-factory name-format daemon)

        Create a ThreadFactory that maintains a counter for naming Threads. name-format specifies thread names - use %d to include counter daemon is a flag for whether threads are daemons or not

        +

        daemon-thread-factory

        DATA_FIELD

        do-heartbeat

        (do-heartbeat channel)(do-heartbeat channel {:keys [on-client-disconnect]})

        end-event-stream

        deprecated in 0.4.0

        (end-event-stream {end-fn :io.pedestal.http.sse/end-event-stream})

        DEPRECATED. Given a context, clean up the event stream it represents.

        +

        EVENT_FIELD

        get-bytes

        (get-bytes s)

        ID_FIELD

        mk-data

        (mk-data name data)(mk-data name data id)

        scheduler

        send-event

        (send-event channel name data)(send-event channel name data id)(send-event channel name data id put-fn)

        sse-setup

        (sse-setup & args)

        See start-event-stream. This function is for backward compatibility.

        +

        start-event-stream

        (start-event-stream stream-ready-fn)(start-event-stream stream-ready-fn heartbeat-delay)(start-event-stream stream-ready-fn heartbeat-delay bufferfn-or-n)(start-event-stream stream-ready-fn heartbeat-delay bufferfn-or-n opts)

        Returns an interceptor which will start a Server Sent Event stream with the requesting client, and set the ServletResponse to go async. After the request handling context has been paused in the Servlet thread, stream-ready-fn will be called in a future, with the resulting context from setting up the SSE event stream.

        +

        opts is a map with optional keys:

        +

        :on-client-disconnect - A function of one argument which will be called when the client permanently disconnects.

        +

        start-stream

        (start-stream stream-ready-fn context heartbeat-delay)(start-stream stream-ready-fn context heartbeat-delay bufferfn-or-n)(start-stream stream-ready-fn context heartbeat-delay bufferfn-or-n opts)

        Starts an SSE event stream and initiates a heartbeat to keep the connection alive. stream-ready-fn will be called with a core.async channel. The application can then put maps with keys :name and :data on that channel to cause SSE events to be sent to the client. Either the client or the application may close the channel to terminate and clean up the event stream; the client closes it by closing the connection.

        +

        The SSE’s core.async buffer can either be a fixed buffer (n) or a 0-arity function that returns a buffer.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.http.tomcat.html b/api/0.6/io.pedestal.http.tomcat.html new file mode 100644 index 0000000..4defbb3 --- /dev/null +++ b/api/0.6/io.pedestal.http.tomcat.html @@ -0,0 +1,3 @@ + +io.pedestal.http.tomcat documentation

        io.pedestal.http.tomcat

        apply-ssl-opts

        (apply-ssl-opts connector opts)

        server

        (server service-map)(server service-map options)

        ssl-conn-factory

        (ssl-conn-factory opts)

        ssl-opt-keys

        start

        (start server {:keys [join?], :or {join? true}})

        stop

        (stop server)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.interceptor.chain.html b/api/0.6/io.pedestal.interceptor.chain.html new file mode 100644 index 0000000..b3a432e --- /dev/null +++ b/api/0.6/io.pedestal.interceptor.chain.html @@ -0,0 +1,16 @@ + +io.pedestal.interceptor.chain documentation

        io.pedestal.interceptor.chain

        Interceptor pattern. Executes a chain of Interceptor functions on a common “context” map, maintaining a virtual “stack”, with error handling and support for asynchronous execution.

        +

        enqueue

        (enqueue context interceptors)

        Adds interceptors to the end of context’s execution queue. Creates the queue if necessary. Returns updated context.

        +

        enqueue*

        (enqueue* context & interceptors-and-seq)

        Like ‘enqueue’ but vararg. If the last argument is a sequence of interceptors, they’re unpacked and to added to the context’s execution queue.

        +

        execute

        (execute context)(execute context interceptors)

        Executes a queue of Interceptors attached to the context. Context must be a map, Interceptors are added with ‘enqueue’.

        +

        An Interceptor is a map or map-like object with the keys :enter, :leave, and :error. The value of each key is a function; missing keys or nil values are ignored. When executing a context, first all the :enter functions are invoked in order. As this happens, the Interceptors are pushed on to a stack.

        +

        When execution reaches the end of the queue, it begins popping Interceptors off the stack and calling their :leave functions. Therefore :leave functions are called in the opposite order from :enter functions.

        +

        Both the :enter and :leave functions are called on a single argument, the context map, and return an updated context.

        +

        If any Interceptor function throws an exception, execution stops and begins popping Interceptors off the stack and calling their :error functions. The :error function takes two arguments: the context and an exception. It may either handle the exception, in which case the execution continues with the next :leave function on the stack; or re-throw the exception, passing control to the :error function on the stack. If the exception reaches the end of the stack without being handled, execute will throw it.

        +

        execute-only

        (execute-only context interceptor-key)(execute-only context interceptor-key interceptors)

        Like execute, but only processes the interceptors in a single direction, using interceptor-key (i.e. :enter, :leave) to determine which functions to call.

        +

        Executes a queue of Interceptors attached to the context. Context must be a map, Interceptors are added with ‘enqueue’.

        +

        An Interceptor Record has keys :enter, :leave, and :error. The value of each key is a function; missing keys or nil values are ignored. When executing a context, all the interceptor-key functions are invoked in order. As this happens, the Interceptors are pushed on to a stack.

        +

        terminate

        (terminate context)

        Removes all remaining interceptors from context’s execution queue. This effectively short-circuits execution of Interceptors’ :enter functions and begins executing the :leave functions.

        +

        terminate-when

        (terminate-when context pred)

        Adds pred as a terminating condition of the context. pred is a function that takes a context as its argument. It will be invoked after every Interceptor’s :enter function. If pred returns logical true, execution will stop at that Interceptor.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.interceptor.error.html b/api/0.6/io.pedestal.interceptor.error.html new file mode 100644 index 0000000..e48c5e0 --- /dev/null +++ b/api/0.6/io.pedestal.interceptor.error.html @@ -0,0 +1,6 @@ + +io.pedestal.interceptor.error documentation

        io.pedestal.interceptor.error

        error-dispatch

        macro

        (error-dispatch binding-vector & match-forms)

        Return an interceptor for doing pattern-matched error-dispatch, based on the ex-data of the exception. Pedestal wraps all exceptions in ex-info on error, providing the following keys to match on: :execution-id, :stage, :interceptor, :exception-type

        +

        This allows you to match the exact exception type, per interceptor/handler, and even constrain it to a single stage (:enter, :leave, :error).

        +

        :exception-type is a keyword of the exception’s type, for example, `:java.lang.ArithmeticException

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.interceptor.helpers.html b/api/0.6/io.pedestal.interceptor.helpers.html new file mode 100644 index 0000000..b962f0f --- /dev/null +++ b/api/0.6/io.pedestal.interceptor.helpers.html @@ -0,0 +1,46 @@ + +io.pedestal.interceptor.helpers documentation

        io.pedestal.interceptor.helpers

        deprecated in 0.6.0

        A collection of interceptor helpers.

        +

        The usage of the Interceptor API is preferred over the macros defined in this namespace. Usage of the macro helpers should be limited to cases where you are porting an existing Pedestal code base.

        +

        The helper macros predate the interceptor API and can break AOT compilation but they are maintained for backwards compatibility. Refer to https://github.com/pedestal/pedestal/issues/308 and https://github.com/pedestal/pedestal/pull/301 for more details about macro helper issues and the rationale for the Interceptor API.

        +

        This namespace has been effectively deprecated since 2016, and is fully deprecated in release 0.6.0.

        +

        after

        (after f)(after f & args)

        Return an interceptor which calls f on context during the leave stage.

        +

        around

        (around f1 f2)(around n f1 f2)

        Return an interceptor which calls f1 on context during the enter stage, and calls f2 on context during the leave stage.

        +

        before

        (before f)(before f & args)

        Returns an interceptor which calls f on context during the enter stage.

        +

        defafter

        macro

        (defafter macro-name__14831__auto__ & args__14832__auto__)

        Defines an after interceptor. The defined function is processed during the leave stage of interceptor execution. The implicitly created function will operate on context, and return a value used as the new context, e.g.:

        +

        (defafter check-zotted context (if-not (:zotted context) (throw (ex-info “Context was not zotted!” {:context context})) context))

        +

        defaround

        macro

        (defaround n & args)

        Defines an around interceptor. The definition resembles a multiple arity function definition, however both fns are 1-arity. The first fn will be called during the enter stage, the second during the leave stage, e.g.:

        +

        (defaround aroundinterceptor (context(assoc context :around :entering)) (context(assoc context :around :leaving)))

        +

        defbefore

        macro

        (defbefore macro-name__14831__auto__ & args__14832__auto__)

        Defines a before interceptor. The defined function performs processing during interceptor execution during the enter stage. The implicitly created function will operate on context, and return a value used as the new context, e.g.:

        +

        (defbefore flag-zotted context (assoc context :zotted true))

        +

        defhandler

        macro

        (defhandler macro-name__14831__auto__ & args__14832__auto__)

        Defines a handler interceptor. The definition mirrors a ring-style request handler and is made in terms of a ring style request. The implicitly created interceptor will extract the request from the context it receives, pass it to the defined function, and then associate the return value from the defined function as into context with the :response key and return context, e.g.:

        +

        (defhandler hello-name request (ring.util.response/response (str "Hello, " (-> request :params :name))))

        +

        This is equivalent to:

        +

        (defbefore hello-name context (let request (:request context) response (ring.util.response/response (str "Hello, " (-> request :params :name))) (assoc context :response response)))

        +

        definterceptor

        macro

        deprecated in 0.6.0

        (definterceptor name & body)

        Define an instance of an interceptor and store it in a var. An optional doc string can be provided. The body can be anything that satisfies the IntoInterceptor protocol.

        +

        usage: (definterceptor encode-response “An interceptor that encodes the response as json” (on-response encode-json))

        +

        Alternatively, you may also: (def encode-response “An interceptor that encodes the response as json” (on-response encode-json)

        +

        defmiddleware

        macro

        (defmiddleware n & args)

        Defines a middleware interceptor. The definition resembles a multiple arity function definition, however both fns are 1-arity. The first fn will be called during the enter stage with the value of the :request key in the context, the second during the leave stage with the response key in the context, e.g.:

        +

        (defmiddleware middleware-interceptor (request(assoc request :middleware :on-request)) (response(assoc response :middleware :on-response)))

        +

        defon-request

        macro

        (defon-request macro-name__14831__auto__ & args__14832__auto__)

        Defines an on-request interceptor. The definition performs pre-processing on a request during the enter stage of interceptor execution. The implicitly created interceptor will extract the request from the context it receives, pass it to the defined function, and then associate the return value from the defined function as into context with the :request key and return context, e.g.:

        +

        (defon-request parse-body-as-wibblefish request (assoc request :wibblefish-params (wibblefish-parse (:body request))))

        +

        This is equivalent to:

        +

        (defbefore parse-body-as-wibblefish context (let request (:request context) new-request (assoc request :wibblefish-params (wibblefish-parse (:body request))) (assoc context :request new-request)))

        +

        defon-response

        macro

        (defon-response macro-name__14831__auto__ & args__14832__auto__)

        Defines an on-response interceptor. The definition performs post processing on a response during the leave stage of interceptor execution. The implicitly created interceptor will extract the response from the context it receives, pass it to the defined function, and then associate the return value from the defined function into context with the :response key and return context, e.g.:

        +

        (defon-response change-body-to-html response (assoc response :body (render-to-html (:body response))))

        +

        This is equivalent to:

        +

        (defafter change-body-to-html context (let response (:response context) new-response (assoc response :body (render-to-html (:body response))) (assoc context :response new-response)))

        +

        handler

        (handler f)(handler n f)

        Returns an interceptor which calls f on the :request value of context, and assoc’s the return value as :response into context during the enter stage.

        +

        infer-rest-interceptor-function

        (infer-rest-interceptor-function args)

        Given list args, return the rest of args that would remain after removing the elements of args that specify the form returned by infer-first-interceptor-function.

        +

        middleware

        (middleware f1 f2)(middleware n f1 f2)

        Returns an interceptor which calls f1 on the :request value of context during the enter stage, and f2 on the :response value of context during the leave stage.

        +

        on-request

        (on-request f)(on-request f & args)

        Returns an interceptor which updates the :request value of context with f during the enter stage.

        +

        on-response

        (on-response f)(on-response f & args)

        Returns an interceptor which updates the :response value of context with f during the leave stage.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.interceptor.html b/api/0.6/io.pedestal.interceptor.html new file mode 100644 index 0000000..dc9bcee --- /dev/null +++ b/api/0.6/io.pedestal.interceptor.html @@ -0,0 +1,6 @@ + +io.pedestal.interceptor documentation

        io.pedestal.interceptor

        Public API for creating interceptors, and various utility fns for common interceptor creation patterns.

        +

        interceptor

        (interceptor t)

        Given a value, produces and returns an Interceptor (Record).

        +

        interceptor-name

        (interceptor-name n)

        interceptor?

        (interceptor? o)

        IntoInterceptor

        protocol

        members

        -interceptor

        (-interceptor t)

        Given a value, produce an Interceptor Record.

        +

        valid-interceptor?

        (valid-interceptor? o)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.interceptor.trace.html b/api/0.6/io.pedestal.interceptor.trace.html new file mode 100644 index 0000000..8889f85 --- /dev/null +++ b/api/0.6/io.pedestal.interceptor.trace.html @@ -0,0 +1,8 @@ + +io.pedestal.interceptor.trace documentation

        io.pedestal.interceptor.trace

        default-span-postprocess

        (default-span-postprocess context span)

        default-span-resolver

        (default-span-resolver context)(default-span-resolver context servlet-class)

        headers->span-context

        (headers->span-context tracer headers)

        tracing-interceptor

        (tracing-interceptor)(tracing-interceptor opts)

        Return an Interceptor for automatically initiating a distributed trace span on every request, which is finished on leave.

        +

        Spans are automatically populated with relevant tags: http.method, http.status_code, http.uri, span.kind

        +

        If on leave there is an :error in the context, this interceptor with log the error with the span.

        +

        Possible options: :span-resolver - a single-arg function that is given the context and returns a started and activated span, resolving any propagated or parent span. The default resolver is io.pedestal.interceptor.trace.default-span-resolver which resolves (in order; first resolution wins): 1. Pedestal tracing values in the Context 2. OpenTracing Servlet values (if the Servlet API class is detected) 3. OpenTracing Header values 4. Nothing found - A new span is created :trace-filter - a single-arg function that is given the context and returns true if a span should be created for this request. If not set or set to nil, spans are created for every request :uri-as-span-operation? - Boolean; True if the request URI should be used as the default span name - defaults to true :default-span-operation - A string or keyword to use as the default span name if URI isn’t found or :uri-as-span-operation? is false. Defaults to ‘PedestalSpan’ :span-postprocess - A function given the context and the span, performs any necessary span cleanup tasks and returns the context

        +

        If the trace-filter or the span-resolver return something falsey, the context is forwarded without an active span

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.log.aws.xray.html b/api/0.6/io.pedestal.log.aws.xray.html new file mode 100644 index 0000000..f99eb6c --- /dev/null +++ b/api/0.6/io.pedestal.log.aws.xray.html @@ -0,0 +1,7 @@ + +io.pedestal.log.aws.xray documentation

        io.pedestal.log.aws.xray

        span-postprocess

        (span-postprocess context span)

        span-resolver

        (span-resolver context)(span-resolver context servlet-class)

        This is an AWS-specific span resolver for use with the io.pedestal.interceptor.trace/tracing-interceptor Interceptor.

        +

        This resolves any possible Span/Segment in the following order: 1. Pedestal tracing value in the Context 2. AWS X-Ray Servlet values (if the Servlet API class is detected) 3. AWS X-Ray Headers 4. Nothing found - a new span/segment is created.

        +

        trace-header-lower

        tracer

        (tracer)

        This function returns an XRay Recorder. You can assign this tracer to be the default in Pedestal Log by either: * Setting the JVM property io.pedestal.log.defaultTracer to ‘io.pedestal.log.aws.xray/tracer’ * Setting the PEDESTAL_TRACER environment variable to ‘io.pedestal.log.aws.xray/tracer’

        +

        If you’re using an OpenTracing adaptor for XRay, you can register the tracer directly with: (io.pedestal.log/-register ...)

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.log.html b/api/0.6/io.pedestal.log.html new file mode 100644 index 0000000..96e9b0d --- /dev/null +++ b/api/0.6/io.pedestal.log.html @@ -0,0 +1,78 @@ + +io.pedestal.log documentation

        io.pedestal.log

        Logging via slf4j. Each logging level is a macro: trace, debug, info, warn, and error. Each namespace gets its own Logger. Arguments are key-value pairs, which will be printed as with ‘pr’. The special key :exception should have a java.lang.Throwable as its value, and will be passed separately to the underlying logging API. One can override the logger via JVM or ENVAR settings.

        +

        *mdc-context*

        dynamic

        This map is copied into the SLF4J MDC when the with-context or with-context-kv macros are used. You are free to take control of it for MDC-related purposes as it doesn’t directly affect Pedestal’s logging implementation.

        +

        This map also includes all options that were passed into with-context.

        +

        active-span

        (active-span)

        Return the current active span; Returns nil if there isn’t an active span.

        +

        add-span-baggage!

        (add-span-baggage! span m)(add-span-baggage! span k v)(add-span-baggage! span bag-k bag-v & kvs)

        counter

        (counter metric-name delta)(counter recorder metric-name delta)

        debug

        macro

        (debug & keyvals)

        default-recorder

        This is the default recorder of all metrics. This value is configured by setting the JVM Property ‘io.pedestal.log.defaultMetricsRecorder’ or the environment variable ‘PEDESTAL_METRICS_RECORDER’. The value of the setting should be a namespaced symbol that resolves to a 0-arity function or nil. That function should return something that satisfies the MetricRecorder protocol. If no function is found, metrics will be reported only to JMX via a DropWizard MetricRegistry.

        +

        default-tracer

        This is the default Tracer, registered as the OpenTracing’s GlobalTracer. This value is configured by setting the JVM Property ‘io.pedestal.log.defaultTracer’ or the environment variable ‘PEDESTAL_TRACER’. The value of the setting should be a namespaced symbol that resolves to a 0-arity function or nil. That function should return something that satisfies the TracerOrigin protocol. If no function is found, the GlobalTracer will default to the NoopTracer and GlobalTracer/isRegistered will be false.

        +

        error

        macro

        (error & keyvals)

        finish-span

        (finish-span span)

        Given a span, finish the span and return it.

        +

        format-name

        (format-name n)

        Format a given metric name, regardless of type, into a string

        +

        gauge

        (gauge metric-name value-fn)(gauge recorder metric-name value-fn)

        histogram

        (histogram metric-name value)(histogram recorder metric-name value)

        info

        macro

        (info & keyvals)

        jmx-reporter

        (jmx-reporter registry)

        log

        (log keyvals)(log keyvals default-level)

        This function provides basic/core logging functionality as a function. You may prefer to use this if you need custom logging functionality beyond what is offered by the standard Pedestal logging macros (which in turn just call the protocols).

        +

        Given a map of logging information, and optionally a default log-level keyword (if not found in the map) – default is :info, Determine the appropriate logger to use, determine if logging-level is enabled, format the logging message, And return the result of calling the appropriate logging function, dispatched to the logging protocols.

        +

        Special keys within the log message: :level – A keyword, the log level to use for this message, defaults to default-level :exception – A Throwable/Exception to log :io.pedestal.log/logger – The logger to use for this message, defaults to the override-logger or the SLF4J logger :io.pedestal.log/logger-name – A String, the loggerName to use if SLF4J logger is used, defaults to *ns* which may be ‘clojure.core’ depending on execution, :io.pedestal.log/formatter – A single-arg function that when given a map, returns a String for logging, defaults to pr-str

        +

        If using this function within a macro, you’re encouraged to merge all ‘meta’ information (like line info) into the log message map. For example:

        +

        (defmacro log-macro log-map (let named-log-map (if (::logger-name log-map) log-map (assoc log-map ::logger-name (name (ns-name ns)))) final-log-map (assoc named-log-map :line (:line (meta &form))) `(log ~final-log-map :info)))

        +

        log-level-dispatch

        log-reporter

        (log-reporter registry)

        log-span

        (log-span span x)(log-span span k v)(log-span span k v & kvs)

        Log to a given span, and return the span.

        +

        If the log message is a string, the message is logged as an info ‘message’. If the log message is a keyword, the message is logged as an ‘event’, without a message. If the log message is a Throwable, the message is logged as an ‘error’, with info extracted from the Throwable If the log message is a map, the map is logged as a series of fields/values.

        +

        This also supports the same logging style as io.pedestal.log – with any number of log keys and values.

        +

        You are encouraged to follow the OpenTracing semantics

        +

        LoggerSource

        protocol

        members

        -debug

        (-debug t body)(-debug t body throwable)

        Log a DEBUG message, and optionally handle a special Throwable/Exception related to the message. The body may be any of Clojure’s literal data types, but a map or string is encouraged.

        +

        -error

        (-error t body)(-error t body throwable)

        Log an ERROR message, and optionally handle a special Throwable/Exception related to the message. The body may be any of Clojure’s literal data types, but a map or string is encouraged.

        +

        -info

        (-info t body)(-info t body throwable)

        Log an INFO message, and optionally handle a special Throwable/Exception related to the message. The body may be any of Clojure’s literal data types, but a map or string is encouraged.

        +

        -level-enabled?

        (-level-enabled? t level-key)

        Given the log level as a keyword, return a boolean if that log level is currently enabled.

        +

        -trace

        (-trace t body)(-trace t body throwable)

        Log a TRACE message, and optionally handle a special Throwable/Exception related to the message. The body may be any of Clojure’s literal data types, but a map or string is encouraged.

        +

        -warn

        (-warn t body)(-warn t body throwable)

        Log a WARN message, and optionally handle a special Throwable/Exception related to the message. The body may be any of Clojure’s literal data types, but a map or string is encouraged.

        +

        LoggingMDC

        protocol

        members

        -clear-mdc

        (-clear-mdc t)

        Remove all entries within the MDC and return the MDC instance.

        +

        -get-mdc

        (-get-mdc t k)(-get-mdc t k not-found)

        Given a String key and optionally a not-found value (which should be a String), lookup the key in the MDC and return the value (A String); Returns nil if the key isn’t present, or not-found if value was supplied.

        +

        -put-mdc

        (-put-mdc t k v)

        Given a String key and a String value, Add an entry to the MDC, and return the MDC instance.

        +

        If k is nil, the original MDC is returned.

        +

        -remove-mdc

        (-remove-mdc t k)

        Given a String key, remove the key-value entry in the MDC if the key is present And return the MDC instance.

        +

        -set-mdc

        (-set-mdc t m)

        Given a map (of String keys and String values), Copy all key-values from the map to the MDC and return the MDC instance.

        +

        make-logger

        (make-logger logger-name)

        Returns a logger which satisfies the LoggerSource protocol.

        +

        maybe-init-java-util-log

        (maybe-init-java-util-log)

        Invoke this once when starting your application to redirect all java.util.logging log messages to SLF4J. The current project’s dependencies must include org.slf4j/jul-to-slf4j.

        +

        mdc-context-key

        meter

        (meter metric-name)(meter metric-name n-events)(meter recorder metric-name n-events)

        metric-registry

        (metric-registry & reporter-init-fns)

        Create a metric-registry. Optionally pass in single-arg functions, which when passed a registry, create, start, and return a reporter.

        +

        MetricRecorder

        protocol

        members

        -counter

        (-counter t metric-name delta)

        Update a single Numeric/Long metric by the delta amount

        +

        -gauge

        (-gauge t metric-name value-fn)

        Register a single metric value, returned by a 0-arg function; This function will be called everytime the Guage value is requested.

        +

        -histogram

        (-histogram t metric-name value)

        Measure a distribution of Long values

        +

        -meter

        (-meter t metric-name n-events)

        Measure the rate of a ticking metric - a meter.

        +

        override-logger

        span

        (span operation-name)(span operation-name parent-span)(span operation-name parent-span opts)

        Given an operation name, and optionally a parent Span, and optionally a map of options return a new Span with the operation name set, started, and active.

        +

        Options are Tracer/TraceOrigin specific but all platforms support a minimum of: :initial-tags - a map of initial tags for the span

        +

        If the parent is not set, the span has no parent (ie: current active spans are ignored). If the parent is nil, the behavior is Tracer/TraceOrigin specific – by default, the span has no parent.

        +

        span-baggage

        (span-baggage span)(span-baggage span k)(span-baggage span k not-found)

        span-log-error-kind

        span-log-error-obj

        span-log-event

        span-log-msg

        span-log-stack

        spy

        macro

        (spy expr)

        Logs expr and its value at DEBUG level, returns value.

        +

        tag-span

        (tag-span span m)(tag-span span k v)(tag-span span tag-k tag-v & kvs)

        Tag a given span.

        +

        Tags can be expressed as: - a single tag key and tag value - a sequence of tag-key tag-values. - a map of tag-keys -> tag-values

        +

        trace

        macro

        (trace & keyvals)

        TraceOrigin

        protocol

        members

        -activate-span

        (-activate-span t span)

        Given a Tracer/TraceOrigin and a span, activate the span and return the newly activated span.

        +

        -active-span

        (-active-span t)

        Given a Tracer/TraceOrigin, return the current, active Span or nil if there isn’t an active span

        +

        -register

        (-register t)

        Given a Tracer/TraceOrigin perform whatver steps are necessary to register that Tracer/TraceOrigin to support the creation of spans, and return the Tracer/TraceOrigin.

        +

        It should not be necessary to make this call in application code. This call is only used when bootstrapping Pedestal’s default-tracer

        +

        -span

        (-span t operation-name)(-span t operation-name parent)(-span t operation-name parent opts)

        Given a Tracer/TraceOrigin, an operation name, and optionally a parent Span, and a map of additional options return a new Span with the operation name set. If the parent is not set, the span has no parent (ie: current active spans are ignored).

        +

        Additional options are platform specific, but all platforms should support the following: :initial-tags - a map of initial tags for the span

        +

        ** The span may be started on creation but should not be activated ** This should be left to application-specific span builders.

        +

        TraceSpan

        protocol

        members

        -finish-span

        (-finish-span t)(-finish-span t micros)

        Given a span, finish/complete and record the span optionally setting an explicit end timestamp in microseconds, and return the span. If no timestamp is specified, now/nanoTime is used, adjusted for microseconds. Multiple calls to -finishSpan should be noops

        +

        -set-operation-name

        (-set-operation-name t operation-name)

        Given a span and the operation name (String), set the logical operation this span represents, and return the Span.

        +

        -tag-span

        (-tag-span t tag-key tag-value)

        Given a span, a tag key (String), and a tag value (String), Set the tag key-value pair on the span for recording, and returns the Span.

        +

        Some trace systems support numeric, object, boolean and other values. The protocol encourages at a minimum String keys and values, but extensions of the protocols are free to make platform-specific type/arg optimizations. Some Trace platforms have semantics around tag keys/values, eg. https://github.com/opentracing/specification/blob/master/semantic_conventions.md

        +

        TraceSpanBaggage

        protocol

        members

        -get-baggage

        (-get-baggage t k)(-get-baggage t k not-found)

        Given a span, a baggage key, and optionally a not-found value, return the baggage value (String) for the corresponding key (if present). If the key isn’t present, return not-found or nil.

        +

        -get-baggage-map

        (-get-baggage-map t)

        Given a span, return a Map of all baggage items.

        +

        -set-baggage

        (-set-baggage t k v)

        Given a span, a baggage key (String) and baggage value (String), add the key and value to the Span (and any additional context holding the span). and return the Span

        +

        Adding baggage allows keys/values to be smuggled across span boundaries, creating a powerful distributed context. Baggage is only propagated to children of the span.

        +

        TraceSpanLog

        protocol

        members

        -error-span

        (-error-span t throwable)(-error-span t throwable micros)

        Given a span, a Throwable, and optionally an explicit timestamp in microseconds, Record the error to the span as an ‘error’, attaching Message, Error.Kind and Error.Object to the span, and return the span.

        +

        -log-span

        (-log-span t msg)(-log-span t msg micros)

        Given a span, a log message/event, and optionally an explicit timestamp in microseconds, Record the message to the span, and return the span.

        +

        If the message is a keyword, the message is recorded as an ‘event’, otherwise message is coerced into a string and recorded as a ‘message’.

        +

        If no timestamp is specified, now/nanoTime is used, adjusted for microseconds.

        +

        TraceSpanLogMap

        protocol

        members

        -log-span-map

        (-log-span-map t msg-map)(-log-span-map t msg-map micros)

        Given a span, a map of fields, and optionally an explicit timestamp in microseconds, Record the event to the span, and return the span.

        +

        Semantic log fields can be found at: https://github.com/opentracing/specification/blob/master/semantic_conventions.md#log-fields-table

        +

        Some Trace Recorders don’t fully support round-tripping maps – use carefully. Some Trace platforms have semantics around key/values, eg. https://github.com/opentracing/specification/blob/master/semantic_conventions.md

        +

        warn

        macro

        (warn & keyvals)

        with-context

        macro

        (with-context ctx-map & body)

        Given a map of keys/values/options and a body, Set the map into the MDC via the mdc-context binding. The MDC used defaults to SLF4J MDC unless the :io.pedestal.log/mdc option is specified (see Options). All options from the map are removed when setting the MDC.

        +

        By default, the map is formatted into a string value and stored under the ‘io.pedestal’ key, via io.pedestal.log/mdc-context-key

        +

        Caveats: SLF4J MDC, only maintains thread-local bindings, users are encouraged to use app-specific MDC implementations when needed.

        +

        Since SLF4J MDC manages data on a per-thread basis, false information may be contained in the MDC if threads are recycled. Refer to the slf4j docs for more information.

        +

        Options: :io.pedestal.log/formatter - a single-arg function that when given the map, returns a formatted string Defaults to pr-str :io.pedestal.log/mdc - An object that satisfies the LoggingMDC protocol Defaults to the SLF4J MDC.

        +

        Note: If you mix with-context with the more basic with-context-kv, you may see undesired keys/values in the log

        +

        with-context-kv

        macro

        (with-context-kv k v & body)

        Given a key, value, and body, associates the key-value pair into the mdc-context only for the scope/execution of body, and sets the mdc-context into the SLF4J MDC under the ‘io.pedestal’ key (via io.pedestal.log/mdc-context-key) using pr-str on the map for the MDC value.

        +

        Note: No keys are are dissoc’d from mdc-context with this simplified version. If you mix with-context and with-context-kv, you may see undesired keys/values in the log

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.service-tools.dev.html b/api/0.6/io.pedestal.service-tools.dev.html new file mode 100644 index 0000000..afe124d --- /dev/null +++ b/api/0.6/io.pedestal.service-tools.dev.html @@ -0,0 +1,5 @@ + +io.pedestal.service-tools.dev documentation

        io.pedestal.service-tools.dev

        watch

        (watch)(watch src-paths)

        Watches a list of directories for file changes, reloading them as necessary.

        +

        watch-routes-fn

        (watch-routes-fn routes-var)(watch-routes-fn routes-var src-paths)

        Given a routes var and optionally a vector of paths to watch, return a function suitable for a service’s :routes entry, that reloads routes on source file changes.

        +
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.service-tools.war.html b/api/0.6/io.pedestal.service-tools.war.html new file mode 100644 index 0000000..a8e971e --- /dev/null +++ b/api/0.6/io.pedestal.service-tools.war.html @@ -0,0 +1,7 @@ + +io.pedestal.service-tools.war documentation

        io.pedestal.service-tools.war

        app-server-ns

        (app-server-ns opts)

        default-pedestal-manifest

        dir-entry

        (dir-entry war opts war-root dir-path)

        file-entry

        (file-entry war opts war-path file)

        in-war-path

        (in-war-path war-path root file)

        make-manifest

        (make-manifest)(make-manifest manifest-map)

        make-web-xml

        (make-web-xml opts)

        Given a map of options, return a string of XML - the web.xml for the service/WAR.

        +

        Available options and default values :web-xml - a slurpable path, which is returned as the web.xml string. NOTE: All other options will be ignored. :servlet-description “Pedestal HTTP Servlet” :servlet-display-name - defaults to :servlet-description :servlet-name “PedestalServlet” :servlet-class “io.pedestal.servlet.ClojureVarServlet” :url-patterns “/*” :server-ns - Requires there to be fns servlet-init servlet-service servlet-destroy

        +

        manifest-str

        (manifest-str manifest-map)

        Given a map of manifest keys/values, Return a string of the single Manifest contents

        +

        skip-file?

        (skip-file? file war-path exclusions)

        string-input-stream

        (string-input-stream s)

        war

        (war opts)(war opts war-name-str)

        Create a PedestalService.war file. Optionally pass in a war file name. Various options are supported via the opt map :target-path - where the war will be saved; defaults to “.” :manifest - a map of override/additional Manifest entries; keys and values are both strings :compile-path - an optional, additional path of compiled resources to include :resource-paths - a vector of all additional sources, resources, war-resources to include :war-exclusions - a vector of regex strings; patterns of file names to exclude in the war

        +

        war-file-path

        (war-file-path target-dir war-name)

        write-entry

        (write-entry war war-path entry)

        write-war

        (write-war opts war-path & postprocess-fns)
        \ No newline at end of file diff --git a/api/0.6/io.pedestal.test.html b/api/0.6/io.pedestal.test.html new file mode 100644 index 0000000..e798422 --- /dev/null +++ b/api/0.6/io.pedestal.test.html @@ -0,0 +1,10 @@ + +io.pedestal.test documentation

        io.pedestal.test

        Pedestal testing utilities to simplify working with pedestal apps.

        +

        parse-url

        (parse-url url)

        raw-response-for

        (raw-response-for interceptor-service-fn verb url & options)

        Return a ring response map for an HTTP request of type verb against url url, when applied to interceptor-service-fn. Useful for integration testing pedestal applications and getting all relevant middlewares invoked, including ones which integrate with the servlet infrastructure. The response body will be returned as a ByteArrayOutputStream. Options:

        +

        :body : An optional string that is the request body. :headers : An optional map that are the headers

        +

        response-for

        (response-for interceptor-service-fn verb url & options)

        Return a ring response map for an HTTP request of type verb against url url, when applied to interceptor-service-fn. Useful for integration testing pedestal applications and getting all relevant middlewares invoked, including ones which integrate with the servlet infrastructure. The response body will be converted to a UTF-8 string. Options:

        +

        :body : An optional string that is the request body. :headers : An optional map that are the headers

        +

        servlet-response-for

        (servlet-response-for interceptor-service-fn verb url & args)

        Return a ring response map for an HTTP request of type verb against url url, when applied to interceptor-service-fn. Useful for integration testing pedestal applications and getting all relevant middlewares invoked, including ones which integrate with the servlet infrastructure.

        +

        test-servlet-response

        (test-servlet-response)

        Returns a mock servlet response with a ServletOutputStream over a ByteArrayOutputStream. Captures the ByteArrayOutputStream in metadata. All headers set will swap a headers map held in an atom, also held in metadata.

        +

        test-servlet-response-body

        (test-servlet-response-body test-servlet-response)

        test-servlet-response-headers

        (test-servlet-response-headers test-servlet-response)

        test-servlet-response-status

        (test-servlet-response-status test-servlet-response)

        TestRequestBody

        protocol

        members

        ->servlet-input-stream

        (->servlet-input-stream input)
        \ No newline at end of file diff --git a/api/0.6/js/highlight.min.js b/api/0.6/js/highlight.min.js new file mode 100644 index 0000000..6486ffd --- /dev/null +++ b/api/0.6/js/highlight.min.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.6.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/[&<>]/gm,function(e){return I[e]})}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return R(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||R(i))return i}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){l+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):E(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"===e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":y.classPrefix,i='',i+n+o}function p(){var e,t,r,a;if(!E.k)return n(B);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(B);r;)a+=n(B.substr(t,r.index-t)),e=g(E,r),e?(M+=e[1],a+=h(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(B);return a+n(B.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!x[E.sL])return n(B);var t=e?l(E.sL,B,!0,L[E.sL]):f(B,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(L[E.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){k+=null!=E.sL?d():p(),B=""}function v(e){k+=e.cN?h(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(B+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?B+=n:(t.eB&&(B+=n),b(),t.rB||t.eB||(B=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?B+=n:(a.rE||a.eE||(B+=n),b(),a.eE&&(B=n));do E.cN&&(k+=C),E.skip||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return B+=n,n.length||1}var N=R(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,E=i||N,L={},k="";for(w=E;w!==N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var B="",M=0;try{for(var I,j,O=0;;){if(E.t.lastIndex=O,I=E.t.exec(t),!I)break;j=m(t.substr(O,I.index-O),I[0]),O=I.index+j}for(m(t.substr(O)),w=E;w.parent;w=w.parent)w.cN&&(k+=C);return{r:M,value:k,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function f(e,t){t=t||y.languages||E(x);var r={r:0,value:n(e)},a=r;return t.filter(R).forEach(function(n){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return y.tabReplace||y.useBR?e.replace(M,function(e,n){return y.useBR&&"\n"===e?"
        ":y.tabReplace?n.replace(/\t/g,y.tabReplace):void 0}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n,t,r,o,s,p=i(e);a(p)||(y.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=p?l(p,s,!0):f(s),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),s)),r.value=g(r.value),e.innerHTML=r.value,e.className=h(e.className,p,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function d(e){y=o(y,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");w.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function N(){return E(x)}function R(e){return e=(e||"").toLowerCase(),x[e]||x[L[e]]}var w=[],E=Object.keys,x={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
        ",y={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},I={"&":"&","<":"<",">":">"};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=R,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("clojure",function(e){var t={"builtin-name":"def defonce cond apply if-not if-let if not not= = < > <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"},r="a-zA-Z_\\-!.?+*=<>&#'",n="["+r+"]["+r+"0-9/;:]*",a="[-+]?\\d+(\\.\\d+)?",o={b:n,r:0},s={cN:"number",b:a,r:0},i=e.inherit(e.QSM,{i:null}),c=e.C(";","$",{r:0}),d={cN:"literal",b:/\b(true|false|nil)\b/},l={b:"[\\[\\{]",e:"[\\]\\}]"},m={cN:"comment",b:"\\^"+n},p=e.C("\\^\\{","\\}"),u={cN:"symbol",b:"[:]{1,2}"+n},f={b:"\\(",e:"\\)"},h={eW:!0,r:0},y={k:t,l:n,cN:"name",b:n,starts:h},b=[f,i,m,p,c,u,l,s,d,o];return f.c=[e.C("comment",""),y,h],h.c=b,l.c=b,{aliases:["clj"],i:/\S/,c:[f,i,m,p,c,u,l,s,d]}});hljs.registerLanguage("clojure-repl",function(e){return{c:[{cN:"meta",b:/^([\w.-]+|\s*#_)=>/,starts:{e:/$/,sL:"clojure"}}]}}); \ No newline at end of file diff --git a/api/0.6/js/jquery.min.js b/api/0.6/js/jquery.min.js new file mode 100644 index 0000000..73f33fb --- /dev/null +++ b/api/0.6/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
        ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f +}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
        a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
        ","
        "],area:[1,"",""],param:[1,"",""],thead:[1,"","
        "],tr:[2,"","
        "],col:[2,"","
        "],td:[3,"","
        "],_default:l.htmlSerialize?[0,"",""]:[1,"X
        ","
        "]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("