diff options
author | Clemens <cle1000.cb@gmail.com> | 2016-07-19 12:32:36 +0200 |
---|---|---|
committer | Clemens <cle1000.cb@gmail.com> | 2016-07-19 12:32:36 +0200 |
commit | 698fb11132598a38851383f805dde5ca4d2a046d (patch) | |
tree | 95fc0184735722ccd6e4697f884496d6852e13f6 | |
parent | 48728af43ad746d70ef3e251dc28b75028dea1e6 (diff) | |
parent | 18dd84b9081fb5552d5b5b2560405496445e2110 (diff) | |
download | mitmproxy-698fb11132598a38851383f805dde5ca4d2a046d.tar.gz mitmproxy-698fb11132598a38851383f805dde5ca4d2a046d.tar.bz2 mitmproxy-698fb11132598a38851383f805dde5ca4d2a046d.zip |
Merge remote-tracking branch 'origin/master' into flow_editing
197 files changed, 5992 insertions, 4960 deletions
diff --git a/.appveyor.yml b/.appveyor.yml index 61817a92..dae12978 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -30,7 +30,7 @@ test_script: deploy_script: ps: | if( - ($Env:TOXENV -match "py27") -and + ($Env:TOXENV -match "py35") -and (($Env:APPVEYOR_REPO_BRANCH -match "master") -or ($Env:APPVEYOR_REPO_TAG -match "true")) ) { pip install -U virtualenv diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 6b8710a7..00000000 --- a/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -.git diff --git a/.python-version b/.python-version deleted file mode 100644 index 2339c8bf..00000000 --- a/.python-version +++ /dev/null @@ -1,2 +0,0 @@ -2.7.11 -3.5.1 diff --git a/.sources/bootswatch.less b/.sources/bootswatch.less deleted file mode 100644 index f9e4b827..00000000 --- a/.sources/bootswatch.less +++ /dev/null @@ -1,171 +0,0 @@ -// Bootswatch.less -// Swatch: Journal -// Version: 2.0.4 -// ----------------------------------------------------- - -// TYPOGRAPHY -// ----------------------------------------------------- - -@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700'); - -h1, h2, h3, h4, h5, h6, .navbar .brand { - font-weight: 700; -} - -// SCAFFOLDING -// ----------------------------------------------------- - -a { - text-decoration: none; -} - -.nav a, .navbar .brand, .subnav a, a.btn, .dropdown-menu a { - text-decoration: none; -} - -// NAVBAR -// ----------------------------------------------------- - -.navbar { - - .navbar-inner { - @shadow: 0 2px 4px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); - .box-shadow(@shadow); - border-top: 1px solid #E5E5E5; - .border-radius(0); - } - - .brand { - text-shadow: none; - - &:hover { - background-color: #EEEEEE; - } - } - - .navbar-text { - line-height: 68px; - } - - .nav > li > a { - text-shadow: none; - } - - .dropdown-menu { - .border-radius(0); - } - - .nav li.dropdown.active > .dropdown-toggle, - .nav li.dropdown.active > .dropdown-toggle:hover, - .nav li.dropdown.open > .dropdown-toggle, - .nav li.dropdown.active.open > .dropdown-toggle, - .nav li.dropdown.active.open > .dropdown-toggle:hover { - background-color: @grayLighter; - color: @linkColor; - } - - .nav li.dropdown .dropdown-toggle .caret, - .nav .open .caret, - .nav .open .dropdown-toggle:hover .caret { - border-top-color: @black; - opacity: 1; - } - - .nav-collapse.in .nav li > a:hover { - background-color: @grayLighter; - } - - .nav-collapse .nav li > a { - color: @textColor; - text-decoration: none; - font-weight: normal; - } - - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - border-color: transparent; - } - - .navbar-search .search-query, - .navbar-search .search-query:hover { - border: 1px solid @grayLighter; - color: @textColor; - .placeholder(@gray); - } -} - -div.subnav { - background-color: @bodyBackground; - background-image: none; - @shadow: 0 1px 2px rgba(0,0,0,.25); - .box-shadow(@shadow); - .border-radius(0); - - &.subnav-fixed { - top: @navbarHeight; - } - - .nav > li > a:hover, - .nav > .active > a, - .nav > .active > a:hover { - color: @textColor; - text-decoration: none; - font-weight: normal; - } - - .nav > li:first-child > a, - .nav > li:first-child > a:hover { - .border-radius(0); - } -} - -// BUTTONS -// ----------------------------------------------------- - -.btn-primary { - .buttonBackground(lighten(@linkColor, 5%), @linkColor); -} - -[class^="icon-"], [class*=" icon-"] { - vertical-align: -2px; -} - -// MODALS -// ----------------------------------------------------- - -.modal { - .border-radius(0px); - background: @bodyBackground; -} - -.modal-header { - border-bottom: none; -} - -.modal-header .close { - text-decoration: none; -} - -.modal-footer { - background: transparent; - .box-shadow(none); - border-top: none; -} - - -// MISC -// ----------------------------------------------------- - -code, pre, pre.prettyprint, .well { - background-color: @grayLighter; -} - -.hero-unit { - .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); - border: 1px solid rgba(0,0,0,.05); - .border-radius(0); -} - -.table-bordered, .well, .prettyprint { - .border-radius(0); -} diff --git a/.sources/make b/.sources/make deleted file mode 100644 index 94648859..00000000 --- a/.sources/make +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -pygmentize -f html ../examples/test_context.py > ../pathod/templates/examples_context.html -pygmentize -f html ../examples/test_setup.py > ../pathod/templates/examples_setup.html -pygmentize -f html ../examples/test_setupall.py > ../pathod/templates/examples_setupall.html -pygmentize -f html ../examples/pathod_pathoc.py > ../pathod/templates/pathod_pathoc.html diff --git a/.sources/variables.less b/.sources/variables.less deleted file mode 100644 index 75ff5be6..00000000 --- a/.sources/variables.less +++ /dev/null @@ -1,208 +0,0 @@ -// Variables.less -// Variables to customize the look and feel of Bootstrap -// Swatch: Journal -// Version: 2.0.4 -// ----------------------------------------------------- - -// GLOBAL VALUES -// -------------------------------------------------- - - -// Grays -// ------------------------- -@black: #000; -@grayDarker: #222; -@grayDark: #333; -@gray: #888; -@grayLight: #999; -@grayLighter: #eee; -@white: #fff; - - -// Accent colors -// ------------------------- -@blue: #4380D3; -@blueDark: darken(@blue, 15%); -@green: #22B24C; -@red: #C00; -@yellow: #FCFADB; -@orange: #FF7F00; -@pink: #CC99CC; -@purple: #7a43b6; -@tan: #FFCA73; - - - -// Scaffolding -// ------------------------- -@bodyBackground: #FCFBFD; -@textColor: @grayDarker; - - -// Links -// ------------------------- -@linkColor: @blue; -@linkColorHover: @red; - - -// Typography -// ------------------------- -@sansFontFamily: 'Open Sans', "Helvetica Neue", Helvetica, Arial, sans-serif; -@serifFontFamily: Georgia, "Times New Roman", Times, serif; -@monoFontFamily: Menlo, Monaco, Consolas, "Courier New", monospace; - -@baseFontSize: 14px; -@baseFontFamily: @sansFontFamily; -@baseLineHeight: 18px; -@altFontFamily: @serifFontFamily; - -@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily -@headingsFontWeight: bold; // instead of browser default, bold -@headingsColor: inherit; // empty to use BS default, @textColor - - -// Tables -// ------------------------- -@tableBackground: transparent; // overall background-color -@tableBackgroundAccent: @grayLighter; // for striping -@tableBackgroundHover: #f5f5f5; // for hover -@tableBorder: #ddd; // table and cell border - - -// Buttons -// ------------------------- -@btnBackground: @white; -@btnBackgroundHighlight: darken(@white, 10%); -@btnBorder: darken(@white, 20%); - -@btnPrimaryBackground: @linkColor; -@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 15%); - -@btnInfoBackground: #5bc0de; -@btnInfoBackgroundHighlight: #2f96b4; - -@btnSuccessBackground: #62c462; -@btnSuccessBackgroundHighlight: #51a351; - -@btnWarningBackground: lighten(@orange, 10%); -@btnWarningBackgroundHighlight: @orange; - -@btnDangerBackground: #ee5f5b; -@btnDangerBackgroundHighlight: #bd362f; - -@btnInverseBackground: @linkColor; -@btnInverseBackgroundHighlight: darken(@linkColor, 5%); - - -// Forms -// ------------------------- -@inputBackground: @white; -@inputBorder: #ccc; -@inputBorderRadius: 3px; -@inputDisabledBackground: @grayLighter; -@formActionsBackground: @grayLighter; - -// Dropdowns -// ------------------------- -@dropdownBackground: @bodyBackground; -@dropdownBorder: rgba(0,0,0,.2); -@dropdownLinkColor: @textColor; -@dropdownLinkColorHover: @textColor; -@dropdownLinkBackgroundHover: #eee; -@dropdownDividerTop: #e5e5e5; -@dropdownDividerBottom: @white; - - - -// COMPONENT VARIABLES -// -------------------------------------------------- - -// Z-index master list -// ------------------------- -// Used for a bird's eye view of components dependent on the z-axis -// Try to avoid customizing these :) -@zindexDropdown: 1000; -@zindexPopover: 1010; -@zindexTooltip: 1020; -@zindexFixedNavbar: 1030; -@zindexModalBackdrop: 1040; -@zindexModal: 1050; - - -// Sprite icons path -// ------------------------- -@iconSpritePath: "../img/glyphicons-halflings.png"; -@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png"; - - -// Input placeholder text color -// ------------------------- -@placeholderText: @grayLight; - - -// Hr border color -// ------------------------- -@hrBorder: @grayLighter; - - -// Navbar -// ------------------------- -@navbarHeight: 50px; -@navbarBackground: @bodyBackground; -@navbarBackgroundHighlight: @bodyBackground; - -@navbarText: @textColor; -@navbarLinkColor: @linkColor; -@navbarLinkColorHover: @linkColor; -@navbarLinkColorActive: @navbarLinkColorHover; -@navbarLinkBackgroundHover: @grayLighter; -@navbarLinkBackgroundActive: @grayLighter; - -@navbarSearchBackground: lighten(@navbarBackground, 25%); -@navbarSearchBackgroundFocus: @white; -@navbarSearchBorder: darken(@navbarSearchBackground, 30%); -@navbarSearchPlaceholderColor: #ccc; -@navbarBrandColor: @blue; - - -// Hero unit -// ------------------------- -@heroUnitBackground: @grayLighter; -@heroUnitHeadingColor: inherit; -@heroUnitLeadColor: inherit; - - -// Form states and alerts -// ------------------------- -@warningText: #c09853; -@warningBackground: #fcf8e3; -@warningBorder: darken(spin(@warningBackground, -10), 3%); - -@errorText: #b94a48; -@errorBackground: #f2dede; -@errorBorder: darken(spin(@errorBackground, -10), 3%); - -@successText: #468847; -@successBackground: #dff0d8; -@successBorder: darken(spin(@successBackground, -10), 5%); - -@infoText: #3a87ad; -@infoBackground: #d9edf7; -@infoBorder: darken(spin(@infoBackground, -10), 7%); - - - -// GRID -// -------------------------------------------------- - -// Default 940px grid -// ------------------------- -@gridColumns: 12; -@gridColumnWidth: 60px; -@gridGutterWidth: 20px; -@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); - -// Fluid grid -// ------------------------- -@fluidGridColumnWidth: 6.382978723%; -@fluidGridGutterWidth: 2.127659574%; diff --git a/.travis.yml b/.travis.yml index a0e3c370..e832d058 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,10 @@ matrix: include: - python: 3.5 env: TOXENV=lint +# - os: osx +# osx_image: xcode7.3 +# language: generic +# env: TOXENV=py35 - python: 3.5 env: TOXENV=py35 - python: 3.5 @@ -28,12 +32,6 @@ matrix: env: TOXENV=py27 - python: 2.7 env: TOXENV=py27 NO_ALPN=1 - - language: generic - os: osx - osx_image: xcode7.1 - git: - depth: 9999999 - env: TOXENV=py27 - python: 3.5 env: TOXENV=docs allow_failures: @@ -44,20 +42,26 @@ install: if [[ $TRAVIS_OS_NAME == "osx" ]] then brew update || brew update # try again if it fails - brew outdated openssl || brew upgrade openssl - brew install python + brew upgrade + brew reinstall openssl + brew reinstall pyenv + eval "$(pyenv init -)" + env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install --skip-existing 3.5.2 + pyenv global 3.5.2 + pyenv shell 3.5.2 + pip install -U pip setuptools wheel virtualenv fi - pip install tox -script: set -o pipefail; tox -- --cov netlib --cov mitmproxy --cov pathod 2>&1 | grep -v Cryptography_locking_cb +script: set -o pipefail; python -m tox -- --cov netlib --cov mitmproxy --cov pathod 2>&1 | grep -v Cryptography_locking_cb after_success: - | if [[ $TRAVIS_OS_NAME == "osx" && $TRAVIS_PULL_REQUEST == "false" && ($TRAVIS_BRANCH == "master" || -n $TRAVIS_TAG) ]] then - pip install -U virtualenv - ./dev.sh - source venv/bin/activate + git fetch --unshallow + ./dev.sh 3.5 + source venv3.5/bin/activate pip install -e ./release python ./release/rtool.py bdist python ./release/rtool.py upload-snapshot --bdist --wheel @@ -71,4 +75,7 @@ notifications: on_failure: change on_start: never -cache: pip +cache: + directories: + - $HOME/.pyenv + - $HOME/.cache/pip diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a689ed5e..00000000 --- a/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM mitmproxy/base:latest-onbuild -EXPOSE 8080 -EXPOSE 8081 -VOLUME /certs @@ -52,9 +52,9 @@ If you want to contribute changes, keep on reading. Hacking ------- -To get started hacking on mitmproxy, make sure you have Python_ 2.7.x. with +To get started hacking on mitmproxy, make sure you have Python_ 3.5.x or above with virtualenv_ installed (you can find installation instructions for virtualenv -here_). Then do the following: +`here <http://virtualenv.readthedocs.org/en/latest/>`_). Then do the following: .. code-block:: text @@ -111,12 +111,12 @@ The following tox environments are relevant for local testing: .. code-block:: text tox -e py27 # runs all tests with Python 2.7 - tox -e py35 # runs all tests with Python 3.5 (partial support only) + tox -e py35 # runs all tests with Python 3.5 tox -e docs # runs a does-it-compile check on the documentation tox -e lint # runs the linter for coding style checks -We are in the middle of transitioning to Python 3, so please make sure all tests -pass in Python 2.7 and 3.5. Running `tox` ensure all necessary tests are executed. +We support Python 2.7 and 3.5, so please make sure all tests pass in both +environments. Running `tox` ensures all necessary tests are executed. Documentation @@ -194,7 +194,6 @@ PR checks will fail and block merging. We are using this command to check for st .. _Python: https://www.python.org/ .. _virtualenv: http://virtualenv.readthedocs.org/en/latest/ -.. _here: http://virtualenv.readthedocs.org/en/latest/installation.html .. _autoenv: https://github.com/kennethreitz/autoenv .. _.env: https://github.com/mitmproxy/mitmproxy/blob/master/.env .. _Sphinx: http://sphinx-doc.org/ diff --git a/docs/dev/models.rst b/docs/dev/models.rst index 02f36f58..7260f1f7 100644 --- a/docs/dev/models.rst +++ b/docs/dev/models.rst @@ -56,8 +56,6 @@ Datastructures :special-members: :no-undoc-members: - .. autoclass:: decoded - .. automodule:: netlib.multidict .. autoclass:: MultiDictView diff --git a/docs/scripting/inlinescripts.rst b/docs/scripting/inlinescripts.rst index 1ee44972..bc9d5ff5 100644 --- a/docs/scripting/inlinescripts.rst +++ b/docs/scripting/inlinescripts.rst @@ -15,9 +15,7 @@ client: :caption: examples/add_header.py :language: python -The first argument to each event method is an instance of -:py:class:`~mitmproxy.script.ScriptContext` that lets the script interact with the global mitmproxy -state. The **response** event also gets an instance of :py:class:`~mitmproxy.models.HTTPFlow`, +All events that deal with an HTTP request get an instance of :py:class:`~mitmproxy.models.HTTPFlow`, which we can use to manipulate the response itself. We can now run this script using mitmdump or mitmproxy as follows: @@ -36,11 +34,6 @@ We encourage you to either browse them locally or on `GitHub`_. Events ------ -The ``context`` argument passed to each event method is always a -:py:class:`~mitmproxy.script.ScriptContext` instance. It is guaranteed to be the same object -for the scripts lifetime and is not shared between multiple inline scripts. You can safely use it -to store any form of state you require. - Script Lifecycle Events ^^^^^^^^^^^^^^^^^^^^^^^ @@ -155,8 +148,9 @@ The canonical API documentation is the code, which you can browse here, locally The main classes you will deal with in writing mitmproxy scripts are: -:py:class:`~mitmproxy.script.ScriptContext` - - A handle for interacting with mitmproxy's Flow Master from within scripts. +:py:class:`mitmproxy.flow.FlowMaster` + - The "heart" of mitmproxy, usually subclassed as :py:class:`mitmproxy.dump.DumpMaster` or + :py:class:`mitmproxy.console.ConsoleMaster`. :py:class:`~mitmproxy.models.ClientConnection` - Describes a client connection. :py:class:`~mitmproxy.models.ServerConnection` @@ -173,16 +167,7 @@ The main classes you will deal with in writing mitmproxy scripts are: - A dictionary-like object for managing HTTP headers. :py:class:`netlib.certutils.SSLCert` - Exposes information SSL certificates. -:py:class:`mitmproxy.flow.FlowMaster` - - The "heart" of mitmproxy, usually subclassed as :py:class:`mitmproxy.dump.DumpMaster` or - :py:class:`mitmproxy.console.ConsoleMaster`. - -Script Context --------------- -.. autoclass:: mitmproxy.script.ScriptContext - :members: - :undoc-members: Running scripts in parallel --------------------------- diff --git a/docs/tutorials/gamecenter.rst b/docs/tutorials/gamecenter.rst index 9dce5df8..d0d73b73 100644 --- a/docs/tutorials/gamecenter.rst +++ b/docs/tutorials/gamecenter.rst @@ -51,7 +51,7 @@ The contents of the submission are particularly interesting: <key>context</key> <integer>0</integer> <key>score-value</key> - <integer>0</integer> + <integer>55</integer> <key>timestamp</key> <integer>1363515361321</integer> </dict> diff --git a/examples/add_header.py b/examples/add_header.py index cf1b53cc..3e0b5f1e 100644 --- a/examples/add_header.py +++ b/examples/add_header.py @@ -1,2 +1,2 @@ -def response(context, flow): +def response(flow): flow.response.headers["newheader"] = "foo" diff --git a/examples/change_upstream_proxy.py b/examples/change_upstream_proxy.py index 34a6eece..49d5379f 100644 --- a/examples/change_upstream_proxy.py +++ b/examples/change_upstream_proxy.py @@ -14,7 +14,7 @@ def proxy_address(flow): return ("localhost", 8081) -def request(context, flow): +def request(flow): if flow.request.method == "CONNECT": # If the decision is done by domain, one could also modify the server address here. # We do it after CONNECT here to have the request data available as well. diff --git a/examples/custom_contentviews.py b/examples/custom_contentviews.py index 92fb6a58..5a63e2a0 100644 --- a/examples/custom_contentviews.py +++ b/examples/custom_contentviews.py @@ -62,9 +62,9 @@ class ViewPigLatin(contentviews.View): pig_view = ViewPigLatin() -def start(context): - context.add_contentview(pig_view) +def start(): + contentviews.add(pig_view) -def done(context): - context.remove_contentview(pig_view) +def done(): + contentviews.remove(pig_view) diff --git a/examples/dns_spoofing.py b/examples/dns_spoofing.py index 8d715f33..c020047f 100644 --- a/examples/dns_spoofing.py +++ b/examples/dns_spoofing.py @@ -28,7 +28,7 @@ import re parse_host_header = re.compile(r"^(?P<host>[^:]+|\[.+\])(?::(?P<port>\d+))?$") -def request(context, flow): +def request(flow): if flow.client_conn.ssl_established: flow.request.scheme = "https" sni = flow.client_conn.connection.get_servername() diff --git a/examples/dup_and_replay.py b/examples/dup_and_replay.py index 9ba91d3b..b47bf951 100644 --- a/examples/dup_and_replay.py +++ b/examples/dup_and_replay.py @@ -1,4 +1,7 @@ -def request(context, flow): - f = context.duplicate_flow(flow) +from mitmproxy import master + + +def request(flow): + f = master.duplicate_flow(flow) f.request.path = "/changed" - context.replay_request(f) + master.replay_request(f, block=True, run_scripthooks=False) diff --git a/examples/fail_with_500.py b/examples/fail_with_500.py index aec85b50..9710f74a 100644 --- a/examples/fail_with_500.py +++ b/examples/fail_with_500.py @@ -1,3 +1,3 @@ -def response(context, flow): +def response(flow): flow.response.status_code = 500 flow.response.content = b"" diff --git a/examples/filt.py b/examples/filt.py index 1a423845..21744edd 100644 --- a/examples/filt.py +++ b/examples/filt.py @@ -3,14 +3,16 @@ import sys from mitmproxy import filt +state = {} -def start(context): + +def start(): if len(sys.argv) != 2: raise ValueError("Usage: -s 'filt.py FILTER'") - context.filter = filt.parse(sys.argv[1]) + state["filter"] = filt.parse(sys.argv[1]) -def response(context, flow): - if flow.match(context.filter): +def response(flow): + if flow.match(state["filter"]): print("Flow matches filter:") print(flow) diff --git a/examples/flowwriter.py b/examples/flowwriter.py index cb5ccb0d..07c7ca20 100644 --- a/examples/flowwriter.py +++ b/examples/flowwriter.py @@ -3,8 +3,10 @@ import sys from mitmproxy.flow import FlowWriter +state = {} -def start(context): + +def start(): if len(sys.argv) != 2: raise ValueError('Usage: -s "flowriter.py filename"') @@ -12,9 +14,9 @@ def start(context): f = sys.stdout else: f = open(sys.argv[1], "wb") - context.flow_writer = FlowWriter(f) + state["flow_writer"] = FlowWriter(f) -def response(context, flow): +def response(flow): if random.choice([True, False]): - context.flow_writer.add(flow) + state["flow_writer"].add(flow) diff --git a/examples/har_extractor.py b/examples/har_extractor.py index a5c05519..76059d8e 100644 --- a/examples/har_extractor.py +++ b/examples/har_extractor.py @@ -2,6 +2,7 @@ This inline script utilizes harparser.HAR from https://github.com/JustusW/harparser to generate a HAR log object. """ +import mitmproxy.ctx import six import sys import pytz @@ -54,7 +55,13 @@ class _HARLog(HAR.log): return self.__page_list__ -def start(context): +class Context(object): + pass + +context = Context() + + +def start(): """ On start we create a HARLog instance. You will have to adapt this to suit your actual needs of HAR generation. As it will probably be @@ -79,7 +86,7 @@ def start(context): context.seen_server = set() -def response(context, flow): +def response(flow): """ Called when a server response has been received. At the time of this message both a request and a response are present and completely done. @@ -133,7 +140,7 @@ def response(context, flow): for k, v in flow.request.query or {}] response_body_size = len(flow.response.content) - response_body_decoded_size = len(flow.response.get_decoded_content()) + response_body_decoded_size = len(flow.response.content) response_body_compression = response_body_decoded_size - response_body_size entry = HAR.entries({ @@ -201,7 +208,7 @@ def response(context, flow): context.HARLog.add(entry) -def done(context): +def done(): """ Called once on script shutdown, after any other events. """ @@ -212,17 +219,19 @@ def done(context): compressed_json_dump = context.HARLog.compress() if context.dump_file == '-': - context.log(pprint.pformat(json.loads(json_dump))) + mitmproxy.ctx.log(pprint.pformat(json.loads(json_dump))) elif context.dump_file.endswith('.zhar'): - file(context.dump_file, "w").write(compressed_json_dump) + with open(context.dump_file, "wb") as f: + f.write(compressed_json_dump) else: - file(context.dump_file, "w").write(json_dump) - context.log( + with open(context.dump_file, "wb") as f: + f.write(json_dump) + mitmproxy.ctx.log( "HAR log finished with %s bytes (%s bytes compressed)" % ( len(json_dump), len(compressed_json_dump) ) ) - context.log( + mitmproxy.ctx.log( "Compression rate is %s%%" % str( 100. * len(compressed_json_dump) / len(json_dump) ) diff --git a/examples/iframe_injector.py b/examples/iframe_injector.py index ebb5fd02..352c3c24 100644 --- a/examples/iframe_injector.py +++ b/examples/iframe_injector.py @@ -2,27 +2,27 @@ # (this script works best with --anticache) import sys from bs4 import BeautifulSoup -from mitmproxy.models import decoded +iframe_url = None -def start(context): + +def start(): if len(sys.argv) != 2: raise ValueError('Usage: -s "iframe_injector.py url"') - context.iframe_url = sys.argv[1] + global iframe_url + iframe_url = sys.argv[1] -def response(context, flow): - if flow.request.host in context.iframe_url: +def response(flow): + if flow.request.host in iframe_url: return - with decoded(flow.response): # Remove content encoding (gzip, ...) - html = BeautifulSoup(flow.response.content, "lxml") - if html.body: - iframe = html.new_tag( - "iframe", - src=context.iframe_url, - frameborder=0, - height=0, - width=0) - html.body.insert(0, iframe) - flow.response.content = str(html).encode("utf8") - context.log("Iframe inserted.") + html = BeautifulSoup(flow.response.content, "lxml") + if html.body: + iframe = html.new_tag( + "iframe", + src=iframe_url, + frameborder=0, + height=0, + width=0) + html.body.insert(0, iframe) + flow.response.content = str(html).encode("utf8") diff --git a/examples/modify_form.py b/examples/modify_form.py index 3fe0cf96..b63a1586 100644 --- a/examples/modify_form.py +++ b/examples/modify_form.py @@ -1,4 +1,4 @@ -def request(context, flow): +def request(flow): if flow.request.urlencoded_form: flow.request.urlencoded_form["mitmproxy"] = "rocks" else: diff --git a/examples/modify_querystring.py b/examples/modify_querystring.py index b89e5c8d..ee8a89ad 100644 --- a/examples/modify_querystring.py +++ b/examples/modify_querystring.py @@ -1,2 +1,2 @@ -def request(context, flow): +def request(flow): flow.request.query["mitmproxy"] = "rocks" diff --git a/examples/modify_response_body.py b/examples/modify_response_body.py index 994932a1..b4632248 100644 --- a/examples/modify_response_body.py +++ b/examples/modify_response_body.py @@ -2,19 +2,20 @@ # (this script works best with --anticache) import sys -from mitmproxy.models import decoded +state = {} -def start(context): + +def start(): if len(sys.argv) != 3: raise ValueError('Usage: -s "modify_response_body.py old new"') # You may want to use Python's argparse for more sophisticated argument # parsing. - context.old, context.new = sys.argv[1].encode(), sys.argv[2].encode() + state["old"], state["new"] = sys.argv[1].encode(), sys.argv[2].encode() -def response(context, flow): - with decoded(flow.response): # automatically decode gzipped responses. - flow.response.content = flow.response.content.replace( - context.old, - context.new) +def response(flow): + flow.response.content = flow.response.content.replace( + state["old"], + state["new"] + ) diff --git a/examples/nonblocking.py b/examples/nonblocking.py index 4609f389..b81478df 100644 --- a/examples/nonblocking.py +++ b/examples/nonblocking.py @@ -1,9 +1,10 @@ import time +import mitmproxy from mitmproxy.script import concurrent @concurrent # Remove this and see what happens -def request(context, flow): - context.log("handle request: %s%s" % (flow.request.host, flow.request.path)) +def request(flow): + mitmproxy.ctx.log("handle request: %s%s" % (flow.request.host, flow.request.path)) time.sleep(5) - context.log("start request: %s%s" % (flow.request.host, flow.request.path)) + mitmproxy.ctx.log("start request: %s%s" % (flow.request.host, flow.request.path)) diff --git a/examples/proxapp.py b/examples/proxapp.py index 613d3f8b..2935b587 100644 --- a/examples/proxapp.py +++ b/examples/proxapp.py @@ -4,6 +4,7 @@ instance, we're using the Flask framework (http://flask.pocoo.org/) to expose a single simplest-possible page. """ from flask import Flask +import mitmproxy app = Flask("proxapp") @@ -15,10 +16,10 @@ def hello_world(): # Register the app using the magic domain "proxapp" on port 80. Requests to # this domain and port combination will now be routed to the WSGI app instance. -def start(context): - context.app_registry.add(app, "proxapp", 80) +def start(): + mitmproxy.ctx.master.apps.add(app, "proxapp", 80) # SSL works too, but the magic domain needs to be resolvable from the mitmproxy machine due to mitmproxy's design. # mitmproxy will connect to said domain and use serve its certificate (unless --no-upstream-cert is set) # but won't send any data. - context.app_registry.add(app, "example.com", 443) + mitmproxy.ctx.master.apps.add(app, "example.com", 443) diff --git a/examples/redirect_requests.py b/examples/redirect_requests.py index af2aa907..36594bcd 100644 --- a/examples/redirect_requests.py +++ b/examples/redirect_requests.py @@ -5,7 +5,7 @@ from mitmproxy.models import HTTPResponse from netlib.http import Headers -def request(context, flow): +def request(flow): # pretty_host takes the "Host" header of the request into account, # which is useful in transparent mode where we usually only have the IP # otherwise. diff --git a/examples/sslstrip.py b/examples/sslstrip.py index 8dde8e3e..0be1f020 100644 --- a/examples/sslstrip.py +++ b/examples/sslstrip.py @@ -1,40 +1,36 @@ -from netlib.http import decoded import re from six.moves import urllib +# set of SSL/TLS capable hosts +secure_hosts = set() -def start(context): - # set of SSL/TLS capable hosts - context.secure_hosts = set() - -def request(context, flow): +def request(flow): flow.request.headers.pop('If-Modified-Since', None) flow.request.headers.pop('Cache-Control', None) # proxy connections to SSL-enabled hosts - if flow.request.pretty_host in context.secure_hosts: + if flow.request.pretty_host in secure_hosts: flow.request.scheme = 'https' flow.request.port = 443 -def response(context, flow): - with decoded(flow.response): - flow.request.headers.pop('Strict-Transport-Security', None) - flow.request.headers.pop('Public-Key-Pins', None) +def response(flow): + flow.request.headers.pop('Strict-Transport-Security', None) + flow.request.headers.pop('Public-Key-Pins', None) - # strip links in response body - flow.response.content = flow.response.content.replace('https://', 'http://') + # strip links in response body + flow.response.content = flow.response.content.replace('https://', 'http://') - # strip links in 'Location' header - if flow.response.headers.get('Location', '').startswith('https://'): - location = flow.response.headers['Location'] - hostname = urllib.parse.urlparse(location).hostname - if hostname: - context.secure_hosts.add(hostname) - flow.response.headers['Location'] = location.replace('https://', 'http://', 1) + # strip links in 'Location' header + if flow.response.headers.get('Location', '').startswith('https://'): + location = flow.response.headers['Location'] + hostname = urllib.parse.urlparse(location).hostname + if hostname: + secure_hosts.add(hostname) + flow.response.headers['Location'] = location.replace('https://', 'http://', 1) - # strip secure flag from 'Set-Cookie' headers - cookies = flow.response.headers.get_all('Set-Cookie') - cookies = [re.sub(r';\s*secure\s*', '', s) for s in cookies] - flow.response.headers.set_all('Set-Cookie', cookies) + # strip secure flag from 'Set-Cookie' headers + cookies = flow.response.headers.get_all('Set-Cookie') + cookies = [re.sub(r';\s*secure\s*', '', s) for s in cookies] + flow.response.headers.set_all('Set-Cookie', cookies) diff --git a/examples/stream.py b/examples/stream.py index 3adbe437..8598f329 100644 --- a/examples/stream.py +++ b/examples/stream.py @@ -1,4 +1,4 @@ -def responseheaders(context, flow): +def responseheaders(flow): """ Enables streaming for all responses. """ diff --git a/examples/stream_modify.py b/examples/stream_modify.py index aa395c03..5e5da95b 100644 --- a/examples/stream_modify.py +++ b/examples/stream_modify.py @@ -16,5 +16,5 @@ def modify(chunks): yield chunk.replace("foo", "bar") -def responseheaders(context, flow): +def responseheaders(flow): flow.response.stream = modify diff --git a/examples/stub.py b/examples/stub.py index a0f73538..e5b4a39a 100644 --- a/examples/stub.py +++ b/examples/stub.py @@ -1,79 +1,87 @@ +import mitmproxy """ This is a script stub, with definitions for all events. """ -def start(context): +def start(): """ - Called once on script startup, before any other events. + Called once on script startup before any other events """ - context.log("start") + mitmproxy.ctx.log("start") -def clientconnect(context, root_layer): +def configure(options): + """ + Called once on script startup before any other events, and whenever options changes. + """ + mitmproxy.ctx.log("configure") + + +def clientconnect(root_layer): """ Called when a client initiates a connection to the proxy. Note that a connection can correspond to multiple HTTP requests """ - context.log("clientconnect") + mitmproxy.ctx.log("clientconnect") -def request(context, flow): +def request(flow): """ Called when a client request has been received. """ - context.log("request") + mitmproxy.ctx.log("request") -def serverconnect(context, server_conn): +def serverconnect(server_conn): """ Called when the proxy initiates a connection to the target server. Note that a connection can correspond to multiple HTTP requests """ - context.log("serverconnect") + mitmproxy.ctx.log("serverconnect") -def responseheaders(context, flow): +def responseheaders(flow): """ Called when the response headers for a server response have been received, but the response body has not been processed yet. Can be used to tell mitmproxy to stream the response. """ - context.log("responseheaders") + mitmproxy.ctx.log("responseheaders") -def response(context, flow): +def response(flow): """ Called when a server response has been received. """ - context.log("response") + mitmproxy.ctx.log("response") -def error(context, flow): +def error(flow): """ Called when a flow error has occured, e.g. invalid server responses, or interrupted connections. This is distinct from a valid server HTTP error response, which is simply a response with an HTTP error code. """ - context.log("error") + mitmproxy.ctx.log("error") -def serverdisconnect(context, server_conn): +def serverdisconnect(server_conn): """ Called when the proxy closes the connection to the target server. """ - context.log("serverdisconnect") + mitmproxy.ctx.log("serverdisconnect") -def clientdisconnect(context, root_layer): +def clientdisconnect(root_layer): """ Called when a client disconnects from the proxy. """ - context.log("clientdisconnect") + mitmproxy.ctx.log("clientdisconnect") -def done(context): +def done(): """ Called once on script shutdown, after any other events. """ - context.log("done") + mitmproxy.ctx.log("done") diff --git a/examples/tcp_message.py b/examples/tcp_message.py index 6eced0dc..b431c23f 100644 --- a/examples/tcp_message.py +++ b/examples/tcp_message.py @@ -11,7 +11,7 @@ mitmdump -T --host --tcp ".*" -q -s examples/tcp_message.py from netlib import strutils -def tcp_message(ctx, tcp_msg): +def tcp_message(tcp_msg): modified_msg = tcp_msg.message.replace("foo", "bar") is_modified = False if modified_msg == tcp_msg.message else True diff --git a/examples/tls_passthrough.py b/examples/tls_passthrough.py index 50aab65b..20e8f9be 100644 --- a/examples/tls_passthrough.py +++ b/examples/tls_passthrough.py @@ -20,13 +20,14 @@ Example: Authors: Maximilian Hils, Matthew Tuusberg """ -from __future__ import (absolute_import, print_function, division) +from __future__ import absolute_import, print_function, division import collections import random import sys from enum import Enum +import mitmproxy from mitmproxy.exceptions import TlsProtocolException from mitmproxy.protocol import TlsLayer, RawTCPLayer @@ -97,7 +98,6 @@ class TlsFeedback(TlsLayer): def _establish_tls_with_client(self): server_address = self.server_conn.address - tls_strategy = self.script_context.tls_strategy try: super(TlsFeedback, self)._establish_tls_with_client() @@ -110,15 +110,18 @@ class TlsFeedback(TlsLayer): # inline script hooks below. +tls_strategy = None -def start(context): + +def start(): + global tls_strategy if len(sys.argv) == 2: - context.tls_strategy = ProbabilisticStrategy(float(sys.argv[1])) + tls_strategy = ProbabilisticStrategy(float(sys.argv[1])) else: - context.tls_strategy = ConservativeStrategy() + tls_strategy = ConservativeStrategy() -def next_layer(context, next_layer): +def next_layer(next_layer): """ This hook does the actual magic - if the next layer is planned to be a TLS layer, we check if we want to enter pass-through mode instead. @@ -126,14 +129,13 @@ def next_layer(context, next_layer): if isinstance(next_layer, TlsLayer) and next_layer._client_tls: server_address = next_layer.server_conn.address - if context.tls_strategy.should_intercept(server_address): + if tls_strategy.should_intercept(server_address): # We try to intercept. # Monkey-Patch the layer to get feedback from the TLSLayer if interception worked. next_layer.__class__ = TlsFeedback - next_layer.script_context = context else: # We don't intercept - reply with a pass-through layer and add a "skipped" entry. - context.log("TLS passthrough for %s" % repr(next_layer.server_conn.address), "info") - next_layer_replacement = RawTCPLayer(next_layer.ctx, logging=False) + mitmproxy.ctx.log("TLS passthrough for %s" % repr(next_layer.server_conn.address), "info") + next_layer_replacement = RawTCPLayer(next_layer.ctx, ignore=True) next_layer.reply.send(next_layer_replacement) - context.tls_strategy.record_skipped(server_address) + tls_strategy.record_skipped(server_address) diff --git a/examples/upsidedownternet.py b/examples/upsidedownternet.py index 9aac9f05..d5059092 100644 --- a/examples/upsidedownternet.py +++ b/examples/upsidedownternet.py @@ -1,17 +1,15 @@ from six.moves import cStringIO as StringIO from PIL import Image -from mitmproxy.models import decoded -def response(context, flow): +def response(flow): if flow.response.headers.get("content-type", "").startswith("image"): - with decoded(flow.response): # automatically decode gzipped responses. - try: - s = StringIO(flow.response.content) - img = Image.open(s).rotate(180) - s2 = StringIO() - img.save(s2, "png") - flow.response.content = s2.getvalue() - flow.response.headers["content-type"] = "image/png" - except: # Unknown image types etc. - pass + try: + s = StringIO(flow.response.content) + img = Image.open(s).rotate(180) + s2 = StringIO() + img.save(s2, "png") + flow.response.content = s2.getvalue() + flow.response.headers["content-type"] = "image/png" + except: # Unknown image types etc. + pass diff --git a/mitmproxy/addons.py b/mitmproxy/addons.py new file mode 100644 index 00000000..c779aaf8 --- /dev/null +++ b/mitmproxy/addons.py @@ -0,0 +1,64 @@ +from __future__ import absolute_import, print_function, division +from mitmproxy import exceptions +import pprint + + +def _get_name(itm): + return getattr(itm, "name", itm.__class__.__name__) + + +class Addons(object): + def __init__(self, master): + self.chain = [] + self.master = master + master.options.changed.connect(self.options_update) + + def options_update(self, options): + for i in self.chain: + with self.master.handlecontext(): + i.configure(options) + + def add(self, *addons): + self.chain.extend(addons) + for i in addons: + self.invoke_with_context(i, "start") + self.invoke_with_context(i, "configure", self.master.options) + + def remove(self, addon): + self.chain = [i for i in self.chain if i is not addon] + self.invoke_with_context(addon, "done") + + def done(self): + for i in self.chain: + self.invoke_with_context(i, "done") + + def has_addon(self, name): + """ + Is an addon with this name registered? + """ + for i in self.chain: + if _get_name(i) == name: + return True + + def __len__(self): + return len(self.chain) + + def __str__(self): + return pprint.pformat([str(i) for i in self.chain]) + + def invoke_with_context(self, addon, name, *args, **kwargs): + with self.master.handlecontext(): + self.invoke(addon, name, *args, **kwargs) + + def invoke(self, addon, name, *args, **kwargs): + func = getattr(addon, name, None) + if func: + if not callable(func): + raise exceptions.AddonError( + "Addon handler %s not callable" % name + ) + func(*args, **kwargs) + + def __call__(self, name, *args, **kwargs): + for i in self.chain: + self.invoke(i, name, *args, **kwargs) diff --git a/mitmproxy/builtins/__init__.py b/mitmproxy/builtins/__init__.py new file mode 100644 index 00000000..3974d736 --- /dev/null +++ b/mitmproxy/builtins/__init__.py @@ -0,0 +1,23 @@ +from __future__ import absolute_import, print_function, division + +from mitmproxy.builtins import anticache +from mitmproxy.builtins import anticomp +from mitmproxy.builtins import filestreamer +from mitmproxy.builtins import stickyauth +from mitmproxy.builtins import stickycookie +from mitmproxy.builtins import script +from mitmproxy.builtins import replace +from mitmproxy.builtins import setheaders + + +def default_addons(): + return [ + anticache.AntiCache(), + anticomp.AntiComp(), + stickyauth.StickyAuth(), + stickycookie.StickyCookie(), + script.ScriptLoader(), + filestreamer.FileStreamer(), + replace.Replace(), + setheaders.SetHeaders(), + ] diff --git a/mitmproxy/builtins/anticache.py b/mitmproxy/builtins/anticache.py new file mode 100644 index 00000000..f208e2fb --- /dev/null +++ b/mitmproxy/builtins/anticache.py @@ -0,0 +1,13 @@ +from __future__ import absolute_import, print_function, division + + +class AntiCache: + def __init__(self): + self.enabled = False + + def configure(self, options): + self.enabled = options.anticache + + def request(self, flow): + if self.enabled: + flow.request.anticache() diff --git a/mitmproxy/builtins/anticomp.py b/mitmproxy/builtins/anticomp.py new file mode 100644 index 00000000..50bd1b73 --- /dev/null +++ b/mitmproxy/builtins/anticomp.py @@ -0,0 +1,13 @@ +from __future__ import absolute_import, print_function, division + + +class AntiComp: + def __init__(self): + self.enabled = False + + def configure(self, options): + self.enabled = options.anticomp + + def request(self, flow): + if self.enabled: + flow.request.anticomp() diff --git a/mitmproxy/builtins/dumper.py b/mitmproxy/builtins/dumper.py new file mode 100644 index 00000000..239630fb --- /dev/null +++ b/mitmproxy/builtins/dumper.py @@ -0,0 +1,252 @@ +from __future__ import absolute_import, print_function, division + +import itertools +import traceback + +import click + +from mitmproxy import contentviews +from mitmproxy import ctx +from mitmproxy import exceptions +from mitmproxy import filt +from netlib import human +from netlib import strutils + + +def indent(n, text): + l = str(text).strip().splitlines() + pad = " " * n + return "\n".join(pad + i for i in l) + + +class Dumper(): + def __init__(self): + self.filter = None + self.flow_detail = None + self.outfp = None + self.showhost = None + + def echo(self, text, ident=None, **style): + if ident: + text = indent(ident, text) + click.secho(text, file=self.outfp, **style) + if self.outfp: + self.outfp.flush() + + def _echo_message(self, message): + if self.flow_detail >= 2 and hasattr(message, "headers"): + headers = "\r\n".join( + "{}: {}".format( + click.style( + strutils.bytes_to_escaped_str(k), fg="blue", bold=True + ), + click.style( + strutils.bytes_to_escaped_str(v), fg="blue" + ) + ) + for k, v in message.headers.fields + ) + self.echo(headers, ident=4) + if self.flow_detail >= 3: + try: + content = message.content + except ValueError: + content = message.get_content(strict=False) + + if content is None: + self.echo("(content missing)", ident=4) + elif content: + self.echo("") + + try: + type, lines = contentviews.get_content_view( + contentviews.get("Auto"), + content, + headers=getattr(message, "headers", None) + ) + except exceptions.ContentViewException: + s = "Content viewer failed: \n" + traceback.format_exc() + ctx.log.debug(s) + type, lines = contentviews.get_content_view( + contentviews.get("Raw"), + content, + headers=getattr(message, "headers", None) + ) + + styles = dict( + highlight=dict(bold=True), + offset=dict(fg="blue"), + header=dict(fg="green", bold=True), + text=dict(fg="green") + ) + + def colorful(line): + yield u" " # we can already indent here + for (style, text) in line: + yield click.style(text, **styles.get(style, {})) + + if self.flow_detail == 3: + lines_to_echo = itertools.islice(lines, 70) + else: + lines_to_echo = lines + + lines_to_echo = list(lines_to_echo) + + content = u"\r\n".join( + u"".join(colorful(line)) for line in lines_to_echo + ) + + self.echo(content) + if next(lines, None): + self.echo("(cut off)", ident=4, dim=True) + + if self.flow_detail >= 2: + self.echo("") + + def _echo_request_line(self, flow): + if flow.request.stickycookie: + stickycookie = click.style( + "[stickycookie] ", fg="yellow", bold=True + ) + else: + stickycookie = "" + + if flow.client_conn: + client = click.style( + strutils.escape_control_characters( + flow.client_conn.address.host + ), + bold=True + ) + elif flow.request.is_replay: + client = click.style("[replay]", fg="yellow", bold=True) + else: + client = "" + + method = flow.request.method + method_color = dict( + GET="green", + DELETE="red" + ).get(method.upper(), "magenta") + method = click.style( + strutils.escape_control_characters(method), + fg=method_color, + bold=True + ) + if self.showhost: + url = flow.request.pretty_url + else: + url = flow.request.url + url = click.style(strutils.escape_control_characters(url), bold=True) + + httpversion = "" + if flow.request.http_version not in ("HTTP/1.1", "HTTP/1.0"): + # We hide "normal" HTTP 1. + httpversion = " " + flow.request.http_version + + line = "{stickycookie}{client} {method} {url}{httpversion}".format( + stickycookie=stickycookie, + client=client, + method=method, + url=url, + httpversion=httpversion + ) + self.echo(line) + + def _echo_response_line(self, flow): + if flow.response.is_replay: + replay = click.style("[replay] ", fg="yellow", bold=True) + else: + replay = "" + + code = flow.response.status_code + code_color = None + if 200 <= code < 300: + code_color = "green" + elif 300 <= code < 400: + code_color = "magenta" + elif 400 <= code < 600: + code_color = "red" + code = click.style( + str(code), + fg=code_color, + bold=True, + blink=(code == 418) + ) + reason = click.style( + strutils.escape_control_characters(flow.response.reason), + fg=code_color, + bold=True + ) + + if flow.response.raw_content is None: + size = "(content missing)" + else: + size = human.pretty_size(len(flow.response.raw_content)) + size = click.style(size, bold=True) + + arrows = click.style(" <<", bold=True) + + line = "{replay} {arrows} {code} {reason} {size}".format( + replay=replay, + arrows=arrows, + code=code, + reason=reason, + size=size + ) + self.echo(line) + + def echo_flow(self, f): + if f.request: + self._echo_request_line(f) + self._echo_message(f.request) + + if f.response: + self._echo_response_line(f) + self._echo_message(f.response) + + if f.error: + self.echo(" << {}".format(f.error.msg), bold=True, fg="red") + + def match(self, f): + if self.flow_detail == 0: + return False + if not self.filt: + return True + elif f.match(self.filt): + return True + return False + + def configure(self, options): + if options.filtstr: + self.filt = filt.parse(options.filtstr) + if not self.filt: + raise exceptions.OptionsError( + "Invalid filter expression: %s" % options.filtstr + ) + else: + self.filt = None + self.flow_detail = options.flow_detail + self.outfp = options.tfile + self.showhost = options.showhost + + def response(self, f): + if self.match(f): + self.echo_flow(f) + + def error(self, f): + if self.match(f): + self.echo_flow(f) + + def tcp_message(self, f): + # FIXME: Filter should be applied here + if self.options.flow_detail == 0: + return + message = f.messages[-1] + direction = "->" if message.from_client else "<-" + self.echo("{client} {direction} tcp {direction} {server}".format( + client=repr(f.client_conn.address), + server=repr(f.server_conn.address), + direction=direction, + )) + self._echo_message(message) diff --git a/mitmproxy/builtins/filestreamer.py b/mitmproxy/builtins/filestreamer.py new file mode 100644 index 00000000..97ddc7c4 --- /dev/null +++ b/mitmproxy/builtins/filestreamer.py @@ -0,0 +1,66 @@ +from __future__ import absolute_import, print_function, division +import os.path + +from mitmproxy import exceptions +from mitmproxy.flow import io + + +class FileStreamer: + def __init__(self): + self.stream = None + self.active_flows = set() # type: Set[models.Flow] + + def start_stream_to_path(self, path, mode, filt): + path = os.path.expanduser(path) + try: + f = open(path, mode) + except IOError as v: + return str(v) + self.stream = io.FilteredFlowWriter(f, filt) + self.active_flows = set() + + def configure(self, options): + # We're already streaming - stop the previous stream and restart + if self.stream: + self.done() + + if options.outfile: + filt = None + if options.get("filtstr"): + filt = filt.parse(options.filtstr) + if not filt: + raise exceptions.OptionsError( + "Invalid filter specification: %s" % options.filtstr + ) + path, mode = options.outfile + if mode not in ("wb", "ab"): + raise exceptions.OptionsError("Invalid mode.") + err = self.start_stream_to_path(path, mode, filt) + if err: + raise exceptions.OptionsError(err) + + def tcp_open(self, flow): + if self.stream: + self.active_flows.add(flow) + + def tcp_close(self, flow): + if self.stream: + self.stream.add(flow) + self.active_flows.discard(flow) + + def response(self, flow): + if self.stream: + self.stream.add(flow) + self.active_flows.discard(flow) + + def request(self, flow): + if self.stream: + self.active_flows.add(flow) + + def done(self): + if self.stream: + for flow in self.active_flows: + self.stream.add(flow) + self.active_flows = set([]) + self.stream.fo.close() + self.stream = None diff --git a/mitmproxy/builtins/replace.py b/mitmproxy/builtins/replace.py new file mode 100644 index 00000000..83b96cee --- /dev/null +++ b/mitmproxy/builtins/replace.py @@ -0,0 +1,49 @@ +import re + +from mitmproxy import exceptions +from mitmproxy import filt + + +class Replace: + def __init__(self): + self.lst = [] + + def configure(self, options): + """ + .replacements is a list of tuples (fpat, rex, s): + + fpatt: a string specifying a filter pattern. + rex: a regular expression. + s: the replacement string + """ + lst = [] + for fpatt, rex, s in options.replacements: + cpatt = filt.parse(fpatt) + if not cpatt: + raise exceptions.OptionsError( + "Invalid filter pattern: %s" % fpatt + ) + try: + re.compile(rex) + except re.error as e: + raise exceptions.OptionsError( + "Invalid regular expression: %s - %s" % (rex, str(e)) + ) + lst.append((rex, s, cpatt)) + self.lst = lst + + def execute(self, f): + for rex, s, cpatt in self.lst: + if cpatt(f): + if f.response: + f.response.replace(rex, s) + else: + f.request.replace(rex, s) + + def request(self, flow): + if not flow.reply.acked: + self.execute(flow) + + def response(self, flow): + if not flow.reply.acked: + self.execute(flow) diff --git a/mitmproxy/builtins/script.py b/mitmproxy/builtins/script.py new file mode 100644 index 00000000..ab068e47 --- /dev/null +++ b/mitmproxy/builtins/script.py @@ -0,0 +1,186 @@ +from __future__ import absolute_import, print_function, division + +import contextlib +import os +import shlex +import sys +import threading +import traceback + +from mitmproxy import exceptions +from mitmproxy import controller +from mitmproxy import ctx + + +import watchdog.events +from watchdog.observers import polling + + +def parse_command(command): + """ + Returns a (path, args) tuple. + """ + if not command or not command.strip(): + raise exceptions.AddonError("Empty script command.") + # Windows: escape all backslashes in the path. + if os.name == "nt": # pragma: no cover + backslashes = shlex.split(command, posix=False)[0].count("\\") + command = command.replace("\\", "\\\\", backslashes) + args = shlex.split(command) # pragma: no cover + args[0] = os.path.expanduser(args[0]) + if not os.path.exists(args[0]): + raise exceptions.AddonError( + ("Script file not found: %s.\r\n" + "If your script path contains spaces, " + "make sure to wrap it in additional quotes, e.g. -s \"'./foo bar/baz.py' --args\".") % + args[0]) + elif os.path.isdir(args[0]): + raise exceptions.AddonError("Not a file: %s" % args[0]) + return args[0], args[1:] + + +@contextlib.contextmanager +def scriptenv(path, args): + oldargs = sys.argv + sys.argv = [path] + args + script_dir = os.path.dirname(os.path.abspath(path)) + sys.path.append(script_dir) + try: + yield + except Exception: + _, _, tb = sys.exc_info() + scriptdir = os.path.dirname(os.path.abspath(path)) + for i, s in enumerate(reversed(traceback.extract_tb(tb))): + tb = tb.tb_next + if not os.path.abspath(s[0]).startswith(scriptdir): + break + ctx.log.error("Script error: %s" % "".join(traceback.format_tb(tb))) + finally: + sys.argv = oldargs + sys.path.pop() + + +def load_script(path, args): + with open(path, "rb") as f: + try: + code = compile(f.read(), path, 'exec') + except SyntaxError as e: + ctx.log.error( + "Script error: %s line %s: %s" % ( + e.filename, e.lineno, e.msg + ) + ) + return + ns = {'__file__': os.path.abspath(path)} + with scriptenv(path, args): + exec(code, ns, ns) + return ns + + +class ReloadHandler(watchdog.events.FileSystemEventHandler): + def __init__(self, callback): + self.callback = callback + + def on_modified(self, event): + self.callback() + + def on_created(self, event): + self.callback() + + +class Script: + """ + An addon that manages a single script. + """ + def __init__(self, command): + self.name = command + + self.command = command + self.path, self.args = parse_command(command) + self.ns = None + self.observer = None + self.dead = False + + self.last_options = None + self.should_reload = threading.Event() + + for i in controller.Events: + if not hasattr(self, i): + def mkprox(): + evt = i + + def prox(*args, **kwargs): + self.run(evt, *args, **kwargs) + return prox + setattr(self, i, mkprox()) + + def run(self, name, *args, **kwargs): + # It's possible for ns to be un-initialised if we failed during + # configure + if self.ns is not None and not self.dead: + func = self.ns.get(name) + if func: + with scriptenv(self.path, self.args): + func(*args, **kwargs) + + def reload(self): + self.should_reload.set() + + def tick(self): + if self.should_reload.is_set(): + self.should_reload.clear() + ctx.log.info("Reloading script: %s" % self.name) + self.ns = load_script(self.path, self.args) + self.start() + self.configure(self.last_options) + else: + self.run("tick") + + def start(self): + self.ns = load_script(self.path, self.args) + self.run("start") + + def configure(self, options): + self.last_options = options + if not self.observer: + self.observer = polling.PollingObserver() + # Bind the handler to the real underlying master object + self.observer.schedule( + ReloadHandler(self.reload), + os.path.dirname(self.path) or "." + ) + self.observer.start() + self.run("configure", options) + + def done(self): + self.run("done") + self.dead = True + + +class ScriptLoader(): + """ + An addon that manages loading scripts from options. + """ + def configure(self, options): + for s in options.scripts: + if options.scripts.count(s) > 1: + raise exceptions.OptionsError("Duplicate script: %s" % s) + + for a in ctx.master.addons.chain[:]: + if isinstance(a, Script) and a.name not in options.scripts: + ctx.log.info("Un-loading script: %s" % a.name) + ctx.master.addons.remove(a) + + current = {} + for a in ctx.master.addons.chain[:]: + if isinstance(a, Script): + current[a.name] = a + ctx.master.addons.chain.remove(a) + + for s in options.scripts: + if s in current: + ctx.master.addons.chain.append(current[s]) + else: + ctx.log.info("Loading script: %s" % s) + sc = Script(s) + ctx.master.addons.add(sc) diff --git a/mitmproxy/builtins/setheaders.py b/mitmproxy/builtins/setheaders.py new file mode 100644 index 00000000..6bda3f55 --- /dev/null +++ b/mitmproxy/builtins/setheaders.py @@ -0,0 +1,39 @@ +from mitmproxy import exceptions +from mitmproxy import filt + + +class SetHeaders: + def __init__(self): + self.lst = [] + + def configure(self, options): + """ + options.setheaders is a tuple of (fpatt, header, value) + + fpatt: String specifying a filter pattern. + header: Header name. + value: Header value string + """ + for fpatt, header, value in options.setheaders: + cpatt = filt.parse(fpatt) + if not cpatt: + raise exceptions.OptionsError( + "Invalid setheader filter pattern %s" % fpatt + ) + self.lst.append((fpatt, header, value, cpatt)) + + def run(self, f, hdrs): + for _, header, value, cpatt in self.lst: + if cpatt(f): + hdrs.pop(header, None) + for _, header, value, cpatt in self.lst: + if cpatt(f): + hdrs.add(header, value) + + def request(self, flow): + if not flow.reply.acked: + self.run(flow, flow.request.headers) + + def response(self, flow): + if not flow.reply.acked: + self.run(flow, flow.response.headers) diff --git a/mitmproxy/builtins/stickyauth.py b/mitmproxy/builtins/stickyauth.py new file mode 100644 index 00000000..1309911c --- /dev/null +++ b/mitmproxy/builtins/stickyauth.py @@ -0,0 +1,28 @@ +from __future__ import absolute_import, print_function, division + +from mitmproxy import filt +from mitmproxy import exceptions + + +class StickyAuth: + def __init__(self): + # Compiled filter + self.flt = None + self.hosts = {} + + def configure(self, options): + if options.stickyauth: + flt = filt.parse(options.stickyauth) + if not flt: + raise exceptions.OptionsError( + "stickyauth: invalid filter expression: %s" % options.stickyauth + ) + self.flt = flt + + def request(self, flow): + host = flow.request.host + if "authorization" in flow.request.headers: + self.hosts[host] = flow.request.headers["authorization"] + elif flow.match(self.flt): + if host in self.hosts: + flow.request.headers["authorization"] = self.hosts[host] diff --git a/mitmproxy/builtins/stickycookie.py b/mitmproxy/builtins/stickycookie.py new file mode 100644 index 00000000..dc699bb4 --- /dev/null +++ b/mitmproxy/builtins/stickycookie.py @@ -0,0 +1,80 @@ +import collections +from six.moves import http_cookiejar +from netlib.http import cookies + +from mitmproxy import exceptions +from mitmproxy import filt + + +def ckey(attrs, f): + """ + Returns a (domain, port, path) tuple. + """ + domain = f.request.host + path = "/" + if "domain" in attrs: + domain = attrs["domain"] + if "path" in attrs: + path = attrs["path"] + return (domain, f.request.port, path) + + +def domain_match(a, b): + if http_cookiejar.domain_match(a, b): + return True + elif http_cookiejar.domain_match(a, b.strip(".")): + return True + return False + + +class StickyCookie: + def __init__(self): + self.jar = collections.defaultdict(dict) + self.flt = None + + def configure(self, options): + if options.stickycookie: + flt = filt.parse(options.stickycookie) + if not flt: + raise exceptions.OptionsError( + "stickycookie: invalid filter expression: %s" % options.stickycookie + ) + self.flt = flt + + def response(self, flow): + if self.flt: + for name, (value, attrs) in flow.response.cookies.items(multi=True): + # FIXME: We now know that Cookie.py screws up some cookies with + # valid RFC 822/1123 datetime specifications for expiry. Sigh. + dom_port_path = ckey(attrs, flow) + + if domain_match(flow.request.host, dom_port_path[0]): + if cookies.is_expired(attrs): + # Remove the cookie from jar + self.jar[dom_port_path].pop(name, None) + + # If all cookies of a dom_port_path have been removed + # then remove it from the jar itself + if not self.jar[dom_port_path]: + self.jar.pop(dom_port_path, None) + else: + b = attrs.with_insert(0, name, value) + self.jar[dom_port_path][name] = b + + def request(self, flow): + if self.flt: + l = [] + if flow.match(self.flt): + for domain, port, path in self.jar.keys(): + match = [ + domain_match(flow.request.host, domain), + flow.request.port == port, + flow.request.path.startswith(path) + ] + if all(match): + c = self.jar[(domain, port, path)] + l.extend([cookies.format_cookie_header(c[name].items(multi=True)) for name in c.keys()]) + if l: + # FIXME: we need to formalise this... + flow.request.stickycookie = True + flow.request.headers["cookie"] = "; ".join(l) diff --git a/mitmproxy/cmdline.py b/mitmproxy/cmdline.py index 551fffa0..696542f6 100644 --- a/mitmproxy/cmdline.py +++ b/mitmproxy/cmdline.py @@ -1,21 +1,32 @@ from __future__ import absolute_import, print_function, division -import base64 import os import re import configargparse +from mitmproxy import exceptions from mitmproxy import filt -from mitmproxy.proxy import config +from mitmproxy import platform from netlib import human -from netlib import strutils from netlib import tcp from netlib import version -from netlib.http import url APP_HOST = "mitm.it" APP_PORT = 80 +CA_DIR = "~/.mitmproxy" + +# We manually need to specify this, otherwise OpenSSL may select a non-HTTP2 cipher by default. +# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=apache-2.2.15&openssl=1.0.2&hsts=yes&profile=old +DEFAULT_CLIENT_CIPHERS = "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:" \ + "ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:" \ + "ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:" \ + "ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:" \ + "DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:" \ + "DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:" \ + "AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:" \ + "HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:" \ + "!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA" class ParseException(Exception): @@ -107,110 +118,164 @@ def parse_setheader(s): return _parse_hook(s) -def parse_server_spec(spec): - try: - p = url.parse(spec) - if p[0] not in (b"http", b"https"): - raise ValueError() - except ValueError: - raise configargparse.ArgumentTypeError( - "Invalid server specification: %s" % spec - ) - - address = tcp.Address(p[1:3]) - scheme = p[0].lower() - return config.ServerSpec(scheme, address) - - -def parse_upstream_auth(auth): - pattern = re.compile(".+:") - if pattern.search(auth) is None: - raise configargparse.ArgumentTypeError( - "Invalid upstream auth specification: %s" % auth - ) - return b"Basic" + b" " + base64.b64encode(strutils.always_bytes(auth)) - - -def get_common_options(options): +def get_common_options(args): stickycookie, stickyauth = None, None - if options.stickycookie_filt: - stickycookie = options.stickycookie_filt + if args.stickycookie_filt: + stickycookie = args.stickycookie_filt - if options.stickyauth_filt: - stickyauth = options.stickyauth_filt + if args.stickyauth_filt: + stickyauth = args.stickyauth_filt - stream_large_bodies = options.stream_large_bodies + stream_large_bodies = args.stream_large_bodies if stream_large_bodies: stream_large_bodies = human.parse_size(stream_large_bodies) reps = [] - for i in options.replace: + for i in args.replace: try: p = parse_replace_hook(i) except ParseException as e: - raise configargparse.ArgumentTypeError(e) + raise exceptions.OptionsError(e) reps.append(p) - for i in options.replace_file: + for i in args.replace_file: try: patt, rex, path = parse_replace_hook(i) except ParseException as e: - raise configargparse.ArgumentTypeError(e) + raise exceptions.OptionsError(e) try: v = open(path, "rb").read() except IOError as e: - raise configargparse.ArgumentTypeError( + raise exceptions.OptionsError( "Could not read replace file: %s" % path ) reps.append((patt, rex, v)) setheaders = [] - for i in options.setheader: + for i in args.setheader: try: p = parse_setheader(i) except ParseException as e: - raise configargparse.ArgumentTypeError(e) + raise exceptions.OptionsError(e) setheaders.append(p) - if options.outfile and options.outfile[0] == options.rfile: - if options.outfile[1] == "wb": - raise configargparse.ArgumentTypeError( + if args.outfile and args.outfile[0] == args.rfile: + if args.outfile[1] == "wb": + raise exceptions.OptionsError( "Cannot use '{}' for both reading and writing flows. " - "Are you looking for --afile?".format(options.rfile) + "Are you looking for --afile?".format(args.rfile) ) else: - raise configargparse.ArgumentTypeError( + raise exceptions.OptionsError( "Cannot use '{}' for both reading and appending flows. " "That would trigger an infinite loop." ) + # Proxy config + certs = [] + for i in args.certs: + parts = i.split("=", 1) + if len(parts) == 1: + parts = ["*", parts[0]] + certs.append(parts) + + body_size_limit = args.body_size_limit + if body_size_limit: + try: + body_size_limit = human.parse_size(body_size_limit) + except ValueError as e: + raise exceptions.OptionsError( + "Invalid body size limit specification: %s" % body_size_limit + ) + + # Establish proxy mode + c = 0 + mode, upstream_server = "regular", None + if args.transparent_proxy: + c += 1 + if not platform.resolver: + raise exceptions.OptionsError( + "Transparent mode not supported on this platform." + ) + mode = "transparent" + if args.socks_proxy: + c += 1 + mode = "socks5" + if args.reverse_proxy: + c += 1 + mode = "reverse" + upstream_server = args.reverse_proxy + if args.upstream_proxy: + c += 1 + mode = "upstream" + upstream_server = args.upstream_proxy + if c > 1: + raise exceptions.OptionsError( + "Transparent, SOCKS5, reverse and upstream proxy mode " + "are mutually exclusive. Read the docs on proxy modes " + "to understand why." + ) + if args.add_upstream_certs_to_client_chain and args.no_upstream_cert: + raise exceptions.OptionsError( + "The no-upstream-cert and add-upstream-certs-to-client-chain " + "options are mutually exclusive. If no-upstream-cert is enabled " + "then the upstream certificate is not retrieved before generating " + "the client certificate chain." + ) + return dict( - app=options.app, - app_host=options.app_host, - app_port=options.app_port, - - anticache=options.anticache, - anticomp=options.anticomp, - client_replay=options.client_replay, - kill=options.kill, - no_server=options.no_server, - refresh_server_playback=not options.norefresh, - rheaders=options.rheaders, - rfile=options.rfile, + app=args.app, + app_host=args.app_host, + app_port=args.app_port, + + anticache=args.anticache, + anticomp=args.anticomp, + client_replay=args.client_replay, + kill=args.kill, + no_server=args.no_server, + refresh_server_playback=not args.norefresh, + rheaders=args.rheaders, + rfile=args.rfile, replacements=reps, setheaders=setheaders, - server_replay=options.server_replay, - scripts=options.scripts, + server_replay=args.server_replay, + scripts=args.scripts, stickycookie=stickycookie, stickyauth=stickyauth, stream_large_bodies=stream_large_bodies, - showhost=options.showhost, - outfile=options.outfile, - verbosity=options.verbose, - nopop=options.nopop, - replay_ignore_content=options.replay_ignore_content, - replay_ignore_params=options.replay_ignore_params, - replay_ignore_payload_params=options.replay_ignore_payload_params, - replay_ignore_host=options.replay_ignore_host + showhost=args.showhost, + outfile=args.outfile, + verbosity=args.verbose, + nopop=args.nopop, + replay_ignore_content=args.replay_ignore_content, + replay_ignore_params=args.replay_ignore_params, + replay_ignore_payload_params=args.replay_ignore_payload_params, + replay_ignore_host=args.replay_ignore_host, + + auth_nonanonymous = args.auth_nonanonymous, + auth_singleuser = args.auth_singleuser, + auth_htpasswd = args.auth_htpasswd, + add_upstream_certs_to_client_chain = args.add_upstream_certs_to_client_chain, + body_size_limit = body_size_limit, + cadir = args.cadir, + certs = certs, + ciphers_client = args.ciphers_client, + ciphers_server = args.ciphers_server, + clientcerts = args.clientcerts, + http2 = args.http2, + ignore_hosts = args.ignore_hosts, + listen_host = args.addr, + listen_port = args.port, + mode = mode, + no_upstream_cert = args.no_upstream_cert, + rawtcp = args.rawtcp, + upstream_server = upstream_server, + upstream_auth = args.upstream_auth, + ssl_version_client = args.ssl_version_client, + ssl_version_server = args.ssl_version_server, + ssl_verify_upstream_cert = args.ssl_verify_upstream_cert, + ssl_verify_upstream_trusted_cadir = args.ssl_verify_upstream_trusted_cadir, + ssl_verify_upstream_trusted_ca = args.ssl_verify_upstream_trusted_ca, + tcp_hosts = args.tcp_hosts, ) @@ -242,8 +307,8 @@ def basic_options(parser): ) parser.add_argument( "--cadir", - action="store", type=str, dest="cadir", default=config.CA_DIR, - help="Location of the default mitmproxy CA files. (%s)" % config.CA_DIR + action="store", type=str, dest="cadir", default=CA_DIR, + help="Location of the default mitmproxy CA files. (%s)" % CA_DIR ) parser.add_argument( "--host", @@ -284,8 +349,8 @@ def basic_options(parser): ) parser.add_argument( "-v", "--verbose", - action="store_const", dest="verbose", default=1, const=2, - help="Increase event log verbosity." + action="store_const", dest="verbose", default=2, const=3, + help="Increase log verbosity." ) outfile = parser.add_mutually_exclusive_group() outfile.add_argument( @@ -327,7 +392,7 @@ def proxy_modes(parser): group.add_argument( "-R", "--reverse", action="store", - type=parse_server_spec, + type=str, dest="reverse_proxy", default=None, help=""" @@ -350,7 +415,7 @@ def proxy_modes(parser): group.add_argument( "-U", "--upstream", action="store", - type=parse_server_spec, + type=str, dest="upstream_proxy", default=None, help="Forward all requests to upstream proxy server: http://host[:port]" @@ -384,7 +449,7 @@ def proxy_options(parser): help=""" Generic TCP SSL proxy mode for all hosts that match the pattern. Similar to --ignore, but SSL connections are intercepted. The - communication contents are printed to the event log in verbose mode. + communication contents are printed to the log in verbose mode. """ ) group.add_argument( @@ -408,7 +473,7 @@ def proxy_options(parser): parser.add_argument( "--upstream-auth", action="store", dest="upstream_auth", default=None, - type=parse_upstream_auth, + type=str, help=""" Proxy Authentication: username:password @@ -441,7 +506,7 @@ def proxy_ssl_options(parser): 'as the first entry. Can be passed multiple times.') group.add_argument( "--ciphers-client", action="store", - type=str, dest="ciphers_client", default=config.DEFAULT_CLIENT_CIPHERS, + type=str, dest="ciphers_client", default=DEFAULT_CLIENT_CIPHERS, help="Set supported ciphers for client connections. (OpenSSL Syntax)" ) group.add_argument( @@ -696,8 +761,8 @@ def mitmproxy(): usage="%(prog)s [options]", args_for_setting_config_path=["--conf"], default_config_files=[ - os.path.join(config.CA_DIR, "common.conf"), - os.path.join(config.CA_DIR, "mitmproxy.conf") + os.path.join(CA_DIR, "common.conf"), + os.path.join(CA_DIR, "mitmproxy.conf") ], add_config_file_help=True, add_env_var_help=True @@ -751,8 +816,8 @@ def mitmdump(): usage="%(prog)s [options] [filter]", args_for_setting_config_path=["--conf"], default_config_files=[ - os.path.join(config.CA_DIR, "common.conf"), - os.path.join(config.CA_DIR, "mitmdump.conf") + os.path.join(CA_DIR, "common.conf"), + os.path.join(CA_DIR, "mitmdump.conf") ], add_config_file_help=True, add_env_var_help=True @@ -781,8 +846,8 @@ def mitmweb(): usage="%(prog)s [options]", args_for_setting_config_path=["--conf"], default_config_files=[ - os.path.join(config.CA_DIR, "common.conf"), - os.path.join(config.CA_DIR, "mitmweb.conf") + os.path.join(CA_DIR, "common.conf"), + os.path.join(CA_DIR, "mitmweb.conf") ], add_config_file_help=True, add_env_var_help=True diff --git a/mitmproxy/console/common.py b/mitmproxy/console/common.py index 470db88d..5d15e0cd 100644 --- a/mitmproxy/console/common.py +++ b/mitmproxy/console/common.py @@ -8,7 +8,6 @@ import six import netlib from mitmproxy import flow -from mitmproxy import models from mitmproxy import utils from mitmproxy.console import signals from netlib import human @@ -38,7 +37,7 @@ def is_keypress(k): """ Is this input event a keypress? """ - if isinstance(k, basestring): + if isinstance(k, six.string_types): return True @@ -217,7 +216,7 @@ def save_data(path, data): if not path: return try: - with file(path, "wb") as f: + with open(path, "wb") as f: f.write(data) except IOError as v: signals.status_message.send(message=v.strerror) @@ -258,28 +257,30 @@ def copy_flow_format_data(part, scope, flow): else: data = "" if scope in ("q", "a"): - if flow.request.content is None: + request = flow.request.copy() + request.decode(strict=False) + if request.content is None: return None, "Request content is missing" - with models.decoded(flow.request): - if part == "h": - data += netlib.http.http1.assemble_request(flow.request) - elif part == "c": - data += flow.request.content - else: - raise ValueError("Unknown part: {}".format(part)) - if scope == "a" and flow.request.content and flow.response: + if part == "h": + data += netlib.http.http1.assemble_request(request) + elif part == "c": + data += request.content + else: + raise ValueError("Unknown part: {}".format(part)) + if scope == "a" and flow.request.raw_content and flow.response: # Add padding between request and response data += "\r\n" * 2 if scope in ("s", "a") and flow.response: - if flow.response.content is None: + response = flow.response.copy() + response.decode(strict=False) + if response.content is None: return None, "Response content is missing" - with models.decoded(flow.response): - if part == "h": - data += netlib.http.http1.assemble_response(flow.response) - elif part == "c": - data += flow.response.content - else: - raise ValueError("Unknown part: {}".format(part)) + if part == "h": + data += netlib.http.http1.assemble_response(response) + elif part == "c": + data += response.content + else: + raise ValueError("Unknown part: {}".format(part)) return data, False @@ -365,8 +366,8 @@ def ask_save_body(part, master, state, flow): "q" (request), "s" (response) or None (ask user if necessary). """ - request_has_content = flow.request and flow.request.content - response_has_content = flow.response and flow.response.content + request_has_content = flow.request and flow.request.raw_content + response_has_content = flow.response and flow.response.raw_content if part is None: # We first need to determine whether we want to save the request or the @@ -389,12 +390,12 @@ def ask_save_body(part, master, state, flow): elif part == "q" and request_has_content: ask_save_path( "Save request content", - flow.request.get_decoded_content() + flow.request.get_content(strict=False), ) elif part == "s" and response_has_content: ask_save_path( "Save response content", - flow.response.get_decoded_content() + flow.response.get_content(strict=False), ) else: signals.status_message.send(message="No content to save.") @@ -419,9 +420,9 @@ def format_flow(f, focus, extended=False, hostheader=False, marked=False): marked = marked, ) if f.response: - if f.response.content: - contentdesc = human.pretty_size(len(f.response.content)) - elif f.response.content is None: + if f.response.raw_content: + contentdesc = human.pretty_size(len(f.response.raw_content)) + elif f.response.raw_content is None: contentdesc = "[content missing]" else: contentdesc = "[no content]" diff --git a/mitmproxy/console/flowlist.py b/mitmproxy/console/flowlist.py index 8c20c4b6..bc523874 100644 --- a/mitmproxy/console/flowlist.py +++ b/mitmproxy/console/flowlist.py @@ -44,11 +44,11 @@ footer = [ ] -class EventListBox(urwid.ListBox): +class LogBufferBox(urwid.ListBox): def __init__(self, master): self.master = master - urwid.ListBox.__init__(self, master.eventlist) + urwid.ListBox.__init__(self, master.logbuffer) def keypress(self, size, key): key = common.shortcuts(key) @@ -56,7 +56,7 @@ class EventListBox(urwid.ListBox): self.master.clear_events() key = None elif key == "G": - self.set_focus(len(self.master.eventlist) - 1) + self.set_focus(len(self.master.logbuffer) - 1) elif key == "g": self.set_focus(0) return urwid.ListBox.keypress(self, size, key) @@ -76,7 +76,7 @@ class BodyPile(urwid.Pile): [ FlowListBox(master), urwid.Frame( - EventListBox(master), + LogBufferBox(master), header = self.inactive_header ) ] @@ -118,7 +118,7 @@ class ConnectionItem(urwid.WidgetWrap): return common.format_flow( self.flow, self.f, - hostheader = self.master.showhost, + hostheader = self.master.options.showhost, marked=self.state.flow_marked(self.flow) ) @@ -151,7 +151,7 @@ class ConnectionItem(urwid.WidgetWrap): if k == "a": self.master.start_server_playback( [i.copy() for i in self.master.state.view], - self.master.killextra, self.master.rheaders, + self.master.options.kill, self.master.rheaders, False, self.master.nopop, self.master.options.replay_ignore_params, self.master.options.replay_ignore_content, @@ -161,7 +161,7 @@ class ConnectionItem(urwid.WidgetWrap): elif k == "t": self.master.start_server_playback( [self.flow.copy()], - self.master.killextra, self.master.rheaders, + self.master.options.kill, self.master.rheaders, False, self.master.nopop, self.master.options.replay_ignore_params, self.master.options.replay_ignore_content, @@ -317,11 +317,9 @@ class FlowListWalker(urwid.ListWalker): class FlowListBox(urwid.ListBox): def __init__(self, master): + # type: (mitmproxy.console.master.ConsoleMaster) -> None self.master = master - urwid.ListBox.__init__( - self, - FlowListWalker(master, master.state) - ) + super(FlowListBox, self).__init__(FlowListWalker(master, master.state)) def get_method_raw(self, k): if k: @@ -395,13 +393,13 @@ class FlowListBox(urwid.ListBox): elif key == "F": self.master.toggle_follow_flows() elif key == "W": - if self.master.stream: - self.master.stop_stream() + if self.master.options.outfile: + self.master.options.outfile = None else: signals.status_prompt_path.send( self, - prompt = "Stream flows to", - callback = self.master.start_stream_to_path + prompt="Stream flows to", + callback= lambda path: self.master.options.update(outfile=(path, "ab")) ) else: return urwid.ListBox.keypress(self, size, key) diff --git a/mitmproxy/console/flowview.py b/mitmproxy/console/flowview.py index d809cf34..c85a9f73 100644 --- a/mitmproxy/console/flowview.py +++ b/mitmproxy/console/flowview.py @@ -110,7 +110,7 @@ class FlowViewHeader(urwid.WidgetWrap): f, False, extended=True, - hostheader=self.master.showhost + hostheader=self.master.options.showhost ) signals.flow_change.connect(self.sig_flow_change) @@ -120,7 +120,7 @@ class FlowViewHeader(urwid.WidgetWrap): flow, False, extended=True, - hostheader=self.master.showhost + hostheader=self.master.options.showhost ) @@ -176,7 +176,7 @@ class FlowView(tabs.Tabs): self.show() def content_view(self, viewmode, message): - if message.content is None: + if message.raw_content is None: msg, body = "", [urwid.Text([("error", "[content missing]")])] return msg, body else: @@ -200,20 +200,34 @@ class FlowView(tabs.Tabs): def _get_content_view(self, viewmode, message, max_lines, _): try: + content = message.content + if content != message.raw_content: + enc = "[decoded {}]".format( + message.headers.get("content-encoding") + ) + else: + enc = None + except ValueError: + content = message.raw_content + enc = "[cannot decode]" + try: query = None if isinstance(message, models.HTTPRequest): query = message.query description, lines = contentviews.get_content_view( - viewmode, message.content, headers=message.headers, query=query + viewmode, content, headers=message.headers, query=query ) except exceptions.ContentViewException: s = "Content viewer failed: \n" + traceback.format_exc() - signals.add_event(s, "error") + signals.add_log(s, "error") description, lines = contentviews.get_content_view( - contentviews.get("Raw"), message.content, headers=message.headers + contentviews.get("Raw"), content, headers=message.headers ) description = description.replace("Raw", "Couldn't parse: falling back to Raw") + if enc: + description = " ".join([enc, description]) + # Give hint that you have to tab for the response. if description == "No content" and isinstance(message, models.HTTPRequest): description = "No request content (press tab to view response)" @@ -407,17 +421,16 @@ class FlowView(tabs.Tabs): ) ) if part == "r": - with models.decoded(message): - # Fix an issue caused by some editors when editing a - # request/response body. Many editors make it hard to save a - # file without a terminating newline on the last line. When - # editing message bodies, this can cause problems. For now, I - # just strip the newlines off the end of the body when we return - # from an editor. - c = self.master.spawn_editor(message.content or "") - message.content = c.rstrip("\n") + # Fix an issue caused by some editors when editing a + # request/response body. Many editors make it hard to save a + # file without a terminating newline on the last line. When + # editing message bodies, this can cause problems. For now, I + # just strip the newlines off the end of the body when we return + # from an editor. + c = self.master.spawn_editor(message.get_content(strict=False) or b"") + message.content = c.rstrip(b"\n") elif part == "f": - if not message.urlencoded_form and message.content: + if not message.urlencoded_form and message.raw_content: signals.status_prompt_onekey.send( prompt = "Existing body is not a URL-encoded form. Clear and edit?", keys = [ @@ -512,14 +525,10 @@ class FlowView(tabs.Tabs): signals.flow_change.send(self, flow = self.flow) def delete_body(self, t): - if t == "m": - val = None - else: - val = None if self.tab_offset == TAB_REQ: - self.flow.request.content = val + self.flow.request.content = None else: - self.flow.response.content = val + self.flow.response.content = None signals.flow_change.send(self, flow = self.flow) def keypress(self, size, key): @@ -681,10 +690,10 @@ class FlowView(tabs.Tabs): ) key = None elif key == "v": - if conn.content: + if conn.raw_content: t = conn.headers.get("content-type") if "EDITOR" in os.environ or "PAGER" in os.environ: - self.master.spawn_external_viewer(conn.content, t) + self.master.spawn_external_viewer(conn.get_content(strict=False), t) else: signals.status_message.send( message = "Error! Set $EDITOR or $PAGER." diff --git a/mitmproxy/console/grideditor.py b/mitmproxy/console/grideditor.py index 9fa51ccb..87700fd7 100644 --- a/mitmproxy/console/grideditor.py +++ b/mitmproxy/console/grideditor.py @@ -6,11 +6,12 @@ import re import urwid +from mitmproxy import exceptions from mitmproxy import filt -from mitmproxy import script -from mitmproxy import utils +from mitmproxy.builtins import script from mitmproxy.console import common from mitmproxy.console import signals +from netlib import strutils from netlib.http import cookies from netlib.http import user_agents @@ -55,7 +56,7 @@ class TextColumn: o = editor.walker.get_current_value() if o is not None: n = editor.master.spawn_editor(o.encode("string-escape")) - n = utils.clean_hanging_newline(n) + n = strutils.clean_hanging_newline(n) editor.walker.set_current_value(n, False) editor.walker._modified() elif key in ["enter"]: @@ -395,7 +396,7 @@ class GridEditor(urwid.WidgetWrap): if p: try: p = os.path.expanduser(p) - d = file(p, "rb").read() + d = open(p, "rb").read() self.walker.set_current_value(d, unescaped) self.walker._modified() except IOError as v: @@ -643,8 +644,8 @@ class ScriptEditor(GridEditor): def is_error(self, col, val): try: - script.Script.parse_command(val) - except script.ScriptException as e: + script.parse_command(val) + except exceptions.AddonError as e: return str(e) diff --git a/mitmproxy/console/master.py b/mitmproxy/console/master.py index 95c9704d..86e889cc 100644 --- a/mitmproxy/console/master.py +++ b/mitmproxy/console/master.py @@ -14,12 +14,15 @@ import traceback import weakref import urwid +from typing import Optional # noqa +from mitmproxy import builtins from mitmproxy import contentviews from mitmproxy import controller from mitmproxy import exceptions from mitmproxy import flow from mitmproxy import script +from mitmproxy import utils from mitmproxy.console import flowlist from mitmproxy.console import flowview from mitmproxy.console import grideditor @@ -175,64 +178,37 @@ class ConsoleState(flow.State): self.add_flow_setting(flow, "marked", marked) -class Options(object): - attributes = [ - "app", - "app_domain", - "app_ip", - "anticache", - "anticomp", - "client_replay", - "eventlog", - "follow", - "keepserving", - "kill", - "intercept", - "limit", - "no_server", - "refresh_server_playback", - "rfile", - "scripts", - "showhost", - "replacements", - "rheaders", - "setheaders", - "server_replay", - "stickycookie", - "stickyauth", - "stream_large_bodies", - "verbosity", - "wfile", - "nopop", - "palette", - "palette_transparent", - "no_mouse", - "outfile", - ] - - def __init__(self, **kwargs): - for k, v in kwargs.items(): - setattr(self, k, v) - for i in self.attributes: - if not hasattr(self, i): - setattr(self, i, None) +class Options(flow.options.Options): + def __init__( + self, + eventlog=False, # type: bool + follow=False, # type: bool + intercept=False, # type: bool + limit=None, # type: Optional[str] + palette=None, # type: Optional[str] + palette_transparent=False, # type: bool + no_mouse=False, # type: bool + **kwargs + ): + self.eventlog = eventlog + self.follow = follow + self.intercept = intercept + self.limit = limit + self.palette = palette + self.palette_transparent = palette_transparent + self.no_mouse = no_mouse + super(Options, self).__init__(**kwargs) class ConsoleMaster(flow.FlowMaster): palette = [] def __init__(self, server, options): - flow.FlowMaster.__init__(self, server, ConsoleState()) + flow.FlowMaster.__init__(self, options, server, ConsoleState()) self.stream_path = None - self.options = options - - if options.replacements: - for i in options.replacements: - self.replacehooks.add(*i) - - if options.setheaders: - for i in options.setheaders: - self.setheaders.add(*i) + # This line is just for type hinting + self.options = self.options # type: Options + self.options.errored.connect(self.options_error) r = self.set_intercept(options.intercept) if r: @@ -242,30 +218,14 @@ class ConsoleMaster(flow.FlowMaster): if options.limit: self.set_limit(options.limit) - r = self.set_stickycookie(options.stickycookie) - if r: - print("Sticky cookies error: {}".format(r), file=sys.stderr) - sys.exit(1) - - r = self.set_stickyauth(options.stickyauth) - if r: - print("Sticky auth error: {}".format(r), file=sys.stderr) - sys.exit(1) - self.set_stream_large_bodies(options.stream_large_bodies) - self.refresh_server_playback = options.refresh_server_playback - self.anticache = options.anticache - self.anticomp = options.anticomp - self.killextra = options.kill self.rheaders = options.rheaders self.nopop = options.nopop - self.showhost = options.showhost self.palette = options.palette self.palette_transparent = options.palette_transparent - self.eventlog = options.eventlog - self.eventlist = urwid.SimpleListWalker([]) + self.logbuffer = urwid.SimpleListWalker([]) self.follow = options.follow if options.client_replay: @@ -274,56 +234,49 @@ class ConsoleMaster(flow.FlowMaster): if options.server_replay: self.server_playback_path(options.server_replay) - if options.scripts: - for i in options.scripts: - try: - self.load_script(i) - except exceptions.ScriptException as e: - print("Script load error: {}".format(e), file=sys.stderr) - sys.exit(1) - - if options.outfile: - err = self.start_stream_to_path( - options.outfile[0], - options.outfile[1] - ) - if err: - print("Stream file error: {}".format(err), file=sys.stderr) - sys.exit(1) - self.view_stack = [] if options.app: self.start_app(self.options.app_host, self.options.app_port) + signals.call_in.connect(self.sig_call_in) signals.pop_view_state.connect(self.sig_pop_view_state) signals.push_view_state.connect(self.sig_push_view_state) - signals.sig_add_event.connect(self.sig_add_event) + signals.sig_add_log.connect(self.sig_add_log) + self.addons.add(*builtins.default_addons()) def __setattr__(self, name, value): self.__dict__[name] = value signals.update_settings.send(self) + def options_error(self, opts, exc): + signals.status_message.send( + message=str(exc), + expire=1 + ) + def load_script(self, command, use_reloader=True): # We default to using the reloader in the console ui. return super(ConsoleMaster, self).load_script(command, use_reloader) - def sig_add_event(self, sender, e, level): - needed = dict(error=0, info=1, debug=2).get(level, 1) - if self.options.verbosity < needed: + def sig_add_log(self, sender, e, level): + if self.options.verbosity < utils.log_tier(level): return if level == "error": + signals.status_message.send( + message = "Error: %s" % str(e) + ) e = urwid.Text(("error", str(e))) else: e = urwid.Text(str(e)) - self.eventlist.append(e) - if len(self.eventlist) > EVENTLOG_SIZE: - self.eventlist.pop(0) - self.eventlist.set_focus(len(self.eventlist) - 1) + self.logbuffer.append(e) + if len(self.logbuffer) > EVENTLOG_SIZE: + self.logbuffer.pop(0) + self.logbuffer.set_focus(len(self.logbuffer) - 1) - def add_event(self, e, level): - signals.add_event(e, level) + def add_log(self, e, level): + signals.add_log(e, level) def sig_call_in(self, sender, seconds, callback, args=()): def cb(*_): @@ -354,25 +307,25 @@ class ConsoleMaster(flow.FlowMaster): status, val = s.run(method, f) if val: if status: - signals.add_event("Method %s return: %s" % (method, val), "debug") + signals.add_log("Method %s return: %s" % (method, val), "debug") else: - signals.add_event( + signals.add_log( "Method %s error: %s" % (method, val[1]), "error") def run_script_once(self, command, f): if not command: return - signals.add_event("Running script on flow: %s" % command, "debug") + signals.add_log("Running script on flow: %s" % command, "debug") try: - s = script.Script(command, script.ScriptContext(self)) + s = script.Script(command) s.load() except script.ScriptException as e: signals.status_message.send( message='Error loading "{}".'.format(command) ) - signals.add_event('Error loading "{}":\n{}'.format(command, e), "error") + signals.add_log('Error loading "{}":\n{}'.format(command, e), "error") return if f.request: @@ -385,7 +338,7 @@ class ConsoleMaster(flow.FlowMaster): signals.flow_change.send(self, flow = f) def toggle_eventlog(self): - self.eventlog = not self.eventlog + self.options.eventlog = not self.options.eventlog signals.pop_view_state.send(self) self.view_flowlist() @@ -416,7 +369,7 @@ class ConsoleMaster(flow.FlowMaster): if flows: self.start_server_playback( flows, - self.killextra, self.rheaders, + self.options.kill, self.rheaders, False, self.nopop, self.options.replay_ignore_params, self.options.replay_ignore_content, @@ -512,7 +465,7 @@ class ConsoleMaster(flow.FlowMaster): if self.options.rfile: ret = self.load_flows_path(self.options.rfile) if ret and self.state.flow_count(): - signals.add_event( + signals.add_log( "File truncated or corrupted. " "Loaded as many flows as possible.", "error" @@ -523,7 +476,7 @@ class ConsoleMaster(flow.FlowMaster): sys.exit(1) self.loop.set_alarm_in(0.01, self.ticker) - if self.server.config.http2 and not tcp.HAS_ALPN: # pragma: no cover + if self.options.http2 and not tcp.HAS_ALPN: # pragma: no cover def http2err(*args, **kwargs): signals.status_message.send( message = "HTTP/2 disabled - OpenSSL 1.0.2+ required." @@ -615,7 +568,7 @@ class ConsoleMaster(flow.FlowMaster): if self.state.follow_focus: self.state.set_focus(self.state.flow_count()) - if self.eventlog: + if self.options.eventlog: body = flowlist.BodyPile(self) else: body = flowlist.FlowListBox(self) @@ -652,7 +605,7 @@ class ConsoleMaster(flow.FlowMaster): return path = os.path.expanduser(path) try: - f = file(path, "wb") + f = open(path, "wb") fw = flow.FlowWriter(f) for i in flows: fw.add(i) @@ -705,20 +658,7 @@ class ConsoleMaster(flow.FlowMaster): self.refresh_focus() def edit_scripts(self, scripts): - commands = [x[0] for x in scripts] # remove outer array - if commands == [s.command for s in self.scripts]: - return - - self.unload_scripts() - for command in commands: - try: - self.load_script(command) - except exceptions.ScriptException as e: - signals.status_message.send( - message='Error loading "{}".'.format(command) - ) - signals.add_event('Error loading "{}":\n{}'.format(command, e), "error") - signals.update_settings.send(self) + self.options.scripts = [x[0] for x in scripts] def stop_client_playback_prompt(self, a): if a != "n": @@ -773,7 +713,7 @@ class ConsoleMaster(flow.FlowMaster): signals.flow_change.send(self, flow = f) def clear_events(self): - self.eventlist[:] = [] + self.logbuffer[:] = [] # Handlers @controller.handler @@ -802,16 +742,16 @@ class ConsoleMaster(flow.FlowMaster): super(ConsoleMaster, self).tcp_message(f) message = f.messages[-1] direction = "->" if message.from_client else "<-" - self.add_event("{client} {direction} tcp {direction} {server}".format( + self.add_log("{client} {direction} tcp {direction} {server}".format( client=repr(f.client_conn.address), server=repr(f.server_conn.address), direction=direction, ), "info") - self.add_event(strutils.bytes_to_escaped_str(message.content), "debug") + self.add_log(strutils.bytes_to_escaped_str(message.content), "debug") @controller.handler def script_change(self, script): if super(ConsoleMaster, self).script_change(script): - signals.status_message.send(message='"{}" reloaded.'.format(script.filename)) + signals.status_message.send(message='"{}" reloaded.'.format(script.path)) else: - signals.status_message.send(message='Error reloading "{}".'.format(script.filename)) + signals.status_message.send(message='Error reloading "{}".'.format(script.path)) diff --git a/mitmproxy/console/options.py b/mitmproxy/console/options.py index 5a01c9d5..62564a60 100644 --- a/mitmproxy/console/options.py +++ b/mitmproxy/console/options.py @@ -36,25 +36,25 @@ class Options(urwid.WidgetWrap): select.Option( "Header Set Patterns", "H", - lambda: master.setheaders.count(), + lambda: len(master.options.setheaders), self.setheaders ), select.Option( "Ignore Patterns", "I", - lambda: master.server.config.check_ignore, - self.ignorepatterns + lambda: master.options.ignore_hosts, + self.ignore_hosts ), select.Option( "Replacement Patterns", "R", - lambda: master.replacehooks.count(), + lambda: len(master.options.replacements), self.replacepatterns ), select.Option( "Scripts", "S", - lambda: master.scripts, + lambda: master.options.scripts, self.scripts ), @@ -74,59 +74,59 @@ class Options(urwid.WidgetWrap): select.Option( "Show Host", "w", - lambda: master.showhost, - self.toggle_showhost + lambda: master.options.showhost, + master.options.toggler("showhost") ), select.Heading("Network"), select.Option( "No Upstream Certs", "U", - lambda: master.server.config.no_upstream_cert, - self.toggle_upstream_cert + lambda: master.options.no_upstream_cert, + master.options.toggler("no_upstream_cert") ), select.Option( "TCP Proxying", "T", - lambda: master.server.config.check_tcp, - self.tcp_proxy + lambda: master.options.tcp_hosts, + self.tcp_hosts ), select.Heading("Utility"), select.Option( "Anti-Cache", "a", - lambda: master.anticache, - self.toggle_anticache + lambda: master.options.anticache, + master.options.toggler("anticache") ), select.Option( "Anti-Compression", "o", - lambda: master.anticomp, - self.toggle_anticomp + lambda: master.options.anticomp, + master.options.toggler("anticomp") ), select.Option( "Kill Extra", "x", - lambda: master.killextra, - self.toggle_killextra + lambda: master.options.kill, + master.options.toggler("kill") ), select.Option( "No Refresh", "f", - lambda: not master.refresh_server_playback, - self.toggle_refresh_server_playback + lambda: not master.options.refresh_server_playback, + master.options.toggler("refresh_server_playback") ), select.Option( "Sticky Auth", "A", - lambda: master.stickyauth_txt, + lambda: master.options.stickyauth, self.sticky_auth ), select.Option( "Sticky Cookies", "t", - lambda: master.stickycookie_txt, + lambda: master.options.stickycookie, self.sticky_cookie ), ] @@ -140,6 +140,7 @@ class Options(urwid.WidgetWrap): ) self.master.loop.widget.footer.update("") signals.update_settings.connect(self.sig_update_settings) + master.options.changed.connect(self.sig_update_settings) def sig_update_settings(self, sender): self.lb.walker._modified() @@ -151,19 +152,22 @@ class Options(urwid.WidgetWrap): return super(self.__class__, self).keypress(size, key) def clearall(self): - self.master.anticache = False - self.master.anticomp = False - self.master.killextra = False - self.master.showhost = False - self.master.refresh_server_playback = True - self.master.server.config.no_upstream_cert = False - self.master.setheaders.clear() - self.master.replacehooks.clear() - self.master.set_ignore_filter([]) - self.master.set_tcp_filter([]) - self.master.scripts = [] - self.master.set_stickyauth(None) - self.master.set_stickycookie(None) + self.master.options.update( + anticache = False, + anticomp = False, + ignore_hosts = (), + tcp_hosts = (), + kill = False, + no_upstream_cert = False, + refresh_server_playback = True, + replacements = [], + scripts = [], + setheaders = [], + showhost = False, + stickyauth = None, + stickycookie = None, + ) + self.master.state.default_body_view = contentviews.get("Auto") signals.update_settings.send(self) @@ -172,58 +176,39 @@ class Options(urwid.WidgetWrap): expire = 1 ) - def toggle_anticache(self): - self.master.anticache = not self.master.anticache - - def toggle_anticomp(self): - self.master.anticomp = not self.master.anticomp - - def toggle_killextra(self): - self.master.killextra = not self.master.killextra - - def toggle_showhost(self): - self.master.showhost = not self.master.showhost - - def toggle_refresh_server_playback(self): - self.master.refresh_server_playback = not self.master.refresh_server_playback - - def toggle_upstream_cert(self): - self.master.server.config.no_upstream_cert = not self.master.server.config.no_upstream_cert - signals.update_settings.send(self) - def setheaders(self): - def _set(*args, **kwargs): - self.master.setheaders.set(*args, **kwargs) - signals.update_settings.send(self) self.master.view_grideditor( grideditor.SetHeadersEditor( self.master, - self.master.setheaders.get_specs(), - _set + self.master.options.setheaders, + self.master.options.setter("setheaders") ) ) - def ignorepatterns(self): - def _set(ignore): - self.master.set_ignore_filter(ignore) - signals.update_settings.send(self) + def tcp_hosts(self): self.master.view_grideditor( grideditor.HostPatternEditor( self.master, - self.master.get_ignore_filter(), - _set + self.master.options.tcp_hosts, + self.master.options.setter("tcp_hosts") + ) + ) + + def ignore_hosts(self): + self.master.view_grideditor( + grideditor.HostPatternEditor( + self.master, + self.master.options.ignore_hosts, + self.master.options.setter("ignore_hosts") ) ) def replacepatterns(self): - def _set(*args, **kwargs): - self.master.replacehooks.set(*args, **kwargs) - signals.update_settings.send(self) self.master.view_grideditor( grideditor.ReplaceEditor( self.master, - self.master.replacehooks.get_specs(), - _set + self.master.options.replacements, + self.master.options.setter("replacements") ) ) @@ -231,7 +216,7 @@ class Options(urwid.WidgetWrap): self.master.view_grideditor( grideditor.ScriptEditor( self.master, - [[i.command] for i in self.master.scripts], + [[i] for i in self.master.options.scripts], self.master.edit_scripts ) ) @@ -246,30 +231,18 @@ class Options(urwid.WidgetWrap): def has_default_displaymode(self): return self.master.state.default_body_view.name != "Auto" - def tcp_proxy(self): - def _set(tcp): - self.master.set_tcp_filter(tcp) - signals.update_settings.send(self) - self.master.view_grideditor( - grideditor.HostPatternEditor( - self.master, - self.master.get_tcp_filter(), - _set - ) - ) - def sticky_auth(self): signals.status_prompt.send( prompt = "Sticky auth filter", - text = self.master.stickyauth_txt, - callback = self.master.set_stickyauth + text = self.master.options.stickyauth, + callback = self.master.options.setter("stickyauth") ) def sticky_cookie(self): signals.status_prompt.send( prompt = "Sticky cookie filter", - text = self.master.stickycookie_txt, - callback = self.master.set_stickycookie + text = self.master.options.stickycookie, + callback = self.master.options.setter("stickycookie") ) def palette(self): diff --git a/mitmproxy/console/palettes.py b/mitmproxy/console/palettes.py index 36cc3ac0..2e12338f 100644 --- a/mitmproxy/console/palettes.py +++ b/mitmproxy/console/palettes.py @@ -24,7 +24,7 @@ class Palette: # List and Connections 'method', 'focus', 'code_200', 'code_300', 'code_400', 'code_500', 'code_other', - 'error', + 'error', "warn", 'header', 'highlight', 'intercept', 'replay', 'mark', # Hex view @@ -100,6 +100,7 @@ class LowDark(Palette): code_500 = ('light red', 'default'), code_other = ('dark red', 'default'), + warn = ('brown', 'default'), error = ('light red', 'default'), header = ('dark cyan', 'default'), @@ -166,6 +167,7 @@ class LowLight(Palette): code_other = ('light red', 'default'), error = ('light red', 'default'), + warn = ('brown', 'default'), header = ('dark blue', 'default'), highlight = ('black,bold', 'default'), @@ -250,6 +252,7 @@ class SolarizedLight(LowLight): code_other = (sol_magenta, 'default'), error = (sol_red, 'default'), + warn = (sol_orange, 'default'), header = (sol_blue, 'default'), highlight = (sol_base01, 'default'), @@ -299,6 +302,7 @@ class SolarizedDark(LowDark): code_other = (sol_magenta, 'default'), error = (sol_red, 'default'), + warn = (sol_orange, 'default'), header = (sol_blue, 'default'), highlight = (sol_base01, 'default'), diff --git a/mitmproxy/console/signals.py b/mitmproxy/console/signals.py index b57ebf0c..97507834 100644 --- a/mitmproxy/console/signals.py +++ b/mitmproxy/console/signals.py @@ -3,11 +3,11 @@ from __future__ import absolute_import, print_function, division import blinker # Show a status message in the action bar -sig_add_event = blinker.Signal() +sig_add_log = blinker.Signal() -def add_event(e, level): - sig_add_event.send( +def add_log(e, level): + sig_add_log.send( None, e=e, level=level diff --git a/mitmproxy/console/statusbar.py b/mitmproxy/console/statusbar.py index e576b565..f0da9dcd 100644 --- a/mitmproxy/console/statusbar.py +++ b/mitmproxy/console/statusbar.py @@ -28,9 +28,10 @@ class ActionBar(urwid.WidgetWrap): self.pathprompt = False def sig_message(self, sender, message, expire=None): + if self.prompting: + return w = urwid.Text(message) self._w = w - self.prompting = False if expire: def cb(*args): if w == self._w: @@ -116,12 +117,15 @@ class ActionBar(urwid.WidgetWrap): class StatusBar(urwid.WidgetWrap): def __init__(self, master, helptext): - self.master, self.helptext = master, helptext + # type: (mitmproxy.console.master.ConsoleMaster, object) -> None + self.master = master + self.helptext = helptext self.ab = ActionBar() self.ib = urwid.WidgetWrap(urwid.Text("")) - self._w = urwid.Pile([self.ib, self.ab]) + super(StatusBar, self).__init__(urwid.Pile([self.ib, self.ab])) signals.update_settings.connect(self.sig_update_settings) signals.flowlist_change.connect(self.sig_update_settings) + master.options.changed.connect(self.sig_update_settings) self.redraw() def sig_update_settings(self, sender): @@ -133,11 +137,11 @@ class StatusBar(urwid.WidgetWrap): def get_status(self): r = [] - if self.master.setheaders.count(): + if len(self.master.options.setheaders): r.append("[") r.append(("heading_key", "H")) r.append("eaders]") - if self.master.replacehooks.count(): + if len(self.master.options.replacements): r.append("[") r.append(("heading_key", "R")) r.append("eplacing]") @@ -152,14 +156,14 @@ class StatusBar(urwid.WidgetWrap): r.append(":%s in file]" % self.master.server_playback.count()) else: r.append(":%s to go]" % self.master.server_playback.count()) - if self.master.get_ignore_filter(): + if self.master.options.ignore_hosts: r.append("[") r.append(("heading_key", "I")) - r.append("gnore:%d]" % len(self.master.get_ignore_filter())) - if self.master.get_tcp_filter(): + r.append("gnore:%d]" % len(self.master.options.ignore_hosts)) + if self.master.options.tcp_hosts: r.append("[") r.append(("heading_key", "T")) - r.append("CP:%d]" % len(self.master.get_tcp_filter())) + r.append("CP:%d]" % len(self.master.options.tcp_hosts)) if self.master.state.intercept_txt: r.append("[") r.append(("heading_key", "i")) @@ -172,31 +176,31 @@ class StatusBar(urwid.WidgetWrap): r.append("[") r.append(("heading_key", "Marked Flows")) r.append("]") - if self.master.stickycookie_txt: + if self.master.options.stickycookie: r.append("[") r.append(("heading_key", "t")) - r.append(":%s]" % self.master.stickycookie_txt) - if self.master.stickyauth_txt: + r.append(":%s]" % self.master.options.stickycookie) + if self.master.options.stickyauth: r.append("[") r.append(("heading_key", "u")) - r.append(":%s]" % self.master.stickyauth_txt) + r.append(":%s]" % self.master.options.stickyauth) if self.master.state.default_body_view.name != "Auto": r.append("[") r.append(("heading_key", "M")) r.append(":%s]" % self.master.state.default_body_view.name) opts = [] - if self.master.anticache: + if self.master.options.anticache: opts.append("anticache") - if self.master.anticomp: + if self.master.options.anticomp: opts.append("anticomp") - if self.master.showhost: + if self.master.options.showhost: opts.append("showhost") - if not self.master.refresh_server_playback: + if not self.master.options.refresh_server_playback: opts.append("norefresh") - if self.master.killextra: + if self.master.options.kill: opts.append("killextra") - if self.master.server.config.no_upstream_cert: + if self.master.options.no_upstream_cert: opts.append("no-upstream-cert") if self.master.state.follow_focus: opts.append("following") @@ -210,21 +214,20 @@ class StatusBar(urwid.WidgetWrap): if opts: r.append("[%s]" % (":".join(opts))) - if self.master.server.config.mode in ["reverse", "upstream"]: + if self.master.options.mode in ["reverse", "upstream"]: dst = self.master.server.config.upstream_server r.append("[dest:%s]" % netlib.http.url.unparse( dst.scheme, dst.address.host, dst.address.port )) - if self.master.scripts: + if self.master.options.scripts: r.append("[") r.append(("heading_key", "s")) - r.append("cripts:%s]" % len(self.master.scripts)) - # r.append("[lt:%0.3f]"%self.master.looptime) + r.append("cripts:%s]" % len(self.master.options.scripts)) - if self.master.stream: - r.append("[W:%s]" % self.master.stream_path) + if self.master.options.outfile: + r.append("[W:%s]" % self.master.options.outfile[0]) return r diff --git a/mitmproxy/contentviews.py b/mitmproxy/contentviews.py index 331a706f..afdaad7f 100644 --- a/mitmproxy/contentviews.py +++ b/mitmproxy/contentviews.py @@ -31,7 +31,6 @@ from six import BytesIO from mitmproxy import exceptions from mitmproxy.contrib import jsbeautifier from mitmproxy.contrib.wbxml import ASCommandResponse -from netlib import encoding from netlib import http from netlib import multidict from netlib.http import url @@ -620,15 +619,6 @@ def get_content_view(viewmode, data, **metadata): Raises: ContentViewException, if the content view threw an error. """ - msg = [] - - headers = metadata.get("headers", {}) - enc = headers.get("content-encoding") - if enc and enc != "identity": - decoded = encoding.decode(enc, data) - if decoded: - data = decoded - msg.append("[decoded %s]" % enc) try: ret = viewmode(data, **metadata) # Third-party viewers can fail in unexpected ways... @@ -639,8 +629,8 @@ def get_content_view(viewmode, data, **metadata): sys.exc_info()[2] ) if not ret: - ret = get("Raw")(data, **metadata) - msg.append("Couldn't parse: falling back to Raw") + desc = "Couldn't parse: falling back to Raw" + _, content = get("Raw")(data, **metadata) else: - msg.append(ret[0]) - return " ".join(msg), safe_to_print(ret[1]) + desc, content = ret + return desc, safe_to_print(content) diff --git a/mitmproxy/controller.py b/mitmproxy/controller.py index a170d868..070ec862 100644 --- a/mitmproxy/controller.py +++ b/mitmproxy/controller.py @@ -2,11 +2,14 @@ from __future__ import absolute_import, print_function, division import functools import threading +import contextlib from six.moves import queue +from mitmproxy import addons +from mitmproxy import options +from . import ctx as mitmproxy_ctx from netlib import basethread - from . import exceptions @@ -30,21 +33,67 @@ Events = frozenset([ "error", "log", + "start", + "configure", + "done", + "tick", + "script_change", ]) +class Log(object): + def __init__(self, master): + self.master = master + + def __call__(self, text, level="info"): + self.master.add_log(text, level) + + def debug(self, txt): + self(txt, "debug") + + def info(self, txt): + self(txt, "info") + + def warn(self, txt): + self(txt, "warn") + + def error(self, txt): + self(txt, "error") + + class Master(object): """ The master handles mitmproxy's main event loop. """ - def __init__(self, *servers): + def __init__(self, opts, *servers): + self.options = opts or options.Options() + self.addons = addons.Addons(self) self.event_queue = queue.Queue() self.should_exit = threading.Event() self.servers = [] for i in servers: self.add_server(i) + @contextlib.contextmanager + def handlecontext(self): + # Handlecontexts also have to nest - leave cleanup to the outermost + if mitmproxy_ctx.master: + yield + return + mitmproxy_ctx.master = self + mitmproxy_ctx.log = Log(self) + try: + yield + finally: + mitmproxy_ctx.master = None + mitmproxy_ctx.log = None + + def add_log(self, e, level="info"): + """ + level: debug, info, warn, error + """ + def add_server(self, server): # We give a Channel to the server which can be used to communicate with the master channel = Channel(self.event_queue, self.should_exit) @@ -68,26 +117,25 @@ class Master(object): self.shutdown() def tick(self, timeout): + with self.handlecontext(): + self.addons("tick") changed = False try: - # This endless loop runs until the 'Queue.Empty' - # exception is thrown. - while True: - mtype, obj = self.event_queue.get(timeout=timeout) - if mtype not in Events: - raise exceptions.ControlException("Unknown event %s" % repr(mtype)) - handle_func = getattr(self, mtype) - if not hasattr(handle_func, "__dict__"): - raise exceptions.ControlException("Handler %s not a function" % mtype) - if not handle_func.__dict__.get("__handler"): - raise exceptions.ControlException( - "Handler function %s is not decorated with controller.handler" % ( - handle_func - ) + mtype, obj = self.event_queue.get(timeout=timeout) + if mtype not in Events: + raise exceptions.ControlException("Unknown event %s" % repr(mtype)) + handle_func = getattr(self, mtype) + if not callable(handle_func): + raise exceptions.ControlException("Handler %s not callable" % mtype) + if not handle_func.__dict__.get("__handler"): + raise exceptions.ControlException( + "Handler function %s is not decorated with controller.handler" % ( + handle_func ) - handle_func(obj) - self.event_queue.task_done() - changed = True + ) + handle_func(obj) + self.event_queue.task_done() + changed = True except queue.Empty: pass return changed @@ -96,6 +144,7 @@ class Master(object): for server in self.servers: server.shutdown() self.should_exit.set() + self.addons.done() class ServerThread(basethread.BaseThread): @@ -151,15 +200,7 @@ class Channel(object): def handler(f): @functools.wraps(f) - def wrapper(*args, **kwargs): - # We can either be called as a method, or as a wrapped solo function - if len(args) == 1: - message = args[0] - elif len(args) == 2: - message = args[1] - else: - raise exceptions.ControlException("Handler takes one argument: a message") - + def wrapper(master, message): if not hasattr(message, "reply"): raise exceptions.ControlException("Message %s has no reply attribute" % message) @@ -172,10 +213,19 @@ def handler(f): handling = True message.reply.handled = True - ret = f(*args, **kwargs) + with master.handlecontext(): + ret = f(master, message) + if handling: + master.addons(f.__name__, message) if handling and not message.reply.acked and not message.reply.taken: message.reply.ack() + + # Reset the handled flag - it's common for us to feed the same object + # through handlers repeatedly, so we don't want this to persist across + # calls. + if message.reply.handled: + message.reply.handled = False return ret # Mark this function as a handler wrapper wrapper.__dict__["__handler"] = True @@ -216,7 +266,7 @@ class Reply(object): def __del__(self): if not self.acked: # This will be ignored by the interpreter, but emit a warning - raise exceptions.ControlException("Un-acked message") + raise exceptions.ControlException("Un-acked message: %s" % self.obj) class DummyReply(object): diff --git a/mitmproxy/ctx.py b/mitmproxy/ctx.py new file mode 100644 index 00000000..fcfdfd0b --- /dev/null +++ b/mitmproxy/ctx.py @@ -0,0 +1,4 @@ +from typing import Callable # noqa + +master = None # type: "mitmproxy.flow.FlowMaster" +log = None # type: Callable[[str], None] diff --git a/mitmproxy/dump.py b/mitmproxy/dump.py index 6670be9b..78dd2578 100644 --- a/mitmproxy/dump.py +++ b/mitmproxy/dump.py @@ -1,75 +1,50 @@ from __future__ import absolute_import, print_function, division -import itertools import sys -import traceback + +from typing import Optional # noqa +import typing # noqa import click -from mitmproxy import contentviews from mitmproxy import controller from mitmproxy import exceptions -from mitmproxy import filt from mitmproxy import flow -from netlib import human +from mitmproxy import builtins +from mitmproxy import utils +from mitmproxy.builtins import dumper from netlib import tcp -from netlib import strutils class DumpError(Exception): pass -class Options(object): - attributes = [ - "app", - "app_host", - "app_port", - "anticache", - "anticomp", - "client_replay", - "filtstr", - "flow_detail", - "keepserving", - "kill", - "no_server", - "nopop", - "refresh_server_playback", - "replacements", - "rfile", - "rheaders", - "setheaders", - "server_replay", - "scripts", - "showhost", - "stickycookie", - "stickyauth", - "stream_large_bodies", - "verbosity", - "outfile", - "replay_ignore_content", - "replay_ignore_params", - "replay_ignore_payload_params", - "replay_ignore_host" - ] - - def __init__(self, **kwargs): - for k, v in kwargs.items(): - setattr(self, k, v) - for i in self.attributes: - if not hasattr(self, i): - setattr(self, i, None) +class Options(flow.options.Options): + def __init__( + self, + keepserving=False, # type: bool + filtstr=None, # type: Optional[str] + flow_detail=1, # type: int + tfile=None, # type: Optional[typing.io.TextIO] + **kwargs + ): + self.filtstr = filtstr + self.flow_detail = flow_detail + self.keepserving = keepserving + self.tfile = tfile + super(Options, self).__init__(**kwargs) class DumpMaster(flow.FlowMaster): - def __init__(self, server, options, outfile=None): - flow.FlowMaster.__init__(self, server, flow.State()) - self.outfile = outfile - self.o = options - self.anticache = options.anticache - self.anticomp = options.anticomp - self.showhost = options.showhost + def __init__(self, server, options): + flow.FlowMaster.__init__(self, options, server, flow.State()) + self.has_errored = False + self.addons.add(*builtins.default_addons()) + self.addons.add(dumper.Dumper()) + # This line is just for type hinting + self.options = self.options # type: Options self.replay_ignore_params = options.replay_ignore_params self.replay_ignore_content = options.replay_ignore_content self.replay_ignore_host = options.replay_ignore_host @@ -78,39 +53,11 @@ class DumpMaster(flow.FlowMaster): self.set_stream_large_bodies(options.stream_large_bodies) - if self.server and self.server.config.http2 and not tcp.HAS_ALPN: # pragma: no cover + if self.server and self.options.http2 and not tcp.HAS_ALPN: # pragma: no cover print("ALPN support missing (OpenSSL 1.0.2+ required)!\n" "HTTP/2 is disabled. Use --no-http2 to silence this warning.", file=sys.stderr) - if options.filtstr: - self.filt = filt.parse(options.filtstr) - else: - self.filt = None - - if options.stickycookie: - self.set_stickycookie(options.stickycookie) - - if options.stickyauth: - self.set_stickyauth(options.stickyauth) - - if options.outfile: - err = self.start_stream_to_path( - options.outfile[0], - options.outfile[1], - self.filt - ) - if err: - raise DumpError(err) - - if options.replacements: - for i in options.replacements: - self.replacehooks.add(*i) - - if options.setheaders: - for i in options.setheaders: - self.setheaders.add(*i) - if options.server_replay: self.start_server_playback( self._readflow(options.server_replay), @@ -129,22 +76,15 @@ class DumpMaster(flow.FlowMaster): not options.keepserving ) - scripts = options.scripts or [] - for command in scripts: - try: - self.load_script(command, use_reloader=True) - except exceptions.ScriptException as e: - raise DumpError(str(e)) - if options.rfile: try: self.load_flows_file(options.rfile) except exceptions.FlowReadException as v: - self.add_event("Flow file corrupted.", "error") + self.add_log("Flow file corrupted.", "error") raise DumpError(v) - if self.o.app: - self.start_app(self.o.app_host, self.o.app_port) + if self.options.app: + self.start_app(self.options.app_host, self.options.app_port) def _readflow(self, paths): """ @@ -156,219 +96,26 @@ class DumpMaster(flow.FlowMaster): except exceptions.FlowReadException as e: raise DumpError(str(e)) - def add_event(self, e, level="info"): - needed = dict(error=0, info=1, debug=2).get(level, 1) - if self.o.verbosity >= needed: - self.echo( + def add_log(self, e, level="info"): + if level == "error": + self.has_errored = True + if self.options.verbosity >= utils.log_tier(level): + click.secho( e, + file=self.options.tfile, fg="red" if level == "error" else None, dim=(level == "debug"), err=(level == "error") ) - @staticmethod - def indent(n, text): - l = str(text).strip().splitlines() - pad = " " * n - return "\n".join(pad + i for i in l) - - def echo(self, text, indent=None, **style): - if indent: - text = self.indent(indent, text) - click.secho(text, file=self.outfile, **style) - - def _echo_message(self, message): - if self.o.flow_detail >= 2 and hasattr(message, "headers"): - headers = "\r\n".join( - "{}: {}".format( - click.style(strutils.bytes_to_escaped_str(k), fg="blue", bold=True), - click.style(strutils.bytes_to_escaped_str(v), fg="blue")) - for k, v in message.headers.fields - ) - self.echo(headers, indent=4) - if self.o.flow_detail >= 3: - if message.content is None: - self.echo("(content missing)", indent=4) - elif message.content: - self.echo("") - - try: - type, lines = contentviews.get_content_view( - contentviews.get("Auto"), - message.content, - headers=getattr(message, "headers", None) - ) - except exceptions.ContentViewException: - s = "Content viewer failed: \n" + traceback.format_exc() - self.add_event(s, "debug") - type, lines = contentviews.get_content_view( - contentviews.get("Raw"), - message.content, - headers=getattr(message, "headers", None) - ) - - styles = dict( - highlight=dict(bold=True), - offset=dict(fg="blue"), - header=dict(fg="green", bold=True), - text=dict(fg="green") - ) - - def colorful(line): - yield u" " # we can already indent here - for (style, text) in line: - yield click.style(text, **styles.get(style, {})) - - if self.o.flow_detail == 3: - lines_to_echo = itertools.islice(lines, 70) - else: - lines_to_echo = lines - - lines_to_echo = list(lines_to_echo) - - content = u"\r\n".join( - u"".join(colorful(line)) for line in lines_to_echo - ) - - self.echo(content) - if next(lines, None): - self.echo("(cut off)", indent=4, dim=True) - - if self.o.flow_detail >= 2: - self.echo("") - - def _echo_request_line(self, flow): - if flow.request.stickycookie: - stickycookie = click.style("[stickycookie] ", fg="yellow", bold=True) - else: - stickycookie = "" - - if flow.client_conn: - client = click.style(strutils.bytes_to_escaped_str(flow.client_conn.address.host), bold=True) - else: - client = click.style("[replay]", fg="yellow", bold=True) - - method = flow.request.method - method_color = dict( - GET="green", - DELETE="red" - ).get(method.upper(), "magenta") - method = click.style(strutils.bytes_to_escaped_str(method), fg=method_color, bold=True) - if self.showhost: - url = flow.request.pretty_url - else: - url = flow.request.url - url = click.style(strutils.bytes_to_escaped_str(url), bold=True) - - httpversion = "" - if flow.request.http_version not in ("HTTP/1.1", "HTTP/1.0"): - httpversion = " " + flow.request.http_version # We hide "normal" HTTP 1. - - line = "{stickycookie}{client} {method} {url}{httpversion}".format( - stickycookie=stickycookie, - client=client, - method=method, - url=url, - httpversion=httpversion - ) - self.echo(line) - - def _echo_response_line(self, flow): - if flow.response.is_replay: - replay = click.style("[replay] ", fg="yellow", bold=True) - else: - replay = "" - - code = flow.response.status_code - code_color = None - if 200 <= code < 300: - code_color = "green" - elif 300 <= code < 400: - code_color = "magenta" - elif 400 <= code < 600: - code_color = "red" - code = click.style(str(code), fg=code_color, bold=True, blink=(code == 418)) - reason = click.style(strutils.bytes_to_escaped_str(flow.response.reason), fg=code_color, bold=True) - - if flow.response.content is None: - size = "(content missing)" - else: - size = human.pretty_size(len(flow.response.content)) - size = click.style(size, bold=True) - - arrows = click.style("<<", bold=True) - - line = "{replay} {arrows} {code} {reason} {size}".format( - replay=replay, - arrows=arrows, - code=code, - reason=reason, - size=size - ) - self.echo(line) - - def echo_flow(self, f): - if self.o.flow_detail == 0: - return - - if f.request: - self._echo_request_line(f) - self._echo_message(f.request) - - if f.response: - self._echo_response_line(f) - self._echo_message(f.response) - - if f.error: - self.echo(" << {}".format(f.error.msg), bold=True, fg="red") - - if self.outfile: - self.outfile.flush() - - def _process_flow(self, f): - if self.filt and not f.match(self.filt): - return - - self.echo_flow(f) - @controller.handler def request(self, f): - f = flow.FlowMaster.request(self, f) + f = super(DumpMaster, self).request(f) if f: self.state.delete_flow(f) return f - @controller.handler - def response(self, f): - f = flow.FlowMaster.response(self, f) - if f: - self._process_flow(f) - return f - - @controller.handler - def error(self, f): - flow.FlowMaster.error(self, f) - if f: - self._process_flow(f) - return f - - @controller.handler - def tcp_message(self, f): - super(DumpMaster, self).tcp_message(f) - - if self.o.flow_detail == 0: - return - message = f.messages[-1] - direction = "->" if message.from_client else "<-" - self.echo("{client} {direction} tcp {direction} {server}".format( - client=repr(f.client_conn.address), - server=repr(f.server_conn.address), - direction=direction, - )) - self._echo_message(message) - def run(self): # pragma: no cover - if self.o.rfile and not self.o.keepserving: - self.unload_scripts() # make sure to trigger script unload events. + if self.options.rfile and not self.options.keepserving: return super(DumpMaster, self).run() diff --git a/mitmproxy/exceptions.py b/mitmproxy/exceptions.py index 63bd8d3d..3b41fe1c 100644 --- a/mitmproxy/exceptions.py +++ b/mitmproxy/exceptions.py @@ -95,3 +95,11 @@ class FlowReadException(ProxyException): class ControlException(ProxyException): pass + + +class OptionsError(Exception): + pass + + +class AddonError(Exception): + pass diff --git a/mitmproxy/filt.py b/mitmproxy/filt.py index b1b72aa7..8b647b22 100644 --- a/mitmproxy/filt.py +++ b/mitmproxy/filt.py @@ -35,11 +35,26 @@ from __future__ import absolute_import, print_function, division import re import sys +import functools + +from mitmproxy.models.http import HTTPFlow +from mitmproxy.models.tcp import TCPFlow from netlib import strutils import pyparsing as pp +def only(*types): + def decorator(fn): + @functools.wraps(fn) + def filter_types(self, flow): + if isinstance(flow, types): + return fn(self, flow) + return False + return filter_types + return decorator + + class _Token(object): def dump(self, indent=0, fp=sys.stdout): @@ -65,10 +80,29 @@ class FErr(_Action): return True if f.error else False +class FHTTP(_Action): + code = "http" + help = "Match HTTP flows" + + @only(HTTPFlow) + def __call__(self, f): + return True + + +class FTCP(_Action): + code = "tcp" + help = "Match TCP flows" + + @only(TCPFlow) + def __call__(self, f): + return True + + class FReq(_Action): code = "q" help = "Match request with no response" + @only(HTTPFlow) def __call__(self, f): if not f.response: return True @@ -78,6 +112,7 @@ class FResp(_Action): code = "s" help = "Match response" + @only(HTTPFlow) def __call__(self, f): return bool(f.response) @@ -117,6 +152,7 @@ class FAsset(_Action): ] ASSET_TYPES = [re.compile(x) for x in ASSET_TYPES] + @only(HTTPFlow) def __call__(self, f): if f.response: for i in self.ASSET_TYPES: @@ -129,6 +165,7 @@ class FContentType(_Rex): code = "t" help = "Content-type header" + @only(HTTPFlow) def __call__(self, f): if _check_content_type(self.re, f.request): return True @@ -137,18 +174,20 @@ class FContentType(_Rex): return False -class FRequestContentType(_Rex): +class FContentTypeRequest(_Rex): code = "tq" help = "Request Content-Type header" + @only(HTTPFlow) def __call__(self, f): return _check_content_type(self.re, f.request) -class FResponseContentType(_Rex): +class FContentTypeResponse(_Rex): code = "ts" help = "Response Content-Type header" + @only(HTTPFlow) def __call__(self, f): if f.response: return _check_content_type(self.re, f.response) @@ -160,6 +199,7 @@ class FHead(_Rex): help = "Header" flags = re.MULTILINE + @only(HTTPFlow) def __call__(self, f): if f.request and self.re.search(bytes(f.request.headers)): return True @@ -173,6 +213,7 @@ class FHeadRequest(_Rex): help = "Request header" flags = re.MULTILINE + @only(HTTPFlow) def __call__(self, f): if f.request and self.re.search(bytes(f.request.headers)): return True @@ -183,6 +224,7 @@ class FHeadResponse(_Rex): help = "Response header" flags = re.MULTILINE + @only(HTTPFlow) def __call__(self, f): if f.response and self.re.search(bytes(f.response.headers)): return True @@ -192,13 +234,19 @@ class FBod(_Rex): code = "b" help = "Body" + @only(HTTPFlow, TCPFlow) def __call__(self, f): - if f.request and f.request.content: - if self.re.search(f.request.get_decoded_content()): - return True - if f.response and f.response.content: - if self.re.search(f.response.get_decoded_content()): - return True + if isinstance(f, HTTPFlow): + if f.request and f.request.raw_content: + if self.re.search(f.request.get_content(strict=False)): + return True + if f.response and f.response.raw_content: + if self.re.search(f.response.get_content(strict=False)): + return True + elif isinstance(f, TCPFlow): + for msg in f.messages: + if self.re.search(msg.content): + return True return False @@ -206,20 +254,32 @@ class FBodRequest(_Rex): code = "bq" help = "Request body" + @only(HTTPFlow, TCPFlow) def __call__(self, f): - if f.request and f.request.content: - if self.re.search(f.request.get_decoded_content()): - return True + if isinstance(f, HTTPFlow): + if f.request and f.request.raw_content: + if self.re.search(f.request.get_content(strict=False)): + return True + elif isinstance(f, TCPFlow): + for msg in f.messages: + if msg.from_client and self.re.search(msg.content): + return True class FBodResponse(_Rex): code = "bs" help = "Response body" + @only(HTTPFlow, TCPFlow) def __call__(self, f): - if f.response and f.response.content: - if self.re.search(f.response.get_decoded_content()): - return True + if isinstance(f, HTTPFlow): + if f.response and f.response.raw_content: + if self.re.search(f.response.get_content(strict=False)): + return True + elif isinstance(f, TCPFlow): + for msg in f.messages: + if not msg.from_client and self.re.search(msg.content): + return True class FMethod(_Rex): @@ -227,6 +287,7 @@ class FMethod(_Rex): help = "Method" flags = re.IGNORECASE + @only(HTTPFlow) def __call__(self, f): return bool(self.re.search(f.request.data.method)) @@ -236,6 +297,7 @@ class FDomain(_Rex): help = "Domain" flags = re.IGNORECASE + @only(HTTPFlow) def __call__(self, f): return bool(self.re.search(f.request.data.host)) @@ -252,6 +314,7 @@ class FUrl(_Rex): toks = toks[1:] return klass(*toks) + @only(HTTPFlow) def __call__(self, f): return self.re.search(f.request.url) @@ -284,6 +347,7 @@ class FCode(_Int): code = "c" help = "HTTP response code" + @only(HTTPFlow) def __call__(self, f): if f.response and f.response.status_code == self.num: return True @@ -331,26 +395,28 @@ class FNot(_Token): filt_unary = [ + FAsset, + FErr, + FHTTP, FReq, FResp, - FAsset, - FErr + FTCP, ] filt_rex = [ - FHeadRequest, - FHeadResponse, - FHead, + FBod, FBodRequest, FBodResponse, - FBod, - FMethod, - FDomain, - FUrl, - FRequestContentType, - FResponseContentType, FContentType, - FSrc, + FContentTypeRequest, + FContentTypeResponse, + FDomain, FDst, + FHead, + FHeadRequest, + FHeadResponse, + FMethod, + FSrc, + FUrl, ] filt_int = [ FCode diff --git a/mitmproxy/flow/__init__.py b/mitmproxy/flow/__init__.py index c14a0fec..b2ab74c6 100644 --- a/mitmproxy/flow/__init__.py +++ b/mitmproxy/flow/__init__.py @@ -4,10 +4,10 @@ from mitmproxy.flow import export, modules from mitmproxy.flow.io import FlowWriter, FilteredFlowWriter, FlowReader, read_flows_from_paths from mitmproxy.flow.master import FlowMaster from mitmproxy.flow.modules import ( - AppRegistry, ReplaceHooks, SetHeaders, StreamLargeBodies, ClientPlaybackState, - ServerPlaybackState, StickyCookieState, StickyAuthState + AppRegistry, StreamLargeBodies, ClientPlaybackState, ServerPlaybackState ) from mitmproxy.flow.state import State, FlowView +from mitmproxy.flow import options # TODO: We may want to remove the imports from .modules and just expose "modules" @@ -15,7 +15,6 @@ __all__ = [ "export", "modules", "FlowWriter", "FilteredFlowWriter", "FlowReader", "read_flows_from_paths", "FlowMaster", - "AppRegistry", "ReplaceHooks", "SetHeaders", "StreamLargeBodies", "ClientPlaybackState", - "ServerPlaybackState", "StickyCookieState", "StickyAuthState", - "State", "FlowView", + "AppRegistry", "StreamLargeBodies", "ClientPlaybackState", + "ServerPlaybackState", "State", "FlowView", "options", ] diff --git a/mitmproxy/flow/export.py b/mitmproxy/flow/export.py index 67401719..deeeb998 100644 --- a/mitmproxy/flow/export.py +++ b/mitmproxy/flow/export.py @@ -30,17 +30,20 @@ def dictstr(items, indent): def curl_command(flow): data = "curl " - for k, v in flow.request.headers.fields: - data += "-H '%s:%s' " % (_native(k), _native(v)) + request = flow.request.copy() + request.decode(strict=False) - if flow.request.method != "GET": - data += "-X %s " % flow.request.method + for k, v in request.headers.items(multi=True): + data += "-H '%s:%s' " % (k, v) - full_url = flow.request.scheme + "://" + flow.request.host + flow.request.path + if request.method != "GET": + data += "-X %s " % request.method + + full_url = request.scheme + "://" + request.host + request.path data += "'%s'" % full_url - if flow.request.content: - data += " --data-binary '%s'" % _native(flow.request.content) + if request.content: + data += " --data-binary '%s'" % _native(request.content) return data diff --git a/mitmproxy/flow/io_compat.py b/mitmproxy/flow/io_compat.py index ec825f71..bcfbd375 100644 --- a/mitmproxy/flow/io_compat.py +++ b/mitmproxy/flow/io_compat.py @@ -8,6 +8,16 @@ import six from netlib import version, strutils +def convert_011_012(data): + data[b"version"] = (0, 12) + return data + + +def convert_012_013(data): + data[b"version"] = (0, 13) + return data + + def convert_013_014(data): data[b"request"][b"first_line_format"] = data[b"request"].pop(b"form_in") data[b"request"][b"http_version"] = b"HTTP/" + ".".join( @@ -97,6 +107,8 @@ def convert_unicode(data): converters = { + (0, 11): convert_011_012, + (0, 12): convert_012_013, (0, 13): convert_013_014, (0, 14): convert_014_015, (0, 15): convert_015_016, diff --git a/mitmproxy/flow/master.py b/mitmproxy/flow/master.py index 520f82e9..088375fe 100644 --- a/mitmproxy/flow/master.py +++ b/mitmproxy/flow/master.py @@ -8,14 +8,11 @@ from typing import List, Optional, Set # noqa import netlib.exceptions from mitmproxy import controller from mitmproxy import exceptions -from mitmproxy import filt from mitmproxy import models -from mitmproxy import script from mitmproxy.flow import io from mitmproxy.flow import modules from mitmproxy.onboarding import app from mitmproxy.protocol import http_replay -from mitmproxy.proxy.config import HostMatcher class FlowMaster(controller.Master): @@ -27,35 +24,20 @@ class FlowMaster(controller.Master): if len(self.servers) > 0: return self.servers[0] - def __init__(self, server, state): - super(FlowMaster, self).__init__() + def __init__(self, options, server, state): + super(FlowMaster, self).__init__(options) if server: self.add_server(server) self.state = state - self.active_flows = set() # type: Set[models.Flow] self.server_playback = None # type: Optional[modules.ServerPlaybackState] self.client_playback = None # type: Optional[modules.ClientPlaybackState] self.kill_nonreplay = False - self.scripts = [] # type: List[script.Script] - self.pause_scripts = False - self.stickycookie_state = None # type: Optional[modules.StickyCookieState] - self.stickycookie_txt = None - - self.stickyauth_state = False # type: Optional[modules.StickyAuthState] - self.stickyauth_txt = None - - self.anticache = False - self.anticomp = False self.stream_large_bodies = None # type: Optional[modules.StreamLargeBodies] - self.refresh_server_playback = False - self.replacehooks = modules.ReplaceHooks() - self.setheaders = modules.SetHeaders() self.replay_ignore_params = False self.replay_ignore_content = None self.replay_ignore_host = False - self.stream = None self.apps = modules.AppRegistry() def start_app(self, host, port): @@ -65,88 +47,12 @@ class FlowMaster(controller.Master): port ) - def add_event(self, e, level="info"): - """ - level: debug, info, error - """ - - def unload_scripts(self): - for s in self.scripts[:]: - self.unload_script(s) - - def unload_script(self, script_obj): - try: - script_obj.unload() - except script.ScriptException as e: - self.add_event("Script error:\n" + str(e), "error") - script.reloader.unwatch(script_obj) - self.scripts.remove(script_obj) - - def load_script(self, command, use_reloader=False): - """ - Loads a script. - - Raises: - ScriptException - """ - s = script.Script(command, script.ScriptContext(self)) - s.load() - if use_reloader: - script.reloader.watch(s, lambda: self.event_queue.put(("script_change", s))) - self.scripts.append(s) - - def _run_single_script_hook(self, script_obj, name, *args, **kwargs): - if script_obj and not self.pause_scripts: - try: - script_obj.run(name, *args, **kwargs) - except script.ScriptException as e: - self.add_event("Script error:\n{}".format(e), "error") - - def run_scripts(self, name, msg): - for script_obj in self.scripts: - if not msg.reply.acked: - self._run_single_script_hook(script_obj, name, msg) - - def get_ignore_filter(self): - return self.server.config.check_ignore.patterns - - def set_ignore_filter(self, host_patterns): - self.server.config.check_ignore = HostMatcher(host_patterns) - - def get_tcp_filter(self): - return self.server.config.check_tcp.patterns - - def set_tcp_filter(self, host_patterns): - self.server.config.check_tcp = HostMatcher(host_patterns) - - def set_stickycookie(self, txt): - if txt: - flt = filt.parse(txt) - if not flt: - return "Invalid filter expression." - self.stickycookie_state = modules.StickyCookieState(flt) - self.stickycookie_txt = txt - else: - self.stickycookie_state = None - self.stickycookie_txt = None - def set_stream_large_bodies(self, max_size): if max_size is not None: self.stream_large_bodies = modules.StreamLargeBodies(max_size) else: self.stream_large_bodies = False - def set_stickyauth(self, txt): - if txt: - flt = filt.parse(txt) - if not flt: - return "Invalid filter expression." - self.stickyauth_state = modules.StickyAuthState(flt) - self.stickyauth_txt = txt - else: - self.stickyauth_state = None - self.stickyauth_txt = None - def start_client_playback(self, flows, exit): """ flows: List of flows. @@ -200,7 +106,7 @@ class FlowMaster(controller.Master): return None response = rflow.response.copy() response.is_replay = True - if self.refresh_server_playback: + if self.options.refresh_server_playback: response.refresh() flow.response = response return True @@ -234,8 +140,12 @@ class FlowMaster(controller.Master): return super(FlowMaster, self).tick(timeout) def duplicate_flow(self, f): + """ + Duplicate flow, and insert it into state without triggering any of + the normal flow events. + """ f2 = f.copy() - self.load_flow(f2) + self.state.add_flow(f2) return f2 def create_request(self, method, scheme, host, port, path): @@ -268,7 +178,7 @@ class FlowMaster(controller.Master): Loads a flow """ if isinstance(f, models.HTTPFlow): - if self.server and self.server.config.mode == "reverse": + if self.server and self.options.mode == "reverse": f.request.host = self.server.config.upstream_server.address.host f.request.port = self.server.config.upstream_server.address.port f.request.scheme = self.server.config.upstream_server.scheme @@ -320,47 +230,36 @@ class FlowMaster(controller.Master): raise exceptions.FlowReadException(v.strerror) def process_new_request(self, f): - if self.stickycookie_state: - self.stickycookie_state.handle_request(f) - if self.stickyauth_state: - self.stickyauth_state.handle_request(f) - - if self.anticache: - f.request.anticache() - if self.anticomp: - f.request.anticomp() - if self.server_playback: pb = self.do_server_playback(f) if not pb and self.kill_nonreplay: f.kill(self) - def process_new_response(self, f): - if self.stickycookie_state: - self.stickycookie_state.handle_response(f) - - def replay_request(self, f, block=False, run_scripthooks=True): + def replay_request(self, f, block=False): """ Returns None if successful, or error message if not. """ - if f.live and run_scripthooks: + if f.live: return "Can't replay live request." if f.intercepted: return "Can't replay while intercepting..." - if f.request.content is None: + if f.request.raw_content is None: return "Can't replay request with missing content..." if f.request: f.backup() f.request.is_replay = True + + # TODO: We should be able to remove this. if "Content-Length" in f.request.headers: - f.request.headers["Content-Length"] = str(len(f.request.content)) + f.request.headers["Content-Length"] = str(len(f.request.raw_content)) + f.response = None f.error = None self.process_new_request(f) rt = http_replay.RequestReplayThread( self.server.config, f, - self.event_queue if run_scripthooks else False, + self.event_queue, self.should_exit ) rt.start() # pragma: no cover @@ -369,32 +268,31 @@ class FlowMaster(controller.Master): @controller.handler def log(self, l): - self.add_event(l.msg, l.level) + self.add_log(l.msg, l.level) @controller.handler def clientconnect(self, root_layer): - self.run_scripts("clientconnect", root_layer) + pass @controller.handler def clientdisconnect(self, root_layer): - self.run_scripts("clientdisconnect", root_layer) + pass @controller.handler def serverconnect(self, server_conn): - self.run_scripts("serverconnect", server_conn) + pass @controller.handler def serverdisconnect(self, server_conn): - self.run_scripts("serverdisconnect", server_conn) + pass @controller.handler def next_layer(self, top_layer): - self.run_scripts("next_layer", top_layer) + pass @controller.handler def error(self, f): self.state.update_flow(f) - self.run_scripts("error", f) if self.client_playback: self.client_playback.clear(f) return f @@ -410,20 +308,13 @@ class FlowMaster(controller.Master): **{"mitmproxy.master": self} ) if err: - self.add_event("Error in wsgi app. %s" % err, "error") + self.add_log("Error in wsgi app. %s" % err, "error") f.reply.kill() return if f not in self.state.flows: # don't add again on replay self.state.add_flow(f) - self.active_flows.add(f) - if not f.reply.acked: - self.replacehooks.run(f) - if not f.reply.acked: - self.setheaders.run(f) if not f.reply.acked: self.process_new_request(f) - if not f.reply.acked: - self.run_scripts("request", f) return f @controller.handler @@ -434,24 +325,14 @@ class FlowMaster(controller.Master): except netlib.exceptions.HttpException: f.reply.kill() return - self.run_scripts("responseheaders", f) return f @controller.handler def response(self, f): - self.active_flows.discard(f) self.state.update_flow(f) if not f.reply.acked: - self.replacehooks.run(f) - if not f.reply.acked: - self.setheaders.run(f) - self.run_scripts("response", f) - if not f.reply.acked: if self.client_playback: self.client_playback.clear(f) - self.process_new_response(f) - if self.stream: - self.stream.add(f) return f def handle_intercept(self, f): @@ -461,84 +342,22 @@ class FlowMaster(controller.Master): self.state.update_flow(f) @controller.handler - def script_change(self, s): - """ - Handle a script whose contents have been changed on the file system. - - Args: - s (script.Script): the changed script - - Returns: - True, if reloading was successful. - False, otherwise. - """ - ok = True - # We deliberately do not want to fail here. - # In the worst case, we have an "empty" script object. - try: - s.unload() - except script.ScriptException as e: - ok = False - self.add_event('Error reloading "{}":\n{}'.format(s.filename, e), 'error') - try: - s.load() - except script.ScriptException as e: - ok = False - self.add_event('Error reloading "{}":\n{}'.format(s.filename, e), 'error') - else: - self.add_event('"{}" reloaded.'.format(s.filename), 'info') - return ok - - @controller.handler def tcp_open(self, flow): # TODO: This would break mitmproxy currently. # self.state.add_flow(flow) - self.active_flows.add(flow) - self.run_scripts("tcp_open", flow) + pass @controller.handler def tcp_message(self, flow): - # type: (TCPFlow) -> None - self.run_scripts("tcp_message", flow) + pass @controller.handler def tcp_error(self, flow): - self.add_event("Error in TCP connection to {}: {}".format( + self.add_log("Error in TCP connection to {}: {}".format( repr(flow.server_conn.address), flow.error ), "info") - self.run_scripts("tcp_error", flow) @controller.handler def tcp_close(self, flow): - self.active_flows.discard(flow) - if self.stream: - self.stream.add(flow) - self.run_scripts("tcp_close", flow) - - def shutdown(self): - super(FlowMaster, self).shutdown() - - # Add all flows that are still active - if self.stream: - for flow in self.active_flows: - self.stream.add(flow) - self.stop_stream() - - self.unload_scripts() - - def start_stream(self, fp, filt): - self.stream = io.FilteredFlowWriter(fp, filt) - - def stop_stream(self): - self.stream.fo.close() - self.stream = None - - def start_stream_to_path(self, path, mode="wb", filt=None): - path = os.path.expanduser(path) - try: - f = open(path, mode) - self.start_stream(f, filt) - except IOError as v: - return str(v) - self.stream_path = path + pass diff --git a/mitmproxy/flow/modules.py b/mitmproxy/flow/modules.py index cba96fbc..fb3c52da 100644 --- a/mitmproxy/flow/modules.py +++ b/mitmproxy/flow/modules.py @@ -1,18 +1,13 @@ from __future__ import absolute_import, print_function, division -import collections import hashlib -import re -from six.moves import http_cookiejar from six.moves import urllib from mitmproxy import controller -from mitmproxy import filt from netlib import wsgi from netlib import version from netlib import strutils -from netlib.http import cookies from netlib.http import http1 @@ -43,112 +38,6 @@ class AppRegistry: return self.apps.get((host, request.port), None) -class ReplaceHooks: - def __init__(self): - self.lst = [] - - def set(self, r): - self.clear() - for i in r: - self.add(*i) - - def add(self, fpatt, rex, s): - """ - add a replacement hook. - - fpatt: a string specifying a filter pattern. - rex: a regular expression. - s: the replacement string - - returns true if hook was added, false if the pattern could not be - parsed. - """ - cpatt = filt.parse(fpatt) - if not cpatt: - return False - try: - re.compile(rex) - except re.error: - return False - self.lst.append((fpatt, rex, s, cpatt)) - return True - - def get_specs(self): - """ - Retrieve the hook specifcations. Returns a list of (fpatt, rex, s) - tuples. - """ - return [i[:3] for i in self.lst] - - def count(self): - return len(self.lst) - - def run(self, f): - for _, rex, s, cpatt in self.lst: - if cpatt(f): - if f.response: - f.response.replace(rex, s) - else: - f.request.replace(rex, s) - - def clear(self): - self.lst = [] - - -class SetHeaders: - def __init__(self): - self.lst = [] - - def set(self, r): - self.clear() - for i in r: - self.add(*i) - - def add(self, fpatt, header, value): - """ - Add a set header hook. - - fpatt: String specifying a filter pattern. - header: Header name. - value: Header value string - - Returns True if hook was added, False if the pattern could not be - parsed. - """ - cpatt = filt.parse(fpatt) - if not cpatt: - return False - self.lst.append((fpatt, header, value, cpatt)) - return True - - def get_specs(self): - """ - Retrieve the hook specifcations. Returns a list of (fpatt, rex, s) - tuples. - """ - return [i[:3] for i in self.lst] - - def count(self): - return len(self.lst) - - def clear(self): - self.lst = [] - - def run(self, f): - for _, header, value, cpatt in self.lst: - if cpatt(f): - if f.response: - f.response.headers.pop(header, None) - else: - f.request.headers.pop(header, None) - for _, header, value, cpatt in self.lst: - if cpatt(f): - if f.response: - f.response.headers.add(header, value) - else: - f.request.headers.add(header, value) - - class StreamLargeBodies(object): def __init__(self, max_size): self.max_size = max_size @@ -158,7 +47,7 @@ class StreamLargeBodies(object): expected_size = http1.expected_http_body_size( flow.request, flow.response if not is_request else None ) - if not r.content and not (0 <= expected_size <= self.max_size): + if not r.raw_content and not (0 <= expected_size <= self.max_size): # r.stream may already be a callable, which we want to preserve. r.stream = r.stream or True @@ -252,7 +141,7 @@ class ServerPlaybackState: if p[0] not in self.ignore_payload_params ) else: - key.append(str(r.content)) + key.append(str(r.raw_content)) if not self.ignore_host: key.append(r.host) @@ -287,73 +176,3 @@ class ServerPlaybackState: return l[0] else: return l.pop(0) - - -class StickyCookieState: - def __init__(self, flt): - """ - flt: Compiled filter. - """ - self.jar = collections.defaultdict(dict) - self.flt = flt - - def ckey(self, attrs, f): - """ - Returns a (domain, port, path) tuple. - """ - domain = f.request.host - path = "/" - if "domain" in attrs: - domain = attrs["domain"] - if "path" in attrs: - path = attrs["path"] - return (domain, f.request.port, path) - - def domain_match(self, a, b): - if http_cookiejar.domain_match(a, b): - return True - elif http_cookiejar.domain_match(a, b.strip(".")): - return True - return False - - def handle_response(self, f): - for name, (value, attrs) in f.response.cookies.items(multi=True): - # FIXME: We now know that Cookie.py screws up some cookies with - # valid RFC 822/1123 datetime specifications for expiry. Sigh. - a = self.ckey(attrs, f) - if self.domain_match(f.request.host, a[0]): - b = attrs.with_insert(0, name, value) - self.jar[a][name] = b - - def handle_request(self, f): - l = [] - if f.match(self.flt): - for domain, port, path in self.jar.keys(): - match = [ - self.domain_match(f.request.host, domain), - f.request.port == port, - f.request.path.startswith(path) - ] - if all(match): - c = self.jar[(domain, port, path)] - l.extend([cookies.format_cookie_header(c[name].items(multi=True)) for name in c.keys()]) - if l: - f.request.stickycookie = True - f.request.headers["cookie"] = "; ".join(l) - - -class StickyAuthState: - def __init__(self, flt): - """ - flt: Compiled filter. - """ - self.flt = flt - self.hosts = {} - - def handle_request(self, f): - host = f.request.host - if "authorization" in f.request.headers: - self.hosts[host] = f.request.headers["authorization"] - elif f.match(self.flt): - if host in self.hosts: - f.request.headers["authorization"] = self.hosts[host] diff --git a/mitmproxy/flow/options.py b/mitmproxy/flow/options.py new file mode 100644 index 00000000..726952e2 --- /dev/null +++ b/mitmproxy/flow/options.py @@ -0,0 +1,124 @@ +from __future__ import absolute_import, print_function, division +from mitmproxy import options +from typing import Tuple, Optional, Sequence # noqa +from mitmproxy import cmdline + +APP_HOST = "mitm.it" +APP_PORT = 80 + + +class Options(options.Options): + def __init__( + self, + # TODO: rename to onboarding_app_* + app=True, # type: bool + app_host=APP_HOST, # type: str + app_port=APP_PORT, # type: int + anticache=False, # type: bool + anticomp=False, # type: bool + client_replay=None, # type: Optional[str] + kill=False, # type: bool + no_server=False, # type: bool + nopop=False, # type: bool + refresh_server_playback=False, # type: bool + rfile=None, # type: Optional[str] + scripts=(), # type: Sequence[str] + showhost=False, # type: bool + replacements=(), # type: Sequence[Tuple[str, str, str]] + rheaders=(), # type: Sequence[str] + setheaders=(), # type: Sequence[Tuple[str, str, str]] + server_replay=None, # type: Optional[str] + stickycookie=None, # type: Optional[str] + stickyauth=None, # type: Optional[str] + stream_large_bodies=None, # type: Optional[str] + verbosity=2, # type: int + outfile=None, # type: Tuple[str, str] + replay_ignore_content=False, # type: bool + replay_ignore_params=(), # type: Sequence[str] + replay_ignore_payload_params=(), # type: Sequence[str] + replay_ignore_host=False, # type: bool + + # Proxy options + auth_nonanonymous=False, # type: bool + auth_singleuser=None, # type: Optional[str] + auth_htpasswd=None, # type: Optional[str] + add_upstream_certs_to_client_chain=False, # type: bool + body_size_limit=None, # type: Optional[int] + cadir = cmdline.CA_DIR, # type: str + certs = (), # type: Sequence[Tuple[str, str]] + ciphers_client = cmdline.DEFAULT_CLIENT_CIPHERS, # type: str + ciphers_server = None, # type: Optional[str] + clientcerts = None, # type: Optional[str] + http2 = True, # type: bool + ignore_hosts = (), # type: Sequence[str] + listen_host = "", # type: str + listen_port = 8080, # type: int + mode = "regular", # type: str + no_upstream_cert = False, # type: bool + rawtcp = False, # type: bool + upstream_server = "", # type: str + upstream_auth = "", # type: str + ssl_version_client="secure", # type: str + ssl_version_server="secure", # type: str + ssl_verify_upstream_cert=False, # type: bool + ssl_verify_upstream_trusted_cadir=None, # type: str + ssl_verify_upstream_trusted_ca=None, # type: str + tcp_hosts = (), # type: Sequence[str] + ): + # We could replace all assignments with clever metaprogramming, + # but type hints are a much more valueable asset. + + self.app = app + self.app_host = app_host + self.app_port = app_port + self.anticache = anticache + self.anticomp = anticomp + self.client_replay = client_replay + self.kill = kill + self.no_server = no_server + self.nopop = nopop + self.refresh_server_playback = refresh_server_playback + self.rfile = rfile + self.scripts = scripts + self.showhost = showhost + self.replacements = replacements + self.rheaders = rheaders + self.setheaders = setheaders + self.server_replay = server_replay + self.stickycookie = stickycookie + self.stickyauth = stickyauth + self.stream_large_bodies = stream_large_bodies + self.verbosity = verbosity + self.outfile = outfile + self.replay_ignore_content = replay_ignore_content + self.replay_ignore_params = replay_ignore_params + self.replay_ignore_payload_params = replay_ignore_payload_params + self.replay_ignore_host = replay_ignore_host + + # Proxy options + self.auth_nonanonymous = auth_nonanonymous + self.auth_singleuser = auth_singleuser + self.auth_htpasswd = auth_htpasswd + self.add_upstream_certs_to_client_chain = add_upstream_certs_to_client_chain + self.body_size_limit = body_size_limit + self.cadir = cadir + self.certs = certs + self.ciphers_client = ciphers_client + self.ciphers_server = ciphers_server + self.clientcerts = clientcerts + self.http2 = http2 + self.ignore_hosts = ignore_hosts + self.listen_host = listen_host + self.listen_port = listen_port + self.mode = mode + self.no_upstream_cert = no_upstream_cert + self.rawtcp = rawtcp + self.upstream_server = upstream_server + self.upstream_auth = upstream_auth + self.ssl_version_client = ssl_version_client + self.ssl_version_server = ssl_version_server + self.ssl_verify_upstream_cert = ssl_verify_upstream_cert + self.ssl_verify_upstream_trusted_cadir = ssl_verify_upstream_trusted_cadir + self.ssl_verify_upstream_trusted_ca = ssl_verify_upstream_trusted_ca + self.tcp_hosts = tcp_hosts + super(Options, self).__init__() diff --git a/mitmproxy/main.py b/mitmproxy/main.py index bf01a3cb..2d7299e4 100644 --- a/mitmproxy/main.py +++ b/mitmproxy/main.py @@ -41,14 +41,14 @@ def get_server(dummy_server, options): sys.exit(1) -def process_options(parser, options): - if options.sysinfo: +def process_options(parser, options, args): + if args.sysinfo: print(debug.sysinfo()) sys.exit(0) - if options.quiet: - options.verbose = 0 + if args.quiet: + args.verbose = 0 debug.register_info_dumpers() - return config.process_proxy_options(parser, options) + return config.ProxyConfig(options) def mitmproxy(args=None): # pragma: no cover @@ -62,21 +62,26 @@ def mitmproxy(args=None): # pragma: no cover assert_utf8_env() parser = cmdline.mitmproxy() - options = parser.parse_args(args) - proxy_config = process_options(parser, options) + args = parser.parse_args(args) - console_options = console.master.Options(**cmdline.get_common_options(options)) - console_options.palette = options.palette - console_options.palette_transparent = options.palette_transparent - console_options.eventlog = options.eventlog - console_options.follow = options.follow - console_options.intercept = options.intercept - console_options.limit = options.limit - console_options.no_mouse = options.no_mouse - - server = get_server(console_options.no_server, proxy_config) - - m = console.master.ConsoleMaster(server, console_options) + try: + console_options = console.master.Options( + **cmdline.get_common_options(args) + ) + console_options.palette = args.palette + console_options.palette_transparent = args.palette_transparent + console_options.eventlog = args.eventlog + console_options.follow = args.follow + console_options.intercept = args.intercept + console_options.limit = args.limit + console_options.no_mouse = args.no_mouse + + proxy_config = process_options(parser, console_options, args) + server = get_server(console_options.no_server, proxy_config) + m = console.master.ConsoleMaster(server, console_options) + except exceptions.OptionsError as e: + print("mitmproxy: %s" % e, file=sys.stderr) + sys.exit(1) try: m.run() except (KeyboardInterrupt, _thread.error): @@ -89,19 +94,17 @@ def mitmdump(args=None): # pragma: no cover version_check.check_pyopenssl_version() parser = cmdline.mitmdump() - options = parser.parse_args(args) - proxy_config = process_options(parser, options) - if options.quiet: - options.flow_detail = 0 - - dump_options = dump.Options(**cmdline.get_common_options(options)) - dump_options.flow_detail = options.flow_detail - dump_options.keepserving = options.keepserving - dump_options.filtstr = " ".join(options.args) if options.args else None - - server = get_server(dump_options.no_server, proxy_config) + args = parser.parse_args(args) + if args.quiet: + args.flow_detail = 0 try: + dump_options = dump.Options(**cmdline.get_common_options(args)) + dump_options.flow_detail = args.flow_detail + dump_options.keepserving = args.keepserving + dump_options.filtstr = " ".join(args.args) if args.args else None + proxy_config = process_options(parser, dump_options, args) + server = get_server(dump_options.no_server, proxy_config) master = dump.DumpMaster(server, dump_options) def cleankill(*args, **kwargs): @@ -109,11 +112,14 @@ def mitmdump(args=None): # pragma: no cover signal.signal(signal.SIGTERM, cleankill) master.run() - except dump.DumpError as e: + except (dump.DumpError, exceptions.OptionsError) as e: print("mitmdump: %s" % e, file=sys.stderr) sys.exit(1) except (KeyboardInterrupt, _thread.error): pass + if master.has_errored: + print("mitmdump: errors occurred during run", file=sys.stderr) + sys.exit(1) def mitmweb(args=None): # pragma: no cover @@ -123,21 +129,24 @@ def mitmweb(args=None): # pragma: no cover parser = cmdline.mitmweb() - options = parser.parse_args(args) - proxy_config = process_options(parser, options) - - web_options = web.master.Options(**cmdline.get_common_options(options)) - web_options.intercept = options.intercept - web_options.wdebug = options.wdebug - web_options.wiface = options.wiface - web_options.wport = options.wport - web_options.wsingleuser = options.wsingleuser - web_options.whtpasswd = options.whtpasswd - web_options.process_web_options(parser) + args = parser.parse_args(args) - server = get_server(web_options.no_server, proxy_config) - - m = web.master.WebMaster(server, web_options) + try: + web_options = web.master.Options(**cmdline.get_common_options(args)) + web_options.intercept = args.intercept + web_options.wdebug = args.wdebug + web_options.wiface = args.wiface + web_options.wport = args.wport + web_options.wsingleuser = args.wsingleuser + web_options.whtpasswd = args.whtpasswd + web_options.process_web_options(parser) + + proxy_config = process_options(parser, web_options, args) + server = get_server(web_options.no_server, proxy_config) + m = web.master.WebMaster(server, web_options) + except exceptions.OptionsError as e: + print("mitmweb: %s" % e, file=sys.stderr) + sys.exit(1) try: m.run() except (KeyboardInterrupt, _thread.error): diff --git a/mitmproxy/models/http.py b/mitmproxy/models/http.py index 8aeb84d6..1fd28f00 100644 --- a/mitmproxy/models/http.py +++ b/mitmproxy/models/http.py @@ -1,9 +1,10 @@ from __future__ import absolute_import, print_function, division import cgi +import warnings +import six from mitmproxy.models.flow import Flow -from netlib import encoding from netlib import version from netlib.http import Headers from netlib.http import Request @@ -20,10 +21,8 @@ class MessageMixin(object): header. Doesn't change the message iteself or its headers. """ - ce = self.headers.get("content-encoding") - if not self.content or ce not in encoding.ENCODINGS: - return self.content - return encoding.decode(ce, self.content) + warnings.warn(".get_decoded_content() is deprecated, please use .content directly instead.", DeprecationWarning) + return self.content class HTTPRequest(MessageMixin, Request): @@ -220,7 +219,7 @@ class HTTPFlow(Flow): If f is a string, it will be compiled as a filter expression. If the expression is invalid, ValueError is raised. """ - if isinstance(f, str): + if isinstance(f, six.string_types): from .. import filt f = filt.parse(f) diff --git a/mitmproxy/models/tcp.py b/mitmproxy/models/tcp.py index e33475c2..6650141d 100644 --- a/mitmproxy/models/tcp.py +++ b/mitmproxy/models/tcp.py @@ -7,6 +7,8 @@ from typing import List import netlib.basetypes from mitmproxy.models.flow import Flow +import six + class TCPMessage(netlib.basetypes.Serializable): @@ -53,3 +55,22 @@ class TCPFlow(Flow): def __repr__(self): return "<TCPFlow ({} messages)>".format(len(self.messages)) + + def match(self, f): + """ + Match this flow against a compiled filter expression. Returns True + if matched, False if not. + + If f is a string, it will be compiled as a filter expression. If + the expression is invalid, ValueError is raised. + """ + if isinstance(f, six.string_types): + from .. import filt + + f = filt.parse(f) + if not f: + raise ValueError("Invalid filter expression.") + if f: + return f(self) + + return True diff --git a/mitmproxy/onboarding/app.py b/mitmproxy/onboarding/app.py index f93b9982..e26efae8 100644 --- a/mitmproxy/onboarding/app.py +++ b/mitmproxy/onboarding/app.py @@ -47,7 +47,7 @@ class PEM(tornado.web.RequestHandler): return config.CONF_BASENAME + "-ca-cert.pem" def get(self): - p = os.path.join(self.request.master.server.config.cadir, self.filename) + p = os.path.join(self.request.master.options.cadir, self.filename) self.set_header("Content-Type", "application/x-x509-ca-cert") self.set_header( "Content-Disposition", @@ -65,7 +65,7 @@ class P12(tornado.web.RequestHandler): return config.CONF_BASENAME + "-ca-cert.p12" def get(self): - p = os.path.join(self.request.master.server.config.cadir, self.filename) + p = os.path.join(self.request.master.options.cadir, self.filename) self.set_header("Content-Type", "application/x-pkcs12") self.set_header( "Content-Disposition", diff --git a/mitmproxy/options.py b/mitmproxy/options.py new file mode 100644 index 00000000..94e5d573 --- /dev/null +++ b/mitmproxy/options.py @@ -0,0 +1,104 @@ +from __future__ import absolute_import, print_function, division + +import contextlib +import blinker +import pprint + +from mitmproxy import exceptions + + +class Options(object): + """ + .changed is a blinker Signal that triggers whenever options are + updated. If any handler in the chain raises an exceptions.OptionsError + exception, all changes are rolled back, the exception is suppressed, + and the .errored signal is notified. + """ + _initialized = False + attributes = [] + + def __new__(cls, *args, **kwargs): + # Initialize instance._opts before __init__ is called. + # This allows us to call super().__init__() last, which then sets + # ._initialized = True as the final operation. + instance = super(Options, cls).__new__(cls) + instance.__dict__["_opts"] = {} + return instance + + def __init__(self): + self.__dict__["changed"] = blinker.Signal() + self.__dict__["errored"] = blinker.Signal() + self.__dict__["_initialized"] = True + + @contextlib.contextmanager + def rollback(self): + old = self._opts.copy() + try: + yield + except exceptions.OptionsError as e: + # Notify error handlers + self.errored.send(self, exc=e) + # Rollback + self.__dict__["_opts"] = old + self.changed.send(self) + + def __eq__(self, other): + return self._opts == other._opts + + def __copy__(self): + return self.__class__(**self._opts) + + def __getattr__(self, attr): + if attr in self._opts: + return self._opts[attr] + else: + raise AttributeError("No such option: %s" % attr) + + def __setattr__(self, attr, value): + if not self._initialized: + self._opts[attr] = value + return + if attr not in self._opts: + raise KeyError("No such option: %s" % attr) + with self.rollback(): + self._opts[attr] = value + self.changed.send(self) + + def get(self, k, d=None): + return self._opts.get(k, d) + + def update(self, **kwargs): + for k in kwargs: + if k not in self._opts: + raise KeyError("No such option: %s" % k) + with self.rollback(): + self._opts.update(kwargs) + self.changed.send(self) + + def setter(self, attr): + """ + Generate a setter for a given attribute. This returns a callable + taking a single argument. + """ + if attr not in self._opts: + raise KeyError("No such option: %s" % attr) + return lambda x: self.__setattr__(attr, x) + + def toggler(self, attr): + """ + Generate a toggler for a boolean attribute. This returns a callable + that takes no arguments. + """ + if attr not in self._opts: + raise KeyError("No such option: %s" % attr) + return lambda: self.__setattr__(attr, not getattr(self, attr)) + + def __repr__(self): + options = pprint.pformat(self._opts, indent=4).strip(" {}") + if "\n" in options: + options = "\n " + options + "\n" + return "{mod}.{cls}({{{options}}})".format( + mod=type(self).__module__, + cls=type(self).__name__, + options=options + ) diff --git a/mitmproxy/platform/osx.py b/mitmproxy/platform/osx.py index b5dce793..6a555f32 100644 --- a/mitmproxy/platform/osx.py +++ b/mitmproxy/platform/osx.py @@ -23,12 +23,12 @@ class Resolver(object): try: stxt = subprocess.check_output(self.STATECMD, stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: - if "sudo: a password is required" in e.output: + if "sudo: a password is required" in e.output.decode(errors="replace"): insufficient_priv = True else: raise RuntimeError("Error getting pfctl state: " + repr(e)) else: - insufficient_priv = "sudo: a password is required" in stxt + insufficient_priv = "sudo: a password is required" in stxt.decode(errors="replace") if insufficient_priv: raise RuntimeError( diff --git a/mitmproxy/protocol/base.py b/mitmproxy/protocol/base.py index 11773385..bf0cbbae 100644 --- a/mitmproxy/protocol/base.py +++ b/mitmproxy/protocol/base.py @@ -114,7 +114,7 @@ class ServerConnectionMixin(object): def __init__(self, server_address=None): super(ServerConnectionMixin, self).__init__() - self.server_conn = models.ServerConnection(server_address, (self.config.host, 0)) + self.server_conn = models.ServerConnection(server_address, (self.config.options.listen_host, 0)) self.__check_self_connect() def __check_self_connect(self): @@ -125,7 +125,7 @@ class ServerConnectionMixin(object): address = self.server_conn.address if address: self_connect = ( - address.port == self.config.port and + address.port == self.config.options.listen_port and address.host in ("localhost", "127.0.0.1", "::1") ) if self_connect: diff --git a/mitmproxy/protocol/http.py b/mitmproxy/protocol/http.py index 187c17f6..2c70f288 100644 --- a/mitmproxy/protocol/http.py +++ b/mitmproxy/protocol/http.py @@ -41,10 +41,10 @@ class _HttpTransmissionLayer(base.Layer): yield "this is a generator" # pragma: no cover def send_response(self, response): - if response.content is None: + if response.data.content is None: raise netlib.exceptions.HttpException("Cannot assemble flow with missing content") self.send_response_headers(response) - self.send_response_body(response, [response.content]) + self.send_response_body(response, [response.data.content]) def send_response_headers(self, response): raise NotImplementedError() diff --git a/mitmproxy/protocol/http1.py b/mitmproxy/protocol/http1.py index 7055a7fd..8698fe31 100644 --- a/mitmproxy/protocol/http1.py +++ b/mitmproxy/protocol/http1.py @@ -12,12 +12,18 @@ class Http1Layer(http._HttpTransmissionLayer): self.mode = mode def read_request(self): - req = http1.read_request(self.client_conn.rfile, body_size_limit=self.config.body_size_limit) + req = http1.read_request( + self.client_conn.rfile, body_size_limit=self.config.options.body_size_limit + ) return models.HTTPRequest.wrap(req) def read_request_body(self, request): expected_size = http1.expected_http_body_size(request) - return http1.read_body(self.client_conn.rfile, expected_size, self.config.body_size_limit) + return http1.read_body( + self.client_conn.rfile, + expected_size, + self.config.options.body_size_limit + ) def send_request(self, request): self.server_conn.wfile.write(http1.assemble_request(request)) @@ -29,7 +35,11 @@ class Http1Layer(http._HttpTransmissionLayer): def read_response_body(self, request, response): expected_size = http1.expected_http_body_size(request, response) - return http1.read_body(self.server_conn.rfile, expected_size, self.config.body_size_limit) + return http1.read_body( + self.server_conn.rfile, + expected_size, + self.config.options.body_size_limit + ) def send_response_headers(self, response): raw = http1.assemble_response_head(response) diff --git a/mitmproxy/protocol/http2.py b/mitmproxy/protocol/http2.py index 83ff71e4..1285e10e 100644 --- a/mitmproxy/protocol/http2.py +++ b/mitmproxy/protocol/http2.py @@ -78,7 +78,7 @@ class SafeH2Connection(connection.H2Connection): self.send_data(stream_id, frame_chunk) try: self.conn.send(self.data_to_send()) - except Exception as e: + except Exception as e: # pragma: no cover raise e finally: self.lock.release() @@ -130,6 +130,7 @@ class Http2Layer(base.Layer): [repr(event)] ) + eid = None if hasattr(event, 'stream_id'): if is_server and event.stream_id % 2 == 1: eid = self.server_to_client_stream_ids[event.stream_id] @@ -137,112 +138,171 @@ class Http2Layer(base.Layer): eid = event.stream_id if isinstance(event, events.RequestReceived): - headers = netlib.http.Headers([[k, v] for k, v in event.headers]) - self.streams[eid] = Http2SingleStreamLayer(self, eid, headers) - self.streams[eid].timestamp_start = time.time() - self.streams[eid].no_body = (event.stream_ended is not None) - if event.priority_updated is not None: - self.streams[eid].priority_weight = event.priority_updated.weight - self.streams[eid].priority_depends_on = event.priority_updated.depends_on - self.streams[eid].priority_exclusive = event.priority_updated.exclusive - self.streams[eid].handled_priority_event = event.priority_updated - self.streams[eid].start() + return self._handle_request_received(eid, event) elif isinstance(event, events.ResponseReceived): - headers = netlib.http.Headers([[k, v] for k, v in event.headers]) - self.streams[eid].queued_data_length = 0 - self.streams[eid].timestamp_start = time.time() - self.streams[eid].response_headers = headers - self.streams[eid].response_arrived.set() + return self._handle_response_received(eid, event) elif isinstance(event, events.DataReceived): - if self.config.body_size_limit and self.streams[eid].queued_data_length > self.config.body_size_limit: - raise netlib.exceptions.HttpException("HTTP body too large. Limit is {}.".format(self.config.body_size_limit)) - self.streams[eid].data_queue.put(event.data) - self.streams[eid].queued_data_length += len(event.data) - source_conn.h2.safe_increment_flow_control(event.stream_id, event.flow_controlled_length) + return self._handle_data_received(eid, event, source_conn) elif isinstance(event, events.StreamEnded): - self.streams[eid].timestamp_end = time.time() - self.streams[eid].data_finished.set() + return self._handle_stream_ended(eid) elif isinstance(event, events.StreamReset): - self.streams[eid].zombie = time.time() - if eid in self.streams and event.error_code == 0x8: - if is_server: - other_stream_id = self.streams[eid].client_stream_id - else: - other_stream_id = self.streams[eid].server_stream_id - if other_stream_id is not None: - other_conn.h2.safe_reset_stream(other_stream_id, event.error_code) + return self._handle_stream_reset(eid, event, is_server, other_conn) elif isinstance(event, events.RemoteSettingsChanged): - new_settings = dict([(id, cs.new_value) for (id, cs) in six.iteritems(event.changed_settings)]) - other_conn.h2.safe_update_settings(new_settings) + return self._handle_remote_settings_changed(event, other_conn) elif isinstance(event, events.ConnectionTerminated): - if event.error_code == h2.errors.NO_ERROR: - # Do not immediately terminate the other connection. - # Some streams might be still sending data to the client. - return False - else: - # Something terrible has happened - kill everything! - self.client_conn.h2.close_connection( - error_code=event.error_code, - last_stream_id=event.last_stream_id, - additional_data=event.additional_data - ) - self.client_conn.send(self.client_conn.h2.data_to_send()) - self._kill_all_streams() - return False + return self._handle_connection_terminated(event) elif isinstance(event, events.PushedStreamReceived): - # pushed stream ids should be unique and not dependent on race conditions - # only the parent stream id must be looked up first - parent_eid = self.server_to_client_stream_ids[event.parent_stream_id] - with self.client_conn.h2.lock: - self.client_conn.h2.push_stream(parent_eid, event.pushed_stream_id, event.headers) - self.client_conn.send(self.client_conn.h2.data_to_send()) - - headers = netlib.http.Headers([[k, v] for k, v in event.headers]) - self.streams[event.pushed_stream_id] = Http2SingleStreamLayer(self, event.pushed_stream_id, headers) - self.streams[event.pushed_stream_id].timestamp_start = time.time() - self.streams[event.pushed_stream_id].pushed = True - self.streams[event.pushed_stream_id].parent_stream_id = parent_eid - self.streams[event.pushed_stream_id].timestamp_end = time.time() - self.streams[event.pushed_stream_id].request_data_finished.set() - self.streams[event.pushed_stream_id].start() + return self._handle_pushed_stream_received(event) elif isinstance(event, events.PriorityUpdated): - if eid in self.streams: - if self.streams[eid].handled_priority_event is event: - # This event was already handled during stream creation - # HeadersFrame + Priority information as RequestReceived - return True - if eid in self.streams: - self.streams[eid].priority_weight = event.weight - self.streams[eid].priority_depends_on = event.depends_on - self.streams[eid].priority_exclusive = event.exclusive - - stream_id = event.stream_id - if stream_id in self.streams.keys() and self.streams[stream_id].server_stream_id: - stream_id = self.streams[stream_id].server_stream_id - - depends_on = event.depends_on - if depends_on in self.streams.keys() and self.streams[depends_on].server_stream_id: - depends_on = self.streams[depends_on].server_stream_id - - with self.server_conn.h2.lock: - self.server_conn.h2.prioritize( - stream_id, - weight=event.weight, - depends_on=depends_on, - exclusive=event.exclusive - ) - self.server_conn.send(self.server_conn.h2.data_to_send()) + return self._handle_priority_updated(eid, event) elif isinstance(event, events.TrailersReceived): - raise NotImplementedError() + raise NotImplementedError('TrailersReceived not implemented') + + # fail-safe for unhandled events + return True + + def _handle_request_received(self, eid, event): + headers = netlib.http.Headers([[k, v] for k, v in event.headers]) + self.streams[eid] = Http2SingleStreamLayer(self, eid, headers) + self.streams[eid].timestamp_start = time.time() + self.streams[eid].no_body = (event.stream_ended is not None) + if event.priority_updated is not None: + self.streams[eid].priority_exclusive = event.priority_updated.exclusive + self.streams[eid].priority_depends_on = event.priority_updated.depends_on + self.streams[eid].priority_weight = event.priority_updated.weight + self.streams[eid].handled_priority_event = event.priority_updated + self.streams[eid].start() + return True + + def _handle_response_received(self, eid, event): + headers = netlib.http.Headers([[k, v] for k, v in event.headers]) + self.streams[eid].queued_data_length = 0 + self.streams[eid].timestamp_start = time.time() + self.streams[eid].response_headers = headers + self.streams[eid].response_arrived.set() + return True + + def _handle_data_received(self, eid, event, source_conn): + bsl = self.config.options.body_size_limit + if bsl and self.streams[eid].queued_data_length > bsl: + self.streams[eid].zombie = time.time() + source_conn.h2.safe_reset_stream( + event.stream_id, + h2.errors.REFUSED_STREAM + ) + self.log("HTTP body too large. Limit is {}.".format(bsl), "info") + else: + self.streams[eid].data_queue.put(event.data) + self.streams[eid].queued_data_length += len(event.data) + source_conn.h2.safe_increment_flow_control( + event.stream_id, + event.flow_controlled_length + ) + return True + + def _handle_stream_ended(self, eid): + self.streams[eid].timestamp_end = time.time() + self.streams[eid].data_finished.set() + return True + + def _handle_stream_reset(self, eid, event, is_server, other_conn): + self.streams[eid].zombie = time.time() + if eid in self.streams and event.error_code == h2.errors.CANCEL: + if is_server: + other_stream_id = self.streams[eid].client_stream_id + else: + other_stream_id = self.streams[eid].server_stream_id + if other_stream_id is not None: + other_conn.h2.safe_reset_stream(other_stream_id, event.error_code) + return True + + def _handle_remote_settings_changed(self, event, other_conn): + new_settings = dict([(key, cs.new_value) for (key, cs) in six.iteritems(event.changed_settings)]) + other_conn.h2.safe_update_settings(new_settings) + return True + + def _handle_connection_terminated(self, event): + if event.error_code != h2.errors.NO_ERROR: + # Something terrible has happened - kill everything! + self.client_conn.h2.close_connection( + error_code=event.error_code, + last_stream_id=event.last_stream_id, + additional_data=event.additional_data + ) + self.client_conn.send(self.client_conn.h2.data_to_send()) + self._kill_all_streams() + else: + """ + Do not immediately terminate the other connection. + Some streams might be still sending data to the client. + """ + return False + + def _handle_pushed_stream_received(self, event): + # pushed stream ids should be unique and not dependent on race conditions + # only the parent stream id must be looked up first + parent_eid = self.server_to_client_stream_ids[event.parent_stream_id] + with self.client_conn.h2.lock: + self.client_conn.h2.push_stream(parent_eid, event.pushed_stream_id, event.headers) + self.client_conn.send(self.client_conn.h2.data_to_send()) + + headers = netlib.http.Headers([[k, v] for k, v in event.headers]) + self.streams[event.pushed_stream_id] = Http2SingleStreamLayer(self, event.pushed_stream_id, headers) + self.streams[event.pushed_stream_id].timestamp_start = time.time() + self.streams[event.pushed_stream_id].pushed = True + self.streams[event.pushed_stream_id].parent_stream_id = parent_eid + self.streams[event.pushed_stream_id].timestamp_end = time.time() + self.streams[event.pushed_stream_id].request_data_finished.set() + self.streams[event.pushed_stream_id].start() + return True + + def _handle_priority_updated(self, eid, event): + if eid in self.streams and self.streams[eid].handled_priority_event is event: + # this event was already handled during stream creation + # HeadersFrame + Priority information as RequestReceived + return True + with self.server_conn.h2.lock: + mapped_stream_id = event.stream_id + if mapped_stream_id in self.streams and self.streams[mapped_stream_id].server_stream_id: + # if the stream is already up and running and was sent to the server + # use the mapped server stream id to update priority information + mapped_stream_id = self.streams[mapped_stream_id].server_stream_id + + if eid in self.streams: + self.streams[eid].priority_exclusive = event.exclusive + self.streams[eid].priority_depends_on = event.depends_on + self.streams[eid].priority_weight = event.weight + + self.server_conn.h2.prioritize( + mapped_stream_id, + weight=event.weight, + depends_on=self._map_depends_on_stream_id(mapped_stream_id, event.depends_on), + exclusive=event.exclusive + ) + self.server_conn.send(self.server_conn.h2.data_to_send()) return True + def _map_depends_on_stream_id(self, stream_id, depends_on): + mapped_depends_on = depends_on + if mapped_depends_on in self.streams and self.streams[mapped_depends_on].server_stream_id: + # if the depends-on-stream is already up and running and was sent to the server + # use the mapped server stream id to update priority information + mapped_depends_on = self.streams[mapped_depends_on].server_stream_id + if stream_id == mapped_depends_on: + # looks like one of the streams wasn't opened yet + # prevent self-dependent streams which result in ProtocolError + mapped_depends_on += 2 + return mapped_depends_on + def _cleanup_streams(self): death_time = time.time() - 10 - for stream_id in self.streams.keys(): - zombie = self.streams[stream_id].zombie - if zombie and zombie <= death_time: - self.streams.pop(stream_id, None) + + zombie_streams = [(stream_id, stream) for stream_id, stream in list(self.streams.items()) if stream.zombie] + outdated_streams = [stream_id for stream_id, stream in zombie_streams if stream.zombie <= death_time] + + for stream_id in outdated_streams: # pragma: no cover + self.streams.pop(stream_id, None) def _kill_all_streams(self): for stream in self.streams.values(): @@ -287,7 +347,7 @@ class Http2Layer(base.Layer): return self._cleanup_streams() - except Exception as e: + except Exception as e: # pragma: no cover self.log(repr(e), "info") self.log(traceback.format_exc(), "debug") self._kill_all_streams() @@ -317,11 +377,20 @@ class Http2SingleStreamLayer(http._HttpTransmissionLayer, basethread.BaseThread) self.no_body = False - self.priority_weight = None - self.priority_depends_on = None self.priority_exclusive = None + self.priority_depends_on = None + self.priority_weight = None self.handled_priority_event = None + def check_close_connection(self, flow): + # This layer only handles a single stream. + # RFC 7540 8.1: An HTTP request/response exchange fully consumes a single stream. + return True + + def set_server(self, *args, **kwargs): # pragma: no cover + # do not mess with the server connection - all streams share it. + pass + @property def data_queue(self): if self.response_arrived.is_set(): @@ -412,8 +481,16 @@ class Http2SingleStreamLayer(http._HttpTransmissionLayer, basethread.BaseThread) headers.insert(0, ":path", message.path) headers.insert(0, ":method", message.method) headers.insert(0, ":scheme", message.scheme) - self.server_stream_id = self.server_conn.h2.get_next_available_stream_id() - self.server_to_client_stream_ids[self.server_stream_id] = self.client_stream_id + + priority_exclusive = None + priority_depends_on = None + priority_weight = None + if self.handled_priority_event: + # only send priority information if they actually came with the original HeadersFrame + # and not if they got updated before/after with a PriorityFrame + priority_exclusive = self.priority_exclusive + priority_depends_on = self._map_depends_on_stream_id(self.server_stream_id, self.priority_depends_on) + priority_weight = self.priority_weight try: self.server_conn.h2.safe_send_headers( @@ -421,11 +498,11 @@ class Http2SingleStreamLayer(http._HttpTransmissionLayer, basethread.BaseThread) self.server_stream_id, headers, end_stream=self.no_body, - priority_weight=self.priority_weight, - priority_depends_on=self.priority_depends_on, - priority_exclusive=self.priority_exclusive, + priority_exclusive=priority_exclusive, + priority_depends_on=priority_depends_on, + priority_weight=priority_weight, ) - except Exception as e: + except Exception as e: # pragma: no cover raise e finally: self.server_conn.h2.lock.release() @@ -464,7 +541,7 @@ class Http2SingleStreamLayer(http._HttpTransmissionLayer, basethread.BaseThread) while True: try: yield self.response_data_queue.get(timeout=1) - except queue.Empty: + except queue.Empty: # pragma: no cover pass if self.response_data_finished.is_set(): if self.zombie: # pragma: no cover @@ -499,24 +576,12 @@ class Http2SingleStreamLayer(http._HttpTransmissionLayer, basethread.BaseThread) if self.zombie: # pragma: no cover raise exceptions.Http2ProtocolException("Zombie Stream") - def check_close_connection(self, flow): - # This layer only handles a single stream. - # RFC 7540 8.1: An HTTP request/response exchange fully consumes a single stream. - return True - - def set_server(self, *args, **kwargs): # pragma: no cover - # do not mess with the server connection - all streams share it. - pass - def run(self): - self() - - def __call__(self): layer = http.HttpLayer(self, self.mode) try: layer() - except exceptions.ProtocolException as e: + except exceptions.ProtocolException as e: # pragma: no cover self.log(repr(e), "info") self.log(traceback.format_exc(), "debug") diff --git a/mitmproxy/protocol/http_replay.py b/mitmproxy/protocol/http_replay.py index 986de845..bfde06c5 100644 --- a/mitmproxy/protocol/http_replay.py +++ b/mitmproxy/protocol/http_replay.py @@ -44,9 +44,9 @@ class RequestReplayThread(basethread.BaseThread): if not self.flow.response: # In all modes, we directly connect to the server displayed - if self.config.mode == "upstream": + if self.config.options.mode == "upstream": server_address = self.config.upstream_server.address - server = models.ServerConnection(server_address, (self.config.host, 0)) + server = models.ServerConnection(server_address, (self.config.options.listen_host, 0)) server.connect() if r.scheme == "https": connect_request = models.make_connect_request((r.data.host, r.port)) @@ -55,7 +55,7 @@ class RequestReplayThread(basethread.BaseThread): resp = http1.read_response( server.rfile, connect_request, - body_size_limit=self.config.body_size_limit + body_size_limit=self.config.options.body_size_limit ) if resp.status_code != 200: raise exceptions.ReplayException("Upstream server refuses CONNECT request") @@ -68,7 +68,7 @@ class RequestReplayThread(basethread.BaseThread): r.first_line_format = "absolute" else: server_address = (r.host, r.port) - server = models.ServerConnection(server_address, (self.config.host, 0)) + server = models.ServerConnection(server_address, (self.config.options.listen_host, 0)) server.connect() if r.scheme == "https": server.establish_ssl( @@ -83,7 +83,7 @@ class RequestReplayThread(basethread.BaseThread): self.flow.response = models.HTTPResponse.wrap(http1.read_response( server.rfile, r, - body_size_limit=self.config.body_size_limit + body_size_limit=self.config.options.body_size_limit )) if self.channel: response_reply = self.channel.ask("response", self.flow) diff --git a/mitmproxy/protocol/tls.py b/mitmproxy/protocol/tls.py index 8ef34493..51f4d80d 100644 --- a/mitmproxy/protocol/tls.py +++ b/mitmproxy/protocol/tls.py @@ -366,9 +366,9 @@ class TlsLayer(base.Layer): # 2.5 The client did not sent a SNI value, we don't know the certificate subject. client_tls_requires_server_connection = ( self._server_tls and - not self.config.no_upstream_cert and + not self.config.options.no_upstream_cert and ( - self.config.add_upstream_certs_to_client_chain or + self.config.options.add_upstream_certs_to_client_chain or self._client_hello.alpn_protocols or not self._client_hello.sni ) @@ -473,7 +473,7 @@ class TlsLayer(base.Layer): self.log("Establish TLS with client", "debug") cert, key, chain_file = self._find_cert() - if self.config.add_upstream_certs_to_client_chain: + if self.config.options.add_upstream_certs_to_client_chain: extra_certs = self.server_conn.server_certs else: extra_certs = None @@ -483,7 +483,7 @@ class TlsLayer(base.Layer): cert, key, method=self.config.openssl_method_client, options=self.config.openssl_options_client, - cipher_list=self.config.ciphers_client, + cipher_list=self.config.options.ciphers_client, dhparams=self.config.certstore.dhparams, chain_file=chain_file, alpn_select_callback=self.__alpn_select_callback, @@ -519,10 +519,10 @@ class TlsLayer(base.Layer): alpn = [x for x in self._client_hello.alpn_protocols if not deprecated_http2_variant(x)] else: alpn = None - if alpn and b"h2" in alpn and not self.config.http2: + if alpn and b"h2" in alpn and not self.config.options.http2: alpn.remove(b"h2") - ciphers_server = self.config.ciphers_server + ciphers_server = self.config.options.ciphers_server if not ciphers_server: ciphers_server = [] for id in self._client_hello.cipher_suites: @@ -536,8 +536,8 @@ class TlsLayer(base.Layer): method=self.config.openssl_method_server, options=self.config.openssl_options_server, verify_options=self.config.openssl_verification_mode_server, - ca_path=self.config.openssl_trusted_cadir_server, - ca_pemfile=self.config.openssl_trusted_ca_server, + ca_path=self.config.options.ssl_verify_upstream_trusted_cadir, + ca_pemfile=self.config.options.ssl_verify_upstream_trusted_ca, cipher_list=ciphers_server, alpn_protos=alpn, ) @@ -595,7 +595,7 @@ class TlsLayer(base.Layer): use_upstream_cert = ( self.server_conn and self.server_conn.tls_established and - (not self.config.no_upstream_cert) + (not self.config.options.no_upstream_cert) ) if use_upstream_cert: upstream_cert = self.server_conn.cert diff --git a/mitmproxy/proxy/config.py b/mitmproxy/proxy/config.py index 32d881b0..7aa4c736 100644 --- a/mitmproxy/proxy/config.py +++ b/mitmproxy/proxy/config.py @@ -1,32 +1,21 @@ from __future__ import absolute_import, print_function, division +import base64 import collections import os import re +from netlib import strutils import six -from OpenSSL import SSL +from OpenSSL import SSL, crypto -from mitmproxy import platform +from mitmproxy import exceptions from netlib import certutils -from netlib import human from netlib import tcp from netlib.http import authentication +from netlib.http import url CONF_BASENAME = "mitmproxy" -CA_DIR = "~/.mitmproxy" - -# We manually need to specify this, otherwise OpenSSL may select a non-HTTP2 cipher by default. -# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=apache-2.2.15&openssl=1.0.2&hsts=yes&profile=old -DEFAULT_CLIENT_CIPHERS = "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:" \ - "ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:" \ - "ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:" \ - "ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:" \ - "DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:" \ - "DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:" \ - "AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:" \ - "HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:" \ - "!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA" class HostMatcher(object): @@ -55,187 +44,148 @@ class HostMatcher(object): ServerSpec = collections.namedtuple("ServerSpec", "scheme address") -class ProxyConfig: +def parse_server_spec(spec): + try: + p = url.parse(spec) + if p[0] not in (b"http", b"https"): + raise ValueError() + except ValueError: + raise exceptions.OptionsError( + "Invalid server specification: %s" % spec + ) + host, port = p[1:3] + address = tcp.Address((host.decode("ascii"), port)) + scheme = p[0].decode("ascii").lower() + return ServerSpec(scheme, address) - def __init__( - self, - host='', - port=8080, - cadir=CA_DIR, - clientcerts=None, - no_upstream_cert=False, - body_size_limit=None, - mode="regular", - upstream_server=None, - upstream_auth=None, - authenticator=None, - ignore_hosts=tuple(), - tcp_hosts=tuple(), - http2=True, - rawtcp=False, - ciphers_client=DEFAULT_CLIENT_CIPHERS, - ciphers_server=None, - certs=tuple(), - ssl_version_client="secure", - ssl_version_server="secure", - ssl_verify_upstream_cert=False, - ssl_verify_upstream_trusted_cadir=None, - ssl_verify_upstream_trusted_ca=None, - add_upstream_certs_to_client_chain=False, - ): - self.host = host - self.port = port - self.ciphers_client = ciphers_client - self.ciphers_server = ciphers_server - self.clientcerts = clientcerts - self.no_upstream_cert = no_upstream_cert - self.body_size_limit = body_size_limit - self.mode = mode - if upstream_server: - self.upstream_server = ServerSpec(upstream_server[0], tcp.Address.wrap(upstream_server[1])) - self.upstream_auth = upstream_auth - else: - self.upstream_server = None - self.upstream_auth = None - - self.check_ignore = HostMatcher(ignore_hosts) - self.check_tcp = HostMatcher(tcp_hosts) - self.http2 = http2 - self.rawtcp = rawtcp - self.authenticator = authenticator - self.cadir = os.path.expanduser(cadir) - self.certstore = certutils.CertStore.from_store( - self.cadir, - CONF_BASENAME + +def parse_upstream_auth(auth): + pattern = re.compile(".+:") + if pattern.search(auth) is None: + raise exceptions.OptionsError( + "Invalid upstream auth specification: %s" % auth ) - for spec, cert in certs: - self.certstore.add_cert_file(spec, cert) + return b"Basic" + b" " + base64.b64encode(strutils.always_bytes(auth)) - self.openssl_method_client, self.openssl_options_client = \ - tcp.sslversion_choices[ssl_version_client] - self.openssl_method_server, self.openssl_options_server = \ - tcp.sslversion_choices[ssl_version_server] - if ssl_verify_upstream_cert: +class ProxyConfig: + + def __init__(self, options): + self.options = options + + self.authenticator = None + self.check_ignore = None + self.check_tcp = None + self.certstore = None + self.clientcerts = None + self.openssl_verification_mode_server = None + self.configure(options) + options.changed.connect(self.configure) + + def configure(self, options): + conflict = all( + [ + options.add_upstream_certs_to_client_chain, + options.ssl_verify_upstream_cert + ] + ) + if conflict: + raise exceptions.OptionsError( + "The verify-upstream-cert and add-upstream-certs-to-client-chain " + "options are mutually exclusive. If upstream certificates are verified " + "then extra upstream certificates are not available for inclusion " + "to the client chain." + ) + + if options.ssl_verify_upstream_cert: self.openssl_verification_mode_server = SSL.VERIFY_PEER else: self.openssl_verification_mode_server = SSL.VERIFY_NONE - self.openssl_trusted_cadir_server = ssl_verify_upstream_trusted_cadir - self.openssl_trusted_ca_server = ssl_verify_upstream_trusted_ca - self.add_upstream_certs_to_client_chain = add_upstream_certs_to_client_chain - - -def process_proxy_options(parser, options): - body_size_limit = options.body_size_limit - if body_size_limit: - body_size_limit = human.parse_size(body_size_limit) - - c = 0 - mode, upstream_server, upstream_auth = "regular", None, None - if options.transparent_proxy: - c += 1 - if not platform.resolver: - return parser.error("Transparent mode not supported on this platform.") - mode = "transparent" - if options.socks_proxy: - c += 1 - mode = "socks5" - if options.reverse_proxy: - c += 1 - mode = "reverse" - upstream_server = options.reverse_proxy - if options.upstream_proxy: - c += 1 - mode = "upstream" - upstream_server = options.upstream_proxy - upstream_auth = options.upstream_auth - if c > 1: - return parser.error( - "Transparent, SOCKS5, reverse and upstream proxy mode " - "are mutually exclusive. Read the docs on proxy modes to understand why." - ) - if options.add_upstream_certs_to_client_chain and options.no_upstream_cert: - return parser.error( - "The no-upstream-cert and add-upstream-certs-to-client-chain " - "options are mutually exclusive. If no-upstream-cert is enabled " - "then the upstream certificate is not retrieved before generating " - "the client certificate chain." - ) - if options.add_upstream_certs_to_client_chain and options.ssl_verify_upstream_cert: - return parser.error( - "The verify-upstream-cert and add-upstream-certs-to-client-chain " - "options are mutually exclusive. If upstream certificates are verified " - "then extra upstream certificates are not available for inclusion " - "to the client chain." - ) - if options.clientcerts: - options.clientcerts = os.path.expanduser(options.clientcerts) - if not os.path.exists(options.clientcerts): - return parser.error( - "Client certificate path does not exist: %s" % options.clientcerts - ) - if options.auth_nonanonymous or options.auth_singleuser or options.auth_htpasswd: - if options.transparent_proxy: - return parser.error("Proxy Authentication not supported in transparent mode.") + self.check_ignore = HostMatcher(options.ignore_hosts) + self.check_tcp = HostMatcher(options.tcp_hosts) + + self.openssl_method_client, self.openssl_options_client = \ + tcp.sslversion_choices[options.ssl_version_client] + self.openssl_method_server, self.openssl_options_server = \ + tcp.sslversion_choices[options.ssl_version_server] - if options.socks_proxy: - return parser.error( - "Proxy Authentication not supported in SOCKS mode. " - "https://github.com/mitmproxy/mitmproxy/issues/738" + certstore_path = os.path.expanduser(options.cadir) + if not os.path.exists(os.path.dirname(certstore_path)): + raise exceptions.OptionsError( + "Certificate Authority parent directory does not exist: %s" % + os.path.dirname(options.cadir) ) + self.certstore = certutils.CertStore.from_store( + certstore_path, + CONF_BASENAME + ) - if options.auth_singleuser: - if len(options.auth_singleuser.split(':')) != 2: - return parser.error( - "Invalid single-user specification. Please use the format username:password" + if options.clientcerts: + clientcerts = os.path.expanduser(options.clientcerts) + if not os.path.exists(clientcerts): + raise exceptions.OptionsError( + "Client certificate path does not exist: %s" % + options.clientcerts + ) + self.clientcerts = clientcerts + + for spec, cert in options.certs: + cert = os.path.expanduser(cert) + if not os.path.exists(cert): + raise exceptions.OptionsError( + "Certificate file does not exist: %s" % cert ) - username, password = options.auth_singleuser.split(':') - password_manager = authentication.PassManSingleUser(username, password) - elif options.auth_nonanonymous: - password_manager = authentication.PassManNonAnon() - elif options.auth_htpasswd: try: - password_manager = authentication.PassManHtpasswd( - options.auth_htpasswd) - except ValueError as v: - return parser.error(v) - authenticator = authentication.BasicProxyAuth(password_manager, "mitmproxy") - else: - authenticator = authentication.NullProxyAuth(None) - - certs = [] - for i in options.certs: - parts = i.split("=", 1) - if len(parts) == 1: - parts = ["*", parts[0]] - parts[1] = os.path.expanduser(parts[1]) - if not os.path.exists(parts[1]): - parser.error("Certificate file does not exist: %s" % parts[1]) - certs.append(parts) - - return ProxyConfig( - host=options.addr, - port=options.port, - cadir=options.cadir, - clientcerts=options.clientcerts, - no_upstream_cert=options.no_upstream_cert, - body_size_limit=body_size_limit, - mode=mode, - upstream_server=upstream_server, - upstream_auth=upstream_auth, - ignore_hosts=options.ignore_hosts, - tcp_hosts=options.tcp_hosts, - http2=options.http2, - rawtcp=options.rawtcp, - authenticator=authenticator, - ciphers_client=options.ciphers_client, - ciphers_server=options.ciphers_server, - certs=tuple(certs), - ssl_version_client=options.ssl_version_client, - ssl_version_server=options.ssl_version_server, - ssl_verify_upstream_cert=options.ssl_verify_upstream_cert, - ssl_verify_upstream_trusted_cadir=options.ssl_verify_upstream_trusted_cadir, - ssl_verify_upstream_trusted_ca=options.ssl_verify_upstream_trusted_ca, - add_upstream_certs_to_client_chain=options.add_upstream_certs_to_client_chain, - ) + self.certstore.add_cert_file(spec, cert) + except crypto.Error: + raise exceptions.OptionsError( + "Invalid certificate format: %s" % cert + ) + + self.upstream_server = None + self.upstream_auth = None + if options.upstream_server: + self.upstream_server = parse_server_spec(options.upstream_server) + if options.upstream_auth: + self.upstream_auth = parse_upstream_auth(options.upstream_auth) + + self.authenticator = authentication.NullProxyAuth(None) + needsauth = any( + [ + options.auth_nonanonymous, + options.auth_singleuser, + options.auth_htpasswd + ] + ) + if needsauth: + if options.mode == "transparent": + raise exceptions.OptionsError( + "Proxy Authentication not supported in transparent mode." + ) + elif options.mode == "socks5": + raise exceptions.OptionsError( + "Proxy Authentication not supported in SOCKS mode. " + "https://github.com/mitmproxy/mitmproxy/issues/738" + ) + elif options.auth_singleuser: + parts = options.auth_singleuser.split(':') + if len(parts) != 2: + raise exceptions.OptionsError( + "Invalid single-user specification. " + "Please use the format username:password" + ) + password_manager = authentication.PassManSingleUser(*parts) + elif options.auth_nonanonymous: + password_manager = authentication.PassManNonAnon() + elif options.auth_htpasswd: + try: + password_manager = authentication.PassManHtpasswd( + options.auth_htpasswd + ) + except ValueError as v: + raise exceptions.OptionsError(str(v)) + self.authenticator = authentication.BasicProxyAuth( + password_manager, + "mitmproxy" + ) diff --git a/mitmproxy/proxy/root_context.py b/mitmproxy/proxy/root_context.py index 57183c7e..81dd625c 100644 --- a/mitmproxy/proxy/root_context.py +++ b/mitmproxy/proxy/root_context.py @@ -100,9 +100,9 @@ class RootContext(object): is_ascii = ( len(d) == 3 and # expect A-Za-z - all(65 <= x <= 90 and 97 <= x <= 122 for x in six.iterbytes(d)) + all(65 <= x <= 90 or 97 <= x <= 122 for x in six.iterbytes(d)) ) - if self.config.rawtcp and not is_ascii: + if self.config.options.rawtcp and not is_ascii: return protocol.RawTCPLayer(top_layer) # 7. Assume HTTP1 by default diff --git a/mitmproxy/proxy/server.py b/mitmproxy/proxy/server.py index 7e96911a..26f2e294 100644 --- a/mitmproxy/proxy/server.py +++ b/mitmproxy/proxy/server.py @@ -41,7 +41,9 @@ class ProxyServer(tcp.TCPServer): """ self.config = config try: - super(ProxyServer, self).__init__((config.host, config.port)) + super(ProxyServer, self).__init__( + (config.options.listen_host, config.options.listen_port) + ) except socket.error as e: six.reraise( exceptions.ServerException, @@ -83,7 +85,7 @@ class ConnectionHandler(object): self.channel ) - mode = self.config.mode + mode = self.config.options.mode if mode == "upstream": return modes.HttpUpstreamProxy( root_ctx, diff --git a/mitmproxy/script/__init__.py b/mitmproxy/script/__init__.py index d6bff4c7..e75f282a 100644 --- a/mitmproxy/script/__init__.py +++ b/mitmproxy/script/__init__.py @@ -1,13 +1,5 @@ -from . import reloader from .concurrent import concurrent -from .script import Script -from .script_context import ScriptContext -from ..exceptions import ScriptException __all__ = [ - "Script", - "ScriptContext", "concurrent", - "ScriptException", - "reloader" ] diff --git a/mitmproxy/script/concurrent.py b/mitmproxy/script/concurrent.py index 56d39d0b..0cc0514e 100644 --- a/mitmproxy/script/concurrent.py +++ b/mitmproxy/script/concurrent.py @@ -13,14 +13,14 @@ class ScriptThread(basethread.BaseThread): def concurrent(fn): - if fn.__name__ not in controller.Events: + if fn.__name__ not in controller.Events - set(["start", "configure", "tick"]): raise NotImplementedError( "Concurrent decorator not supported for '%s' method." % fn.__name__ ) - def _concurrent(ctx, obj): + def _concurrent(obj): def run(): - fn(ctx, obj) + fn(obj) if not obj.reply.acked: obj.reply.ack() obj.reply.take() diff --git a/mitmproxy/script/reloader.py b/mitmproxy/script/reloader.py deleted file mode 100644 index 50401034..00000000 --- a/mitmproxy/script/reloader.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import absolute_import, print_function, division - -import os - -from watchdog.events import RegexMatchingEventHandler - -from watchdog.observers.polling import PollingObserver as Observer -# We occasionally have watchdog errors on Windows, Linux and Mac when using the native observers. -# After reading through the watchdog source code and issue tracker, -# we may want to replace this with a very simple implementation of our own. - -_observers = {} - - -def watch(script, callback): - if script in _observers: - raise RuntimeError("Script already observed") - script_dir = os.path.dirname(os.path.abspath(script.filename)) - script_name = os.path.basename(script.filename) - event_handler = _ScriptModificationHandler(callback, filename=script_name) - observer = Observer() - observer.schedule(event_handler, script_dir) - observer.start() - _observers[script] = observer - - -def unwatch(script): - observer = _observers.pop(script, None) - if observer: - observer.stop() - observer.join() - - -class _ScriptModificationHandler(RegexMatchingEventHandler): - - def __init__(self, callback, filename='.*'): - - super(_ScriptModificationHandler, self).__init__( - ignore_directories=True, - regexes=['.*' + filename] - ) - self.callback = callback - - def on_modified(self, event): - self.callback() - -__all__ = ["watch", "unwatch"] diff --git a/mitmproxy/script/script.py b/mitmproxy/script/script.py deleted file mode 100644 index 9ff79f52..00000000 --- a/mitmproxy/script/script.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -The script object representing mitmproxy inline scripts. -Script objects know nothing about mitmproxy or mitmproxy's API - this knowledge is provided -by the mitmproxy-specific ScriptContext. -""" -# Do not import __future__ here, this would apply transitively to the inline scripts. -from __future__ import absolute_import, print_function, division - -import inspect -import os -import shlex -import sys -import contextlib -import warnings - -import six - -from mitmproxy import exceptions - - -@contextlib.contextmanager -def setargs(args): - oldargs = sys.argv - sys.argv = args - try: - yield - finally: - sys.argv = oldargs - - -class Script(object): - - """ - Script object representing an inline script. - """ - - def __init__(self, command, context): - self.command = command - self.args = self.parse_command(command) - self.ctx = context - self.ns = None - - def __enter__(self): - self.load() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - if exc_val: - return False # reraise the exception - self.unload() - - @property - def filename(self): - return self.args[0] - - @staticmethod - def parse_command(command): - if not command or not command.strip(): - raise exceptions.ScriptException("Empty script command.") - # Windows: escape all backslashes in the path. - if os.name == "nt": # pragma: no cover - backslashes = shlex.split(command, posix=False)[0].count("\\") - command = command.replace("\\", "\\\\", backslashes) - args = shlex.split(command) # pragma: no cover - args[0] = os.path.expanduser(args[0]) - if not os.path.exists(args[0]): - raise exceptions.ScriptException( - ("Script file not found: %s.\r\n" - "If your script path contains spaces, " - "make sure to wrap it in additional quotes, e.g. -s \"'./foo bar/baz.py' --args\".") % - args[0]) - elif os.path.isdir(args[0]): - raise exceptions.ScriptException("Not a file: %s" % args[0]) - return args - - def load(self): - """ - Loads an inline script. - - Returns: - The return value of self.run("start", ...) - - Raises: - ScriptException on failure - """ - if self.ns is not None: - raise exceptions.ScriptException("Script is already loaded") - script_dir = os.path.dirname(os.path.abspath(self.args[0])) - self.ns = {'__file__': os.path.abspath(self.args[0])} - sys.path.append(script_dir) - sys.path.append(os.path.join(script_dir, "..")) - try: - with open(self.filename) as f: - code = compile(f.read(), self.filename, 'exec') - exec(code, self.ns, self.ns) - except Exception: - six.reraise( - exceptions.ScriptException, - exceptions.ScriptException.from_exception_context(), - sys.exc_info()[2] - ) - finally: - sys.path.pop() - sys.path.pop() - - start_fn = self.ns.get("start") - if start_fn and len(inspect.getargspec(start_fn).args) == 2: - warnings.warn( - "The 'args' argument of the start() script hook is deprecated. " - "Please use sys.argv instead." - ) - return self.run("start", self.args) - return self.run("start") - - def unload(self): - try: - return self.run("done") - finally: - self.ns = None - - def run(self, name, *args, **kwargs): - """ - Runs an inline script hook. - - Returns: - The return value of the method. - None, if the script does not provide the method. - - Raises: - ScriptException if there was an exception. - """ - if self.ns is None: - raise exceptions.ScriptException("Script not loaded.") - f = self.ns.get(name) - if f: - try: - with setargs(self.args): - return f(self.ctx, *args, **kwargs) - except Exception: - six.reraise( - exceptions.ScriptException, - exceptions.ScriptException.from_exception_context(), - sys.exc_info()[2] - ) - else: - return None diff --git a/mitmproxy/script/script_context.py b/mitmproxy/script/script_context.py deleted file mode 100644 index 44e2736b..00000000 --- a/mitmproxy/script/script_context.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -The mitmproxy script context provides an API to inline scripts. -""" -from __future__ import absolute_import, print_function, division - -from mitmproxy import contentviews - - -class ScriptContext(object): - - """ - The script context should be used to interact with the global mitmproxy state from within a - script. - """ - - def __init__(self, master): - self._master = master - - def log(self, message, level="info"): - """ - Logs an event. - - By default, only events with level "error" get displayed. This can be controlled with the "-v" switch. - How log messages are handled depends on the front-end. mitmdump will print them to stdout, - mitmproxy sends output to the eventlog for display ("e" keyboard shortcut). - """ - self._master.add_event(message, level) - - def kill_flow(self, f): - """ - Kills a flow immediately. No further data will be sent to the client or the server. - """ - f.kill(self._master) - - def duplicate_flow(self, f): - """ - Returns a duplicate of the specified flow. The flow is also - injected into the current state, and is ready for editing, replay, - etc. - """ - self._master.pause_scripts = True - f = self._master.duplicate_flow(f) - self._master.pause_scripts = False - return f - - def replay_request(self, f): - """ - Replay the request on the current flow. The response will be added - to the flow object. - """ - return self._master.replay_request(f, block=True, run_scripthooks=False) - - @property - def app_registry(self): - return self._master.apps - - def add_contentview(self, view_obj): - contentviews.add(view_obj) - - def remove_contentview(self, view_obj): - contentviews.remove(view_obj) diff --git a/mitmproxy/utils.py b/mitmproxy/utils.py index 15785c72..1c75dd83 100644 --- a/mitmproxy/utils.py +++ b/mitmproxy/utils.py @@ -36,3 +36,7 @@ class LRUCache: d = self.cacheList.pop() self.cache.pop(d) return ret + + +def log_tier(level): + return dict(error=0, warn=1, info=2, debug=3).get(level) diff --git a/mitmproxy/web/app.py b/mitmproxy/web/app.py index 979d0467..56f7f67d 100644 --- a/mitmproxy/web/app.py +++ b/mitmproxy/web/app.py @@ -118,6 +118,7 @@ class RequestHandler(BasicAuth, tornado.web.RequestHandler): @property def master(self): + # type: () -> mitmproxy.web.master.WebMaster return self.application.master @property @@ -309,7 +310,7 @@ class FlowContent(RequestHandler): def get(self, flow_id, message): message = getattr(self.flow, message) - if not message.content: + if not message.raw_content: raise APIError(400, "No content.") content_encoding = message.headers.get("Content-Encoding", None) @@ -332,7 +333,7 @@ class FlowContent(RequestHandler): self.set_header("Content-Type", "application/text") self.set_header("X-Content-Type-Options", "nosniff") self.set_header("X-Frame-Options", "DENY") - self.write(message.content) + self.write(message.raw_content) class Events(RequestHandler): @@ -350,17 +351,17 @@ class Settings(RequestHandler): self.write(dict( data=dict( version=version.VERSION, - mode=str(self.master.server.config.mode), - intercept=self.state.intercept_txt, + mode=str(self.master.options.mode), + intercept=self.master.options.intercept, showhost=self.master.options.showhost, - no_upstream_cert=self.master.server.config.no_upstream_cert, - rawtcp=self.master.server.config.rawtcp, - http2=self.master.server.config.http2, + no_upstream_cert=self.master.options.no_upstream_cert, + rawtcp=self.master.options.rawtcp, + http2=self.master.options.http2, anticache=self.master.options.anticache, anticomp=self.master.options.anticomp, - stickyauth=self.master.stickyauth_txt, - stickycookie=self.master.stickycookie_txt, - stream= self.master.stream_large_bodies.max_size if self.master.stream_large_bodies else False + stickyauth=self.master.options.stickyauth, + stickycookie=self.master.options.stickycookie, + stream= self.master.options.stream_large_bodies ) )) @@ -368,19 +369,19 @@ class Settings(RequestHandler): update = {} for k, v in six.iteritems(self.json): if k == "intercept": - self.state.set_intercept(v) + self.master.options.intercept = v update[k] = v elif k == "showhost": self.master.options.showhost = v update[k] = v elif k == "no_upstream_cert": - self.master.server.config.no_upstream_cert = v + self.master.options.no_upstream_cert = v update[k] = v elif k == "rawtcp": - self.master.server.config.rawtcp = v + self.master.options.rawtcp = v update[k] = v elif k == "http2": - self.master.server.config.http2 = v + self.master.options.http2 = v update[k] = v elif k == "anticache": self.master.options.anticache = v @@ -389,13 +390,13 @@ class Settings(RequestHandler): self.master.options.anticomp = v update[k] = v elif k == "stickycookie": - self.master.set_stickycookie(v) + self.master.options.stickycookie = v update[k] = v elif k == "stickyauth": - self.master.set_stickyauth(v) + self.master.options.stickyauth = v update[k] = v elif k == "stream": - self.master.set_stream_large_bodies(v) + self.master.options.stream_large_bodies = v update[k] = v else: print("Warning: Unknown setting {}: {}".format(k, v)) diff --git a/mitmproxy/web/master.py b/mitmproxy/web/master.py index 737bb95f..a0d68191 100644 --- a/mitmproxy/web/master.py +++ b/mitmproxy/web/master.py @@ -6,6 +6,9 @@ import collections import tornado.httpserver import tornado.ioloop +from typing import Optional # noqa + +from mitmproxy import builtins from mitmproxy import controller from mitmproxy import exceptions from mitmproxy import flow @@ -64,7 +67,7 @@ class WebState(flow.State): self._last_event_id = 0 self.events = collections.deque(maxlen=1000) - def add_event(self, e, level): + def add_log(self, e, level): self._last_event_id += 1 entry = { "id": self._last_event_id, @@ -88,50 +91,28 @@ class WebState(flow.State): ) -class Options(object): - attributes = [ - "app", - "app_domain", - "app_ip", - "anticache", - "anticomp", - "client_replay", - "eventlog", - "keepserving", - "kill", - "intercept", - "no_server", - "outfile", - "refresh_server_playback", - "rfile", - "scripts", - "showhost", - "replacements", - "rheaders", - "setheaders", - "server_replay", - "stickycookie", - "stickyauth", - "stream_large_bodies", - "verbosity", - "wfile", - "nopop", - - "wdebug", - "wport", - "wiface", - "wauthenticator", - "wsingleuser", - "whtpasswd", - ] - - def __init__(self, **kwargs): - for k, v in kwargs.items(): - setattr(self, k, v) - for i in self.attributes: - if not hasattr(self, i): - setattr(self, i, None) - +class Options(flow.options.Options): + def __init__( + self, + intercept=None, # type: Optional[str] + wdebug=bool, # type: bool + wport=8081, # type: int + wiface="127.0.0.1", # type: str + wauthenticator=None, # type: Optional[authentication.PassMan] + wsingleuser=None, # type: Optional[str] + whtpasswd=None, # type: Optional[str] + **kwargs + ): + self.wdebug = wdebug + self.wport = wport + self.wiface = wiface + self.wauthenticator = wauthenticator + self.wsingleuser = wsingleuser + self.whtpasswd = whtpasswd + self.intercept = intercept + super(Options, self).__init__(**kwargs) + + # TODO: This doesn't belong here. def process_web_options(self, parser): if self.wsingleuser or self.whtpasswd: if self.wsingleuser: @@ -153,14 +134,18 @@ class Options(object): class WebMaster(flow.FlowMaster): def __init__(self, server, options): - self.options = options - super(WebMaster, self).__init__(server, WebState()) - self.app = app.Application(self, self.options.wdebug, self.options.wauthenticator) + super(WebMaster, self).__init__(options, server, WebState()) + self.addons.add(*builtins.default_addons()) + self.app = app.Application( + self, self.options.wdebug, self.options.wauthenticator + ) + # This line is just for type hinting + self.options = self.options # type: Options if options.rfile: try: self.load_flows_file(options.rfile) except exceptions.FlowReadException as v: - self.add_event( + self.add_log( "Could not read flow file: %s" % v, "error" ) @@ -215,6 +200,6 @@ class WebMaster(flow.FlowMaster): super(WebMaster, self).error(f) return self._process_flow(f) - def add_event(self, e, level="info"): - super(WebMaster, self).add_event(e, level) - return self.state.add_event(e, level) + def add_log(self, e, level="info"): + super(WebMaster, self).add_log(e, level) + return self.state.add_log(e, level) diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index a7d89322..f2c12866 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -2,166 +2,163 @@ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Query=exports.ConnectionActions=exports.StoreCmds=exports.ActionTypes=void 0;var _dispatcher=require("./dispatcher.js"),ActionTypes=exports.ActionTypes={CONNECTION_OPEN:"connection_open",CONNECTION_CLOSE:"connection_close",CONNECTION_ERROR:"connection_error",SETTINGS_STORE:"settings",EVENT_STORE:"events",FLOW_STORE:"flows"},StoreCmds=exports.StoreCmds={ADD:"add",UPDATE:"update",REMOVE:"remove",RESET:"reset"},ConnectionActions=exports.ConnectionActions={open:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_OPEN})},close:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_CLOSE})},error:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_ERROR})}},Query=exports.Query={SEARCH:"s",HIGHLIGHT:"h",SHOW_EVENTLOG:"e"}; },{"./dispatcher.js":40}],2:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_redux=require("redux"),_reactRedux=require("react-redux"),_reduxThunk=require("redux-thunk"),_reduxThunk2=_interopRequireDefault(_reduxThunk),_reactRouter=require("react-router"),_ProxyApp=require("./components/ProxyApp"),_ProxyApp2=_interopRequireDefault(_ProxyApp),_MainView=require("./components/MainView"),_MainView2=_interopRequireDefault(_MainView),_index=require("./ducks/index"),_index2=_interopRequireDefault(_index),_eventLog=require("./ducks/eventLog"),middlewares=[_reduxThunk2["default"]],createLogger,store=(0,_redux.createStore)(_index2["default"],_redux.applyMiddleware.apply(void 0,middlewares));window.addEventListener("error",function(e){store.dispatch((0,_eventLog.add)(e))}),document.addEventListener("DOMContentLoaded",function(){(0,_reactDom.render)(_react2["default"].createElement(_reactRedux.Provider,{store:store,__self:void 0},_react2["default"].createElement(_reactRouter.Router,{history:_reactRouter.hashHistory,__self:void 0},_react2["default"].createElement(_reactRouter.Redirect,{from:"/",to:"/flows",__self:void 0}),_react2["default"].createElement(_reactRouter.Route,{path:"/",component:_ProxyApp2["default"],__self:void 0},_react2["default"].createElement(_reactRouter.Route,{path:"flows",component:_MainView2["default"],__self:void 0}),_react2["default"].createElement(_reactRouter.Route,{path:"flows/:flowId/:detailTab",component:_MainView2["default"],__self:void 0})))),document.getElementById("mitmproxy"))}); +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_redux=require("redux"),_reactRedux=require("react-redux"),_reduxThunk=require("redux-thunk"),_reduxThunk2=_interopRequireDefault(_reduxThunk),_reactRouter=require("react-router"),_ProxyApp=require("./components/ProxyApp"),_ProxyApp2=_interopRequireDefault(_ProxyApp),_MainView=require("./components/MainView"),_MainView2=_interopRequireDefault(_MainView),_index=require("./ducks/index"),_index2=_interopRequireDefault(_index),_eventLog=require("./ducks/eventLog"),middlewares=[_reduxThunk2.default],createLogger,store=(0,_redux.createStore)(_index2.default,_redux.applyMiddleware.apply(void 0,middlewares));window.addEventListener("error",function(e){store.dispatch((0,_eventLog.add)(e))}),document.addEventListener("DOMContentLoaded",function(){(0,_reactDom.render)(_react2.default.createElement(_reactRedux.Provider,{store:store},_react2.default.createElement(_reactRouter.Router,{history:_reactRouter.hashHistory},_react2.default.createElement(_reactRouter.Redirect,{from:"/",to:"/flows"}),_react2.default.createElement(_reactRouter.Route,{path:"/",component:_ProxyApp2.default},_react2.default.createElement(_reactRouter.Route,{path:"flows",component:_MainView2.default}),_react2.default.createElement(_reactRouter.Route,{path:"flows/:flowId/:detailTab",component:_MainView2.default})))),document.getElementById("mitmproxy"))}); -},{"./components/MainView":28,"./components/ProxyApp":30,"./ducks/eventLog":42,"./ducks/index":44,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-thunk":"redux-thunk"}],3:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../flow/utils.js"),_ContentViews=require("./ContentView/ContentViews"),_MetaViews=require("./ContentView/MetaViews"),MetaViews=_interopRequireWildcard(_MetaViews),_ContentLoader=require("./ContentView/ContentLoader"),_ContentLoader2=_interopRequireDefault(_ContentLoader),_ViewSelector=require("./ContentView/ViewSelector"),_ViewSelector2=_interopRequireDefault(_ViewSelector),ContentView=function(e){function t(e,n){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,n));return r.state={displayLarge:!1,View:_ContentViews.ViewAuto},r.selectView=r.selectView.bind(r),r}return _inherits(t,e),_createClass(t,[{key:"selectView",value:function(e){this.setState({View:e})}},{key:"displayLarge",value:function(){this.setState({displayLarge:!0})}},{key:"componentWillReceiveProps",value:function(e){e.message!==this.props.message&&this.setState({displayLarge:!1,View:_ContentViews.ViewAuto})}},{key:"isContentTooLarge",value:function(e){return e.contentLength>1048576*(_ContentViews.ViewImage.matches(e)?10:.2)}},{key:"render",value:function(){var e=this.props,t=e.flow,n=e.message,r=this.state,i=r.displayLarge,a=r.View;return 0===n.contentLength?_react2["default"].createElement(MetaViews.ContentEmpty,_extends({},this.props,{__self:this})):null===n.contentLength?_react2["default"].createElement(MetaViews.ContentMissing,_extends({},this.props,{__self:this})):!i&&this.isContentTooLarge(n)?_react2["default"].createElement(MetaViews.ContentTooLarge,_extends({},this.props,{onClick:this.displayLarge,__self:this})):_react2["default"].createElement("div",{__self:this},a.textView?_react2["default"].createElement(_ContentLoader2["default"],{flow:t,message:n,__self:this},_react2["default"].createElement(this.state.View,{content:"",__self:this})):_react2["default"].createElement(a,{flow:t,message:n,__self:this}),_react2["default"].createElement("div",{className:"view-options text-center",__self:this},_react2["default"].createElement(_ViewSelector2["default"],{onSelectView:this.selectView,active:a,message:n,__self:this})," ",_react2["default"].createElement("a",{className:"btn btn-default btn-xs",href:_utils.MessageUtils.getContentURL(t,n),__self:this},_react2["default"].createElement("i",{className:"fa fa-download",__self:this}))))}}]),t}(_react.Component);ContentView.propTypes={flow:_react2["default"].PropTypes.object.isRequired,message:_react2["default"].PropTypes.object.isRequired},exports["default"]=ContentView; +},{"./components/MainView":28,"./components/ProxyApp":30,"./ducks/eventLog":42,"./ducks/index":45,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-thunk":"redux-thunk"}],3:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function ContentView(e){var t=e.flow,n=e.message,r=e.contentView,a=e.selectView,i=e.displayLarge,o=e.setDisplayLarge;if(0===n.contentLength)return _react2.default.createElement(MetaViews.ContentEmpty,e);if(null===n.contentLength)return _react2.default.createElement(MetaViews.ContentMissing,e);if(!i&&ContentView.isContentTooLarge(n))return _react2.default.createElement(MetaViews.ContentTooLarge,_extends({},e,{onClick:function(){return o(!0)}}));var l=ContentViews[r];return _react2.default.createElement("div",null,l.textView?_react2.default.createElement(_ContentLoader2.default,{flow:t,message:n},_react2.default.createElement(l,{content:""})):_react2.default.createElement(l,{flow:t,message:n}),_react2.default.createElement("div",{className:"view-options text-center"},_react2.default.createElement(_ViewSelector2.default,{onSelectView:a,active:l,message:n})," ",_react2.default.createElement("a",{className:"btn btn-default btn-xs",href:_utils.MessageUtils.getContentURL(t,n)},_react2.default.createElement("i",{className:"fa fa-download"}))))}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_utils=require("../flow/utils.js"),_ContentViews=require("./ContentView/ContentViews"),ContentViews=_interopRequireWildcard(_ContentViews),_MetaViews=require("./ContentView/MetaViews"),MetaViews=_interopRequireWildcard(_MetaViews),_ContentLoader=require("./ContentView/ContentLoader"),_ContentLoader2=_interopRequireDefault(_ContentLoader),_ViewSelector=require("./ContentView/ViewSelector"),_ViewSelector2=_interopRequireDefault(_ViewSelector),_ui=require("../ducks/ui");ContentView.propTypes={flow:_react2.default.PropTypes.object.isRequired,message:_react2.default.PropTypes.object.isRequired},ContentView.isContentTooLarge=function(e){return e.contentLength>1048576*(ContentViews.ViewImage.matches(e)?10:.2)},exports.default=(0,_reactRedux.connect)(function(e){return{contentView:e.ui.contentView,displayLarge:e.ui.displayLarge}},{selectView:_ui.setContentView,setDisplayLarge:_ui.setDisplayLarge})(ContentView); -},{"../flow/utils.js":54,"./ContentView/ContentLoader":4,"./ContentView/ContentViews":5,"./ContentView/MetaViews":6,"./ContentView/ViewSelector":7,"react":"react"}],4:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../../flow/utils.js"),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),ContentLoader=function(e){function t(e,n){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,n));return r.state={content:null,request:null},r}return _inherits(t,e),_createClass(t,[{key:"requestContent",value:function(e){var t=this;this.state.request&&this.state.request.abort();var n=_utils.MessageUtils.getContentURL(e.flow,e.message),r=_jquery2["default"].get(n);this.setState({content:null,request:r}),r.done(function(e){t.setState({content:e})}).fail(function(e,n,r){"abort"!==n&&t.setState({content:"AJAX Error: "+n+"\r\n"+r})}).always(function(){t.setState({request:null})})}},{key:"componentWillMount",value:function(){this.requestContent(this.props)}},{key:"componentWillReceiveProps",value:function(e){e.message!==this.props.message&&this.requestContent(e)}},{key:"componentWillUnmount",value:function(){this.state.request&&this.state.request.abort()}},{key:"render",value:function(){return this.state.content?_react2["default"].cloneElement(this.props.children,{content:this.state.content}):_react2["default"].createElement("div",{className:"text-center",__self:this},_react2["default"].createElement("i",{className:"fa fa-spinner fa-spin",__self:this}))}}]),t}(_react.Component);ContentLoader.propTypes={flow:_react.PropTypes.object.isRequired,message:_react.PropTypes.object.isRequired},exports["default"]=ContentLoader; +},{"../ducks/ui":48,"../flow/utils.js":53,"./ContentView/ContentLoader":4,"./ContentView/ContentViews":5,"./ContentView/MetaViews":6,"./ContentView/ViewSelector":7,"react":"react","react-redux":"react-redux"}],4:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../../flow/utils.js"),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),ContentLoader=function(e){function t(e,n){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,n));return r.state={content:null,request:null},r}return _inherits(t,e),_createClass(t,[{key:"requestContent",value:function(e){var t=this;this.state.request&&this.state.request.abort();var n=_utils.MessageUtils.getContentURL(e.flow,e.message),r=_jquery2.default.get(n);this.setState({content:null,request:r}),r.done(function(e){t.setState({content:e})}).fail(function(e,n,r){"abort"!==n&&t.setState({content:"AJAX Error: "+n+"\r\n"+r})}).always(function(){t.setState({request:null})})}},{key:"componentWillMount",value:function(){this.requestContent(this.props)}},{key:"componentWillReceiveProps",value:function(e){e.message!==this.props.message&&this.requestContent(e)}},{key:"componentWillUnmount",value:function(){this.state.request&&this.state.request.abort()}},{key:"render",value:function(){return this.state.content?_react2.default.cloneElement(this.props.children,{content:this.state.content}):_react2.default.createElement("div",{className:"text-center"},_react2.default.createElement("i",{className:"fa fa-spinner fa-spin"}))}}]),t}(_react.Component);ContentLoader.propTypes={flow:_react.PropTypes.object.isRequired,message:_react.PropTypes.object.isRequired},exports.default=ContentLoader; -},{"../../flow/utils.js":54,"jquery":"jquery","react":"react"}],5:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function ViewImage(e){var t=e.flow,i=e.message;return _react2["default"].createElement("div",{className:"flowview-image",__self:this},_react2["default"].createElement("img",{src:_utils.MessageUtils.getContentURL(t,i),alt:"preview",className:"img-thumbnail",__self:this}))}function ViewRaw(e){var t=e.content;return _react2["default"].createElement("pre",{__self:this},t)}function ViewJSON(e){var t=e.content,i=t;try{i=JSON.stringify(JSON.parse(t),null,2)}catch(r){}return _react2["default"].createElement("pre",{__self:this},i)}function ViewAuto(e){var t=e.message,i=e.flow,r=ViewAuto.findView(t);return r.textView?_react2["default"].createElement(_ContentLoader2["default"],{message:t,flow:i,__self:this},_react2["default"].createElement(r,{content:"",__self:this})):_react2["default"].createElement(r,{message:t,flow:i,__self:this})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.ViewImage=ViewImage,exports.ViewRaw=ViewRaw,exports.ViewJSON=ViewJSON,exports.ViewAuto=ViewAuto;var _react=require("react"),_react2=_interopRequireDefault(_react),_ContentLoader=require("./ContentLoader"),_ContentLoader2=_interopRequireDefault(_ContentLoader),_utils=require("../../flow/utils.js"),views=[ViewAuto,ViewImage,ViewJSON,ViewRaw];ViewImage.regex=/^image\/(png|jpe?g|gif|vnc.microsoft.icon|x-icon)$/i,ViewImage.matches=function(e){return ViewImage.regex.test(_utils.MessageUtils.getContentType(e))},ViewImage.propTypes={flow:_react.PropTypes.object.isRequired,message:_react.PropTypes.object.isRequired},ViewRaw.textView=!0,ViewRaw.matches=function(){return!0},ViewRaw.propTypes={content:_react2["default"].PropTypes.string.isRequired},ViewJSON.textView=!0,ViewJSON.regex=/^application\/json$/i,ViewJSON.matches=function(e){return ViewJSON.regex.test(_utils.MessageUtils.getContentType(e))},ViewJSON.propTypes={content:_react2["default"].PropTypes.string.isRequired},ViewAuto.matches=function(){return!1},ViewAuto.findView=function(e){return views.find(function(t){return t.matches(e)})||views[views.length-1]},ViewAuto.propTypes={message:_react2["default"].PropTypes.object.isRequired,flow:_react2["default"].PropTypes.object.isRequired},exports["default"]=views; +},{"../../flow/utils.js":53,"jquery":"jquery","react":"react"}],5:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function ViewImage(e){var t=e.flow,i=e.message;return _react2.default.createElement("div",{className:"flowview-image"},_react2.default.createElement("img",{src:_utils.MessageUtils.getContentURL(t,i),alt:"preview",className:"img-thumbnail"}))}function ViewRaw(e){var t=e.content;return _react2.default.createElement("pre",null,t)}function ViewJSON(e){var t=e.content,i=t;try{i=JSON.stringify(JSON.parse(t),null,2)}catch(e){}return _react2.default.createElement("pre",null,i)}function ViewAuto(e){var t=e.message,i=e.flow,r=ViewAuto.findView(t);return r.textView?_react2.default.createElement(_ContentLoader2.default,{message:t,flow:i},_react2.default.createElement(r,{content:""})):_react2.default.createElement(r,{message:t,flow:i})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.ViewImage=ViewImage,exports.ViewRaw=ViewRaw,exports.ViewJSON=ViewJSON,exports.ViewAuto=ViewAuto;var _react=require("react"),_react2=_interopRequireDefault(_react),_ContentLoader=require("./ContentLoader"),_ContentLoader2=_interopRequireDefault(_ContentLoader),_utils=require("../../flow/utils.js"),views=[ViewAuto,ViewImage,ViewJSON,ViewRaw];ViewImage.regex=/^image\/(png|jpe?g|gif|vnc.microsoft.icon|x-icon)$/i,ViewImage.matches=function(e){return ViewImage.regex.test(_utils.MessageUtils.getContentType(e))},ViewImage.propTypes={flow:_react.PropTypes.object.isRequired,message:_react.PropTypes.object.isRequired},ViewRaw.textView=!0,ViewRaw.matches=function(){return!0},ViewRaw.propTypes={content:_react2.default.PropTypes.string.isRequired},ViewJSON.textView=!0,ViewJSON.regex=/^application\/json$/i,ViewJSON.matches=function(e){return ViewJSON.regex.test(_utils.MessageUtils.getContentType(e))},ViewJSON.propTypes={content:_react2.default.PropTypes.string.isRequired},ViewAuto.matches=function(){return!1},ViewAuto.findView=function(e){return views.find(function(t){return t.matches(e)})||views[views.length-1]},ViewAuto.propTypes={message:_react2.default.PropTypes.object.isRequired,flow:_react2.default.PropTypes.object.isRequired},exports.default=views; -},{"../../flow/utils.js":54,"./ContentLoader":4,"react":"react"}],6:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function ContentEmpty(e){var t=e.flow,n=e.message;return _react2["default"].createElement("div",{className:"alert alert-info",__self:this},"No ",t.request===n?"request":"response"," content.")}function ContentMissing(e){var t=e.flow,n=e.message;return _react2["default"].createElement("div",{className:"alert alert-info",__self:this},t.request===n?"Request":"Response"," content missing.")}function ContentTooLarge(e){var t=e.message,n=e.onClick;return _react2["default"].createElement("div",{className:"alert alert-warning",__self:this},_react2["default"].createElement("button",{onClick:n,className:"btn btn-xs btn-warning pull-right",__self:this},"Display anyway"),(0,_utils.formatSize)(t.contentLength)," content size.")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.ContentEmpty=ContentEmpty,exports.ContentMissing=ContentMissing,exports.ContentTooLarge=ContentTooLarge;var _react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../../utils.js"); +},{"../../flow/utils.js":53,"./ContentLoader":4,"react":"react"}],6:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function ContentEmpty(e){var t=e.flow,n=e.message;return _react2.default.createElement("div",{className:"alert alert-info"},"No ",t.request===n?"request":"response"," content.")}function ContentMissing(e){var t=e.flow,n=e.message;return _react2.default.createElement("div",{className:"alert alert-info"},t.request===n?"Request":"Response"," content missing.")}function ContentTooLarge(e){var t=e.message,n=e.onClick;return _react2.default.createElement("div",{className:"alert alert-warning"},_react2.default.createElement("button",{onClick:n,className:"btn btn-xs btn-warning pull-right"},"Display anyway"),(0,_utils.formatSize)(t.contentLength)," content size.")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.ContentEmpty=ContentEmpty,exports.ContentMissing=ContentMissing,exports.ContentTooLarge=ContentTooLarge;var _react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../../utils.js"); -},{"../../utils.js":55,"react":"react"}],7:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function ViewSelector(e){var t=this,r=e.active,a=e.message,n=e.onSelectView;return _react2["default"].createElement("div",{className:"view-selector btn-group btn-group-xs",__self:this},_ContentViews2["default"].map(function(e){return _react2["default"].createElement("button",{key:e.name,onClick:function(){return n(e)},className:(0,_classnames2["default"])("btn btn-default",{active:e===r}),__self:t},e===_ContentViews.ViewAuto?"auto: "+_ContentViews.ViewAuto.findView(a).name.toLowerCase().replace("view",""):e.name.toLowerCase().replace("view",""))}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=ViewSelector;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_ContentViews=require("./ContentViews"),_ContentViews2=_interopRequireDefault(_ContentViews);ViewSelector.propTypes={active:_react.PropTypes.func.isRequired,message:_react.PropTypes.object.isRequired,onSelectView:_react.PropTypes.func.isRequired}; +},{"../../utils.js":54,"react":"react"}],7:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function ViewSelector(e){var t=e.active,r=e.message,a=e.onSelectView;return _react2.default.createElement("div",{className:"view-selector btn-group btn-group-xs"},_ContentViews2.default.map(function(e){return _react2.default.createElement("button",{key:e.name,onClick:function(){return a(e.name)},className:(0,_classnames2.default)("btn btn-default",{active:e===t})},e===_ContentViews.ViewAuto?"auto: "+_ContentViews.ViewAuto.findView(r).name.toLowerCase().replace("view",""):e.name.toLowerCase().replace("view",""))}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=ViewSelector;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_ContentViews=require("./ContentViews"),_ContentViews2=_interopRequireDefault(_ContentViews);ViewSelector.propTypes={active:_react.PropTypes.func.isRequired,message:_react.PropTypes.object.isRequired,onSelectView:_react.PropTypes.func.isRequired}; },{"./ContentViews":5,"classnames":"classnames","react":"react"}],8:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_eventLog=require("../ducks/eventLog"),_ToggleButton=require("./common/ToggleButton"),_ToggleButton2=_interopRequireDefault(_ToggleButton),_EventList=require("./EventLog/EventList"),_EventList2=_interopRequireDefault(_EventList),EventLog=function(e){function t(e,r){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return n.state={height:n.props.defaultHeight},n.onDragStart=n.onDragStart.bind(n),n.onDragMove=n.onDragMove.bind(n),n.onDragStop=n.onDragStop.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"onDragStart",value:function(e){e.preventDefault(),this.dragStart=this.state.height+e.pageY,window.addEventListener("mousemove",this.onDragMove),window.addEventListener("mouseup",this.onDragStop),window.addEventListener("dragend",this.onDragStop)}},{key:"onDragMove",value:function(e){e.preventDefault(),this.setState({height:this.dragStart-e.pageY})}},{key:"onDragStop",value:function(e){e.preventDefault(),window.removeEventListener("mousemove",this.onDragMove)}},{key:"render",value:function(){var e=this,t=this.state.height,r=this.props,n=r.filters,o=r.events,a=r.toggleFilter,i=r.close;return _react2["default"].createElement("div",{className:"eventlog",style:{height:t},__self:this},_react2["default"].createElement("div",{onMouseDown:this.onDragStart,__self:this},"Eventlog",_react2["default"].createElement("div",{className:"pull-right",__self:this},["debug","info","web"].map(function(t){return _react2["default"].createElement(_ToggleButton2["default"],{key:t,text:t,checked:n[t],onToggle:function(){return a(t)},__self:e})}),_react2["default"].createElement("i",{onClick:i,className:"fa fa-close",__self:this}))),_react2["default"].createElement(_EventList2["default"],{events:o,__self:this}))}}]),t}(_react.Component);EventLog.propTypes={filters:_react.PropTypes.object.isRequired,events:_react.PropTypes.array.isRequired,toggleFilter:_react.PropTypes.func.isRequired,close:_react.PropTypes.func.isRequired,defaultHeight:_react.PropTypes.number},EventLog.defaultProps={defaultHeight:200},exports["default"]=(0,_reactRedux.connect)(function(e){return{filters:e.eventLog.filters,events:e.eventLog.view.data}},{close:_eventLog.toggleVisibility,toggleFilter:_eventLog.toggleFilter})(EventLog); +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_eventLog=require("../ducks/eventLog"),_ToggleButton=require("./common/ToggleButton"),_ToggleButton2=_interopRequireDefault(_ToggleButton),_EventList=require("./EventLog/EventList"),_EventList2=_interopRequireDefault(_EventList),EventLog=function(e){function t(e,r){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return n.state={height:n.props.defaultHeight},n.onDragStart=n.onDragStart.bind(n),n.onDragMove=n.onDragMove.bind(n),n.onDragStop=n.onDragStop.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"onDragStart",value:function(e){e.preventDefault(),this.dragStart=this.state.height+e.pageY,window.addEventListener("mousemove",this.onDragMove),window.addEventListener("mouseup",this.onDragStop),window.addEventListener("dragend",this.onDragStop)}},{key:"onDragMove",value:function(e){e.preventDefault(),this.setState({height:this.dragStart-e.pageY})}},{key:"onDragStop",value:function(e){e.preventDefault(),window.removeEventListener("mousemove",this.onDragMove)}},{key:"render",value:function(){var e=this.state.height,t=this.props,r=t.filters,n=t.events,o=t.toggleFilter,a=t.close;return _react2.default.createElement("div",{className:"eventlog",style:{height:e}},_react2.default.createElement("div",{onMouseDown:this.onDragStart},"Eventlog",_react2.default.createElement("div",{className:"pull-right"},["debug","info","web"].map(function(e){return _react2.default.createElement(_ToggleButton2.default,{key:e,text:e,checked:r[e],onToggle:function(){return o(e)}})}),_react2.default.createElement("i",{onClick:a,className:"fa fa-close"}))),_react2.default.createElement(_EventList2.default,{events:n}))}}]),t}(_react.Component);EventLog.propTypes={filters:_react.PropTypes.object.isRequired,events:_react.PropTypes.array.isRequired,toggleFilter:_react.PropTypes.func.isRequired,close:_react.PropTypes.func.isRequired,defaultHeight:_react.PropTypes.number},EventLog.defaultProps={defaultHeight:200},exports.default=(0,_reactRedux.connect)(function(e){return{filters:e.eventLog.filters,events:e.eventLog.view.data}},{close:_eventLog.toggleVisibility,toggleFilter:_eventLog.toggleFilter})(EventLog); },{"../ducks/eventLog":42,"./EventLog/EventList":9,"./common/ToggleButton":36,"react":"react","react-redux":"react-redux"}],9:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function LogIcon(e){var t=e.event,r={web:"html5",debug:"bug"}[t.level]||"info";return _react2["default"].createElement("i",{className:"fa fa-fw fa-"+r,__self:this})}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_shallowequal=require("shallowequal"),_shallowequal2=_interopRequireDefault(_shallowequal),_AutoScroll=require("../helpers/AutoScroll"),_AutoScroll2=_interopRequireDefault(_AutoScroll),_VirtualScroll=require("../helpers/VirtualScroll"),EventLogList=function(e){function t(e){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return r.heights={},r.state={vScroll:(0,_VirtualScroll.calcVScroll)()},r.onViewportUpdate=r.onViewportUpdate.bind(r),r}return _inherits(t,e),_createClass(t,[{key:"componentDidMount",value:function(){window.addEventListener("resize",this.onViewportUpdate),this.onViewportUpdate()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this.onViewportUpdate)}},{key:"componentDidUpdate",value:function(){this.onViewportUpdate()}},{key:"onViewportUpdate",value:function(){var e=this,t=_reactDom2["default"].findDOMNode(this),r=(0,_VirtualScroll.calcVScroll)({itemCount:this.props.events.length,rowHeight:this.props.rowHeight,viewportTop:t.scrollTop,viewportHeight:t.offsetHeight,itemHeights:this.props.events.map(function(t){return e.heights[t.id]})});(0,_shallowequal2["default"])(this.state.vScroll,r)||this.setState({vScroll:r})}},{key:"setHeight",value:function(e,t){if(t&&!this.heights[e]){var r=t.offsetHeight;this.heights[e]!==r&&(this.heights[e]=r,this.onViewportUpdate())}}},{key:"render",value:function(){var e=this,t=this.state.vScroll,r=this.props.events;return _react2["default"].createElement("pre",{onScroll:this.onViewportUpdate,__self:this},_react2["default"].createElement("div",{style:{height:t.paddingTop},__self:this}),r.slice(t.start,t.end).map(function(t){return _react2["default"].createElement("div",{key:t.id,ref:function(r){return e.setHeight(t.id,r)},__self:e},_react2["default"].createElement(LogIcon,{event:t,__self:e}),t.message)}),_react2["default"].createElement("div",{style:{height:t.paddingBottom},__self:this}))}}]),t}(_react.Component);EventLogList.propTypes={events:_react.PropTypes.array.isRequired,rowHeight:_react.PropTypes.number},EventLogList.defaultProps={rowHeight:18},exports["default"]=(0,_AutoScroll2["default"])(EventLogList); +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function LogIcon(e){var t=e.event,r={web:"html5",debug:"bug"}[t.level]||"info";return _react2.default.createElement("i",{className:"fa fa-fw fa-"+r})}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_shallowequal=require("shallowequal"),_shallowequal2=_interopRequireDefault(_shallowequal),_AutoScroll=require("../helpers/AutoScroll"),_AutoScroll2=_interopRequireDefault(_AutoScroll),_VirtualScroll=require("../helpers/VirtualScroll"),EventLogList=function(e){function t(e){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return r.heights={},r.state={vScroll:(0,_VirtualScroll.calcVScroll)()},r.onViewportUpdate=r.onViewportUpdate.bind(r),r}return _inherits(t,e),_createClass(t,[{key:"componentDidMount",value:function(){window.addEventListener("resize",this.onViewportUpdate),this.onViewportUpdate()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this.onViewportUpdate)}},{key:"componentDidUpdate",value:function(){this.onViewportUpdate()}},{key:"onViewportUpdate",value:function(){var e=this,t=_reactDom2.default.findDOMNode(this),r=(0,_VirtualScroll.calcVScroll)({itemCount:this.props.events.length,rowHeight:this.props.rowHeight,viewportTop:t.scrollTop,viewportHeight:t.offsetHeight,itemHeights:this.props.events.map(function(t){return e.heights[t.id]})});(0,_shallowequal2.default)(this.state.vScroll,r)||this.setState({vScroll:r})}},{key:"setHeight",value:function(e,t){if(t&&!this.heights[e]){var r=t.offsetHeight;this.heights[e]!==r&&(this.heights[e]=r,this.onViewportUpdate())}}},{key:"render",value:function(){var e=this,t=this.state.vScroll,r=this.props.events;return _react2.default.createElement("pre",{onScroll:this.onViewportUpdate},_react2.default.createElement("div",{style:{height:t.paddingTop}}),r.slice(t.start,t.end).map(function(t){return _react2.default.createElement("div",{key:t.id,ref:function(r){return e.setHeight(t.id,r)}},_react2.default.createElement(LogIcon,{event:t}),t.message)}),_react2.default.createElement("div",{style:{height:t.paddingBottom}}))}}]),t}(_react.Component);EventLogList.propTypes={events:_react.PropTypes.array.isRequired,rowHeight:_react.PropTypes.number},EventLogList.defaultProps={rowHeight:18},exports.default=(0,_AutoScroll2.default)(EventLogList); },{"../helpers/AutoScroll":38,"../helpers/VirtualScroll":39,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],10:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var o=0;o<t.length;o++){var r=t[o];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,o,r){return o&&e(t.prototype,o),r&&e(t,r),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_shallowequal=require("shallowequal"),_shallowequal2=_interopRequireDefault(_shallowequal),_AutoScroll=require("./helpers/AutoScroll"),_AutoScroll2=_interopRequireDefault(_AutoScroll),_VirtualScroll=require("./helpers/VirtualScroll"),_FlowTableHead=require("./FlowTable/FlowTableHead"),_FlowTableHead2=_interopRequireDefault(_FlowTableHead),_FlowRow=require("./FlowTable/FlowRow"),_FlowRow2=_interopRequireDefault(_FlowRow),_filt=require("../filt/filt"),_filt2=_interopRequireDefault(_filt),FlowTable=function(e){function t(e,o){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,o));return r.state={vScroll:(0,_VirtualScroll.calcVScroll)()},r.onViewportUpdate=r.onViewportUpdate.bind(r),r}return _inherits(t,e),_createClass(t,[{key:"componentWillMount",value:function(){window.addEventListener("resize",this.onViewportUpdate)}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this.onViewportUpdate)}},{key:"componentDidUpdate",value:function(){if(this.onViewportUpdate(),this.shouldScrollIntoView){this.shouldScrollIntoView=!1;var e=this.props,t=e.rowHeight,o=e.flows,r=e.selected,l=_reactDom2["default"].findDOMNode(this),i=_reactDom2["default"].findDOMNode(this.refs.head),a=i?i.offsetHeight:0,n=o.indexOf(r)*t+a,s=n+t,c=l.scrollTop,u=l.offsetHeight;n-a<c?l.scrollTop=n-a:s>c+u&&(l.scrollTop=s-u)}}},{key:"componentWillReceiveProps",value:function(e){e.selected&&e.selected!==this.props.selected&&(this.shouldScrollIntoView=!0)}},{key:"onViewportUpdate",value:function(){var e=_reactDom2["default"].findDOMNode(this),t=e.scrollTop,o=(0,_VirtualScroll.calcVScroll)({viewportTop:t,viewportHeight:e.offsetHeight,itemCount:this.props.flows.length,rowHeight:this.props.rowHeight});this.state.viewportTop===t&&(0,_shallowequal2["default"])(this.state.vScroll,o)||this.setState({vScroll:o,viewportTop:t})}},{key:"render",value:function(){var e=this,t=this.state,o=t.vScroll,r=t.viewportTop,l=this.props,i=l.flows,a=l.selected,n=l.highlight,s=n?_filt2["default"].parse(n):function(){return!1};return _react2["default"].createElement("div",{className:"flow-table",onScroll:this.onViewportUpdate,__self:this},_react2["default"].createElement("table",{__self:this},_react2["default"].createElement("thead",{ref:"head",style:{transform:"translateY("+r+"px)"},__self:this},_react2["default"].createElement(_FlowTableHead2["default"],{__self:this})),_react2["default"].createElement("tbody",{__self:this},_react2["default"].createElement("tr",{style:{height:o.paddingTop},__self:this}),i.slice(o.start,o.end).map(function(t){return _react2["default"].createElement(_FlowRow2["default"],{key:t.id,flow:t,selected:t===a,highlighted:s(t),onSelect:e.props.onSelect,__self:e})}),_react2["default"].createElement("tr",{style:{height:o.paddingBottom},__self:this}))))}}]),t}(_react2["default"].Component);FlowTable.propTypes={onSelect:_react.PropTypes.func.isRequired,flows:_react.PropTypes.array.isRequired,rowHeight:_react.PropTypes.number,highlight:_react.PropTypes.string,selected:_react.PropTypes.object},FlowTable.defaultProps={rowHeight:32},exports["default"]=(0,_AutoScroll2["default"])(FlowTable); +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var o=0;o<t.length;o++){var r=t[o];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,o,r){return o&&e(t.prototype,o),r&&e(t,r),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_shallowequal=require("shallowequal"),_shallowequal2=_interopRequireDefault(_shallowequal),_AutoScroll=require("./helpers/AutoScroll"),_AutoScroll2=_interopRequireDefault(_AutoScroll),_VirtualScroll=require("./helpers/VirtualScroll"),_FlowTableHead=require("./FlowTable/FlowTableHead"),_FlowTableHead2=_interopRequireDefault(_FlowTableHead),_FlowRow=require("./FlowTable/FlowRow"),_FlowRow2=_interopRequireDefault(_FlowRow),_filt=require("../filt/filt"),_filt2=_interopRequireDefault(_filt),FlowTable=function(e){function t(e,o){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,o));return r.state={vScroll:(0,_VirtualScroll.calcVScroll)()},r.onViewportUpdate=r.onViewportUpdate.bind(r),r}return _inherits(t,e),_createClass(t,[{key:"componentWillMount",value:function(){window.addEventListener("resize",this.onViewportUpdate)}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this.onViewportUpdate)}},{key:"componentDidUpdate",value:function(){if(this.onViewportUpdate(),this.shouldScrollIntoView){this.shouldScrollIntoView=!1;var e=this.props,t=e.rowHeight,o=e.flows,r=e.selected,l=_reactDom2.default.findDOMNode(this),a=_reactDom2.default.findDOMNode(this.refs.head),i=a?a.offsetHeight:0,n=o.indexOf(r)*t+i,u=n+t,c=l.scrollTop,s=l.offsetHeight;n-i<c?l.scrollTop=n-i:u>c+s&&(l.scrollTop=u-s)}}},{key:"componentWillReceiveProps",value:function(e){e.selected&&e.selected!==this.props.selected&&(this.shouldScrollIntoView=!0)}},{key:"onViewportUpdate",value:function(){var e=_reactDom2.default.findDOMNode(this),t=e.scrollTop,o=(0,_VirtualScroll.calcVScroll)({viewportTop:t,viewportHeight:e.offsetHeight,itemCount:this.props.flows.length,rowHeight:this.props.rowHeight});this.state.viewportTop===t&&(0,_shallowequal2.default)(this.state.vScroll,o)||this.setState({vScroll:o,viewportTop:t})}},{key:"render",value:function(){var e=this,t=this.state,o=t.vScroll,r=t.viewportTop,l=this.props,a=l.flows,i=l.selected,n=l.highlight,u=n?_filt2.default.parse(n):function(){return!1};return _react2.default.createElement("div",{className:"flow-table",onScroll:this.onViewportUpdate},_react2.default.createElement("table",null,_react2.default.createElement("thead",{ref:"head",style:{transform:"translateY("+r+"px)"}},_react2.default.createElement(_FlowTableHead2.default,null)),_react2.default.createElement("tbody",null,_react2.default.createElement("tr",{style:{height:o.paddingTop}}),a.slice(o.start,o.end).map(function(t){return _react2.default.createElement(_FlowRow2.default,{key:t.id,flow:t,selected:t===i,highlighted:u(t),onSelect:e.props.onSelect})}),_react2.default.createElement("tr",{style:{height:o.paddingBottom}}))))}}]),t}(_react2.default.Component);FlowTable.propTypes={onSelect:_react.PropTypes.func.isRequired,flows:_react.PropTypes.array.isRequired,rowHeight:_react.PropTypes.number,highlight:_react.PropTypes.string,selected:_react.PropTypes.object},FlowTable.defaultProps={rowHeight:32},exports.default=(0,_AutoScroll2.default)(FlowTable); -},{"../filt/filt":53,"./FlowTable/FlowRow":12,"./FlowTable/FlowTableHead":13,"./helpers/AutoScroll":38,"./helpers/VirtualScroll":39,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],11:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function TLSColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:(0,_classnames2["default"])("col-tls","https"===t.request.scheme?"col-tls-https":"col-tls-http"),__self:this})}function IconColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-icon",__self:this},_react2["default"].createElement("div",{className:(0,_classnames2["default"])("resource-icon",IconColumn.getIcon(t)),__self:this}))}function PathColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-path",__self:this},t.request.is_replay&&_react2["default"].createElement("i",{className:"fa fa-fw fa-repeat pull-right",__self:this}),t.intercepted&&_react2["default"].createElement("i",{className:"fa fa-fw fa-pause pull-right",__self:this}),_utils.RequestUtils.pretty_url(t.request))}function MethodColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-method",__self:this},t.request.method)}function StatusColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-status",__self:this},t.response&&t.response.status_code)}function SizeColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-size",__self:this},(0,_utils2.formatSize)(SizeColumn.getTotalSize(t)))}function TimeColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-time",__self:this},t.response?(0,_utils2.formatTimeDelta)(1e3*(t.response.timestamp_end-t.request.timestamp_start)):"...")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.TLSColumn=TLSColumn,exports.IconColumn=IconColumn,exports.PathColumn=PathColumn,exports.MethodColumn=MethodColumn,exports.StatusColumn=StatusColumn,exports.SizeColumn=SizeColumn,exports.TimeColumn=TimeColumn;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_utils=require("../../flow/utils.js"),_utils2=require("../../utils.js");TLSColumn.headerClass="col-tls",TLSColumn.headerName="",IconColumn.headerClass="col-icon",IconColumn.headerName="",IconColumn.getIcon=function(e){if(!e.response)return"resource-icon-plain";var t=_utils.ResponseUtils.getContentType(e.response)||"";return 304===e.response.status_code?"resource-icon-not-modified":300<=e.response.status_code&&e.response.status_code<400?"resource-icon-redirect":t.indexOf("image")>=0?"resource-icon-image":t.indexOf("javascript")>=0?"resource-icon-js":t.indexOf("css")>=0?"resource-icon-css":t.indexOf("html")>=0?"resource-icon-document":"resource-icon-plain"},PathColumn.headerClass="col-path",PathColumn.headerName="Path",MethodColumn.headerClass="col-method",MethodColumn.headerName="Method",StatusColumn.headerClass="col-status",StatusColumn.headerName="Status",SizeColumn.getTotalSize=function(e){var t=e.request.contentLength;return e.response&&(t+=e.response.contentLength||0),t},SizeColumn.headerClass="col-size",SizeColumn.headerName="Size",TimeColumn.headerClass="col-time",TimeColumn.headerName="Time",exports["default"]=[TLSColumn,IconColumn,PathColumn,MethodColumn,StatusColumn,SizeColumn,TimeColumn]; +},{"../filt/filt":52,"./FlowTable/FlowRow":12,"./FlowTable/FlowTableHead":13,"./helpers/AutoScroll":38,"./helpers/VirtualScroll":39,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],11:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function TLSColumn(e){var t=e.flow;return _react2.default.createElement("td",{className:(0,_classnames2.default)("col-tls","https"===t.request.scheme?"col-tls-https":"col-tls-http")})}function IconColumn(e){var t=e.flow;return _react2.default.createElement("td",{className:"col-icon"},_react2.default.createElement("div",{className:(0,_classnames2.default)("resource-icon",IconColumn.getIcon(t))}))}function PathColumn(e){var t=e.flow;return _react2.default.createElement("td",{className:"col-path"},t.request.is_replay&&_react2.default.createElement("i",{className:"fa fa-fw fa-repeat pull-right"}),t.intercepted&&_react2.default.createElement("i",{className:"fa fa-fw fa-pause pull-right"}),_utils.RequestUtils.pretty_url(t.request))}function MethodColumn(e){var t=e.flow;return _react2.default.createElement("td",{className:"col-method"},t.request.method)}function StatusColumn(e){var t=e.flow;return _react2.default.createElement("td",{className:"col-status"},t.response&&t.response.status_code)}function SizeColumn(e){var t=e.flow;return _react2.default.createElement("td",{className:"col-size"},(0,_utils2.formatSize)(SizeColumn.getTotalSize(t)))}function TimeColumn(e){var t=e.flow;return _react2.default.createElement("td",{className:"col-time"},t.response?(0,_utils2.formatTimeDelta)(1e3*(t.response.timestamp_end-t.request.timestamp_start)):"...")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.TLSColumn=TLSColumn,exports.IconColumn=IconColumn,exports.PathColumn=PathColumn,exports.MethodColumn=MethodColumn,exports.StatusColumn=StatusColumn,exports.SizeColumn=SizeColumn,exports.TimeColumn=TimeColumn;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_utils=require("../../flow/utils.js"),_utils2=require("../../utils.js");TLSColumn.headerClass="col-tls",TLSColumn.headerName="",IconColumn.headerClass="col-icon",IconColumn.headerName="",IconColumn.getIcon=function(e){if(!e.response)return"resource-icon-plain";var t=_utils.ResponseUtils.getContentType(e.response)||"";return 304===e.response.status_code?"resource-icon-not-modified":300<=e.response.status_code&&e.response.status_code<400?"resource-icon-redirect":t.indexOf("image")>=0?"resource-icon-image":t.indexOf("javascript")>=0?"resource-icon-js":t.indexOf("css")>=0?"resource-icon-css":t.indexOf("html")>=0?"resource-icon-document":"resource-icon-plain"},PathColumn.headerClass="col-path",PathColumn.headerName="Path",MethodColumn.headerClass="col-method",MethodColumn.headerName="Method",StatusColumn.headerClass="col-status",StatusColumn.headerName="Status",SizeColumn.getTotalSize=function(e){var t=e.request.contentLength;return e.response&&(t+=e.response.contentLength||0),t},SizeColumn.headerClass="col-size",SizeColumn.headerName="Size",TimeColumn.headerClass="col-time",TimeColumn.headerName="Time",exports.default=[TLSColumn,IconColumn,PathColumn,MethodColumn,StatusColumn,SizeColumn,TimeColumn]; -},{"../../flow/utils.js":54,"../../utils.js":55,"classnames":"classnames","react":"react"}],12:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowRow(e){var t=this,r=e.flow,l=e.selected,s=e.highlighted,o=e.onSelect,a=(0,_classnames2["default"])({selected:l,highlighted:s,intercepted:r.intercepted,"has-request":r.request,"has-response":r.response});return _react2["default"].createElement("tr",{className:a,onClick:function(){return o(r)},__self:this},_FlowColumns2["default"].map(function(e){return _react2["default"].createElement(e,{key:e.name,flow:r,__self:t})}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=FlowRow;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns);FlowRow.propTypes={onSelect:_react.PropTypes.func.isRequired,flow:_react.PropTypes.object.isRequired,highlighted:_react.PropTypes.bool,selected:_react.PropTypes.bool}; +},{"../../flow/utils.js":53,"../../utils.js":54,"classnames":"classnames","react":"react"}],12:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function FlowRow(e){var t=e.flow,r=e.selected,l=e.highlighted,o=e.onSelect,s=(0,_classnames2.default)({selected:r,highlighted:l,intercepted:t.intercepted,"has-request":t.request,"has-response":t.response});return _react2.default.createElement("tr",{className:s,onClick:function(){return o(t)}},_FlowColumns2.default.map(function(e){return _react2.default.createElement(e,{key:e.name,flow:t})}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=FlowRow;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns);FlowRow.propTypes={onSelect:_react.PropTypes.func.isRequired,flow:_react.PropTypes.object.isRequired,highlighted:_react.PropTypes.bool,selected:_react.PropTypes.bool}; },{"./FlowColumns":11,"classnames":"classnames","react":"react"}],13:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowTableHead(e){var r=this,t=e.sortColumn,a=e.sortDesc,s=e.updateSort,o=a?"sort-desc":"sort-asc";return _react2["default"].createElement("tr",{__self:this},_FlowColumns2["default"].map(function(e){return _react2["default"].createElement("th",{className:(0,_classnames2["default"])(e.headerClass,t===e.name&&o),key:e.name,onClick:function(){return s(e.name,e.name===t&&!a)},__self:r},e.headerName)}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns),_main=require("../../ducks/views/main");FlowTableHead.propTypes={updateSort:_react.PropTypes.func.isRequired,sortDesc:_react2["default"].PropTypes.bool.isRequired,sortColumn:_react2["default"].PropTypes.string},exports["default"]=(0,_reactRedux.connect)(function(e){return{sortDesc:e.flows.views.main.sort.desc,sortColumn:e.flows.views.main.sort.column}},{updateSort:_main.updateSort})(FlowTableHead); +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function FlowTableHead(e){var r=e.sortColumn,t=e.sortDesc,a=e.updateSort,o=t?"sort-desc":"sort-asc";return _react2.default.createElement("tr",null,_FlowColumns2.default.map(function(e){return _react2.default.createElement("th",{className:(0,_classnames2.default)(e.headerClass,r===e.name&&o),key:e.name,onClick:function(){return a(e.name,e.name===r&&!t)}},e.headerName)}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns),_flowView=require("../../ducks/flowView");FlowTableHead.propTypes={updateSort:_react.PropTypes.func.isRequired,sortDesc:_react2.default.PropTypes.bool.isRequired,sortColumn:_react2.default.PropTypes.string},exports.default=(0,_reactRedux.connect)(function(e){return{sortDesc:e.flowView.sort.desc,sortColumn:e.flowView.sort.column}},{updateSort:_flowView.updateSort})(FlowTableHead); -},{"../../ducks/views/main":51,"./FlowColumns":11,"classnames":"classnames","react":"react","react-redux":"react-redux"}],14:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},_createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_Nav=require("./FlowView/Nav"),_Nav2=_interopRequireDefault(_Nav),_Messages=require("./FlowView/Messages"),_Details=require("./FlowView/Details"),_Details2=_interopRequireDefault(_Details),_Prompt=require("./Prompt"),_Prompt2=_interopRequireDefault(_Prompt),FlowView=function(e){function t(e,r){_classCallCheck(this,t);var o=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return o.state={prompt:!1},o.closePrompt=o.closePrompt.bind(o),o.selectTab=o.selectTab.bind(o),o}return _inherits(t,e),_createClass(t,[{key:"getTabs",value:function(){var e=this;return["request","response","error"].filter(function(t){return e.props.flow[t]}).concat(["details"])}},{key:"nextTab",value:function(e){var t=this.getTabs();this.selectTab(t[(t.indexOf(this.props.tab)+e+t.length)%t.length])}},{key:"selectTab",value:function(e){this.props.updateLocation("/flows/"+this.props.flow.id+"/"+e)}},{key:"closePrompt",value:function(e){this.setState({prompt:!1}),e&&this.tabComponent&&this.tabComponent.edit(e)}},{key:"promptEdit",value:function(){var e=void 0;switch(this.props.tab){case"request":e=["method","url",{text:"http version",key:"v"},"header"];break;case"response":e=[{text:"http version",key:"v"},"code","message","header"];break;case"details":return;default:throw"Unknown tab for edit: "+this.props.tab}this.setState({prompt:{options:e,done:this.closePrompt}})}},{key:"render",value:function(){var e=this,r=this.getTabs(),o=this.props,s=o.flow,a=o.tab,n=o.updateFlow;r.indexOf(a)<0&&(a="response"===a&&s.error?"error":"error"===a&&s.response?"response":r[0]);var i=t.allTabs[_lodash2["default"].capitalize(a)];return _react2["default"].createElement("div",{className:"flow-detail",onScroll:this.adjustHead,__self:this},_react2["default"].createElement(_Nav2["default"],{flow:s,tabs:r,active:a,onSelectTab:this.selectTab,__self:this}),_react2["default"].createElement(i,{ref:function(t){return e.tabComponent=t},flow:s,updateFlow:n,__self:this}),this.state.prompt&&_react2["default"].createElement(_Prompt2["default"],_extends({},this.state.prompt,{__self:this})))}}]),t}(_react.Component);FlowView.allTabs={Request:_Messages.Request,Response:_Messages.Response,Error:_Messages.ErrorView,Details:_Details2["default"]},exports["default"]=FlowView; +},{"../../ducks/flowView":43,"./FlowColumns":11,"classnames":"classnames","react":"react","react-redux":"react-redux"}],14:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_Nav=require("./FlowView/Nav"),_Nav2=_interopRequireDefault(_Nav),_Messages=require("./FlowView/Messages"),_Details=require("./FlowView/Details"),_Details2=_interopRequireDefault(_Details),_Prompt=require("./Prompt"),_Prompt2=_interopRequireDefault(_Prompt),_ui=require("../ducks/ui"),FlowView=function(e){function t(e,r){_classCallCheck(this,t);var o=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return o.onPromptFinish=o.onPromptFinish.bind(o),o}return _inherits(t,e),_createClass(t,[{key:"onPromptFinish",value:function(e){this.props.setPrompt(!1),e&&this.tabComponent&&this.tabComponent.edit(e)}},{key:"getPromptOptions",value:function(){switch(this.props.tab){case"request":return["method","url",{text:"http version",key:"v"},"header"];case"response":return[{text:"http version",key:"v"},"code","message","header"];case"details":return;default:throw"Unknown tab for edit: "+this.props.tab}}},{key:"render",value:function(){var e=this,r=this.props,o=r.flow,n=r.tab,s=r.updateFlow,a=["request","response","error"].filter(function(e){return o[e]}).concat(["details"]);a.indexOf(n)<0&&(n="response"===n&&o.error?"error":"error"===n&&o.response?"response":a[0]);var i=t.allTabs[_lodash2.default.capitalize(n)];return _react2.default.createElement("div",{className:"flow-detail",onScroll:this.adjustHead},_react2.default.createElement(_Nav2.default,{flow:o,tabs:a,active:n,onSelectTab:this.props.selectTab}),_react2.default.createElement(i,{ref:function(t){return e.tabComponent=t},flow:o,updateFlow:s}),this.props.promptOpen&&_react2.default.createElement(_Prompt2.default,{options:this.getPromptOptions(),done:this.onPromptFinish}))}}]),t}(_react.Component);FlowView.allTabs={Request:_Messages.Request,Response:_Messages.Response,Error:_Messages.ErrorView,Details:_Details2.default},exports.default=FlowView,exports.default=(0,_reactRedux.connect)(function(e){return{promptOpen:e.ui.promptOpen}},{setPrompt:_ui.setPrompt,selectTab:_ui.selectTab})(FlowView); -},{"./FlowView/Details":15,"./FlowView/Messages":17,"./FlowView/Nav":18,"./Prompt":29,"lodash":"lodash","react":"react"}],15:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function TimeStamp(e){var t=e.t,a=e.deltaTo,r=e.title;return t?_react2["default"].createElement("tr",{__self:this},_react2["default"].createElement("td",{__self:this},r,":"),_react2["default"].createElement("td",{__self:this},(0,_utils.formatTimeStamp)(t),a&&_react2["default"].createElement("span",{className:"text-muted",__self:this},"(",(0,_utils.formatTimeDelta)(1e3*(t-a)),")"))):_react2["default"].createElement("tr",{__self:this})}function ConnectionInfo(e){var t=e.conn;return _react2["default"].createElement("table",{className:"connection-table",__self:this},_react2["default"].createElement("tbody",{__self:this},_react2["default"].createElement("tr",{key:"address",__self:this},_react2["default"].createElement("td",{__self:this},"Address:"),_react2["default"].createElement("td",{__self:this},t.address.address.join(":"))),t.sni&&_react2["default"].createElement("tr",{key:"sni",__self:this},_react2["default"].createElement("td",{__self:this},_react2["default"].createElement("abbr",{title:"TLS Server Name Indication",__self:this},"TLS SNI:")),_react2["default"].createElement("td",{__self:this},t.sni))))}function CertificateInfo(e){var t=e.flow;return _react2["default"].createElement("div",{__self:this},t.client_conn.cert&&[_react2["default"].createElement("h4",{key:"name",__self:this},"Client Certificate"),_react2["default"].createElement("pre",{key:"value",style:{maxHeight:100},__self:this},t.client_conn.cert)],t.server_conn.cert&&[_react2["default"].createElement("h4",{key:"name",__self:this},"Server Certificate"),_react2["default"].createElement("pre",{key:"value",style:{maxHeight:100},__self:this},t.server_conn.cert)])}function Timing(e){var t=this,a=e.flow,r=a.server_conn,n=a.client_conn,l=a.request,s=a.response,i=[{title:"Server conn. initiated",t:r.timestamp_start,deltaTo:l.timestamp_start},{title:"Server conn. TCP handshake",t:r.timestamp_tcp_setup,deltaTo:l.timestamp_start},{title:"Server conn. SSL handshake",t:r.timestamp_ssl_setup,deltaTo:l.timestamp_start},{title:"Client conn. established",t:n.timestamp_start,deltaTo:l.timestamp_start},{title:"Client conn. SSL handshake",t:n.timestamp_ssl_setup,deltaTo:l.timestamp_start},{title:"First request byte",t:l.timestamp_start},{title:"Request complete",t:l.timestamp_end,deltaTo:l.timestamp_start},s&&{title:"First response byte",t:s.timestamp_start,deltaTo:l.timestamp_start},s&&{title:"Response complete",t:s.timestamp_end,deltaTo:l.timestamp_start}];return _react2["default"].createElement("div",{__self:this},_react2["default"].createElement("h4",{__self:this},"Timing"),_react2["default"].createElement("table",{className:"timing-table",__self:this},_react2["default"].createElement("tbody",{__self:this},i.filter(function(e){return e}).sort(function(e,t){return e.t-t.t}).map(function(e){return _react2["default"].createElement(TimeStamp,_extends({key:e.title},e,{__self:t}))}))))}function Details(e){var t=e.flow;return _react2["default"].createElement("section",{__self:this},_react2["default"].createElement("h4",{__self:this},"Client Connection"),_react2["default"].createElement(ConnectionInfo,{conn:t.client_conn,__self:this}),_react2["default"].createElement("h4",{__self:this},"Server Connection"),_react2["default"].createElement(ConnectionInfo,{conn:t.server_conn,__self:this}),_react2["default"].createElement(CertificateInfo,{flow:t,__self:this}),_react2["default"].createElement(Timing,{flow:t,__self:this}))}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var r in a)Object.prototype.hasOwnProperty.call(a,r)&&(e[r]=a[r])}return e};exports.TimeStamp=TimeStamp,exports.ConnectionInfo=ConnectionInfo,exports.CertificateInfo=CertificateInfo,exports.Timing=Timing,exports["default"]=Details;var _react=require("react"),_react2=_interopRequireDefault(_react),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../../utils.js"); +},{"../ducks/ui":48,"./FlowView/Details":15,"./FlowView/Messages":17,"./FlowView/Nav":18,"./Prompt":29,"lodash":"lodash","react":"react","react-redux":"react-redux"}],15:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function TimeStamp(e){var t=e.t,a=e.deltaTo,n=e.title;return t?_react2.default.createElement("tr",null,_react2.default.createElement("td",null,n,":"),_react2.default.createElement("td",null,(0,_utils.formatTimeStamp)(t),a&&_react2.default.createElement("span",{className:"text-muted"},"(",(0,_utils.formatTimeDelta)(1e3*(t-a)),")"))):_react2.default.createElement("tr",null)}function ConnectionInfo(e){var t=e.conn;return _react2.default.createElement("table",{className:"connection-table"},_react2.default.createElement("tbody",null,_react2.default.createElement("tr",{key:"address"},_react2.default.createElement("td",null,"Address:"),_react2.default.createElement("td",null,t.address.address.join(":"))),t.sni&&_react2.default.createElement("tr",{key:"sni"},_react2.default.createElement("td",null,_react2.default.createElement("abbr",{title:"TLS Server Name Indication"},"TLS SNI:")),_react2.default.createElement("td",null,t.sni))))}function CertificateInfo(e){var t=e.flow;return _react2.default.createElement("div",null,t.client_conn.cert&&[_react2.default.createElement("h4",{key:"name"},"Client Certificate"),_react2.default.createElement("pre",{key:"value",style:{maxHeight:100}},t.client_conn.cert)],t.server_conn.cert&&[_react2.default.createElement("h4",{key:"name"},"Server Certificate"),_react2.default.createElement("pre",{key:"value",style:{maxHeight:100}},t.server_conn.cert)])}function Timing(e){var t=e.flow,a=t.server_conn,n=t.client_conn,r=t.request,l=t.response,c=[{title:"Server conn. initiated",t:a.timestamp_start,deltaTo:r.timestamp_start},{title:"Server conn. TCP handshake",t:a.timestamp_tcp_setup,deltaTo:r.timestamp_start},{title:"Server conn. SSL handshake",t:a.timestamp_ssl_setup,deltaTo:r.timestamp_start},{title:"Client conn. established",t:n.timestamp_start,deltaTo:r.timestamp_start},{title:"Client conn. SSL handshake",t:n.timestamp_ssl_setup,deltaTo:r.timestamp_start},{title:"First request byte",t:r.timestamp_start},{title:"Request complete",t:r.timestamp_end,deltaTo:r.timestamp_start},l&&{title:"First response byte",t:l.timestamp_start,deltaTo:r.timestamp_start},l&&{title:"Response complete",t:l.timestamp_end,deltaTo:r.timestamp_start}];return _react2.default.createElement("div",null,_react2.default.createElement("h4",null,"Timing"),_react2.default.createElement("table",{className:"timing-table"},_react2.default.createElement("tbody",null,c.filter(function(e){return e}).sort(function(e,t){return e.t-t.t}).map(function(e){return _react2.default.createElement(TimeStamp,_extends({key:e.title},e))}))))}function Details(e){var t=e.flow;return _react2.default.createElement("section",null,_react2.default.createElement("h4",null,"Client Connection"),_react2.default.createElement(ConnectionInfo,{conn:t.client_conn}),_react2.default.createElement("h4",null,"Server Connection"),_react2.default.createElement(ConnectionInfo,{conn:t.server_conn}),_react2.default.createElement(CertificateInfo,{flow:t}),_react2.default.createElement(Timing,{flow:t}))}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e};exports.TimeStamp=TimeStamp,exports.ConnectionInfo=ConnectionInfo,exports.CertificateInfo=CertificateInfo,exports.Timing=Timing,exports.default=Details;var _react=require("react"),_react2=_interopRequireDefault(_react),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../../utils.js"); -},{"../../utils.js":55,"lodash":"lodash","react":"react"}],16:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_ValueEditor=require("../ValueEditor"),_ValueEditor2=_interopRequireDefault(_ValueEditor),_utils=require("../../utils.js"),HeaderEditor=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){return _react2["default"].createElement(_ValueEditor2["default"],_extends({ref:"input"},this.props,{onKeyDown:this.onKeyDown,inline:!0,__self:this}))}},{key:"focus",value:function(){_reactDom2["default"].findDOMNode(this).focus()}},{key:"onKeyDown",value:function(e){switch(e.keyCode){case _utils.Key.BACKSPACE:var t=window.getSelection().getRangeAt(0);0===t.startOffset&&0===t.endOffset&&this.props.onRemove(e);break;case _utils.Key.TAB:e.shiftKey||this.props.onTab(e)}}}]),t}(_react.Component),Headers=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"onChange",value:function(e,t,r){var n=_.cloneDeep(this.props.message.headers);n[e][t]=r,n[e][0]||n[e][1]||(1===n.length?(n[0][0]="Name",n[0][1]="Value"):(n.splice(e,1),e===n.length&&(this._nextSel=e-1+"-value"))),this.props.onChange(n)}},{key:"edit",value:function(){this.refs["0-key"].focus()}},{key:"onTab",value:function(e,t,r){var n=this.props.message.headers;if(e===n.length-1&&1===t){r.preventDefault();var o=_.cloneDeep(this.props.message.headers);o.push(["Name","Value"]),this.props.onChange(o),this._nextSel=e+1+"-key"}}},{key:"componentDidUpdate",value:function(){this._nextSel&&this.refs[this._nextSel]&&(this.refs[this._nextSel].focus(),this._nextSel=void 0)}},{key:"onRemove",value:function(e,t,r){1===t?(r.preventDefault(),this.refs[e+"-key"].focus()):e>0&&(r.preventDefault(),this.refs[e-1+"-value"].focus())}},{key:"render",value:function(){var e=this,t=this.props.message;return _react2["default"].createElement("table",{className:"header-table",__self:this},_react2["default"].createElement("tbody",{__self:this},t.headers.map(function(t,r){return _react2["default"].createElement("tr",{key:r,__self:e},_react2["default"].createElement("td",{className:"header-name",__self:e},_react2["default"].createElement(HeaderEditor,{ref:r+"-key",content:t[0],onDone:function(t){return e.onChange(r,0,t)},onRemove:function(t){return e.onRemove(r,0,t)},onTab:function(t){return e.onTab(r,0,t)},__self:e}),":"),_react2["default"].createElement("td",{className:"header-value",__self:e},_react2["default"].createElement(HeaderEditor,{ref:r+"-value",content:t[1],onDone:function(t){return e.onChange(r,1,t)},onRemove:function(t){return e.onRemove(r,1,t)},onTab:function(t){return e.onTab(r,1,t)},__self:e})))})))}}]),t}(_react.Component);Headers.propTypes={onChange:_react.PropTypes.func.isRequired,message:_react.PropTypes.object.isRequired},exports["default"]=Headers; +},{"../../utils.js":54,"lodash":"lodash","react":"react"}],16:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_ValueEditor=require("../ValueEditor"),_ValueEditor2=_interopRequireDefault(_ValueEditor),_utils=require("../../utils.js"),HeaderEditor=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){return _react2.default.createElement(_ValueEditor2.default,_extends({ref:"input"},this.props,{onKeyDown:this.onKeyDown,inline:!0}))}},{key:"focus",value:function(){_reactDom2.default.findDOMNode(this).focus()}},{key:"onKeyDown",value:function(e){switch(e.keyCode){case _utils.Key.BACKSPACE:var t=window.getSelection().getRangeAt(0);0===t.startOffset&&0===t.endOffset&&this.props.onRemove(e);break;case _utils.Key.TAB:e.shiftKey||this.props.onTab(e)}}}]),t}(_react.Component),Headers=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"onChange",value:function(e,t,r){var n=_.cloneDeep(this.props.message.headers);n[e][t]=r,n[e][0]||n[e][1]||(1===n.length?(n[0][0]="Name",n[0][1]="Value"):(n.splice(e,1),e===n.length&&(this._nextSel=e-1+"-value"))),this.props.onChange(n)}},{key:"edit",value:function(){this.refs["0-key"].focus()}},{key:"onTab",value:function(e,t,r){var n=this.props.message.headers;if(e===n.length-1&&1===t){r.preventDefault();var o=_.cloneDeep(this.props.message.headers);o.push(["Name","Value"]),this.props.onChange(o),this._nextSel=e+1+"-key"}}},{key:"componentDidUpdate",value:function(){this._nextSel&&this.refs[this._nextSel]&&(this.refs[this._nextSel].focus(),this._nextSel=void 0)}},{key:"onRemove",value:function(e,t,r){1===t?(r.preventDefault(),this.refs[e+"-key"].focus()):e>0&&(r.preventDefault(),this.refs[e-1+"-value"].focus())}},{key:"render",value:function(){var e=this,t=this.props.message;return _react2.default.createElement("table",{className:"header-table"},_react2.default.createElement("tbody",null,t.headers.map(function(t,r){return _react2.default.createElement("tr",{key:r},_react2.default.createElement("td",{className:"header-name"},_react2.default.createElement(HeaderEditor,{ref:r+"-key",content:t[0],onDone:function(t){return e.onChange(r,0,t)},onRemove:function(t){return e.onRemove(r,0,t)},onTab:function(t){return e.onTab(r,0,t)}}),":"),_react2.default.createElement("td",{className:"header-value"},_react2.default.createElement(HeaderEditor,{ref:r+"-value",content:t[1],onDone:function(t){return e.onChange(r,1,t)},onRemove:function(t){return e.onRemove(r,1,t)},onTab:function(t){return e.onTab(r,1,t)}})))})))}}]),t}(_react.Component);Headers.propTypes={onChange:_react.PropTypes.func.isRequired,message:_react.PropTypes.object.isRequired},exports.default=Headers; -},{"../../utils.js":55,"../ValueEditor":31,"react":"react","react-dom":"react-dom"}],17:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function ErrorView(e){var t=e.flow;return _react2["default"].createElement("section",{__self:this},_react2["default"].createElement("div",{className:"alert alert-warning",__self:this},t.error.msg,_react2["default"].createElement("div",{__self:this},_react2["default"].createElement("small",{__self:this},(0,_utils2.formatTimeStamp)(t.error.timestamp)))))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Response=exports.Request=void 0;var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var s=t[r];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}return function(t,r,s){return r&&e(t.prototype,r),s&&e(t,s),t}}();exports.ErrorView=ErrorView;var _react=require("react"),_react2=_interopRequireDefault(_react),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../../flow/utils.js"),_utils2=require("../../utils.js"),_ContentView=require("../ContentView"),_ContentView2=_interopRequireDefault(_ContentView),_ValueEditor=require("../ValueEditor"),_ValueEditor2=_interopRequireDefault(_ValueEditor),_Headers=require("./Headers"),_Headers2=_interopRequireDefault(_Headers),RequestLine=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props,t=e.flow,r=e.updateFlow;return _react2["default"].createElement("div",{className:"first-line request-line",__self:this},_react2["default"].createElement(_ValueEditor2["default"],{ref:"method",content:t.request.method,onDone:function(e){return r({request:{method:e}})},inline:!0,__self:this})," ",_react2["default"].createElement(_ValueEditor2["default"],{ref:"url",content:_utils.RequestUtils.pretty_url(t.request),onDone:function(e){return r({request:Object.assign({path:""},(0,_utils.parseUrl)(e))})},isValid:function(e){return!!(0,_utils.parseUrl)(e).host},inline:!0,__self:this})," ",_react2["default"].createElement(_ValueEditor2["default"],{ref:"httpVersion",content:t.request.http_version,onDone:function(e){return r({request:{http_version:(0,_utils.parseHttpVersion)(e)}})},isValid:_utils.isValidHttpVersion,inline:!0,__self:this}))}}]),t}(_react.Component),ResponseLine=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props,t=e.flow,r=e.updateFlow;return _react2["default"].createElement("div",{className:"first-line response-line",__self:this},_react2["default"].createElement(_ValueEditor2["default"],{ref:"httpVersion",content:t.response.http_version,onDone:function(e){return r({response:{http_version:(0,_utils.parseHttpVersion)(e)}})},isValid:_utils.isValidHttpVersion,inline:!0,__self:this})," ",_react2["default"].createElement(_ValueEditor2["default"],{ref:"code",content:t.response.status_code+"",onDone:function(e){return r({response:{code:parseInt(e)}})},isValid:function(e){return/^\d+$/.test(e)},inline:!0,__self:this})," ",_react2["default"].createElement(_ValueEditor2["default"],{ref:"msg",content:t.response.reason,onDone:function(e){return r({response:{msg:e}})},inline:!0,__self:this}))}}]),t}(_react.Component),Request=exports.Request=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props,t=e.flow,r=e.updateFlow;return _react2["default"].createElement("section",{className:"request",__self:this},_react2["default"].createElement(RequestLine,{ref:"requestLine",flow:t,updateFlow:r,__self:this}),_react2["default"].createElement(_Headers2["default"],{ref:"headers",message:t.request,onChange:function(e){return r({request:{headers:e}})},__self:this}),_react2["default"].createElement("hr",{__self:this}),_react2["default"].createElement(_ContentView2["default"],{flow:t,message:t.request,__self:this}))}},{key:"edit",value:function(e){switch(e){case"m":this.refs.requestLine.refs.method.focus();break;case"u":this.refs.requestLine.refs.url.focus();break;case"v":this.refs.requestLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw new Error("Unimplemented: "+e)}}}]),t}(_react.Component),Response=exports.Response=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props,t=e.flow,r=e.updateFlow;return _react2["default"].createElement("section",{className:"response",__self:this},_react2["default"].createElement(ResponseLine,{ref:"responseLine",flow:t,updateFlow:r,__self:this}),_react2["default"].createElement(_Headers2["default"],{ref:"headers",message:t.response,onChange:function(e){return r({response:{headers:e}})},__self:this}),_react2["default"].createElement("hr",{__self:this}),_react2["default"].createElement(_ContentView2["default"],{flow:t,message:t.response,__self:this}))}},{key:"edit",value:function(e){switch(e){case"c":this.refs.responseLine.refs.status_code.focus();break;case"m":this.refs.responseLine.refs.msg.focus();break;case"v":this.refs.responseLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw new Error("'Unimplemented: "+e)}}}]),t}(_react.Component);ErrorView.propTypes={flow:_react.PropTypes.object.isRequired}; +},{"../../utils.js":54,"../ValueEditor":31,"react":"react","react-dom":"react-dom"}],17:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function ErrorView(e){var t=e.flow;return _react2.default.createElement("section",null,_react2.default.createElement("div",{className:"alert alert-warning"},t.error.msg,_react2.default.createElement("div",null,_react2.default.createElement("small",null,(0,_utils2.formatTimeStamp)(t.error.timestamp)))))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Response=exports.Request=void 0;var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}();exports.ErrorView=ErrorView;var _react=require("react"),_react2=_interopRequireDefault(_react),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../../flow/utils.js"),_utils2=require("../../utils.js"),_ContentView=require("../ContentView"),_ContentView2=_interopRequireDefault(_ContentView),_ValueEditor=require("../ValueEditor"),_ValueEditor2=_interopRequireDefault(_ValueEditor),_Headers=require("./Headers"),_Headers2=_interopRequireDefault(_Headers),RequestLine=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props,t=e.flow,r=e.updateFlow;return _react2.default.createElement("div",{className:"first-line request-line"},_react2.default.createElement(_ValueEditor2.default,{ref:"method",content:t.request.method,onDone:function(e){return r({request:{method:e}})},inline:!0})," ",_react2.default.createElement(_ValueEditor2.default,{ref:"url",content:_utils.RequestUtils.pretty_url(t.request),onDone:function(e){return r({request:Object.assign({path:""},(0,_utils.parseUrl)(e))})},isValid:function(e){return!!(0,_utils.parseUrl)(e).host},inline:!0})," ",_react2.default.createElement(_ValueEditor2.default,{ref:"httpVersion",content:t.request.http_version,onDone:function(e){return r({request:{http_version:(0,_utils.parseHttpVersion)(e)}})},isValid:_utils.isValidHttpVersion,inline:!0}))}}]),t}(_react.Component),ResponseLine=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props,t=e.flow,r=e.updateFlow;return _react2.default.createElement("div",{className:"first-line response-line"},_react2.default.createElement(_ValueEditor2.default,{ref:"httpVersion",content:t.response.http_version,onDone:function(e){return r({response:{http_version:(0,_utils.parseHttpVersion)(e)}})},isValid:_utils.isValidHttpVersion,inline:!0})," ",_react2.default.createElement(_ValueEditor2.default,{ref:"code",content:t.response.status_code+"",onDone:function(e){return r({response:{code:parseInt(e)}})},isValid:function(e){return/^\d+$/.test(e)},inline:!0})," ",_react2.default.createElement(_ValueEditor2.default,{ref:"msg",content:t.response.reason,onDone:function(e){return r({response:{msg:e}})},inline:!0}))}}]),t}(_react.Component),Request=exports.Request=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props,t=e.flow,r=e.updateFlow;return _react2.default.createElement("section",{className:"request"},_react2.default.createElement(RequestLine,{ref:"requestLine",flow:t,updateFlow:r}),_react2.default.createElement(_Headers2.default,{ref:"headers",message:t.request,onChange:function(e){return r({request:{headers:e}})}}),_react2.default.createElement("hr",null),_react2.default.createElement(_ContentView2.default,{flow:t,message:t.request}))}},{key:"edit",value:function(e){switch(e){case"m":this.refs.requestLine.refs.method.focus();break;case"u":this.refs.requestLine.refs.url.focus();break;case"v":this.refs.requestLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw new Error("Unimplemented: "+e)}}}]),t}(_react.Component),Response=exports.Response=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props,t=e.flow,r=e.updateFlow;return _react2.default.createElement("section",{className:"response"},_react2.default.createElement(ResponseLine,{ref:"responseLine",flow:t,updateFlow:r}),_react2.default.createElement(_Headers2.default,{ref:"headers",message:t.response,onChange:function(e){return r({response:{headers:e}})}}),_react2.default.createElement("hr",null),_react2.default.createElement(_ContentView2.default,{flow:t,message:t.response}))}},{key:"edit",value:function(e){switch(e){case"c":this.refs.responseLine.refs.status_code.focus();break;case"m":this.refs.responseLine.refs.msg.focus();break;case"v":this.refs.responseLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw new Error("'Unimplemented: "+e)}}}]),t}(_react.Component);ErrorView.propTypes={flow:_react.PropTypes.object.isRequired}; -},{"../../flow/utils.js":54,"../../utils.js":55,"../ContentView":3,"../ValueEditor":31,"./Headers":16,"lodash":"lodash","react":"react"}],18:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function NavAction(e){var t=e.icon,a=e.title,r=e.onClick;return _react2["default"].createElement("a",{title:a,href:"#",className:"nav-action",onClick:function(e){e.preventDefault(),r(e)},__self:this},_react2["default"].createElement("i",{className:"fa fa-fw "+t,__self:this}))}function Nav(e){var t=this,a=e.active,r=e.tabs,s=e.onSelectTab;return _react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-sm",__self:this},r.map(function(e){return _react2["default"].createElement("a",{key:e,href:"#",className:(0,_classnames2["default"])({active:a===e}),onClick:function(t){t.preventDefault(),s(e)},__self:t},_.capitalize(e))}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Nav;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames);NavAction.propTypes={icon:_react.PropTypes.string.isRequired,title:_react.PropTypes.string.isRequired,onClick:_react.PropTypes.func.isRequired},Nav.propTypes={active:_react.PropTypes.string.isRequired,tabs:_react.PropTypes.array.isRequired,onSelectTab:_react.PropTypes.func.isRequired}; +},{"../../flow/utils.js":53,"../../utils.js":54,"../ContentView":3,"../ValueEditor":31,"./Headers":16,"lodash":"lodash","react":"react"}],18:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function NavAction(e){var a=e.icon,t=e.title,r=e.onClick;return _react2.default.createElement("a",{title:t,href:"#",className:"nav-action",onClick:function(e){e.preventDefault(),r(e)}},_react2.default.createElement("i",{className:"fa fa-fw "+a}))}function Nav(e){var a=e.active,t=e.tabs,r=e.onSelectTab;return _react2.default.createElement("nav",{className:"nav-tabs nav-tabs-sm"},t.map(function(e){return _react2.default.createElement("a",{key:e,href:"#",className:(0,_classnames2.default)({active:a===e}),onClick:function(a){a.preventDefault(),r(e)}},_.capitalize(e))}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=Nav;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames);NavAction.propTypes={icon:_react.PropTypes.string.isRequired,title:_react.PropTypes.string.isRequired,onClick:_react.PropTypes.func.isRequired},Nav.propTypes={active:_react.PropTypes.string.isRequired,tabs:_react.PropTypes.array.isRequired,onSelectTab:_react.PropTypes.func.isRequired}; },{"classnames":"classnames","react":"react","react-redux":"react-redux"}],19:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Footer(e){var t=e.settings;return _react2["default"].createElement("footer",{__self:this},t.mode&&"regular"!=t.mode&&_react2["default"].createElement("span",{className:"label label-success",__self:this},t.mode," mode"),t.intercept&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"Intercept: ",t.intercept),t.showhost&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"showhost"),t.no_upstream_cert&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"no-upstream-cert"),t.rawtcp&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"raw-tcp"),!t.http2&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"no-http2"),t.anticache&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"anticache"),t.anticomp&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"anticomp"),t.stickyauth&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"stickyauth: ",t.stickyauth),t.stickycookie&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"stickycookie: ",t.stickycookie),t.stream&&_react2["default"].createElement("span",{className:"label label-success",__self:this},"stream: ",(0,_utils.formatSize)(t.stream)))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_utils=require("../utils.js");Footer.propTypes={settings:_react2["default"].PropTypes.object.isRequired},exports["default"]=(0,_reactRedux.connect)(function(e){return{settings:e.settings.settings}})(Footer); +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function Footer(e){var t=e.settings;return _react2.default.createElement("footer",null,t.mode&&"regular"!=t.mode&&_react2.default.createElement("span",{className:"label label-success"},t.mode," mode"),t.intercept&&_react2.default.createElement("span",{className:"label label-success"},"Intercept: ",t.intercept),t.showhost&&_react2.default.createElement("span",{className:"label label-success"},"showhost"),t.no_upstream_cert&&_react2.default.createElement("span",{className:"label label-success"},"no-upstream-cert"),t.rawtcp&&_react2.default.createElement("span",{className:"label label-success"},"raw-tcp"),!t.http2&&_react2.default.createElement("span",{className:"label label-success"},"no-http2"),t.anticache&&_react2.default.createElement("span",{className:"label label-success"},"anticache"),t.anticomp&&_react2.default.createElement("span",{className:"label label-success"},"anticomp"),t.stickyauth&&_react2.default.createElement("span",{className:"label label-success"},"stickyauth: ",t.stickyauth),t.stickycookie&&_react2.default.createElement("span",{className:"label label-success"},"stickycookie: ",t.stickycookie),t.stream&&_react2.default.createElement("span",{className:"label label-success"},"stream: ",(0,_utils.formatSize)(t.stream)))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_utils=require("../utils.js");Footer.propTypes={settings:_react2.default.PropTypes.object.isRequired},exports.default=(0,_reactRedux.connect)(function(e){return{settings:e.settings.settings}})(Footer); -},{"../utils.js":55,"react":"react","react-redux":"react-redux"}],20:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_MainMenu=require("./Header/MainMenu"),_MainMenu2=_interopRequireDefault(_MainMenu),_ViewMenu=require("./Header/ViewMenu"),_ViewMenu2=_interopRequireDefault(_ViewMenu),_OptionMenu=require("./Header/OptionMenu"),_OptionMenu2=_interopRequireDefault(_OptionMenu),_FileMenu=require("./Header/FileMenu"),_FileMenu2=_interopRequireDefault(_FileMenu),_FlowMenu=require("./Header/FlowMenu"),_FlowMenu2=_interopRequireDefault(_FlowMenu),_ui=require("../ducks/ui.js"),Header=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"handleClick",value:function(e,t){t.preventDefault(),this.props.setActiveMenu(e.title)}},{key:"render",value:function(){var e=this,r=this.props,n=r.updateLocation,u=r.query,a=r.selectedFlow,i=r.activeMenu,l=[].concat(_toConsumableArray(t.entries));a&&l.push(_FlowMenu2["default"]);var o=_.find(l,function(e){return e.title==i});return _react2["default"].createElement("header",{__self:this},_react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-lg",__self:this},_react2["default"].createElement(_FileMenu2["default"],{__self:this}),l.map(function(t){return _react2["default"].createElement("a",{key:t.title,href:"#",className:(0,_classnames2["default"])({active:t===o}),onClick:function(r){return e.handleClick(t,r)},__self:e},t.title)})),_react2["default"].createElement("div",{className:"menu",__self:this},_react2["default"].createElement(o,{ref:"active",updateLocation:n,query:u,__self:this})))}}]),t}(_react.Component);Header.entries=[_MainMenu2["default"],_ViewMenu2["default"],_OptionMenu2["default"]],exports["default"]=(0,_reactRedux.connect)(function(e){return{selectedFlow:e.flows.views.main.selected[0],activeMenu:e.ui.activeMenu}},{setActiveMenu:_ui.setActiveMenu},null,{withRef:!0})(Header); +},{"../utils.js":54,"react":"react","react-redux":"react-redux"}],20:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_MainMenu=require("./Header/MainMenu"),_MainMenu2=_interopRequireDefault(_MainMenu),_ViewMenu=require("./Header/ViewMenu"),_ViewMenu2=_interopRequireDefault(_ViewMenu),_OptionMenu=require("./Header/OptionMenu"),_OptionMenu2=_interopRequireDefault(_OptionMenu),_FileMenu=require("./Header/FileMenu"),_FileMenu2=_interopRequireDefault(_FileMenu),_FlowMenu=require("./Header/FlowMenu"),_FlowMenu2=_interopRequireDefault(_FlowMenu),_ui=require("../ducks/ui.js"),Header=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"handleClick",value:function(e,t){t.preventDefault(),this.props.setActiveMenu(e.title)}},{key:"render",value:function(){var e=this,r=this.props,n=r.query,u=r.selectedFlowId,a=r.activeMenu,i=[].concat(_toConsumableArray(t.entries));u&&i.push(_FlowMenu2.default);var l=_.find(i,function(e){return e.title==a});return _react2.default.createElement("header",null,_react2.default.createElement("nav",{className:"nav-tabs nav-tabs-lg"},_react2.default.createElement(_FileMenu2.default,null),i.map(function(t){return _react2.default.createElement("a",{key:t.title,href:"#",className:(0,_classnames2.default)({active:t===l}),onClick:function(r){return e.handleClick(t,r)}},t.title)})),_react2.default.createElement("div",{className:"menu"},_react2.default.createElement(l,{ref:"active",query:n})))}}]),t}(_react.Component);Header.entries=[_MainMenu2.default,_ViewMenu2.default,_OptionMenu2.default],exports.default=(0,_reactRedux.connect)(function(e){return{selectedFlowId:e.flows.selected[0],activeMenu:e.ui.activeMenu}},{setActiveMenu:_ui.setActiveMenu},null,{withRef:!0})(Header); -},{"../ducks/ui.js":47,"./Header/FileMenu":21,"./Header/FlowMenu":24,"./Header/MainMenu":25,"./Header/OptionMenu":26,"./Header/ViewMenu":27,"classnames":"classnames","react":"react","react-redux":"react-redux"}],21:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&(t[l]=e[l]);return t["default"]=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var l=0;l<t.length;l++){var n=t[l];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,l,n){return l&&e(t.prototype,l),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_flows=require("../../ducks/flows"),flowsActions=_interopRequireWildcard(_flows),FileMenu=function(e){function t(e,l){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,l));return n.state={show:!1},n.close=n.close.bind(n),n.onFileClick=n.onFileClick.bind(n),n.onNewClick=n.onNewClick.bind(n),n.onOpenClick=n.onOpenClick.bind(n),n.onOpenFile=n.onOpenFile.bind(n),n.onSaveClick=n.onSaveClick.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"close",value:function(){this.setState({show:!1}),document.removeEventListener("click",this.close)}},{key:"onFileClick",value:function(e){e.preventDefault(),this.state.show||(document.addEventListener("click",this.close),this.setState({show:!0}))}},{key:"onNewClick",value:function(e){e.preventDefault(),confirm("Delete all flows?")&&this.props.clearFlows()}},{key:"onOpenClick",value:function(e){e.preventDefault(),this.fileInput.click()}},{key:"onOpenFile",value:function(e){e.preventDefault(),e.target.files.length>0&&(this.props.loadFlows(e.target.files[0]),this.fileInput.value="")}},{key:"onSaveClick",value:function(e){e.preventDefault(),this.props.saveFlows()}},{key:"render",value:function(){var e=this;return _react2["default"].createElement("div",{className:(0,_classnames2["default"])("dropdown pull-left",{open:this.state.show}),__self:this},_react2["default"].createElement("a",{href:"#",className:"special",onClick:this.onFileClick,__self:this},"mitmproxy"),_react2["default"].createElement("ul",{className:"dropdown-menu",role:"menu",__self:this},_react2["default"].createElement("li",{__self:this},_react2["default"].createElement("a",{href:"#",onClick:this.onNewClick,__self:this},_react2["default"].createElement("i",{className:"fa fa-fw fa-file",__self:this}),"New")),_react2["default"].createElement("li",{__self:this},_react2["default"].createElement("a",{href:"#",onClick:this.onOpenClick,__self:this},_react2["default"].createElement("i",{className:"fa fa-fw fa-folder-open",__self:this}),"Open..."),_react2["default"].createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.onOpenFile,__self:this})),_react2["default"].createElement("li",{__self:this},_react2["default"].createElement("a",{href:"#",onClick:this.onSaveClick,__self:this},_react2["default"].createElement("i",{className:"fa fa-fw fa-floppy-o",__self:this}),"Save...")),_react2["default"].createElement("li",{role:"presentation",className:"divider",__self:this}),_react2["default"].createElement("li",{__self:this},_react2["default"].createElement("a",{href:"http://mitm.it/",target:"_blank",__self:this},_react2["default"].createElement("i",{className:"fa fa-fw fa-external-link",__self:this}),"Install Certificates..."))))}}]),t}(_react.Component);exports["default"]=(0,_reactRedux.connect)(null,{clearFlows:flowsActions.clear,loadFlows:flowsActions.upload,saveFlows:flowsActions.download})(FileMenu); +},{"../ducks/ui.js":48,"./Header/FileMenu":21,"./Header/FlowMenu":24,"./Header/MainMenu":25,"./Header/OptionMenu":26,"./Header/ViewMenu":27,"classnames":"classnames","react":"react","react-redux":"react-redux"}],21:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&(t[l]=e[l]);return t.default=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var l=0;l<t.length;l++){var n=t[l];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,l,n){return l&&e(t.prototype,l),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_flows=require("../../ducks/flows"),flowsActions=_interopRequireWildcard(_flows),FileMenu=function(e){function t(e,l){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,l));return n.state={show:!1},n.close=n.close.bind(n),n.onFileClick=n.onFileClick.bind(n),n.onNewClick=n.onNewClick.bind(n),n.onOpenClick=n.onOpenClick.bind(n),n.onOpenFile=n.onOpenFile.bind(n),n.onSaveClick=n.onSaveClick.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"close",value:function(){this.setState({show:!1}),document.removeEventListener("click",this.close)}},{key:"onFileClick",value:function(e){e.preventDefault(),this.state.show||(document.addEventListener("click",this.close),this.setState({show:!0}))}},{key:"onNewClick",value:function(e){e.preventDefault(),confirm("Delete all flows?")&&this.props.clearFlows()}},{key:"onOpenClick",value:function(e){e.preventDefault(),this.fileInput.click()}},{key:"onOpenFile",value:function(e){e.preventDefault(),e.target.files.length>0&&(this.props.loadFlows(e.target.files[0]),this.fileInput.value="")}},{key:"onSaveClick",value:function(e){e.preventDefault(),this.props.saveFlows()}},{key:"render",value:function(){var e=this;return _react2.default.createElement("div",{className:(0,_classnames2.default)("dropdown pull-left",{open:this.state.show})},_react2.default.createElement("a",{href:"#",className:"special",onClick:this.onFileClick},"mitmproxy"),_react2.default.createElement("ul",{className:"dropdown-menu",role:"menu"},_react2.default.createElement("li",null,_react2.default.createElement("a",{href:"#",onClick:this.onNewClick},_react2.default.createElement("i",{className:"fa fa-fw fa-file"}),"New")),_react2.default.createElement("li",null,_react2.default.createElement("a",{href:"#",onClick:this.onOpenClick},_react2.default.createElement("i",{className:"fa fa-fw fa-folder-open"}),"Open..."),_react2.default.createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.onOpenFile})),_react2.default.createElement("li",null,_react2.default.createElement("a",{href:"#",onClick:this.onSaveClick},_react2.default.createElement("i",{className:"fa fa-fw fa-floppy-o"}),"Save...")),_react2.default.createElement("li",{role:"presentation",className:"divider"}),_react2.default.createElement("li",null,_react2.default.createElement("a",{href:"http://mitm.it/",target:"_blank"},_react2.default.createElement("i",{className:"fa fa-fw fa-external-link"}),"Install Certificates..."))))}}]),t}(_react.Component);exports.default=(0,_reactRedux.connect)(null,{clearFlows:flowsActions.clear,loadFlows:flowsActions.upload,saveFlows:flowsActions.download})(FileMenu); -},{"../../ducks/flows":43,"classnames":"classnames","react":"react","react-redux":"react-redux"}],22:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../../utils"),FilterDocs=function(e){function t(e,r){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return n.state={doc:t.doc},n}return _inherits(t,e),_createClass(t,[{key:"componentWillMount",value:function(){var e=this;t.xhr||(t.xhr=(0,_utils.fetchApi)("/filter-help").then(function(e){return e.json()}),t.xhr["catch"](function(){t.xhr=null})),this.state.doc||t.xhr.then(function(r){t.doc=r,e.setState({doc:r})})}},{key:"render",value:function(){var e=this,t=this.state.doc;return t?_react2["default"].createElement("table",{className:"table table-condensed",__self:this},_react2["default"].createElement("tbody",{__self:this},t.commands.map(function(t){return _react2["default"].createElement("tr",{key:t[1],__self:e},_react2["default"].createElement("td",{__self:e},t[0].replace(" "," ")),_react2["default"].createElement("td",{__self:e},t[1]))}),_react2["default"].createElement("tr",{key:"docs-link",__self:this},_react2["default"].createElement("td",{colSpan:"2",__self:this},_react2["default"].createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank",__self:this},_react2["default"].createElement("i",{className:"fa fa-external-link",__self:this}),"  mitmproxy docs"))))):_react2["default"].createElement("i",{className:"fa fa-spinner fa-spin",__self:this})}}]),t}(_react.Component);FilterDocs.xhr=null,FilterDocs.doc=null,exports["default"]=FilterDocs; +},{"../../ducks/flows":44,"classnames":"classnames","react":"react","react-redux":"react-redux"}],22:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../../utils"),FilterDocs=function(e){function t(e,r){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return n.state={doc:t.doc},n}return _inherits(t,e),_createClass(t,[{key:"componentWillMount",value:function(){var e=this;t.xhr||(t.xhr=(0,_utils.fetchApi)("/filter-help").then(function(e){return e.json()}),t.xhr.catch(function(){t.xhr=null})),this.state.doc||t.xhr.then(function(r){t.doc=r,e.setState({doc:r})})}},{key:"render",value:function(){var e=this.state.doc;return e?_react2.default.createElement("table",{className:"table table-condensed"},_react2.default.createElement("tbody",null,e.commands.map(function(e){return _react2.default.createElement("tr",{key:e[1]},_react2.default.createElement("td",null,e[0].replace(" "," ")),_react2.default.createElement("td",null,e[1]))}),_react2.default.createElement("tr",{key:"docs-link"},_react2.default.createElement("td",{colSpan:"2"},_react2.default.createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank"},_react2.default.createElement("i",{className:"fa fa-external-link"}),"  mitmproxy docs"))))):_react2.default.createElement("i",{className:"fa fa-spinner fa-spin"})}}]),t}(_react.Component);FilterDocs.xhr=null,FilterDocs.doc=null,exports.default=FilterDocs; -},{"../../utils":55,"react":"react"}],23:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_utils=require("../../utils.js"),_filt=require("../../filt/filt"),_filt2=_interopRequireDefault(_filt),_FilterDocs=require("./FilterDocs"),_FilterDocs2=_interopRequireDefault(_FilterDocs),FilterInput=function(e){function t(e,n){_classCallCheck(this,t);var o=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,n));return o.state={value:o.props.value,focus:!1,mousefocus:!1},o.onChange=o.onChange.bind(o),o.onFocus=o.onFocus.bind(o),o.onBlur=o.onBlur.bind(o),o.onKeyDown=o.onKeyDown.bind(o),o.onMouseEnter=o.onMouseEnter.bind(o),o.onMouseLeave=o.onMouseLeave.bind(o),o}return _inherits(t,e),_createClass(t,[{key:"componentWillReceiveProps",value:function(e){this.setState({value:e.value})}},{key:"isValid",value:function(e){try{var t=null==e?this.state.value:e;return t&&_filt2["default"].parse(t),!0}catch(n){return!1}}},{key:"getDesc",value:function(){if(!this.state.value)return _react2["default"].createElement(_FilterDocs2["default"],{__self:this});try{return _filt2["default"].parse(this.state.value).desc}catch(e){return""+e}}},{key:"onChange",value:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)}},{key:"onFocus",value:function(){this.setState({focus:!0})}},{key:"onBlur",value:function(){this.setState({focus:!1})}},{key:"onMouseEnter",value:function(){this.setState({mousefocus:!0})}},{key:"onMouseLeave",value:function(){this.setState({mousefocus:!1})}},{key:"onKeyDown",value:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()}},{key:"blur",value:function(){_reactDom2["default"].findDOMNode(this.refs.input).blur(),this.context.returnFocus()}},{key:"select",value:function(){_reactDom2["default"].findDOMNode(this.refs.input).select()}},{key:"render",value:function(){var e=this.props,t=e.type,n=e.color,o=e.placeholder,r=this.state,s=r.value,a=r.focus,u=r.mousefocus;return _react2["default"].createElement("div",{className:(0,_classnames2["default"])("filter-input input-group",{"has-error":!this.isValid()}),__self:this},_react2["default"].createElement("span",{className:"input-group-addon",__self:this},_react2["default"].createElement("i",{className:"fa fa-fw fa-"+t,style:{color:n},__self:this})),_react2["default"].createElement("input",{type:"text",ref:"input",placeholder:o,className:"form-control",value:s,onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,__self:this}),(a||u)&&_react2["default"].createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave,__self:this},_react2["default"].createElement("div",{className:"arrow",__self:this}),_react2["default"].createElement("div",{className:"popover-content",__self:this},this.getDesc())))}}]),t}(_react.Component);FilterInput.contextTypes={returnFocus:_react2["default"].PropTypes.func},exports["default"]=FilterInput; +},{"../../utils":54,"react":"react"}],23:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_utils=require("../../utils.js"),_filt=require("../../filt/filt"),_filt2=_interopRequireDefault(_filt),_FilterDocs=require("./FilterDocs"),_FilterDocs2=_interopRequireDefault(_FilterDocs),FilterInput=function(e){function t(e,n){_classCallCheck(this,t);var o=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,n));return o.state={value:o.props.value,focus:!1,mousefocus:!1},o.onChange=o.onChange.bind(o),o.onFocus=o.onFocus.bind(o),o.onBlur=o.onBlur.bind(o),o.onKeyDown=o.onKeyDown.bind(o),o.onMouseEnter=o.onMouseEnter.bind(o),o.onMouseLeave=o.onMouseLeave.bind(o),o}return _inherits(t,e),_createClass(t,[{key:"componentWillReceiveProps",value:function(e){this.setState({value:e.value})}},{key:"isValid",value:function(e){try{var t=null==e?this.state.value:e;return t&&_filt2.default.parse(t),!0}catch(e){return!1}}},{key:"getDesc",value:function(){if(!this.state.value)return _react2.default.createElement(_FilterDocs2.default,null);try{return _filt2.default.parse(this.state.value).desc}catch(e){return""+e}}},{key:"onChange",value:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)}},{key:"onFocus",value:function(){this.setState({focus:!0})}},{key:"onBlur",value:function(){this.setState({focus:!1})}},{key:"onMouseEnter",value:function(){this.setState({mousefocus:!0})}},{key:"onMouseLeave",value:function(){this.setState({mousefocus:!1})}},{key:"onKeyDown",value:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()}},{key:"blur",value:function(){_reactDom2.default.findDOMNode(this.refs.input).blur()}},{key:"select",value:function(){_reactDom2.default.findDOMNode(this.refs.input).select()}},{key:"render",value:function(){var e=this.props,t=e.type,n=e.color,o=e.placeholder,r=this.state,a=r.value,u=r.focus,s=r.mousefocus;return _react2.default.createElement("div",{className:(0,_classnames2.default)("filter-input input-group",{"has-error":!this.isValid()})},_react2.default.createElement("span",{className:"input-group-addon"},_react2.default.createElement("i",{className:"fa fa-fw fa-"+t,style:{color:n}})),_react2.default.createElement("input",{type:"text",ref:"input",placeholder:o,className:"form-control",value:a,onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown}),(u||s)&&_react2.default.createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave},_react2.default.createElement("div",{className:"arrow"}),_react2.default.createElement("div",{className:"popover-content"},this.getDesc())))}}]),t}(_react.Component);exports.default=FilterInput; -},{"../../filt/filt":53,"../../utils.js":55,"./FilterDocs":22,"classnames":"classnames","react":"react","react-dom":"react-dom"}],24:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&(t[l]=e[l]);return t["default"]=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowMenu(e){var t=e.flow,l=e.acceptFlow,o=e.replayFlow,r=e.duplicateFlow,n=e.removeFlow,a=e.revertFlow;return _react2["default"].createElement("div",{__self:this},_react2["default"].createElement("div",{className:"menu-row",__self:this},_react2["default"].createElement(_Button2["default"],{disabled:!t.intercepted,title:"[a]ccept intercepted flow",text:"Accept",icon:"fa-play",onClick:function(){return l(t)},__self:this}),_react2["default"].createElement(_Button2["default"],{title:"[r]eplay flow",text:"Replay",icon:"fa-repeat",onClick:function(){return o(t)},__self:this}),_react2["default"].createElement(_Button2["default"],{title:"[D]uplicate flow",text:"Duplicate",icon:"fa-copy",onClick:function(){return r(t)},__self:this}),_react2["default"].createElement(_Button2["default"],{title:"[d]elete flow",text:"Delete",icon:"fa-trash",onClick:function(){return n(t)},__self:this}),_react2["default"].createElement(_Button2["default"],{disabled:!t.modified,title:"revert changes to flow [V]",text:"Revert",icon:"fa-history",onClick:function(){return a(t)},__self:this}),_react2["default"].createElement(_Button2["default"],{title:"download",text:"Download",icon:"fa-download",onClick:function(){return window.location=_utils.MessageUtils.getContentURL(t,t.response)},__self:this})),_react2["default"].createElement("div",{className:"clearfix",__self:this}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_Button=require("../common/Button"),_Button2=_interopRequireDefault(_Button),_utils=require("../../flow/utils.js"),_flows=require("../../ducks/flows"),flowsActions=_interopRequireWildcard(_flows);FlowMenu.title="Flow",FlowMenu.propTypes={flow:_react.PropTypes.object.isRequired},exports["default"]=(0,_reactRedux.connect)(function(e){return{flow:e.flows.list.byId[e.flows.views.main.selected[0]]}},{acceptFlow:flowsActions.accept,replayFlow:flowsActions.replay,duplicateFlow:flowsActions.duplicate,removeFlow:flowsActions.remove,revertFlow:flowsActions.revert})(FlowMenu); +},{"../../filt/filt":52,"../../utils.js":54,"./FilterDocs":22,"classnames":"classnames","react":"react","react-dom":"react-dom"}],24:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&(t[l]=e[l]);return t.default=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function FlowMenu(e){var t=e.flow,l=e.acceptFlow,o=e.replayFlow,r=e.duplicateFlow,n=e.removeFlow,a=e.revertFlow;return _react2.default.createElement("div",null,_react2.default.createElement("div",{className:"menu-row"},_react2.default.createElement(_Button2.default,{disabled:!t||!t.intercepted,title:"[a]ccept intercepted flow",text:"Accept",icon:"fa-play",onClick:function(){return l(t)}}),_react2.default.createElement(_Button2.default,{title:"[r]eplay flow",text:"Replay",icon:"fa-repeat",onClick:function(){return o(t)}}),_react2.default.createElement(_Button2.default,{title:"[D]uplicate flow",text:"Duplicate",icon:"fa-copy",onClick:function(){return r(t)}}),_react2.default.createElement(_Button2.default,{title:"[d]elete flow",text:"Delete",icon:"fa-trash",onClick:function(){return n(t)}}),_react2.default.createElement(_Button2.default,{disabled:!t||!t.modified,title:"revert changes to flow [V]",text:"Revert",icon:"fa-history",onClick:function(){return a(t)}}),_react2.default.createElement(_Button2.default,{title:"download",text:"Download",icon:"fa-download",onClick:function(){return window.location=_utils.MessageUtils.getContentURL(t,t.response)}})),_react2.default.createElement("div",{className:"clearfix"}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_Button=require("../common/Button"),_Button2=_interopRequireDefault(_Button),_utils=require("../../flow/utils.js"),_flows=require("../../ducks/flows"),flowsActions=_interopRequireWildcard(_flows);FlowMenu.title="Flow",FlowMenu.propTypes={flow:_react.PropTypes.object.isRequired},exports.default=(0,_reactRedux.connect)(function(e){return{flow:e.flows.byId[e.flows.selected[0]]}},{acceptFlow:flowsActions.accept,replayFlow:flowsActions.replay,duplicateFlow:flowsActions.duplicate,removeFlow:flowsActions.remove,revertFlow:flowsActions.revert})(FlowMenu); -},{"../../ducks/flows":43,"../../flow/utils.js":54,"../common/Button":34,"react":"react","react-redux":"react-redux"}],25:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_FilterInput=require("./FilterInput"),_FilterInput2=_interopRequireDefault(_FilterInput),_actions=require("../../actions.js"),_settings=require("../../ducks/settings"),MainMenu=function(e){function t(e,r){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return n.onSearchChange=n.onSearchChange.bind(n),n.onHighlightChange=n.onHighlightChange.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"onSearchChange",value:function(e){this.props.updateLocation(void 0,_defineProperty({},_actions.Query.SEARCH,e))}},{key:"onHighlightChange",value:function(e){this.props.updateLocation(void 0,_defineProperty({},_actions.Query.HIGHLIGHT,e))}},{key:"render",value:function(){var e=this.props,t=e.query,r=e.settings,n=e.updateSettings;return _react2["default"].createElement("div",{__self:this},_react2["default"].createElement("div",{className:"menu-row",__self:this},_react2["default"].createElement(_FilterInput2["default"],{ref:"search",placeholder:"Search",type:"search",color:"black",value:t[_actions.Query.SEARCH]||"",onChange:this.onSearchChange,__self:this}),_react2["default"].createElement(_FilterInput2["default"],{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t[_actions.Query.HIGHLIGHT]||"",onChange:this.onHighlightChange,__self:this}),_react2["default"].createElement(_FilterInput2["default"],{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:r.intercept||"",onChange:function(e){return n({intercept:e})},__self:this})),_react2["default"].createElement("div",{className:"clearfix",__self:this}))}}]),t}(_react.Component);MainMenu.title="Start",MainMenu.route="flows",MainMenu.propTypes={query:_react.PropTypes.object.isRequired,settings:_react.PropTypes.object.isRequired,updateLocation:_react.PropTypes.func.isRequired,updateSettings:_react.PropTypes.func.isRequired},exports["default"]=(0,_reactRedux.connect)(function(e){return{settings:e.settings.settings}},{updateSettings:_settings.update},null,{withRef:!0})(MainMenu); +},{"../../ducks/flows":44,"../../flow/utils.js":53,"../common/Button":34,"react":"react","react-redux":"react-redux"}],25:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_FilterInput=require("./FilterInput"),_FilterInput2=_interopRequireDefault(_FilterInput),_actions=require("../../actions.js"),_settings=require("../../ducks/settings"),_ui=require("../../ducks/ui"),MainMenu=function(e){function t(e,r){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return n.onSearchChange=n.onSearchChange.bind(n),n.onHighlightChange=n.onHighlightChange.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"componentWillReceiveProps",value:function(e){this.refs[e.selectedInput]&&this.refs[e.selectedInput].select(),this.props.setSelectedInput(void 0)}},{key:"onSearchChange",value:function(e){this.props.updateQuery(_defineProperty({},_actions.Query.SEARCH,e))}},{key:"onHighlightChange",value:function(e){this.props.updateQuery(_defineProperty({},_actions.Query.HIGHLIGHT,e))}},{key:"render",value:function(){var e=this.props,t=e.query,r=e.settings,n=e.updateSettings;return _react2.default.createElement("div",null,_react2.default.createElement("div",{className:"menu-row"},_react2.default.createElement(_FilterInput2.default,{ref:"search",placeholder:"Search",type:"search",color:"black",value:t[_actions.Query.SEARCH]||"",onChange:this.onSearchChange}),_react2.default.createElement(_FilterInput2.default,{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t[_actions.Query.HIGHLIGHT]||"",onChange:this.onHighlightChange}),_react2.default.createElement(_FilterInput2.default,{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:r.intercept||"",onChange:function(e){return n({intercept:e})}})),_react2.default.createElement("div",{className:"clearfix"}))}}]),t}(_react.Component);MainMenu.title="Start",MainMenu.route="flows",MainMenu.propTypes={query:_react.PropTypes.object.isRequired,settings:_react.PropTypes.object.isRequired,updateSettings:_react.PropTypes.func.isRequired,updateQuery:_react.PropTypes.func.isRequired},exports.default=(0,_reactRedux.connect)(function(e){return{settings:e.settings.settings,selectedInput:e.ui.selectedInput}},{updateSettings:_settings.update,updateQuery:_ui.updateQuery,setSelectedInput:_ui.setSelectedInput},null,{withRef:!0})(MainMenu); -},{"../../actions.js":1,"../../ducks/settings":46,"./FilterInput":23,"react":"react","react-redux":"react-redux"}],26:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function OptionMenu(e){var t=e.settings,n=e.onSettingsChange;return _react2["default"].createElement("div",{__self:this},_react2["default"].createElement("div",{className:"menu-row",__self:this},_react2["default"].createElement(_ToggleButton2["default"],{text:"showhost",checked:t.showhost,onToggle:function(){return n({showhost:!t.showhost})},__self:this}),_react2["default"].createElement(_ToggleButton2["default"],{text:"no_upstream_cert",checked:t.no_upstream_cert,onToggle:function(){return n({no_upstream_cert:!t.no_upstream_cert})},__self:this}),_react2["default"].createElement(_ToggleButton2["default"],{text:"rawtcp",checked:t.rawtcp,onToggle:function(){return n({rawtcp:!t.rawtcp})},__self:this}),_react2["default"].createElement(_ToggleButton2["default"],{text:"http2",checked:t.http2,onToggle:function(){return n({http2:!t.http2})},__self:this}),_react2["default"].createElement(_ToggleButton2["default"],{text:"anticache",checked:t.anticache,onToggle:function(){return n({anticache:!t.anticache})},__self:this}),_react2["default"].createElement(_ToggleButton2["default"],{text:"anticomp",checked:t.anticomp,onToggle:function(){return n({anticomp:!t.anticomp})},__self:this}),_react2["default"].createElement(_ToggleInputButton2["default"],{name:"stickyauth",placeholder:"Sticky auth filter",checked:!!t.stickyauth,txt:t.stickyauth||"",onToggleChanged:function(e){return n({stickyauth:t.stickyauth?null:e})},__self:this}),_react2["default"].createElement(_ToggleInputButton2["default"],{name:"stickycookie",placeholder:"Sticky cookie filter",checked:!!t.stickycookie,txt:t.stickycookie||"",onToggleChanged:function(e){return n({stickycookie:t.stickycookie?null:e})},__self:this}),_react2["default"].createElement(_ToggleInputButton2["default"],{name:"stream",placeholder:"stream...",checked:!!t.stream,txt:t.stream||"",inputType:"number",onToggleChanged:function(e){return n({stream:t.stream?null:e})},__self:this})),_react2["default"].createElement("div",{className:"clearfix",__self:this}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_ToggleButton=require("../common/ToggleButton"),_ToggleButton2=_interopRequireDefault(_ToggleButton),_ToggleInputButton=require("../common/ToggleInputButton"),_ToggleInputButton2=_interopRequireDefault(_ToggleInputButton),_settings=require("../../ducks/settings");OptionMenu.title="Options",OptionMenu.propTypes={settings:_react.PropTypes.object.isRequired,onSettingsChange:_react.PropTypes.func.isRequired},exports["default"]=(0,_reactRedux.connect)(function(e){return{settings:e.settings.settings}},{onSettingsChange:_settings.update})(OptionMenu); +},{"../../actions.js":1,"../../ducks/settings":47,"../../ducks/ui":48,"./FilterInput":23,"react":"react","react-redux":"react-redux"}],26:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function OptionMenu(e){var t=e.settings,n=e.onSettingsChange;return _react2.default.createElement("div",null,_react2.default.createElement("div",{className:"menu-row"},_react2.default.createElement(_ToggleButton2.default,{text:"showhost",checked:t.showhost,onToggle:function(){return n({showhost:!t.showhost})}}),_react2.default.createElement(_ToggleButton2.default,{text:"no_upstream_cert",checked:t.no_upstream_cert,onToggle:function(){return n({no_upstream_cert:!t.no_upstream_cert})}}),_react2.default.createElement(_ToggleButton2.default,{text:"rawtcp",checked:t.rawtcp,onToggle:function(){return n({rawtcp:!t.rawtcp})}}),_react2.default.createElement(_ToggleButton2.default,{text:"http2",checked:t.http2,onToggle:function(){return n({http2:!t.http2})}}),_react2.default.createElement(_ToggleButton2.default,{text:"anticache",checked:t.anticache,onToggle:function(){return n({anticache:!t.anticache})}}),_react2.default.createElement(_ToggleButton2.default,{text:"anticomp",checked:t.anticomp,onToggle:function(){return n({anticomp:!t.anticomp})}}),_react2.default.createElement(_ToggleInputButton2.default,{name:"stickyauth",placeholder:"Sticky auth filter",checked:!!t.stickyauth,txt:t.stickyauth||"",onToggleChanged:function(e){return n({stickyauth:t.stickyauth?null:e})}}),_react2.default.createElement(_ToggleInputButton2.default,{name:"stickycookie",placeholder:"Sticky cookie filter",checked:!!t.stickycookie,txt:t.stickycookie||"",onToggleChanged:function(e){return n({stickycookie:t.stickycookie?null:e})}}),_react2.default.createElement(_ToggleInputButton2.default,{name:"stream",placeholder:"stream...",checked:!!t.stream,txt:t.stream||"",inputType:"number",onToggleChanged:function(e){return n({stream:t.stream?null:e})}})),_react2.default.createElement("div",{className:"clearfix"}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_ToggleButton=require("../common/ToggleButton"),_ToggleButton2=_interopRequireDefault(_ToggleButton),_ToggleInputButton=require("../common/ToggleInputButton"),_ToggleInputButton2=_interopRequireDefault(_ToggleInputButton),_settings=require("../../ducks/settings");OptionMenu.title="Options",OptionMenu.propTypes={settings:_react.PropTypes.object.isRequired,onSettingsChange:_react.PropTypes.func.isRequired},exports.default=(0,_reactRedux.connect)(function(e){return{settings:e.settings.settings}},{onSettingsChange:_settings.update})(OptionMenu); -},{"../../ducks/settings":46,"../common/ToggleButton":36,"../common/ToggleInputButton":37,"react":"react","react-redux":"react-redux"}],27:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function ViewMenu(e){var t=e.eventLogVisible,r=e.toggleEventLog;return _react2["default"].createElement("div",{__self:this},_react2["default"].createElement("div",{className:"menu-row",__self:this},_react2["default"].createElement(_ToggleButton2["default"],{text:"Show Event Log",checked:t,onToggle:r,__self:this})),_react2["default"].createElement("div",{className:"clearfix",__self:this}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_ToggleButton=require("../common/ToggleButton"),_ToggleButton2=_interopRequireDefault(_ToggleButton),_eventLog=require("../../ducks/eventLog");ViewMenu.title="View",ViewMenu.route="flows",ViewMenu.propTypes={eventLogVisible:_react.PropTypes.bool.isRequired,toggleEventLog:_react.PropTypes.func.isRequired},exports["default"]=(0,_reactRedux.connect)(function(e){return{eventLogVisible:e.eventLog.visible}},{toggleEventLog:_eventLog.toggleVisibility})(ViewMenu); +},{"../../ducks/settings":47,"../common/ToggleButton":36,"../common/ToggleInputButton":37,"react":"react","react-redux":"react-redux"}],27:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function ViewMenu(e){var t=e.eventLogVisible,r=e.toggleEventLog;return _react2.default.createElement("div",null,_react2.default.createElement("div",{className:"menu-row"},_react2.default.createElement(_ToggleButton2.default,{text:"Show Event Log",checked:t,onToggle:r})),_react2.default.createElement("div",{className:"clearfix"}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_ToggleButton=require("../common/ToggleButton"),_ToggleButton2=_interopRequireDefault(_ToggleButton),_eventLog=require("../../ducks/eventLog");ViewMenu.title="View",ViewMenu.route="flows",ViewMenu.propTypes={eventLogVisible:_react.PropTypes.bool.isRequired,toggleEventLog:_react.PropTypes.func.isRequired},exports.default=(0,_reactRedux.connect)(function(e){return{eventLogVisible:e.eventLog.visible}},{toggleEventLog:_eventLog.toggleVisibility})(ViewMenu); },{"../../ducks/eventLog":42,"../common/ToggleButton":36,"react":"react","react-redux":"react-redux"}],28:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&(t[l]=e[l]);return t["default"]=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var l=0;l<t.length;l++){var i=t[l];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,l,i){return l&&e(t.prototype,l),i&&e(t,i),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_actions=require("../actions.js"),_utils=require("../utils.js"),_Splitter=require("./common/Splitter"),_Splitter2=_interopRequireDefault(_Splitter),_FlowTable=require("./FlowTable"),_FlowTable2=_interopRequireDefault(_FlowTable),_FlowView=require("./FlowView"),_FlowView2=_interopRequireDefault(_FlowView),_flows=require("../ducks/flows"),flowsActions=_interopRequireWildcard(_flows),_main=require("../ducks/views/main"),MainView=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"componentWillReceiveProps",value:function(e){e.routeParams.flowId!==(e.selectedFlow||{}).id&&this.props.selectFlow(e.routeParams.flowId),e.location.query[_actions.Query.SEARCH]!==e.filter&&this.props.updateFilter(e.location.query[_actions.Query.SEARCH],!1),e.location.query[_actions.Query.HIGHLIGHT]!==e.highlight&&this.props.updateHighlight(e.location.query[_actions.Query.HIGHLIGHT],!1)}},{key:"selectFlow",value:function(e){e?this.props.updateLocation("/flows/"+e.id+"/"+(this.props.routeParams.detailTab||"request")):this.props.updateLocation("/flows")}},{key:"selectFlowRelative",value:function(e){var t=this.props,l=t.flows,i=t.routeParams,s=t.selectedFlow,r=0;i.flowId?r=Math.min(Math.max(0,l.indexOf(s)+e),l.length-1):e<0&&(r=l.length-1),this.selectFlow(l[r])}},{key:"onMainKeyDown",value:function(e){var t=this.props.selectedFlow;if(!e.ctrlKey){switch(e.keyCode){case _utils.Key.K:case _utils.Key.UP:this.selectFlowRelative(-1);break;case _utils.Key.J:case _utils.Key.DOWN:this.selectFlowRelative(1);break;case _utils.Key.SPACE:case _utils.Key.PAGE_DOWN:this.selectFlowRelative(10);break;case _utils.Key.PAGE_UP:this.selectFlowRelative(-10);break;case _utils.Key.END:this.selectFlowRelative(1e10);break;case _utils.Key.HOME:this.selectFlowRelative(-1e10);break;case _utils.Key.ESC:this.selectFlow(null);break;case _utils.Key.H:case _utils.Key.LEFT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(-1);break;case _utils.Key.L:case _utils.Key.TAB:case _utils.Key.RIGHT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(1);break;case _utils.Key.C:e.shiftKey&&this.props.clearFlows();break;case _utils.Key.D:t&&(e.shiftKey?this.props.duplicateFlow(t):this.props.removeFlow(t));break;case _utils.Key.A:e.shiftKey?this.props.acceptAllFlows():t&&t.intercepted&&this.props.acceptFlow(t);break;case _utils.Key.R:!e.shiftKey&&t&&this.props.replayFlow(t);break;case _utils.Key.V:e.shiftKey&&t&&t.modified&&this.props.revertFlow(t);break;case _utils.Key.E:this.refs.flowDetails&&this.refs.flowDetails.promptEdit();break;case _utils.Key.SHIFT:break;default:return void console.debug("keydown",e.keyCode)}e.preventDefault()}}},{key:"render",value:function(){var e=this,t=this.props,l=t.flows,i=t.selectedFlow,s=t.highlight;return _react2["default"].createElement("div",{className:"main-view",__self:this},_react2["default"].createElement(_FlowTable2["default"],{ref:"flowTable",flows:l,selected:i,highlight:s,onSelect:function(t){return e.selectFlow(t)},__self:this}),i&&[_react2["default"].createElement(_Splitter2["default"],{key:"splitter",__self:this}),_react2["default"].createElement(_FlowView2["default"],{key:"flowDetails",ref:"flowDetails",tab:this.props.routeParams.detailTab,query:this.props.query,updateLocation:this.props.updateLocation,updateFlow:function(t){return e.props.updateFlow(i,t)},flow:i,__self:this})])}}]),t}(_react.Component);MainView.propTypes={highlight:_react.PropTypes.string,sort:_react.PropTypes.object},exports["default"]=(0,_reactRedux.connect)(function(e){return{flows:e.flows.views.main.view.data,filter:e.flows.views.main.filter,highlight:e.flows.views.main.highlight,selectedFlow:e.flows.list.byId[e.flows.views.main.selected[0]]}},{selectFlow:_main.select,updateFilter:_main.updateFilter,updateHighlight:_main.updateHighlight,updateFlow:flowsActions.update,clearFlows:flowsActions.clear,duplicateFlow:flowsActions.duplicate,removeFlow:flowsActions.remove,acceptAllFlows:flowsActions.acceptAll,acceptFlow:flowsActions.accept,replayFlow:flowsActions.replay,revertFlow:flowsActions.revert},void 0,{withRef:!0})(MainView); +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactRedux=require("react-redux"),_actions=require("../actions.js"),_Splitter=require("./common/Splitter"),_Splitter2=_interopRequireDefault(_Splitter),_FlowTable=require("./FlowTable"),_FlowTable2=_interopRequireDefault(_FlowTable),_FlowView=require("./FlowView"),_FlowView2=_interopRequireDefault(_FlowView),_flows=require("../ducks/flows"),flowsActions=_interopRequireWildcard(_flows),_flowView=require("../ducks/flowView"),MainView=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"componentWillReceiveProps",value:function(e){e.location.query[_actions.Query.SEARCH]!==e.filter&&this.props.updateFilter(e.location.query[_actions.Query.SEARCH],!1),e.location.query[_actions.Query.HIGHLIGHT]!==e.highlight&&this.props.updateHighlight(e.location.query[_actions.Query.HIGHLIGHT],!1)}},{key:"render",value:function(){var e=this,t=this.props,r=t.flows,o=t.selectedFlow,i=t.highlight;return _react2.default.createElement("div",{className:"main-view"},_react2.default.createElement(_FlowTable2.default,{ref:"flowTable",flows:r,selected:o,highlight:i,onSelect:function(t){return e.props.selectFlow(t.id)}}),o&&[_react2.default.createElement(_Splitter2.default,{key:"splitter"}),_react2.default.createElement(_FlowView2.default,{key:"flowDetails",ref:"flowDetails",tab:this.props.routeParams.detailTab,query:this.props.query,updateFlow:function(t){return e.props.updateFlow(o,t)},flow:o})])}}]),t}(_react.Component);MainView.propTypes={highlight:_react.PropTypes.string,sort:_react.PropTypes.object},exports.default=(0,_reactRedux.connect)(function(e){return{flows:e.flowView.data,filter:e.flowView.filter,highlight:e.flowView.highlight,selectedFlow:e.flows.byId[e.flows.selected[0]]}},{selectFlow:flowsActions.select,updateFilter:_flowView.updateFilter,updateHighlight:_flowView.updateHighlight,updateFlow:flowsActions.update},void 0,{withRef:!0})(MainView); -},{"../actions.js":1,"../ducks/flows":43,"../ducks/views/main":51,"../utils.js":55,"./FlowTable":10,"./FlowView":14,"./common/Splitter":35,"react":"react","react-redux":"react-redux"}],29:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Prompt(e,t){function r(e){return _lodash2["default"].map(u,"key").includes(e)}function o(e){e.stopPropagation(),e.preventDefault();var r=u.find(function(t){return _utils.Key[t.key.toUpperCase()]===e.keyCode});(r||e.keyCode===_utils.Key.ESC||e.keyCode===_utils.Key.ENTER)&&(n(r.key||!1),t.returnFocus())}for(var a=this,s=e.prompt,n=e.done,i=e.options,u=[],l=0;l<i.length;l++){var p=i[l];if(_lodash2["default"].isString(p)){for(var c=p;c.length>0&&r(c[0]);)c=c.substr(1);p={text:p,key:c[0]}}if(!p.text||!p.key||r(p.key))throw"invalid options";u.push(p)}return _react2["default"].createElement("div",{tabIndex:"0",onKeyDown:o,className:"prompt-dialog",__self:this},_react2["default"].createElement("div",{className:"prompt-content",__self:this},s||_react2["default"].createElement("strong",{__self:this},"Select: "),u.map(function(e){function t(t){n(e.key),t.stopPropagation()}var r=e.text.indexOf(e.key);return _react2["default"].createElement("span",{key:e.key,className:"option",onClick:t,__self:a},r!==-1?e.text.substring(0,r):e.text+"(",_react2["default"].createElement("strong",{className:"text-primary",__self:a},e.key),r!==-1?e.text.substring(r+1):")")})))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Prompt;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../utils.js");Prompt.contextTypes={returnFocus:_react.PropTypes.func},Prompt.propTypes={options:_react.PropTypes.array.isRequired,done:_react.PropTypes.func.isRequired,prompt:_react.PropTypes.string}; +},{"../actions.js":1,"../ducks/flowView":43,"../ducks/flows":44,"./FlowTable":10,"./FlowView":14,"./common/Splitter":35,"react":"react","react-redux":"react-redux"}],29:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function Prompt(e){function t(e){return _lodash2.default.map(i,"key").includes(e)}function r(e){e.stopPropagation(),e.preventDefault();var t=i.find(function(t){return _utils.Key[t.key.toUpperCase()]===e.keyCode});(t||e.keyCode===_utils.Key.ESC||e.keyCode===_utils.Key.ENTER)&&o(t.key||!1)}for(var a=e.prompt,o=e.done,n=e.options,i=[],u=0;u<n.length;u++){var s=n[u];if(_lodash2.default.isString(s)){for(var l=s;l.length>0&&t(l[0]);)l=l.substr(1);s={text:s,key:l[0]}}if(!s.text||!s.key||t(s.key))throw"invalid options";i.push(s)}return _react2.default.createElement("div",{tabIndex:"0",onKeyDown:r,className:"prompt-dialog"},_react2.default.createElement("div",{className:"prompt-content"},a||_react2.default.createElement("strong",null,"Select: "),i.map(function(e){function t(t){o(e.key),t.stopPropagation()}var r=e.text.indexOf(e.key);return _react2.default.createElement("span",{key:e.key,className:"option",onClick:t},r!==-1?e.text.substring(0,r):e.text+"(",_react2.default.createElement("strong",{className:"text-primary"},e.key),r!==-1?e.text.substring(r+1):")")})))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=Prompt;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../utils.js");Prompt.propTypes={options:_react.PropTypes.array.isRequired,done:_react.PropTypes.func.isRequired,prompt:_react.PropTypes.string}; -},{"../utils.js":55,"lodash":"lodash","react":"react","react-dom":"react-dom"}],30:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_reactRedux=require("react-redux"),_app=require("../ducks/app"),_Header=require("./Header"),_Header2=_interopRequireDefault(_Header),_EventLog=require("./EventLog"),_EventLog2=_interopRequireDefault(_EventLog),_Footer=require("./Footer"),_Footer2=_interopRequireDefault(_Footer),_utils=require("../utils.js"),ProxyAppMain=function(e){function t(e,r){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return n.focus=n.focus.bind(n),n.onKeyDown=n.onKeyDown.bind(n),n.updateLocation=n.updateLocation.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"componentWillMount",value:function(){this.props.appInit()}},{key:"componentDidMount",value:function(){this.focus()}},{key:"componentWillUnmount",value:function(){this.props.appDestruct()}},{key:"getChildContext",value:function(){return{returnFocus:this.focus}}},{key:"focus",value:function(){document.activeElement.blur(),window.getSelection().removeAllRanges(),_reactDom2["default"].findDOMNode(this).focus()}},{key:"onKeyDown",value:function(e){var t=this,r=null;switch(e.keyCode){case _utils.Key.I:r="intercept";break;case _utils.Key.L:r="search";break;case _utils.Key.H:r="highlight";break;default:var n=this.refs.view;return this.refs.view.refs.wrappedInstance&&(n=this.refs.view.refs.wrappedInstance),void(n.onMainKeyDown&&n.onMainKeyDown(e))}r&&!function(){var e=t.refs.header.refs.wrappedInstance||t.refs.header;e.setState({active:_Header2["default"].entries[0]},function(){var t=e.refs.active.refs.wrappedInstance||e.refs.active;t.refs[r].select()})}(),e.preventDefault()}},{key:"updateLocation",value:function(e,t){void 0===e&&(e=this.props.location.pathname);var r=this.props.location.query,n=!0,o=!1,a=void 0;try{for(var i,u=Object.keys(t||{})[Symbol.iterator]();!(n=(i=u.next()).done);n=!0){var s=i.value;r[s]=t[s]||void 0}}catch(c){o=!0,a=c}finally{try{!n&&u["return"]&&u["return"]()}finally{if(o)throw a}}this.context.router.replace({pathname:e,query:r})}},{key:"getQuery",value:function(){return _lodash2["default"].clone(this.props.location.query)}},{key:"render",value:function(){var e=this.props,t=e.showEventLog,r=e.location,n=e.children,o=this.getQuery();return _react2["default"].createElement("div",{id:"container",tabIndex:"0",onKeyDown:this.onKeyDown,__self:this},_react2["default"].createElement(_Header2["default"],{ref:"header",updateLocation:this.updateLocation,query:o,__self:this}),_react2["default"].cloneElement(n,{ref:"view",location:r,query:o,updateLocation:this.updateLocation}),t&&_react2["default"].createElement(_EventLog2["default"],{key:"eventlog",__self:this}),_react2["default"].createElement(_Footer2["default"],{__self:this}))}}]),t}(_react.Component);ProxyAppMain.childContextTypes={returnFocus:_react.PropTypes.func.isRequired},ProxyAppMain.contextTypes={router:_react.PropTypes.object.isRequired},exports["default"]=(0,_reactRedux.connect)(function(e){return{showEventLog:e.eventLog.visible,settings:e.settings.settings}},{appInit:_app.init,appDestruct:_app.destruct})(ProxyAppMain); +},{"../utils.js":54,"lodash":"lodash","react":"react","react-dom":"react-dom"}],30:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_reactRedux=require("react-redux"),_app=require("../ducks/app"),_ui=require("../ducks/ui"),_Header=require("./Header"),_Header2=_interopRequireDefault(_Header),_EventLog=require("./EventLog"),_EventLog2=_interopRequireDefault(_EventLog),_Footer=require("./Footer"),_Footer2=_interopRequireDefault(_Footer),_utils=require("../utils.js"),ProxyAppMain=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"componentWillMount",value:function(){this.props.appInit(this.context.router),window.addEventListener("keydown",this.props.onKeyDown)}},{key:"componentWillUnmount",value:function(){this.props.appDestruct(this.context.router),window.removeEventListener("keydown",this.props.onKeyDown)}},{key:"componentWillReceiveProps",value:function(e){e.query===this.props.query&&e.selectedFlowId===this.props.selectedFlowId&&e.panel===this.props.panel||(e.selectedFlowId?this.context.router.replace({pathname:"/flows/"+e.selectedFlowId+"/"+e.panel,query:e.query}):this.context.router.replace({pathname:"/flows",query:e.query}))}},{key:"render",value:function(){var e=this.props,t=e.showEventLog,r=e.location,o=e.children,n=e.query;return _react2.default.createElement("div",{id:"container",tabIndex:"0"},_react2.default.createElement(_Header2.default,{ref:"header",query:n}),_react2.default.cloneElement(o,{ref:"view",location:r,query:n}),t&&_react2.default.createElement(_EventLog2.default,{key:"eventlog"}),_react2.default.createElement(_Footer2.default,null))}}]),t}(_react.Component);ProxyAppMain.contextTypes={router:_react.PropTypes.object.isRequired},exports.default=(0,_reactRedux.connect)(function(e){return{showEventLog:e.eventLog.visible,query:e.ui.query,panel:e.ui.panel,selectedFlowId:e.flows.selected[0]}},{appInit:_app.init,appDestruct:_app.destruct,onKeyDown:_ui.onKeyDown})(ProxyAppMain); -},{"../ducks/app":41,"../utils.js":55,"./EventLog":8,"./Footer":19,"./Header":20,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],31:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},_createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_ValidateEditor=require("./ValueEditor/ValidateEditor"),_ValidateEditor2=_interopRequireDefault(_ValidateEditor),ValueEditor=function(e){function t(e){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return r.focus=r.focus.bind(r),r}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this,t=this.props.inline?"span":"div";return _react2["default"].createElement(_ValidateEditor2["default"],_extends({},this.props,{onStop:function(){return e.context.returnFocus()},tag:t,__self:this}))}},{key:"focus",value:function(){_reactDom2["default"].findDOMNode(this).focus()}}]),t}(_react.Component);ValueEditor.contextTypes={returnFocus:_react.PropTypes.func},ValueEditor.propTypes={content:_react.PropTypes.string.isRequired,onDone:_react.PropTypes.func.isRequired,inline:_react.PropTypes.bool},exports["default"]=ValueEditor; +},{"../ducks/app":41,"../ducks/ui":48,"../utils.js":54,"./EventLog":8,"./Footer":19,"./Header":20,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],31:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},_createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_ValidateEditor=require("./ValueEditor/ValidateEditor"),_ValidateEditor2=_interopRequireDefault(_ValidateEditor),ValueEditor=function(e){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,Object.getPrototypeOf(t).apply(this,arguments))}return _inherits(t,e),_createClass(t,[{key:"render",value:function(){var e=this.props.inline?"span":"div";return _react2.default.createElement(_ValidateEditor2.default,_extends({},this.props,{tag:e}))}},{key:"focus",value:function(){_reactDom2.default.findDOMNode(this).focus()}}]),t}(_react.Component);ValueEditor.propTypes={content:_react.PropTypes.string.isRequired,onDone:_react.PropTypes.func.isRequired,inline:_react.PropTypes.bool},exports.default=ValueEditor; },{"./ValueEditor/ValidateEditor":33,"react":"react","react-dom":"react-dom"}],32:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},_createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_utils=require("../../utils.js"),EditorBase=function(e){function t(e){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return n.state={editable:!1},n.onPaste=n.onPaste.bind(n),n.onMouseDown=n.onMouseDown.bind(n),n.onMouseUp=n.onMouseUp.bind(n),n.onFocus=n.onFocus.bind(n),n.onClick=n.onClick.bind(n),n.stop=n.stop.bind(n),n.onBlur=n.onBlur.bind(n),n.reset=n.reset.bind(n),n.onKeyDown=n.onKeyDown.bind(n),n.onInput=n.onInput.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"stop",value:function(){_reactDom2["default"].findDOMNode(this).blur(),this.props.onStop()}},{key:"render",value:function(){return _react2["default"].createElement(this.props.tag,_extends({},this.props,{tabIndex:"0",className:"inline-input "+this.props.className,contentEditable:this.state.editable||void 0,onFocus:this.onFocus,onMouseDown:this.onMouseDown,onClick:this.onClick,onBlur:this.onBlur,onKeyDown:this.onKeyDown,onInput:this.onInput,onPaste:this.onPaste,dangerouslySetInnerHTML:{__html:this.props.contentToHtml(this.props.content)},__self:this}))}},{key:"onPaste",value:function(e){e.preventDefault();var t=e.clipboardData.getData("text/plain");document.execCommand("insertHTML",!1,t)}},{key:"onMouseDown",value:function(e){this._mouseDown=!0,window.addEventListener("mouseup",this.onMouseUp),this.props.onMouseDown(e)}},{key:"onMouseUp",value:function(){this._mouseDown&&(this._mouseDown=!1,window.removeEventListener("mouseup",this.onMouseUp))}},{key:"onClick",value:function(e){this.onMouseUp(),this.onFocus(e)}},{key:"onFocus",value:function(e){var t=this;if(!(this._mouseDown||this._ignore_events||this.state.editable)){var n=window.getSelection(),o=void 0;if(n.rangeCount>0)o=n.getRangeAt(0);else if(document.caretPositionFromPoint&&e.clientX&&e.clientY){var s=document.caretPositionFromPoint(e.clientX,e.clientY);o=document.createRange(),o.setStart(s.offsetNode,s.offset)}else document.caretRangeFromPoint&&e.clientX&&e.clientY?o=document.caretRangeFromPoint(e.clientX,e.clientY):(o=document.createRange(),o.selectNodeContents(_reactDom2["default"].findDOMNode(this)));this._ignore_events=!0,this.setState({editable:!0},function(){var e=_reactDom2["default"].findDOMNode(t);e.blur(),e.focus(),t._ignore_events=!1})}}},{key:"onBlur",value:function(e){this._ignore_events||(window.getSelection().removeAllRanges(),this.setState({editable:!1}),this.props.onDone(this.props.nodeToContent(_reactDom2["default"].findDOMNode(this))),this.props.onBlur(e))}},{key:"reset",value:function(){_reactDom2["default"].findDOMNode(this).innerHTML=this.props.contentToHtml(this.props.content)}},{key:"onKeyDown",value:function(e){switch(e.stopPropagation(),e.keyCode){case _utils.Key.ESC:e.preventDefault(),this.reset(),this.stop();break;case _utils.Key.ENTER:this.props.submitOnEnter&&!e.shiftKey&&(e.preventDefault(),this.stop())}}},{key:"onInput",value:function(){this.props.onInput(this.props.nodeToContent(_reactDom2["default"].findDOMNode(this)))}}]),t}(_react.Component);EditorBase.propTypes={content:_react.PropTypes.string.isRequired,onDone:_react.PropTypes.func.isRequired,contentToHtml:_react.PropTypes.func,nodeToContent:_react.PropTypes.func,onStop:_react.PropTypes.func,submitOnEnter:_react.PropTypes.bool,className:_react.PropTypes.string,tag:_react.PropTypes.string},EditorBase.defaultProps={contentToHtml:function(e){return _.escape(e)},nodeToContent:function(e){return e.textContent},submitOnEnter:!0,className:"",tag:"div",onStop:_.noop,onMouseDown:_.noop,onBlur:_.noop,onInput:_.noop},exports["default"]=EditorBase; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_utils=require("../../utils.js"),EditorBase=function(e){function t(e){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return n.state={editable:!1},n.onPaste=n.onPaste.bind(n),n.onMouseDown=n.onMouseDown.bind(n),n.onMouseUp=n.onMouseUp.bind(n),n.onFocus=n.onFocus.bind(n),n.onClick=n.onClick.bind(n),n.stop=n.stop.bind(n),n.onBlur=n.onBlur.bind(n),n.reset=n.reset.bind(n),n.onKeyDown=n.onKeyDown.bind(n),n.onInput=n.onInput.bind(n),n}return _inherits(t,e),_createClass(t,[{key:"stop",value:function(){_reactDom2.default.findDOMNode(this).blur(),this.props.onStop()}},{key:"render",value:function(){return _react2.default.createElement(this.props.tag,{tabIndex:"0",className:"inline-input "+this.props.className,contentEditable:this.state.editable||void 0,onFocus:this.onFocus,onMouseDown:this.onMouseDown,onClick:this.onClick,onBlur:this.onBlur,onKeyDown:this.onKeyDown,onInput:this.onInput,onPaste:this.onPaste,dangerouslySetInnerHTML:{__html:this.props.contentToHtml(this.props.content)}})}},{key:"onPaste",value:function(e){e.preventDefault();var t=e.clipboardData.getData("text/plain");document.execCommand("insertHTML",!1,t)}},{key:"onMouseDown",value:function(e){this._mouseDown=!0,window.addEventListener("mouseup",this.onMouseUp),this.props.onMouseDown(e)}},{key:"onMouseUp",value:function(){this._mouseDown&&(this._mouseDown=!1,window.removeEventListener("mouseup",this.onMouseUp))}},{key:"onClick",value:function(e){this.onMouseUp(),this.onFocus(e)}},{key:"onFocus",value:function(e){var t=this;if(!(this._mouseDown||this._ignore_events||this.state.editable)){var n=window.getSelection(),o=void 0;if(n.rangeCount>0)o=n.getRangeAt(0);else if(document.caretPositionFromPoint&&e.clientX&&e.clientY){var s=document.caretPositionFromPoint(e.clientX,e.clientY);o=document.createRange(),o.setStart(s.offsetNode,s.offset)}else document.caretRangeFromPoint&&e.clientX&&e.clientY?o=document.caretRangeFromPoint(e.clientX,e.clientY):(o=document.createRange(),o.selectNodeContents(_reactDom2.default.findDOMNode(this)));this._ignore_events=!0,this.setState({editable:!0},function(){var e=_reactDom2.default.findDOMNode(t);e.blur(),e.focus(),t._ignore_events=!1})}}},{key:"onBlur",value:function(e){this._ignore_events||(window.getSelection().removeAllRanges(),this.setState({editable:!1}),this.props.onDone(this.props.nodeToContent(_reactDom2.default.findDOMNode(this))),this.props.onBlur(e))}},{key:"reset",value:function(){_reactDom2.default.findDOMNode(this).innerHTML=this.props.contentToHtml(this.props.content)}},{key:"onKeyDown",value:function(e){switch(e.stopPropagation(),e.keyCode){case _utils.Key.ESC:e.preventDefault(),this.reset(),this.stop();break;case _utils.Key.ENTER:this.props.submitOnEnter&&!e.shiftKey&&(e.preventDefault(),this.stop())}}},{key:"onInput",value:function(){this.props.onInput(this.props.nodeToContent(_reactDom2.default.findDOMNode(this)))}}]),t}(_react.Component);EditorBase.propTypes={content:_react.PropTypes.string.isRequired,onDone:_react.PropTypes.func.isRequired,contentToHtml:_react.PropTypes.func,nodeToContent:_react.PropTypes.func,onStop:_react.PropTypes.func,submitOnEnter:_react.PropTypes.bool,className:_react.PropTypes.string,tag:_react.PropTypes.string},EditorBase.defaultProps={contentToHtml:function(e){return _.escape(e)},nodeToContent:function(e){return e.textContent},submitOnEnter:!0,className:"",tag:"div",onStop:_.noop,onMouseDown:_.noop,onBlur:_.noop,onInput:_.noop},exports.default=EditorBase; -},{"../../utils.js":55,"react":"react","react-dom":"react-dom"}],33:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_EditorBase=require("./EditorBase"),_EditorBase2=_interopRequireDefault(_EditorBase),ValidateEditor=function(e){function t(e){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return r.state={currentContent:e.content},r.onInput=r.onInput.bind(r),r.onDone=r.onDone.bind(r),r}return _inherits(t,e),_createClass(t,[{key:"componentWillReceiveProps",value:function(e){this.setState({currentContent:e.content})}},{key:"onInput",value:function(e){this.setState({currentContent:e}),this.props.onInput&&this.props.onInput(e)}},{key:"onDone",value:function(e){this.props.isValid&&!this.props.isValid(e)&&(this.refs.editor.reset(),e=this.props.content),this.props.onDone(e)}},{key:"render",value:function(){var e=this.props.className||"";return this.props.isValid&&(e+=this.props.isValid(this.state.currentContent)?" has-success":" has-warning"),_react2["default"].createElement(_EditorBase2["default"],_extends({},this.props,{ref:"editor",className:e,onDone:this.onDone,onInput:this.onInput,__self:this}))}}]),t}(_react.Component);ValidateEditor.propTypes={content:_react.PropTypes.string.isRequired,onDone:_react.PropTypes.func.isRequired,onInput:_react.PropTypes.func,isValid:_react.PropTypes.func,className:_react.PropTypes.string},exports["default"]=ValidateEditor; +},{"../../utils.js":54,"react":"react","react-dom":"react-dom"}],33:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_createClass=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_EditorBase=require("./EditorBase"),_EditorBase2=_interopRequireDefault(_EditorBase),ValidateEditor=function(e){function t(e){_classCallCheck(this,t);var r=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return r.state={currentContent:e.content},r.onInput=r.onInput.bind(r),r.onDone=r.onDone.bind(r),r}return _inherits(t,e),_createClass(t,[{key:"componentWillReceiveProps",value:function(e){this.setState({currentContent:e.content})}},{key:"onInput",value:function(e){this.setState({currentContent:e}),this.props.onInput&&this.props.onInput(e)}},{key:"onDone",value:function(e){this.props.isValid&&!this.props.isValid(e)&&(this.refs.editor.reset(),e=this.props.content),this.props.onDone(e)}},{key:"render",value:function(){var e=this.props.className||"";return this.props.isValid&&(e+=this.props.isValid(this.state.currentContent)?" has-success":" has-warning"),_react2.default.createElement(_EditorBase2.default,_extends({},this.props,{ref:"editor",className:e,onDone:this.onDone,onInput:this.onInput}))}}]),t}(_react.Component);ValidateEditor.propTypes={content:_react.PropTypes.string.isRequired,onDone:_react.PropTypes.func.isRequired,onInput:_react.PropTypes.func,isValid:_react.PropTypes.func,className:_react.PropTypes.string},exports.default=ValidateEditor; },{"./EditorBase":32,"react":"react","react-dom":"react-dom"}],34:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Button(e){var t=e.onClick,r=e.text,a=e.icon,i=e.disabled;return _react2["default"].createElement("div",{className:"btn btn-default",onClick:t,disabled:i,__self:this},_react2["default"].createElement("i",{className:"fa fa-fw "+a,__self:this})," ",r)}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Button;var _react=require("react"),_react2=_interopRequireDefault(_react);Button.propTypes={onClick:_react.PropTypes.func.isRequired,text:_react.PropTypes.string.isRequired}; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function Button(e){var t=e.onClick,r=e.text,a=e.icon,u=e.disabled;return _react2.default.createElement("div",{className:"btn btn-default",onClick:t,disabled:u},_react2.default.createElement("i",{className:"fa fa-fw "+a})," ",r)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=Button;var _react=require("react"),_react2=_interopRequireDefault(_react);Button.propTypes={onClick:_react.PropTypes.func.isRequired,text:_react.PropTypes.string.isRequired}; },{"react":"react"}],35:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),Splitter=function(e){function t(e,n){_classCallCheck(this,t);var o=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,n));return o.state={applied:!1,startX:!1,startY:!1},o.onMouseMove=o.onMouseMove.bind(o),o.onMouseUp=o.onMouseUp.bind(o),o.onDragEnd=o.onDragEnd.bind(o),o}return _inherits(t,e),_createClass(t,[{key:"onMouseDown",value:function(e){this.setState({startX:e.pageX,startY:e.pageY}),window.addEventListener("mousemove",this.onMouseMove),window.addEventListener("mouseup",this.onMouseUp),window.addEventListener("dragend",this.onDragEnd)}},{key:"onDragEnd",value:function(){_reactDom2["default"].findDOMNode(this).style.transform="",window.removeEventListener("dragend",this.onDragEnd),window.removeEventListener("mouseup",this.onMouseUp),window.removeEventListener("mousemove",this.onMouseMove)}},{key:"onMouseUp",value:function(e){this.onDragEnd();var t=_reactDom2["default"].findDOMNode(this),n=t.previousElementSibling,o=n.offsetHeight+e.pageY-this.state.startY;"x"===this.props.axis&&(o=n.offsetWidth+e.pageX-this.state.startX),n.style.flex="0 0 "+Math.max(0,o)+"px",t.nextElementSibling.style.flex="1 1 auto",this.setState({applied:!0}),this.onResize()}},{key:"onMouseMove",value:function(e){var t=0,n=0;"x"===this.props.axis?t=e.pageX-this.state.startX:n=e.pageY-this.state.startY,_reactDom2["default"].findDOMNode(this).style.transform="translate("+t+"px, "+n+"px)"}},{key:"onResize",value:function(){window.setTimeout(function(){return window.dispatchEvent(new CustomEvent("resize"))},1)}},{key:"reset",value:function(e){if(this.state.applied){var t=_reactDom2["default"].findDOMNode(this);t.previousElementSibling.style.flex="",t.nextElementSibling.style.flex="",e||this.setState({applied:!1}),this.onResize()}}},{key:"componentWillUnmount",value:function(){this.reset(!0)}},{key:"render",value:function(){return _react2["default"].createElement("div",{className:(0,_classnames2["default"])("splitter","x"===this.props.axis?"splitter-x":"splitter-y"),__self:this},_react2["default"].createElement("div",{onMouseDown:this.onMouseDown,draggable:"true",__self:this}))}}]),t}(_react.Component);Splitter.defaultProps={axis:"x"},exports["default"]=Splitter; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),Splitter=function(e){function t(e,n){_classCallCheck(this,t);var o=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,n));return o.state={applied:!1,startX:!1,startY:!1},o.onMouseMove=o.onMouseMove.bind(o),o.onMouseUp=o.onMouseUp.bind(o),o.onDragEnd=o.onDragEnd.bind(o),o}return _inherits(t,e),_createClass(t,[{key:"onMouseDown",value:function(e){this.setState({startX:e.pageX,startY:e.pageY}),window.addEventListener("mousemove",this.onMouseMove),window.addEventListener("mouseup",this.onMouseUp),window.addEventListener("dragend",this.onDragEnd)}},{key:"onDragEnd",value:function(){_reactDom2.default.findDOMNode(this).style.transform="",window.removeEventListener("dragend",this.onDragEnd),window.removeEventListener("mouseup",this.onMouseUp),window.removeEventListener("mousemove",this.onMouseMove)}},{key:"onMouseUp",value:function(e){this.onDragEnd();var t=_reactDom2.default.findDOMNode(this),n=t.previousElementSibling,o=n.offsetHeight+e.pageY-this.state.startY;"x"===this.props.axis&&(o=n.offsetWidth+e.pageX-this.state.startX),n.style.flex="0 0 "+Math.max(0,o)+"px",t.nextElementSibling.style.flex="1 1 auto",this.setState({applied:!0}),this.onResize()}},{key:"onMouseMove",value:function(e){var t=0,n=0;"x"===this.props.axis?t=e.pageX-this.state.startX:n=e.pageY-this.state.startY,_reactDom2.default.findDOMNode(this).style.transform="translate("+t+"px, "+n+"px)"}},{key:"onResize",value:function(){window.setTimeout(function(){return window.dispatchEvent(new CustomEvent("resize"))},1)}},{key:"reset",value:function(e){if(this.state.applied){var t=_reactDom2.default.findDOMNode(this);t.previousElementSibling.style.flex="",t.nextElementSibling.style.flex="",e||this.setState({applied:!1}),this.onResize()}}},{key:"componentWillUnmount",value:function(){this.reset(!0)}},{key:"render",value:function(){return _react2.default.createElement("div",{className:(0,_classnames2.default)("splitter","x"===this.props.axis?"splitter-x":"splitter-y")},_react2.default.createElement("div",{onMouseDown:this.onMouseDown,draggable:"true"}))}}]),t}(_react.Component);Splitter.defaultProps={axis:"x"},exports.default=Splitter; },{"classnames":"classnames","react":"react","react-dom":"react-dom"}],36:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function ToggleButton(e){var t=e.checked,r=e.onToggle,a=e.text;return _react2["default"].createElement("div",{className:"btn btn-toggle "+(t?"btn-primary":"btn-default"),onClick:r,__self:this},_react2["default"].createElement("i",{className:"fa fa-fw "+(t?"fa-check-square-o":"fa-square-o"),__self:this})," ",a)}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=ToggleButton;var _react=require("react"),_react2=_interopRequireDefault(_react);ToggleButton.propTypes={checked:_react.PropTypes.bool.isRequired,onToggle:_react.PropTypes.func.isRequired,text:_react.PropTypes.string.isRequired}; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function ToggleButton(e){var t=e.checked,r=e.onToggle,a=e.text;return _react2.default.createElement("div",{className:"btn btn-toggle "+(t?"btn-primary":"btn-default"),onClick:r},_react2.default.createElement("i",{className:"fa fa-fw "+(t?"fa-check-square-o":"fa-square-o")})," ",a)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=ToggleButton;var _react=require("react"),_react2=_interopRequireDefault(_react);ToggleButton.propTypes={checked:_react.PropTypes.bool.isRequired,onToggle:_react.PropTypes.func.isRequired,text:_react.PropTypes.string.isRequired}; },{"react":"react"}],37:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_utils=require("../../utils"),ToggleInputButton=function(e){function t(e){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return n.state={txt:e.txt},n}return _inherits(t,e),_createClass(t,[{key:"onChange",value:function(e){this.setState({txt:e.target.value})}},{key:"onKeyDown",value:function(e){e.stopPropagation(),e.keyCode===_utils.Key.ENTER&&this.props.onToggleChanged(this.state.txt)}},{key:"render",value:function(){var e=this;return _react2["default"].createElement("div",{className:"input-group toggle-input-btn",__self:this},_react2["default"].createElement("span",{className:"input-group-btn",onClick:function(){return e.props.onToggleChanged(e.state.txt)},__self:this},_react2["default"].createElement("div",{className:(0,_classnames2["default"])("btn",this.props.checked?"btn-primary":"btn-default"),__self:this},_react2["default"].createElement("span",{className:(0,_classnames2["default"])("fa",this.props.checked?"fa-check-square-o":"fa-square-o"),__self:this})," ",this.props.name)),_react2["default"].createElement("input",{className:"form-control",placeholder:this.props.placeholder,disabled:this.props.checked,value:this.state.txt,type:this.props.inputType,onChange:function(t){return e.onChange(t)},onKeyDown:function(t){return e.onKeyDown(t)},__self:this}))}}]),t}(_react.Component);ToggleInputButton.propTypes={name:_react.PropTypes.string.isRequired,txt:_react.PropTypes.string.isRequired,onToggleChanged:_react.PropTypes.func.isRequired},exports["default"]=ToggleInputButton; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),_react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_utils=require("../../utils"),ToggleInputButton=function(e){function t(e){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e));return n.state={txt:e.txt},n}return _inherits(t,e),_createClass(t,[{key:"onChange",value:function(e){this.setState({txt:e.target.value})}},{key:"onKeyDown",value:function(e){e.stopPropagation(),e.keyCode===_utils.Key.ENTER&&this.props.onToggleChanged(this.state.txt)}},{key:"render",value:function(){var e=this;return _react2.default.createElement("div",{className:"input-group toggle-input-btn"},_react2.default.createElement("span",{className:"input-group-btn",onClick:function(){return e.props.onToggleChanged(e.state.txt)}},_react2.default.createElement("div",{className:(0,_classnames2.default)("btn",this.props.checked?"btn-primary":"btn-default")},_react2.default.createElement("span",{className:(0,_classnames2.default)("fa",this.props.checked?"fa-check-square-o":"fa-square-o")})," ",this.props.name)),_react2.default.createElement("input",{className:"form-control",placeholder:this.props.placeholder,disabled:this.props.checked,value:this.state.txt,type:this.props.inputType,onChange:function(t){return e.onChange(t)},onKeyDown:function(t){return e.onKeyDown(t)}}))}}]),t}(_react.Component);ToggleInputButton.propTypes={name:_react.PropTypes.string.isRequired,txt:_react.PropTypes.string.isRequired,onToggleChanged:_react.PropTypes.func.isRequired},exports.default=ToggleInputButton; -},{"../../utils":55,"classnames":"classnames","react":"react"}],38:[function(require,module,exports){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var o=0;o<e.length;o++){var r=e[o];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,o,r){return o&&t(e.prototype,o),r&&t(e,r),e}}(),_get=function t(e,o,r){null===e&&(e=Function.prototype);var n=Object.getOwnPropertyDescriptor(e,o);if(void 0===n){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,o,r)}if("value"in n)return n.value;var c=n.get;if(void 0!==c)return c.call(r)},_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),symShouldStick=Symbol("shouldStick"),isAtBottom=function(t){return t.scrollTop+t.clientHeight===t.scrollHeight};exports["default"]=function(t){var e,o;return Object.assign((o=e=function(t){function e(){return _classCallCheck(this,e),_possibleConstructorReturn(this,Object.getPrototypeOf(e).apply(this,arguments))}return _inherits(e,t),_createClass(e,[{key:"componentWillUpdate",value:function(){var t=_reactDom2["default"].findDOMNode(this);this[symShouldStick]=t.scrollTop&&isAtBottom(t),_get(Object.getPrototypeOf(e.prototype),"componentWillUpdate",this)&&_get(Object.getPrototypeOf(e.prototype),"componentWillUpdate",this).call(this)}},{key:"componentDidUpdate",value:function(){var t=_reactDom2["default"].findDOMNode(this);this[symShouldStick]&&!isAtBottom(t)&&(t.scrollTop=t.scrollHeight),_get(Object.getPrototypeOf(e.prototype),"componentDidUpdate",this)&&_get(Object.getPrototypeOf(e.prototype),"componentDidUpdate",this).call(this)}}]),e}(t),e.displayName=t.name,o),t)}; +},{"../../utils":54,"classnames":"classnames","react":"react"}],38:[function(require,module,exports){ +"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var o=0;o<e.length;o++){var r=e[o];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,o,r){return o&&t(e.prototype,o),r&&t(e,r),e}}(),_get=function t(e,o,r){null===e&&(e=Function.prototype);var n=Object.getOwnPropertyDescriptor(e,o);if(void 0===n){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,o,r)}if("value"in n)return n.value;var c=n.get;if(void 0!==c)return c.call(r)},_react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),symShouldStick=Symbol("shouldStick"),isAtBottom=function(t){return t.scrollTop+t.clientHeight===t.scrollHeight};exports.default=function(t){var e,o;return Object.assign((o=e=function(t){function e(){return _classCallCheck(this,e),_possibleConstructorReturn(this,Object.getPrototypeOf(e).apply(this,arguments))}return _inherits(e,t),_createClass(e,[{key:"componentWillUpdate",value:function(){var t=_reactDom2.default.findDOMNode(this);this[symShouldStick]=t.scrollTop&&isAtBottom(t),_get(Object.getPrototypeOf(e.prototype),"componentWillUpdate",this)&&_get(Object.getPrototypeOf(e.prototype),"componentWillUpdate",this).call(this)}},{key:"componentDidUpdate",value:function(){var t=_reactDom2.default.findDOMNode(this);this[symShouldStick]&&!isAtBottom(t)&&(t.scrollTop=t.scrollHeight),_get(Object.getPrototypeOf(e.prototype),"componentDidUpdate",this)&&_get(Object.getPrototypeOf(e.prototype),"componentDidUpdate",this).call(this)}}]),e}(t),e.displayName=t.name,o),t)}; },{"react":"react","react-dom":"react-dom"}],39:[function(require,module,exports){ "use strict";function calcVScroll(t){if(!t)return{start:0,end:0,paddingTop:0,paddingBottom:0};var e=t.itemCount,o=t.rowHeight,r=t.viewportTop,a=t.viewportHeight,i=t.itemHeights,l=r+a,n=0,c=0,d=0,p=0;if(i)for(var h=0,s=0;h<e;h++){var m=i[h]||o;s<=r&&h%2===0&&(d=s,n=h),s<=l?c=h+1:p+=m,s+=m}else n=Math.max(0,Math.floor(r/o)-1)&-2,c=Math.min(e,n+Math.ceil(a/o)+2),d=Math.min(n,e)*o,p=Math.max(0,e-c)*o;return{start:n,end:c,paddingTop:d,paddingBottom:p}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.calcVScroll=calcVScroll; },{}],40:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.AppDispatcher=void 0;var _flux=require("flux"),_flux2=_interopRequireDefault(_flux),PayloadSources={VIEW:"view",SERVER:"server"},AppDispatcher=exports.AppDispatcher=new _flux2["default"].Dispatcher;AppDispatcher.dispatchViewAction=function(e){e.source=PayloadSources.VIEW,this.dispatch(e)},AppDispatcher.dispatchServerAction=function(e){e.source=PayloadSources.SERVER,this.dispatch(e)}; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.AppDispatcher=void 0;var _flux=require("flux"),_flux2=_interopRequireDefault(_flux),PayloadSources={VIEW:"view",SERVER:"server"},AppDispatcher=exports.AppDispatcher=new _flux2.default.Dispatcher;AppDispatcher.dispatchViewAction=function(e){e.source=PayloadSources.VIEW,this.dispatch(e)},AppDispatcher.dispatchServerAction=function(e){e.source=PayloadSources.SERVER,this.dispatch(e)}; },{"flux":"flux"}],41:[function(require,module,exports){ "use strict";function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){default:return e}}function init(){return function(e){e((0,_websocket.connect)()),e({type:INIT})}}function destruct(){return function(e){e((0,_websocket.disconnect)()),e({type:DESTRUCT})}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.INIT=void 0,exports.reduce=reduce,exports.init=init,exports.destruct=destruct;var _websocket=require("./websocket"),INIT=exports.INIT="APP_INIT",defaultState={}; -},{"./websocket":52}],42:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t["default"]=e,t}function _defineProperty(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1],i=function(){switch(t.type){case TOGGLE_VISIBILITY:return{v:_extends({},e,{visible:!e.visible})};case TOGGLE_FILTER:var i=_extends({},e.filters,_defineProperty({},t.filter,!e.filters[t.filter]));return{v:_extends({},e,{filters:i,view:(0,viewActions["default"])(e.view,viewActions.updateFilter(e.list,function(e){return i[e.level]}))})};case ADD:var r={id:e.logId,message:t.message,level:t.level};return{v:_extends({},e,{logId:e.logId+1,list:(0,listActions["default"])(e.list,listActions.add(r)),view:(0,viewActions["default"])(e.view,viewActions.add(r,function(t){return e.filters[t.level]}))})};case RECEIVE:return{v:_extends({},e,{list:(0,listActions["default"])(e.list,listActions.receive(t.list)),view:(0,viewActions["default"])(e.view,viewActions.receive(list,function(t){return e.filters[t.level]}))})};default:return{v:e}}}();if("object"===("undefined"==typeof i?"undefined":_typeof(i)))return i.v}function toggleFilter(e){return{type:TOGGLE_FILTER,filter:e}}function toggleVisibility(){return{type:TOGGLE_VISIBILITY}}function add(e){var t=arguments.length<=1||void 0===arguments[1]?"web":arguments[1];return{type:ADD,message:e,level:t}}function handleWsMsg(e){switch(e.cmd){case websocketActions.CMD_ADD:return add(e.data.message,e.data.level);case websocketActions.CMD_RESET:return fetchData();default:return{type:UNKNOWN_CMD,msg:e}}}function fetchData(){return msgQueueActions.fetchData(MSG_TYPE)}function receiveData(e){return{type:RECEIVE,list:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FETCH_ERROR=exports.UNKNOWN_CMD=exports.TOGGLE_FILTER=exports.TOGGLE_VISIBILITY=exports.RECEIVE=exports.ADD=exports.DATA_URL=exports.MSG_TYPE=void 0;var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r])}return e};exports["default"]=reduce,exports.toggleFilter=toggleFilter,exports.toggleVisibility=toggleVisibility,exports.add=add,exports.handleWsMsg=handleWsMsg,exports.fetchData=fetchData,exports.receiveData=receiveData;var _list=require("./utils/list"),listActions=_interopRequireWildcard(_list),_view=require("./utils/view"),viewActions=_interopRequireWildcard(_view),_websocket=require("./websocket"),websocketActions=_interopRequireWildcard(_websocket),_msgQueue=require("./msgQueue"),msgQueueActions=_interopRequireWildcard(_msgQueue),MSG_TYPE=exports.MSG_TYPE="UPDATE_EVENTLOG",DATA_URL=exports.DATA_URL="/events",ADD=exports.ADD="EVENTLOG_ADD",RECEIVE=exports.RECEIVE="EVENTLOG_RECEIVE",TOGGLE_VISIBILITY=exports.TOGGLE_VISIBILITY="EVENTLOG_TOGGLE_VISIBILITY",TOGGLE_FILTER=exports.TOGGLE_FILTER="EVENTLOG_TOGGLE_FILTER",UNKNOWN_CMD=exports.UNKNOWN_CMD="EVENTLOG_UNKNOWN_CMD",FETCH_ERROR=exports.FETCH_ERROR="EVENTLOG_FETCH_ERROR",defaultState={logId:0,visible:!1,filters:{debug:!1,info:!0,web:!0},list:(0,listActions["default"])(void 0,{}),view:(0,viewActions["default"])(void 0,{})}; +},{"./websocket":51}],42:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t.default=e,t}function _defineProperty(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1],i=function(){switch(t.type){case TOGGLE_VISIBILITY:return{v:_extends({},e,{visible:!e.visible})};case TOGGLE_FILTER:var i=_extends({},e.filters,_defineProperty({},t.filter,!e.filters[t.filter]));return{v:_extends({},e,{filters:i,view:(0,viewActions.default)(e.view,viewActions.updateFilter(e.list.data,function(e){return i[e.level]}))})};case ADD:var r={id:e.logId,message:t.message,level:t.level};return{v:_extends({},e,{logId:e.logId+1,list:(0,listActions.default)(e.list,listActions.add(r)),view:(0,viewActions.default)(e.view,viewActions.add(r,function(t){return e.filters[t.level]}))})};case RECEIVE:return{v:_extends({},e,{list:(0,listActions.default)(e.list,listActions.receive(t.list)),view:(0,viewActions.default)(e.view,viewActions.receive(t.list,function(t){return e.filters[t.level]}))})};default:return{v:e}}}();if("object"===("undefined"==typeof i?"undefined":_typeof(i)))return i.v}function toggleFilter(e){return{type:TOGGLE_FILTER,filter:e}}function toggleVisibility(){return{type:TOGGLE_VISIBILITY}}function add(e){var t=arguments.length<=1||void 0===arguments[1]?"web":arguments[1];return{type:ADD,message:e,level:t}}function handleWsMsg(e){switch(e.cmd){case websocketActions.CMD_ADD:return add(e.data.message,e.data.level);case websocketActions.CMD_RESET:return fetchData();default:return{type:UNKNOWN_CMD,msg:e}}}function fetchData(){return msgQueueActions.fetchData(MSG_TYPE)}function receiveData(e){return{type:RECEIVE,list:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FETCH_ERROR=exports.UNKNOWN_CMD=exports.TOGGLE_FILTER=exports.TOGGLE_VISIBILITY=exports.RECEIVE=exports.ADD=exports.DATA_URL=exports.MSG_TYPE=void 0;var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r])}return e};exports.default=reduce,exports.toggleFilter=toggleFilter,exports.toggleVisibility=toggleVisibility,exports.add=add,exports.handleWsMsg=handleWsMsg,exports.fetchData=fetchData,exports.receiveData=receiveData;var _list=require("./utils/list"),listActions=_interopRequireWildcard(_list),_view=require("./utils/view"),viewActions=_interopRequireWildcard(_view),_websocket=require("./websocket"),websocketActions=_interopRequireWildcard(_websocket),_msgQueue=require("./msgQueue"),msgQueueActions=_interopRequireWildcard(_msgQueue),MSG_TYPE=exports.MSG_TYPE="UPDATE_EVENTLOG",DATA_URL=exports.DATA_URL="/events",ADD=exports.ADD="EVENTLOG_ADD",RECEIVE=exports.RECEIVE="EVENTLOG_RECEIVE",TOGGLE_VISIBILITY=exports.TOGGLE_VISIBILITY="EVENTLOG_TOGGLE_VISIBILITY",TOGGLE_FILTER=exports.TOGGLE_FILTER="EVENTLOG_TOGGLE_FILTER",UNKNOWN_CMD=exports.UNKNOWN_CMD="EVENTLOG_UNKNOWN_CMD",FETCH_ERROR=exports.FETCH_ERROR="EVENTLOG_FETCH_ERROR",defaultState={logId:0,visible:!1,filters:{debug:!1,info:!0,web:!0},list:(0,listActions.default)(void 0,{}),view:(0,viewActions.default)(void 0,{})}; -},{"./msgQueue":45,"./utils/list":48,"./utils/view":49,"./websocket":52}],43:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t["default"]=e,t}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case ADD:return _extends({},e,{list:(0,listActions["default"])(e.list,listActions.add(t.item)),views:(0,viewsActions["default"])(e.views,viewsActions.add(t.item))});case UPDATE:return _extends({},e,{list:(0,listActions["default"])(e.list,listActions.update(t.id,t.item)),views:(0,viewsActions["default"])(e.views,viewsActions.update(t.id,t.item))});case REMOVE:return _extends({},e,{list:(0,listActions["default"])(e.list,listActions.remove(t.id)),views:(0,viewsActions["default"])(e.views,viewsActions.remove(t.id))});case RECEIVE:var i=(0,listActions["default"])(e.list,listActions.receive(t.list));return _extends({},e,{list:i,views:(0,viewsActions["default"])(e.views,viewsActions.receive(i))});default:return _extends({},e,{list:(0,listActions["default"])(e.list,t),views:(0,viewsActions["default"])(e.views,t)})}}function accept(e){return(0,_utils.fetchApi)("/flows/"+e.id+"/accept",{method:"POST"}),{type:REQUEST_ACTION}}function acceptAll(){return(0,_utils.fetchApi)("/flows/accept",{method:"POST"}),{type:REQUEST_ACTION}}function remove(e){return(0,_utils.fetchApi)("/flows/"+e.id,{method:"DELETE"}),{type:REQUEST_ACTION}}function duplicate(e){return(0,_utils.fetchApi)("/flows/"+e.id+"/duplicate",{method:"POST"}),{type:REQUEST_ACTION}}function replay(e){return(0,_utils.fetchApi)("/flows/"+e.id+"/replay",{method:"POST"}),{type:REQUEST_ACTION}}function revert(e){return(0,_utils.fetchApi)("/flows/"+e.id+"/revert",{method:"POST"}),{type:REQUEST_ACTION}}function update(e,t){return _utils.fetchApi.put("/flows/"+e.id,t),{type:REQUEST_ACTION}}function clear(){return(0,_utils.fetchApi)("/clear",{method:"POST"}),{type:REQUEST_ACTION}}function download(){return window.location="/flows/dump",{type:REQUEST_ACTION}}function upload(e){var t=new FormData;return t.append("file",e),(0,_utils.fetchApi)("/flows/dump",{method:"post",body:t}),{type:REQUEST_ACTION}}function handleWsMsg(e){switch(e.cmd){case websocketActions.CMD_ADD:return addItem(e.data);case websocketActions.CMD_UPDATE:return updateItem(e.data.id,e.data);case websocketActions.CMD_REMOVE:return removeItem(e.data.id);case websocketActions.CMD_RESET:return fetchData();default:return{type:UNKNOWN_CMD,msg:e}}}function fetchData(){return msgQueueActions.fetchData(MSG_TYPE)}function receiveData(e){return{type:RECEIVE,list:e}}function addItem(e){return{type:ADD,item:e}}function updateItem(e,t){return{type:UPDATE,id:e,item:t}}function removeItem(e){return{type:REMOVE,id:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FETCH_ERROR=exports.UNKNOWN_CMD=exports.REQUEST_ACTION=exports.RECEIVE=exports.REMOVE=exports.UPDATE=exports.ADD=exports.DATA_URL=exports.MSG_TYPE=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var s in i)Object.prototype.hasOwnProperty.call(i,s)&&(e[s]=i[s])}return e};exports["default"]=reduce,exports.accept=accept,exports.acceptAll=acceptAll,exports.remove=remove,exports.duplicate=duplicate,exports.replay=replay,exports.revert=revert,exports.update=update,exports.clear=clear,exports.download=download,exports.upload=upload,exports.handleWsMsg=handleWsMsg,exports.fetchData=fetchData,exports.receiveData=receiveData,exports.addItem=addItem,exports.updateItem=updateItem,exports.removeItem=removeItem;var _utils=require("../utils"),_list=require("./utils/list"),listActions=_interopRequireWildcard(_list),_views=require("./views"),viewsActions=_interopRequireWildcard(_views),_msgQueue=require("./msgQueue"),msgQueueActions=_interopRequireWildcard(_msgQueue),_websocket=require("./websocket"),websocketActions=_interopRequireWildcard(_websocket),MSG_TYPE=exports.MSG_TYPE="UPDATE_FLOWS",DATA_URL=exports.DATA_URL="/flows",ADD=exports.ADD="FLOWS_ADD",UPDATE=exports.UPDATE="FLOWS_UPDATE",REMOVE=exports.REMOVE="FLOWS_REMOVE",RECEIVE=exports.RECEIVE="FLOWS_RECEIVE",REQUEST_ACTION=exports.REQUEST_ACTION="FLOWS_REQUEST_ACTION",UNKNOWN_CMD=exports.UNKNOWN_CMD="FLOWS_UNKNOWN_CMD",FETCH_ERROR=exports.FETCH_ERROR="FLOWS_FETCH_ERROR",defaultState={list:void 0,views:void 0}; +},{"./msgQueue":46,"./utils/list":49,"./utils/view":50,"./websocket":51}],43:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function makeFilter(e){if(e)return _filt2.default.parse(e)}function makeSort(e){var t=e.column,r=e.desc,i=sortKeyFuns[t];if(i)return function(e,t){var n=i(e),o=i(t);return n>o?r?-1:1:n<o?r?1:-1:0}}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case UPDATE_HIGHLIGHT:return _extends({},e,{highlight:t.highlight});case UPDATE_FILTER:return _extends({},(0,viewActions.default)(e,viewActions.updateFilter(t.flows,makeFilter(t.filter),makeSort(e.sort))),{filter:t.filter});case UPDATE_SORT:var r={column:t.column,desc:t.desc};return _extends({},(0,viewActions.default)(e,viewActions.updateSort(makeSort(r))),{sort:r});case flowActions.ADD:return _extends({},(0,viewActions.default)(e,viewActions.add(t.item,makeFilter(e.filter),makeSort(e.sort))));case flowActions.UPDATE:return _extends({},(0,viewActions.default)(e,viewActions.update(t.item,makeFilter(e.filter),makeSort(e.sort))));case flowActions.REMOVE:return _extends({},(0,viewActions.default)(e,viewActions.remove(t.id)));case flowActions.RECEIVE:return _extends({},(0,viewActions.default)(e,viewActions.receive(t.list,makeFilter(e.filter),makeSort(e.sort))));default:return _extends({},(0,viewActions.default)(e,t))}}function updateFilter(e){return function(t,r){t({type:UPDATE_FILTER,filter:e,flows:r().flows.data})}}function updateHighlight(e){return{type:UPDATE_HIGHLIGHT,highlight:e}}function updateSort(e,t){return{type:UPDATE_SORT,column:e,desc:t}}function selectRelative(e){return function(t,r){var i=r().flowView.indexOf[r().flows.selected[0]],n=0,o=r().flowView.data.length-1,s=void 0;i?(s=i+e,s=Math.max(s,n),s=Math.min(s,o)):s=e<0?n:o;var u=r().flowView.data[s];t(flowActions.select(u?u.id:void 0))}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.UPDATE_HIGHLIGHT=exports.UPDATE_SORT=exports.UPDATE_FILTER=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e};exports.makeFilter=makeFilter,exports.makeSort=makeSort,exports.default=reduce,exports.updateFilter=updateFilter,exports.updateHighlight=updateHighlight,exports.updateSort=updateSort,exports.selectRelative=selectRelative;var _view=require("./utils/view"),viewActions=_interopRequireWildcard(_view),_flows=require("./flows"),flowActions=_interopRequireWildcard(_flows),_filt=require("../filt/filt"),_filt2=_interopRequireDefault(_filt),_utils=require("../flow/utils"),UPDATE_FILTER=exports.UPDATE_FILTER="FLOWVIEW_UPDATE_FILTER",UPDATE_SORT=exports.UPDATE_SORT="FLOWVIEW_UPDATE_SORT",UPDATE_HIGHLIGHT=exports.UPDATE_HIGHLIGHT="FLOWVIEW_UPDATE_HIGHLIGHT",sortKeyFuns={TLSColumn:function(e){return e.request.scheme},PathColumn:function(e){return _utils.RequestUtils.pretty_url(e.request)},MethodColumn:function(e){return e.request.method},StatusColumn:function(e){return e.response&&e.response.status_code},TimeColumn:function(e){return e.response&&e.response.timestamp_end-e.request.timestamp_start},SizeColumn:function(e){var t=e.request.contentLength;return e.response&&(t+=e.response.contentLength||0),t}},defaultState=_extends({highlight:null,filter:null,sort:{column:null,desc:!1}},(0,viewActions.default)(void 0,{})); -},{"../utils":55,"./msgQueue":45,"./utils/list":48,"./views":50,"./websocket":52}],44:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _redux=require("redux"),_eventLog=require("./eventLog"),_eventLog2=_interopRequireDefault(_eventLog),_websocket=require("./websocket"),_websocket2=_interopRequireDefault(_websocket),_flows=require("./flows"),_flows2=_interopRequireDefault(_flows),_settings=require("./settings"),_settings2=_interopRequireDefault(_settings),_ui=require("./ui"),_ui2=_interopRequireDefault(_ui),_msgQueue=require("./msgQueue"),_msgQueue2=_interopRequireDefault(_msgQueue);exports["default"]=(0,_redux.combineReducers)({eventLog:_eventLog2["default"],websocket:_websocket2["default"],flows:_flows2["default"],settings:_settings2["default"],ui:_ui2["default"],msgQueue:_msgQueue2["default"]}); +},{"../filt/filt":52,"../flow/utils":53,"./flows":44,"./utils/view":50}],44:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case ADD:return _extends({},e,(0,listActions.default)(e,listActions.add(t.item)));case UPDATE:return _extends({},e,(0,listActions.default)(e,listActions.update(t.item)));case REMOVE:return _extends({},e,(0,listActions.default)(e,listActions.remove(t.id)));case RECEIVE:return _extends({},e,(0,listActions.default)(e,listActions.receive(t.list)));case SELECT:return _extends({},e,{selected:t.flowIds});default:return _extends({},e,(0,listActions.default)(e,t))}}function accept(e){return(0,_utils.fetchApi)("/flows/"+e.id+"/accept",{method:"POST"}),{type:REQUEST_ACTION}}function acceptAll(){return(0,_utils.fetchApi)("/flows/accept",{method:"POST"}),{type:REQUEST_ACTION}}function remove(e){return(0,_utils.fetchApi)("/flows/"+e.id,{method:"DELETE"}),{type:REQUEST_ACTION}}function duplicate(e){return(0,_utils.fetchApi)("/flows/"+e.id+"/duplicate",{method:"POST"}),{type:REQUEST_ACTION}}function replay(e){return(0,_utils.fetchApi)("/flows/"+e.id+"/replay",{method:"POST"}),{type:REQUEST_ACTION}}function revert(e){return(0,_utils.fetchApi)("/flows/"+e.id+"/revert",{method:"POST"}),{type:REQUEST_ACTION}}function update(e,t){return _utils.fetchApi.put("/flows/"+e.id,t),{type:REQUEST_ACTION}}function clear(){return(0,_utils.fetchApi)("/clear",{method:"POST"}),{type:REQUEST_ACTION}}function download(){return window.location="/flows/dump",{type:REQUEST_ACTION}}function upload(e){var t=new FormData;return t.append("file",e),(0,_utils.fetchApi)("/flows/dump",{method:"post",body:t}),{type:REQUEST_ACTION}}function select(e){return{type:SELECT,flowIds:e?[e]:[]}}function handleWsMsg(e){switch(e.cmd){case websocketActions.CMD_ADD:return addFlow(e.data);case websocketActions.CMD_UPDATE:return updateFlow(e.data);case websocketActions.CMD_REMOVE:return removeFlow(e.data.id);case websocketActions.CMD_RESET:return fetchFlows();default:return{type:UNKNOWN_CMD,msg:e}}}function fetchFlows(){return msgQueueActions.fetchData(MSG_TYPE)}function receiveData(e){return{type:RECEIVE,list:e}}function addFlow(e){return{type:ADD,item:e}}function updateFlow(e){return{type:UPDATE,item:e}}function removeFlow(e){return{type:REMOVE,id:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.SELECT=exports.FETCH_ERROR=exports.UNKNOWN_CMD=exports.REQUEST_ACTION=exports.RECEIVE=exports.REMOVE=exports.UPDATE=exports.ADD=exports.DATA_URL=exports.MSG_TYPE=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};exports.default=reduce,exports.accept=accept,exports.acceptAll=acceptAll,exports.remove=remove,exports.duplicate=duplicate,exports.replay=replay,exports.revert=revert,exports.update=update,exports.clear=clear,exports.download=download,exports.upload=upload,exports.select=select,exports.handleWsMsg=handleWsMsg,exports.fetchFlows=fetchFlows,exports.receiveData=receiveData,exports.addFlow=addFlow,exports.updateFlow=updateFlow,exports.removeFlow=removeFlow;var _utils=require("../utils"),_list=require("./utils/list"),listActions=_interopRequireWildcard(_list),_msgQueue=require("./msgQueue"),msgQueueActions=_interopRequireWildcard(_msgQueue),_websocket=require("./websocket"),websocketActions=_interopRequireWildcard(_websocket),MSG_TYPE=exports.MSG_TYPE="UPDATE_FLOWS",DATA_URL=exports.DATA_URL="/flows",ADD=exports.ADD="FLOWS_ADD",UPDATE=exports.UPDATE="FLOWS_UPDATE",REMOVE=exports.REMOVE="FLOWS_REMOVE",RECEIVE=exports.RECEIVE="FLOWS_RECEIVE",REQUEST_ACTION=exports.REQUEST_ACTION="FLOWS_REQUEST_ACTION",UNKNOWN_CMD=exports.UNKNOWN_CMD="FLOWS_UNKNOWN_CMD",FETCH_ERROR=exports.FETCH_ERROR="FLOWS_FETCH_ERROR",SELECT=exports.SELECT="FLOWS_SELECT",defaultState=_extends({selected:[]},(0,listActions.default)(void 0,{})); -},{"./eventLog":42,"./flows":43,"./msgQueue":45,"./settings":46,"./ui":47,"./websocket":52,"redux":"redux"}],45:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r["default"]=e,r}function _toConsumableArray(e){if(Array.isArray(e)){for(var r=0,t=Array(e.length);r<e.length;r++)t[r]=e[r];return t}return Array.from(e)}function _defineProperty(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],r=arguments[1];switch(r.type){case INIT:return _extends({},e,_defineProperty({},r.queue,[]));case ENQUEUE:return _extends({},e,_defineProperty({},r.queue,[].concat(_toConsumableArray(e[r.queue]),[r.msg])));case CLEAR:return _extends({},e,_defineProperty({},r.queue,null));default:return e}}function handleWsMsg(e){return function(r,t){var n=handlers[e.type];return r(e.cmd===websocketActions.CMD_RESET?fetchData(n.MSG_TYPE):t().msgQueue[n.MSG_TYPE]?{type:ENQUEUE,queue:n.MSG_TYPE,msg:e}:n.handleWsMsg(e))}}function fetchData(e){return function(r){var t=handlers[e];r(init(t.MSG_TYPE)),(0,_utils.fetchApi)(t.DATA_URL).then(function(e){return e.json()}).then(function(t){return r(receive(e,t))})["catch"](function(t){return r(fetchError(e,t))})}}function receive(e,r){return function(t,n){var o=handlers[e],i=n().msgQueue[o.MSG_TYPE]||[];t(clear(o.MSG_TYPE)),t(o.receiveData(r.data));var s=!0,u=!1,a=void 0;try{for(var c,l=i[Symbol.iterator]();!(s=(c=l.next()).done);s=!0){var _=c.value;t(o.handleWsMsg(_))}}catch(f){u=!0,a=f}finally{try{!s&&l["return"]&&l["return"]()}finally{if(u)throw a}}}}function init(e){return{type:INIT,queue:e}}function clear(e){return{type:CLEAR,queue:e}}function fetchError(e,r){var t;return t={type:FETCH_ERROR},_defineProperty(t,"type",e),_defineProperty(t,"error",r),t}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FETCH_ERROR=exports.CLEAR=exports.ENQUEUE=exports.INIT=void 0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},_handlers;exports["default"]=reduce,exports.handleWsMsg=handleWsMsg,exports.fetchData=fetchData,exports.receive=receive,exports.init=init,exports.clear=clear,exports.fetchError=fetchError;var _utils=require("../utils"),_websocket=require("./websocket"),websocketActions=_interopRequireWildcard(_websocket),_eventLog=require("./eventLog"),eventLogActions=_interopRequireWildcard(_eventLog),_flows=require("./flows"),flowsActions=_interopRequireWildcard(_flows),_settings=require("./settings"),settingsActions=_interopRequireWildcard(_settings),INIT=exports.INIT="MSG_QUEUE_INIT",ENQUEUE=exports.ENQUEUE="MSG_QUEUE_ENQUEUE",CLEAR=exports.CLEAR="MSG_QUEUE_CLEAR",FETCH_ERROR=exports.FETCH_ERROR="MSG_QUEUE_FETCH_ERROR",handlers=(_handlers={},_defineProperty(_handlers,eventLogActions.MSG_TYPE,eventLogActions),_defineProperty(_handlers,flowsActions.MSG_TYPE,flowsActions),_defineProperty(_handlers,settingsActions.MSG_TYPE,settingsActions),_handlers),defaultState={}; +},{"../utils":54,"./msgQueue":46,"./utils/list":49,"./websocket":51}],45:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0});var _redux=require("redux"),_eventLog=require("./eventLog"),_eventLog2=_interopRequireDefault(_eventLog),_websocket=require("./websocket"),_websocket2=_interopRequireDefault(_websocket),_flows=require("./flows"),_flows2=_interopRequireDefault(_flows),_flowView=require("./flowView"),_flowView2=_interopRequireDefault(_flowView),_settings=require("./settings"),_settings2=_interopRequireDefault(_settings),_ui=require("./ui"),_ui2=_interopRequireDefault(_ui),_msgQueue=require("./msgQueue"),_msgQueue2=_interopRequireDefault(_msgQueue);exports.default=(0,_redux.combineReducers)({eventLog:_eventLog2.default,websocket:_websocket2.default,flows:_flows2.default,flowView:_flowView2.default,settings:_settings2.default,ui:_ui2.default,msgQueue:_msgQueue2.default}); -},{"../utils":55,"./eventLog":42,"./flows":43,"./settings":46,"./websocket":52}],46:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case RECEIVE:return _extends({},e,{settings:t.settings});case UPDATE:return _extends({},e,{settings:_extends({},e.settings,t.settings)});default:return e}}function handleWsMsg(e){switch(e.cmd){case websocketActions.CMD_UPDATE:return updateSettings(e.data);default:return console.error("unknown settings update",e),{type:UNKNOWN_CMD,msg:e}}}function update(e){return _utils.fetchApi.put("/settings",e),{type:REQUEST_UPDATE}}function fetchData(){return msgQueueActions.fetchData(MSG_TYPE)}function receiveData(e){return{type:RECEIVE,settings:e}}function updateSettings(e){return{type:UPDATE,settings:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.UNKNOWN_CMD=exports.REQUEST_UPDATE=exports.UPDATE=exports.RECEIVE=exports.DATA_URL=exports.MSG_TYPE=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(e[s]=r[s])}return e};exports["default"]=reducer,exports.handleWsMsg=handleWsMsg,exports.update=update,exports.fetchData=fetchData,exports.receiveData=receiveData,exports.updateSettings=updateSettings;var _utils=require("../utils"),_websocket=require("./websocket"),websocketActions=_interopRequireWildcard(_websocket),_msgQueue=require("./msgQueue"),msgQueueActions=_interopRequireWildcard(_msgQueue),MSG_TYPE=exports.MSG_TYPE="UPDATE_SETTINGS",DATA_URL=exports.DATA_URL="/settings",RECEIVE=exports.RECEIVE="RECEIVE",UPDATE=exports.UPDATE="UPDATE",REQUEST_UPDATE=exports.REQUEST_UPDATE="REQUEST_UPDATE",UNKNOWN_CMD=exports.UNKNOWN_CMD="SETTINGS_UNKNOWN_CMD",defaultState={settings:{}}; +},{"./eventLog":42,"./flowView":43,"./flows":44,"./msgQueue":46,"./settings":47,"./ui":48,"./websocket":51,"redux":"redux"}],46:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r.default=e,r}function _toConsumableArray(e){if(Array.isArray(e)){for(var r=0,t=Array(e.length);r<e.length;r++)t[r]=e[r];return t}return Array.from(e)}function _defineProperty(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],r=arguments[1];switch(r.type){case INIT:return _extends({},e,_defineProperty({},r.queue,[]));case ENQUEUE:return _extends({},e,_defineProperty({},r.queue,[].concat(_toConsumableArray(e[r.queue]),[r.msg])));case CLEAR:return _extends({},e,_defineProperty({},r.queue,null));default:return e}}function handleWsMsg(e){return function(r,t){var n=handlers[e.type];return r(e.cmd===websocketActions.CMD_RESET?fetchData(n.MSG_TYPE):t().msgQueue[n.MSG_TYPE]?{type:ENQUEUE,queue:n.MSG_TYPE,msg:e}:n.handleWsMsg(e))}}function fetchData(e){return function(r){var t=handlers[e];r(init(t.MSG_TYPE)),(0,_utils.fetchApi)(t.DATA_URL).then(function(e){return e.json()}).then(function(t){return r(receive(e,t))}).catch(function(t){return r(fetchError(e,t))})}}function receive(e,r){return function(t,n){var o=handlers[e],i=n().msgQueue[o.MSG_TYPE]||[];t(clear(o.MSG_TYPE)),t(o.receiveData(r.data));var s=!0,u=!1,a=void 0;try{for(var c,l=i[Symbol.iterator]();!(s=(c=l.next()).done);s=!0){var _=c.value;t(o.handleWsMsg(_))}}catch(e){u=!0,a=e}finally{try{!s&&l.return&&l.return()}finally{if(u)throw a}}}}function init(e){return{type:INIT,queue:e}}function clear(e){return{type:CLEAR,queue:e}}function fetchError(e,r){var t;return t={type:FETCH_ERROR},_defineProperty(t,"type",e),_defineProperty(t,"error",r),t}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FETCH_ERROR=exports.CLEAR=exports.ENQUEUE=exports.INIT=void 0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},_handlers;exports.default=reduce,exports.handleWsMsg=handleWsMsg,exports.fetchData=fetchData,exports.receive=receive,exports.init=init,exports.clear=clear,exports.fetchError=fetchError;var _utils=require("../utils"),_websocket=require("./websocket"),websocketActions=_interopRequireWildcard(_websocket),_eventLog=require("./eventLog"),eventLogActions=_interopRequireWildcard(_eventLog),_flows=require("./flows"),flowsActions=_interopRequireWildcard(_flows),_settings=require("./settings"),settingsActions=_interopRequireWildcard(_settings),INIT=exports.INIT="MSG_QUEUE_INIT",ENQUEUE=exports.ENQUEUE="MSG_QUEUE_ENQUEUE",CLEAR=exports.CLEAR="MSG_QUEUE_CLEAR",FETCH_ERROR=exports.FETCH_ERROR="MSG_QUEUE_FETCH_ERROR",handlers=(_handlers={},_defineProperty(_handlers,eventLogActions.MSG_TYPE,eventLogActions),_defineProperty(_handlers,flowsActions.MSG_TYPE,flowsActions),_defineProperty(_handlers,settingsActions.MSG_TYPE,settingsActions),_handlers),defaultState={}; -},{"../utils":55,"./msgQueue":45,"./websocket":52}],47:[function(require,module,exports){ -"use strict";function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case SET_ACTIVE_MENU:return _extends({},e,{activeMenu:t.activeMenu});case _main.SELECT:var r=t.flowId&&!t.currentSelection,n=!t.flowId&&t.currentSelection;return r?_extends({},e,{activeMenu:"Flow"}):n&&"Flow"===e.activeMenu?_extends({},e,{activeMenu:"Start"}):e;default:return e}}function setActiveMenu(e){return{type:SET_ACTIVE_MENU,activeMenu:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.SET_ACTIVE_MENU=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};exports["default"]=reducer,exports.setActiveMenu=setActiveMenu;var _main=require("./views/main"),SET_ACTIVE_MENU=exports.SET_ACTIVE_MENU="SET_ACTIVE_MENU",defaultState={activeMenu:"Start"}; +},{"../utils":54,"./eventLog":42,"./flows":44,"./settings":47,"./websocket":51}],47:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case RECEIVE:return _extends({},e,{settings:t.settings});case UPDATE:return _extends({},e,{settings:_extends({},e.settings,t.settings)});default:return e}}function handleWsMsg(e){switch(e.cmd){case websocketActions.CMD_UPDATE:return updateSettings(e.data);default:return console.error("unknown settings update",e),{type:UNKNOWN_CMD,msg:e}}}function update(e){return _utils.fetchApi.put("/settings",e),{type:REQUEST_UPDATE}}function fetchData(){return msgQueueActions.fetchData(MSG_TYPE)}function receiveData(e){return{type:RECEIVE,settings:e}}function updateSettings(e){return{type:UPDATE,settings:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.UNKNOWN_CMD=exports.REQUEST_UPDATE=exports.UPDATE=exports.RECEIVE=exports.DATA_URL=exports.MSG_TYPE=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(e[s]=r[s])}return e};exports.default=reducer,exports.handleWsMsg=handleWsMsg,exports.update=update,exports.fetchData=fetchData,exports.receiveData=receiveData,exports.updateSettings=updateSettings;var _utils=require("../utils"),_websocket=require("./websocket"),websocketActions=_interopRequireWildcard(_websocket),_msgQueue=require("./msgQueue"),msgQueueActions=_interopRequireWildcard(_msgQueue),MSG_TYPE=exports.MSG_TYPE="UPDATE_SETTINGS",DATA_URL=exports.DATA_URL="/settings",RECEIVE=exports.RECEIVE="RECEIVE",UPDATE=exports.UPDATE="UPDATE",REQUEST_UPDATE=exports.REQUEST_UPDATE="REQUEST_UPDATE",UNKNOWN_CMD=exports.UNKNOWN_CMD="SETTINGS_UNKNOWN_CMD",defaultState={settings:{}}; -},{"./views/main":51}],48:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case ADD:return _extends({},e,{data:[].concat(_toConsumableArray(e.data),[t.item]),byId:_extends({},e.byId,_defineProperty({},t.item.id,t.item)),indexOf:_extends({},e.indexOf,_defineProperty({},t.item.id,e.data.length))});case UPDATE:var r=e.indexOf[t.id];if(null==r)return e;var n=[].concat(_toConsumableArray(e.data));return n[r]=t.item,_extends({},e,{data:n,byId:_extends({},e.byId,_defineProperty({},t.id,t.item))});case REMOVE:var a=e.indexOf[t.id];if(null==a)return e;var d=[].concat(_toConsumableArray(e.data)),i=_extends({},e.indexOf,_defineProperty({},t.id,null));d.splice(a,1);for(var o=d.length-1;o>=a;o--)i[d[o].id]=o;return _extends({},e,{data:d,indexOf:i,byId:_extends({},e.byId,_defineProperty({},t.id,null))});case RECEIVE:return _extends({},e,{data:t.list,byId:_lodash2["default"].fromPairs(t.list.map(function(e){return[e.id,e]})),indexOf:_lodash2["default"].fromPairs(t.list.map(function(e,t){return[e.id,t]}))});default:return e}}function add(e){return{type:ADD,item:e}}function update(e,t){return{type:UPDATE,id:e,item:t}}function remove(e){return{type:REMOVE,id:e}}function receive(e){return{type:RECEIVE,list:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.RECEIVE=exports.REMOVE=exports.UPDATE=exports.ADD=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};exports["default"]=reduce,exports.add=add,exports.update=update,exports.remove=remove,exports.receive=receive;var _lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),ADD=exports.ADD="LIST_ADD",UPDATE=exports.UPDATE="LIST_UPDATE",REMOVE=exports.REMOVE="LIST_REMOVE",RECEIVE=exports.RECEIVE="LIST_RECEIVE",defaultState={data:[],byId:{},indexOf:{}}; +},{"../utils":54,"./msgQueue":46,"./websocket":51}],48:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case SET_ACTIVE_MENU:return _extends({},e,{activeMenu:t.activeMenu});case flowsActions.SELECT:if(t.flowIds.length&&!e.isFlowSelected)return _extends({},e,{displayLarge:!1,activeMenu:"Flow",isFlowSelected:!0});if(!t.flowIds.length&&e.isFlowSelected){var r=e.activeMenu;return"Flow"==r&&(r="Start"),_extends({},e,{activeMenu:r,isFlowSelected:!1})}return _extends({},e,{displayLarge:!1});case SET_CONTENT_VIEW:return _extends({},e,{contentView:t.contentView});case SET_SELECTED_INPUT:return _extends({},e,{selectedInput:t.input});case UPDATE_QUERY:return _extends({},e,{query:_extends({},e.query,t.query)});case SELECT_TAB:return _extends({},e,{panel:t.panel});case SET_PROMPT:return _extends({},e,{promptOpen:t.open});case SET_DISPLAY_LARGE:return _extends({},e,{displayLarge:t.displayLarge});default:return e}}function setActiveMenu(e){return{type:SET_ACTIVE_MENU,activeMenu:e}}function setContentView(e){return{type:SET_CONTENT_VIEW,contentView:e}}function setSelectedInput(e){return{type:SET_SELECTED_INPUT,input:e}}function updateQuery(e){return{type:UPDATE_QUERY,query:e}}function selectTab(e){return{type:SELECT_TAB,panel:e}}function setPrompt(e){return{type:SET_PROMPT,open:e}}function setDisplayLarge(e){return{type:SET_DISPLAY_LARGE,displayLarge:e}}function onKeyDown(e){if(e.ctrlKey)return function(){};var t=e.keyCode,r=e.shiftKey;return e.preventDefault(),function(e,s){var n=s().flows.byId[s().flows.selected[0]];switch(t){case _utils.Key.I:e(setSelectedInput("intercept"));break;case _utils.Key.L:e(setSelectedInput("search"));break;case _utils.Key.H:e(setSelectedInput("highlight"));break;case _utils.Key.K:case _utils.Key.UP:e((0,_flowView.selectRelative)(-1));break;case _utils.Key.J:case _utils.Key.DOWN:e((0,_flowView.selectRelative)(1));break;case _utils.Key.SPACE:case _utils.Key.PAGE_DOWN:e((0,_flowView.selectRelative)(10));break;case _utils.Key.PAGE_UP:e((0,_flowView.selectRelative)(-10));break;case _utils.Key.END:e((0,_flowView.selectRelative)(1e10));break;case _utils.Key.HOME:e((0,_flowView.selectRelative)(-1e10));break;case _utils.Key.ESC:e((0,_flowView.selectRelative)(null));break;case _utils.Key.LEFT:var l=["request","response","error"].filter(function(e){return n[e]}).concat(["details"]),i=s().ui.panel,a=l[(l.indexOf(i)-1+l.length)%l.length];e(selectTab(a));break;case _utils.Key.TAB:case _utils.Key.RIGHT:var o=["request","response","error"].filter(function(e){return n[e]}).concat(["details"]),u=s().ui.panel,_=o[(o.indexOf(u)+1)%o.length];e(selectTab(_));break;case _utils.Key.C:r&&e(flowsActions.clear());break;case _utils.Key.D:if(!n)return;e(r?flowsActions.duplicate(n):flowsActions.remove(n));break;case _utils.Key.A:r?e(flowsActions.acceptAll()):n&&n.intercepted&&e(flowsActions.accept(n));break;case _utils.Key.R:!r&&n&&e(flowsActions.replay(n));break;case _utils.Key.V:!r&&n&&n.modified&&e(flowsActions.revert(n));break;case _utils.Key.E:e(setPrompt(!0));break;default:return function(){}}}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.SET_DISPLAY_LARGE=exports.SET_PROMPT=exports.SELECT_TAB=exports.UPDATE_QUERY=exports.SET_SELECTED_INPUT=exports.SET_CONTENT_VIEW=exports.SET_ACTIVE_MENU=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(e[s]=r[s])}return e};exports.default=reducer,exports.setActiveMenu=setActiveMenu,exports.setContentView=setContentView,exports.setSelectedInput=setSelectedInput,exports.updateQuery=updateQuery,exports.selectTab=selectTab,exports.setPrompt=setPrompt,exports.setDisplayLarge=setDisplayLarge,exports.onKeyDown=onKeyDown;var _flowView=require("./flowView"),_utils=require("../utils.js"),_flows=require("./flows"),flowsActions=_interopRequireWildcard(_flows),SET_ACTIVE_MENU=exports.SET_ACTIVE_MENU="UI_SET_ACTIVE_MENU",SET_CONTENT_VIEW=exports.SET_CONTENT_VIEW="UI_SET_CONTENT_VIEW",SET_SELECTED_INPUT=exports.SET_SELECTED_INPUT="UI_SET_SELECTED_INPUT",UPDATE_QUERY=exports.UPDATE_QUERY="UI_UPDATE_QUERY",SELECT_TAB=exports.SELECT_TAB="UI_SELECT_TAB",SET_PROMPT=exports.SET_PROMPT="UI_SET_PROMPT",SET_DISPLAY_LARGE=exports.SET_DISPLAY_LARGE="UI_SET_DISPLAY_LARGE",defaultState={activeMenu:"Start",isFlowSelected:!1,selectedInput:null,displayLarge:!1,promptOpen:!1,contentView:"ViewAuto",query:{},panel:"request"}; -},{"lodash":"lodash"}],49:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case UPDATE_FILTER:var r=t.list.data.filter(t.filter).sort(t.sort);return _extends({},e,{data:r,indexOf:_lodash2["default"].fromPairs(r.map(function(e,t){return[e.id,t]}))});case UPDATE_SORT:var n=[].concat(_toConsumableArray(e.data)).sort(t.sort);return _extends({},e,{data:n,indexOf:_lodash2["default"].fromPairs(n.map(function(e,t){return[e.id,t]}))});case ADD:return null==e.indexOf[t.item.id]&&t.filter(t.item)?_extends({},e,sortedInsert(e,t.item,t.sort)):e;case REMOVE:return null==e.indexOf[t.id]?e:_extends({},e,sortedRemove(e,t.id));case UPDATE:if(null==e.indexOf[t.id])return;var o=_extends({},e,sortedRemove(e,t.id));return t.filter(t.item)?_extends({},o,sortedInsert(o,t.item,t.sort)):o;case RECEIVE:var a=t.list.data.filter(t.filter).sort(t.sort);return _extends({},e,{data:a,indexOf:_lodash2["default"].fromPairs(a.map(function(e,t){return[e.id,t]}))});default:return e}}function updateFilter(e){var t=arguments.length<=1||void 0===arguments[1]?defaultFilter:arguments[1],r=arguments.length<=2||void 0===arguments[2]?defaultSort:arguments[2];return{type:UPDATE_FILTER,list:e,filter:t,sort:r}}function updateSort(){var e=arguments.length<=0||void 0===arguments[0]?defaultSort:arguments[0];return{type:UPDATE_SORT,sort:e}}function add(e){var t=arguments.length<=1||void 0===arguments[1]?defaultFilter:arguments[1],r=arguments.length<=2||void 0===arguments[2]?defaultSort:arguments[2];return{type:ADD,item:e,filter:t,sort:r}}function update(e,t){var r=arguments.length<=2||void 0===arguments[2]?defaultFilter:arguments[2],n=arguments.length<=3||void 0===arguments[3]?defaultSort:arguments[3];return{type:UPDATE,id:e,item:t,filter:r,sort:n}}function remove(e){return{type:REMOVE,id:e}}function receive(e){var t=arguments.length<=1||void 0===arguments[1]?defaultFilter:arguments[1],r=arguments.length<=2||void 0===arguments[2]?defaultSort:arguments[2];return{type:RECEIVE,list:e,filter:t,sort:r}}function sortedInsert(e,t,r){var n=sortedIndex(e.data,t,r),o=[].concat(_toConsumableArray(e.data)),a=_extends({},e.indexOf);o.splice(n,0,t);for(var d=o.length-1;d>=n;d--)a[o[d].id]=d;return{data:o,indexOf:a}}function sortedRemove(e,t){var r=e.indexOf[t],n=[].concat(_toConsumableArray(e.data)),o=_extends({},e.indexOf,_defineProperty({},t,null));n.splice(r,1);for(var a=n.length-1;a>=r;a--)o[n[a].id]=a;return{data:n,indexOf:o}}function sortedIndex(e,t,r){for(var n=0,o=e.length;n<o;){var a=n+o>>>1;r(t,e[a])>=0?n=a+1:o=a}return n}function defaultFilter(){return!0}function defaultSort(e,t){return 0}Object.defineProperty(exports,"__esModule",{value:!0}),exports.RECEIVE=exports.REMOVE=exports.UPDATE=exports.ADD=exports.UPDATE_SORT=exports.UPDATE_FILTER=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};exports["default"]=reduce,exports.updateFilter=updateFilter,exports.updateSort=updateSort,exports.add=add,exports.update=update,exports.remove=remove,exports.receive=receive;var _lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),UPDATE_FILTER=exports.UPDATE_FILTER="VIEW_UPDATE_FILTER",UPDATE_SORT=exports.UPDATE_SORT="VIEW_UPDATE_SORT",ADD=exports.ADD="VIEW_ADD",UPDATE=exports.UPDATE="VIEW_UPDATE",REMOVE=exports.REMOVE="VIEW_REMOVE",RECEIVE=exports.RECEIVE="VIEW_RECEIVE",defaultState={data:[],indexOf:{}}; +},{"../utils.js":54,"./flowView":43,"./flows":44}],49:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case ADD:return _extends({},e,{data:[].concat(_toConsumableArray(e.data),[t.item]),byId:_extends({},e.byId,_defineProperty({},t.item.id,t.item)),indexOf:_extends({},e.indexOf,_defineProperty({},t.item.id,e.data.length))});case UPDATE:var r=e.indexOf[t.item.id];if(null==r)return e;var n=[].concat(_toConsumableArray(e.data));return n[r]=t.item,_extends({},e,{data:n,byId:_extends({},e.byId,_defineProperty({},t.item.id,t.item))});case REMOVE:var a=e.indexOf[t.id];if(null==a)return e;var d=[].concat(_toConsumableArray(e.data)),i=_extends({},e.indexOf,_defineProperty({},t.id,null));d.splice(a,1);for(var o=d.length-1;o>=a;o--)i[d[o].id]=o;return _extends({},e,{data:d,indexOf:i,byId:_extends({},e.byId,_defineProperty({},t.id,null))});case RECEIVE:return _extends({},e,{data:t.list,byId:_lodash2.default.fromPairs(t.list.map(function(e){return[e.id,e]})),indexOf:_lodash2.default.fromPairs(t.list.map(function(e,t){return[e.id,t]}))});default:return e}}function add(e){return{type:ADD,item:e}}function update(e){return{type:UPDATE,item:e}}function remove(e){return{type:REMOVE,id:e}}function receive(e){return{type:RECEIVE,list:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.RECEIVE=exports.REMOVE=exports.UPDATE=exports.ADD=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};exports.default=reduce,exports.add=add,exports.update=update,exports.remove=remove,exports.receive=receive;var _lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),ADD=exports.ADD="LIST_ADD",UPDATE=exports.UPDATE="LIST_UPDATE",REMOVE=exports.REMOVE="LIST_REMOVE",RECEIVE=exports.RECEIVE="LIST_RECEIVE",defaultState={data:[],byId:{},indexOf:{}}; },{"lodash":"lodash"}],50:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r["default"]=e,r}function add(e){return{type:ADD,item:e}}function update(e,r){return{type:UPDATE,id:e,item:r}}function remove(e){return{type:REMOVE,id:e}}function receive(e){return{type:RECEIVE,list:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.RECEIVE=exports.REMOVE=exports.UPDATE=exports.ADD=void 0,exports.add=add,exports.update=update,exports.remove=remove,exports.receive=receive;var _redux=require("redux"),_view=require("./utils/view"),viewActions=_interopRequireWildcard(_view),_main=require("./views/main.js"),_main2=_interopRequireDefault(_main),ADD=exports.ADD="FLOW_VIEWS_ADD",UPDATE=exports.UPDATE="FLOW_VIEWS_UPDATE",REMOVE=exports.REMOVE="FLOW_VIEWS_REMOVE",RECEIVE=exports.RECEIVE="FLOW_VIEWS_RECEIVE";exports["default"]=(0,_redux.combineReducers)({main:_main2["default"]}); +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case UPDATE_FILTER:var r=t.list.filter(t.filter).sort(t.sort);return _extends({},e,{data:r,indexOf:_lodash2.default.fromPairs(r.map(function(e,t){return[e.id,t]}))});case UPDATE_SORT:var n=[].concat(_toConsumableArray(e.data)).sort(t.sort);return _extends({},e,{data:n,indexOf:_lodash2.default.fromPairs(n.map(function(e,t){return[e.id,t]}))});case ADD:return null==e.indexOf[t.item.id]&&t.filter(t.item)?_extends({},e,sortedInsert(e,t.item,t.sort)):e;case REMOVE:return null==e.indexOf[t.id]?e:_extends({},e,sortedRemove(e,t.id));case UPDATE:if(null==e.indexOf[t.item.id])return;var o=_extends({},e,sortedRemove(e,t.item.id));return t.filter(t.item)?_extends({},o,sortedInsert(o,t.item,t.sort)):o;case RECEIVE:var a=t.list.filter(t.filter).sort(t.sort);return _extends({},e,{data:a,indexOf:_lodash2.default.fromPairs(a.map(function(e,t){return[e.id,t]}))});default:return e}}function updateFilter(e){var t=arguments.length<=1||void 0===arguments[1]?defaultFilter:arguments[1],r=arguments.length<=2||void 0===arguments[2]?defaultSort:arguments[2];return{type:UPDATE_FILTER,list:e,filter:t,sort:r}}function updateSort(){var e=arguments.length<=0||void 0===arguments[0]?defaultSort:arguments[0];return{type:UPDATE_SORT,sort:e}}function add(e){var t=arguments.length<=1||void 0===arguments[1]?defaultFilter:arguments[1],r=arguments.length<=2||void 0===arguments[2]?defaultSort:arguments[2];return{type:ADD,item:e,filter:t,sort:r}}function update(e){var t=arguments.length<=1||void 0===arguments[1]?defaultFilter:arguments[1],r=arguments.length<=2||void 0===arguments[2]?defaultSort:arguments[2];return{type:UPDATE,item:e,filter:t,sort:r}}function remove(e){return{type:REMOVE,id:e}}function receive(e){var t=arguments.length<=1||void 0===arguments[1]?defaultFilter:arguments[1],r=arguments.length<=2||void 0===arguments[2]?defaultSort:arguments[2];return{type:RECEIVE,list:e,filter:t,sort:r}}function sortedInsert(e,t,r){var n=sortedIndex(e.data,t,r),o=[].concat(_toConsumableArray(e.data)),a=_extends({},e.indexOf);o.splice(n,0,t);for(var d=o.length-1;d>=n;d--)a[o[d].id]=d;return{data:o,indexOf:a}}function sortedRemove(e,t){var r=e.indexOf[t],n=[].concat(_toConsumableArray(e.data)),o=_extends({},e.indexOf,_defineProperty({},t,null));n.splice(r,1);for(var a=n.length-1;a>=r;a--)o[n[a].id]=a;return{data:n,indexOf:o}}function sortedIndex(e,t,r){for(var n=0,o=e.length;n<o;){var a=n+o>>>1;r(t,e[a])>=0?n=a+1:o=a}return n}function defaultFilter(){return!0}function defaultSort(e,t){return 0}Object.defineProperty(exports,"__esModule",{value:!0}),exports.RECEIVE=exports.REMOVE=exports.UPDATE=exports.ADD=exports.UPDATE_SORT=exports.UPDATE_FILTER=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};exports.default=reduce,exports.updateFilter=updateFilter,exports.updateSort=updateSort,exports.add=add,exports.update=update,exports.remove=remove,exports.receive=receive;var _lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),UPDATE_FILTER=exports.UPDATE_FILTER="VIEW_UPDATE_FILTER",UPDATE_SORT=exports.UPDATE_SORT="VIEW_UPDATE_SORT",ADD=exports.ADD="VIEW_ADD",UPDATE=exports.UPDATE="VIEW_UPDATE",REMOVE=exports.REMOVE="VIEW_REMOVE",RECEIVE=exports.RECEIVE="VIEW_RECEIVE",defaultState={data:[],indexOf:{}}; -},{"./utils/view":49,"./views/main.js":51,"redux":"redux"}],51:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t["default"]=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function reduce(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case UPDATE_HIGHLIGHT:return _extends({},e,{highlight:t.highlight});case SELECT:return _extends({},e,{selected:[t.id]});case UPDATE_FILTER:return _extends({},e,{filter:t.filter,view:(0,viewActions["default"])(e.view,viewActions.updateFilter(t.list,makeFilter(t.filter),makeSort(e.sort)))});case UPDATE_SORT:var i={column:t.column,desc:t.desc};return _extends({},e,{sort:i,view:(0,viewActions["default"])(e.view,viewActions.updateSort(makeSort(i)))});case viewsActions.ADD:return _extends({},e,{view:(0,viewActions["default"])(e.view,viewActions.add(t.item,makeFilter(e.filter),makeSort(e.sort)))});case viewsActions.UPDATE:return _extends({},e,{view:(0,viewActions["default"])(e.view,viewActions.update(t.id,t.item,makeFilter(e.filter),makeSort(e.sort)))});case viewsActions.REMOVE:return _extends({},e,{view:(0,viewActions["default"])(e.view,viewActions.remove(t.id))});case viewsActions.RECEIVE:return _extends({},e,{view:(0,viewActions["default"])(e.view,viewActions.receive(t.list,makeFilter(e.filter),makeSort(e.sort)))});default:return _extends({},e,{view:(0,viewActions["default"])(e.view,t)})}}function updateFilter(e){return function(t,i){t({type:UPDATE_FILTER,filter:e,list:i().flows.list})}}function updateHighlight(e){return{type:UPDATE_HIGHLIGHT,highlight:e}}function updateSort(e,t){return{type:UPDATE_SORT,column:e,desc:t}}function select(e){return function(t,i){t({type:SELECT,currentSelection:i().flows.views.main.selected[0],id:e})}}function makeFilter(e){if(e)return _filt2["default"].parse(e)}function makeSort(e){var t=e.column,i=e.desc,r=sortKeyFuns[t];if(r)return function(e,t){var n=r(e),s=r(t);return n>s?i?-1:1:n<s?i?1:-1:0}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.SELECT=exports.UPDATE_HIGHLIGHT=exports.UPDATE_SORT=exports.UPDATE_FILTER=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r])}return e};exports["default"]=reduce,exports.updateFilter=updateFilter,exports.updateHighlight=updateHighlight,exports.updateSort=updateSort,exports.select=select;var _filt=require("../../filt/filt"),_filt2=_interopRequireDefault(_filt),_utils=require("../../flow/utils"),_view=require("../utils/view"),viewActions=_interopRequireWildcard(_view),_views=require("../views"),viewsActions=_interopRequireWildcard(_views),UPDATE_FILTER=exports.UPDATE_FILTER="FLOW_VIEWS_MAIN_UPDATE_FILTER",UPDATE_SORT=exports.UPDATE_SORT="FLOW_VIEWS_MAIN_UPDATE_SORT",UPDATE_HIGHLIGHT=exports.UPDATE_HIGHLIGHT="FLOW_VIEWS_MAIN_UPDATE_HIGHLIGHT",SELECT=exports.SELECT="FLOW_VIEWS_MAIN_SELECT",sortKeyFuns={TLSColumn:function(e){return e.request.scheme},PathColumn:function(e){return _utils.RequestUtils.pretty_url(e.request)},MethodColumn:function(e){return e.request.method},StatusColumn:function(e){return e.response&&e.response.status_code},TimeColumn:function(e){return e.response&&e.response.timestamp_end-e.request.timestamp_start},SizeColumn:function(e){var t=e.request.contentLength;return e.response&&(t+=e.response.contentLength||0),t}},defaultState={highlight:null,selected:[],filter:null,sort:{column:null,desc:!1},view:void 0}; +},{"lodash":"lodash"}],51:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function reduce(){var e,t=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],n=arguments[1];switch(n.type){case CONNECT:return _extends({},t,_defineProperty({},SYM_SOCKET,n.socket));case CONNECTED:return _extends({},t,{connected:!0});case DISCONNECT:return _extends({},t,{connected:!1});case DISCONNECTED:return _extends({},t,(e={},_defineProperty(e,SYM_SOCKET,null),_defineProperty(e,"connected",!1),e));default:return t}}function connect(){return function(e){var t=new WebSocket(location.origin.replace("http","ws")+"/updates");t.addEventListener("open",function(){return e(onConnect())}),t.addEventListener("close",function(){return e(onDisconnect())}),t.addEventListener("message",function(t){return e(onMessage(JSON.parse(t.data)))}),t.addEventListener("error",function(t){return e(onError(t))}),e({type:CONNECT,socket:t})}}function disconnect(){return function(e,t){t().settings[SYM_SOCKET].close(),e({type:DISCONNECT})}}function onConnect(){return function(e){e({type:CONNECTED}),e(settingsActions.fetchData()),e(flowsActions.fetchFlows()),e(eventLogActions.fetchData())}}function onMessage(e){return msgQueueActions.handleWsMsg(e)}function onDisconnect(){return function(e){e(eventLogActions.add("WebSocket connection closed.")),e({type:DISCONNECTED})}}function onError(e){return function(t){t(eventLogActions.add("WebSocket connection error.")),t({type:ERROR,error:e})}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.MESSAGE=exports.ERROR=exports.DISCONNECTED=exports.DISCONNECT=exports.CONNECTED=exports.CONNECT=exports.SYM_SOCKET=exports.CMD_RESET=exports.CMD_REMOVE=exports.CMD_UPDATE=exports.CMD_ADD=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};exports.default=reduce,exports.connect=connect,exports.disconnect=disconnect,exports.onConnect=onConnect,exports.onMessage=onMessage,exports.onDisconnect=onDisconnect,exports.onError=onError;var _actions=require("../actions.js"),_dispatcher=require("../dispatcher.js"),_msgQueue=require("./msgQueue"),msgQueueActions=_interopRequireWildcard(_msgQueue),_eventLog=require("./eventLog"),eventLogActions=_interopRequireWildcard(_eventLog),_flows=require("./flows"),flowsActions=_interopRequireWildcard(_flows),_settings=require("./settings"),settingsActions=_interopRequireWildcard(_settings),CMD_ADD=exports.CMD_ADD="add",CMD_UPDATE=exports.CMD_UPDATE="update",CMD_REMOVE=exports.CMD_REMOVE="remove",CMD_RESET=exports.CMD_RESET="reset",SYM_SOCKET=exports.SYM_SOCKET=Symbol("WEBSOCKET_SYM_SOCKET"),CONNECT=exports.CONNECT="WEBSOCKET_CONNECT",CONNECTED=exports.CONNECTED="WEBSOCKET_CONNECTED",DISCONNECT=exports.DISCONNECT="WEBSOCKET_DISCONNECT",DISCONNECTED=exports.DISCONNECTED="WEBSOCKET_DISCONNECTED",ERROR=exports.ERROR="WEBSOCKET_ERROR",MESSAGE=exports.MESSAGE="WEBSOCKET_MESSAGE",defaultState={connected:!1,socket:null}; -},{"../../filt/filt":53,"../../flow/utils":54,"../utils/view":49,"../views":50}],52:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function reduce(){var e,t=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],n=arguments[1];switch(n.type){case CONNECT:return _extends({},t,_defineProperty({},SYM_SOCKET,n.socket));case CONNECTED:return _extends({},t,{connected:!0});case DISCONNECT:return _extends({},t,{connected:!1});case DISCONNECTED:return _extends({},t,(e={},_defineProperty(e,SYM_SOCKET,null),_defineProperty(e,"connected",!1),e));default:return t}}function connect(){return function(e){var t=new WebSocket(location.origin.replace("http","ws")+"/updates");t.addEventListener("open",function(){return e(onConnect())}),t.addEventListener("close",function(){return e(onDisconnect())}),t.addEventListener("message",function(t){return e(onMessage(JSON.parse(t.data)))}),t.addEventListener("error",function(t){return e(onError(t))}),e({type:CONNECT,socket:t})}}function disconnect(){return function(e,t){t().settings[SYM_SOCKET].close(),e({type:DISCONNECT})}}function onConnect(){return function(e){e({type:CONNECTED}),e(settingsActions.fetchData()),e(flowsActions.fetchData()),e(eventLogActions.fetchData())}}function onMessage(e){return msgQueueActions.handleWsMsg(e)}function onDisconnect(){return function(e){e(eventLogActions.add("WebSocket connection closed.")),e({type:DISCONNECTED})}}function onError(e){return function(t){t(eventLogActions.add("WebSocket connection error.")),t({type:ERROR,error:e})}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.MESSAGE=exports.ERROR=exports.DISCONNECTED=exports.DISCONNECT=exports.CONNECTED=exports.CONNECT=exports.SYM_SOCKET=exports.CMD_RESET=exports.CMD_REMOVE=exports.CMD_UPDATE=exports.CMD_ADD=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};exports["default"]=reduce,exports.connect=connect,exports.disconnect=disconnect,exports.onConnect=onConnect,exports.onMessage=onMessage,exports.onDisconnect=onDisconnect,exports.onError=onError;var _actions=require("../actions.js"),_dispatcher=require("../dispatcher.js"),_msgQueue=require("./msgQueue"),msgQueueActions=_interopRequireWildcard(_msgQueue),_eventLog=require("./eventLog"),eventLogActions=_interopRequireWildcard(_eventLog),_flows=require("./flows"),flowsActions=_interopRequireWildcard(_flows),_settings=require("./settings"),settingsActions=_interopRequireWildcard(_settings),CMD_ADD=exports.CMD_ADD="add",CMD_UPDATE=exports.CMD_UPDATE="update",CMD_REMOVE=exports.CMD_REMOVE="remove",CMD_RESET=exports.CMD_RESET="reset",SYM_SOCKET=exports.SYM_SOCKET=Symbol("WEBSOCKET_SYM_SOCKET"),CONNECT=exports.CONNECT="WEBSOCKET_CONNECT",CONNECTED=exports.CONNECTED="WEBSOCKET_CONNECTED",DISCONNECT=exports.DISCONNECT="WEBSOCKET_DISCONNECT",DISCONNECTED=exports.DISCONNECTED="WEBSOCKET_DISCONNECTED",ERROR=exports.ERROR="WEBSOCKET_ERROR",MESSAGE=exports.MESSAGE="WEBSOCKET_MESSAGE",defaultState={connected:!1,socket:null}; - -},{"../actions.js":1,"../dispatcher.js":40,"./eventLog":42,"./flows":43,"./msgQueue":45,"./settings":46}],53:[function(require,module,exports){ +},{"../actions.js":1,"../dispatcher.js":40,"./eventLog":42,"./flows":44,"./msgQueue":46,"./settings":47}],52:[function(require,module,exports){ "use strict";module.exports=function(){function e(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}function t(e,r,n,i){this.message=e,this.expected=r,this.found=n,this.location=i,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}function r(e){function r(t){var r,n,i=Ot[t];if(i)return i;for(r=t-1;!Ot[r];)r--;for(i=Ot[r],i={line:i.line,column:i.column,seenCR:i.seenCR};r<t;)n=e.charAt(r),"\n"===n?(i.seenCR||i.line++,i.column=1,i.seenCR=!1):"\r"===n||"\u2028"===n||"\u2029"===n?(i.line++,i.column=1,i.seenCR=!0):(i.column++,i.seenCR=!1),r++;return Ot[t]=i,i}function n(e,t){var n=r(e),i=r(t);return{start:{offset:e,line:n.line,column:n.column},end:{offset:t,line:i.line,column:i.column}}}function i(e){Mt<Pt||(Mt>Pt&&(Pt=Mt,Qt=[]),Qt.push(e))}function s(e,r,n,i){function s(e){var t=1;for(e.sort(function(e,t){return e.description<t.description?-1:e.description>t.description?1:0});t<e.length;)e[t-1]===e[t]?e.splice(t,1):t++}function u(e,t){function r(e){function t(e){return e.charCodeAt(0).toString(16).toUpperCase()}return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E\x0F]/g,function(e){return"\\x0"+t(e)}).replace(/[\x10-\x1F\x80-\xFF]/g,function(e){return"\\x"+t(e)}).replace(/[\u0100-\u0FFF]/g,function(e){return"\\u0"+t(e)}).replace(/[\u1000-\uFFFF]/g,function(e){return"\\u"+t(e)})}var n,i,s,u=new Array(e.length);for(s=0;s<e.length;s++)u[s]=e[s].description;return n=e.length>1?u.slice(0,-1).join(", ")+" or "+u[e.length-1]:u[0],i=t?'"'+r(t)+'"':"end of input","Expected "+n+" but "+i+" found."}return null!==r&&s(r),new t(null!==e?e:u(r,n),r,n,i)}function u(){var e,t,r,n;return Vt++,e=Mt,t=a(),t!==P?(r=l(),r!==P?(n=a(),n!==P?(Nt=e,t=X(r),e=t):(Mt=e,e=P)):(Mt=e,e=P)):(Mt=e,e=P),Vt--,e===P&&(t=P,0===Vt&&i(W)),e}function c(){var t,r;return Vt++,Z.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i($)),Vt--,t===P&&(r=P,0===Vt&&i(Y)),t}function o(){var t,r;return Vt++,te.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i(re)),Vt--,t===P&&(r=P,0===Vt&&i(ee)),t}function a(){var e,t;for(Vt++,e=[],t=c();t!==P;)e.push(t),t=c();return Vt--,e===P&&(t=P,0===Vt&&i(ne)),e}function l(){var t,r,n,s,u,c;return t=Mt,r=p(),r!==P?(n=a(),n!==P?(124===e.charCodeAt(Mt)?(s=ie,Mt++):(s=P,0===Vt&&i(se)),s!==P?(u=a(),u!==P?(c=l(),c!==P?(Nt=t,r=ue(r,c),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=p()),t}function p(){var t,r,n,s,u,o;if(t=Mt,r=f(),r!==P?(n=a(),n!==P?(38===e.charCodeAt(Mt)?(s=ce,Mt++):(s=P,0===Vt&&i(oe)),s!==P?(u=a(),u!==P?(o=p(),o!==P?(Nt=t,r=ae(r,o),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P){if(t=Mt,r=f(),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=p(),s!==P?(Nt=t,r=ae(r,s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;t===P&&(t=f())}return t}function f(){var t,r,n,s;return t=Mt,33===e.charCodeAt(Mt)?(r=le,Mt++):(r=P,0===Vt&&i(pe)),r!==P?(n=a(),n!==P?(s=f(),s!==P?(Nt=t,r=fe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=h()),t}function h(){var t,r,n,s,u,c;return t=Mt,40===e.charCodeAt(Mt)?(r=he,Mt++):(r=P,0===Vt&&i(de)),r!==P?(n=a(),n!==P?(s=l(),s!==P?(u=a(),u!==P?(41===e.charCodeAt(Mt)?(c=ve,Mt++):(c=P,0===Vt&&i(ye)),c!==P?(Nt=t,r=ge(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=d()),t}function d(){var e;return e=v(),e===P&&(e=g()),e}function v(){var t,r;return t=y(),t===P&&(t=Mt,e.substr(Mt,2)===Ae?(r=Ae,Mt+=2):(r=P,0===Vt&&i(xe)),r!==P&&(Nt=t,r=Re()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===me?(r=me,Mt+=2):(r=P,0===Vt&&i(qe)),r!==P&&(Nt=t,r=Ce()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===we?(r=we,Mt+=2):(r=P,0===Vt&&i(Ee)),r!==P&&(Nt=t,r=be()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===Fe?(r=Fe,Mt+=2):(r=P,0===Vt&&i(Ue)),r!==P&&(Nt=t,r=je()),t=r)))),t}function y(){var t,r;return t=Mt,e.substr(Mt,4)===Te?(r=Te,Mt+=4):(r=P,0===Vt&&i(_e)),r!==P&&(Nt=t,r=Se()),t=r,t===P&&(t=Mt,e.substr(Mt,5)===ke?(r=ke,Mt+=5):(r=P,0===Vt&&i(Be)),r!==P&&(Nt=t,r=Ie()),t=r),t}function g(){var t,r,n,s;if(t=Mt,e.substr(Mt,2)===ze?(r=ze,Mt+=2):(r=P,0===Vt&&i(De)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=A(),s!==P?(Nt=t,r=Ge(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===He?(r=He,Mt+=2):(r=P,0===Vt&&i(Je)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Ke(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===Le?(r=Le,Mt+=2):(r=P,0===Vt&&i(Me)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Ne(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===Oe?(r=Oe,Mt+=3):(r=P,0===Vt&&i(Pe)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Qe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===Ve?(r=Ve,Mt+=3):(r=P,0===Vt&&i(We)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Xe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===Ye?(r=Ye,Mt+=2):(r=P,0===Vt&&i(Ze)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=$e(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===et?(r=et,Mt+=2):(r=P,0===Vt&&i(tt)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=rt(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===nt?(r=nt,Mt+=3):(r=P,0===Vt&&i(it)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=st(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===ut?(r=ut,Mt+=3):(r=P,0===Vt&&i(ct)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=ot(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===at?(r=at,Mt+=2):(r=P,0===Vt&&i(lt)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=pt(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;t===P&&(t=Mt,r=x(),r!==P&&(Nt=t,r=pt(r)),t=r)}}}}}}}}}return t}function A(){var t,r,n,s;if(Vt++,t=Mt,ht.test(e.charAt(Mt))?(r=e.charAt(Mt),Mt++):(r=P,0===Vt&&i(dt)),r===P&&(r=null),r!==P){if(n=[],vt.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(yt)),s!==P)for(;s!==P;)n.push(s),vt.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(yt));else n=P;n!==P?(ht.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(dt)),s===P&&(s=null),s!==P?(Nt=t,r=gt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;return Vt--,t===P&&(r=P,0===Vt&&i(ft)),t}function x(){var t,r,n,s;if(Vt++,t=Mt,34===e.charCodeAt(Mt)?(r=xt,Mt++):(r=P,0===Vt&&i(Rt)),r!==P){for(n=[],s=R();s!==P;)n.push(s),s=R();n!==P?(34===e.charCodeAt(Mt)?(s=xt,Mt++):(s=P,0===Vt&&i(Rt)),s!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,39===e.charCodeAt(Mt)?(r=qt,Mt++):(r=P,0===Vt&&i(Ct)),r!==P){for(n=[],s=m();s!==P;)n.push(s),s=m();n!==P?(39===e.charCodeAt(Mt)?(s=qt,Mt++):(s=P,0===Vt&&i(Ct)),s!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P)if(t=Mt,r=Mt,Vt++,n=o(),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P){if(n=[],s=q(),s!==P)for(;s!==P;)n.push(s),s=q();else n=P;n!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)}else Mt=t,t=P}return Vt--,t===P&&(r=P,0===Vt&&i(At)),t}function R(){var t,r,n;return t=Mt,r=Mt,Vt++,wt.test(e.charAt(Mt))?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(Et)),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=Mt,92===e.charCodeAt(Mt)?(r=Ut,Mt++):(r=P,0===Vt&&i(jt)),r!==P?(n=C(),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)),t}function m(){var t,r,n;return t=Mt,r=Mt,Vt++,Tt.test(e.charAt(Mt))?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(_t)),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=Mt,92===e.charCodeAt(Mt)?(r=Ut,Mt++):(r=P,0===Vt&&i(jt)),r!==P?(n=C(),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)),t}function q(){var t,r,n;return t=Mt,r=Mt,Vt++,n=c(),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t}function C(){var t,r;return St.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i(kt)),t===P&&(t=Mt,110===e.charCodeAt(Mt)?(r=Bt,Mt++):(r=P,0===Vt&&i(It)),r!==P&&(Nt=t,r=zt()),t=r,t===P&&(t=Mt,114===e.charCodeAt(Mt)?(r=Dt,Mt++):(r=P,0===Vt&&i(Gt)),r!==P&&(Nt=t,r=Ht()),t=r,t===P&&(t=Mt,116===e.charCodeAt(Mt)?(r=Jt,Mt++):(r=P,0===Vt&&i(Kt)),r!==P&&(Nt=t,r=Lt()),t=r))),t}function w(e,t){function r(){return e.apply(this,arguments)||t.apply(this,arguments)}return r.desc=e.desc+" or "+t.desc,r}function E(e,t){function r(){return e.apply(this,arguments)&&t.apply(this,arguments)}return r.desc=e.desc+" and "+t.desc,r}function b(e){function t(){return!e.apply(this,arguments)}return t.desc="not "+e.desc,t}function F(e){function t(){return e.apply(this,arguments)}return t.desc="("+e.desc+")",t}function U(e){return!0}function j(e){return!1}function T(e){if(e.response)for(var t=Wt.ResponseUtils.getContentType(e.response),r=Xt.length;r--;)if(Xt[r].test(t))return!0;return!1}function _(e){function t(t){return t.response&&t.response.status_code===e}return t.desc="resp. code is "+e,t}function S(e){function t(t){return t.request&&e.test(t.request.host)}return e=new RegExp(e,"i"),t.desc="domain matches "+e,t}function k(e){return!!e.error}function B(e){function t(t){return t.request&&Wt.RequestUtils.match_header(t.request,e)||t.response&&Wt.ResponseUtils.match_header(t.response,e)}return e=new RegExp(e,"i"),t.desc="header matches "+e,t}function I(e){function t(t){return t.request&&Wt.RequestUtils.match_header(t.request,e)}return e=new RegExp(e,"i"),t.desc="req. header matches "+e,t}function z(e){function t(t){return t.response&&Wt.ResponseUtils.match_header(t.response,e)}return e=new RegExp(e,"i"),t.desc="resp. header matches "+e,t}function D(e){function t(t){return t.request&&e.test(t.request.method)}return e=new RegExp(e,"i"),t.desc="method matches "+e,t}function G(e){return e.request&&!e.response}function H(e){return!!e.response}function J(e){function t(t){return t.request&&e.test(Wt.RequestUtils.getContentType(t.request))||t.response&&e.test(Wt.ResponseUtils.getContentType(t.response))}return e=new RegExp(e,"i"),t.desc="content type matches "+e,t}function K(e){function t(t){return t.request&&e.test(Wt.RequestUtils.getContentType(t.request))}return e=new RegExp(e,"i"),t.desc="req. content type matches "+e,t}function L(e){function t(t){return t.response&&e.test(Wt.ResponseUtils.getContentType(t.response))}return e=new RegExp(e,"i"),t.desc="resp. content type matches "+e,t}function M(e){function t(t){return t.request&&e.test(Wt.RequestUtils.pretty_url(t.request))}return e=new RegExp(e,"i"),t.desc="url matches "+e,t}var N,O=arguments.length>1?arguments[1]:{},P={},Q={start:u},V=u,W={type:"other",description:"filter expression"},X=function(e){return e},Y={type:"other",description:"whitespace"},Z=/^[ \t\n\r]/,$={type:"class",value:"[ \\t\\n\\r]",description:"[ \\t\\n\\r]"},ee={type:"other",description:"control character"},te=/^[|&!()~"]/,re={type:"class",value:'[|&!()~"]',description:'[|&!()~"]'},ne={type:"other",description:"optional whitespace"},ie="|",se={type:"literal",value:"|",description:'"|"'},ue=function(e,t){return w(e,t)},ce="&",oe={type:"literal",value:"&",description:'"&"'},ae=function(e,t){return E(e,t)},le="!",pe={type:"literal",value:"!",description:'"!"'},fe=function(e){return b(e)},he="(",de={type:"literal",value:"(",description:'"("'},ve=")",ye={type:"literal",value:")",description:'")"'},ge=function(e){return F(e)},Ae="~a",xe={type:"literal",value:"~a",description:'"~a"'},Re=function(){return T},me="~e",qe={type:"literal",value:"~e",description:'"~e"'},Ce=function(){return k},we="~q",Ee={type:"literal",value:"~q",description:'"~q"'},be=function(){return G},Fe="~s",Ue={type:"literal",value:"~s",description:'"~s"'},je=function(){return H},Te="true",_e={type:"literal",value:"true",description:'"true"'},Se=function(){return U},ke="false",Be={type:"literal",value:"false",description:'"false"'},Ie=function(){return j},ze="~c",De={type:"literal",value:"~c",description:'"~c"'},Ge=function(e){return _(e)},He="~d",Je={type:"literal",value:"~d",description:'"~d"'},Ke=function(e){return S(e)},Le="~h",Me={type:"literal",value:"~h",description:'"~h"'},Ne=function(e){return B(e)},Oe="~hq",Pe={type:"literal",value:"~hq",description:'"~hq"'},Qe=function(e){return I(e)},Ve="~hs",We={type:"literal",value:"~hs",description:'"~hs"'},Xe=function(e){return z(e)},Ye="~m",Ze={type:"literal",value:"~m",description:'"~m"'},$e=function(e){return D(e)},et="~t",tt={type:"literal",value:"~t",description:'"~t"'},rt=function(e){return J(e)},nt="~tq",it={type:"literal",value:"~tq",description:'"~tq"'},st=function(e){return K(e)},ut="~ts",ct={type:"literal",value:"~ts",description:'"~ts"'},ot=function(e){return L(e)},at="~u",lt={type:"literal",value:"~u",description:'"~u"'},pt=function(e){return M(e)},ft={type:"other",description:"integer"},ht=/^['"]/,dt={type:"class",value:"['\"]",description:"['\"]"},vt=/^[0-9]/,yt={type:"class",value:"[0-9]",description:"[0-9]"},gt=function(e){return parseInt(e.join(""),10)},At={type:"other",description:"string"},xt='"',Rt={type:"literal",value:'"',description:'"\\""'},mt=function(e){return e.join("")},qt="'",Ct={type:"literal",value:"'",description:'"\'"'},wt=/^["\\]/,Et={type:"class",value:'["\\\\]',description:'["\\\\]'},bt={type:"any",description:"any character"},Ft=function(e){return e},Ut="\\",jt={type:"literal",value:"\\",description:'"\\\\"'},Tt=/^['\\]/,_t={type:"class",value:"['\\\\]",description:"['\\\\]"},St=/^['"\\]/,kt={type:"class",value:"['\"\\\\]",description:"['\"\\\\]"},Bt="n",It={type:"literal",value:"n",description:'"n"'},zt=function(){return"\n"},Dt="r",Gt={type:"literal",value:"r",description:'"r"'},Ht=function(){return"\r"},Jt="t",Kt={type:"literal",value:"t",description:'"t"'},Lt=function(){return"\t"},Mt=0,Nt=0,Ot=[{line:1,column:1,seenCR:!1}],Pt=0,Qt=[],Vt=0;if("startRule"in O){if(!(O.startRule in Q))throw new Error("Can't start parsing from rule \""+O.startRule+'".');V=Q[O.startRule]}var Wt=require("../flow/utils.js");U.desc="true",j.desc="false";var Xt=[new RegExp("text/javascript"),new RegExp("application/x-javascript"),new RegExp("application/javascript"),new RegExp("text/css"),new RegExp("image/.*"),new RegExp("application/x-shockwave-flash")];if(T.desc="is asset",k.desc="has error",G.desc="has no response",H.desc="has response",N=V(),N!==P&&Mt===e.length)return N;throw N!==P&&Mt<e.length&&i({type:"end",description:"end of input"}),s(null,Qt,Pt<e.length?e.charAt(Pt):null,Pt<e.length?n(Pt,Pt+1):n(Pt,Pt))}return e(t,Error),{SyntaxError:t,parse:r}}(); -},{"../flow/utils.js":54}],54:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseHttpVersion=exports.isValidHttpVersion=exports.parseUrl=exports.ResponseUtils=exports.RequestUtils=exports.MessageUtils=void 0;var _lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),defaultPorts={http:80,https:443},MessageUtils=exports.MessageUtils={getContentType:function(e){var t=this.get_first_header(e,/^Content-Type$/i);if(t)return t.split(";")[0].trim()},get_first_header:function(e,t){if(e._headerLookups||Object.defineProperty(e,"_headerLookups",{value:{},configurable:!1,enumerable:!1,writable:!1}),!(t in e._headerLookups)){for(var r,s=0;s<e.headers.length;s++)if(e.headers[s][0].match(t)){r=e.headers[s];break}e._headerLookups[t]=r?r[1]:void 0}return e._headerLookups[t]},match_header:function(e,t){for(var r=e.headers,s=r.length;s--;)if(t.test(r[s].join(" ")))return r[s];return!1},getContentURL:function(e,t){return t===e.request?t="request":t===e.response&&(t="response"),"/flows/"+e.id+"/"+t+"/content"}},RequestUtils=exports.RequestUtils=_lodash2["default"].extend(MessageUtils,{pretty_host:function(e){return e.host},pretty_url:function(e){var t="";return defaultPorts[e.scheme]!==e.port&&(t=":"+e.port),e.scheme+"://"+this.pretty_host(e)+t+e.path}}),ResponseUtils=exports.ResponseUtils=_lodash2["default"].extend(MessageUtils,{}),parseUrl_regex=/^(?:(https?):\/\/)?([^\/:]+)?(?::(\d+))?(\/.*)?$/i,parseUrl=exports.parseUrl=function(e){var t=parseUrl_regex.exec(e);if(!t)return!1;var r=t[1],s=t[2],o=parseInt(t[3]),i=t[4];r&&(o=o||defaultPorts[r]);var n={};return r&&(n.scheme=r),s&&(n.host=s),o&&(n.port=o),i&&(n.path=i),n},isValidHttpVersion_regex=/^HTTP\/\d+(\.\d+)*$/i,isValidHttpVersion=exports.isValidHttpVersion=function(e){return isValidHttpVersion_regex.test(e)},parseHttpVersion=exports.parseHttpVersion=function(e){return e=e.replace("HTTP/","").split("."),_lodash2["default"].map(e,function(e){return parseInt(e)})}; +},{"../flow/utils.js":53}],53:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseHttpVersion=exports.isValidHttpVersion=exports.parseUrl=exports.ResponseUtils=exports.RequestUtils=exports.MessageUtils=void 0;var _lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),defaultPorts={http:80,https:443},MessageUtils=exports.MessageUtils={getContentType:function(e){var t=this.get_first_header(e,/^Content-Type$/i);if(t)return t.split(";")[0].trim()},get_first_header:function(e,t){if(e._headerLookups||Object.defineProperty(e,"_headerLookups",{value:{},configurable:!1,enumerable:!1,writable:!1}),!(t in e._headerLookups)){for(var r,s=0;s<e.headers.length;s++)if(e.headers[s][0].match(t)){r=e.headers[s];break}e._headerLookups[t]=r?r[1]:void 0}return e._headerLookups[t]},match_header:function(e,t){for(var r=e.headers,s=r.length;s--;)if(t.test(r[s].join(" ")))return r[s];return!1},getContentURL:function(e,t){return t===e.request?t="request":t===e.response&&(t="response"),"/flows/"+e.id+"/"+t+"/content"}},RequestUtils=exports.RequestUtils=_lodash2.default.extend(MessageUtils,{pretty_host:function(e){return e.host},pretty_url:function(e){var t="";return defaultPorts[e.scheme]!==e.port&&(t=":"+e.port),e.scheme+"://"+this.pretty_host(e)+t+e.path}}),ResponseUtils=exports.ResponseUtils=_lodash2.default.extend(MessageUtils,{}),parseUrl_regex=/^(?:(https?):\/\/)?([^\/:]+)?(?::(\d+))?(\/.*)?$/i,parseUrl=exports.parseUrl=function(e){var t=parseUrl_regex.exec(e);if(!t)return!1;var r=t[1],s=t[2],o=parseInt(t[3]),i=t[4];r&&(o=o||defaultPorts[r]);var n={};return r&&(n.scheme=r),s&&(n.host=s),o&&(n.port=o),i&&(n.path=i),n},isValidHttpVersion_regex=/^HTTP\/\d+(\.\d+)*$/i,isValidHttpVersion=exports.isValidHttpVersion=function(e){return isValidHttpVersion_regex.test(e)},parseHttpVersion=exports.parseHttpVersion=function(e){return e=e.replace("HTTP/","").split("."),_lodash2.default.map(e,function(e){return parseInt(e)})}; -},{"lodash":"lodash"}],55:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function reverseString(e){return String.fromCharCode.apply(String,_lodash2["default"].map(e.split(""),function(e){return 65535-e.charCodeAt(0)}))+end}function getCookie(e){var t=document.cookie.match(new RegExp("\\b"+e+"=([^;]*)\\b"));return t?t[1]:void 0}function fetchApi(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return t.method&&"GET"!==t.method&&(e+=e.indexOf("?")===-1?"?"+xsrf:"&"+xsrf),fetch(e,_extends({credentials:"same-origin"},t))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatTimeStamp=exports.formatTimeDelta=exports.formatSize=exports.Key=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};exports.reverseString=reverseString,exports.fetchApi=fetchApi;var _lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash);window._=_lodash2["default"],window.React=require("react");for(var Key=exports.Key={UP:38,DOWN:40,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,LEFT:37,RIGHT:39,ENTER:13,ESC:27,TAB:9,SPACE:32,BACKSPACE:8,SHIFT:16},i=65;i<=90;i++)Key[String.fromCharCode(i)]=i;var formatSize=exports.formatSize=function(e){if(0===e)return"0";for(var t=["b","kb","mb","gb","tb"],r=0;r<t.length&&!(Math.pow(1024,r+1)>e);r++);var o;return o=e%Math.pow(1024,r)===0?0:1,(e/Math.pow(1024,r)).toFixed(o)+t[r]},formatTimeDelta=exports.formatTimeDelta=function(e){for(var t=e,r=["ms","s","min","h"],o=[1e3,60,60],n=0;Math.abs(t)>=o[n]&&n<o.length;)t/=o[n],n++;return Math.round(t)+r[n]},formatTimeStamp=exports.formatTimeStamp=function(e){var t=new Date(1e3*e).toISOString();return t.replace("T"," ").replace("Z","")},end=String.fromCharCode(65535),xsrf="_xsrf="+getCookie("_xsrf");fetchApi.put=function(e,t,r){return fetchApi(e,_extends({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)},r))}; +},{"lodash":"lodash"}],54:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function reverseString(e){return String.fromCharCode.apply(String,_lodash2.default.map(e.split(""),function(e){return 65535-e.charCodeAt(0)}))+end}function getCookie(e){var t=document.cookie.match(new RegExp("\\b"+e+"=([^;]*)\\b"));return t?t[1]:void 0}function fetchApi(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return t.method&&"GET"!==t.method&&(e+=e.indexOf("?")===-1?"?"+xsrf:"&"+xsrf),fetch(e,_extends({credentials:"same-origin"},t))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatTimeStamp=exports.formatTimeDelta=exports.formatSize=exports.Key=void 0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};exports.reverseString=reverseString,exports.fetchApi=fetchApi;var _lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash);window._=_lodash2.default,window.React=require("react");for(var Key=exports.Key={UP:38,DOWN:40,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,LEFT:37,RIGHT:39,ENTER:13,ESC:27,TAB:9,SPACE:32,BACKSPACE:8,SHIFT:16},i=65;i<=90;i++)Key[String.fromCharCode(i)]=i;var formatSize=exports.formatSize=function(e){if(0===e)return"0";for(var t=["b","kb","mb","gb","tb"],r=0;r<t.length&&!(Math.pow(1024,r+1)>e);r++);var o;return o=e%Math.pow(1024,r)===0?0:1,(e/Math.pow(1024,r)).toFixed(o)+t[r]},formatTimeDelta=exports.formatTimeDelta=function(e){for(var t=e,r=["ms","s","min","h"],o=[1e3,60,60],n=0;Math.abs(t)>=o[n]&&n<o.length;)t/=o[n],n++;return Math.round(t)+r[n]},formatTimeStamp=exports.formatTimeStamp=function(e){var t=new Date(1e3*e).toISOString();return t.replace("T"," ").replace("Z","")},end=String.fromCharCode(65535),xsrf="_xsrf="+getCookie("_xsrf");fetchApi.put=function(e,t,r){return fetchApi(e,_extends({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)},r))}; },{"lodash":"lodash","react":"react"}]},{},[2]) diff --git a/mitmproxy/web/static/vendor.js b/mitmproxy/web/static/vendor.js index c908cb66..6ed8dacb 100644 --- a/mitmproxy/web/static/vendor.js +++ b/mitmproxy/web/static/vendor.js @@ -1,5 +1,5 @@ require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ -function isUndefinedOrNull(e){return null===e||void 0===e}function isBuffer(e){return!(!e||"object"!=typeof e||"number"!=typeof e.length)&&("function"==typeof e.copy&&"function"==typeof e.slice&&!(e.length>0&&"number"!=typeof e[0]))}function objEquiv(e,t,r){var n,i;if(isUndefinedOrNull(e)||isUndefinedOrNull(t))return!1;if(e.prototype!==t.prototype)return!1;if(isArguments(e))return!!isArguments(t)&&(e=pSlice.call(e),t=pSlice.call(t),deepEqual(e,t,r));if(isBuffer(e)){if(!isBuffer(t))return!1;if(e.length!==t.length)return!1;for(n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}try{var u=objectKeys(e),o=objectKeys(t)}catch(f){return!1}if(u.length!=o.length)return!1;for(u.sort(),o.sort(),n=u.length-1;n>=0;n--)if(u[n]!=o[n])return!1;for(n=u.length-1;n>=0;n--)if(i=u[n],!deepEqual(e[i],t[i],r))return!1;return typeof e==typeof t}var pSlice=Array.prototype.slice,objectKeys=require("./lib/keys.js"),isArguments=require("./lib/is_arguments.js"),deepEqual=module.exports=function(e,t,r){return r||(r={}),e===t||(e instanceof Date&&t instanceof Date?e.getTime()===t.getTime():!e||!t||"object"!=typeof e&&"object"!=typeof t?r.strict?e===t:e==t:objEquiv(e,t,r))}; +function isUndefinedOrNull(e){return null===e||void 0===e}function isBuffer(e){return!(!e||"object"!=typeof e||"number"!=typeof e.length)&&("function"==typeof e.copy&&"function"==typeof e.slice&&!(e.length>0&&"number"!=typeof e[0]))}function objEquiv(e,t,r){var n,i;if(isUndefinedOrNull(e)||isUndefinedOrNull(t))return!1;if(e.prototype!==t.prototype)return!1;if(isArguments(e))return!!isArguments(t)&&(e=pSlice.call(e),t=pSlice.call(t),deepEqual(e,t,r));if(isBuffer(e)){if(!isBuffer(t))return!1;if(e.length!==t.length)return!1;for(n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}try{var u=objectKeys(e),o=objectKeys(t)}catch(e){return!1}if(u.length!=o.length)return!1;for(u.sort(),o.sort(),n=u.length-1;n>=0;n--)if(u[n]!=o[n])return!1;for(n=u.length-1;n>=0;n--)if(i=u[n],!deepEqual(e[i],t[i],r))return!1;return typeof e==typeof t}var pSlice=Array.prototype.slice,objectKeys=require("./lib/keys.js"),isArguments=require("./lib/is_arguments.js"),deepEqual=module.exports=function(e,t,r){return r||(r={}),e===t||(e instanceof Date&&t instanceof Date?e.getTime()===t.getTime():!e||!t||"object"!=typeof e&&"object"!=typeof t?r.strict?e===t:e==t:objEquiv(e,t,r))}; },{"./lib/is_arguments.js":2,"./lib/keys.js":3}],2:[function(require,module,exports){ function supported(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function unsupported(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Object.prototype.hasOwnProperty.call(t,"callee")&&!Object.prototype.propertyIsEnumerable.call(t,"callee")||!1}var supportsArgumentsClass="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();exports=module.exports=supportsArgumentsClass?supported:unsupported,exports.supported=supported,exports.unsupported=unsupported; @@ -14,55 +14,55 @@ function shim(e){var s=[];for(var t in e)s.push(t);return s}exports=module.expor "use strict";function _classCallCheck(i,t){if(!(i instanceof t))throw new TypeError("Cannot call a class as a function")}exports.__esModule=!0;var invariant=require("fbjs/lib/invariant"),_prefix="ID_",Dispatcher=function(){function i(){_classCallCheck(this,i),this._callbacks={},this._isDispatching=!1,this._isHandled={},this._isPending={},this._lastID=1}return i.prototype.register=function(i){var t=_prefix+this._lastID++;return this._callbacks[t]=i,t},i.prototype.unregister=function(i){this._callbacks[i]?void 0:invariant(!1),delete this._callbacks[i]},i.prototype.waitFor=function(i){this._isDispatching?void 0:invariant(!1);for(var t=0;t<i.length;t++){var s=i[t];this._isPending[s]?this._isHandled[s]?void 0:invariant(!1):(this._callbacks[s]?void 0:invariant(!1),this._invokeCallback(s))}},i.prototype.dispatch=function(i){this._isDispatching?invariant(!1):void 0,this._startDispatching(i);try{for(var t in this._callbacks)this._isPending[t]||this._invokeCallback(t)}finally{this._stopDispatching()}},i.prototype.isDispatching=function(){return this._isDispatching},i.prototype._invokeCallback=function(i){this._isPending[i]=!0,this._callbacks[i](this._pendingPayload),this._isHandled[i]=!0},i.prototype._startDispatching=function(i){for(var t in this._callbacks)this._isPending[t]=!1,this._isHandled[t]=!1;this._pendingPayload=i,this._isDispatching=!0},i.prototype._stopDispatching=function(){delete this._pendingPayload,this._isDispatching=!1},i}();module.exports=Dispatcher; },{"fbjs/lib/invariant":4}],6:[function(require,module,exports){ -"use strict";exports.__esModule=!0;var PUSH="PUSH";exports.PUSH=PUSH;var REPLACE="REPLACE";exports.REPLACE=REPLACE;var POP="POP";exports.POP=POP,exports["default"]={PUSH:PUSH,REPLACE:REPLACE,POP:POP}; +"use strict";exports.__esModule=!0;var PUSH="PUSH";exports.PUSH=PUSH;var REPLACE="REPLACE";exports.REPLACE=REPLACE;var POP="POP";exports.POP=POP,exports.default={PUSH:PUSH,REPLACE:REPLACE,POP:POP}; },{}],7:[function(require,module,exports){ "use strict";function loopAsync(o,i,t){function c(){return r=!0,n?void(p=[].concat(_slice.call(arguments))):void t.apply(this,arguments)}function s(){if(!r&&(e=!0,!n)){for(n=!0;!r&&l<o&&e;)e=!1,i.call(this,l++,s,c);return n=!1,r?void t.apply(this,p):void(l>=o&&e&&(r=!0,t()))}}var l=0,r=!1,n=!1,e=!1,p=void 0;s()}exports.__esModule=!0;var _slice=Array.prototype.slice;exports.loopAsync=loopAsync; },{}],8:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createKey(e){return KeyPrefix+e}function saveState(e,r){try{null==r?window.sessionStorage.removeItem(createKey(e)):window.sessionStorage.setItem(createKey(e),JSON.stringify(r))}catch(t){if(t.name===SecurityError)return;if(QuotaExceededErrors.indexOf(t.name)>=0&&0===window.sessionStorage.length)return;throw t}}function readState(e){var r=void 0;try{r=window.sessionStorage.getItem(createKey(e))}catch(t){if(t.name===SecurityError)return null}if(r)try{return JSON.parse(r)}catch(t){}return null}exports.__esModule=!0,exports.saveState=saveState,exports.readState=readState;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning),KeyPrefix="@@History/",QuotaExceededErrors=["QuotaExceededError","QUOTA_EXCEEDED_ERR"],SecurityError="SecurityError"; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function createKey(e){return KeyPrefix+e}function saveState(e,r){try{null==r?window.sessionStorage.removeItem(createKey(e)):window.sessionStorage.setItem(createKey(e),JSON.stringify(r))}catch(e){if(e.name===SecurityError)return;if(QuotaExceededErrors.indexOf(e.name)>=0&&0===window.sessionStorage.length)return;throw e}}function readState(e){var r=void 0;try{r=window.sessionStorage.getItem(createKey(e))}catch(e){if(e.name===SecurityError)return null}if(r)try{return JSON.parse(r)}catch(e){}return null}exports.__esModule=!0,exports.saveState=saveState,exports.readState=readState;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning),KeyPrefix="@@History/",QuotaExceededErrors=["QuotaExceededError","QUOTA_EXCEEDED_ERR"],SecurityError="SecurityError"; -},{"warning":246}],9:[function(require,module,exports){ +},{"warning":243}],9:[function(require,module,exports){ "use strict";function addEventListener(t,e,o){t.addEventListener?t.addEventListener(e,o,!1):t.attachEvent("on"+e,o)}function removeEventListener(t,e,o){t.removeEventListener?t.removeEventListener(e,o,!1):t.detachEvent("on"+e,o)}function getHashPath(){return window.location.href.split("#")[1]||""}function replaceHashPath(t){window.location.replace(window.location.pathname+window.location.search+"#"+t)}function getWindowPath(){return window.location.pathname+window.location.search+window.location.hash}function go(t){t&&window.history.go(t)}function getUserConfirmation(t,e){e(window.confirm(t))}function supportsHistory(){var t=navigator.userAgent;return(t.indexOf("Android 2.")===-1&&t.indexOf("Android 4.0")===-1||t.indexOf("Mobile Safari")===-1||t.indexOf("Chrome")!==-1||t.indexOf("Windows Phone")!==-1)&&(window.history&&"pushState"in window.history)}function supportsGoWithoutReloadUsingHash(){var t=navigator.userAgent;return t.indexOf("Firefox")===-1}exports.__esModule=!0,exports.addEventListener=addEventListener,exports.removeEventListener=removeEventListener,exports.getHashPath=getHashPath,exports.replaceHashPath=replaceHashPath,exports.getWindowPath=getWindowPath,exports.go=go,exports.getUserConfirmation=getUserConfirmation,exports.supportsHistory=supportsHistory,exports.supportsGoWithoutReloadUsingHash=supportsGoWithoutReloadUsingHash; },{}],10:[function(require,module,exports){ "use strict";exports.__esModule=!0;var canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement);exports.canUseDOM=canUseDOM; },{}],11:[function(require,module,exports){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function extractPath(t){var r=t.match(/^https?:\/\/[^\/]*/);return null==r?t:t.substring(r[0].length)}function parsePath(t){var r=extractPath(t),e="",a="",n=r.indexOf("#");n!==-1&&(a=r.substring(n),r=r.substring(0,n));var s=r.indexOf("?");return s!==-1&&(e=r.substring(s),r=r.substring(0,s)),""===r&&(r="/"),{pathname:r,search:e,hash:a}}exports.__esModule=!0,exports.extractPath=extractPath,exports.parsePath=parsePath;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning); +"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function extractPath(t){var r=t.match(/^https?:\/\/[^\/]*/);return null==r?t:t.substring(r[0].length)}function parsePath(t){var r=extractPath(t),e="",a="",n=r.indexOf("#");n!==-1&&(a=r.substring(n),r=r.substring(0,n));var s=r.indexOf("?");return s!==-1&&(e=r.substring(s),r=r.substring(0,s)),""===r&&(r="/"),{pathname:r,search:e,hash:a}}exports.__esModule=!0,exports.extractPath=extractPath,exports.parsePath=parsePath;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning); -},{"warning":246}],12:[function(require,module,exports){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function createBrowserHistory(){function t(t){try{t=t||window.history.state||{}}catch(e){t={}}var r=_DOMUtils.getWindowPath(),n=t,i=n.key,o=void 0;i?o=_DOMStateStorage.readState(i):(o=null,i=_.createKey(),c&&window.history.replaceState(_extends({},t,{key:i}),null));var a=_PathUtils.parsePath(r);return _.createLocation(_extends({},a,{state:o}),void 0,i)}function e(e){function r(e){void 0!==e.state&&n(t(e.state))}var n=e.transitionTo;return _DOMUtils.addEventListener(window,"popstate",r),function(){_DOMUtils.removeEventListener(window,"popstate",r)}}function r(t){var e=t.basename,r=t.pathname,n=t.search,i=t.hash,o=t.state,a=t.action,s=t.key;if(a!==_Actions.POP){_DOMStateStorage.saveState(s,o);var u=(e||"")+r+n+i,c={key:s};if(a===_Actions.PUSH){if(l)return window.location.href=u,!1;window.history.pushState(c,null,u)}else{if(l)return window.location.replace(u),!1;window.history.replaceState(c,null,u)}}}function n(t){1===++f&&(v=e(_));var r=_.listenBefore(t);return function(){r(),0===--f&&v()}}function i(t){1===++f&&(v=e(_));var r=_.listen(t);return function(){r(),0===--f&&v()}}function o(t){1===++f&&(v=e(_)),_.registerTransitionHook(t)}function a(t){_.unregisterTransitionHook(t),0===--f&&v()}var s=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];_ExecutionEnvironment.canUseDOM?void 0:_invariant2["default"](!1);var u=s.forceRefresh,c=_DOMUtils.supportsHistory(),l=!c||u,_=_createDOMHistory2["default"](_extends({},s,{getCurrentLocation:t,finishTransition:r,saveState:_DOMStateStorage.saveState})),f=0,v=void 0;return _extends({},_,{listenBefore:n,listen:i,registerTransitionHook:o,unregisterTransitionHook:a})}exports.__esModule=!0;var _extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_Actions=require("./Actions"),_PathUtils=require("./PathUtils"),_ExecutionEnvironment=require("./ExecutionEnvironment"),_DOMUtils=require("./DOMUtils"),_DOMStateStorage=require("./DOMStateStorage"),_createDOMHistory=require("./createDOMHistory"),_createDOMHistory2=_interopRequireDefault(_createDOMHistory);exports["default"]=createBrowserHistory,module.exports=exports["default"]; +},{"warning":243}],12:[function(require,module,exports){ +"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function createBrowserHistory(){function t(t){try{t=t||window.history.state||{}}catch(e){t={}}var e=_DOMUtils.getWindowPath(),r=t,n=r.key,i=void 0;n?i=_DOMStateStorage.readState(n):(i=null,n=_.createKey(),c&&window.history.replaceState(_extends({},t,{key:n}),null));var o=_PathUtils.parsePath(e);return _.createLocation(_extends({},o,{state:i}),void 0,n)}function e(e){function r(e){void 0!==e.state&&n(t(e.state))}var n=e.transitionTo;return _DOMUtils.addEventListener(window,"popstate",r),function(){_DOMUtils.removeEventListener(window,"popstate",r)}}function r(t){var e=t.basename,r=t.pathname,n=t.search,i=t.hash,o=t.state,a=t.action,s=t.key;if(a!==_Actions.POP){_DOMStateStorage.saveState(s,o);var u=(e||"")+r+n+i,c={key:s};if(a===_Actions.PUSH){if(l)return window.location.href=u,!1;window.history.pushState(c,null,u)}else{if(l)return window.location.replace(u),!1;window.history.replaceState(c,null,u)}}}function n(t){1===++f&&(v=e(_));var r=_.listenBefore(t);return function(){r(),0===--f&&v()}}function i(t){1===++f&&(v=e(_));var r=_.listen(t);return function(){r(),0===--f&&v()}}function o(t){1===++f&&(v=e(_)),_.registerTransitionHook(t)}function a(t){_.unregisterTransitionHook(t),0===--f&&v()}var s=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];_ExecutionEnvironment.canUseDOM?void 0:_invariant2.default(!1);var u=s.forceRefresh,c=_DOMUtils.supportsHistory(),l=!c||u,_=_createDOMHistory2.default(_extends({},s,{getCurrentLocation:t,finishTransition:r,saveState:_DOMStateStorage.saveState})),f=0,v=void 0;return _extends({},_,{listenBefore:n,listen:i,registerTransitionHook:o,unregisterTransitionHook:a})}exports.__esModule=!0;var _extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_Actions=require("./Actions"),_PathUtils=require("./PathUtils"),_ExecutionEnvironment=require("./ExecutionEnvironment"),_DOMUtils=require("./DOMUtils"),_DOMStateStorage=require("./DOMStateStorage"),_createDOMHistory=require("./createDOMHistory"),_createDOMHistory2=_interopRequireDefault(_createDOMHistory);exports.default=createBrowserHistory,module.exports=exports.default; },{"./Actions":6,"./DOMStateStorage":8,"./DOMUtils":9,"./ExecutionEnvironment":10,"./PathUtils":11,"./createDOMHistory":13,"invariant":23}],13:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createDOMHistory(e){function t(e){return _ExecutionEnvironment.canUseDOM?void 0:_invariant2["default"](!1),r.listen(e)}var r=_createHistory2["default"](_extends({getUserConfirmation:_DOMUtils.getUserConfirmation},e,{go:_DOMUtils.go}));return _extends({},r,{listen:t})}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e},_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_ExecutionEnvironment=require("./ExecutionEnvironment"),_DOMUtils=require("./DOMUtils"),_createHistory=require("./createHistory"),_createHistory2=_interopRequireDefault(_createHistory);exports["default"]=createDOMHistory,module.exports=exports["default"]; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function createDOMHistory(e){function t(e){return _ExecutionEnvironment.canUseDOM?void 0:_invariant2.default(!1),r.listen(e)}var r=_createHistory2.default(_extends({getUserConfirmation:_DOMUtils.getUserConfirmation},e,{go:_DOMUtils.go}));return _extends({},r,{listen:t})}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e},_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_ExecutionEnvironment=require("./ExecutionEnvironment"),_DOMUtils=require("./DOMUtils"),_createHistory=require("./createHistory"),_createHistory2=_interopRequireDefault(_createHistory);exports.default=createDOMHistory,module.exports=exports.default; },{"./DOMUtils":9,"./ExecutionEnvironment":10,"./createHistory":15,"invariant":23}],14:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function isAbsolutePath(e){return"string"==typeof e&&"/"===e.charAt(0)}function ensureSlash(){var e=_DOMUtils.getHashPath();return!!isAbsolutePath(e)||(_DOMUtils.replaceHashPath("/"+e),!1)}function addQueryStringValueToPath(e,t,r){return e+(e.indexOf("?")===-1?"?":"&")+(t+"="+r)}function stripQueryStringValueFromPath(e,t){return e.replace(new RegExp("[?&]?"+t+"=[a-zA-Z0-9]+"),"")}function getQueryStringValueFromPath(e,t){var r=e.match(new RegExp("\\?.*?\\b"+t+"=(.+?)\\b"));return r&&r[1]}function createHashHistory(){function e(){var e=_DOMUtils.getHashPath(),t=void 0,r=void 0;g?(t=getQueryStringValueFromPath(e,g),e=stripQueryStringValueFromPath(e,g),t?r=_DOMStateStorage.readState(t):(r=null,t=v.createKey(),_DOMUtils.replaceHashPath(addQueryStringValueToPath(e,g,t)))):t=r=null;var n=_PathUtils.parsePath(e);return v.createLocation(_extends({},n,{state:r}),void 0,t)}function t(t){function r(){ensureSlash()&&n(e())}var n=t.transitionTo;return ensureSlash(),_DOMUtils.addEventListener(window,"hashchange",r),function(){_DOMUtils.removeEventListener(window,"hashchange",r)}}function r(e){var t=e.basename,r=e.pathname,n=e.search,a=e.state,i=e.action,o=e.key;if(i!==_Actions.POP){var u=(t||"")+r+n;g?(u=addQueryStringValueToPath(u,g,o),_DOMStateStorage.saveState(o,a)):e.key=e.state=null;var s=_DOMUtils.getHashPath();i===_Actions.PUSH?s!==u&&(window.location.hash=u):s!==u&&_DOMUtils.replaceHashPath(u)}}function n(e){1===++d&&(p=t(v));var r=v.listenBefore(e);return function(){r(),0===--d&&p()}}function a(e){1===++d&&(p=t(v));var r=v.listen(e);return function(){r(),0===--d&&p()}}function i(e){v.push(e)}function o(e){v.replace(e)}function u(e){v.go(e)}function s(e){return"#"+v.createHref(e)}function c(e){1===++d&&(p=t(v)),v.registerTransitionHook(e)}function l(e){v.unregisterTransitionHook(e),0===--d&&p()}function h(e,t){v.pushState(e,t)}function f(e,t){v.replaceState(e,t)}var _=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];_ExecutionEnvironment.canUseDOM?void 0:_invariant2["default"](!1);var g=_.queryKey;(void 0===g||g)&&(g="string"==typeof g?g:DefaultQueryKey);var v=_createDOMHistory2["default"](_extends({},_,{getCurrentLocation:e,finishTransition:r,saveState:_DOMStateStorage.saveState})),d=0,p=void 0;_DOMUtils.supportsGoWithoutReloadUsingHash();return _extends({},v,{listenBefore:n,listen:a,push:i,replace:o,go:u,createHref:s,registerTransitionHook:c,unregisterTransitionHook:l,pushState:h,replaceState:f})}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_Actions=require("./Actions"),_PathUtils=require("./PathUtils"),_ExecutionEnvironment=require("./ExecutionEnvironment"),_DOMUtils=require("./DOMUtils"),_DOMStateStorage=require("./DOMStateStorage"),_createDOMHistory=require("./createDOMHistory"),_createDOMHistory2=_interopRequireDefault(_createDOMHistory),DefaultQueryKey="_k";exports["default"]=createHashHistory,module.exports=exports["default"]; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function isAbsolutePath(e){return"string"==typeof e&&"/"===e.charAt(0)}function ensureSlash(){var e=_DOMUtils.getHashPath();return!!isAbsolutePath(e)||(_DOMUtils.replaceHashPath("/"+e),!1)}function addQueryStringValueToPath(e,t,r){return e+(e.indexOf("?")===-1?"?":"&")+(t+"="+r)}function stripQueryStringValueFromPath(e,t){return e.replace(new RegExp("[?&]?"+t+"=[a-zA-Z0-9]+"),"")}function getQueryStringValueFromPath(e,t){var r=e.match(new RegExp("\\?.*?\\b"+t+"=(.+?)\\b"));return r&&r[1]}function createHashHistory(){function e(){var e=_DOMUtils.getHashPath(),t=void 0,r=void 0;g?(t=getQueryStringValueFromPath(e,g),e=stripQueryStringValueFromPath(e,g),t?r=_DOMStateStorage.readState(t):(r=null,t=v.createKey(),_DOMUtils.replaceHashPath(addQueryStringValueToPath(e,g,t)))):t=r=null;var n=_PathUtils.parsePath(e);return v.createLocation(_extends({},n,{state:r}),void 0,t)}function t(t){function r(){ensureSlash()&&n(e())}var n=t.transitionTo;return ensureSlash(),_DOMUtils.addEventListener(window,"hashchange",r),function(){_DOMUtils.removeEventListener(window,"hashchange",r)}}function r(e){var t=e.basename,r=e.pathname,n=e.search,a=e.state,i=e.action,o=e.key;if(i!==_Actions.POP){var u=(t||"")+r+n;g?(u=addQueryStringValueToPath(u,g,o),_DOMStateStorage.saveState(o,a)):e.key=e.state=null;var s=_DOMUtils.getHashPath();i===_Actions.PUSH?s!==u&&(window.location.hash=u):s!==u&&_DOMUtils.replaceHashPath(u)}}function n(e){1===++d&&(p=t(v));var r=v.listenBefore(e);return function(){r(),0===--d&&p()}}function a(e){1===++d&&(p=t(v));var r=v.listen(e);return function(){r(),0===--d&&p()}}function i(e){v.push(e)}function o(e){v.replace(e)}function u(e){v.go(e)}function s(e){return"#"+v.createHref(e)}function c(e){1===++d&&(p=t(v)),v.registerTransitionHook(e)}function l(e){v.unregisterTransitionHook(e),0===--d&&p()}function h(e,t){v.pushState(e,t)}function f(e,t){v.replaceState(e,t)}var _=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];_ExecutionEnvironment.canUseDOM?void 0:_invariant2.default(!1);var g=_.queryKey;(void 0===g||g)&&(g="string"==typeof g?g:DefaultQueryKey);var v=_createDOMHistory2.default(_extends({},_,{getCurrentLocation:e,finishTransition:r,saveState:_DOMStateStorage.saveState})),d=0,p=void 0;_DOMUtils.supportsGoWithoutReloadUsingHash();return _extends({},v,{listenBefore:n,listen:a,push:i,replace:o,go:u,createHref:s,registerTransitionHook:c,unregisterTransitionHook:l,pushState:h,replaceState:f})}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_Actions=require("./Actions"),_PathUtils=require("./PathUtils"),_ExecutionEnvironment=require("./ExecutionEnvironment"),_DOMUtils=require("./DOMUtils"),_DOMStateStorage=require("./DOMStateStorage"),_createDOMHistory=require("./createDOMHistory"),_createDOMHistory2=_interopRequireDefault(_createDOMHistory),DefaultQueryKey="_k";exports.default=createHashHistory,module.exports=exports.default; -},{"./Actions":6,"./DOMStateStorage":8,"./DOMUtils":9,"./ExecutionEnvironment":10,"./PathUtils":11,"./createDOMHistory":13,"invariant":23,"warning":246}],15:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createRandomKey(e){return Math.random().toString(36).substr(2,e)}function locationsAreEqual(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.key===t.key&&_deepEqual2["default"](e.state,t.state)}function createHistory(){function e(e){return U.push(e),function(){U=U.filter(function(t){return t!==e})}}function t(){return m&&m.action===_Actions.POP?R.indexOf(m.key):T?R.indexOf(T.key):-1}function n(e){var n=t();T=e,T.action===_Actions.PUSH?R=[].concat(R.slice(0,n+1),[T.key]):T.action===_Actions.REPLACE&&(R[n]=T.key),S.forEach(function(e){e(T)})}function r(e){if(S.push(e),T)e(T);else{var t=A();R=[t.key],n(t)}return function(){S=S.filter(function(t){return t!==e})}}function i(e,t){_AsyncUtils.loopAsync(U.length,function(t,n,r){_runTransitionHook2["default"](U[t],e,function(e){null!=e?r(e):n()})},function(e){E&&"string"==typeof e?E(e,function(e){t(e!==!1)}):t(e!==!1)})}function a(e){T&&locationsAreEqual(T,e)||(m=e,i(e,function(t){if(m===e)if(t){if(e.action===_Actions.PUSH){var r=l(T),i=l(e);i===r&&_deepEqual2["default"](T.state,e.state)&&(e.action=_Actions.REPLACE)}v(e)!==!1&&n(e)}else if(T&&e.action===_Actions.POP){var a=R.indexOf(T.key),o=R.indexOf(e.key);a!==-1&&o!==-1&&x(a-o)}}))}function o(e){a(p(e,_Actions.PUSH,f()))}function u(e){a(p(e,_Actions.REPLACE,f()))}function s(){x(-1)}function c(){x(1)}function f(){return createRandomKey(L)}function l(e){if(null==e||"string"==typeof e)return e;var t=e.pathname,n=e.search,r=e.hash,i=t;return n&&(i+=n),r&&(i+=r),i}function d(e){return l(e)}function p(e,t){var n=arguments.length<=2||void 0===arguments[2]?f():arguments[2];return"object"==typeof t&&("string"==typeof e&&(e=_PathUtils.parsePath(e)),e=_extends({},e,{state:t}),t=n,n=arguments[3]||f()),_createLocation3["default"](e,t,n)}function _(e){T?(h(T,e),n(T)):h(A(),e)}function h(e,t){e.state=_extends({},e.state,t),H(e.key,e.state)}function y(e){U.indexOf(e)===-1&&U.push(e)}function g(e){U=U.filter(function(t){return t!==e})}function k(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),o(_extends({state:e},t))}function q(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),u(_extends({state:e},t))}var P=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],A=P.getCurrentLocation,v=P.finishTransition,H=P.saveState,x=P.go,E=P.getUserConfirmation,L=P.keyLength;"number"!=typeof L&&(L=DefaultKeyLength);var U=[],R=[],S=[],T=void 0,m=void 0;return{listenBefore:e,listen:r,transitionTo:a,push:o,replace:u,go:x,goBack:s,goForward:c,createKey:f,createPath:l,createHref:d,createLocation:p,setState:_deprecate2["default"](_,"setState is deprecated; use location.key to save state instead"),registerTransitionHook:_deprecate2["default"](y,"registerTransitionHook is deprecated; use listenBefore instead"),unregisterTransitionHook:_deprecate2["default"](g,"unregisterTransitionHook is deprecated; use the callback returned from listenBefore instead"),pushState:_deprecate2["default"](k,"pushState is deprecated; use push instead"),replaceState:_deprecate2["default"](q,"replaceState is deprecated; use replace instead")}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_deepEqual=require("deep-equal"),_deepEqual2=_interopRequireDefault(_deepEqual),_PathUtils=require("./PathUtils"),_AsyncUtils=require("./AsyncUtils"),_Actions=require("./Actions"),_createLocation2=require("./createLocation"),_createLocation3=_interopRequireDefault(_createLocation2),_runTransitionHook=require("./runTransitionHook"),_runTransitionHook2=_interopRequireDefault(_runTransitionHook),_deprecate=require("./deprecate"),_deprecate2=_interopRequireDefault(_deprecate),DefaultKeyLength=6;exports["default"]=createHistory,module.exports=exports["default"]; +},{"./Actions":6,"./DOMStateStorage":8,"./DOMUtils":9,"./ExecutionEnvironment":10,"./PathUtils":11,"./createDOMHistory":13,"invariant":23,"warning":243}],15:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function createRandomKey(e){return Math.random().toString(36).substr(2,e)}function locationsAreEqual(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.key===t.key&&_deepEqual2.default(e.state,t.state)}function createHistory(){function e(e){return U.push(e),function(){U=U.filter(function(t){return t!==e})}}function t(){return m&&m.action===_Actions.POP?R.indexOf(m.key):T?R.indexOf(T.key):-1}function n(e){var n=t();T=e,T.action===_Actions.PUSH?R=[].concat(R.slice(0,n+1),[T.key]):T.action===_Actions.REPLACE&&(R[n]=T.key),S.forEach(function(e){e(T)})}function r(e){if(S.push(e),T)e(T);else{var t=A();R=[t.key],n(t)}return function(){S=S.filter(function(t){return t!==e})}}function i(e,t){_AsyncUtils.loopAsync(U.length,function(t,n,r){_runTransitionHook2.default(U[t],e,function(e){null!=e?r(e):n()})},function(e){E&&"string"==typeof e?E(e,function(e){t(e!==!1)}):t(e!==!1)})}function a(e){T&&locationsAreEqual(T,e)||(m=e,i(e,function(t){if(m===e)if(t){if(e.action===_Actions.PUSH){var r=l(T),i=l(e);i===r&&_deepEqual2.default(T.state,e.state)&&(e.action=_Actions.REPLACE)}v(e)!==!1&&n(e)}else if(T&&e.action===_Actions.POP){var a=R.indexOf(T.key),o=R.indexOf(e.key);a!==-1&&o!==-1&&x(a-o)}}))}function o(e){a(p(e,_Actions.PUSH,f()))}function u(e){a(p(e,_Actions.REPLACE,f()))}function s(){x(-1)}function c(){x(1)}function f(){return createRandomKey(L)}function l(e){if(null==e||"string"==typeof e)return e;var t=e.pathname,n=e.search,r=e.hash,i=t;return n&&(i+=n),r&&(i+=r),i}function d(e){return l(e)}function p(e,t){var n=arguments.length<=2||void 0===arguments[2]?f():arguments[2];return"object"==typeof t&&("string"==typeof e&&(e=_PathUtils.parsePath(e)),e=_extends({},e,{state:t}),t=n,n=arguments[3]||f()),_createLocation3.default(e,t,n)}function _(e){T?(h(T,e),n(T)):h(A(),e)}function h(e,t){e.state=_extends({},e.state,t),H(e.key,e.state)}function y(e){U.indexOf(e)===-1&&U.push(e)}function g(e){U=U.filter(function(t){return t!==e})}function k(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),o(_extends({state:e},t))}function q(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),u(_extends({state:e},t))}var P=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],A=P.getCurrentLocation,v=P.finishTransition,H=P.saveState,x=P.go,E=P.getUserConfirmation,L=P.keyLength;"number"!=typeof L&&(L=DefaultKeyLength);var U=[],R=[],S=[],T=void 0,m=void 0;return{listenBefore:e,listen:r,transitionTo:a,push:o,replace:u,go:x,goBack:s,goForward:c,createKey:f,createPath:l,createHref:d,createLocation:p,setState:_deprecate2.default(_,"setState is deprecated; use location.key to save state instead"),registerTransitionHook:_deprecate2.default(y,"registerTransitionHook is deprecated; use listenBefore instead"),unregisterTransitionHook:_deprecate2.default(g,"unregisterTransitionHook is deprecated; use the callback returned from listenBefore instead"),pushState:_deprecate2.default(k,"pushState is deprecated; use push instead"),replaceState:_deprecate2.default(q,"replaceState is deprecated; use replace instead")}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_deepEqual=require("deep-equal"),_deepEqual2=_interopRequireDefault(_deepEqual),_PathUtils=require("./PathUtils"),_AsyncUtils=require("./AsyncUtils"),_Actions=require("./Actions"),_createLocation2=require("./createLocation"),_createLocation3=_interopRequireDefault(_createLocation2),_runTransitionHook=require("./runTransitionHook"),_runTransitionHook2=_interopRequireDefault(_runTransitionHook),_deprecate=require("./deprecate"),_deprecate2=_interopRequireDefault(_deprecate),DefaultKeyLength=6;exports.default=createHistory,module.exports=exports.default; -},{"./Actions":6,"./AsyncUtils":7,"./PathUtils":11,"./createLocation":16,"./deprecate":18,"./runTransitionHook":19,"deep-equal":1,"warning":246}],16:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createLocation(){var e=arguments.length<=0||void 0===arguments[0]?"/":arguments[0],t=arguments.length<=1||void 0===arguments[1]?_Actions.POP:arguments[1],n=arguments.length<=2||void 0===arguments[2]?null:arguments[2],r=arguments.length<=3||void 0===arguments[3]?null:arguments[3];"string"==typeof e&&(e=_PathUtils.parsePath(e)),"object"==typeof t&&(e=_extends({},e,{state:t}),t=n||_Actions.POP,n=r);var a=e.pathname||"/",o=e.search||"",i=e.hash||"",s=e.state||null;return{pathname:a,search:o,hash:i,state:s,action:t,key:n}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_Actions=require("./Actions"),_PathUtils=require("./PathUtils");exports["default"]=createLocation,module.exports=exports["default"]; +},{"./Actions":6,"./AsyncUtils":7,"./PathUtils":11,"./createLocation":16,"./deprecate":18,"./runTransitionHook":19,"deep-equal":1,"warning":243}],16:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function createLocation(){var e=arguments.length<=0||void 0===arguments[0]?"/":arguments[0],t=arguments.length<=1||void 0===arguments[1]?_Actions.POP:arguments[1],n=arguments.length<=2||void 0===arguments[2]?null:arguments[2],r=arguments.length<=3||void 0===arguments[3]?null:arguments[3];"string"==typeof e&&(e=_PathUtils.parsePath(e)),"object"==typeof t&&(e=_extends({},e,{state:t}),t=n||_Actions.POP,n=r);var a=e.pathname||"/",o=e.search||"",i=e.hash||"",s=e.state||null;return{pathname:a,search:o,hash:i,state:s,action:t,key:n}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_Actions=require("./Actions"),_PathUtils=require("./PathUtils");exports.default=createLocation,module.exports=exports.default; -},{"./Actions":6,"./PathUtils":11,"warning":246}],17:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createStateStorage(e){return e.filter(function(e){return e.state}).reduce(function(e,t){return e[t.key]=t.state,e},{})}function createMemoryHistory(){function e(e,t){_[e]=t}function t(e){return _[e]}function r(){var e=c[f],r=e.basename,n=e.pathname,a=e.search,i=(r||"")+n+(a||""),o=void 0,u=void 0;e.key?(o=e.key,u=t(o)):(o=s.createKey(),u=null,e.key=o);var _=_PathUtils.parsePath(i);return s.createLocation(_extends({},_,{state:u}),void 0,o)}function n(e){var t=f+e;return t>=0&&t<c.length}function a(e){if(e){if(!n(e))return;f+=e;var t=r();s.transitionTo(_extends({},t,{action:_Actions.POP}))}}function i(t){switch(t.action){case _Actions.PUSH:f+=1,f<c.length&&c.splice(f),c.push(t),e(t.key,t.state);break;case _Actions.REPLACE:c[f]=t,e(t.key,t.state)}}var o=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];Array.isArray(o)?o={entries:o}:"string"==typeof o&&(o={entries:[o]});var s=_createHistory2["default"](_extends({},o,{getCurrentLocation:r,finishTransition:i,saveState:e,go:a})),u=o,c=u.entries,f=u.current;"string"==typeof c?c=[c]:Array.isArray(c)||(c=["/"]),c=c.map(function(e){var t=s.createKey();return"string"==typeof e?{pathname:e,key:t}:"object"==typeof e&&e?_extends({},e,{key:t}):void _invariant2["default"](!1)}),null==f?f=c.length-1:f>=0&&f<c.length?void 0:_invariant2["default"](!1);var _=createStateStorage(c);return s}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_PathUtils=require("./PathUtils"),_Actions=require("./Actions"),_createHistory=require("./createHistory"),_createHistory2=_interopRequireDefault(_createHistory);exports["default"]=createMemoryHistory,module.exports=exports["default"]; +},{"./Actions":6,"./PathUtils":11,"warning":243}],17:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function createStateStorage(e){return e.filter(function(e){return e.state}).reduce(function(e,t){return e[t.key]=t.state,e},{})}function createMemoryHistory(){function e(e,t){_[e]=t}function t(e){return _[e]}function r(){var e=c[f],r=e.basename,n=e.pathname,a=e.search,i=(r||"")+n+(a||""),o=void 0,u=void 0;e.key?(o=e.key,u=t(o)):(o=s.createKey(),u=null,e.key=o);var _=_PathUtils.parsePath(i);return s.createLocation(_extends({},_,{state:u}),void 0,o)}function n(e){var t=f+e;return t>=0&&t<c.length}function a(e){if(e){if(!n(e))return;f+=e;var t=r();s.transitionTo(_extends({},t,{action:_Actions.POP}))}}function i(t){switch(t.action){case _Actions.PUSH:f+=1,f<c.length&&c.splice(f),c.push(t),e(t.key,t.state);break;case _Actions.REPLACE:c[f]=t,e(t.key,t.state)}}var o=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];Array.isArray(o)?o={entries:o}:"string"==typeof o&&(o={entries:[o]});var s=_createHistory2.default(_extends({},o,{getCurrentLocation:r,finishTransition:i,saveState:e,go:a})),u=o,c=u.entries,f=u.current;"string"==typeof c?c=[c]:Array.isArray(c)||(c=["/"]),c=c.map(function(e){var t=s.createKey();return"string"==typeof e?{pathname:e,key:t}:"object"==typeof e&&e?_extends({},e,{key:t}):void _invariant2.default(!1)}),null==f?f=c.length-1:f>=0&&f<c.length?void 0:_invariant2.default(!1);var _=createStateStorage(c);return s}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_PathUtils=require("./PathUtils"),_Actions=require("./Actions"),_createHistory=require("./createHistory"),_createHistory2=_interopRequireDefault(_createHistory);exports.default=createMemoryHistory,module.exports=exports.default; -},{"./Actions":6,"./PathUtils":11,"./createHistory":15,"invariant":23,"warning":246}],18:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function deprecate(e,r){return function(){return e.apply(this,arguments)}}exports.__esModule=!0;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning);exports["default"]=deprecate,module.exports=exports["default"]; +},{"./Actions":6,"./PathUtils":11,"./createHistory":15,"invariant":23,"warning":243}],18:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function deprecate(e,r){return function(){return e.apply(this,arguments)}}exports.__esModule=!0;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning);exports.default=deprecate,module.exports=exports.default; -},{"warning":246}],19:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function runTransitionHook(e,r,n){var t=e(r,n);e.length<2&&n(t)}exports.__esModule=!0;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning);exports["default"]=runTransitionHook,module.exports=exports["default"]; +},{"warning":243}],19:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function runTransitionHook(e,r,n){var t=e(r,n);e.length<2&&n(t)}exports.__esModule=!0;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning);exports.default=runTransitionHook,module.exports=exports.default; -},{"warning":246}],20:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function useBasename(e){return function(){function t(){if(!m){if(null==h&&_ExecutionEnvironment.canUseDOM){var e=document.getElementsByTagName("base")[0],t=e&&e.getAttribute("href");null!=t&&(h=t)}m=!0}}function n(e){return t(),h&&null==e.basename&&(0===e.pathname.indexOf(h)?(e.pathname=e.pathname.substring(h.length),e.basename=h,""===e.pathname&&(e.pathname="/")):e.basename=""),e}function r(e){if(t(),!h)return e;"string"==typeof e&&(e=_PathUtils.parsePath(e));var n=e.pathname,r="/"===h.slice(-1)?h:h+"/",a="/"===n.charAt(0)?n.slice(1):n,i=r+a;return _extends({},e,{pathname:i})}function a(e){return d.listenBefore(function(t,r){_runTransitionHook2["default"](e,n(t),r)})}function i(e){return d.listen(function(t){e(n(t))})}function u(e){d.push(r(e))}function o(e){d.replace(r(e))}function s(e){return d.createPath(r(e))}function c(e){return d.createHref(r(e))}function p(e){for(var t=arguments.length,a=Array(t>1?t-1:0),i=1;i<t;i++)a[i-1]=arguments[i];return n(d.createLocation.apply(d,[r(e)].concat(a)))}function f(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),u(_extends({state:e},t))}function l(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),o(_extends({state:e},t))}var _=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],d=e(_),h=_.basename,m=!1;return _extends({},d,{listenBefore:a,listen:i,push:u,replace:o,createPath:s,createHref:c,createLocation:p,pushState:_deprecate2["default"](f,"pushState is deprecated; use push instead"),replaceState:_deprecate2["default"](l,"replaceState is deprecated; use replace instead")})}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_ExecutionEnvironment=require("./ExecutionEnvironment"),_PathUtils=require("./PathUtils"),_runTransitionHook=require("./runTransitionHook"),_runTransitionHook2=_interopRequireDefault(_runTransitionHook),_deprecate=require("./deprecate"),_deprecate2=_interopRequireDefault(_deprecate);exports["default"]=useBasename,module.exports=exports["default"]; +},{"warning":243}],20:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function useBasename(e){return function(){function t(){if(!m){if(null==h&&_ExecutionEnvironment.canUseDOM){var e=document.getElementsByTagName("base")[0],t=e&&e.getAttribute("href");null!=t&&(h=t)}m=!0}}function n(e){return t(),h&&null==e.basename&&(0===e.pathname.indexOf(h)?(e.pathname=e.pathname.substring(h.length),e.basename=h,""===e.pathname&&(e.pathname="/")):e.basename=""),e}function r(e){if(t(),!h)return e;"string"==typeof e&&(e=_PathUtils.parsePath(e));var n=e.pathname,r="/"===h.slice(-1)?h:h+"/",a="/"===n.charAt(0)?n.slice(1):n,i=r+a;return _extends({},e,{pathname:i})}function a(e){return d.listenBefore(function(t,r){_runTransitionHook2.default(e,n(t),r)})}function i(e){return d.listen(function(t){e(n(t))})}function u(e){d.push(r(e))}function o(e){d.replace(r(e))}function s(e){return d.createPath(r(e))}function c(e){return d.createHref(r(e))}function p(e){for(var t=arguments.length,a=Array(t>1?t-1:0),i=1;i<t;i++)a[i-1]=arguments[i];return n(d.createLocation.apply(d,[r(e)].concat(a)))}function f(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),u(_extends({state:e},t))}function l(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),o(_extends({state:e},t))}var _=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],d=e(_),h=_.basename,m=!1;return _extends({},d,{listenBefore:a,listen:i,push:u,replace:o,createPath:s,createHref:c,createLocation:p,pushState:_deprecate2.default(f,"pushState is deprecated; use push instead"),replaceState:_deprecate2.default(l,"replaceState is deprecated; use replace instead")})}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_ExecutionEnvironment=require("./ExecutionEnvironment"),_PathUtils=require("./PathUtils"),_runTransitionHook=require("./runTransitionHook"),_runTransitionHook2=_interopRequireDefault(_runTransitionHook),_deprecate=require("./deprecate"),_deprecate2=_interopRequireDefault(_deprecate);exports.default=useBasename,module.exports=exports.default; -},{"./ExecutionEnvironment":10,"./PathUtils":11,"./deprecate":18,"./runTransitionHook":19,"warning":246}],21:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function defaultStringifyQuery(e){return _queryString.stringify(e).replace(/%20/g,"+")}function isNestedObject(e){for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&"object"==typeof e[r]&&!Array.isArray(e[r])&&null!==e[r])return!0;return!1}function useQueries(e){return function(){function r(e){if(null==e.query){var r=e.search;e.query=d(r.substring(1)),e[SEARCH_BASE_KEY]={search:r,searchBase:""}}return e}function t(e,r){var t,n=e[SEARCH_BASE_KEY],a=r?_(r):"";if(!n&&!a)return e;"string"==typeof e&&(e=_PathUtils.parsePath(e));var u=void 0;u=n&&e.search===n.search?n.searchBase:e.search||"";var i=u;return a&&(i+=(i?"&":"?")+a),_extends({},e,(t={search:i},t[SEARCH_BASE_KEY]={search:i,searchBase:u},t))}function n(e){return y.listenBefore(function(t,n){_runTransitionHook2["default"](e,r(t),n)})}function a(e){return y.listen(function(t){e(r(t))})}function u(e){y.push(t(e,e.query))}function i(e){y.replace(t(e,e.query))}function s(e,r){return y.createPath(t(e,r||e.query))}function o(e,r){return y.createHref(t(e,r||e.query))}function c(e){for(var n=arguments.length,a=Array(n>1?n-1:0),u=1;u<n;u++)a[u-1]=arguments[u];var i=y.createLocation.apply(y,[t(e,e.query)].concat(a));return e.query&&(i.query=e.query),r(i)}function f(e,r,t){"string"==typeof r&&(r=_PathUtils.parsePath(r)),u(_extends({state:e},r,{query:t}))}function p(e,r,t){"string"==typeof r&&(r=_PathUtils.parsePath(r)),i(_extends({state:e},r,{query:t}))}var l=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],y=e(l),_=l.stringifyQuery,d=l.parseQueryString;return"function"!=typeof _&&(_=defaultStringifyQuery),"function"!=typeof d&&(d=defaultParseQueryString),_extends({},y,{listenBefore:n,listen:a,push:u,replace:i,createPath:s,createHref:o,createLocation:c,pushState:_deprecate2["default"](f,"pushState is deprecated; use push instead"),replaceState:_deprecate2["default"](p,"replaceState is deprecated; use replace instead")})}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_queryString=require("query-string"),_runTransitionHook=require("./runTransitionHook"),_runTransitionHook2=_interopRequireDefault(_runTransitionHook),_PathUtils=require("./PathUtils"),_deprecate=require("./deprecate"),_deprecate2=_interopRequireDefault(_deprecate),SEARCH_BASE_KEY="$searchBase",defaultParseQueryString=_queryString.parse;exports["default"]=useQueries,module.exports=exports["default"]; +},{"./ExecutionEnvironment":10,"./PathUtils":11,"./deprecate":18,"./runTransitionHook":19,"warning":243}],21:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function defaultStringifyQuery(e){return _queryString.stringify(e).replace(/%20/g,"+")}function isNestedObject(e){for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&"object"==typeof e[r]&&!Array.isArray(e[r])&&null!==e[r])return!0;return!1}function useQueries(e){return function(){function r(e){if(null==e.query){var r=e.search;e.query=d(r.substring(1)),e[SEARCH_BASE_KEY]={search:r,searchBase:""}}return e}function t(e,r){var t,n=e[SEARCH_BASE_KEY],a=r?_(r):"";if(!n&&!a)return e;"string"==typeof e&&(e=_PathUtils.parsePath(e));var u=void 0;u=n&&e.search===n.search?n.searchBase:e.search||"";var i=u;return a&&(i+=(i?"&":"?")+a),_extends({},e,(t={search:i},t[SEARCH_BASE_KEY]={search:i,searchBase:u},t))}function n(e){return y.listenBefore(function(t,n){_runTransitionHook2.default(e,r(t),n)})}function a(e){return y.listen(function(t){e(r(t))})}function u(e){y.push(t(e,e.query))}function i(e){y.replace(t(e,e.query))}function s(e,r){return y.createPath(t(e,r||e.query))}function o(e,r){return y.createHref(t(e,r||e.query))}function c(e){for(var n=arguments.length,a=Array(n>1?n-1:0),u=1;u<n;u++)a[u-1]=arguments[u];var i=y.createLocation.apply(y,[t(e,e.query)].concat(a));return e.query&&(i.query=e.query),r(i)}function f(e,r,t){"string"==typeof r&&(r=_PathUtils.parsePath(r)),u(_extends({state:e},r,{query:t}))}function p(e,r,t){"string"==typeof r&&(r=_PathUtils.parsePath(r)),i(_extends({state:e},r,{query:t}))}var l=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],y=e(l),_=l.stringifyQuery,d=l.parseQueryString;return"function"!=typeof _&&(_=defaultStringifyQuery),"function"!=typeof d&&(d=defaultParseQueryString),_extends({},y,{listenBefore:n,listen:a,push:u,replace:i,createPath:s,createHref:o,createLocation:c,pushState:_deprecate2.default(f,"pushState is deprecated; use push instead"),replaceState:_deprecate2.default(p,"replaceState is deprecated; use replace instead")})}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},_warning=require("warning"),_warning2=_interopRequireDefault(_warning),_queryString=require("query-string"),_runTransitionHook=require("./runTransitionHook"),_runTransitionHook2=_interopRequireDefault(_runTransitionHook),_PathUtils=require("./PathUtils"),_deprecate=require("./deprecate"),_deprecate2=_interopRequireDefault(_deprecate),SEARCH_BASE_KEY="$searchBase",defaultParseQueryString=_queryString.parse;exports.default=useQueries,module.exports=exports.default; -},{"./PathUtils":11,"./deprecate":18,"./runTransitionHook":19,"query-string":33,"warning":246}],22:[function(require,module,exports){ -"use strict";var REACT_STATICS={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,mixins:!0,propTypes:!0,type:!0},KNOWN_STATICS={name:!0,length:!0,prototype:!0,caller:!0,arguments:!0,arity:!0},isGetOwnPropertySymbolsAvailable="function"==typeof Object.getOwnPropertySymbols;module.exports=function(t,e,r){if("string"!=typeof e){var o=Object.getOwnPropertyNames(e);isGetOwnPropertySymbolsAvailable&&(o=o.concat(Object.getOwnPropertySymbols(e)));for(var n=0;n<o.length;++n)if(!(REACT_STATICS[o[n]]||KNOWN_STATICS[o[n]]||r&&r[o[n]]))try{t[o[n]]=e[o[n]]}catch(p){}}return t}; +},{"./PathUtils":11,"./deprecate":18,"./runTransitionHook":19,"query-string":32,"warning":243}],22:[function(require,module,exports){ +"use strict";var REACT_STATICS={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,mixins:!0,propTypes:!0,type:!0},KNOWN_STATICS={name:!0,length:!0,prototype:!0,caller:!0,arguments:!0,arity:!0},isGetOwnPropertySymbolsAvailable="function"==typeof Object.getOwnPropertySymbols;module.exports=function(t,e,r){if("string"!=typeof e){var o=Object.getOwnPropertyNames(e);isGetOwnPropertySymbolsAvailable&&(o=o.concat(Object.getOwnPropertySymbols(e)));for(var n=0;n<o.length;++n)if(!(REACT_STATICS[o[n]]||KNOWN_STATICS[o[n]]||r&&r[o[n]]))try{t[o[n]]=e[o[n]]}catch(t){}}return t}; },{}],23:[function(require,module,exports){ "use strict";var invariant=function(e,n,r,i,o,a,t,f){if(!e){var s;if(void 0===n)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var d=[r,i,o,a,t,f],l=0;s=new Error(n.replace(/%s/g,function(){return d[l++]})),s.name="Invariant Violation"}throw s.framesToPop=1,s}};module.exports=invariant; @@ -77,666 +77,657 @@ function baseProperty(t){return function(e){return null==e?void 0:e[t]}}function function isObjectLike(t){return!!t&&"object"==typeof t}function getNative(t,r){var e=null==t?void 0:t[r];return isNative(e)?e:void 0}function isLength(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=MAX_SAFE_INTEGER}function isFunction(t){return isObject(t)&&objToString.call(t)==funcTag}function isObject(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}function isNative(t){return null!=t&&(isFunction(t)?reIsNative.test(fnToString.call(t)):isObjectLike(t)&&reIsHostCtor.test(t))}var arrayTag="[object Array]",funcTag="[object Function]",reIsHostCtor=/^\[object .+?Constructor\]$/,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),nativeIsArray=getNative(Array,"isArray"),MAX_SAFE_INTEGER=9007199254740991,isArray=nativeIsArray||function(t){return isObjectLike(t)&&isLength(t.length)&&objToString.call(t)==arrayTag};module.exports=isArray; },{}],27:[function(require,module,exports){ -function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function isArrayLike(e){return null!=e&&isLength(getLength(e))}function isIndex(e,t){return e="number"==typeof e||reIsUint.test(e)?+e:-1,t=null==t?MAX_SAFE_INTEGER:t,e>-1&&e%1==0&&e<t}function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=MAX_SAFE_INTEGER}function shimKeys(e){for(var t=keysIn(e),r=t.length,n=r&&e.length,s=!!n&&isLength(n)&&(isArray(e)||isArguments(e)),o=-1,i=[];++o<r;){var u=t[o];(s&&isIndex(u,n)||hasOwnProperty.call(e,u))&&i.push(u)}return i}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function keysIn(e){if(null==e)return[];isObject(e)||(e=Object(e));var t=e.length;t=t&&isLength(t)&&(isArray(e)||isArguments(e))&&t||0;for(var r=e.constructor,n=-1,s="function"==typeof r&&r.prototype===e,o=Array(t),i=t>0;++n<t;)o[n]=n+"";for(var u in e)i&&isIndex(u,t)||"constructor"==u&&(s||!hasOwnProperty.call(e,u))||o.push(u);return o}var getNative=require("lodash._getnative"),isArguments=require("lodash.isarguments"),isArray=require("lodash.isarray"),reIsUint=/^\d+$/,objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,nativeKeys=getNative(Object,"keys"),MAX_SAFE_INTEGER=9007199254740991,getLength=baseProperty("length"),keys=nativeKeys?function(e){var t=null==e?void 0:e.constructor;return"function"==typeof t&&t.prototype===e||"function"!=typeof e&&isArrayLike(e)?shimKeys(e):isObject(e)?nativeKeys(e):[]}:shimKeys;module.exports=keys; - -},{"lodash._getnative":24,"lodash.isarguments":25,"lodash.isarray":26}],28:[function(require,module,exports){ function getPrototype(t){return nativeGetPrototype(Object(t))}var nativeGetPrototype=Object.getPrototypeOf;module.exports=getPrototype; -},{}],29:[function(require,module,exports){ -function isHostObject(t){var o=!1;if(null!=t&&"function"!=typeof t.toString)try{o=!!(t+"")}catch(n){}return o}module.exports=isHostObject; +},{}],28:[function(require,module,exports){ +function isHostObject(t){var o=!1;if(null!=t&&"function"!=typeof t.toString)try{o=!!(t+"")}catch(t){}return o}module.exports=isHostObject; -},{}],30:[function(require,module,exports){ +},{}],29:[function(require,module,exports){ function isObjectLike(e){return!!e&&"object"==typeof e}module.exports=isObjectLike; -},{}],31:[function(require,module,exports){ +},{}],30:[function(require,module,exports){ function isPlainObject(t){if(!isObjectLike(t)||objectToString.call(t)!=objectTag||isHostObject(t))return!1;var o=getPrototype(t);if(null===o)return!0;var e=hasOwnProperty.call(o,"constructor")&&o.constructor;return"function"==typeof e&&e instanceof e&&funcToString.call(e)==objectCtorString}var getPrototype=require("./_getPrototype"),isHostObject=require("./_isHostObject"),isObjectLike=require("./isObjectLike"),objectTag="[object Object]",objectProto=Object.prototype,funcToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objectCtorString=funcToString.call(Object),objectToString=objectProto.toString;module.exports=isPlainObject; -},{"./_getPrototype":28,"./_isHostObject":29,"./isObjectLike":30}],32:[function(require,module,exports){ -"use strict";function toObject(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function shouldUseNative(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var r={},t=0;t<10;t++)r["_"+String.fromCharCode(t)]=t;var n=Object.getOwnPropertyNames(r).map(function(e){return r[e]});if("0123456789"!==n.join(""))return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach(function(e){o[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(a){return!1}}var hasOwnProperty=Object.prototype.hasOwnProperty,propIsEnumerable=Object.prototype.propertyIsEnumerable;module.exports=shouldUseNative()?Object.assign:function(e,r){for(var t,n,o=toObject(e),a=1;a<arguments.length;a++){t=Object(arguments[a]);for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);if(Object.getOwnPropertySymbols){n=Object.getOwnPropertySymbols(t);for(var s=0;s<n.length;s++)propIsEnumerable.call(t,n[s])&&(o[n[s]]=t[n[s]])}}return o}; +},{"./_getPrototype":27,"./_isHostObject":28,"./isObjectLike":29}],31:[function(require,module,exports){ +"use strict";function toObject(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function shouldUseNative(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var r={},t=0;t<10;t++)r["_"+String.fromCharCode(t)]=t;var n=Object.getOwnPropertyNames(r).map(function(e){return r[e]});if("0123456789"!==n.join(""))return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach(function(e){o[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(e){return!1}}var hasOwnProperty=Object.prototype.hasOwnProperty,propIsEnumerable=Object.prototype.propertyIsEnumerable;module.exports=shouldUseNative()?Object.assign:function(e,r){for(var t,n,o=toObject(e),a=1;a<arguments.length;a++){t=Object(arguments[a]);for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);if(Object.getOwnPropertySymbols){n=Object.getOwnPropertySymbols(t);for(var s=0;s<n.length;s++)propIsEnumerable.call(t,n[s])&&(o[n[s]]=t[n[s]])}}return o}; -},{}],33:[function(require,module,exports){ +},{}],32:[function(require,module,exports){ "use strict";var strictUriEncode=require("strict-uri-encode");exports.extract=function(r){return r.split("?")[1]||""},exports.parse=function(r){return"string"!=typeof r?{}:(r=r.trim().replace(/^(\?|#|&)/,""),r?r.split("&").reduce(function(r,t){var e=t.replace(/\+/g," ").split("="),n=e.shift(),i=e.length>0?e.join("="):void 0;return n=decodeURIComponent(n),i=void 0===i?null:decodeURIComponent(i),r.hasOwnProperty(n)?Array.isArray(r[n])?r[n].push(i):r[n]=[r[n],i]:r[n]=i,r},{}):{})},exports.stringify=function(r){return r?Object.keys(r).sort().map(function(t){var e=r[t];return void 0===e?"":null===e?t:Array.isArray(e)?e.slice().sort().map(function(r){return strictUriEncode(t)+"="+strictUriEncode(r)}).join("&"):strictUriEncode(t)+"="+strictUriEncode(e)}).filter(function(r){return r.length>0}).join("&"):""}; -},{"strict-uri-encode":243}],34:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function warnAboutReceivingStore(){didWarnAboutReceivingStore||(didWarnAboutReceivingStore=!0,(0,_warning2["default"])("<Provider> does not support changing `store` on the fly. It is most likely that you see this error because you updated to Redux 2.x and React Redux 2.x which no longer hot reload reducers automatically. See https://github.com/reactjs/react-redux/releases/tag/v2.0.0 for the migration instructions."))}exports.__esModule=!0,exports["default"]=void 0;var _react=require("react"),_storeShape=require("../utils/storeShape"),_storeShape2=_interopRequireDefault(_storeShape),_warning=require("../utils/warning"),_warning2=_interopRequireDefault(_warning),didWarnAboutReceivingStore=!1,Provider=function(e){function t(r,o){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,e.call(this,r,o));return n.store=r.store,n}return _inherits(t,e),t.prototype.getChildContext=function(){return{store:this.store}},t.prototype.render=function(){var e=this.props.children;return _react.Children.only(e)},t}(_react.Component);exports["default"]=Provider,Provider.propTypes={store:_storeShape2["default"].isRequired,children:_react.PropTypes.element.isRequired},Provider.childContextTypes={store:_storeShape2["default"].isRequired}; +},{"strict-uri-encode":240}],33:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function warnAboutReceivingStore(){didWarnAboutReceivingStore||(didWarnAboutReceivingStore=!0,(0,_warning2.default)("<Provider> does not support changing `store` on the fly. It is most likely that you see this error because you updated to Redux 2.x and React Redux 2.x which no longer hot reload reducers automatically. See https://github.com/reactjs/react-redux/releases/tag/v2.0.0 for the migration instructions."))}exports.__esModule=!0,exports.default=void 0;var _react=require("react"),_storeShape=require("../utils/storeShape"),_storeShape2=_interopRequireDefault(_storeShape),_warning=require("../utils/warning"),_warning2=_interopRequireDefault(_warning),didWarnAboutReceivingStore=!1,Provider=function(e){function t(r,o){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,e.call(this,r,o));return n.store=r.store,n}return _inherits(t,e),t.prototype.getChildContext=function(){return{store:this.store}},t.prototype.render=function(){var e=this.props.children;return _react.Children.only(e)},t}(_react.Component);exports.default=Provider,Provider.propTypes={store:_storeShape2.default.isRequired,children:_react.PropTypes.element.isRequired},Provider.childContextTypes={store:_storeShape2.default.isRequired}; -},{"../utils/storeShape":37,"../utils/warning":38,"react":"react"}],35:[function(require,module,exports){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function getDisplayName(t){return t.displayName||t.name||"Component"}function tryCatch(t,e){try{return t.apply(e)}catch(r){return errorObject.value=r,errorObject}}function connect(t,e,r){var o=arguments.length<=3||void 0===arguments[3]?{}:arguments[3],s=Boolean(t),a=t||defaultMapStateToProps,n=void 0;n="function"==typeof e?e:e?(0,_wrapActionCreators2["default"])(e):defaultMapDispatchToProps;var i=r||defaultMergeProps,p=o.pure,u=void 0===p||p,h=o.withRef,c=void 0!==h&&h,l=u&&i!==defaultMergeProps,d=nextVersion++;return function(t){function e(t,e,r){var o=i(t,e,r);return o}var r="Connect("+getDisplayName(t)+")",o=function(o){function i(t,e){_classCallCheck(this,i);var s=_possibleConstructorReturn(this,o.call(this,t,e));s.version=d,s.store=t.store||e.store,(0,_invariant2["default"])(s.store,'Could not find "store" in either the context or '+('props of "'+r+'". ')+"Either wrap the root component in a <Provider>, "+('or explicitly pass "store" as a prop to "'+r+'".'));var a=s.store.getState();return s.state={storeState:a},s.clearCache(),s}return _inherits(i,o),i.prototype.shouldComponentUpdate=function(){return!u||this.haveOwnPropsChanged||this.hasStoreStateChanged},i.prototype.computeStateProps=function(t,e){if(!this.finalMapStateToProps)return this.configureFinalMapState(t,e);var r=t.getState(),o=this.doStatePropsDependOnOwnProps?this.finalMapStateToProps(r,e):this.finalMapStateToProps(r);return o},i.prototype.configureFinalMapState=function(t,e){var r=a(t.getState(),e),o="function"==typeof r;return this.finalMapStateToProps=o?r:a,this.doStatePropsDependOnOwnProps=1!==this.finalMapStateToProps.length,o?this.computeStateProps(t,e):r},i.prototype.computeDispatchProps=function(t,e){if(!this.finalMapDispatchToProps)return this.configureFinalMapDispatch(t,e);var r=t.dispatch,o=this.doDispatchPropsDependOnOwnProps?this.finalMapDispatchToProps(r,e):this.finalMapDispatchToProps(r);return o},i.prototype.configureFinalMapDispatch=function(t,e){var r=n(t.dispatch,e),o="function"==typeof r;return this.finalMapDispatchToProps=o?r:n,this.doDispatchPropsDependOnOwnProps=1!==this.finalMapDispatchToProps.length,o?this.computeDispatchProps(t,e):r},i.prototype.updateStatePropsIfNeeded=function(){var t=this.computeStateProps(this.store,this.props);return(!this.stateProps||!(0,_shallowEqual2["default"])(t,this.stateProps))&&(this.stateProps=t,!0)},i.prototype.updateDispatchPropsIfNeeded=function(){var t=this.computeDispatchProps(this.store,this.props);return(!this.dispatchProps||!(0,_shallowEqual2["default"])(t,this.dispatchProps))&&(this.dispatchProps=t,!0)},i.prototype.updateMergedPropsIfNeeded=function(){var t=e(this.stateProps,this.dispatchProps,this.props);return!(this.mergedProps&&l&&(0,_shallowEqual2["default"])(t,this.mergedProps))&&(this.mergedProps=t,!0)},i.prototype.isSubscribed=function(){return"function"==typeof this.unsubscribe},i.prototype.trySubscribe=function(){s&&!this.unsubscribe&&(this.unsubscribe=this.store.subscribe(this.handleChange.bind(this)),this.handleChange())},i.prototype.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)},i.prototype.componentDidMount=function(){this.trySubscribe()},i.prototype.componentWillReceiveProps=function(t){u&&(0,_shallowEqual2["default"])(t,this.props)||(this.haveOwnPropsChanged=!0)},i.prototype.componentWillUnmount=function(){this.tryUnsubscribe(),this.clearCache()},i.prototype.clearCache=function(){this.dispatchProps=null,this.stateProps=null,this.mergedProps=null,this.haveOwnPropsChanged=!0,this.hasStoreStateChanged=!0,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,this.renderedElement=null,this.finalMapDispatchToProps=null,this.finalMapStateToProps=null},i.prototype.handleChange=function(){if(this.unsubscribe){var t=this.store.getState(),e=this.state.storeState;if(!u||e!==t){if(u&&!this.doStatePropsDependOnOwnProps){var r=tryCatch(this.updateStatePropsIfNeeded,this);if(!r)return;r===errorObject&&(this.statePropsPrecalculationError=errorObject.value),this.haveStatePropsBeenPrecalculated=!0}this.hasStoreStateChanged=!0,this.setState({storeState:t})}}},i.prototype.getWrappedInstance=function(){return(0,_invariant2["default"])(c,"To access the wrapped instance, you need to specify { withRef: true } as the fourth argument of the connect() call."),this.refs.wrappedInstance},i.prototype.render=function(){var e=this.haveOwnPropsChanged,r=this.hasStoreStateChanged,o=this.haveStatePropsBeenPrecalculated,s=this.statePropsPrecalculationError,a=this.renderedElement;if(this.haveOwnPropsChanged=!1,this.hasStoreStateChanged=!1,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,s)throw s;var n=!0,i=!0;u&&a&&(n=r||e&&this.doStatePropsDependOnOwnProps,i=e&&this.doDispatchPropsDependOnOwnProps);var p=!1,h=!1;o?p=!0:n&&(p=this.updateStatePropsIfNeeded()),i&&(h=this.updateDispatchPropsIfNeeded());var l=!0;return l=!!(p||h||e)&&this.updateMergedPropsIfNeeded(),!l&&a?a:(c?this.renderedElement=(0,_react.createElement)(t,_extends({},this.mergedProps,{ref:"wrappedInstance"})):this.renderedElement=(0,_react.createElement)(t,this.mergedProps),this.renderedElement)},i}(_react.Component);return o.displayName=r,o.WrappedComponent=t,o.contextTypes={store:_storeShape2["default"]},o.propTypes={store:_storeShape2["default"]},(0,_hoistNonReactStatics2["default"])(o,t)}}var _extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(t[o]=r[o])}return t};exports.__esModule=!0,exports["default"]=connect;var _react=require("react"),_storeShape=require("../utils/storeShape"),_storeShape2=_interopRequireDefault(_storeShape),_shallowEqual=require("../utils/shallowEqual"),_shallowEqual2=_interopRequireDefault(_shallowEqual),_wrapActionCreators=require("../utils/wrapActionCreators"),_wrapActionCreators2=_interopRequireDefault(_wrapActionCreators),_warning=require("../utils/warning"),_warning2=_interopRequireDefault(_warning),_isPlainObject=require("lodash/isPlainObject"),_isPlainObject2=_interopRequireDefault(_isPlainObject),_hoistNonReactStatics=require("hoist-non-react-statics"),_hoistNonReactStatics2=_interopRequireDefault(_hoistNonReactStatics),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),defaultMapStateToProps=function(t){return{}},defaultMapDispatchToProps=function(t){return{dispatch:t}},defaultMergeProps=function(t,e,r){return _extends({},r,t,e)},errorObject={value:null},nextVersion=0; +},{"../utils/storeShape":36,"../utils/warning":37,"react":"react"}],34:[function(require,module,exports){ +"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function getDisplayName(t){return t.displayName||t.name||"Component"}function tryCatch(t,e){try{return t.apply(e)}catch(t){return errorObject.value=t,errorObject}}function connect(t,e,r){var o=arguments.length<=3||void 0===arguments[3]?{}:arguments[3],s=Boolean(t),a=t||defaultMapStateToProps,n=void 0;n="function"==typeof e?e:e?(0,_wrapActionCreators2.default)(e):defaultMapDispatchToProps;var i=r||defaultMergeProps,p=o.pure,u=void 0===p||p,h=o.withRef,c=void 0!==h&&h,l=u&&i!==defaultMergeProps,d=nextVersion++;return function(t){function e(t,e,r){var o=i(t,e,r);return o}var r="Connect("+getDisplayName(t)+")",o=function(o){function i(t,e){_classCallCheck(this,i);var s=_possibleConstructorReturn(this,o.call(this,t,e));s.version=d,s.store=t.store||e.store,(0,_invariant2.default)(s.store,'Could not find "store" in either the context or '+('props of "'+r+'". ')+"Either wrap the root component in a <Provider>, "+('or explicitly pass "store" as a prop to "'+r+'".'));var a=s.store.getState();return s.state={storeState:a},s.clearCache(),s}return _inherits(i,o),i.prototype.shouldComponentUpdate=function(){return!u||this.haveOwnPropsChanged||this.hasStoreStateChanged},i.prototype.computeStateProps=function(t,e){if(!this.finalMapStateToProps)return this.configureFinalMapState(t,e);var r=t.getState(),o=this.doStatePropsDependOnOwnProps?this.finalMapStateToProps(r,e):this.finalMapStateToProps(r);return o},i.prototype.configureFinalMapState=function(t,e){var r=a(t.getState(),e),o="function"==typeof r;return this.finalMapStateToProps=o?r:a,this.doStatePropsDependOnOwnProps=1!==this.finalMapStateToProps.length,o?this.computeStateProps(t,e):r},i.prototype.computeDispatchProps=function(t,e){if(!this.finalMapDispatchToProps)return this.configureFinalMapDispatch(t,e);var r=t.dispatch,o=this.doDispatchPropsDependOnOwnProps?this.finalMapDispatchToProps(r,e):this.finalMapDispatchToProps(r);return o},i.prototype.configureFinalMapDispatch=function(t,e){var r=n(t.dispatch,e),o="function"==typeof r;return this.finalMapDispatchToProps=o?r:n,this.doDispatchPropsDependOnOwnProps=1!==this.finalMapDispatchToProps.length,o?this.computeDispatchProps(t,e):r},i.prototype.updateStatePropsIfNeeded=function(){var t=this.computeStateProps(this.store,this.props);return(!this.stateProps||!(0,_shallowEqual2.default)(t,this.stateProps))&&(this.stateProps=t,!0)},i.prototype.updateDispatchPropsIfNeeded=function(){var t=this.computeDispatchProps(this.store,this.props);return(!this.dispatchProps||!(0,_shallowEqual2.default)(t,this.dispatchProps))&&(this.dispatchProps=t,!0)},i.prototype.updateMergedPropsIfNeeded=function(){var t=e(this.stateProps,this.dispatchProps,this.props);return!(this.mergedProps&&l&&(0,_shallowEqual2.default)(t,this.mergedProps))&&(this.mergedProps=t,!0)},i.prototype.isSubscribed=function(){return"function"==typeof this.unsubscribe},i.prototype.trySubscribe=function(){s&&!this.unsubscribe&&(this.unsubscribe=this.store.subscribe(this.handleChange.bind(this)),this.handleChange())},i.prototype.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)},i.prototype.componentDidMount=function(){this.trySubscribe()},i.prototype.componentWillReceiveProps=function(t){u&&(0,_shallowEqual2.default)(t,this.props)||(this.haveOwnPropsChanged=!0)},i.prototype.componentWillUnmount=function(){this.tryUnsubscribe(),this.clearCache()},i.prototype.clearCache=function(){this.dispatchProps=null,this.stateProps=null,this.mergedProps=null,this.haveOwnPropsChanged=!0,this.hasStoreStateChanged=!0,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,this.renderedElement=null,this.finalMapDispatchToProps=null,this.finalMapStateToProps=null},i.prototype.handleChange=function(){if(this.unsubscribe){var t=this.store.getState(),e=this.state.storeState;if(!u||e!==t){if(u&&!this.doStatePropsDependOnOwnProps){var r=tryCatch(this.updateStatePropsIfNeeded,this);if(!r)return;r===errorObject&&(this.statePropsPrecalculationError=errorObject.value),this.haveStatePropsBeenPrecalculated=!0}this.hasStoreStateChanged=!0,this.setState({storeState:t})}}},i.prototype.getWrappedInstance=function(){return(0,_invariant2.default)(c,"To access the wrapped instance, you need to specify { withRef: true } as the fourth argument of the connect() call."),this.refs.wrappedInstance},i.prototype.render=function(){var e=this.haveOwnPropsChanged,r=this.hasStoreStateChanged,o=this.haveStatePropsBeenPrecalculated,s=this.statePropsPrecalculationError,a=this.renderedElement;if(this.haveOwnPropsChanged=!1,this.hasStoreStateChanged=!1,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,s)throw s;var n=!0,i=!0;u&&a&&(n=r||e&&this.doStatePropsDependOnOwnProps,i=e&&this.doDispatchPropsDependOnOwnProps);var p=!1,h=!1;o?p=!0:n&&(p=this.updateStatePropsIfNeeded()),i&&(h=this.updateDispatchPropsIfNeeded());var l=!0;return l=!!(p||h||e)&&this.updateMergedPropsIfNeeded(),!l&&a?a:(c?this.renderedElement=(0,_react.createElement)(t,_extends({},this.mergedProps,{ref:"wrappedInstance"})):this.renderedElement=(0,_react.createElement)(t,this.mergedProps),this.renderedElement)},i}(_react.Component);return o.displayName=r,o.WrappedComponent=t,o.contextTypes={store:_storeShape2.default},o.propTypes={store:_storeShape2.default},(0,_hoistNonReactStatics2.default)(o,t)}}var _extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(t[o]=r[o])}return t};exports.__esModule=!0,exports.default=connect;var _react=require("react"),_storeShape=require("../utils/storeShape"),_storeShape2=_interopRequireDefault(_storeShape),_shallowEqual=require("../utils/shallowEqual"),_shallowEqual2=_interopRequireDefault(_shallowEqual),_wrapActionCreators=require("../utils/wrapActionCreators"),_wrapActionCreators2=_interopRequireDefault(_wrapActionCreators),_warning=require("../utils/warning"),_warning2=_interopRequireDefault(_warning),_isPlainObject=require("lodash/isPlainObject"),_isPlainObject2=_interopRequireDefault(_isPlainObject),_hoistNonReactStatics=require("hoist-non-react-statics"),_hoistNonReactStatics2=_interopRequireDefault(_hoistNonReactStatics),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),defaultMapStateToProps=function(t){return{}},defaultMapDispatchToProps=function(t){return{dispatch:t}},defaultMergeProps=function(t,e,r){return _extends({},r,t,e)},errorObject={value:null},nextVersion=0; -},{"../utils/shallowEqual":36,"../utils/storeShape":37,"../utils/warning":38,"../utils/wrapActionCreators":39,"hoist-non-react-statics":22,"invariant":23,"lodash/isPlainObject":31,"react":"react"}],36:[function(require,module,exports){ -"use strict";function shallowEqual(e,t){if(e===t)return!0;var r=Object.keys(e),l=Object.keys(t);if(r.length!==l.length)return!1;for(var n=Object.prototype.hasOwnProperty,o=0;o<r.length;o++)if(!n.call(t,r[o])||e[r[o]]!==t[r[o]])return!1;return!0}exports.__esModule=!0,exports["default"]=shallowEqual; +},{"../utils/shallowEqual":35,"../utils/storeShape":36,"../utils/warning":37,"../utils/wrapActionCreators":38,"hoist-non-react-statics":22,"invariant":23,"lodash/isPlainObject":30,"react":"react"}],35:[function(require,module,exports){ +"use strict";function shallowEqual(e,t){if(e===t)return!0;var r=Object.keys(e),l=Object.keys(t);if(r.length!==l.length)return!1;for(var n=Object.prototype.hasOwnProperty,o=0;o<r.length;o++)if(!n.call(t,r[o])||e[r[o]]!==t[r[o]])return!1;return!0}exports.__esModule=!0,exports.default=shallowEqual; -},{}],37:[function(require,module,exports){ -"use strict";exports.__esModule=!0;var _react=require("react");exports["default"]=_react.PropTypes.shape({subscribe:_react.PropTypes.func.isRequired,dispatch:_react.PropTypes.func.isRequired,getState:_react.PropTypes.func.isRequired}); +},{}],36:[function(require,module,exports){ +"use strict";exports.__esModule=!0;var _react=require("react");exports.default=_react.PropTypes.shape({subscribe:_react.PropTypes.func.isRequired,dispatch:_react.PropTypes.func.isRequired,getState:_react.PropTypes.func.isRequired}); -},{"react":"react"}],38:[function(require,module,exports){ -"use strict";function warning(o){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(o);try{throw new Error(o)}catch(e){}}exports.__esModule=!0,exports["default"]=warning; +},{"react":"react"}],37:[function(require,module,exports){ +"use strict";function warning(o){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(o);try{throw new Error(o)}catch(o){}}exports.__esModule=!0,exports.default=warning; -},{}],39:[function(require,module,exports){ -"use strict";function wrapActionCreators(r){return function(e){return(0,_redux.bindActionCreators)(r,e)}}exports.__esModule=!0,exports["default"]=wrapActionCreators;var _redux=require("redux"); +},{}],38:[function(require,module,exports){ +"use strict";function wrapActionCreators(r){return function(e){return(0,_redux.bindActionCreators)(r,e)}}exports.__esModule=!0,exports.default=wrapActionCreators;var _redux=require("redux"); -},{"redux":"redux"}],40:[function(require,module,exports){ +},{"redux":"redux"}],39:[function(require,module,exports){ "use strict";function loopAsync(n,o,t){function c(){return l=!0,s?void(u=[].concat(Array.prototype.slice.call(arguments))):void t.apply(this,arguments)}function i(){if(!l&&(p=!0,!s)){for(s=!0;!l&&r<n&&p;)p=!1,o.call(this,r++,i,c);return s=!1,l?void t.apply(this,u):void(r>=n&&p&&(l=!0,t()))}}var r=0,l=!1,s=!1,p=!1,u=void 0;i()}function mapAsync(n,o,t){function c(n,o,c){l||(o?(l=!0,t(o)):(r[n]=c,l=++s===i,l&&t(null,r)))}var i=n.length,r=[];if(0===i)return t(null,r);var l=!1,s=0;n.forEach(function(n,t){o(n,t,function(n,o){c(t,n,o)})})}exports.__esModule=!0,exports.loopAsync=loopAsync,exports.mapAsync=mapAsync; -},{}],41:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_InternalPropTypes=require("./InternalPropTypes"),History={contextTypes:{history:_InternalPropTypes.history},componentWillMount:function(){this.history=this.context.history}};exports["default"]=History,module.exports=exports["default"]; +},{}],40:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_InternalPropTypes=require("./InternalPropTypes"),History={contextTypes:{history:_InternalPropTypes.history},componentWillMount:function(){this.history=this.context.history}};exports.default=History,module.exports=exports.default; -},{"./InternalPropTypes":45,"./routerWarning":73}],42:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_react=require("react"),_react2=_interopRequireDefault(_react),_Link=require("./Link"),_Link2=_interopRequireDefault(_Link),IndexLink=_react2["default"].createClass({displayName:"IndexLink",render:function(){return _react2["default"].createElement(_Link2["default"],_extends({},this.props,{onlyActiveOnIndex:!0}))}});exports["default"]=IndexLink,module.exports=exports["default"]; +},{"./InternalPropTypes":44,"./routerWarning":72}],41:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_react=require("react"),_react2=_interopRequireDefault(_react),_Link=require("./Link"),_Link2=_interopRequireDefault(_Link),IndexLink=_react2.default.createClass({displayName:"IndexLink",render:function(){return _react2.default.createElement(_Link2.default,_extends({},this.props,{onlyActiveOnIndex:!0}))}});exports.default=IndexLink,module.exports=exports.default; -},{"./Link":47,"react":"react"}],43:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_Redirect=require("./Redirect"),_Redirect2=_interopRequireDefault(_Redirect),_InternalPropTypes=require("./InternalPropTypes"),_React$PropTypes=_react2["default"].PropTypes,string=_React$PropTypes.string,object=_React$PropTypes.object,IndexRedirect=_react2["default"].createClass({displayName:"IndexRedirect",statics:{createRouteFromReactElement:function(e,r){r&&(r.indexRoute=_Redirect2["default"].createRouteFromReactElement(e))}},propTypes:{to:string.isRequired,query:object,state:object,onEnter:_InternalPropTypes.falsy,children:_InternalPropTypes.falsy},render:function(){(0,_invariant2["default"])(!1)}});exports["default"]=IndexRedirect,module.exports=exports["default"]; +},{"./Link":46,"react":"react"}],42:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_Redirect=require("./Redirect"),_Redirect2=_interopRequireDefault(_Redirect),_InternalPropTypes=require("./InternalPropTypes"),_React$PropTypes=_react2.default.PropTypes,string=_React$PropTypes.string,object=_React$PropTypes.object,IndexRedirect=_react2.default.createClass({displayName:"IndexRedirect",statics:{createRouteFromReactElement:function(e,r){r&&(r.indexRoute=_Redirect2.default.createRouteFromReactElement(e))}},propTypes:{to:string.isRequired,query:object,state:object,onEnter:_InternalPropTypes.falsy,children:_InternalPropTypes.falsy},render:function(){(0,_invariant2.default)(!1)}});exports.default=IndexRedirect,module.exports=exports.default; -},{"./InternalPropTypes":45,"./Redirect":50,"./routerWarning":73,"invariant":23,"react":"react"}],44:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_InternalPropTypes=require("./InternalPropTypes"),func=_react2["default"].PropTypes.func,IndexRoute=_react2["default"].createClass({displayName:"IndexRoute",statics:{createRouteFromReactElement:function(e,t){t&&(t.indexRoute=(0,_RouteUtils.createRouteFromReactElement)(e))}},propTypes:{path:_InternalPropTypes.falsy,component:_InternalPropTypes.component,components:_InternalPropTypes.components,getComponent:func,getComponents:func},render:function(){(0,_invariant2["default"])(!1)}});exports["default"]=IndexRoute,module.exports=exports["default"]; +},{"./InternalPropTypes":44,"./Redirect":49,"./routerWarning":72,"invariant":23,"react":"react"}],43:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_InternalPropTypes=require("./InternalPropTypes"),func=_react2.default.PropTypes.func,IndexRoute=_react2.default.createClass({displayName:"IndexRoute",statics:{createRouteFromReactElement:function(e,t){t&&(t.indexRoute=(0,_RouteUtils.createRouteFromReactElement)(e))}},propTypes:{path:_InternalPropTypes.falsy,component:_InternalPropTypes.component,components:_InternalPropTypes.components,getComponent:func,getComponents:func},render:function(){(0,_invariant2.default)(!1)}});exports.default=IndexRoute,module.exports=exports.default; -},{"./InternalPropTypes":45,"./RouteUtils":53,"./routerWarning":73,"invariant":23,"react":"react"}],45:[function(require,module,exports){ +},{"./InternalPropTypes":44,"./RouteUtils":52,"./routerWarning":72,"invariant":23,"react":"react"}],44:[function(require,module,exports){ "use strict";function falsy(e,r,o){if(e[r])return new Error("<"+o+'> should not have a "'+r+'" prop')}exports.__esModule=!0,exports.routes=exports.route=exports.components=exports.component=exports.history=void 0,exports.falsy=falsy;var _react=require("react"),func=_react.PropTypes.func,object=_react.PropTypes.object,arrayOf=_react.PropTypes.arrayOf,oneOfType=_react.PropTypes.oneOfType,element=_react.PropTypes.element,shape=_react.PropTypes.shape,string=_react.PropTypes.string,history=exports.history=shape({listen:func.isRequired,push:func.isRequired,replace:func.isRequired,go:func.isRequired,goBack:func.isRequired,goForward:func.isRequired}),component=exports.component=oneOfType([func,string]),components=exports.components=oneOfType([component,object]),route=exports.route=oneOfType([object,element]),routes=exports.routes=oneOfType([route,arrayOf(route)]); -},{"react":"react"}],46:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),object=_react2["default"].PropTypes.object,Lifecycle={contextTypes:{history:object.isRequired,route:object},propTypes:{route:object},componentDidMount:function(){this.routerWillLeave?void 0:(0,_invariant2["default"])(!1);var e=this.props.route||this.context.route;e?void 0:(0,_invariant2["default"])(!1),this._unlistenBeforeLeavingRoute=this.context.history.listenBeforeLeavingRoute(e,this.routerWillLeave)},componentWillUnmount:function(){this._unlistenBeforeLeavingRoute&&this._unlistenBeforeLeavingRoute()}};exports["default"]=Lifecycle,module.exports=exports["default"]; +},{"react":"react"}],45:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),object=_react2.default.PropTypes.object,Lifecycle={contextTypes:{history:object.isRequired,route:object},propTypes:{route:object},componentDidMount:function(){this.routerWillLeave?void 0:(0,_invariant2.default)(!1);var e=this.props.route||this.context.route;e?void 0:(0,_invariant2.default)(!1),this._unlistenBeforeLeavingRoute=this.context.history.listenBeforeLeavingRoute(e,this.routerWillLeave)},componentWillUnmount:function(){this._unlistenBeforeLeavingRoute&&this._unlistenBeforeLeavingRoute()}};exports.default=Lifecycle,module.exports=exports.default; -},{"./routerWarning":73,"invariant":23,"react":"react"}],47:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _objectWithoutProperties(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}function isLeftClickEvent(e){return 0===e.button}function isModifiedEvent(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function isEmptyObject(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function createLocationDescriptor(e,t){var r=t.query,a=t.hash,n=t.state;return r||a||n?{pathname:e,query:r,hash:a,state:n}:e}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},_react=require("react"),_react2=_interopRequireDefault(_react),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_PropTypes=require("./PropTypes"),_React$PropTypes=_react2["default"].PropTypes,bool=_React$PropTypes.bool,object=_React$PropTypes.object,string=_React$PropTypes.string,func=_React$PropTypes.func,oneOfType=_React$PropTypes.oneOfType,Link=_react2["default"].createClass({displayName:"Link",contextTypes:{router:_PropTypes.routerShape},propTypes:{to:oneOfType([string,object]).isRequired,query:object,hash:string,state:object,activeStyle:object,activeClassName:string,onlyActiveOnIndex:bool.isRequired,onClick:func,target:string},getDefaultProps:function(){return{onlyActiveOnIndex:!1,style:{}}},handleClick:function(e){this.context.router?void 0:(0,_invariant2["default"])(!1);var t=!0;if(this.props.onClick&&this.props.onClick(e),!isModifiedEvent(e)&&isLeftClickEvent(e)){if(e.defaultPrevented===!0&&(t=!1),this.props.target)return void(t||e.preventDefault());if(e.preventDefault(),t){var r=this.props,a=r.to,n=r.query,i=r.hash,o=r.state,s=createLocationDescriptor(a,{query:n,hash:i,state:o});this.context.router.push(s)}}},render:function(){var e=this.props,t=e.to,r=e.query,a=e.hash,n=e.state,i=e.activeClassName,o=e.activeStyle,s=e.onlyActiveOnIndex,c=_objectWithoutProperties(e,["to","query","hash","state","activeClassName","activeStyle","onlyActiveOnIndex"]),u=this.context.router;if(u){var p=createLocationDescriptor(t,{query:r,hash:a,state:n});c.href=u.createHref(p),(i||null!=o&&!isEmptyObject(o))&&u.isActive(p,s)&&(i&&(c.className?c.className+=" "+i:c.className=i),o&&(c.style=_extends({},c.style,o)))}return _react2["default"].createElement("a",_extends({},c,{onClick:this.handleClick}))}});exports["default"]=Link,module.exports=exports["default"]; +},{"./routerWarning":72,"invariant":23,"react":"react"}],46:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _objectWithoutProperties(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}function isLeftClickEvent(e){return 0===e.button}function isModifiedEvent(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function isEmptyObject(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function createLocationDescriptor(e,t){var r=t.query,a=t.hash,n=t.state;return r||a||n?{pathname:e,query:r,hash:a,state:n}:e}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},_react=require("react"),_react2=_interopRequireDefault(_react),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_PropTypes=require("./PropTypes"),_React$PropTypes=_react2.default.PropTypes,bool=_React$PropTypes.bool,object=_React$PropTypes.object,string=_React$PropTypes.string,func=_React$PropTypes.func,oneOfType=_React$PropTypes.oneOfType,Link=_react2.default.createClass({displayName:"Link",contextTypes:{router:_PropTypes.routerShape},propTypes:{to:oneOfType([string,object]).isRequired,query:object,hash:string,state:object,activeStyle:object,activeClassName:string,onlyActiveOnIndex:bool.isRequired,onClick:func,target:string},getDefaultProps:function(){return{onlyActiveOnIndex:!1,style:{}}},handleClick:function(e){this.context.router?void 0:(0,_invariant2.default)(!1);var t=!0;if(this.props.onClick&&this.props.onClick(e),!isModifiedEvent(e)&&isLeftClickEvent(e)){if(e.defaultPrevented===!0&&(t=!1),this.props.target)return void(t||e.preventDefault());if(e.preventDefault(),t){var r=this.props,a=r.to,n=r.query,i=r.hash,o=r.state,s=createLocationDescriptor(a,{query:n,hash:i,state:o});this.context.router.push(s)}}},render:function(){var e=this.props,t=e.to,r=e.query,a=e.hash,n=e.state,i=e.activeClassName,o=e.activeStyle,s=e.onlyActiveOnIndex,c=_objectWithoutProperties(e,["to","query","hash","state","activeClassName","activeStyle","onlyActiveOnIndex"]),u=this.context.router;if(u){var p=createLocationDescriptor(t,{query:r,hash:a,state:n});c.href=u.createHref(p),(i||null!=o&&!isEmptyObject(o))&&u.isActive(p,s)&&(i&&(c.className?c.className+=" "+i:c.className=i),o&&(c.style=_extends({},c.style,o)))}return _react2.default.createElement("a",_extends({},c,{onClick:this.handleClick}))}});exports.default=Link,module.exports=exports.default; -},{"./PropTypes":49,"./routerWarning":73,"invariant":23,"react":"react"}],48:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function escapeRegExp(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _compilePattern(e){for(var t="",a=[],r=[],n=void 0,i=0,l=/:([a-zA-Z_$][a-zA-Z0-9_$]*)|\*\*|\*|\(|\)/g;n=l.exec(e);)n.index!==i&&(r.push(e.slice(i,n.index)),t+=escapeRegExp(e.slice(i,n.index))),n[1]?(t+="([^/]+)",a.push(n[1])):"**"===n[0]?(t+="(.*)",a.push("splat")):"*"===n[0]?(t+="(.*?)",a.push("splat")):"("===n[0]?t+="(?:":")"===n[0]&&(t+=")?"),r.push(n[0]),i=l.lastIndex;return i!==e.length&&(r.push(e.slice(i,e.length)),t+=escapeRegExp(e.slice(i,e.length))),{pattern:e,regexpSource:t,paramNames:a,tokens:r}}function compilePattern(e){return e in CompiledPatternsCache||(CompiledPatternsCache[e]=_compilePattern(e)),CompiledPatternsCache[e]}function matchPattern(e,t){"/"!==e.charAt(0)&&(e="/"+e);var a=compilePattern(e),r=a.regexpSource,n=a.paramNames,i=a.tokens;"/"!==e.charAt(e.length-1)&&(r+="/?"),"*"===i[i.length-1]&&(r+="$");var l=t.match(new RegExp("^"+r,"i"));if(null==l)return null;var o=l[0],s=t.substr(o.length);if(s){if("/"!==o.charAt(o.length-1))return null;s="/"+s}return{remainingPathname:s,paramNames:n,paramValues:l.slice(1).map(function(e){return e&&decodeURIComponent(e)})}}function getParamNames(e){return compilePattern(e).paramNames}function getParams(e,t){var a=matchPattern(e,t);if(!a)return null;var r=a.paramNames,n=a.paramValues,i={};return r.forEach(function(e,t){i[e]=n[t]}),i}function formatPattern(e,t){t=t||{};for(var a=compilePattern(e),r=a.tokens,n=0,i="",l=0,o=void 0,s=void 0,p=void 0,u=0,c=r.length;u<c;++u)o=r[u],"*"===o||"**"===o?(p=Array.isArray(t.splat)?t.splat[l++]:t.splat,null!=p||n>0?void 0:(0,_invariant2["default"])(!1),null!=p&&(i+=encodeURI(p))):"("===o?n+=1:")"===o?n-=1:":"===o.charAt(0)?(s=o.substring(1),p=t[s],null!=p||n>0?void 0:(0,_invariant2["default"])(!1),null!=p&&(i+=encodeURIComponent(p))):i+=o;return i.replace(/\/+/g,"/")}exports.__esModule=!0,exports.compilePattern=compilePattern,exports.matchPattern=matchPattern,exports.getParamNames=getParamNames,exports.getParams=getParams,exports.formatPattern=formatPattern;var _invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),CompiledPatternsCache={}; +},{"./PropTypes":48,"./routerWarning":72,"invariant":23,"react":"react"}],47:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function escapeRegExp(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _compilePattern(e){for(var t="",a=[],r=[],n=void 0,i=0,l=/:([a-zA-Z_$][a-zA-Z0-9_$]*)|\*\*|\*|\(|\)/g;n=l.exec(e);)n.index!==i&&(r.push(e.slice(i,n.index)),t+=escapeRegExp(e.slice(i,n.index))),n[1]?(t+="([^/]+)",a.push(n[1])):"**"===n[0]?(t+="(.*)",a.push("splat")):"*"===n[0]?(t+="(.*?)",a.push("splat")):"("===n[0]?t+="(?:":")"===n[0]&&(t+=")?"),r.push(n[0]),i=l.lastIndex;return i!==e.length&&(r.push(e.slice(i,e.length)),t+=escapeRegExp(e.slice(i,e.length))),{pattern:e,regexpSource:t,paramNames:a,tokens:r}}function compilePattern(e){return e in CompiledPatternsCache||(CompiledPatternsCache[e]=_compilePattern(e)),CompiledPatternsCache[e]}function matchPattern(e,t){"/"!==e.charAt(0)&&(e="/"+e);var a=compilePattern(e),r=a.regexpSource,n=a.paramNames,i=a.tokens;"/"!==e.charAt(e.length-1)&&(r+="/?"),"*"===i[i.length-1]&&(r+="$");var l=t.match(new RegExp("^"+r,"i"));if(null==l)return null;var o=l[0],s=t.substr(o.length);if(s){if("/"!==o.charAt(o.length-1))return null;s="/"+s}return{remainingPathname:s,paramNames:n,paramValues:l.slice(1).map(function(e){return e&&decodeURIComponent(e)})}}function getParamNames(e){return compilePattern(e).paramNames}function getParams(e,t){var a=matchPattern(e,t);if(!a)return null;var r=a.paramNames,n=a.paramValues,i={};return r.forEach(function(e,t){i[e]=n[t]}),i}function formatPattern(e,t){t=t||{};for(var a=compilePattern(e),r=a.tokens,n=0,i="",l=0,o=void 0,s=void 0,p=void 0,u=0,c=r.length;u<c;++u)o=r[u],"*"===o||"**"===o?(p=Array.isArray(t.splat)?t.splat[l++]:t.splat,null!=p||n>0?void 0:(0,_invariant2.default)(!1),null!=p&&(i+=encodeURI(p))):"("===o?n+=1:")"===o?n-=1:":"===o.charAt(0)?(s=o.substring(1),p=t[s],null!=p||n>0?void 0:(0,_invariant2.default)(!1),null!=p&&(i+=encodeURIComponent(p))):i+=o;return i.replace(/\/+/g,"/")}exports.__esModule=!0,exports.compilePattern=compilePattern,exports.matchPattern=matchPattern,exports.getParamNames=getParamNames,exports.getParams=getParams,exports.formatPattern=formatPattern;var _invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),CompiledPatternsCache={}; -},{"invariant":23}],49:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r["default"]=e,r}function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0,exports.router=exports.routes=exports.route=exports.components=exports.component=exports.location=exports.history=exports.falsy=exports.locationShape=exports.routerShape=void 0;var _react=require("react"),_deprecateObjectProperties=require("./deprecateObjectProperties"),_deprecateObjectProperties2=_interopRequireDefault(_deprecateObjectProperties),_InternalPropTypes=require("./InternalPropTypes"),InternalPropTypes=_interopRequireWildcard(_InternalPropTypes),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),func=_react.PropTypes.func,object=_react.PropTypes.object,shape=_react.PropTypes.shape,string=_react.PropTypes.string,routerShape=exports.routerShape=shape({push:func.isRequired,replace:func.isRequired,go:func.isRequired,goBack:func.isRequired,goForward:func.isRequired,setRouteLeaveHook:func.isRequired,isActive:func.isRequired}),locationShape=exports.locationShape=shape({pathname:string.isRequired,search:string.isRequired,state:object,action:string.isRequired,key:string}),falsy=exports.falsy=InternalPropTypes.falsy,history=exports.history=InternalPropTypes.history,location=exports.location=locationShape,component=exports.component=InternalPropTypes.component,components=exports.components=InternalPropTypes.components,route=exports.route=InternalPropTypes.route,routes=exports.routes=InternalPropTypes.routes,router=exports.router=routerShape,defaultExport={falsy:falsy,history:history,location:location,component:component,components:components,route:route,router:router};exports["default"]=defaultExport; +},{"invariant":23}],48:[function(require,module,exports){ +"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r.default=e,r}function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0,exports.router=exports.routes=exports.route=exports.components=exports.component=exports.location=exports.history=exports.falsy=exports.locationShape=exports.routerShape=void 0;var _react=require("react"),_deprecateObjectProperties=require("./deprecateObjectProperties"),_deprecateObjectProperties2=_interopRequireDefault(_deprecateObjectProperties),_InternalPropTypes=require("./InternalPropTypes"),InternalPropTypes=_interopRequireWildcard(_InternalPropTypes),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),func=_react.PropTypes.func,object=_react.PropTypes.object,shape=_react.PropTypes.shape,string=_react.PropTypes.string,routerShape=exports.routerShape=shape({push:func.isRequired,replace:func.isRequired,go:func.isRequired,goBack:func.isRequired,goForward:func.isRequired,setRouteLeaveHook:func.isRequired,isActive:func.isRequired}),locationShape=exports.locationShape=shape({pathname:string.isRequired,search:string.isRequired,state:object,action:string.isRequired,key:string}),falsy=exports.falsy=InternalPropTypes.falsy,history=exports.history=InternalPropTypes.history,location=exports.location=locationShape,component=exports.component=InternalPropTypes.component,components=exports.components=InternalPropTypes.components,route=exports.route=InternalPropTypes.route,routes=exports.routes=InternalPropTypes.routes,router=exports.router=routerShape,defaultExport={falsy:falsy,history:history,location:location,component:component,components:components,route:route,router:router};exports.default=defaultExport; -},{"./InternalPropTypes":45,"./deprecateObjectProperties":65,"./routerWarning":73,"react":"react"}],50:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_PatternUtils=require("./PatternUtils"),_InternalPropTypes=require("./InternalPropTypes"),_React$PropTypes=_react2["default"].PropTypes,string=_React$PropTypes.string,object=_React$PropTypes.object,Redirect=_react2["default"].createClass({displayName:"Redirect",statics:{createRouteFromReactElement:function(e){var t=(0,_RouteUtils.createRouteFromReactElement)(e);return t.from&&(t.path=t.from),t.onEnter=function(e,r){var a=e.location,n=e.params,i=void 0;if("/"===t.to.charAt(0))i=(0,_PatternUtils.formatPattern)(t.to,n);else if(t.to){var o=e.routes.indexOf(t),s=Redirect.getRoutePattern(e.routes,o-1),u=s.replace(/\/*$/,"/")+t.to;i=(0,_PatternUtils.formatPattern)(u,n)}else i=a.pathname;r({pathname:i,query:t.query||a.query,state:t.state||a.state})},t},getRoutePattern:function(e,t){for(var r="",a=t;a>=0;a--){var n=e[a],i=n.path||"";if(r=i.replace(/\/*$/,"/")+r,0===i.indexOf("/"))break}return"/"+r}},propTypes:{path:string,from:string,to:string.isRequired,query:object,state:object,onEnter:_InternalPropTypes.falsy,children:_InternalPropTypes.falsy},render:function(){(0,_invariant2["default"])(!1)}});exports["default"]=Redirect,module.exports=exports["default"]; +},{"./InternalPropTypes":44,"./deprecateObjectProperties":64,"./routerWarning":72,"react":"react"}],49:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_PatternUtils=require("./PatternUtils"),_InternalPropTypes=require("./InternalPropTypes"),_React$PropTypes=_react2.default.PropTypes,string=_React$PropTypes.string,object=_React$PropTypes.object,Redirect=_react2.default.createClass({displayName:"Redirect",statics:{createRouteFromReactElement:function(e){var t=(0,_RouteUtils.createRouteFromReactElement)(e);return t.from&&(t.path=t.from),t.onEnter=function(e,r){var a=e.location,n=e.params,i=void 0;if("/"===t.to.charAt(0))i=(0,_PatternUtils.formatPattern)(t.to,n);else if(t.to){var o=e.routes.indexOf(t),s=Redirect.getRoutePattern(e.routes,o-1),u=s.replace(/\/*$/,"/")+t.to;i=(0,_PatternUtils.formatPattern)(u,n)}else i=a.pathname;r({pathname:i,query:t.query||a.query,state:t.state||a.state})},t},getRoutePattern:function(e,t){for(var r="",a=t;a>=0;a--){var n=e[a],i=n.path||"";if(r=i.replace(/\/*$/,"/")+r,0===i.indexOf("/"))break}return"/"+r}},propTypes:{path:string,from:string,to:string.isRequired,query:object,state:object,onEnter:_InternalPropTypes.falsy,children:_InternalPropTypes.falsy},render:function(){(0,_invariant2.default)(!1)}});exports.default=Redirect,module.exports=exports.default; -},{"./InternalPropTypes":45,"./PatternUtils":48,"./RouteUtils":53,"invariant":23,"react":"react"}],51:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_InternalPropTypes=require("./InternalPropTypes"),_React$PropTypes=_react2["default"].PropTypes,string=_React$PropTypes.string,func=_React$PropTypes.func,Route=_react2["default"].createClass({displayName:"Route",statics:{createRouteFromReactElement:_RouteUtils.createRouteFromReactElement},propTypes:{path:string,component:_InternalPropTypes.component,components:_InternalPropTypes.components,getComponent:func,getComponents:func},render:function(){(0,_invariant2["default"])(!1)}});exports["default"]=Route,module.exports=exports["default"]; +},{"./InternalPropTypes":44,"./PatternUtils":47,"./RouteUtils":52,"invariant":23,"react":"react"}],50:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_InternalPropTypes=require("./InternalPropTypes"),_React$PropTypes=_react2.default.PropTypes,string=_React$PropTypes.string,func=_React$PropTypes.func,Route=_react2.default.createClass({displayName:"Route",statics:{createRouteFromReactElement:_RouteUtils.createRouteFromReactElement},propTypes:{path:string,component:_InternalPropTypes.component,components:_InternalPropTypes.components,getComponent:func,getComponents:func},render:function(){(0,_invariant2.default)(!1)}});exports.default=Route,module.exports=exports.default; -},{"./InternalPropTypes":45,"./RouteUtils":53,"invariant":23,"react":"react"}],52:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_react=require("react"),_react2=_interopRequireDefault(_react),object=_react2["default"].PropTypes.object,RouteContext={propTypes:{route:object.isRequired},childContextTypes:{route:object.isRequired},getChildContext:function(){return{route:this.props.route}},componentWillMount:function(){}};exports["default"]=RouteContext,module.exports=exports["default"]; +},{"./InternalPropTypes":44,"./RouteUtils":52,"invariant":23,"react":"react"}],51:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_react=require("react"),_react2=_interopRequireDefault(_react),object=_react2.default.PropTypes.object,RouteContext={propTypes:{route:object.isRequired},childContextTypes:{route:object.isRequired},getChildContext:function(){return{route:this.props.route}},componentWillMount:function(){}};exports.default=RouteContext,module.exports=exports.default; -},{"./routerWarning":73,"react":"react"}],53:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function isValidChild(e){return null==e||_react2["default"].isValidElement(e)}function isReactChildren(e){return isValidChild(e)||Array.isArray(e)&&e.every(isValidChild)}function checkPropTypes(e,r,t){e=e||"UnknownComponent";for(var a in r)if(Object.prototype.hasOwnProperty.call(r,a)){var n=r[a](t,a,e);n instanceof Error}}function createRoute(e,r){return _extends({},e,r)}function createRouteFromReactElement(e){var r=e.type,t=createRoute(r.defaultProps,e.props);if(r.propTypes&&checkPropTypes(r.displayName||r.name,r.propTypes,t),t.children){var a=createRoutesFromReactChildren(t.children,t);a.length&&(t.childRoutes=a),delete t.children}return t}function createRoutesFromReactChildren(e,r){var t=[];return _react2["default"].Children.forEach(e,function(e){if(_react2["default"].isValidElement(e))if(e.type.createRouteFromReactElement){var a=e.type.createRouteFromReactElement(e,r);a&&t.push(a)}else t.push(createRouteFromReactElement(e))}),t}function createRoutes(e){return isReactChildren(e)?e=createRoutesFromReactChildren(e):e&&!Array.isArray(e)&&(e=[e]),e}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a])}return e};exports.isReactChildren=isReactChildren,exports.createRouteFromReactElement=createRouteFromReactElement,exports.createRoutesFromReactChildren=createRoutesFromReactChildren,exports.createRoutes=createRoutes;var _react=require("react"),_react2=_interopRequireDefault(_react),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning); +},{"./routerWarning":72,"react":"react"}],52:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function isValidChild(e){return null==e||_react2.default.isValidElement(e)}function isReactChildren(e){return isValidChild(e)||Array.isArray(e)&&e.every(isValidChild)}function createRoute(e,t){return _extends({},e,t)}function createRouteFromReactElement(e){var t=e.type,r=createRoute(t.defaultProps,e.props);if(r.children){var a=createRoutesFromReactChildren(r.children,r);a.length&&(r.childRoutes=a),delete r.children}return r}function createRoutesFromReactChildren(e,t){var r=[];return _react2.default.Children.forEach(e,function(e){if(_react2.default.isValidElement(e))if(e.type.createRouteFromReactElement){var a=e.type.createRouteFromReactElement(e,t);a&&r.push(a)}else r.push(createRouteFromReactElement(e))}),r}function createRoutes(e){return isReactChildren(e)?e=createRoutesFromReactChildren(e):e&&!Array.isArray(e)&&(e=[e]),e}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};exports.isReactChildren=isReactChildren,exports.createRouteFromReactElement=createRouteFromReactElement,exports.createRoutesFromReactChildren=createRoutesFromReactChildren,exports.createRoutes=createRoutes;var _react=require("react"),_react2=_interopRequireDefault(_react); -},{"./routerWarning":73,"react":"react"}],54:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _objectWithoutProperties(e,r){var t={};for(var n in e)r.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t}function isDeprecatedHistory(e){return!e||!e.__v2_compatible__}function isUnsupportedHistory(e){return e&&e.getCurrentLocation}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},_createHashHistory=require("history/lib/createHashHistory"),_createHashHistory2=_interopRequireDefault(_createHashHistory),_useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_react=require("react"),_react2=_interopRequireDefault(_react),_createTransitionManager=require("./createTransitionManager"),_createTransitionManager2=_interopRequireDefault(_createTransitionManager),_InternalPropTypes=require("./InternalPropTypes"),_RouterContext=require("./RouterContext"),_RouterContext2=_interopRequireDefault(_RouterContext),_RouteUtils=require("./RouteUtils"),_RouterUtils=require("./RouterUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_React$PropTypes=_react2["default"].PropTypes,func=_React$PropTypes.func,object=_React$PropTypes.object,Router=_react2["default"].createClass({displayName:"Router",propTypes:{history:object,children:_InternalPropTypes.routes,routes:_InternalPropTypes.routes,render:func,createElement:func,onError:func,onUpdate:func,matchContext:object},getDefaultProps:function(){return{render:function(e){return _react2["default"].createElement(_RouterContext2["default"],e)}}},getInitialState:function(){return{location:null,routes:null,params:null,components:null}},handleError:function(e){if(!this.props.onError)throw e;this.props.onError.call(this,e)},componentWillMount:function(){var e=this,r=this.props,t=(r.parseQueryString,r.stringifyQuery,this.createRouterObjects()),n=t.history,o=t.transitionManager,i=t.router;this._unlisten=o.listen(function(r,t){r?e.handleError(r):e.setState(t,e.props.onUpdate)}),this.history=n,this.router=i},createRouterObjects:function(){var e=this.props.matchContext;if(e)return e;var r=this.props.history,t=this.props,n=t.routes,o=t.children;isUnsupportedHistory(r)?(0,_invariant2["default"])(!1):void 0,isDeprecatedHistory(r)&&(r=this.wrapDeprecatedHistory(r));var i=(0,_createTransitionManager2["default"])(r,(0,_RouteUtils.createRoutes)(n||o)),u=(0,_RouterUtils.createRouterObject)(r,i),a=(0,_RouterUtils.createRoutingHistory)(r,i);return{history:a,transitionManager:i,router:u}},wrapDeprecatedHistory:function(e){var r=this.props,t=r.parseQueryString,n=r.stringifyQuery,o=void 0;return o=e?function(){return e}:_createHashHistory2["default"],(0,_useQueries2["default"])(o)({parseQueryString:t,stringifyQuery:n})},componentWillReceiveProps:function(e){},componentWillUnmount:function(){this._unlisten&&this._unlisten()},render:function e(){var r=this.state,t=r.location,n=r.routes,o=r.params,i=r.components,u=this.props,a=u.createElement,e=u.render,s=_objectWithoutProperties(u,["createElement","render"]);return null==t?null:(Object.keys(Router.propTypes).forEach(function(e){return delete s[e]}),e(_extends({},s,{history:this.history,router:this.router,location:t,routes:n,params:o,components:i,createElement:a})))}});exports["default"]=Router,module.exports=exports["default"]; +},{"react":"react"}],53:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _objectWithoutProperties(e,r){var t={};for(var n in e)r.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t}function isDeprecatedHistory(e){return!e||!e.__v2_compatible__}function isUnsupportedHistory(e){return e&&e.getCurrentLocation}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},_createHashHistory=require("history/lib/createHashHistory"),_createHashHistory2=_interopRequireDefault(_createHashHistory),_useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_react=require("react"),_react2=_interopRequireDefault(_react),_createTransitionManager=require("./createTransitionManager"),_createTransitionManager2=_interopRequireDefault(_createTransitionManager),_InternalPropTypes=require("./InternalPropTypes"),_RouterContext=require("./RouterContext"),_RouterContext2=_interopRequireDefault(_RouterContext),_RouteUtils=require("./RouteUtils"),_RouterUtils=require("./RouterUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_React$PropTypes=_react2.default.PropTypes,func=_React$PropTypes.func,object=_React$PropTypes.object,Router=_react2.default.createClass({displayName:"Router",propTypes:{history:object,children:_InternalPropTypes.routes,routes:_InternalPropTypes.routes,render:func,createElement:func,onError:func,onUpdate:func,matchContext:object},getDefaultProps:function(){return{render:function(e){return _react2.default.createElement(_RouterContext2.default,e)}}},getInitialState:function(){return{location:null,routes:null,params:null,components:null}},handleError:function(e){if(!this.props.onError)throw e;this.props.onError.call(this,e)},componentWillMount:function(){var e=this,r=this.props,t=(r.parseQueryString,r.stringifyQuery,this.createRouterObjects()),n=t.history,o=t.transitionManager,i=t.router;this._unlisten=o.listen(function(r,t){r?e.handleError(r):e.setState(t,e.props.onUpdate)}),this.history=n,this.router=i},createRouterObjects:function(){var e=this.props.matchContext;if(e)return e;var r=this.props.history,t=this.props,n=t.routes,o=t.children;isUnsupportedHistory(r)?(0,_invariant2.default)(!1):void 0,isDeprecatedHistory(r)&&(r=this.wrapDeprecatedHistory(r));var i=(0,_createTransitionManager2.default)(r,(0,_RouteUtils.createRoutes)(n||o)),u=(0,_RouterUtils.createRouterObject)(r,i),a=(0,_RouterUtils.createRoutingHistory)(r,i);return{history:a,transitionManager:i,router:u}},wrapDeprecatedHistory:function(e){var r=this.props,t=r.parseQueryString,n=r.stringifyQuery,o=void 0;return o=e?function(){return e}:_createHashHistory2.default,(0,_useQueries2.default)(o)({parseQueryString:t,stringifyQuery:n})},componentWillReceiveProps:function(e){},componentWillUnmount:function(){this._unlisten&&this._unlisten()},render:function e(){var r=this.state,t=r.location,n=r.routes,o=r.params,i=r.components,u=this.props,a=u.createElement,e=u.render,s=_objectWithoutProperties(u,["createElement","render"]);return null==t?null:(Object.keys(Router.propTypes).forEach(function(e){return delete s[e]}),e(_extends({},s,{history:this.history,router:this.router,location:t,routes:n,params:o,components:i,createElement:a})))}});exports.default=Router,module.exports=exports.default; -},{"./InternalPropTypes":45,"./RouteUtils":53,"./RouterContext":55,"./RouterUtils":56,"./createTransitionManager":64,"./routerWarning":73,"history/lib/createHashHistory":14,"history/lib/useQueries":21,"invariant":23,"react":"react"}],55:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_react=require("react"),_react2=_interopRequireDefault(_react),_deprecateObjectProperties=require("./deprecateObjectProperties"),_deprecateObjectProperties2=_interopRequireDefault(_deprecateObjectProperties),_getRouteParams=require("./getRouteParams"),_getRouteParams2=_interopRequireDefault(_getRouteParams),_RouteUtils=require("./RouteUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_React$PropTypes=_react2["default"].PropTypes,array=_React$PropTypes.array,func=_React$PropTypes.func,object=_React$PropTypes.object,RouterContext=_react2["default"].createClass({displayName:"RouterContext",propTypes:{history:object,router:object.isRequired,location:object.isRequired,routes:array.isRequired,params:object.isRequired,components:array.isRequired,createElement:func.isRequired},getDefaultProps:function(){return{createElement:_react2["default"].createElement}},childContextTypes:{history:object,location:object.isRequired,router:object.isRequired},getChildContext:function(){var e=this.props,t=e.router,r=e.history,o=e.location;return t||(t=_extends({},r,{setRouteLeaveHook:r.listenBeforeLeavingRoute}),delete t.listenBeforeLeavingRoute),{history:r,location:o,router:t}},createElement:function(e,t){return null==e?null:this.props.createElement(e,t)},render:function(){var e=this,t=this.props,r=t.history,o=t.location,a=t.routes,n=t.params,i=t.components,u=null;return i&&(u=i.reduceRight(function(t,i,u){if(null==i)return t;var s=a[u],c=(0,_getRouteParams2["default"])(s,n),l={history:r,location:o,params:n,route:s,routeParams:c,routes:a};if((0,_RouteUtils.isReactChildren)(t))l.children=t;else if(t)for(var p in t)Object.prototype.hasOwnProperty.call(t,p)&&(l[p]=t[p]);if("object"===("undefined"==typeof i?"undefined":_typeof(i))){var f={};for(var _ in i)Object.prototype.hasOwnProperty.call(i,_)&&(f[_]=e.createElement(i[_],_extends({key:_},l)));return f}return e.createElement(i,l)},u)),null===u||u===!1||_react2["default"].isValidElement(u)?void 0:(0,_invariant2["default"])(!1),u}});exports["default"]=RouterContext,module.exports=exports["default"]; +},{"./InternalPropTypes":44,"./RouteUtils":52,"./RouterContext":54,"./RouterUtils":55,"./createTransitionManager":63,"./routerWarning":72,"history/lib/createHashHistory":14,"history/lib/useQueries":21,"invariant":23,"react":"react"}],54:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_react=require("react"),_react2=_interopRequireDefault(_react),_deprecateObjectProperties=require("./deprecateObjectProperties"),_deprecateObjectProperties2=_interopRequireDefault(_deprecateObjectProperties),_getRouteParams=require("./getRouteParams"),_getRouteParams2=_interopRequireDefault(_getRouteParams),_RouteUtils=require("./RouteUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_React$PropTypes=_react2.default.PropTypes,array=_React$PropTypes.array,func=_React$PropTypes.func,object=_React$PropTypes.object,RouterContext=_react2.default.createClass({displayName:"RouterContext",propTypes:{history:object,router:object.isRequired,location:object.isRequired,routes:array.isRequired,params:object.isRequired,components:array.isRequired,createElement:func.isRequired},getDefaultProps:function(){return{createElement:_react2.default.createElement}},childContextTypes:{history:object,location:object.isRequired,router:object.isRequired},getChildContext:function(){var e=this.props,t=e.router,r=e.history,o=e.location;return t||(t=_extends({},r,{setRouteLeaveHook:r.listenBeforeLeavingRoute}),delete t.listenBeforeLeavingRoute),{history:r,location:o,router:t}},createElement:function(e,t){return null==e?null:this.props.createElement(e,t)},render:function(){var e=this,t=this.props,r=t.history,o=t.location,a=t.routes,n=t.params,i=t.components,u=null;return i&&(u=i.reduceRight(function(t,i,u){if(null==i)return t;var s=a[u],c=(0,_getRouteParams2.default)(s,n),l={history:r,location:o,params:n,route:s,routeParams:c,routes:a};if((0,_RouteUtils.isReactChildren)(t))l.children=t;else if(t)for(var p in t)Object.prototype.hasOwnProperty.call(t,p)&&(l[p]=t[p]);if("object"===("undefined"==typeof i?"undefined":_typeof(i))){var f={};for(var _ in i)Object.prototype.hasOwnProperty.call(i,_)&&(f[_]=e.createElement(i[_],_extends({key:_},l)));return f}return e.createElement(i,l)},u)),null===u||u===!1||_react2.default.isValidElement(u)?void 0:(0,_invariant2.default)(!1),u}});exports.default=RouterContext,module.exports=exports.default; -},{"./RouteUtils":53,"./deprecateObjectProperties":65,"./getRouteParams":67,"./routerWarning":73,"invariant":23,"react":"react"}],56:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createRouterObject(e,t){return _extends({},e,{setRouteLeaveHook:t.listenBeforeLeavingRoute,isActive:t.isActive})}function createRoutingHistory(e,t){return e=_extends({},e,t)}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};exports.createRouterObject=createRouterObject,exports.createRoutingHistory=createRoutingHistory;var _deprecateObjectProperties=require("./deprecateObjectProperties"),_deprecateObjectProperties2=_interopRequireDefault(_deprecateObjectProperties); +},{"./RouteUtils":52,"./deprecateObjectProperties":64,"./getRouteParams":66,"./routerWarning":72,"invariant":23,"react":"react"}],55:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function createRouterObject(e,t){return _extends({},e,{setRouteLeaveHook:t.listenBeforeLeavingRoute,isActive:t.isActive})}function createRoutingHistory(e,t){return e=_extends({},e,t)}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};exports.createRouterObject=createRouterObject,exports.createRoutingHistory=createRoutingHistory;var _deprecateObjectProperties=require("./deprecateObjectProperties"),_deprecateObjectProperties2=_interopRequireDefault(_deprecateObjectProperties); -},{"./deprecateObjectProperties":65}],57:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_RouterContext=require("./RouterContext"),_RouterContext2=_interopRequireDefault(_RouterContext),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),RoutingContext=_react2["default"].createClass({displayName:"RoutingContext",componentWillMount:function(){},render:function(){return _react2["default"].createElement(_RouterContext2["default"],this.props)}});exports["default"]=RoutingContext,module.exports=exports["default"]; +},{"./deprecateObjectProperties":64}],56:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_RouterContext=require("./RouterContext"),_RouterContext2=_interopRequireDefault(_RouterContext),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),RoutingContext=_react2.default.createClass({displayName:"RoutingContext",componentWillMount:function(){},render:function(){return _react2.default.createElement(_RouterContext2.default,this.props)}});exports.default=RoutingContext,module.exports=exports.default; -},{"./RouterContext":55,"./routerWarning":73,"react":"react"}],58:[function(require,module,exports){ -"use strict";function _interopRequireDefault(n){return n&&n.__esModule?n:{"default":n}}function createTransitionHook(n,r,o){return function(){for(var e=arguments.length,t=Array(e),u=0;u<e;u++)t[u]=arguments[u];if(n.apply(r,t),n.length<o){var i=t[t.length-1];i()}}}function getEnterHooks(n){return n.reduce(function(n,r){return r.onEnter&&n.push(createTransitionHook(r.onEnter,r,3)),n},[])}function getChangeHooks(n){return n.reduce(function(n,r){return r.onChange&&n.push(createTransitionHook(r.onChange,r,4)),n},[])}function runTransitionHooks(n,r,o){function e(n,r,o){return r?void(t={pathname:r,query:o,state:n}):void(t=n)}if(!n)return void o();var t=void 0;(0,_AsyncUtils.loopAsync)(n,function(n,o,u){r(n,e,function(n){n||t?u(n,t):o()})},o)}function runEnterHooks(n,r,o){var e=getEnterHooks(n);return runTransitionHooks(e.length,function(n,o,t){e[n](r,o,t)},o)}function runChangeHooks(n,r,o,e){var t=getChangeHooks(n);return runTransitionHooks(t.length,function(n,e,u){t[n](r,o,e,u)},e)}function runLeaveHooks(n){for(var r=0,o=n.length;r<o;++r)n[r].onLeave&&n[r].onLeave.call(n[r])}exports.__esModule=!0,exports.runEnterHooks=runEnterHooks,exports.runChangeHooks=runChangeHooks,exports.runLeaveHooks=runLeaveHooks;var _AsyncUtils=require("./AsyncUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning); +},{"./RouterContext":54,"./routerWarning":72,"react":"react"}],57:[function(require,module,exports){ +"use strict";function _interopRequireDefault(n){return n&&n.__esModule?n:{default:n}}function createTransitionHook(n,r,o){return function(){for(var e=arguments.length,t=Array(e),u=0;u<e;u++)t[u]=arguments[u];if(n.apply(r,t),n.length<o){var i=t[t.length-1];i()}}}function getEnterHooks(n){return n.reduce(function(n,r){return r.onEnter&&n.push(createTransitionHook(r.onEnter,r,3)),n},[])}function getChangeHooks(n){return n.reduce(function(n,r){return r.onChange&&n.push(createTransitionHook(r.onChange,r,4)),n},[])}function runTransitionHooks(n,r,o){function e(n,r,o){return r?void(t={pathname:r,query:o,state:n}):void(t=n)}if(!n)return void o();var t=void 0;(0,_AsyncUtils.loopAsync)(n,function(n,o,u){r(n,e,function(n){n||t?u(n,t):o()})},o)}function runEnterHooks(n,r,o){var e=getEnterHooks(n);return runTransitionHooks(e.length,function(n,o,t){e[n](r,o,t)},o)}function runChangeHooks(n,r,o,e){var t=getChangeHooks(n);return runTransitionHooks(t.length,function(n,e,u){t[n](r,o,e,u)},e)}function runLeaveHooks(n){for(var r=0,o=n.length;r<o;++r)n[r].onLeave&&n[r].onLeave.call(n[r])}exports.__esModule=!0,exports.runEnterHooks=runEnterHooks,exports.runChangeHooks=runChangeHooks,exports.runLeaveHooks=runLeaveHooks;var _AsyncUtils=require("./AsyncUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning); -},{"./AsyncUtils":40,"./routerWarning":73}],59:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_react=require("react"),_react2=_interopRequireDefault(_react),_RouterContext=require("./RouterContext"),_RouterContext2=_interopRequireDefault(_RouterContext);exports["default"]=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];var n=t.map(function(e){return e.renderRouterContext}).filter(function(e){return e}),u=t.map(function(e){return e.renderRouteComponent}).filter(function(e){return e}),o=function(){var e=arguments.length<=0||void 0===arguments[0]?_react.createElement:arguments[0];return function(t,r){return u.reduceRight(function(e,t){return t(e,r)},e(t,r))}};return function(e){return n.reduceRight(function(t,r){return r(t,e)},_react2["default"].createElement(_RouterContext2["default"],_extends({},e,{createElement:o(e.createElement)})))}},module.exports=exports["default"]; +},{"./AsyncUtils":39,"./routerWarning":72}],58:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},_react=require("react"),_react2=_interopRequireDefault(_react),_RouterContext=require("./RouterContext"),_RouterContext2=_interopRequireDefault(_RouterContext);exports.default=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];var n=t.map(function(e){return e.renderRouterContext}).filter(function(e){return e}),u=t.map(function(e){return e.renderRouteComponent}).filter(function(e){return e}),o=function(){var e=arguments.length<=0||void 0===arguments[0]?_react.createElement:arguments[0];return function(t,r){return u.reduceRight(function(e,t){return t(e,r)},e(t,r))}};return function(e){return n.reduceRight(function(t,r){return r(t,e)},_react2.default.createElement(_RouterContext2.default,_extends({},e,{createElement:o(e.createElement)})))}},module.exports=exports.default; -},{"./RouterContext":55,"react":"react"}],60:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _createBrowserHistory=require("history/lib/createBrowserHistory"),_createBrowserHistory2=_interopRequireDefault(_createBrowserHistory),_createRouterHistory=require("./createRouterHistory"),_createRouterHistory2=_interopRequireDefault(_createRouterHistory);exports["default"]=(0,_createRouterHistory2["default"])(_createBrowserHistory2["default"]),module.exports=exports["default"]; +},{"./RouterContext":54,"react":"react"}],59:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _createBrowserHistory=require("history/lib/createBrowserHistory"),_createBrowserHistory2=_interopRequireDefault(_createBrowserHistory),_createRouterHistory=require("./createRouterHistory"),_createRouterHistory2=_interopRequireDefault(_createRouterHistory);exports.default=(0,_createRouterHistory2.default)(_createBrowserHistory2.default),module.exports=exports.default; -},{"./createRouterHistory":63,"history/lib/createBrowserHistory":12}],61:[function(require,module,exports){ -"use strict";function routeParamsChanged(e,t,r){if(!e.path)return!1;var a=(0,_PatternUtils.getParamNames)(e.path);return a.some(function(e){return t.params[e]!==r.params[e]})}function computeChangedRoutes(e,t){var r=e&&e.routes,a=t.routes,u=void 0,n=void 0,o=void 0;return r?!function(){var s=!1;u=r.filter(function(r){if(s)return!0;var u=a.indexOf(r)===-1||routeParamsChanged(r,e,t);return u&&(s=!0),u}),u.reverse(),o=[],n=[],a.forEach(function(e){var t=r.indexOf(e)===-1,a=u.indexOf(e)!==-1;t||a?o.push(e):n.push(e)})}():(u=[],n=[],o=a),{leaveRoutes:u,changeRoutes:n,enterRoutes:o}}exports.__esModule=!0;var _PatternUtils=require("./PatternUtils");exports["default"]=computeChangedRoutes,module.exports=exports["default"]; +},{"./createRouterHistory":62,"history/lib/createBrowserHistory":12}],60:[function(require,module,exports){ +"use strict";function routeParamsChanged(e,t,r){if(!e.path)return!1;var a=(0,_PatternUtils.getParamNames)(e.path);return a.some(function(e){return t.params[e]!==r.params[e]})}function computeChangedRoutes(e,t){var r=e&&e.routes,a=t.routes,u=void 0,n=void 0,o=void 0;return r?!function(){var s=!1;u=r.filter(function(r){if(s)return!0;var u=a.indexOf(r)===-1||routeParamsChanged(r,e,t);return u&&(s=!0),u}),u.reverse(),o=[],n=[],a.forEach(function(e){var t=r.indexOf(e)===-1,a=u.indexOf(e)!==-1;t||a?o.push(e):n.push(e)})}():(u=[],n=[],o=a),{leaveRoutes:u,changeRoutes:n,enterRoutes:o}}exports.__esModule=!0;var _PatternUtils=require("./PatternUtils");exports.default=computeChangedRoutes,module.exports=exports.default; -},{"./PatternUtils":48}],62:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createMemoryHistory(e){var r=(0,_createMemoryHistory2["default"])(e),t=function(){return r},u=(0,_useQueries2["default"])((0,_useBasename2["default"])(t))(e);return u.__v2_compatible__=!0,u}exports.__esModule=!0,exports["default"]=createMemoryHistory;var _useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_useBasename=require("history/lib/useBasename"),_useBasename2=_interopRequireDefault(_useBasename),_createMemoryHistory=require("history/lib/createMemoryHistory"),_createMemoryHistory2=_interopRequireDefault(_createMemoryHistory);module.exports=exports["default"]; +},{"./PatternUtils":47}],61:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function createMemoryHistory(e){var r=(0,_createMemoryHistory2.default)(e),t=function(){return r},u=(0,_useQueries2.default)((0,_useBasename2.default)(t))(e);return u.__v2_compatible__=!0,u}exports.__esModule=!0,exports.default=createMemoryHistory;var _useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_useBasename=require("history/lib/useBasename"),_useBasename2=_interopRequireDefault(_useBasename),_createMemoryHistory=require("history/lib/createMemoryHistory"),_createMemoryHistory2=_interopRequireDefault(_createMemoryHistory);module.exports=exports.default; -},{"history/lib/createMemoryHistory":17,"history/lib/useBasename":20,"history/lib/useQueries":21}],63:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0,exports["default"]=function(e){var t=void 0;return canUseDOM&&(t=(0,_useRouterHistory2["default"])(e)()),t};var _useRouterHistory=require("./useRouterHistory"),_useRouterHistory2=_interopRequireDefault(_useRouterHistory),canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement);module.exports=exports["default"]; +},{"history/lib/createMemoryHistory":17,"history/lib/useBasename":20,"history/lib/useQueries":21}],62:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0,exports.default=function(e){var t=void 0;return canUseDOM&&(t=(0,_useRouterHistory2.default)(e)()),t};var _useRouterHistory=require("./useRouterHistory"),_useRouterHistory2=_interopRequireDefault(_useRouterHistory),canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement);module.exports=exports.default; -},{"./useRouterHistory":74}],64:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function hasAnyProperties(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!0;return!1}function createTransitionManager(e,t){function n(t){var n=!(arguments.length<=1||void 0===arguments[1])&&arguments[1],o=arguments.length<=2||void 0===arguments[2]?null:arguments[2],r=void 0;return n&&n!==!0||null!==o?(t={pathname:t,query:n},r=o||!1):(t=e.createLocation(t),r=n),(0,_isActive3["default"])(t,r,d.location,d.routes,d.params)}function o(t){return e.createLocation(t,_Actions.REPLACE)}function r(e,n){v&&v.location===e?i(v,n):(0,_matchRoutes2["default"])(t,e,function(t,o){t?n(t):o?i(_extends({},o,{location:e}),n):n()})}function i(e,t){function n(n,o){return n||o?r(n,o):void(0,_getComponents2["default"])(e,function(n,o){n?t(n):t(null,null,d=_extends({},e,{components:o}))})}function r(e,n){e?t(e):t(null,o(n))}var i=(0,_computeChangedRoutes3["default"])(d,e),u=i.leaveRoutes,a=i.changeRoutes,s=i.enterRoutes;(0,_TransitionUtils.runLeaveHooks)(u),u.filter(function(e){return s.indexOf(e)===-1}).forEach(c),(0,_TransitionUtils.runChangeHooks)(a,d,e,function(t,o){return t||o?r(t,o):void(0,_TransitionUtils.runEnterHooks)(s,e,n)})}function u(e){var t=arguments.length<=1||void 0===arguments[1]||arguments[1];return e.__id__||t&&(e.__id__=p++)}function a(e){return e.reduce(function(e,t){return e.push.apply(e,h[u(t)]),e},[])}function s(e,n){(0,_matchRoutes2["default"])(t,e,function(t,o){if(null==o)return void n();v=_extends({},o,{location:e});for(var r=a((0,_computeChangedRoutes3["default"])(d,v).leaveRoutes),i=void 0,u=0,s=r.length;null==i&&u<s;++u)i=r[u](e);n(i)})}function l(){if(d.routes){for(var e=a(d.routes),t=void 0,n=0,o=e.length;"string"!=typeof t&&n<o;++n)t=e[n]();return t}}function c(e){var t=u(e,!1);t&&(delete h[t],hasAnyProperties(h)||(g&&(g(),g=null),R&&(R(),R=null)))}function f(t,n){var o=u(t),r=h[o];if(r)r.indexOf(n)===-1&&r.push(n);else{var i=!hasAnyProperties(h);h[o]=[n],i&&(g=e.listenBefore(s),e.listenBeforeUnload&&(R=e.listenBeforeUnload(l)))}return function(){var e=h[o];if(e){var r=e.filter(function(e){return e!==n});0===r.length?c(t):h[o]=r}}}function _(t){return e.listen(function(n){d.location===n?t(null,d):r(n,function(n,o,r){n?t(n):o?e.transitionTo(o):r&&t(null,r)})})}var d={},v=void 0,p=1,h=Object.create(null),g=void 0,R=void 0;return{isActive:n,match:r,listenBeforeLeavingRoute:f,listen:_}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e};exports["default"]=createTransitionManager;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_Actions=require("history/lib/Actions"),_computeChangedRoutes2=require("./computeChangedRoutes"),_computeChangedRoutes3=_interopRequireDefault(_computeChangedRoutes2),_TransitionUtils=require("./TransitionUtils"),_isActive2=require("./isActive"),_isActive3=_interopRequireDefault(_isActive2),_getComponents=require("./getComponents"),_getComponents2=_interopRequireDefault(_getComponents),_matchRoutes=require("./matchRoutes"),_matchRoutes2=_interopRequireDefault(_matchRoutes);module.exports=exports["default"]; +},{"./useRouterHistory":73}],63:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function hasAnyProperties(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!0;return!1}function createTransitionManager(e,t){function n(t){var n=!(arguments.length<=1||void 0===arguments[1])&&arguments[1],o=arguments.length<=2||void 0===arguments[2]?null:arguments[2],r=void 0;return n&&n!==!0||null!==o?(t={pathname:t,query:n},r=o||!1):(t=e.createLocation(t),r=n),(0,_isActive3.default)(t,r,d.location,d.routes,d.params)}function o(t){return e.createLocation(t,_Actions.REPLACE)}function r(e,n){v&&v.location===e?i(v,n):(0,_matchRoutes2.default)(t,e,function(t,o){t?n(t):o?i(_extends({},o,{location:e}),n):n()})}function i(e,t){function n(n,o){return n||o?r(n,o):void(0,_getComponents2.default)(e,function(n,o){n?t(n):t(null,null,d=_extends({},e,{components:o}))})}function r(e,n){e?t(e):t(null,o(n))}var i=(0,_computeChangedRoutes3.default)(d,e),u=i.leaveRoutes,a=i.changeRoutes,s=i.enterRoutes;(0,_TransitionUtils.runLeaveHooks)(u),u.filter(function(e){return s.indexOf(e)===-1}).forEach(c),(0,_TransitionUtils.runChangeHooks)(a,d,e,function(t,o){return t||o?r(t,o):void(0,_TransitionUtils.runEnterHooks)(s,e,n)})}function u(e){var t=arguments.length<=1||void 0===arguments[1]||arguments[1];return e.__id__||t&&(e.__id__=p++)}function a(e){return e.reduce(function(e,t){return e.push.apply(e,h[u(t)]),e},[])}function s(e,n){(0,_matchRoutes2.default)(t,e,function(t,o){if(null==o)return void n();v=_extends({},o,{location:e});for(var r=a((0,_computeChangedRoutes3.default)(d,v).leaveRoutes),i=void 0,u=0,s=r.length;null==i&&u<s;++u)i=r[u](e);n(i)})}function l(){if(d.routes){for(var e=a(d.routes),t=void 0,n=0,o=e.length;"string"!=typeof t&&n<o;++n)t=e[n]();return t}}function c(e){var t=u(e,!1);t&&(delete h[t],hasAnyProperties(h)||(g&&(g(),g=null),R&&(R(),R=null)))}function f(t,n){var o=u(t),r=h[o];if(r)r.indexOf(n)===-1&&r.push(n);else{var i=!hasAnyProperties(h);h[o]=[n],i&&(g=e.listenBefore(s),e.listenBeforeUnload&&(R=e.listenBeforeUnload(l)))}return function(){var e=h[o];if(e){var r=e.filter(function(e){return e!==n});0===r.length?c(t):h[o]=r}}}function _(t){return e.listen(function(n){d.location===n?t(null,d):r(n,function(n,o,r){n?t(n):o?e.transitionTo(o):r&&t(null,r)})})}var d={},v=void 0,p=1,h=Object.create(null),g=void 0,R=void 0;return{isActive:n,match:r,listenBeforeLeavingRoute:f,listen:_}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e};exports.default=createTransitionManager;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_Actions=require("history/lib/Actions"),_computeChangedRoutes2=require("./computeChangedRoutes"),_computeChangedRoutes3=_interopRequireDefault(_computeChangedRoutes2),_TransitionUtils=require("./TransitionUtils"),_isActive2=require("./isActive"),_isActive3=_interopRequireDefault(_isActive2),_getComponents=require("./getComponents"),_getComponents2=_interopRequireDefault(_getComponents),_matchRoutes=require("./matchRoutes"),_matchRoutes2=_interopRequireDefault(_matchRoutes);module.exports=exports.default; -},{"./TransitionUtils":58,"./computeChangedRoutes":61,"./getComponents":66,"./isActive":69,"./matchRoutes":72,"./routerWarning":73,"history/lib/Actions":6}],65:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0,exports.canUseMembrane=void 0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),canUseMembrane=exports.canUseMembrane=!1,deprecateObjectProperties=function(e){return e};exports["default"]=deprecateObjectProperties; +},{"./TransitionUtils":57,"./computeChangedRoutes":60,"./getComponents":65,"./isActive":68,"./matchRoutes":71,"./routerWarning":72,"history/lib/Actions":6}],64:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0,exports.canUseMembrane=void 0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),canUseMembrane=exports.canUseMembrane=!1,deprecateObjectProperties=function(e){return e};exports.default=deprecateObjectProperties; -},{"./routerWarning":73}],66:[function(require,module,exports){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function getComponentsForRoute(t,e,o){if(e.component||e.components)return void o(null,e.component||e.components);var n=e.getComponent||e.getComponents;if(!n)return void o();var i=t.location,a=(0,_makeStateWithLocation2["default"])(t,i);n.call(e,a,o)}function getComponents(t,e){(0,_AsyncUtils.mapAsync)(t.routes,function(e,o,n){getComponentsForRoute(t,e,n)},e)}exports.__esModule=!0;var _AsyncUtils=require("./AsyncUtils"),_makeStateWithLocation=require("./makeStateWithLocation"),_makeStateWithLocation2=_interopRequireDefault(_makeStateWithLocation);exports["default"]=getComponents,module.exports=exports["default"]; +},{"./routerWarning":72}],65:[function(require,module,exports){ +"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function getComponentsForRoute(t,e,o){if(e.component||e.components)return void o(null,e.component||e.components);var n=e.getComponent||e.getComponents;if(!n)return void o();var i=t.location,a=(0,_makeStateWithLocation2.default)(t,i);n.call(e,a,o)}function getComponents(t,e){(0,_AsyncUtils.mapAsync)(t.routes,function(e,o,n){getComponentsForRoute(t,e,n)},e)}exports.__esModule=!0;var _AsyncUtils=require("./AsyncUtils"),_makeStateWithLocation=require("./makeStateWithLocation"),_makeStateWithLocation2=_interopRequireDefault(_makeStateWithLocation);exports.default=getComponents,module.exports=exports.default; -},{"./AsyncUtils":40,"./makeStateWithLocation":70}],67:[function(require,module,exports){ -"use strict";function getRouteParams(t,e){var r={};return t.path?((0,_PatternUtils.getParamNames)(t.path).forEach(function(t){Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t])}),r):r}exports.__esModule=!0;var _PatternUtils=require("./PatternUtils");exports["default"]=getRouteParams,module.exports=exports["default"]; +},{"./AsyncUtils":39,"./makeStateWithLocation":69}],66:[function(require,module,exports){ +"use strict";function getRouteParams(t,e){var r={};return t.path?((0,_PatternUtils.getParamNames)(t.path).forEach(function(t){Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t])}),r):r}exports.__esModule=!0;var _PatternUtils=require("./PatternUtils");exports.default=getRouteParams,module.exports=exports.default; -},{"./PatternUtils":48}],68:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _createHashHistory=require("history/lib/createHashHistory"),_createHashHistory2=_interopRequireDefault(_createHashHistory),_createRouterHistory=require("./createRouterHistory"),_createRouterHistory2=_interopRequireDefault(_createRouterHistory);exports["default"]=(0,_createRouterHistory2["default"])(_createHashHistory2["default"]),module.exports=exports["default"]; +},{"./PatternUtils":47}],67:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _createHashHistory=require("history/lib/createHashHistory"),_createHashHistory2=_interopRequireDefault(_createHashHistory),_createRouterHistory=require("./createRouterHistory"),_createRouterHistory2=_interopRequireDefault(_createRouterHistory);exports.default=(0,_createRouterHistory2.default)(_createHashHistory2.default),module.exports=exports.default; -},{"./createRouterHistory":63,"history/lib/createHashHistory":14}],69:[function(require,module,exports){ -"use strict";function deepEqual(t,e){if(t==e)return!0;if(null==t||null==e)return!1;if(Array.isArray(t))return Array.isArray(e)&&t.length===e.length&&t.every(function(t,r){return deepEqual(t,e[r])});if("object"===("undefined"==typeof t?"undefined":_typeof(t))){for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r))if(void 0===t[r]){if(void 0!==e[r])return!1}else{if(!Object.prototype.hasOwnProperty.call(e,r))return!1;if(!deepEqual(t[r],e[r]))return!1}return!0}return String(t)===String(e)}function pathIsActive(t,e){return"/"!==e.charAt(0)&&(e="/"+e),"/"!==t.charAt(t.length-1)&&(t+="/"),"/"!==e.charAt(e.length-1)&&(e+="/"),e===t}function routeIsActive(t,e,r){for(var n=t,u=[],i=[],a=0,o=e.length;a<o;++a){var l=e[a],c=l.path||"";if("/"===c.charAt(0)&&(n=t,u=[],i=[]),null!==n&&c){var f=(0,_PatternUtils.matchPattern)(c,n);if(f?(n=f.remainingPathname,u=[].concat(u,f.paramNames),i=[].concat(i,f.paramValues)):n=null,""===n)return u.every(function(t,e){return String(i[e])===String(r[t])})}}return!1}function queryIsActive(t,e){return null==e?null==t:null==t||deepEqual(t,e)}function isActive(t,e,r,n,u){var i=t.pathname,a=t.query;return null!=r&&("/"!==i.charAt(0)&&(i="/"+i),!!(pathIsActive(i,r.pathname)||!e&&routeIsActive(i,n,u))&&queryIsActive(a,r.query))}exports.__esModule=!0;var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};exports["default"]=isActive;var _PatternUtils=require("./PatternUtils");module.exports=exports["default"]; +},{"./createRouterHistory":62,"history/lib/createHashHistory":14}],68:[function(require,module,exports){ +"use strict";function deepEqual(t,e){if(t==e)return!0;if(null==t||null==e)return!1;if(Array.isArray(t))return Array.isArray(e)&&t.length===e.length&&t.every(function(t,r){return deepEqual(t,e[r])});if("object"===("undefined"==typeof t?"undefined":_typeof(t))){for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r))if(void 0===t[r]){if(void 0!==e[r])return!1}else{if(!Object.prototype.hasOwnProperty.call(e,r))return!1;if(!deepEqual(t[r],e[r]))return!1}return!0}return String(t)===String(e)}function pathIsActive(t,e){return"/"!==e.charAt(0)&&(e="/"+e),"/"!==t.charAt(t.length-1)&&(t+="/"),"/"!==e.charAt(e.length-1)&&(e+="/"),e===t}function routeIsActive(t,e,r){for(var n=t,u=[],i=[],a=0,o=e.length;a<o;++a){var l=e[a],c=l.path||"";if("/"===c.charAt(0)&&(n=t,u=[],i=[]),null!==n&&c){var f=(0,_PatternUtils.matchPattern)(c,n);if(f?(n=f.remainingPathname,u=[].concat(u,f.paramNames),i=[].concat(i,f.paramValues)):n=null,""===n)return u.every(function(t,e){return String(i[e])===String(r[t])})}}return!1}function queryIsActive(t,e){return null==e?null==t:null==t||deepEqual(t,e)}function isActive(t,e,r,n,u){var i=t.pathname,a=t.query;return null!=r&&("/"!==i.charAt(0)&&(i="/"+i),!!(pathIsActive(i,r.pathname)||!e&&routeIsActive(i,n,u))&&queryIsActive(a,r.query))}exports.__esModule=!0;var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};exports.default=isActive;var _PatternUtils=require("./PatternUtils");module.exports=exports.default; -},{"./PatternUtils":48}],70:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function makeStateWithLocation(e,r){return _extends({},e,r)}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e};exports["default"]=makeStateWithLocation;var _deprecateObjectProperties=require("./deprecateObjectProperties"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning);module.exports=exports["default"]; +},{"./PatternUtils":47}],69:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function makeStateWithLocation(e,r){return _extends({},e,r)}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e};exports.default=makeStateWithLocation;var _deprecateObjectProperties=require("./deprecateObjectProperties"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning);module.exports=exports.default; -},{"./deprecateObjectProperties":65,"./routerWarning":73}],71:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _objectWithoutProperties(e,t){var r={};for(var o in e)t.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r}function match(e,t){var r=e.history,o=e.routes,i=e.location,a=_objectWithoutProperties(e,["history","routes","location"]);r||i?void 0:(0,_invariant2["default"])(!1),r=r?r:(0,_createMemoryHistory2["default"])(a);var n=(0,_createTransitionManager2["default"])(r,(0,_RouteUtils.createRoutes)(o)),u=void 0;i?i=r.createLocation(i):u=r.listen(function(e){i=e});var s=(0,_RouterUtils.createRouterObject)(r,n);r=(0,_RouterUtils.createRoutingHistory)(r,n),n.match(i,function(e,o,i){t(e,o,i&&_extends({},i,{history:r,router:s,matchContext:{history:r,transitionManager:n,router:s}})),u&&u()})}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_createMemoryHistory=require("./createMemoryHistory"),_createMemoryHistory2=_interopRequireDefault(_createMemoryHistory),_createTransitionManager=require("./createTransitionManager"),_createTransitionManager2=_interopRequireDefault(_createTransitionManager),_RouteUtils=require("./RouteUtils"),_RouterUtils=require("./RouterUtils");exports["default"]=match,module.exports=exports["default"]; +},{"./deprecateObjectProperties":64,"./routerWarning":72}],70:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _objectWithoutProperties(e,t){var r={};for(var o in e)t.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r}function match(e,t){var r=e.history,o=e.routes,i=e.location,a=_objectWithoutProperties(e,["history","routes","location"]);r||i?void 0:(0,_invariant2.default)(!1),r=r?r:(0,_createMemoryHistory2.default)(a);var n=(0,_createTransitionManager2.default)(r,(0,_RouteUtils.createRoutes)(o)),u=void 0;i?i=r.createLocation(i):u=r.listen(function(e){i=e});var s=(0,_RouterUtils.createRouterObject)(r,n);r=(0,_RouterUtils.createRoutingHistory)(r,n),n.match(i,function(e,o,i){t(e,o,i&&_extends({},i,{history:r,router:s,matchContext:{history:r,transitionManager:n,router:s}})),u&&u()})}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_createMemoryHistory=require("./createMemoryHistory"),_createMemoryHistory2=_interopRequireDefault(_createMemoryHistory),_createTransitionManager=require("./createTransitionManager"),_createTransitionManager2=_interopRequireDefault(_createTransitionManager),_RouteUtils=require("./RouteUtils"),_RouterUtils=require("./RouterUtils");exports.default=match,module.exports=exports.default; -},{"./RouteUtils":53,"./RouterUtils":56,"./createMemoryHistory":62,"./createTransitionManager":64,"invariant":23}],72:[function(require,module,exports){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function getChildRoutes(t,e,n,r,o){if(t.childRoutes)return[null,t.childRoutes];if(!t.getChildRoutes)return[];var a=!0,i=void 0,u={location:e,params:createParams(n,r)},s=(0,_makeStateWithLocation2["default"])(u,e);return t.getChildRoutes(s,function(t,e){return e=!t&&(0,_RouteUtils.createRoutes)(e),a?void(i=[t,e]):void o(t,e)}),a=!1,i}function getIndexRoute(t,e,n,r,o){if(t.indexRoute)o(null,t.indexRoute);else if(t.getIndexRoute){var a={location:e,params:createParams(n,r)},i=(0,_makeStateWithLocation2["default"])(a,e);t.getIndexRoute(i,function(t,e){o(t,!t&&(0,_RouteUtils.createRoutes)(e)[0])})}else t.childRoutes?!function(){var a=t.childRoutes.filter(function(t){return!t.path});(0,_AsyncUtils.loopAsync)(a.length,function(t,o,i){getIndexRoute(a[t],e,n,r,function(e,n){if(e||n){var r=[a[t]].concat(Array.isArray(n)?n:[n]);i(e,r)}else o()})},function(t,e){o(null,e)})}():o()}function assignParams(t,e,n){return e.reduce(function(t,e,r){var o=n&&n[r];return Array.isArray(t[e])?t[e].push(o):e in t?t[e]=[t[e],o]:t[e]=o,t},t)}function createParams(t,e){return assignParams({},t,e)}function matchRouteDeep(t,e,n,r,o,a){var i=t.path||"";if("/"===i.charAt(0)&&(n=e.pathname,r=[],o=[]),null!==n&&i){try{var u=(0,_PatternUtils.matchPattern)(i,n);u?(n=u.remainingPathname,r=[].concat(r,u.paramNames),o=[].concat(o,u.paramValues)):n=null}catch(s){a(s)}if(""===n){var c=function(){var n={routes:[t],params:createParams(r,o)};return getIndexRoute(t,e,r,o,function(t,e){if(t)a(t);else{if(Array.isArray(e)){var r;(r=n.routes).push.apply(r,e)}else e&&n.routes.push(e);a(null,n)}}),{v:void 0}}();if("object"===("undefined"==typeof c?"undefined":_typeof(c)))return c.v}}if(null!=n||t.childRoutes){var l=function(i,u){i?a(i):u?matchRoutes(u,e,function(e,n){e?a(e):n?(n.routes.unshift(t),a(null,n)):a()},n,r,o):a()},f=getChildRoutes(t,e,r,o,l);f&&l.apply(void 0,f)}else a()}function matchRoutes(t,e,n,r){var o=arguments.length<=4||void 0===arguments[4]?[]:arguments[4],a=arguments.length<=5||void 0===arguments[5]?[]:arguments[5];void 0===r&&("/"!==e.pathname.charAt(0)&&(e=_extends({},e,{pathname:"/"+e.pathname})),r=e.pathname),(0,_AsyncUtils.loopAsync)(t.length,function(n,i,u){matchRouteDeep(t[n],e,r,o,a,function(t,e){t||e?u(t,e):i()})},n)}exports.__esModule=!0;var _extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};exports["default"]=matchRoutes;var _AsyncUtils=require("./AsyncUtils"),_makeStateWithLocation=require("./makeStateWithLocation"),_makeStateWithLocation2=_interopRequireDefault(_makeStateWithLocation),_PatternUtils=require("./PatternUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_RouteUtils=require("./RouteUtils");module.exports=exports["default"]; +},{"./RouteUtils":52,"./RouterUtils":55,"./createMemoryHistory":61,"./createTransitionManager":63,"invariant":23}],71:[function(require,module,exports){ +"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function getChildRoutes(t,e,n,r,o){if(t.childRoutes)return[null,t.childRoutes];if(!t.getChildRoutes)return[];var a=!0,i=void 0,u={location:e,params:createParams(n,r)},s=(0,_makeStateWithLocation2.default)(u,e);return t.getChildRoutes(s,function(t,e){return e=!t&&(0,_RouteUtils.createRoutes)(e),a?void(i=[t,e]):void o(t,e)}),a=!1,i}function getIndexRoute(t,e,n,r,o){if(t.indexRoute)o(null,t.indexRoute);else if(t.getIndexRoute){var a={location:e,params:createParams(n,r)},i=(0,_makeStateWithLocation2.default)(a,e);t.getIndexRoute(i,function(t,e){o(t,!t&&(0,_RouteUtils.createRoutes)(e)[0])})}else t.childRoutes?!function(){var a=t.childRoutes.filter(function(t){return!t.path});(0,_AsyncUtils.loopAsync)(a.length,function(t,o,i){getIndexRoute(a[t],e,n,r,function(e,n){if(e||n){var r=[a[t]].concat(Array.isArray(n)?n:[n]);i(e,r)}else o()})},function(t,e){o(null,e)})}():o()}function assignParams(t,e,n){return e.reduce(function(t,e,r){var o=n&&n[r];return Array.isArray(t[e])?t[e].push(o):e in t?t[e]=[t[e],o]:t[e]=o,t},t)}function createParams(t,e){return assignParams({},t,e)}function matchRouteDeep(t,e,n,r,o,a){var i=t.path||"";if("/"===i.charAt(0)&&(n=e.pathname,r=[],o=[]),null!==n&&i){try{var u=(0,_PatternUtils.matchPattern)(i,n);u?(n=u.remainingPathname,r=[].concat(r,u.paramNames),o=[].concat(o,u.paramValues)):n=null}catch(t){a(t)}if(""===n){var s=function(){var n={routes:[t],params:createParams(r,o)};return getIndexRoute(t,e,r,o,function(t,e){if(t)a(t);else{if(Array.isArray(e)){var r;(r=n.routes).push.apply(r,e)}else e&&n.routes.push(e);a(null,n)}}),{v:void 0}}();if("object"===("undefined"==typeof s?"undefined":_typeof(s)))return s.v}}if(null!=n||t.childRoutes){var c=function(i,u){i?a(i):u?matchRoutes(u,e,function(e,n){e?a(e):n?(n.routes.unshift(t),a(null,n)):a()},n,r,o):a()},l=getChildRoutes(t,e,r,o,c);l&&c.apply(void 0,l)}else a()}function matchRoutes(t,e,n,r){var o=arguments.length<=4||void 0===arguments[4]?[]:arguments[4],a=arguments.length<=5||void 0===arguments[5]?[]:arguments[5];void 0===r&&("/"!==e.pathname.charAt(0)&&(e=_extends({},e,{pathname:"/"+e.pathname})),r=e.pathname),(0,_AsyncUtils.loopAsync)(t.length,function(n,i,u){matchRouteDeep(t[n],e,r,o,a,function(t,e){t||e?u(t,e):i()})},n)}exports.__esModule=!0;var _extends=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};exports.default=matchRoutes;var _AsyncUtils=require("./AsyncUtils"),_makeStateWithLocation=require("./makeStateWithLocation"),_makeStateWithLocation2=_interopRequireDefault(_makeStateWithLocation),_PatternUtils=require("./PatternUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_RouteUtils=require("./RouteUtils");module.exports=exports.default; -},{"./AsyncUtils":40,"./PatternUtils":48,"./RouteUtils":53,"./makeStateWithLocation":70,"./routerWarning":73}],73:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function routerWarning(e,r){if(r.indexOf("deprecated")!==-1){if(warned[r])return;warned[r]=!0}r="[react-router] "+r;for(var n=arguments.length,t=Array(n>2?n-2:0),a=2;a<n;a++)t[a-2]=arguments[a];_warning2["default"].apply(void 0,[e,r].concat(t))}function _resetWarned(){warned={}}exports.__esModule=!0,exports["default"]=routerWarning,exports._resetWarned=_resetWarned;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning),warned={}; +},{"./AsyncUtils":39,"./PatternUtils":47,"./RouteUtils":52,"./makeStateWithLocation":69,"./routerWarning":72}],72:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function routerWarning(e,r){if(r.indexOf("deprecated")!==-1){if(warned[r])return;warned[r]=!0}r="[react-router] "+r;for(var n=arguments.length,t=Array(n>2?n-2:0),a=2;a<n;a++)t[a-2]=arguments[a];_warning2.default.apply(void 0,[e,r].concat(t))}function _resetWarned(){warned={}}exports.__esModule=!0,exports.default=routerWarning,exports._resetWarned=_resetWarned;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning),warned={}; -},{"warning":246}],74:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function useRouterHistory(e){return function(u){var r=(0,_useQueries2["default"])((0,_useBasename2["default"])(e))(u);return r.__v2_compatible__=!0,r}}exports.__esModule=!0,exports["default"]=useRouterHistory;var _useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_useBasename=require("history/lib/useBasename"),_useBasename2=_interopRequireDefault(_useBasename);module.exports=exports["default"]; +},{"warning":243}],73:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function useRouterHistory(e){return function(u){var r=(0,_useQueries2.default)((0,_useBasename2.default)(e))(u);return r.__v2_compatible__=!0,r}}exports.__esModule=!0,exports.default=useRouterHistory;var _useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_useBasename=require("history/lib/useBasename"),_useBasename2=_interopRequireDefault(_useBasename);module.exports=exports.default; -},{"history/lib/useBasename":20,"history/lib/useQueries":21}],75:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _objectWithoutProperties(e,r){var t={};for(var n in e)r.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t}function useRoutes(e){return function(){var r=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=r.routes,n=_objectWithoutProperties(r,["routes"]),u=(0,_useQueries2["default"])(e)(n),i=(0,_createTransitionManager2["default"])(u,t);return _extends({},u,i)}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},_useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_createTransitionManager=require("./createTransitionManager"),_createTransitionManager2=_interopRequireDefault(_createTransitionManager),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning);exports["default"]=useRoutes,module.exports=exports["default"]; +},{"history/lib/useBasename":20,"history/lib/useQueries":21}],74:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _objectWithoutProperties(e,r){var t={};for(var n in e)r.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t}function useRoutes(e){return function(){var r=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=r.routes,n=_objectWithoutProperties(r,["routes"]),u=(0,_useQueries2.default)(e)(n),i=(0,_createTransitionManager2.default)(u,t);return _extends({},u,i)}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},_useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_createTransitionManager=require("./createTransitionManager"),_createTransitionManager2=_interopRequireDefault(_createTransitionManager),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning);exports.default=useRoutes,module.exports=exports.default; -},{"./createTransitionManager":64,"./routerWarning":73,"history/lib/useQueries":21}],76:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function getDisplayName(e){return e.displayName||e.name||"Component"}function withRouter(e){var t=_react2["default"].createClass({displayName:"WithRouter",contextTypes:{router:_PropTypes.routerShape},render:function(){return _react2["default"].createElement(e,_extends({},this.props,{router:this.context.router}))}});return t.displayName="withRouter("+getDisplayName(e)+")",t.WrappedComponent=e,(0,_hoistNonReactStatics2["default"])(t,e)}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};exports["default"]=withRouter;var _react=require("react"),_react2=_interopRequireDefault(_react),_hoistNonReactStatics=require("hoist-non-react-statics"),_hoistNonReactStatics2=_interopRequireDefault(_hoistNonReactStatics),_PropTypes=require("./PropTypes");module.exports=exports["default"]; +},{"./createTransitionManager":63,"./routerWarning":72,"history/lib/useQueries":21}],75:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function getDisplayName(e){return e.displayName||e.name||"Component"}function withRouter(e){var t=_react2.default.createClass({displayName:"WithRouter",contextTypes:{router:_PropTypes.routerShape},render:function(){return _react2.default.createElement(e,_extends({},this.props,{router:this.context.router}))}});return t.displayName="withRouter("+getDisplayName(e)+")",t.WrappedComponent=e,(0,_hoistNonReactStatics2.default)(t,e)}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};exports.default=withRouter;var _react=require("react"),_react2=_interopRequireDefault(_react),_hoistNonReactStatics=require("hoist-non-react-statics"),_hoistNonReactStatics2=_interopRequireDefault(_hoistNonReactStatics),_PropTypes=require("./PropTypes");module.exports=exports.default; -},{"./PropTypes":49,"hoist-non-react-statics":22,"react":"react"}],77:[function(require,module,exports){ +},{"./PropTypes":48,"hoist-non-react-statics":22,"react":"react"}],76:[function(require,module,exports){ "use strict";var ReactDOMComponentTree=require("./ReactDOMComponentTree"),focusNode=require("fbjs/lib/focusNode"),AutoFocusUtils={focusDOMComponent:function(){focusNode(ReactDOMComponentTree.getNodeFromInstance(this))}};module.exports=AutoFocusUtils; -},{"./ReactDOMComponentTree":116,"fbjs/lib/focusNode":220}],78:[function(require,module,exports){ +},{"./ReactDOMComponentTree":115,"fbjs/lib/focusNode":218}],77:[function(require,module,exports){ "use strict";function isPresto(){var e=window.opera;return"object"==typeof e&&"function"==typeof e.version&&parseInt(e.version(),10)<=12}function isKeypressCommand(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function getCompositionEventType(e){switch(e){case topLevelTypes.topCompositionStart:return eventTypes.compositionStart;case topLevelTypes.topCompositionEnd:return eventTypes.compositionEnd;case topLevelTypes.topCompositionUpdate:return eventTypes.compositionUpdate}}function isFallbackCompositionStart(e,t){return e===topLevelTypes.topKeyDown&&t.keyCode===START_KEYCODE}function isFallbackCompositionEnd(e,t){switch(e){case topLevelTypes.topKeyUp:return END_KEYCODES.indexOf(t.keyCode)!==-1;case topLevelTypes.topKeyDown:return t.keyCode!==START_KEYCODE;case topLevelTypes.topKeyPress:case topLevelTypes.topMouseDown:case topLevelTypes.topBlur:return!0;default:return!1}}function getDataFromCustomEvent(e){var t=e.detail;return"object"==typeof t&&"data"in t?t.data:null}function extractCompositionEvent(e,t,o,n){var p,s;if(canUseCompositionEvent?p=getCompositionEventType(e):currentComposition?isFallbackCompositionEnd(e,o)&&(p=eventTypes.compositionEnd):isFallbackCompositionStart(e,o)&&(p=eventTypes.compositionStart),!p)return null;useFallbackCompositionData&&(currentComposition||p!==eventTypes.compositionStart?p===eventTypes.compositionEnd&¤tComposition&&(s=currentComposition.getData()):currentComposition=FallbackCompositionState.getPooled(n));var i=SyntheticCompositionEvent.getPooled(p,t,o,n);if(s)i.data=s;else{var r=getDataFromCustomEvent(o);null!==r&&(i.data=r)}return EventPropagators.accumulateTwoPhaseDispatches(i),i}function getNativeBeforeInputChars(e,t){switch(e){case topLevelTypes.topCompositionEnd:return getDataFromCustomEvent(t);case topLevelTypes.topKeyPress:var o=t.which;return o!==SPACEBAR_CODE?null:(hasSpaceKeypress=!0,SPACEBAR_CHAR);case topLevelTypes.topTextInput:var n=t.data;return n===SPACEBAR_CHAR&&hasSpaceKeypress?null:n;default:return null}}function getFallbackBeforeInputChars(e,t){if(currentComposition){if(e===topLevelTypes.topCompositionEnd||isFallbackCompositionEnd(e,t)){var o=currentComposition.getData();return FallbackCompositionState.release(currentComposition),currentComposition=null,o}return null}switch(e){case topLevelTypes.topPaste:return null;case topLevelTypes.topKeyPress:return t.which&&!isKeypressCommand(t)?String.fromCharCode(t.which):null;case topLevelTypes.topCompositionEnd:return useFallbackCompositionData?null:t.data;default:return null}}function extractBeforeInputEvent(e,t,o,n){var p;if(p=canUseTextInputEvent?getNativeBeforeInputChars(e,o):getFallbackBeforeInputChars(e,o),!p)return null;var s=SyntheticInputEvent.getPooled(eventTypes.beforeInput,t,o,n);return s.data=p,EventPropagators.accumulateTwoPhaseDispatches(s),s}var EventConstants=require("./EventConstants"),EventPropagators=require("./EventPropagators"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),FallbackCompositionState=require("./FallbackCompositionState"),SyntheticCompositionEvent=require("./SyntheticCompositionEvent"),SyntheticInputEvent=require("./SyntheticInputEvent"),keyOf=require("fbjs/lib/keyOf"),END_KEYCODES=[9,13,27,32],START_KEYCODE=229,canUseCompositionEvent=ExecutionEnvironment.canUseDOM&&"CompositionEvent"in window,documentMode=null;ExecutionEnvironment.canUseDOM&&"documentMode"in document&&(documentMode=document.documentMode);var canUseTextInputEvent=ExecutionEnvironment.canUseDOM&&"TextEvent"in window&&!documentMode&&!isPresto(),useFallbackCompositionData=ExecutionEnvironment.canUseDOM&&(!canUseCompositionEvent||documentMode&&documentMode>8&&documentMode<=11),SPACEBAR_CODE=32,SPACEBAR_CHAR=String.fromCharCode(SPACEBAR_CODE),topLevelTypes=EventConstants.topLevelTypes,eventTypes={beforeInput:{phasedRegistrationNames:{bubbled:keyOf({onBeforeInput:null}),captured:keyOf({onBeforeInputCapture:null})},dependencies:[topLevelTypes.topCompositionEnd,topLevelTypes.topKeyPress,topLevelTypes.topTextInput,topLevelTypes.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:keyOf({onCompositionEnd:null}),captured:keyOf({onCompositionEndCapture:null})},dependencies:[topLevelTypes.topBlur,topLevelTypes.topCompositionEnd,topLevelTypes.topKeyDown,topLevelTypes.topKeyPress,topLevelTypes.topKeyUp,topLevelTypes.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:keyOf({onCompositionStart:null}),captured:keyOf({onCompositionStartCapture:null})},dependencies:[topLevelTypes.topBlur,topLevelTypes.topCompositionStart,topLevelTypes.topKeyDown,topLevelTypes.topKeyPress,topLevelTypes.topKeyUp,topLevelTypes.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:keyOf({onCompositionUpdate:null}),captured:keyOf({onCompositionUpdateCapture:null})},dependencies:[topLevelTypes.topBlur,topLevelTypes.topCompositionUpdate,topLevelTypes.topKeyDown,topLevelTypes.topKeyPress,topLevelTypes.topKeyUp,topLevelTypes.topMouseDown]}},hasSpaceKeypress=!1,currentComposition=null,BeforeInputEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,o,n){return[extractCompositionEvent(e,t,o,n),extractBeforeInputEvent(e,t,o,n)]}};module.exports=BeforeInputEventPlugin; -},{"./EventConstants":92,"./EventPropagators":96,"./FallbackCompositionState":97,"./SyntheticCompositionEvent":169,"./SyntheticInputEvent":173,"fbjs/lib/ExecutionEnvironment":212,"fbjs/lib/keyOf":230}],79:[function(require,module,exports){ +},{"./EventConstants":91,"./EventPropagators":95,"./FallbackCompositionState":96,"./SyntheticCompositionEvent":165,"./SyntheticInputEvent":169,"fbjs/lib/ExecutionEnvironment":210,"fbjs/lib/keyOf":228}],78:[function(require,module,exports){ "use strict";function prefixKey(o,r){return o+r.charAt(0).toUpperCase()+r.substring(1)}var isUnitlessNumber={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},prefixes=["Webkit","ms","Moz","O"];Object.keys(isUnitlessNumber).forEach(function(o){prefixes.forEach(function(r){isUnitlessNumber[prefixKey(r,o)]=isUnitlessNumber[o]})});var shorthandPropertyExpansions={background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}},CSSProperty={isUnitlessNumber:isUnitlessNumber,shorthandPropertyExpansions:shorthandPropertyExpansions};module.exports=CSSProperty; -},{}],80:[function(require,module,exports){ +},{}],79:[function(require,module,exports){ "use strict";var CSSProperty=require("./CSSProperty"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),ReactInstrumentation=require("./ReactInstrumentation"),camelizeStyleName=require("fbjs/lib/camelizeStyleName"),dangerousStyleValue=require("./dangerousStyleValue"),hyphenateStyleName=require("fbjs/lib/hyphenateStyleName"),memoizeStringOnly=require("fbjs/lib/memoizeStringOnly"),warning=require("fbjs/lib/warning"),processStyleName=memoizeStringOnly(function(e){return hyphenateStyleName(e)}),hasShorthandPropertyBug=!1,styleFloatAccessor="cssFloat";if(ExecutionEnvironment.canUseDOM){var tempStyle=document.createElement("div").style;try{tempStyle.font=""}catch(e){hasShorthandPropertyBug=!0}void 0===document.documentElement.style.cssFloat&&(styleFloatAccessor="styleFloat")}var badVendoredStyleNamePattern,badStyleValueWithSemicolonPattern,warnedStyleNames,warnedStyleValues,warnedForNaNValue,warnHyphenatedStyleName,warnBadVendoredStyleName,warnStyleValueWithSemicolon,warnStyleValueIsNaN,checkRenderMessage,warnValidStyle,CSSPropertyOperations={createMarkupForStyles:function(e,t){var r="";for(var a in e)if(e.hasOwnProperty(a)){var n=e[a];null!=n&&(r+=processStyleName(a)+":",r+=dangerousStyleValue(a,n,t)+";")}return r||null},setValueForStyles:function(e,t,r){var a=e.style;for(var n in t)if(t.hasOwnProperty(n)){var l=dangerousStyleValue(n,t[n],r);if("float"!==n&&"cssFloat"!==n||(n=styleFloatAccessor),l)a[n]=l;else{var o=hasShorthandPropertyBug&&CSSProperty.shorthandPropertyExpansions[n];if(o)for(var s in o)a[s]="";else a[n]=""}}}};module.exports=CSSPropertyOperations; -},{"./CSSProperty":79,"./ReactInstrumentation":145,"./dangerousStyleValue":186,"fbjs/lib/ExecutionEnvironment":212,"fbjs/lib/camelizeStyleName":214,"fbjs/lib/hyphenateStyleName":225,"fbjs/lib/memoizeStringOnly":232,"fbjs/lib/warning":236}],81:[function(require,module,exports){ -"use strict";function CallbackQueue(){this._callbacks=null,this._contexts=null}var _assign=require("object-assign"),PooledClass=require("./PooledClass"),invariant=require("fbjs/lib/invariant");_assign(CallbackQueue.prototype,{enqueue:function(t,l){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(t),this._contexts.push(l)},notifyAll:function(){var t=this._callbacks,l=this._contexts;if(t){t.length!==l.length?invariant(!1):void 0,this._callbacks=null,this._contexts=null;for(var s=0;s<t.length;s++)t[s].call(l[s]);t.length=0,l.length=0}},checkpoint:function(){return this._callbacks?this._callbacks.length:0},rollback:function(t){this._callbacks&&(this._callbacks.length=t,this._contexts.length=t)},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),PooledClass.addPoolingTo(CallbackQueue),module.exports=CallbackQueue; +},{"./CSSProperty":78,"./ReactInstrumentation":141,"./dangerousStyleValue":183,"fbjs/lib/ExecutionEnvironment":210,"fbjs/lib/camelizeStyleName":212,"fbjs/lib/hyphenateStyleName":223,"fbjs/lib/memoizeStringOnly":230,"fbjs/lib/warning":232}],80:[function(require,module,exports){ +"use strict";function CallbackQueue(){this._callbacks=null,this._contexts=null}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),PooledClass=require("./PooledClass"),invariant=require("fbjs/lib/invariant");_assign(CallbackQueue.prototype,{enqueue:function(t,l){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(t),this._contexts.push(l)},notifyAll:function(){var t=this._callbacks,l=this._contexts;if(t){t.length!==l.length?_prodInvariant("24"):void 0,this._callbacks=null,this._contexts=null;for(var s=0;s<t.length;s++)t[s].call(l[s]);t.length=0,l.length=0}},checkpoint:function(){return this._callbacks?this._callbacks.length:0},rollback:function(t){this._callbacks&&(this._callbacks.length=t,this._contexts.length=t)},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),PooledClass.addPoolingTo(CallbackQueue),module.exports=CallbackQueue; -},{"./PooledClass":101,"fbjs/lib/invariant":226,"object-assign":32}],82:[function(require,module,exports){ +},{"./PooledClass":100,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"object-assign":31}],81:[function(require,module,exports){ "use strict";function shouldUseChangeEvent(e){var t=e.nodeName&&e.nodeName.toLowerCase();return"select"===t||"input"===t&&"file"===e.type}function manualDispatchChangeEvent(e){var t=SyntheticEvent.getPooled(eventTypes.change,activeElementInst,e,getEventTarget(e));EventPropagators.accumulateTwoPhaseDispatches(t),ReactUpdates.batchedUpdates(runEventInBatch,t)}function runEventInBatch(e){EventPluginHub.enqueueEvents(e),EventPluginHub.processEventQueue(!1)}function startWatchingForChangeEventIE8(e,t){activeElement=e,activeElementInst=t,activeElement.attachEvent("onchange",manualDispatchChangeEvent)}function stopWatchingForChangeEventIE8(){activeElement&&(activeElement.detachEvent("onchange",manualDispatchChangeEvent),activeElement=null,activeElementInst=null)}function getTargetInstForChangeEvent(e,t){if(e===topLevelTypes.topChange)return t}function handleEventsForChangeEventIE8(e,t,n){e===topLevelTypes.topFocus?(stopWatchingForChangeEventIE8(),startWatchingForChangeEventIE8(t,n)):e===topLevelTypes.topBlur&&stopWatchingForChangeEventIE8()}function startWatchingForValueChange(e,t){activeElement=e,activeElementInst=t,activeElementValue=e.value,activeElementValueProp=Object.getOwnPropertyDescriptor(e.constructor.prototype,"value"),Object.defineProperty(activeElement,"value",newValueProp),activeElement.attachEvent?activeElement.attachEvent("onpropertychange",handlePropertyChange):activeElement.addEventListener("propertychange",handlePropertyChange,!1)}function stopWatchingForValueChange(){activeElement&&(delete activeElement.value,activeElement.detachEvent?activeElement.detachEvent("onpropertychange",handlePropertyChange):activeElement.removeEventListener("propertychange",handlePropertyChange,!1),activeElement=null,activeElementInst=null,activeElementValue=null,activeElementValueProp=null)}function handlePropertyChange(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==activeElementValue&&(activeElementValue=t,manualDispatchChangeEvent(e))}}function getTargetInstForInputEvent(e,t){if(e===topLevelTypes.topInput)return t}function handleEventsForInputEventIE(e,t,n){e===topLevelTypes.topFocus?(stopWatchingForValueChange(),startWatchingForValueChange(t,n)):e===topLevelTypes.topBlur&&stopWatchingForValueChange()}function getTargetInstForInputEventIE(e,t){if((e===topLevelTypes.topSelectionChange||e===topLevelTypes.topKeyUp||e===topLevelTypes.topKeyDown)&&activeElement&&activeElement.value!==activeElementValue)return activeElementValue=activeElement.value,activeElementInst}function shouldUseClickEvent(e){return e.nodeName&&"input"===e.nodeName.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)}function getTargetInstForClickEvent(e,t){if(e===topLevelTypes.topClick)return t}var EventConstants=require("./EventConstants"),EventPluginHub=require("./EventPluginHub"),EventPropagators=require("./EventPropagators"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),SyntheticEvent=require("./SyntheticEvent"),getEventTarget=require("./getEventTarget"),isEventSupported=require("./isEventSupported"),isTextInputElement=require("./isTextInputElement"),keyOf=require("fbjs/lib/keyOf"),topLevelTypes=EventConstants.topLevelTypes,eventTypes={change:{phasedRegistrationNames:{bubbled:keyOf({onChange:null}),captured:keyOf({onChangeCapture:null})},dependencies:[topLevelTypes.topBlur,topLevelTypes.topChange,topLevelTypes.topClick,topLevelTypes.topFocus,topLevelTypes.topInput,topLevelTypes.topKeyDown,topLevelTypes.topKeyUp,topLevelTypes.topSelectionChange]}},activeElement=null,activeElementInst=null,activeElementValue=null,activeElementValueProp=null,doesChangeEventBubble=!1;ExecutionEnvironment.canUseDOM&&(doesChangeEventBubble=isEventSupported("change")&&(!("documentMode"in document)||document.documentMode>8));var isInputEventSupported=!1;ExecutionEnvironment.canUseDOM&&(isInputEventSupported=isEventSupported("input")&&(!("documentMode"in document)||document.documentMode>11));var newValueProp={get:function(){return activeElementValueProp.get.call(this)},set:function(e){activeElementValue=""+e,activeElementValueProp.set.call(this,e)}},ChangeEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,n,a){var o,l,r=t?ReactDOMComponentTree.getNodeFromInstance(t):window;if(shouldUseChangeEvent(r)?doesChangeEventBubble?o=getTargetInstForChangeEvent:l=handleEventsForChangeEventIE8:isTextInputElement(r)?isInputEventSupported?o=getTargetInstForInputEvent:(o=getTargetInstForInputEventIE,l=handleEventsForInputEventIE):shouldUseClickEvent(r)&&(o=getTargetInstForClickEvent),o){var v=o(e,t);if(v){var p=SyntheticEvent.getPooled(eventTypes.change,v,n,a);return p.type="change",EventPropagators.accumulateTwoPhaseDispatches(p),p}}l&&l(e,r,t)}};module.exports=ChangeEventPlugin; -},{"./EventConstants":92,"./EventPluginHub":93,"./EventPropagators":96,"./ReactDOMComponentTree":116,"./ReactUpdates":162,"./SyntheticEvent":171,"./getEventTarget":194,"./isEventSupported":201,"./isTextInputElement":202,"fbjs/lib/ExecutionEnvironment":212,"fbjs/lib/keyOf":230}],83:[function(require,module,exports){ +},{"./EventConstants":91,"./EventPluginHub":92,"./EventPropagators":95,"./ReactDOMComponentTree":115,"./ReactUpdates":158,"./SyntheticEvent":167,"./getEventTarget":191,"./isEventSupported":198,"./isTextInputElement":199,"fbjs/lib/ExecutionEnvironment":210,"fbjs/lib/keyOf":228}],82:[function(require,module,exports){ "use strict";function getNodeAfter(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firstChild}function insertLazyTreeChildAt(e,t,r){DOMLazyTree.insertTreeBefore(e,t,r)}function moveChild(e,t,r){Array.isArray(t)?moveDelimitedText(e,t[0],t[1],r):insertChildAt(e,t,r)}function removeChild(e,t){if(Array.isArray(t)){var r=t[1];t=t[0],removeDelimitedText(e,t,r),e.removeChild(r)}e.removeChild(t)}function moveDelimitedText(e,t,r,i){for(var n=t;;){var a=n.nextSibling;if(insertChildAt(e,n,i),n===r)break;n=a}}function removeDelimitedText(e,t,r){for(;;){var i=t.nextSibling;if(i===r)break;e.removeChild(i)}}function replaceDelimitedText(e,t,r){var i=e.parentNode,n=e.nextSibling;n===t?r&&insertChildAt(i,document.createTextNode(r),n):r?(setTextContent(n,r),removeDelimitedText(i,n,t)):removeDelimitedText(i,e,t)}var DOMLazyTree=require("./DOMLazyTree"),Danger=require("./Danger"),ReactMultiChildUpdateTypes=require("./ReactMultiChildUpdateTypes"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactInstrumentation=require("./ReactInstrumentation"),createMicrosoftUnsafeLocalFunction=require("./createMicrosoftUnsafeLocalFunction"),setInnerHTML=require("./setInnerHTML"),setTextContent=require("./setTextContent"),insertChildAt=createMicrosoftUnsafeLocalFunction(function(e,t,r){e.insertBefore(t,r)}),dangerouslyReplaceNodeWithMarkup=Danger.dangerouslyReplaceNodeWithMarkup,DOMChildrenOperations={dangerouslyReplaceNodeWithMarkup:dangerouslyReplaceNodeWithMarkup,replaceDelimitedText:replaceDelimitedText,processUpdates:function(e,t){for(var r=0;r<t.length;r++){var i=t[r];switch(i.type){case ReactMultiChildUpdateTypes.INSERT_MARKUP:insertLazyTreeChildAt(e,i.content,getNodeAfter(e,i.afterNode));break;case ReactMultiChildUpdateTypes.MOVE_EXISTING:moveChild(e,i.fromNode,getNodeAfter(e,i.afterNode));break;case ReactMultiChildUpdateTypes.SET_MARKUP:setInnerHTML(e,i.content);break;case ReactMultiChildUpdateTypes.TEXT_CONTENT:setTextContent(e,i.content);break;case ReactMultiChildUpdateTypes.REMOVE_NODE:removeChild(e,i.fromNode)}}}};module.exports=DOMChildrenOperations; -},{"./DOMLazyTree":84,"./Danger":88,"./ReactDOMComponentTree":116,"./ReactInstrumentation":145,"./ReactMultiChildUpdateTypes":149,"./createMicrosoftUnsafeLocalFunction":185,"./setInnerHTML":206,"./setTextContent":207}],84:[function(require,module,exports){ -"use strict";function insertTreeChildren(e){if(enableLazy){var n=e.node,t=e.children;if(t.length)for(var r=0;r<t.length;r++)insertTreeBefore(n,t[r],null);else null!=e.html?n.innerHTML=e.html:null!=e.text&&setTextContent(n,e.text)}}function replaceChildWithTree(e,n){e.parentNode.replaceChild(n.node,e),insertTreeChildren(n)}function queueChild(e,n){enableLazy?e.children.push(n):e.node.appendChild(n.node)}function queueHTML(e,n){enableLazy?e.html=n:e.node.innerHTML=n}function queueText(e,n){enableLazy?e.text=n:setTextContent(e.node,n)}function toString(){return this.node.nodeName}function DOMLazyTree(e){return{node:e,children:[],html:null,text:null,toString:toString}}var DOMNamespaces=require("./DOMNamespaces"),createMicrosoftUnsafeLocalFunction=require("./createMicrosoftUnsafeLocalFunction"),setTextContent=require("./setTextContent"),ELEMENT_NODE_TYPE=1,DOCUMENT_FRAGMENT_NODE_TYPE=11,enableLazy="undefined"!=typeof document&&"number"==typeof document.documentMode||"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent&&/\bEdge\/\d/.test(navigator.userAgent),insertTreeBefore=createMicrosoftUnsafeLocalFunction(function(e,n,t){n.node.nodeType===DOCUMENT_FRAGMENT_NODE_TYPE||n.node.nodeType===ELEMENT_NODE_TYPE&&"object"===n.node.nodeName.toLowerCase()&&(null==n.node.namespaceURI||n.node.namespaceURI===DOMNamespaces.html)?(insertTreeChildren(n),e.insertBefore(n.node,t)):(e.insertBefore(n.node,t),insertTreeChildren(n))});DOMLazyTree.insertTreeBefore=insertTreeBefore,DOMLazyTree.replaceChildWithTree=replaceChildWithTree,DOMLazyTree.queueChild=queueChild,DOMLazyTree.queueHTML=queueHTML,DOMLazyTree.queueText=queueText,module.exports=DOMLazyTree; +},{"./DOMLazyTree":83,"./Danger":87,"./ReactDOMComponentTree":115,"./ReactInstrumentation":141,"./ReactMultiChildUpdateTypes":145,"./createMicrosoftUnsafeLocalFunction":182,"./setInnerHTML":204,"./setTextContent":205}],83:[function(require,module,exports){ +"use strict";function insertTreeChildren(e){if(enableLazy){var n=e.node,t=e.children;if(t.length)for(var r=0;r<t.length;r++)insertTreeBefore(n,t[r],null);else null!=e.html?setInnerHTML(n,e.html):null!=e.text&&setTextContent(n,e.text)}}function replaceChildWithTree(e,n){e.parentNode.replaceChild(n.node,e),insertTreeChildren(n)}function queueChild(e,n){enableLazy?e.children.push(n):e.node.appendChild(n.node)}function queueHTML(e,n){enableLazy?e.html=n:setInnerHTML(e.node,n)}function queueText(e,n){enableLazy?e.text=n:setTextContent(e.node,n)}function toString(){return this.node.nodeName}function DOMLazyTree(e){return{node:e,children:[],html:null,text:null,toString:toString}}var DOMNamespaces=require("./DOMNamespaces"),setInnerHTML=require("./setInnerHTML"),createMicrosoftUnsafeLocalFunction=require("./createMicrosoftUnsafeLocalFunction"),setTextContent=require("./setTextContent"),ELEMENT_NODE_TYPE=1,DOCUMENT_FRAGMENT_NODE_TYPE=11,enableLazy="undefined"!=typeof document&&"number"==typeof document.documentMode||"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent&&/\bEdge\/\d/.test(navigator.userAgent),insertTreeBefore=createMicrosoftUnsafeLocalFunction(function(e,n,t){n.node.nodeType===DOCUMENT_FRAGMENT_NODE_TYPE||n.node.nodeType===ELEMENT_NODE_TYPE&&"object"===n.node.nodeName.toLowerCase()&&(null==n.node.namespaceURI||n.node.namespaceURI===DOMNamespaces.html)?(insertTreeChildren(n),e.insertBefore(n.node,t)):(e.insertBefore(n.node,t),insertTreeChildren(n))});DOMLazyTree.insertTreeBefore=insertTreeBefore,DOMLazyTree.replaceChildWithTree=replaceChildWithTree,DOMLazyTree.queueChild=queueChild,DOMLazyTree.queueHTML=queueHTML,DOMLazyTree.queueText=queueText,module.exports=DOMLazyTree; -},{"./DOMNamespaces":85,"./createMicrosoftUnsafeLocalFunction":185,"./setTextContent":207}],85:[function(require,module,exports){ +},{"./DOMNamespaces":84,"./createMicrosoftUnsafeLocalFunction":182,"./setInnerHTML":204,"./setTextContent":205}],84:[function(require,module,exports){ "use strict";var DOMNamespaces={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};module.exports=DOMNamespaces; -},{}],86:[function(require,module,exports){ -"use strict";function checkMask(t,e){return(t&e)===e}var invariant=require("fbjs/lib/invariant"),DOMPropertyInjection={MUST_USE_PROPERTY:1,HAS_SIDE_EFFECTS:2,HAS_BOOLEAN_VALUE:4,HAS_NUMERIC_VALUE:8,HAS_POSITIVE_NUMERIC_VALUE:24,HAS_OVERLOADED_BOOLEAN_VALUE:32,injectDOMPropertyConfig:function(t){var e=DOMPropertyInjection,r=t.Properties||{},a=t.DOMAttributeNamespaces||{},u=t.DOMAttributeNames||{},o=t.DOMPropertyNames||{},i=t.DOMMutationMethods||{};t.isCustomAttribute&&DOMProperty._isCustomAttributeFunctions.push(t.isCustomAttribute);for(var s in r){DOMProperty.properties.hasOwnProperty(s)?invariant(!1):void 0;var A=s.toLowerCase(),n=r[s],_={attributeName:A,attributeNamespace:null,propertyName:s,mutationMethod:null,mustUseProperty:checkMask(n,e.MUST_USE_PROPERTY),hasSideEffects:checkMask(n,e.HAS_SIDE_EFFECTS),hasBooleanValue:checkMask(n,e.HAS_BOOLEAN_VALUE),hasNumericValue:checkMask(n,e.HAS_NUMERIC_VALUE),hasPositiveNumericValue:checkMask(n,e.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:checkMask(n,e.HAS_OVERLOADED_BOOLEAN_VALUE)};if(!_.mustUseProperty&&_.hasSideEffects?invariant(!1):void 0,_.hasBooleanValue+_.hasNumericValue+_.hasOverloadedBooleanValue<=1?void 0:invariant(!1),u.hasOwnProperty(s)){var E=u[s];_.attributeName=E}a.hasOwnProperty(s)&&(_.attributeNamespace=a[s]),o.hasOwnProperty(s)&&(_.propertyName=o[s]),i.hasOwnProperty(s)&&(_.mutationMethod=i[s]),DOMProperty.properties[s]=_}}},ATTRIBUTE_NAME_START_CHAR=":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",DOMProperty={ID_ATTRIBUTE_NAME:"data-reactid",ROOT_ATTRIBUTE_NAME:"data-reactroot",ATTRIBUTE_NAME_START_CHAR:ATTRIBUTE_NAME_START_CHAR,ATTRIBUTE_NAME_CHAR:ATTRIBUTE_NAME_START_CHAR+"\\-.0-9\\uB7\\u0300-\\u036F\\u203F-\\u2040",properties:{},getPossibleStandardName:null,_isCustomAttributeFunctions:[],isCustomAttribute:function(t){for(var e=0;e<DOMProperty._isCustomAttributeFunctions.length;e++){var r=DOMProperty._isCustomAttributeFunctions[e];if(r(t))return!0}return!1},injection:DOMPropertyInjection};module.exports=DOMProperty; +},{}],85:[function(require,module,exports){ +"use strict";function checkMask(t,e){return(t&e)===e}var _prodInvariant=require("./reactProdInvariant"),invariant=require("fbjs/lib/invariant"),DOMPropertyInjection={MUST_USE_PROPERTY:1,HAS_BOOLEAN_VALUE:4,HAS_NUMERIC_VALUE:8,HAS_POSITIVE_NUMERIC_VALUE:24,HAS_OVERLOADED_BOOLEAN_VALUE:32,injectDOMPropertyConfig:function(t){var e=DOMPropertyInjection,r=t.Properties||{},a=t.DOMAttributeNamespaces||{},u=t.DOMAttributeNames||{},o=t.DOMPropertyNames||{},i=t.DOMMutationMethods||{};t.isCustomAttribute&&DOMProperty._isCustomAttributeFunctions.push(t.isCustomAttribute);for(var s in r){DOMProperty.properties.hasOwnProperty(s)?_prodInvariant("48",s):void 0;var n=s.toLowerCase(),A=r[s],_={attributeName:n,attributeNamespace:null,propertyName:s,mutationMethod:null,mustUseProperty:checkMask(A,e.MUST_USE_PROPERTY),hasBooleanValue:checkMask(A,e.HAS_BOOLEAN_VALUE),hasNumericValue:checkMask(A,e.HAS_NUMERIC_VALUE),hasPositiveNumericValue:checkMask(A,e.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:checkMask(A,e.HAS_OVERLOADED_BOOLEAN_VALUE)};if(_.hasBooleanValue+_.hasNumericValue+_.hasOverloadedBooleanValue<=1?void 0:_prodInvariant("50",s),u.hasOwnProperty(s)){var E=u[s];_.attributeName=E}a.hasOwnProperty(s)&&(_.attributeNamespace=a[s]),o.hasOwnProperty(s)&&(_.propertyName=o[s]),i.hasOwnProperty(s)&&(_.mutationMethod=i[s]),DOMProperty.properties[s]=_}}},ATTRIBUTE_NAME_START_CHAR=":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",DOMProperty={ID_ATTRIBUTE_NAME:"data-reactid",ROOT_ATTRIBUTE_NAME:"data-reactroot",ATTRIBUTE_NAME_START_CHAR:ATTRIBUTE_NAME_START_CHAR,ATTRIBUTE_NAME_CHAR:ATTRIBUTE_NAME_START_CHAR+"\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",properties:{},getPossibleStandardName:null,_isCustomAttributeFunctions:[],isCustomAttribute:function(t){for(var e=0;e<DOMProperty._isCustomAttributeFunctions.length;e++){var r=DOMProperty._isCustomAttributeFunctions[e];if(r(t))return!0}return!1},injection:DOMPropertyInjection};module.exports=DOMProperty; -},{"fbjs/lib/invariant":226}],87:[function(require,module,exports){ -"use strict";function isAttributeNameSafe(e){return!!validatedAttributeNameCache.hasOwnProperty(e)||!illegalAttributeNameCache.hasOwnProperty(e)&&(VALID_ATTRIBUTE_NAME_REGEX.test(e)?(validatedAttributeNameCache[e]=!0,!0):(illegalAttributeNameCache[e]=!0,!1))}function shouldIgnoreValue(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&t<1||e.hasOverloadedBooleanValue&&t===!1}var DOMProperty=require("./DOMProperty"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMInstrumentation=require("./ReactDOMInstrumentation"),ReactInstrumentation=require("./ReactInstrumentation"),quoteAttributeValueForBrowser=require("./quoteAttributeValueForBrowser"),warning=require("fbjs/lib/warning"),VALID_ATTRIBUTE_NAME_REGEX=new RegExp("^["+DOMProperty.ATTRIBUTE_NAME_START_CHAR+"]["+DOMProperty.ATTRIBUTE_NAME_CHAR+"]*$"),illegalAttributeNameCache={},validatedAttributeNameCache={},DOMPropertyOperations={createMarkupForID:function(e){return DOMProperty.ID_ATTRIBUTE_NAME+"="+quoteAttributeValueForBrowser(e)},setAttributeForID:function(e,t){e.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME,t)},createMarkupForRoot:function(){return DOMProperty.ROOT_ATTRIBUTE_NAME+'=""'},setAttributeForRoot:function(e){e.setAttribute(DOMProperty.ROOT_ATTRIBUTE_NAME,"")},createMarkupForProperty:function(e,t){var r=DOMProperty.properties.hasOwnProperty(e)?DOMProperty.properties[e]:null;if(r){if(shouldIgnoreValue(r,t))return"";var o=r.attributeName;return r.hasBooleanValue||r.hasOverloadedBooleanValue&&t===!0?o+'=""':o+"="+quoteAttributeValueForBrowser(t)}return DOMProperty.isCustomAttribute(e)?null==t?"":e+"="+quoteAttributeValueForBrowser(t):null},createMarkupForCustomAttribute:function(e,t){return isAttributeNameSafe(e)&&null!=t?e+"="+quoteAttributeValueForBrowser(t):""},setValueForProperty:function(e,t,r){var o=DOMProperty.properties.hasOwnProperty(t)?DOMProperty.properties[t]:null;if(o){var a=o.mutationMethod;if(a)a(e,r);else{if(shouldIgnoreValue(o,r))return void this.deleteValueForProperty(e,t);if(o.mustUseProperty){var u=o.propertyName;o.hasSideEffects&&""+e[u]==""+r||(e[u]=r)}else{var i=o.attributeName,n=o.attributeNamespace;n?e.setAttributeNS(n,i,""+r):o.hasBooleanValue||o.hasOverloadedBooleanValue&&r===!0?e.setAttribute(i,""):e.setAttribute(i,""+r)}}}else if(DOMProperty.isCustomAttribute(t))return void DOMPropertyOperations.setValueForAttribute(e,t,r)},setValueForAttribute:function(e,t,r){if(isAttributeNameSafe(t)){null==r?e.removeAttribute(t):e.setAttribute(t,""+r)}},deleteValueForProperty:function(e,t){var r=DOMProperty.properties.hasOwnProperty(t)?DOMProperty.properties[t]:null;if(r){var o=r.mutationMethod;if(o)o(e,void 0);else if(r.mustUseProperty){var a=r.propertyName;r.hasBooleanValue?e[a]=!1:r.hasSideEffects&&""+e[a]==""||(e[a]="")}else e.removeAttribute(r.attributeName)}else DOMProperty.isCustomAttribute(t)&&e.removeAttribute(t)}};module.exports=DOMPropertyOperations; +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224}],86:[function(require,module,exports){ +"use strict";function isAttributeNameSafe(e){return!!validatedAttributeNameCache.hasOwnProperty(e)||!illegalAttributeNameCache.hasOwnProperty(e)&&(VALID_ATTRIBUTE_NAME_REGEX.test(e)?(validatedAttributeNameCache[e]=!0,!0):(illegalAttributeNameCache[e]=!0,!1))}function shouldIgnoreValue(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&t<1||e.hasOverloadedBooleanValue&&t===!1}var DOMProperty=require("./DOMProperty"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMInstrumentation=require("./ReactDOMInstrumentation"),ReactInstrumentation=require("./ReactInstrumentation"),quoteAttributeValueForBrowser=require("./quoteAttributeValueForBrowser"),warning=require("fbjs/lib/warning"),VALID_ATTRIBUTE_NAME_REGEX=new RegExp("^["+DOMProperty.ATTRIBUTE_NAME_START_CHAR+"]["+DOMProperty.ATTRIBUTE_NAME_CHAR+"]*$"),illegalAttributeNameCache={},validatedAttributeNameCache={},DOMPropertyOperations={createMarkupForID:function(e){return DOMProperty.ID_ATTRIBUTE_NAME+"="+quoteAttributeValueForBrowser(e)},setAttributeForID:function(e,t){e.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME,t)},createMarkupForRoot:function(){return DOMProperty.ROOT_ATTRIBUTE_NAME+'=""'},setAttributeForRoot:function(e){e.setAttribute(DOMProperty.ROOT_ATTRIBUTE_NAME,"")},createMarkupForProperty:function(e,t){var r=DOMProperty.properties.hasOwnProperty(e)?DOMProperty.properties[e]:null;if(r){if(shouldIgnoreValue(r,t))return"";var o=r.attributeName;return r.hasBooleanValue||r.hasOverloadedBooleanValue&&t===!0?o+'=""':o+"="+quoteAttributeValueForBrowser(t)}return DOMProperty.isCustomAttribute(e)?null==t?"":e+"="+quoteAttributeValueForBrowser(t):null},createMarkupForCustomAttribute:function(e,t){return isAttributeNameSafe(e)&&null!=t?e+"="+quoteAttributeValueForBrowser(t):""},setValueForProperty:function(e,t,r){var o=DOMProperty.properties.hasOwnProperty(t)?DOMProperty.properties[t]:null;if(o){var u=o.mutationMethod;if(u)u(e,r);else{if(shouldIgnoreValue(o,r))return void this.deleteValueForProperty(e,t);if(o.mustUseProperty)e[o.propertyName]=r;else{var a=o.attributeName,i=o.attributeNamespace;i?e.setAttributeNS(i,a,""+r):o.hasBooleanValue||o.hasOverloadedBooleanValue&&r===!0?e.setAttribute(a,""):e.setAttribute(a,""+r)}}}else if(DOMProperty.isCustomAttribute(t))return void DOMPropertyOperations.setValueForAttribute(e,t,r)},setValueForAttribute:function(e,t,r){if(isAttributeNameSafe(t)){null==r?e.removeAttribute(t):e.setAttribute(t,""+r)}},deleteValueForAttribute:function(e,t){e.removeAttribute(t)},deleteValueForProperty:function(e,t){var r=DOMProperty.properties.hasOwnProperty(t)?DOMProperty.properties[t]:null;if(r){var o=r.mutationMethod;if(o)o(e,void 0);else if(r.mustUseProperty){var u=r.propertyName;r.hasBooleanValue?e[u]=!1:e[u]=""}else e.removeAttribute(r.attributeName)}else DOMProperty.isCustomAttribute(t)&&e.removeAttribute(t)}};module.exports=DOMPropertyOperations; -},{"./DOMProperty":86,"./ReactDOMComponentTree":116,"./ReactDOMInstrumentation":124,"./ReactInstrumentation":145,"./quoteAttributeValueForBrowser":204,"fbjs/lib/warning":236}],88:[function(require,module,exports){ -"use strict";function getNodeName(e){return e.substring(1,e.indexOf(" "))}var DOMLazyTree=require("./DOMLazyTree"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),createNodesFromMarkup=require("fbjs/lib/createNodesFromMarkup"),emptyFunction=require("fbjs/lib/emptyFunction"),getMarkupWrap=require("fbjs/lib/getMarkupWrap"),invariant=require("fbjs/lib/invariant"),OPEN_TAG_NAME_EXP=/^(<[^ \/>]+)/,RESULT_INDEX_ATTR="data-danger-index",Danger={dangerouslyRenderMarkup:function(e){ExecutionEnvironment.canUseDOM?void 0:invariant(!1);for(var r,n={},i=0;i<e.length;i++)e[i]?void 0:invariant(!1),r=getNodeName(e[i]),r=getMarkupWrap(r)?r:"*",n[r]=n[r]||[],n[r][i]=e[i];var t=[],a=0;for(r in n)if(n.hasOwnProperty(r)){var o,u=n[r];for(o in u)if(u.hasOwnProperty(o)){var v=u[o];u[o]=v.replace(OPEN_TAG_NAME_EXP,"$1 "+RESULT_INDEX_ATTR+'="'+o+'" ')}for(var d=createNodesFromMarkup(u.join(""),emptyFunction),p=0;p<d.length;++p){var s=d[p];s.hasAttribute&&s.hasAttribute(RESULT_INDEX_ATTR)&&(o=+s.getAttribute(RESULT_INDEX_ATTR),s.removeAttribute(RESULT_INDEX_ATTR),t.hasOwnProperty(o)?invariant(!1):void 0,t[o]=s,a+=1)}}return a!==t.length?invariant(!1):void 0,t.length!==e.length?invariant(!1):void 0,t},dangerouslyReplaceNodeWithMarkup:function(e,r){if(ExecutionEnvironment.canUseDOM?void 0:invariant(!1),r?void 0:invariant(!1),"HTML"===e.nodeName?invariant(!1):void 0,"string"==typeof r){var n=createNodesFromMarkup(r,emptyFunction)[0];e.parentNode.replaceChild(n,e)}else DOMLazyTree.replaceChildWithTree(e,r)}};module.exports=Danger; +},{"./DOMProperty":85,"./ReactDOMComponentTree":115,"./ReactDOMInstrumentation":122,"./ReactInstrumentation":141,"./quoteAttributeValueForBrowser":201,"fbjs/lib/warning":232}],87:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),DOMLazyTree=require("./DOMLazyTree"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),createNodesFromMarkup=require("fbjs/lib/createNodesFromMarkup"),emptyFunction=require("fbjs/lib/emptyFunction"),invariant=require("fbjs/lib/invariant"),Danger={dangerouslyReplaceNodeWithMarkup:function(e,r){if(ExecutionEnvironment.canUseDOM?void 0:_prodInvariant("56"),r?void 0:_prodInvariant("57"),"HTML"===e.nodeName?_prodInvariant("58"):void 0,"string"==typeof r){var n=createNodesFromMarkup(r,emptyFunction)[0];e.parentNode.replaceChild(n,e)}else DOMLazyTree.replaceChildWithTree(e,r)}};module.exports=Danger; -},{"./DOMLazyTree":84,"fbjs/lib/ExecutionEnvironment":212,"fbjs/lib/createNodesFromMarkup":217,"fbjs/lib/emptyFunction":218,"fbjs/lib/getMarkupWrap":222,"fbjs/lib/invariant":226}],89:[function(require,module,exports){ +},{"./DOMLazyTree":83,"./reactProdInvariant":202,"fbjs/lib/ExecutionEnvironment":210,"fbjs/lib/createNodesFromMarkup":215,"fbjs/lib/emptyFunction":216,"fbjs/lib/invariant":224}],88:[function(require,module,exports){ "use strict";var keyOf=require("fbjs/lib/keyOf"),DefaultEventPluginOrder=[keyOf({ResponderEventPlugin:null}),keyOf({SimpleEventPlugin:null}),keyOf({TapEventPlugin:null}),keyOf({EnterLeaveEventPlugin:null}),keyOf({ChangeEventPlugin:null}),keyOf({SelectEventPlugin:null}),keyOf({BeforeInputEventPlugin:null})];module.exports=DefaultEventPluginOrder; -},{"fbjs/lib/keyOf":230}],90:[function(require,module,exports){ -"use strict";var disableableMouseListenerNames={onClick:!0,onDoubleClick:!0,onMouseDown:!0,onMouseMove:!0,onMouseUp:!0,onClickCapture:!0,onDoubleClickCapture:!0,onMouseDownCapture:!0,onMouseMoveCapture:!0,onMouseUpCapture:!0},DisabledInputUtils={getNativeProps:function(e,o){if(!o.disabled)return o;var s={};for(var n in o)!disableableMouseListenerNames[n]&&o.hasOwnProperty(n)&&(s[n]=o[n]);return s}};module.exports=DisabledInputUtils; +},{"fbjs/lib/keyOf":228}],89:[function(require,module,exports){ +"use strict";var disableableMouseListenerNames={onClick:!0,onDoubleClick:!0,onMouseDown:!0,onMouseMove:!0,onMouseUp:!0,onClickCapture:!0,onDoubleClickCapture:!0,onMouseDownCapture:!0,onMouseMoveCapture:!0,onMouseUpCapture:!0},DisabledInputUtils={getHostProps:function(e,o){if(!o.disabled)return o;var s={};for(var n in o)!disableableMouseListenerNames[n]&&o.hasOwnProperty(n)&&(s[n]=o[n]);return s}};module.exports=DisabledInputUtils; -},{}],91:[function(require,module,exports){ +},{}],90:[function(require,module,exports){ "use strict";var EventConstants=require("./EventConstants"),EventPropagators=require("./EventPropagators"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),SyntheticMouseEvent=require("./SyntheticMouseEvent"),keyOf=require("fbjs/lib/keyOf"),topLevelTypes=EventConstants.topLevelTypes,eventTypes={mouseEnter:{registrationName:keyOf({onMouseEnter:null}),dependencies:[topLevelTypes.topMouseOut,topLevelTypes.topMouseOver]},mouseLeave:{registrationName:keyOf({onMouseLeave:null}),dependencies:[topLevelTypes.topMouseOut,topLevelTypes.topMouseOver]}},EnterLeaveEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,n,o){if(e===topLevelTypes.topMouseOver&&(n.relatedTarget||n.fromElement))return null;if(e!==topLevelTypes.topMouseOut&&e!==topLevelTypes.topMouseOver)return null;var r;if(o.window===o)r=o;else{var s=o.ownerDocument;r=s?s.defaultView||s.parentWindow:window}var a,u;if(e===topLevelTypes.topMouseOut){a=t;var p=n.relatedTarget||n.toElement;u=p?ReactDOMComponentTree.getClosestInstanceFromNode(p):null}else a=null,u=t;if(a===u)return null;var l=null==a?r:ReactDOMComponentTree.getNodeFromInstance(a),v=null==u?r:ReactDOMComponentTree.getNodeFromInstance(u),i=SyntheticMouseEvent.getPooled(eventTypes.mouseLeave,a,n,o);i.type="mouseleave",i.target=l,i.relatedTarget=v;var y=SyntheticMouseEvent.getPooled(eventTypes.mouseEnter,u,n,o);return y.type="mouseenter",y.target=v,y.relatedTarget=l,EventPropagators.accumulateEnterLeaveDispatches(i,y,a,u),[i,y]}};module.exports=EnterLeaveEventPlugin; -},{"./EventConstants":92,"./EventPropagators":96,"./ReactDOMComponentTree":116,"./SyntheticMouseEvent":175,"fbjs/lib/keyOf":230}],92:[function(require,module,exports){ +},{"./EventConstants":91,"./EventPropagators":95,"./ReactDOMComponentTree":115,"./SyntheticMouseEvent":171,"fbjs/lib/keyOf":228}],91:[function(require,module,exports){ "use strict";var keyMirror=require("fbjs/lib/keyMirror"),PropagationPhases=keyMirror({bubbled:null,captured:null}),topLevelTypes=keyMirror({topAbort:null,topAnimationEnd:null,topAnimationIteration:null,topAnimationStart:null,topBlur:null,topCanPlay:null,topCanPlayThrough:null,topChange:null,topClick:null,topCompositionEnd:null,topCompositionStart:null,topCompositionUpdate:null,topContextMenu:null,topCopy:null,topCut:null,topDoubleClick:null,topDrag:null,topDragEnd:null,topDragEnter:null,topDragExit:null,topDragLeave:null,topDragOver:null,topDragStart:null,topDrop:null,topDurationChange:null,topEmptied:null,topEncrypted:null,topEnded:null,topError:null,topFocus:null,topInput:null,topInvalid:null,topKeyDown:null,topKeyPress:null,topKeyUp:null,topLoad:null,topLoadedData:null,topLoadedMetadata:null,topLoadStart:null,topMouseDown:null,topMouseMove:null,topMouseOut:null,topMouseOver:null,topMouseUp:null,topPaste:null,topPause:null,topPlay:null,topPlaying:null,topProgress:null,topRateChange:null,topReset:null,topScroll:null,topSeeked:null,topSeeking:null,topSelectionChange:null,topStalled:null,topSubmit:null,topSuspend:null,topTextInput:null,topTimeUpdate:null,topTouchCancel:null,topTouchEnd:null,topTouchMove:null,topTouchStart:null,topTransitionEnd:null,topVolumeChange:null,topWaiting:null,topWheel:null}),EventConstants={topLevelTypes:topLevelTypes,PropagationPhases:PropagationPhases};module.exports=EventConstants; -},{"fbjs/lib/keyMirror":229}],93:[function(require,module,exports){ -"use strict";var EventPluginRegistry=require("./EventPluginRegistry"),EventPluginUtils=require("./EventPluginUtils"),ReactErrorUtils=require("./ReactErrorUtils"),accumulateInto=require("./accumulateInto"),forEachAccumulated=require("./forEachAccumulated"),invariant=require("fbjs/lib/invariant"),listenerBank={},eventQueue=null,executeDispatchesAndRelease=function(e,t){e&&(EventPluginUtils.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},executeDispatchesAndReleaseSimulated=function(e){return executeDispatchesAndRelease(e,!0)},executeDispatchesAndReleaseTopLevel=function(e){return executeDispatchesAndRelease(e,!1)},EventPluginHub={injection:{injectEventPluginOrder:EventPluginRegistry.injectEventPluginOrder,injectEventPluginsByName:EventPluginRegistry.injectEventPluginsByName},putListener:function(e,t,n){"function"!=typeof n?invariant(!1):void 0;var i=listenerBank[t]||(listenerBank[t]={});i[e._rootNodeID]=n;var r=EventPluginRegistry.registrationNameModules[t];r&&r.didPutListener&&r.didPutListener(e,t,n)},getListener:function(e,t){var n=listenerBank[t];return n&&n[e._rootNodeID]},deleteListener:function(e,t){var n=EventPluginRegistry.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var i=listenerBank[t];i&&delete i[e._rootNodeID]},deleteAllListeners:function(e){for(var t in listenerBank)if(listenerBank[t][e._rootNodeID]){var n=EventPluginRegistry.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t),delete listenerBank[t][e._rootNodeID]}},extractEvents:function(e,t,n,i){for(var r,u=EventPluginRegistry.plugins,l=0;l<u.length;l++){var s=u[l];if(s){var a=s.extractEvents(e,t,n,i);a&&(r=accumulateInto(r,a))}}return r},enqueueEvents:function(e){e&&(eventQueue=accumulateInto(eventQueue,e))},processEventQueue:function(e){var t=eventQueue;eventQueue=null,e?forEachAccumulated(t,executeDispatchesAndReleaseSimulated):forEachAccumulated(t,executeDispatchesAndReleaseTopLevel),eventQueue?invariant(!1):void 0,ReactErrorUtils.rethrowCaughtError()},__purge:function(){listenerBank={}},__getListenerBank:function(){return listenerBank}};module.exports=EventPluginHub; +},{"fbjs/lib/keyMirror":227}],92:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),EventPluginRegistry=require("./EventPluginRegistry"),EventPluginUtils=require("./EventPluginUtils"),ReactErrorUtils=require("./ReactErrorUtils"),accumulateInto=require("./accumulateInto"),forEachAccumulated=require("./forEachAccumulated"),invariant=require("fbjs/lib/invariant"),listenerBank={},eventQueue=null,executeDispatchesAndRelease=function(e,t){e&&(EventPluginUtils.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},executeDispatchesAndReleaseSimulated=function(e){return executeDispatchesAndRelease(e,!0)},executeDispatchesAndReleaseTopLevel=function(e){return executeDispatchesAndRelease(e,!1)},EventPluginHub={injection:{injectEventPluginOrder:EventPluginRegistry.injectEventPluginOrder,injectEventPluginsByName:EventPluginRegistry.injectEventPluginsByName},putListener:function(e,t,n){"function"!=typeof n?_prodInvariant("94",t,typeof n):void 0;var r=listenerBank[t]||(listenerBank[t]={});r[e._rootNodeID]=n;var i=EventPluginRegistry.registrationNameModules[t];i&&i.didPutListener&&i.didPutListener(e,t,n)},getListener:function(e,t){var n=listenerBank[t];return n&&n[e._rootNodeID]},deleteListener:function(e,t){var n=EventPluginRegistry.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var r=listenerBank[t];r&&delete r[e._rootNodeID]},deleteAllListeners:function(e){for(var t in listenerBank)if(listenerBank.hasOwnProperty(t)&&listenerBank[t][e._rootNodeID]){var n=EventPluginRegistry.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t),delete listenerBank[t][e._rootNodeID]}},extractEvents:function(e,t,n,r){for(var i,u=EventPluginRegistry.plugins,a=0;a<u.length;a++){var s=u[a];if(s){var l=s.extractEvents(e,t,n,r);l&&(i=accumulateInto(i,l))}}return i},enqueueEvents:function(e){e&&(eventQueue=accumulateInto(eventQueue,e))},processEventQueue:function(e){var t=eventQueue;eventQueue=null,e?forEachAccumulated(t,executeDispatchesAndReleaseSimulated):forEachAccumulated(t,executeDispatchesAndReleaseTopLevel),eventQueue?_prodInvariant("95"):void 0,ReactErrorUtils.rethrowCaughtError()},__purge:function(){listenerBank={}},__getListenerBank:function(){return listenerBank}};module.exports=EventPluginHub; -},{"./EventPluginRegistry":94,"./EventPluginUtils":95,"./ReactErrorUtils":138,"./accumulateInto":182,"./forEachAccumulated":190,"fbjs/lib/invariant":226}],94:[function(require,module,exports){ -"use strict";function recomputePluginOrdering(){if(EventPluginOrder)for(var e in namesToPlugins){var n=namesToPlugins[e],i=EventPluginOrder.indexOf(e);if(i>-1?void 0:invariant(!1),!EventPluginRegistry.plugins[i]){n.extractEvents?void 0:invariant(!1),EventPluginRegistry.plugins[i]=n;var r=n.eventTypes;for(var t in r)publishEventForPlugin(r[t],n,t)?void 0:invariant(!1)}}}function publishEventForPlugin(e,n,i){EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(i)?invariant(!1):void 0,EventPluginRegistry.eventNameDispatchConfigs[i]=e;var r=e.phasedRegistrationNames;if(r){for(var t in r)if(r.hasOwnProperty(t)){var a=r[t];publishRegistrationName(a,n,i)}return!0}return!!e.registrationName&&(publishRegistrationName(e.registrationName,n,i),!0)}function publishRegistrationName(e,n,i){EventPluginRegistry.registrationNameModules[e]?invariant(!1):void 0,EventPluginRegistry.registrationNameModules[e]=n,EventPluginRegistry.registrationNameDependencies[e]=n.eventTypes[i].dependencies}var invariant=require("fbjs/lib/invariant"),EventPluginOrder=null,namesToPlugins={},EventPluginRegistry={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){EventPluginOrder?invariant(!1):void 0,EventPluginOrder=Array.prototype.slice.call(e),recomputePluginOrdering()},injectEventPluginsByName:function(e){var n=!1;for(var i in e)if(e.hasOwnProperty(i)){var r=e[i];namesToPlugins.hasOwnProperty(i)&&namesToPlugins[i]===r||(namesToPlugins[i]?invariant(!1):void 0,namesToPlugins[i]=r,n=!0)}n&&recomputePluginOrdering()},getPluginModuleForEvent:function(e){var n=e.dispatchConfig;if(n.registrationName)return EventPluginRegistry.registrationNameModules[n.registrationName]||null;for(var i in n.phasedRegistrationNames)if(n.phasedRegistrationNames.hasOwnProperty(i)){var r=EventPluginRegistry.registrationNameModules[n.phasedRegistrationNames[i]];if(r)return r}return null},_resetEventPlugins:function(){EventPluginOrder=null;for(var e in namesToPlugins)namesToPlugins.hasOwnProperty(e)&&delete namesToPlugins[e];EventPluginRegistry.plugins.length=0;var n=EventPluginRegistry.eventNameDispatchConfigs;for(var i in n)n.hasOwnProperty(i)&&delete n[i];var r=EventPluginRegistry.registrationNameModules;for(var t in r)r.hasOwnProperty(t)&&delete r[t]}};module.exports=EventPluginRegistry; +},{"./EventPluginRegistry":93,"./EventPluginUtils":94,"./ReactErrorUtils":133,"./accumulateInto":178,"./forEachAccumulated":187,"./reactProdInvariant":202,"fbjs/lib/invariant":224}],93:[function(require,module,exports){ +"use strict";function recomputePluginOrdering(){if(EventPluginOrder)for(var e in namesToPlugins){var n=namesToPlugins[e],i=EventPluginOrder.indexOf(e);if(i>-1?void 0:_prodInvariant("96",e),!EventPluginRegistry.plugins[i]){n.extractEvents?void 0:_prodInvariant("97",e),EventPluginRegistry.plugins[i]=n;var r=n.eventTypes;for(var t in r)publishEventForPlugin(r[t],n,t)?void 0:_prodInvariant("98",t,e)}}}function publishEventForPlugin(e,n,i){EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(i)?_prodInvariant("99",i):void 0,EventPluginRegistry.eventNameDispatchConfigs[i]=e;var r=e.phasedRegistrationNames;if(r){for(var t in r)if(r.hasOwnProperty(t)){var a=r[t];publishRegistrationName(a,n,i)}return!0}return!!e.registrationName&&(publishRegistrationName(e.registrationName,n,i),!0)}function publishRegistrationName(e,n,i){EventPluginRegistry.registrationNameModules[e]?_prodInvariant("100",e):void 0,EventPluginRegistry.registrationNameModules[e]=n,EventPluginRegistry.registrationNameDependencies[e]=n.eventTypes[i].dependencies}var _prodInvariant=require("./reactProdInvariant"),invariant=require("fbjs/lib/invariant"),EventPluginOrder=null,namesToPlugins={},EventPluginRegistry={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){EventPluginOrder?_prodInvariant("101"):void 0,EventPluginOrder=Array.prototype.slice.call(e),recomputePluginOrdering()},injectEventPluginsByName:function(e){var n=!1;for(var i in e)if(e.hasOwnProperty(i)){var r=e[i];namesToPlugins.hasOwnProperty(i)&&namesToPlugins[i]===r||(namesToPlugins[i]?_prodInvariant("102",i):void 0,namesToPlugins[i]=r,n=!0)}n&&recomputePluginOrdering()},getPluginModuleForEvent:function(e){var n=e.dispatchConfig;if(n.registrationName)return EventPluginRegistry.registrationNameModules[n.registrationName]||null;for(var i in n.phasedRegistrationNames)if(n.phasedRegistrationNames.hasOwnProperty(i)){var r=EventPluginRegistry.registrationNameModules[n.phasedRegistrationNames[i]];if(r)return r}return null},_resetEventPlugins:function(){EventPluginOrder=null;for(var e in namesToPlugins)namesToPlugins.hasOwnProperty(e)&&delete namesToPlugins[e];EventPluginRegistry.plugins.length=0;var n=EventPluginRegistry.eventNameDispatchConfigs;for(var i in n)n.hasOwnProperty(i)&&delete n[i];var r=EventPluginRegistry.registrationNameModules;for(var t in r)r.hasOwnProperty(t)&&delete r[t]}};module.exports=EventPluginRegistry; -},{"fbjs/lib/invariant":226}],95:[function(require,module,exports){ -"use strict";function isEndish(e){return e===topLevelTypes.topMouseUp||e===topLevelTypes.topTouchEnd||e===topLevelTypes.topTouchCancel}function isMoveish(e){return e===topLevelTypes.topMouseMove||e===topLevelTypes.topTouchMove}function isStartish(e){return e===topLevelTypes.topMouseDown||e===topLevelTypes.topTouchStart}function executeDispatch(e,t,r,n){var s=e.type||"unknown-event";e.currentTarget=EventPluginUtils.getNodeFromInstance(n),t?ReactErrorUtils.invokeGuardedCallbackWithCatch(s,r,e):ReactErrorUtils.invokeGuardedCallback(s,r,e),e.currentTarget=null}function executeDispatchesInOrder(e,t){var r=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(r))for(var s=0;s<r.length&&!e.isPropagationStopped();s++)executeDispatch(e,t,r[s],n[s]);else r&&executeDispatch(e,t,r,n);e._dispatchListeners=null,e._dispatchInstances=null}function executeDispatchesInOrderStopAtTrueImpl(e){var t=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(t)){for(var n=0;n<t.length&&!e.isPropagationStopped();n++)if(t[n](e,r[n]))return r[n]}else if(t&&t(e,r))return r;return null}function executeDispatchesInOrderStopAtTrue(e){var t=executeDispatchesInOrderStopAtTrueImpl(e);return e._dispatchInstances=null,e._dispatchListeners=null,t}function executeDirectDispatch(e){var t=e._dispatchListeners,r=e._dispatchInstances;Array.isArray(t)?invariant(!1):void 0,e.currentTarget=t?EventPluginUtils.getNodeFromInstance(r):null;var n=t?t(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,n}function hasDispatches(e){return!!e._dispatchListeners}var EventConstants=require("./EventConstants"),ReactErrorUtils=require("./ReactErrorUtils"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),ComponentTree,TreeTraversal,injection={injectComponentTree:function(e){ComponentTree=e},injectTreeTraversal:function(e){TreeTraversal=e}},topLevelTypes=EventConstants.topLevelTypes,validateEventDispatches,EventPluginUtils={isEndish:isEndish,isMoveish:isMoveish,isStartish:isStartish,executeDirectDispatch:executeDirectDispatch,executeDispatchesInOrder:executeDispatchesInOrder,executeDispatchesInOrderStopAtTrue:executeDispatchesInOrderStopAtTrue,hasDispatches:hasDispatches,getInstanceFromNode:function(e){return ComponentTree.getInstanceFromNode(e)},getNodeFromInstance:function(e){return ComponentTree.getNodeFromInstance(e)},isAncestor:function(e,t){return TreeTraversal.isAncestor(e,t)},getLowestCommonAncestor:function(e,t){return TreeTraversal.getLowestCommonAncestor(e,t)},getParentInstance:function(e){return TreeTraversal.getParentInstance(e)},traverseTwoPhase:function(e,t,r){return TreeTraversal.traverseTwoPhase(e,t,r)},traverseEnterLeave:function(e,t,r,n,s){return TreeTraversal.traverseEnterLeave(e,t,r,n,s)},injection:injection};module.exports=EventPluginUtils; +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224}],94:[function(require,module,exports){ +"use strict";function isEndish(e){return e===topLevelTypes.topMouseUp||e===topLevelTypes.topTouchEnd||e===topLevelTypes.topTouchCancel}function isMoveish(e){return e===topLevelTypes.topMouseMove||e===topLevelTypes.topTouchMove}function isStartish(e){return e===topLevelTypes.topMouseDown||e===topLevelTypes.topTouchStart}function executeDispatch(e,t,r,n){var s=e.type||"unknown-event";e.currentTarget=EventPluginUtils.getNodeFromInstance(n),t?ReactErrorUtils.invokeGuardedCallbackWithCatch(s,r,e):ReactErrorUtils.invokeGuardedCallback(s,r,e),e.currentTarget=null}function executeDispatchesInOrder(e,t){var r=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(r))for(var s=0;s<r.length&&!e.isPropagationStopped();s++)executeDispatch(e,t,r[s],n[s]);else r&&executeDispatch(e,t,r,n);e._dispatchListeners=null,e._dispatchInstances=null}function executeDispatchesInOrderStopAtTrueImpl(e){var t=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(t)){for(var n=0;n<t.length&&!e.isPropagationStopped();n++)if(t[n](e,r[n]))return r[n]}else if(t&&t(e,r))return r;return null}function executeDispatchesInOrderStopAtTrue(e){var t=executeDispatchesInOrderStopAtTrueImpl(e);return e._dispatchInstances=null,e._dispatchListeners=null,t}function executeDirectDispatch(e){var t=e._dispatchListeners,r=e._dispatchInstances;Array.isArray(t)?_prodInvariant("103"):void 0,e.currentTarget=t?EventPluginUtils.getNodeFromInstance(r):null;var n=t?t(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,n}function hasDispatches(e){return!!e._dispatchListeners}var _prodInvariant=require("./reactProdInvariant"),EventConstants=require("./EventConstants"),ReactErrorUtils=require("./ReactErrorUtils"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),ComponentTree,TreeTraversal,injection={injectComponentTree:function(e){ComponentTree=e},injectTreeTraversal:function(e){TreeTraversal=e}},topLevelTypes=EventConstants.topLevelTypes,validateEventDispatches,EventPluginUtils={isEndish:isEndish,isMoveish:isMoveish,isStartish:isStartish,executeDirectDispatch:executeDirectDispatch,executeDispatchesInOrder:executeDispatchesInOrder,executeDispatchesInOrderStopAtTrue:executeDispatchesInOrderStopAtTrue,hasDispatches:hasDispatches,getInstanceFromNode:function(e){return ComponentTree.getInstanceFromNode(e)},getNodeFromInstance:function(e){return ComponentTree.getNodeFromInstance(e)},isAncestor:function(e,t){return TreeTraversal.isAncestor(e,t)},getLowestCommonAncestor:function(e,t){return TreeTraversal.getLowestCommonAncestor(e,t)},getParentInstance:function(e){return TreeTraversal.getParentInstance(e)},traverseTwoPhase:function(e,t,r){return TreeTraversal.traverseTwoPhase(e,t,r)},traverseEnterLeave:function(e,t,r,n,s){return TreeTraversal.traverseEnterLeave(e,t,r,n,s)},injection:injection};module.exports=EventPluginUtils; -},{"./EventConstants":92,"./ReactErrorUtils":138,"fbjs/lib/invariant":226,"fbjs/lib/warning":236}],96:[function(require,module,exports){ +},{"./EventConstants":91,"./ReactErrorUtils":133,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232}],95:[function(require,module,exports){ "use strict";function listenerAtPhase(e,t,a){var s=t.dispatchConfig.phasedRegistrationNames[a];return getListener(e,s)}function accumulateDirectionalDispatches(e,t,a){var s=t?PropagationPhases.bubbled:PropagationPhases.captured,c=listenerAtPhase(e,a,s);c&&(a._dispatchListeners=accumulateInto(a._dispatchListeners,c),a._dispatchInstances=accumulateInto(a._dispatchInstances,e))}function accumulateTwoPhaseDispatchesSingle(e){e&&e.dispatchConfig.phasedRegistrationNames&&EventPluginUtils.traverseTwoPhase(e._targetInst,accumulateDirectionalDispatches,e)}function accumulateTwoPhaseDispatchesSingleSkipTarget(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst,a=t?EventPluginUtils.getParentInstance(t):null;EventPluginUtils.traverseTwoPhase(a,accumulateDirectionalDispatches,e)}}function accumulateDispatches(e,t,a){if(a&&a.dispatchConfig.registrationName){var s=a.dispatchConfig.registrationName,c=getListener(e,s);c&&(a._dispatchListeners=accumulateInto(a._dispatchListeners,c),a._dispatchInstances=accumulateInto(a._dispatchInstances,e))}}function accumulateDirectDispatchesSingle(e){e&&e.dispatchConfig.registrationName&&accumulateDispatches(e._targetInst,null,e)}function accumulateTwoPhaseDispatches(e){forEachAccumulated(e,accumulateTwoPhaseDispatchesSingle)}function accumulateTwoPhaseDispatchesSkipTarget(e){forEachAccumulated(e,accumulateTwoPhaseDispatchesSingleSkipTarget)}function accumulateEnterLeaveDispatches(e,t,a,s){EventPluginUtils.traverseEnterLeave(a,s,accumulateDispatches,e,t)}function accumulateDirectDispatches(e){forEachAccumulated(e,accumulateDirectDispatchesSingle)}var EventConstants=require("./EventConstants"),EventPluginHub=require("./EventPluginHub"),EventPluginUtils=require("./EventPluginUtils"),accumulateInto=require("./accumulateInto"),forEachAccumulated=require("./forEachAccumulated"),warning=require("fbjs/lib/warning"),PropagationPhases=EventConstants.PropagationPhases,getListener=EventPluginHub.getListener,EventPropagators={accumulateTwoPhaseDispatches:accumulateTwoPhaseDispatches,accumulateTwoPhaseDispatchesSkipTarget:accumulateTwoPhaseDispatchesSkipTarget,accumulateDirectDispatches:accumulateDirectDispatches,accumulateEnterLeaveDispatches:accumulateEnterLeaveDispatches};module.exports=EventPropagators; -},{"./EventConstants":92,"./EventPluginHub":93,"./EventPluginUtils":95,"./accumulateInto":182,"./forEachAccumulated":190,"fbjs/lib/warning":236}],97:[function(require,module,exports){ +},{"./EventConstants":91,"./EventPluginHub":92,"./EventPluginUtils":94,"./accumulateInto":178,"./forEachAccumulated":187,"fbjs/lib/warning":232}],96:[function(require,module,exports){ "use strict";function FallbackCompositionState(t){this._root=t,this._startText=this.getText(),this._fallbackText=null}var _assign=require("object-assign"),PooledClass=require("./PooledClass"),getTextContentAccessor=require("./getTextContentAccessor");_assign(FallbackCompositionState.prototype,{destructor:function(){this._root=null,this._startText=null,this._fallbackText=null},getText:function(){return"value"in this._root?this._root.value:this._root[getTextContentAccessor()]},getData:function(){if(this._fallbackText)return this._fallbackText;var t,e,o=this._startText,s=o.length,a=this.getText(),l=a.length;for(t=0;t<s&&o[t]===a[t];t++);var i=s-t;for(e=1;e<=i&&o[s-e]===a[l-e];e++);var r=e>1?1-e:void 0;return this._fallbackText=a.slice(t,r),this._fallbackText}}),PooledClass.addPoolingTo(FallbackCompositionState),module.exports=FallbackCompositionState; -},{"./PooledClass":101,"./getTextContentAccessor":198,"object-assign":32}],98:[function(require,module,exports){ -"use strict";var DOMProperty=require("./DOMProperty"),MUST_USE_PROPERTY=DOMProperty.injection.MUST_USE_PROPERTY,HAS_BOOLEAN_VALUE=DOMProperty.injection.HAS_BOOLEAN_VALUE,HAS_SIDE_EFFECTS=DOMProperty.injection.HAS_SIDE_EFFECTS,HAS_NUMERIC_VALUE=DOMProperty.injection.HAS_NUMERIC_VALUE,HAS_POSITIVE_NUMERIC_VALUE=DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE,HAS_OVERLOADED_BOOLEAN_VALUE=DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE,HTMLDOMPropertyConfig={isCustomAttribute:RegExp.prototype.test.bind(new RegExp("^(data|aria)-["+DOMProperty.ATTRIBUTE_NAME_CHAR+"]*$")),Properties:{accept:0,acceptCharset:0,accessKey:0,action:0,allowFullScreen:HAS_BOOLEAN_VALUE,allowTransparency:0,alt:0,async:HAS_BOOLEAN_VALUE,autoComplete:0,autoPlay:HAS_BOOLEAN_VALUE,capture:HAS_BOOLEAN_VALUE,cellPadding:0,cellSpacing:0,charSet:0,challenge:0,checked:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,cite:0,classID:0,className:0,cols:HAS_POSITIVE_NUMERIC_VALUE,colSpan:0,content:0,contentEditable:0,contextMenu:0,controls:HAS_BOOLEAN_VALUE,coords:0,crossOrigin:0,data:0,dateTime:0,"default":HAS_BOOLEAN_VALUE,defer:HAS_BOOLEAN_VALUE,dir:0,disabled:HAS_BOOLEAN_VALUE,download:HAS_OVERLOADED_BOOLEAN_VALUE,draggable:0,encType:0,form:0,formAction:0,formEncType:0,formMethod:0,formNoValidate:HAS_BOOLEAN_VALUE,formTarget:0,frameBorder:0,headers:0,height:0,hidden:HAS_BOOLEAN_VALUE,high:0,href:0,hrefLang:0,htmlFor:0,httpEquiv:0,icon:0,id:0,inputMode:0,integrity:0,is:0,keyParams:0,keyType:0,kind:0,label:0,lang:0,list:0,loop:HAS_BOOLEAN_VALUE,low:0,manifest:0,marginHeight:0,marginWidth:0,max:0,maxLength:0,media:0,mediaGroup:0,method:0,min:0,minLength:0,multiple:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,muted:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,name:0,nonce:0,noValidate:HAS_BOOLEAN_VALUE,open:HAS_BOOLEAN_VALUE,optimum:0,pattern:0,placeholder:0,poster:0,preload:0,profile:0,radioGroup:0,readOnly:HAS_BOOLEAN_VALUE,rel:0,required:HAS_BOOLEAN_VALUE,reversed:HAS_BOOLEAN_VALUE,role:0,rows:HAS_POSITIVE_NUMERIC_VALUE,rowSpan:HAS_NUMERIC_VALUE,sandbox:0,scope:0,scoped:HAS_BOOLEAN_VALUE,scrolling:0,seamless:HAS_BOOLEAN_VALUE,selected:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,shape:0,size:HAS_POSITIVE_NUMERIC_VALUE,sizes:0,span:HAS_POSITIVE_NUMERIC_VALUE,spellCheck:0,src:0,srcDoc:0,srcLang:0,srcSet:0,start:HAS_NUMERIC_VALUE,step:0,style:0,summary:0,tabIndex:0,target:0,title:0,type:0,useMap:0,value:MUST_USE_PROPERTY|HAS_SIDE_EFFECTS,width:0,wmode:0,wrap:0,about:0,datatype:0,inlist:0,prefix:0,property:0,resource:0,"typeof":0,vocab:0,autoCapitalize:0,autoCorrect:0,autoSave:0,color:0,itemProp:0,itemScope:HAS_BOOLEAN_VALUE,itemType:0,itemID:0,itemRef:0,results:0,security:0,unselectable:0},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{}};module.exports=HTMLDOMPropertyConfig; +},{"./PooledClass":100,"./getTextContentAccessor":195,"object-assign":31}],97:[function(require,module,exports){ +"use strict";var DOMProperty=require("./DOMProperty"),MUST_USE_PROPERTY=DOMProperty.injection.MUST_USE_PROPERTY,HAS_BOOLEAN_VALUE=DOMProperty.injection.HAS_BOOLEAN_VALUE,HAS_NUMERIC_VALUE=DOMProperty.injection.HAS_NUMERIC_VALUE,HAS_POSITIVE_NUMERIC_VALUE=DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE,HAS_OVERLOADED_BOOLEAN_VALUE=DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE,HTMLDOMPropertyConfig={isCustomAttribute:RegExp.prototype.test.bind(new RegExp("^(data|aria)-["+DOMProperty.ATTRIBUTE_NAME_CHAR+"]*$")),Properties:{accept:0,acceptCharset:0,accessKey:0,action:0,allowFullScreen:HAS_BOOLEAN_VALUE,allowTransparency:0,alt:0,async:HAS_BOOLEAN_VALUE,autoComplete:0,autoPlay:HAS_BOOLEAN_VALUE,capture:HAS_BOOLEAN_VALUE,cellPadding:0,cellSpacing:0,charSet:0,challenge:0,checked:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,cite:0,classID:0,className:0,cols:HAS_POSITIVE_NUMERIC_VALUE,colSpan:0,content:0,contentEditable:0,contextMenu:0,controls:HAS_BOOLEAN_VALUE,coords:0,crossOrigin:0,data:0,dateTime:0,default:HAS_BOOLEAN_VALUE,defer:HAS_BOOLEAN_VALUE,dir:0,disabled:HAS_BOOLEAN_VALUE,download:HAS_OVERLOADED_BOOLEAN_VALUE,draggable:0,encType:0,form:0,formAction:0,formEncType:0,formMethod:0,formNoValidate:HAS_BOOLEAN_VALUE,formTarget:0,frameBorder:0,headers:0,height:0,hidden:HAS_BOOLEAN_VALUE,high:0,href:0,hrefLang:0,htmlFor:0,httpEquiv:0,icon:0,id:0,inputMode:0,integrity:0,is:0,keyParams:0,keyType:0,kind:0,label:0,lang:0,list:0,loop:HAS_BOOLEAN_VALUE,low:0,manifest:0,marginHeight:0,marginWidth:0,max:0,maxLength:0,media:0,mediaGroup:0,method:0,min:0,minLength:0,multiple:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,muted:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,name:0,nonce:0,noValidate:HAS_BOOLEAN_VALUE,open:HAS_BOOLEAN_VALUE,optimum:0,pattern:0,placeholder:0,poster:0,preload:0,profile:0,radioGroup:0,readOnly:HAS_BOOLEAN_VALUE,rel:0,required:HAS_BOOLEAN_VALUE,reversed:HAS_BOOLEAN_VALUE,role:0,rows:HAS_POSITIVE_NUMERIC_VALUE,rowSpan:HAS_NUMERIC_VALUE,sandbox:0,scope:0,scoped:HAS_BOOLEAN_VALUE,scrolling:0,seamless:HAS_BOOLEAN_VALUE,selected:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,shape:0,size:HAS_POSITIVE_NUMERIC_VALUE,sizes:0,span:HAS_POSITIVE_NUMERIC_VALUE,spellCheck:0,src:0,srcDoc:0,srcLang:0,srcSet:0,start:HAS_NUMERIC_VALUE,step:0,style:0,summary:0,tabIndex:0,target:0,title:0,type:0,useMap:0,value:0,width:0,wmode:0,wrap:0,about:0,datatype:0,inlist:0,prefix:0,property:0,resource:0,typeof:0,vocab:0,autoCapitalize:0,autoCorrect:0,autoSave:0,color:0,itemProp:0,itemScope:HAS_BOOLEAN_VALUE,itemType:0,itemID:0,itemRef:0,results:0,security:0,unselectable:0},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{}};module.exports=HTMLDOMPropertyConfig; -},{"./DOMProperty":86}],99:[function(require,module,exports){ +},{"./DOMProperty":85}],98:[function(require,module,exports){ "use strict";function escape(e){var n=/[=:]/g,r={"=":"=0",":":"=2"},s=(""+e).replace(n,function(e){return r[e]});return"$"+s}function unescape(e){var n=/(=0|=2)/g,r={"=0":"=","=2":":"},s="."===e[0]&&"$"===e[1]?e.substring(2):e.substring(1);return(""+s).replace(n,function(e){return r[e]})}var KeyEscapeUtils={escape:escape,unescape:unescape};module.exports=KeyEscapeUtils; -},{}],100:[function(require,module,exports){ -"use strict";function _assertSingleLink(e){null!=e.checkedLink&&null!=e.valueLink?invariant(!1):void 0}function _assertValueLink(e){_assertSingleLink(e),null!=e.value||null!=e.onChange?invariant(!1):void 0}function _assertCheckedLink(e){_assertSingleLink(e),null!=e.checked||null!=e.onChange?invariant(!1):void 0}function getDeclarationErrorAddendum(e){if(e){var n=e.getName();if(n)return" Check the render method of `"+n+"`."}return""}var ReactPropTypes=require("./ReactPropTypes"),ReactPropTypeLocations=require("./ReactPropTypeLocations"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),hasReadOnlyValue={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},propTypes={value:function(e,n,a){return!e[n]||hasReadOnlyValue[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,n,a){return!e[n]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:ReactPropTypes.func},loggedTypeFailures={},LinkedValueUtils={checkPropTypes:function(e,n,a){for(var r in propTypes){if(propTypes.hasOwnProperty(r))var i=propTypes[r](n,r,e,ReactPropTypeLocations.prop);if(i instanceof Error&&!(i.message in loggedTypeFailures)){loggedTypeFailures[i.message]=!0;getDeclarationErrorAddendum(a)}}},getValue:function(e){return e.valueLink?(_assertValueLink(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(_assertCheckedLink(e),e.checkedLink.value):e.checked},executeOnChange:function(e,n){return e.valueLink?(_assertValueLink(e),e.valueLink.requestChange(n.target.value)):e.checkedLink?(_assertCheckedLink(e),e.checkedLink.requestChange(n.target.checked)):e.onChange?e.onChange.call(void 0,n):void 0}};module.exports=LinkedValueUtils; +},{}],99:[function(require,module,exports){ +"use strict";function _assertSingleLink(e){null!=e.checkedLink&&null!=e.valueLink?_prodInvariant("87"):void 0}function _assertValueLink(e){_assertSingleLink(e),null!=e.value||null!=e.onChange?_prodInvariant("88"):void 0}function _assertCheckedLink(e){_assertSingleLink(e),null!=e.checked||null!=e.onChange?_prodInvariant("89"):void 0}function getDeclarationErrorAddendum(e){if(e){var n=e.getName();if(n)return" Check the render method of `"+n+"`."}return""}var _prodInvariant=require("./reactProdInvariant"),ReactPropTypes=require("./ReactPropTypes"),ReactPropTypeLocations=require("./ReactPropTypeLocations"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),hasReadOnlyValue={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},propTypes={value:function(e,n,r){return!e[n]||hasReadOnlyValue[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,n,r){return!e[n]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:ReactPropTypes.func},loggedTypeFailures={},LinkedValueUtils={checkPropTypes:function(e,n,r){for(var a in propTypes){if(propTypes.hasOwnProperty(a))var i=propTypes[a](n,a,e,ReactPropTypeLocations.prop);if(i instanceof Error&&!(i.message in loggedTypeFailures)){loggedTypeFailures[i.message]=!0;getDeclarationErrorAddendum(r)}}},getValue:function(e){return e.valueLink?(_assertValueLink(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(_assertCheckedLink(e),e.checkedLink.value):e.checked},executeOnChange:function(e,n){return e.valueLink?(_assertValueLink(e),e.valueLink.requestChange(n.target.value)):e.checkedLink?(_assertCheckedLink(e),e.checkedLink.requestChange(n.target.checked)):e.onChange?e.onChange.call(void 0,n):void 0}};module.exports=LinkedValueUtils; -},{"./ReactPropTypeLocations":155,"./ReactPropTypes":156,"fbjs/lib/invariant":226,"fbjs/lib/warning":236}],101:[function(require,module,exports){ -"use strict";var invariant=require("fbjs/lib/invariant"),oneArgumentPooler=function(o){var e=this;if(e.instancePool.length){var n=e.instancePool.pop();return e.call(n,o),n}return new e(o)},twoArgumentPooler=function(o,e){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,o,e),r}return new n(o,e)},threeArgumentPooler=function(o,e,n){var r=this;if(r.instancePool.length){var t=r.instancePool.pop();return r.call(t,o,e,n),t}return new r(o,e,n)},fourArgumentPooler=function(o,e,n,r){var t=this;if(t.instancePool.length){var l=t.instancePool.pop();return t.call(l,o,e,n,r),l}return new t(o,e,n,r)},fiveArgumentPooler=function(o,e,n,r,t){var l=this;if(l.instancePool.length){var i=l.instancePool.pop();return l.call(i,o,e,n,r,t),i}return new l(o,e,n,r,t)},standardReleaser=function(o){var e=this;o instanceof e?void 0:invariant(!1),o.destructor(),e.instancePool.length<e.poolSize&&e.instancePool.push(o)},DEFAULT_POOL_SIZE=10,DEFAULT_POOLER=oneArgumentPooler,addPoolingTo=function(o,e){var n=o;return n.instancePool=[],n.getPooled=e||DEFAULT_POOLER,n.poolSize||(n.poolSize=DEFAULT_POOL_SIZE),n.release=standardReleaser,n},PooledClass={addPoolingTo:addPoolingTo,oneArgumentPooler:oneArgumentPooler,twoArgumentPooler:twoArgumentPooler,threeArgumentPooler:threeArgumentPooler,fourArgumentPooler:fourArgumentPooler,fiveArgumentPooler:fiveArgumentPooler};module.exports=PooledClass; +},{"./ReactPropTypeLocations":150,"./ReactPropTypes":151,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232}],100:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),invariant=require("fbjs/lib/invariant"),oneArgumentPooler=function(o){var e=this;if(e.instancePool.length){var n=e.instancePool.pop();return e.call(n,o),n}return new e(o)},twoArgumentPooler=function(o,e){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,o,e),r}return new n(o,e)},threeArgumentPooler=function(o,e,n){var r=this;if(r.instancePool.length){var t=r.instancePool.pop();return r.call(t,o,e,n),t}return new r(o,e,n)},fourArgumentPooler=function(o,e,n,r){var t=this;if(t.instancePool.length){var l=t.instancePool.pop();return t.call(l,o,e,n,r),l}return new t(o,e,n,r)},fiveArgumentPooler=function(o,e,n,r,t){var l=this;if(l.instancePool.length){var a=l.instancePool.pop();return l.call(a,o,e,n,r,t),a}return new l(o,e,n,r,t)},standardReleaser=function(o){var e=this;o instanceof e?void 0:_prodInvariant("25"),o.destructor(),e.instancePool.length<e.poolSize&&e.instancePool.push(o)},DEFAULT_POOL_SIZE=10,DEFAULT_POOLER=oneArgumentPooler,addPoolingTo=function(o,e){var n=o;return n.instancePool=[],n.getPooled=e||DEFAULT_POOLER,n.poolSize||(n.poolSize=DEFAULT_POOL_SIZE),n.release=standardReleaser,n},PooledClass={addPoolingTo:addPoolingTo,oneArgumentPooler:oneArgumentPooler,twoArgumentPooler:twoArgumentPooler,threeArgumentPooler:threeArgumentPooler,fourArgumentPooler:fourArgumentPooler,fiveArgumentPooler:fiveArgumentPooler};module.exports=PooledClass; -},{"fbjs/lib/invariant":226}],102:[function(require,module,exports){ -"use strict";var _assign=require("object-assign"),ReactChildren=require("./ReactChildren"),ReactComponent=require("./ReactComponent"),ReactClass=require("./ReactClass"),ReactDOMFactories=require("./ReactDOMFactories"),ReactElement=require("./ReactElement"),ReactElementValidator=require("./ReactElementValidator"),ReactPropTypes=require("./ReactPropTypes"),ReactVersion=require("./ReactVersion"),onlyChild=require("./onlyChild"),warning=require("fbjs/lib/warning"),createElement=ReactElement.createElement,createFactory=ReactElement.createFactory,cloneElement=ReactElement.cloneElement,__spread=_assign,warned,React={Children:{map:ReactChildren.map,forEach:ReactChildren.forEach,count:ReactChildren.count,toArray:ReactChildren.toArray,only:onlyChild},Component:ReactComponent,createElement:createElement,cloneElement:cloneElement,isValidElement:ReactElement.isValidElement,PropTypes:ReactPropTypes,createClass:ReactClass.createClass,createFactory:createFactory,createMixin:function(e){return e},DOM:ReactDOMFactories,version:ReactVersion,__spread:__spread};module.exports=React; +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224}],101:[function(require,module,exports){ +"use strict";var _assign=require("object-assign"),ReactChildren=require("./ReactChildren"),ReactComponent=require("./ReactComponent"),ReactClass=require("./ReactClass"),ReactDOMFactories=require("./ReactDOMFactories"),ReactElement=require("./ReactElement"),ReactPropTypes=require("./ReactPropTypes"),ReactVersion=require("./ReactVersion"),onlyChild=require("./onlyChild"),warning=require("fbjs/lib/warning"),createElement=ReactElement.createElement,createFactory=ReactElement.createFactory,cloneElement=ReactElement.cloneElement,ReactElementValidator,__spread=_assign,warned,React={Children:{map:ReactChildren.map,forEach:ReactChildren.forEach,count:ReactChildren.count,toArray:ReactChildren.toArray,only:onlyChild},Component:ReactComponent,createElement:createElement,cloneElement:cloneElement,isValidElement:ReactElement.isValidElement,PropTypes:ReactPropTypes,createClass:ReactClass.createClass,createFactory:createFactory,createMixin:function(e){return e},DOM:ReactDOMFactories,version:ReactVersion,__spread:__spread};module.exports=React; -},{"./ReactChildren":105,"./ReactClass":106,"./ReactComponent":107,"./ReactDOMFactories":120,"./ReactElement":135,"./ReactElementValidator":136,"./ReactPropTypes":156,"./ReactVersion":163,"./onlyChild":203,"fbjs/lib/warning":236,"object-assign":32}],103:[function(require,module,exports){ +},{"./ReactChildren":104,"./ReactClass":105,"./ReactComponent":106,"./ReactDOMFactories":118,"./ReactElement":131,"./ReactPropTypes":151,"./ReactVersion":159,"./onlyChild":200,"fbjs/lib/warning":232,"object-assign":31}],102:[function(require,module,exports){ "use strict";function getListeningForDocument(e){return Object.prototype.hasOwnProperty.call(e,topListenersIDKey)||(e[topListenersIDKey]=reactTopListenersCounter++,alreadyListeningTo[e[topListenersIDKey]]={}),alreadyListeningTo[e[topListenersIDKey]]}var _assign=require("object-assign"),EventConstants=require("./EventConstants"),EventPluginRegistry=require("./EventPluginRegistry"),ReactEventEmitterMixin=require("./ReactEventEmitterMixin"),ViewportMetrics=require("./ViewportMetrics"),getVendorPrefixedEventName=require("./getVendorPrefixedEventName"),isEventSupported=require("./isEventSupported"),hasEventPageXY,alreadyListeningTo={},isMonitoringScrollValue=!1,reactTopListenersCounter=0,topEventMapping={topAbort:"abort",topAnimationEnd:getVendorPrefixedEventName("animationend")||"animationend",topAnimationIteration:getVendorPrefixedEventName("animationiteration")||"animationiteration",topAnimationStart:getVendorPrefixedEventName("animationstart")||"animationstart",topBlur:"blur",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topChange:"change",topClick:"click",topCompositionEnd:"compositionend",topCompositionStart:"compositionstart",topCompositionUpdate:"compositionupdate",topContextMenu:"contextmenu",topCopy:"copy",topCut:"cut",topDoubleClick:"dblclick",topDrag:"drag",topDragEnd:"dragend",topDragEnter:"dragenter",topDragExit:"dragexit",topDragLeave:"dragleave",topDragOver:"dragover",topDragStart:"dragstart",topDrop:"drop",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topFocus:"focus",topInput:"input",topKeyDown:"keydown",topKeyPress:"keypress",topKeyUp:"keyup",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topMouseDown:"mousedown",topMouseMove:"mousemove",topMouseOut:"mouseout",topMouseOver:"mouseover",topMouseUp:"mouseup",topPaste:"paste",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topScroll:"scroll",topSeeked:"seeked",topSeeking:"seeking",topSelectionChange:"selectionchange",topStalled:"stalled",topSuspend:"suspend",topTextInput:"textInput",topTimeUpdate:"timeupdate",topTouchCancel:"touchcancel",topTouchEnd:"touchend",topTouchMove:"touchmove",topTouchStart:"touchstart",topTransitionEnd:getVendorPrefixedEventName("transitionend")||"transitionend",topVolumeChange:"volumechange",topWaiting:"waiting",topWheel:"wheel"},topListenersIDKey="_reactListenersID"+String(Math.random()).slice(2),ReactBrowserEventEmitter=_assign({},ReactEventEmitterMixin,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel),ReactBrowserEventEmitter.ReactEventListener=e}},setEnabled:function(e){ReactBrowserEventEmitter.ReactEventListener&&ReactBrowserEventEmitter.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!ReactBrowserEventEmitter.ReactEventListener||!ReactBrowserEventEmitter.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,o=getListeningForDocument(n),r=EventPluginRegistry.registrationNameDependencies[e],a=EventConstants.topLevelTypes,i=0;i<r.length;i++){var p=r[i];o.hasOwnProperty(p)&&o[p]||(p===a.topWheel?isEventSupported("wheel")?ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(a.topWheel,"wheel",n):isEventSupported("mousewheel")?ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(a.topWheel,"mousewheel",n):ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(a.topWheel,"DOMMouseScroll",n):p===a.topScroll?isEventSupported("scroll",!0)?ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(a.topScroll,"scroll",n):ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(a.topScroll,"scroll",ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE):p===a.topFocus||p===a.topBlur?(isEventSupported("focus",!0)?(ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(a.topFocus,"focus",n),ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(a.topBlur,"blur",n)):isEventSupported("focusin")&&(ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(a.topFocus,"focusin",n),ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(a.topBlur,"focusout",n)),o[a.topBlur]=!0,o[a.topFocus]=!0):topEventMapping.hasOwnProperty(p)&&ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(p,topEventMapping[p],n),o[p]=!0)}},trapBubbledEvent:function(e,t,n){return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(e,t,n)},ensureScrollValueMonitoring:function(){if(void 0===hasEventPageXY&&(hasEventPageXY=document.createEvent&&"pageX"in document.createEvent("MouseEvent")),!hasEventPageXY&&!isMonitoringScrollValue){var e=ViewportMetrics.refreshScrollValues;ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(e),isMonitoringScrollValue=!0}}});module.exports=ReactBrowserEventEmitter; -},{"./EventConstants":92,"./EventPluginRegistry":94,"./ReactEventEmitterMixin":139,"./ViewportMetrics":181,"./getVendorPrefixedEventName":199,"./isEventSupported":201,"object-assign":32}],104:[function(require,module,exports){ -"use strict";function instantiateChild(e,n,t){var r=void 0===e[t];null!=n&&r&&(e[t]=instantiateReactComponent(n))}var ReactReconciler=require("./ReactReconciler"),instantiateReactComponent=require("./instantiateReactComponent"),KeyEscapeUtils=require("./KeyEscapeUtils"),shouldUpdateReactComponent=require("./shouldUpdateReactComponent"),traverseAllChildren=require("./traverseAllChildren"),warning=require("fbjs/lib/warning"),ReactChildReconciler={instantiateChildren:function(e,n,t){if(null==e)return null;var r={};return traverseAllChildren(e,instantiateChild,r),r},updateChildren:function(e,n,t,r,i){if(n||e){var a,o;for(a in n)if(n.hasOwnProperty(a)){o=e&&e[a];var c=o&&o._currentElement,l=n[a];if(null!=o&&shouldUpdateReactComponent(c,l))ReactReconciler.receiveComponent(o,l,r,i),n[a]=o;else{o&&(t[a]=ReactReconciler.getNativeNode(o),ReactReconciler.unmountComponent(o,!1));var u=instantiateReactComponent(l);n[a]=u}}for(a in e)!e.hasOwnProperty(a)||n&&n.hasOwnProperty(a)||(o=e[a],t[a]=ReactReconciler.getNativeNode(o),ReactReconciler.unmountComponent(o,!1))}},unmountChildren:function(e,n){for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];ReactReconciler.unmountComponent(r,n)}}};module.exports=ReactChildReconciler; +},{"./EventConstants":91,"./EventPluginRegistry":93,"./ReactEventEmitterMixin":134,"./ViewportMetrics":177,"./getVendorPrefixedEventName":196,"./isEventSupported":198,"object-assign":31}],103:[function(require,module,exports){ +"use strict";function instantiateChild(e,n,t,r){var i=void 0===e[t];null!=n&&i&&(e[t]=instantiateReactComponent(n,!0))}var ReactReconciler=require("./ReactReconciler"),instantiateReactComponent=require("./instantiateReactComponent"),KeyEscapeUtils=require("./KeyEscapeUtils"),shouldUpdateReactComponent=require("./shouldUpdateReactComponent"),traverseAllChildren=require("./traverseAllChildren"),warning=require("fbjs/lib/warning"),ReactChildReconciler={instantiateChildren:function(e,n,t,r){if(null==e)return null;var i={};return traverseAllChildren(e,instantiateChild,i),i},updateChildren:function(e,n,t,r,i){if(n||e){var o,a;for(o in n)if(n.hasOwnProperty(o)){a=e&&e[o];var c=a&&a._currentElement,l=n[o];if(null!=a&&shouldUpdateReactComponent(c,l))ReactReconciler.receiveComponent(a,l,r,i),n[o]=a;else{a&&(t[o]=ReactReconciler.getHostNode(a),ReactReconciler.unmountComponent(a,!1));var u=instantiateReactComponent(l,!0);n[o]=u}}for(o in e)!e.hasOwnProperty(o)||n&&n.hasOwnProperty(o)||(a=e[o],t[o]=ReactReconciler.getHostNode(a),ReactReconciler.unmountComponent(a,!1))}},unmountChildren:function(e,n){for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];ReactReconciler.unmountComponent(r,n)}}};module.exports=ReactChildReconciler; -},{"./KeyEscapeUtils":99,"./ReactReconciler":158,"./instantiateReactComponent":200,"./shouldUpdateReactComponent":208,"./traverseAllChildren":209,"fbjs/lib/warning":236}],105:[function(require,module,exports){ +},{"./KeyEscapeUtils":98,"./ReactReconciler":153,"./instantiateReactComponent":197,"./shouldUpdateReactComponent":206,"./traverseAllChildren":207,"fbjs/lib/warning":232}],104:[function(require,module,exports){ "use strict";function escapeUserProvidedKey(e){return(""+e).replace(userProvidedKeyEscapeRegex,"$&/")}function ForEachBookKeeping(e,n){this.func=e,this.context=n,this.count=0}function forEachSingleChild(e,n,t){var r=e.func,o=e.context;r.call(o,n,e.count++)}function forEachChildren(e,n,t){if(null==e)return e;var r=ForEachBookKeeping.getPooled(n,t);traverseAllChildren(e,forEachSingleChild,r),ForEachBookKeeping.release(r)}function MapBookKeeping(e,n,t,r){this.result=e,this.keyPrefix=n,this.func=t,this.context=r,this.count=0}function mapSingleChildIntoContext(e,n,t){var r=e.result,o=e.keyPrefix,l=e.func,i=e.context,u=l.call(i,n,e.count++);Array.isArray(u)?mapIntoWithKeyPrefixInternal(u,r,t,emptyFunction.thatReturnsArgument):null!=u&&(ReactElement.isValidElement(u)&&(u=ReactElement.cloneAndReplaceKey(u,o+(!u.key||n&&n.key===u.key?"":escapeUserProvidedKey(u.key)+"/")+t)),r.push(u))}function mapIntoWithKeyPrefixInternal(e,n,t,r,o){var l="";null!=t&&(l=escapeUserProvidedKey(t)+"/");var i=MapBookKeeping.getPooled(n,l,r,o);traverseAllChildren(e,mapSingleChildIntoContext,i),MapBookKeeping.release(i)}function mapChildren(e,n,t){if(null==e)return e;var r=[];return mapIntoWithKeyPrefixInternal(e,r,null,n,t),r}function forEachSingleChildDummy(e,n,t){return null}function countChildren(e,n){return traverseAllChildren(e,forEachSingleChildDummy,null)}function toArray(e){var n=[];return mapIntoWithKeyPrefixInternal(e,n,null,emptyFunction.thatReturnsArgument),n}var PooledClass=require("./PooledClass"),ReactElement=require("./ReactElement"),emptyFunction=require("fbjs/lib/emptyFunction"),traverseAllChildren=require("./traverseAllChildren"),twoArgumentPooler=PooledClass.twoArgumentPooler,fourArgumentPooler=PooledClass.fourArgumentPooler,userProvidedKeyEscapeRegex=/\/+/g;ForEachBookKeeping.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},PooledClass.addPoolingTo(ForEachBookKeeping,twoArgumentPooler),MapBookKeeping.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},PooledClass.addPoolingTo(MapBookKeeping,fourArgumentPooler);var ReactChildren={forEach:forEachChildren,map:mapChildren,mapIntoWithKeyPrefixInternal:mapIntoWithKeyPrefixInternal,count:countChildren,toArray:toArray};module.exports=ReactChildren; -},{"./PooledClass":101,"./ReactElement":135,"./traverseAllChildren":209,"fbjs/lib/emptyFunction":218}],106:[function(require,module,exports){ -"use strict";function validateTypeDef(e,t,n){for(var i in t)t.hasOwnProperty(i)}function validateMethodOverride(e,t){var n=ReactClassInterface.hasOwnProperty(t)?ReactClassInterface[t]:null;ReactClassMixin.hasOwnProperty(t)&&(n!==SpecPolicy.OVERRIDE_BASE?invariant(!1):void 0),e&&(n!==SpecPolicy.DEFINE_MANY&&n!==SpecPolicy.DEFINE_MANY_MERGED?invariant(!1):void 0)}function mixSpecIntoComponent(e,t){if(t){"function"==typeof t?invariant(!1):void 0,ReactElement.isValidElement(t)?invariant(!1):void 0;var n=e.prototype,i=n.__reactAutoBindPairs;t.hasOwnProperty(MIXINS_KEY)&&RESERVED_SPEC_KEYS.mixins(e,t.mixins);for(var o in t)if(t.hasOwnProperty(o)&&o!==MIXINS_KEY){var a=t[o],r=n.hasOwnProperty(o);if(validateMethodOverride(r,o),RESERVED_SPEC_KEYS.hasOwnProperty(o))RESERVED_SPEC_KEYS[o](e,a);else{var c=ReactClassInterface.hasOwnProperty(o),p="function"==typeof a,s=p&&!c&&!r&&t.autobind!==!1;if(s)i.push(o,a),n[o]=a;else if(r){var l=ReactClassInterface[o];!c||l!==SpecPolicy.DEFINE_MANY_MERGED&&l!==SpecPolicy.DEFINE_MANY?invariant(!1):void 0,l===SpecPolicy.DEFINE_MANY_MERGED?n[o]=createMergedResultFunction(n[o],a):l===SpecPolicy.DEFINE_MANY&&(n[o]=createChainedFunction(n[o],a))}else n[o]=a}}}}function mixStaticSpecIntoComponent(e,t){if(t)for(var n in t){var i=t[n];if(t.hasOwnProperty(n)){var o=n in RESERVED_SPEC_KEYS;o?invariant(!1):void 0;var a=n in e;a?invariant(!1):void 0,e[n]=i}}}function mergeIntoWithNoDuplicateKeys(e,t){e&&t&&"object"==typeof e&&"object"==typeof t?void 0:invariant(!1);for(var n in t)t.hasOwnProperty(n)&&(void 0!==e[n]?invariant(!1):void 0,e[n]=t[n]);return e}function createMergedResultFunction(e,t){return function(){var n=e.apply(this,arguments),i=t.apply(this,arguments);if(null==n)return i;if(null==i)return n;var o={};return mergeIntoWithNoDuplicateKeys(o,n),mergeIntoWithNoDuplicateKeys(o,i),o}}function createChainedFunction(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function bindAutoBindMethod(e,t){var n=t.bind(e);return n}function bindAutoBindMethods(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var i=t[n],o=t[n+1];e[i]=bindAutoBindMethod(e,o)}}var _assign=require("object-assign"),ReactComponent=require("./ReactComponent"),ReactElement=require("./ReactElement"),ReactPropTypeLocations=require("./ReactPropTypeLocations"),ReactPropTypeLocationNames=require("./ReactPropTypeLocationNames"),ReactNoopUpdateQueue=require("./ReactNoopUpdateQueue"),emptyObject=require("fbjs/lib/emptyObject"),invariant=require("fbjs/lib/invariant"),keyMirror=require("fbjs/lib/keyMirror"),keyOf=require("fbjs/lib/keyOf"),warning=require("fbjs/lib/warning"),MIXINS_KEY=keyOf({mixins:null}),SpecPolicy=keyMirror({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),injectedMixins=[],ReactClassInterface={mixins:SpecPolicy.DEFINE_MANY,statics:SpecPolicy.DEFINE_MANY,propTypes:SpecPolicy.DEFINE_MANY,contextTypes:SpecPolicy.DEFINE_MANY,childContextTypes:SpecPolicy.DEFINE_MANY,getDefaultProps:SpecPolicy.DEFINE_MANY_MERGED,getInitialState:SpecPolicy.DEFINE_MANY_MERGED,getChildContext:SpecPolicy.DEFINE_MANY_MERGED,render:SpecPolicy.DEFINE_ONCE,componentWillMount:SpecPolicy.DEFINE_MANY,componentDidMount:SpecPolicy.DEFINE_MANY,componentWillReceiveProps:SpecPolicy.DEFINE_MANY,shouldComponentUpdate:SpecPolicy.DEFINE_ONCE,componentWillUpdate:SpecPolicy.DEFINE_MANY,componentDidUpdate:SpecPolicy.DEFINE_MANY,componentWillUnmount:SpecPolicy.DEFINE_MANY,updateComponent:SpecPolicy.OVERRIDE_BASE},RESERVED_SPEC_KEYS={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)mixSpecIntoComponent(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=_assign({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=_assign({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=createMergedResultFunction(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=_assign({},e.propTypes,t)},statics:function(e,t){mixStaticSpecIntoComponent(e,t)},autobind:function(){}},ReactClassMixin={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e),t&&this.updater.enqueueCallback(this,t,"replaceState")},isMounted:function(){return this.updater.isMounted(this)}},ReactClassComponent=function(){};_assign(ReactClassComponent.prototype,ReactComponent.prototype,ReactClassMixin);var ReactClass={createClass:function(e){var t=function(e,t,n){this.__reactAutoBindPairs.length&&bindAutoBindMethods(this),this.props=e,this.context=t,this.refs=emptyObject,this.updater=n||ReactNoopUpdateQueue,this.state=null;var i=this.getInitialState?this.getInitialState():null;"object"!=typeof i||Array.isArray(i)?invariant(!1):void 0,this.state=i};t.prototype=new ReactClassComponent,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],injectedMixins.forEach(mixSpecIntoComponent.bind(null,t)),mixSpecIntoComponent(t,e),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),t.prototype.render?void 0:invariant(!1);for(var n in ReactClassInterface)t.prototype[n]||(t.prototype[n]=null);return t},injection:{injectMixin:function(e){injectedMixins.push(e)}}};module.exports=ReactClass; +},{"./PooledClass":100,"./ReactElement":131,"./traverseAllChildren":207,"fbjs/lib/emptyFunction":216}],105:[function(require,module,exports){ +"use strict";function validateTypeDef(e,t,n){for(var i in t)t.hasOwnProperty(i)}function validateMethodOverride(e,t){var n=ReactClassInterface.hasOwnProperty(t)?ReactClassInterface[t]:null;ReactClassMixin.hasOwnProperty(t)&&(n!==SpecPolicy.OVERRIDE_BASE?_prodInvariant("73",t):void 0),e&&(n!==SpecPolicy.DEFINE_MANY&&n!==SpecPolicy.DEFINE_MANY_MERGED?_prodInvariant("74",t):void 0)}function mixSpecIntoComponent(e,t){if(t){"function"==typeof t?_prodInvariant("75"):void 0,ReactElement.isValidElement(t)?_prodInvariant("76"):void 0;var n=e.prototype,i=n.__reactAutoBindPairs;t.hasOwnProperty(MIXINS_KEY)&&RESERVED_SPEC_KEYS.mixins(e,t.mixins);for(var o in t)if(t.hasOwnProperty(o)&&o!==MIXINS_KEY){var r=t[o],a=n.hasOwnProperty(o);if(validateMethodOverride(a,o),RESERVED_SPEC_KEYS.hasOwnProperty(o))RESERVED_SPEC_KEYS[o](e,r);else{var c=ReactClassInterface.hasOwnProperty(o),p="function"==typeof r,s=p&&!c&&!a&&t.autobind!==!1;if(s)i.push(o,r),n[o]=r;else if(a){var l=ReactClassInterface[o];!c||l!==SpecPolicy.DEFINE_MANY_MERGED&&l!==SpecPolicy.DEFINE_MANY?_prodInvariant("77",l,o):void 0,l===SpecPolicy.DEFINE_MANY_MERGED?n[o]=createMergedResultFunction(n[o],r):l===SpecPolicy.DEFINE_MANY&&(n[o]=createChainedFunction(n[o],r))}else n[o]=r}}}}function mixStaticSpecIntoComponent(e,t){if(t)for(var n in t){var i=t[n];if(t.hasOwnProperty(n)){var o=n in RESERVED_SPEC_KEYS;o?_prodInvariant("78",n):void 0;var r=n in e;r?_prodInvariant("79",n):void 0,e[n]=i}}}function mergeIntoWithNoDuplicateKeys(e,t){e&&t&&"object"==typeof e&&"object"==typeof t?void 0:_prodInvariant("80");for(var n in t)t.hasOwnProperty(n)&&(void 0!==e[n]?_prodInvariant("81",n):void 0,e[n]=t[n]);return e}function createMergedResultFunction(e,t){return function(){var n=e.apply(this,arguments),i=t.apply(this,arguments);if(null==n)return i;if(null==i)return n;var o={};return mergeIntoWithNoDuplicateKeys(o,n),mergeIntoWithNoDuplicateKeys(o,i),o}}function createChainedFunction(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function bindAutoBindMethod(e,t){var n=t.bind(e);return n}function bindAutoBindMethods(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var i=t[n],o=t[n+1];e[i]=bindAutoBindMethod(e,o)}}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),ReactComponent=require("./ReactComponent"),ReactElement=require("./ReactElement"),ReactPropTypeLocations=require("./ReactPropTypeLocations"),ReactPropTypeLocationNames=require("./ReactPropTypeLocationNames"),ReactNoopUpdateQueue=require("./ReactNoopUpdateQueue"),emptyObject=require("fbjs/lib/emptyObject"),invariant=require("fbjs/lib/invariant"),keyMirror=require("fbjs/lib/keyMirror"),keyOf=require("fbjs/lib/keyOf"),warning=require("fbjs/lib/warning"),MIXINS_KEY=keyOf({mixins:null}),SpecPolicy=keyMirror({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),injectedMixins=[],ReactClassInterface={mixins:SpecPolicy.DEFINE_MANY,statics:SpecPolicy.DEFINE_MANY,propTypes:SpecPolicy.DEFINE_MANY,contextTypes:SpecPolicy.DEFINE_MANY,childContextTypes:SpecPolicy.DEFINE_MANY,getDefaultProps:SpecPolicy.DEFINE_MANY_MERGED,getInitialState:SpecPolicy.DEFINE_MANY_MERGED,getChildContext:SpecPolicy.DEFINE_MANY_MERGED,render:SpecPolicy.DEFINE_ONCE,componentWillMount:SpecPolicy.DEFINE_MANY,componentDidMount:SpecPolicy.DEFINE_MANY,componentWillReceiveProps:SpecPolicy.DEFINE_MANY,shouldComponentUpdate:SpecPolicy.DEFINE_ONCE,componentWillUpdate:SpecPolicy.DEFINE_MANY,componentDidUpdate:SpecPolicy.DEFINE_MANY,componentWillUnmount:SpecPolicy.DEFINE_MANY,updateComponent:SpecPolicy.OVERRIDE_BASE},RESERVED_SPEC_KEYS={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)mixSpecIntoComponent(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=_assign({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=_assign({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=createMergedResultFunction(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=_assign({},e.propTypes,t)},statics:function(e,t){mixStaticSpecIntoComponent(e,t)},autobind:function(){}},ReactClassMixin={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e),t&&this.updater.enqueueCallback(this,t,"replaceState")},isMounted:function(){return this.updater.isMounted(this)}},ReactClassComponent=function(){};_assign(ReactClassComponent.prototype,ReactComponent.prototype,ReactClassMixin);var ReactClass={createClass:function(e){var t=function(e,n,i){this.__reactAutoBindPairs.length&&bindAutoBindMethods(this),this.props=e,this.context=n,this.refs=emptyObject,this.updater=i||ReactNoopUpdateQueue,this.state=null;var o=this.getInitialState?this.getInitialState():null;"object"!=typeof o||Array.isArray(o)?_prodInvariant("82",t.displayName||"ReactCompositeComponent"):void 0,this.state=o};t.prototype=new ReactClassComponent,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],injectedMixins.forEach(mixSpecIntoComponent.bind(null,t)),mixSpecIntoComponent(t,e),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),t.prototype.render?void 0:_prodInvariant("83");for(var n in ReactClassInterface)t.prototype[n]||(t.prototype[n]=null);return t},injection:{injectMixin:function(e){injectedMixins.push(e)}}};module.exports=ReactClass; -},{"./ReactComponent":107,"./ReactElement":135,"./ReactNoopUpdateQueue":152,"./ReactPropTypeLocationNames":154,"./ReactPropTypeLocations":155,"fbjs/lib/emptyObject":219,"fbjs/lib/invariant":226,"fbjs/lib/keyMirror":229,"fbjs/lib/keyOf":230,"fbjs/lib/warning":236,"object-assign":32}],107:[function(require,module,exports){ -"use strict";function ReactComponent(e,t,n){this.props=e,this.context=t,this.refs=emptyObject,this.updater=n||ReactNoopUpdateQueue}var ReactNoopUpdateQueue=require("./ReactNoopUpdateQueue"),ReactInstrumentation=require("./ReactInstrumentation"),canDefineProperty=require("./canDefineProperty"),emptyObject=require("fbjs/lib/emptyObject"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning");ReactComponent.prototype.isReactComponent={},ReactComponent.prototype.setState=function(e,t){"object"!=typeof e&&"function"!=typeof e&&null!=e?invariant(!1):void 0,this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t,"setState")},ReactComponent.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,"forceUpdate")};var deprecatedAPIs,defineDeprecationWarning,fnName;module.exports=ReactComponent; +},{"./ReactComponent":106,"./ReactElement":131,"./ReactNoopUpdateQueue":147,"./ReactPropTypeLocationNames":149,"./ReactPropTypeLocations":150,"./reactProdInvariant":202,"fbjs/lib/emptyObject":217,"fbjs/lib/invariant":224,"fbjs/lib/keyMirror":227,"fbjs/lib/keyOf":228,"fbjs/lib/warning":232,"object-assign":31}],106:[function(require,module,exports){ +"use strict";function ReactComponent(e,t,n){this.props=e,this.context=t,this.refs=emptyObject,this.updater=n||ReactNoopUpdateQueue}var _prodInvariant=require("./reactProdInvariant"),ReactNoopUpdateQueue=require("./ReactNoopUpdateQueue"),canDefineProperty=require("./canDefineProperty"),emptyObject=require("fbjs/lib/emptyObject"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning");ReactComponent.prototype.isReactComponent={},ReactComponent.prototype.setState=function(e,t){"object"!=typeof e&&"function"!=typeof e&&null!=e?_prodInvariant("85"):void 0,this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t,"setState")},ReactComponent.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,"forceUpdate")};var deprecatedAPIs,defineDeprecationWarning,fnName;module.exports=ReactComponent; -},{"./ReactInstrumentation":145,"./ReactNoopUpdateQueue":152,"./canDefineProperty":184,"fbjs/lib/emptyObject":219,"fbjs/lib/invariant":226,"fbjs/lib/warning":236}],108:[function(require,module,exports){ +},{"./ReactNoopUpdateQueue":147,"./canDefineProperty":180,"./reactProdInvariant":202,"fbjs/lib/emptyObject":217,"fbjs/lib/invariant":224,"fbjs/lib/warning":232}],107:[function(require,module,exports){ "use strict";var DOMChildrenOperations=require("./DOMChildrenOperations"),ReactDOMIDOperations=require("./ReactDOMIDOperations"),ReactComponentBrowserEnvironment={processChildrenUpdates:ReactDOMIDOperations.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkup:DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup,unmountIDFromEnvironment:function(e){}};module.exports=ReactComponentBrowserEnvironment; -},{"./DOMChildrenOperations":83,"./ReactDOMIDOperations":122}],109:[function(require,module,exports){ -"use strict";var invariant=require("fbjs/lib/invariant"),injected=!1,ReactComponentEnvironment={unmountIDFromEnvironment:null,replaceNodeWithMarkup:null,processChildrenUpdates:null,injection:{injectEnvironment:function(n){injected?invariant(!1):void 0,ReactComponentEnvironment.unmountIDFromEnvironment=n.unmountIDFromEnvironment,ReactComponentEnvironment.replaceNodeWithMarkup=n.replaceNodeWithMarkup,ReactComponentEnvironment.processChildrenUpdates=n.processChildrenUpdates,injected=!0}}};module.exports=ReactComponentEnvironment; +},{"./DOMChildrenOperations":82,"./ReactDOMIDOperations":120}],108:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),invariant=require("fbjs/lib/invariant"),injected=!1,ReactComponentEnvironment={unmountIDFromEnvironment:null,replaceNodeWithMarkup:null,processChildrenUpdates:null,injection:{injectEnvironment:function(n){injected?_prodInvariant("104"):void 0,ReactComponentEnvironment.unmountIDFromEnvironment=n.unmountIDFromEnvironment,ReactComponentEnvironment.replaceNodeWithMarkup=n.replaceNodeWithMarkup,ReactComponentEnvironment.processChildrenUpdates=n.processChildrenUpdates,injected=!0}}};module.exports=ReactComponentEnvironment; -},{"fbjs/lib/invariant":226}],110:[function(require,module,exports){ -"use strict";function getDeclarationErrorAddendum(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return" Check the render method of `"+n+"`."}return""}function StatelessComponent(e){}function warnIfInvalidElement(e,t){}function invokeComponentDidMountWithTimer(){var e=this._instance;0!==this._debugID&&ReactInstrumentation.debugTool.onBeginLifeCycleTimer(this._debugID,"componentDidMount"),e.componentDidMount(),0!==this._debugID&&ReactInstrumentation.debugTool.onEndLifeCycleTimer(this._debugID,"componentDidMount")}function invokeComponentDidUpdateWithTimer(e,t,n){var o=this._instance;0!==this._debugID&&ReactInstrumentation.debugTool.onBeginLifeCycleTimer(this._debugID,"componentDidUpdate"),o.componentDidUpdate(e,t,n),0!==this._debugID&&ReactInstrumentation.debugTool.onEndLifeCycleTimer(this._debugID,"componentDidUpdate")}function shouldConstruct(e){return e.prototype&&e.prototype.isReactComponent}var _assign=require("object-assign"),ReactComponentEnvironment=require("./ReactComponentEnvironment"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactElement=require("./ReactElement"),ReactErrorUtils=require("./ReactErrorUtils"),ReactInstanceMap=require("./ReactInstanceMap"),ReactInstrumentation=require("./ReactInstrumentation"),ReactNodeTypes=require("./ReactNodeTypes"),ReactPropTypeLocations=require("./ReactPropTypeLocations"),ReactPropTypeLocationNames=require("./ReactPropTypeLocationNames"),ReactReconciler=require("./ReactReconciler"),ReactUpdateQueue=require("./ReactUpdateQueue"),emptyObject=require("fbjs/lib/emptyObject"),invariant=require("fbjs/lib/invariant"),shouldUpdateReactComponent=require("./shouldUpdateReactComponent"),warning=require("fbjs/lib/warning");StatelessComponent.prototype.render=function(){var e=ReactInstanceMap.get(this)._currentElement.type,t=e(this.props,this.context,this.updater);return warnIfInvalidElement(e,t),t};var nextMountID=1,ReactCompositeComponentMixin={construct:function(e){this._currentElement=e,this._rootNodeID=null,this._instance=null,this._nativeParent=null,this._nativeContainerInfo=null,this._updateBatchNumber=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedNodeType=null,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._topLevelWrapper=null,this._pendingCallbacks=null,this._calledComponentWillUnmount=!1},mountComponent:function(e,t,n,o){this._context=o,this._mountOrder=nextMountID++,this._nativeParent=t,this._nativeContainerInfo=n;var i,r=this._processProps(this._currentElement.props),a=this._processContext(o),s=this._currentElement.type,c=this._constructComponent(r,a);shouldConstruct(s)||null!=c&&null!=c.render||(i=c,warnIfInvalidElement(s,i),null===c||c===!1||ReactElement.isValidElement(c)?void 0:invariant(!1),c=new StatelessComponent(s));c.props=r,c.context=a,c.refs=emptyObject,c.updater=ReactUpdateQueue,this._instance=c,ReactInstanceMap.set(c,this);var p=c.state;void 0===p&&(c.state=p=null),"object"!=typeof p||Array.isArray(p)?invariant(!1):void 0,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var u;return u=c.unstable_handleError?this.performInitialMountWithErrorHandling(i,t,n,e,o):this.performInitialMount(i,t,n,e,o),c.componentDidMount&&e.getReactMountReady().enqueue(c.componentDidMount,c),u},_constructComponent:function(e,t){return this._constructComponentWithoutOwner(e,t)},_constructComponentWithoutOwner:function(e,t){var n,o=this._currentElement.type;return n=shouldConstruct(o)?new o(e,t,ReactUpdateQueue):o(e,t,ReactUpdateQueue)},performInitialMountWithErrorHandling:function(e,t,n,o,i){var r,a=o.checkpoint();try{r=this.performInitialMount(e,t,n,o,i)}catch(s){o.rollback(a),this._instance.unstable_handleError(s),this._pendingStateQueue&&(this._instance.state=this._processPendingState(this._instance.props,this._instance.context)),a=o.checkpoint(),this._renderedComponent.unmountComponent(!0),o.rollback(a),r=this.performInitialMount(e,t,n,o,i)}return r},performInitialMount:function(e,t,n,o,i){var r=this._instance;r.componentWillMount&&(r.componentWillMount(),this._pendingStateQueue&&(r.state=this._processPendingState(r.props,r.context))),void 0===e&&(e=this._renderValidatedComponent()),this._renderedNodeType=ReactNodeTypes.getType(e),this._renderedComponent=this._instantiateReactComponent(e);var a=ReactReconciler.mountComponent(this._renderedComponent,o,t,n,this._processChildContext(i));return a},getNativeNode:function(){return ReactReconciler.getNativeNode(this._renderedComponent)},unmountComponent:function(e){if(this._renderedComponent){var t=this._instance;if(t.componentWillUnmount&&!t._calledComponentWillUnmount)if(t._calledComponentWillUnmount=!0,e){var n=this.getName()+".componentWillUnmount()";ReactErrorUtils.invokeGuardedCallback(n,t.componentWillUnmount.bind(t))}else t.componentWillUnmount();this._renderedComponent&&(ReactReconciler.unmountComponent(this._renderedComponent,e),this._renderedNodeType=null,this._renderedComponent=null,this._instance=null),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=null,this._topLevelWrapper=null,ReactInstanceMap.remove(t)}},_maskContext:function(e){var t=this._currentElement.type,n=t.contextTypes;if(!n)return emptyObject;var o={};for(var i in n)o[i]=e[i];return o},_processContext:function(e){var t=this._maskContext(e);return t},_processChildContext:function(e){var t=this._currentElement.type,n=this._instance,o=n.getChildContext&&n.getChildContext();if(o){"object"!=typeof t.childContextTypes?invariant(!1):void 0;for(var i in o)i in t.childContextTypes?void 0:invariant(!1);return _assign({},e,o)}return e},_processProps:function(e){return e},_checkPropTypes:function(e,t,n){var o=this.getName();for(var i in e)if(e.hasOwnProperty(i)){var r;try{"function"!=typeof e[i]?invariant(!1):void 0,r=e[i](t,i,o,n)}catch(a){r=a}if(r instanceof Error){getDeclarationErrorAddendum(this);n===ReactPropTypeLocations.prop}}},receiveComponent:function(e,t,n){var o=this._currentElement,i=this._context;this._pendingElement=null,this.updateComponent(t,o,e,i,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement?ReactReconciler.receiveComponent(this,this._pendingElement,e,this._context):null!==this._pendingStateQueue||this._pendingForceUpdate?this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context):this._updateBatchNumber=null},updateComponent:function(e,t,n,o,i){var r,a,s=this._instance,c=!1;this._context===i?r=s.context:(r=this._processContext(i),c=!0),t===n?a=n.props:(a=this._processProps(n.props),c=!0),c&&s.componentWillReceiveProps&&s.componentWillReceiveProps(a,r);var p=this._processPendingState(a,r),u=!0;!this._pendingForceUpdate&&s.shouldComponentUpdate&&(u=s.shouldComponentUpdate(a,p,r)),this._updateBatchNumber=null,u?(this._pendingForceUpdate=!1,this._performComponentUpdate(n,a,p,r,e,i)):(this._currentElement=n,this._context=i,s.props=a,s.state=p,s.context=r)},_processPendingState:function(e,t){var n=this._instance,o=this._pendingStateQueue,i=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!o)return n.state;if(i&&1===o.length)return o[0];for(var r=_assign({},i?o[0]:n.state),a=i?1:0;a<o.length;a++){var s=o[a];_assign(r,"function"==typeof s?s.call(n,r,e,t):s)}return r},_performComponentUpdate:function(e,t,n,o,i,r){var a,s,c,p=this._instance,u=Boolean(p.componentDidUpdate);u&&(a=p.props,s=p.state,c=p.context),p.componentWillUpdate&&p.componentWillUpdate(t,n,o),this._currentElement=e,this._context=r,p.props=t,p.state=n,p.context=o,this._updateRenderedComponent(i,r),u&&i.getReactMountReady().enqueue(p.componentDidUpdate.bind(p,a,s,c),p)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,o=n._currentElement,i=this._renderValidatedComponent();if(shouldUpdateReactComponent(o,i))ReactReconciler.receiveComponent(n,i,e,this._processChildContext(t));else{var r=ReactReconciler.getNativeNode(n);ReactReconciler.unmountComponent(n,!1),this._renderedNodeType=ReactNodeTypes.getType(i),this._renderedComponent=this._instantiateReactComponent(i);var a=ReactReconciler.mountComponent(this._renderedComponent,e,this._nativeParent,this._nativeContainerInfo,this._processChildContext(t));this._replaceNodeWithMarkup(r,a,n)}},_replaceNodeWithMarkup:function(e,t,n){ReactComponentEnvironment.replaceNodeWithMarkup(e,t,n)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e=this._instance,t=e.render();return t},_renderValidatedComponent:function(){var e;ReactCurrentOwner.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{ReactCurrentOwner.current=null}return null===e||e===!1||ReactElement.isValidElement(e)?void 0:invariant(!1),e},attachRef:function(e,t){var n=this.getPublicInstance();null==n?invariant(!1):void 0;var o=t.getPublicInstance(),i=n.refs===emptyObject?n.refs={}:n.refs;i[e]=o},detachRef:function(e){var t=this.getPublicInstance().refs;delete t[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){var e=this._instance;return e instanceof StatelessComponent?null:e},_instantiateReactComponent:null},ReactCompositeComponent={Mixin:ReactCompositeComponentMixin};module.exports=ReactCompositeComponent; +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224}],109:[function(require,module,exports){ +"use strict";function StatelessComponent(e){}function warnIfInvalidElement(e,t){}function invokeComponentDidMountWithTimer(){var e=this._instance;0!==this._debugID&&ReactInstrumentation.debugTool.onBeginLifeCycleTimer(this._debugID,"componentDidMount"),e.componentDidMount(),0!==this._debugID&&ReactInstrumentation.debugTool.onEndLifeCycleTimer(this._debugID,"componentDidMount")}function invokeComponentDidUpdateWithTimer(e,t,n){var o=this._instance;0!==this._debugID&&ReactInstrumentation.debugTool.onBeginLifeCycleTimer(this._debugID,"componentDidUpdate"),o.componentDidUpdate(e,t,n),0!==this._debugID&&ReactInstrumentation.debugTool.onEndLifeCycleTimer(this._debugID,"componentDidUpdate")}function shouldConstruct(e){return e.prototype&&e.prototype.isReactComponent}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),ReactComponentEnvironment=require("./ReactComponentEnvironment"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactElement=require("./ReactElement"),ReactErrorUtils=require("./ReactErrorUtils"),ReactInstanceMap=require("./ReactInstanceMap"),ReactInstrumentation=require("./ReactInstrumentation"),ReactNodeTypes=require("./ReactNodeTypes"),ReactPropTypeLocations=require("./ReactPropTypeLocations"),ReactReconciler=require("./ReactReconciler"),checkReactTypeSpec=require("./checkReactTypeSpec"),emptyObject=require("fbjs/lib/emptyObject"),invariant=require("fbjs/lib/invariant"),shouldUpdateReactComponent=require("./shouldUpdateReactComponent"),warning=require("fbjs/lib/warning");StatelessComponent.prototype.render=function(){var e=ReactInstanceMap.get(this)._currentElement.type,t=e(this.props,this.context,this.updater);return warnIfInvalidElement(e,t),t};var nextMountID=1,ReactCompositeComponentMixin={construct:function(e){this._currentElement=e,this._rootNodeID=null,this._instance=null,this._hostParent=null,this._hostContainerInfo=null,this._updateBatchNumber=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedNodeType=null,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._topLevelWrapper=null,this._pendingCallbacks=null,this._calledComponentWillUnmount=!1},mountComponent:function(e,t,n,o){this._context=o,this._mountOrder=nextMountID++,this._hostParent=t,this._hostContainerInfo=n;var i,r=this._currentElement.props,a=this._processContext(o),s=this._currentElement.type,c=e.getUpdateQueue(),p=this._constructComponent(r,a,c);shouldConstruct(s)||null!=p&&null!=p.render||(i=p,warnIfInvalidElement(s,i),null===p||p===!1||ReactElement.isValidElement(p)?void 0:_prodInvariant("105",s.displayName||s.name||"Component"),p=new StatelessComponent(s));p.props=r,p.context=a,p.refs=emptyObject,p.updater=c,this._instance=p,ReactInstanceMap.set(p,this);var u=p.state;void 0===u&&(p.state=u=null),"object"!=typeof u||Array.isArray(u)?_prodInvariant("106",this.getName()||"ReactCompositeComponent"):void 0,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var l;return l=p.unstable_handleError?this.performInitialMountWithErrorHandling(i,t,n,e,o):this.performInitialMount(i,t,n,e,o),p.componentDidMount&&e.getReactMountReady().enqueue(p.componentDidMount,p),l},_constructComponent:function(e,t,n){return this._constructComponentWithoutOwner(e,t,n)},_constructComponentWithoutOwner:function(e,t,n){var o,i=this._currentElement.type;return o=shouldConstruct(i)?new i(e,t,n):i(e,t,n)},performInitialMountWithErrorHandling:function(e,t,n,o,i){var r,a=o.checkpoint();try{r=this.performInitialMount(e,t,n,o,i)}catch(s){o.rollback(a),this._instance.unstable_handleError(s),this._pendingStateQueue&&(this._instance.state=this._processPendingState(this._instance.props,this._instance.context)),a=o.checkpoint(),this._renderedComponent.unmountComponent(!0),o.rollback(a),r=this.performInitialMount(e,t,n,o,i)}return r},performInitialMount:function(e,t,n,o,i){var r=this._instance;r.componentWillMount&&(r.componentWillMount(),this._pendingStateQueue&&(r.state=this._processPendingState(r.props,r.context))),void 0===e&&(e=this._renderValidatedComponent());var a=ReactNodeTypes.getType(e);this._renderedNodeType=a;var s=this._instantiateReactComponent(e,a!==ReactNodeTypes.EMPTY);this._renderedComponent=s;var c=ReactReconciler.mountComponent(s,o,t,n,this._processChildContext(i));return c},getHostNode:function(){return ReactReconciler.getHostNode(this._renderedComponent)},unmountComponent:function(e){if(this._renderedComponent){var t=this._instance;if(t.componentWillUnmount&&!t._calledComponentWillUnmount)if(t._calledComponentWillUnmount=!0,e){var n=this.getName()+".componentWillUnmount()";ReactErrorUtils.invokeGuardedCallback(n,t.componentWillUnmount.bind(t))}else t.componentWillUnmount();this._renderedComponent&&(ReactReconciler.unmountComponent(this._renderedComponent,e),this._renderedNodeType=null,this._renderedComponent=null,this._instance=null),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=null,this._topLevelWrapper=null,ReactInstanceMap.remove(t)}},_maskContext:function(e){var t=this._currentElement.type,n=t.contextTypes;if(!n)return emptyObject;var o={};for(var i in n)o[i]=e[i];return o},_processContext:function(e){var t=this._maskContext(e);return t},_processChildContext:function(e){var t=this._currentElement.type,n=this._instance,o=n.getChildContext&&n.getChildContext();if(o){"object"!=typeof t.childContextTypes?_prodInvariant("107",this.getName()||"ReactCompositeComponent"):void 0;for(var i in o)i in t.childContextTypes?void 0:_prodInvariant("108",this.getName()||"ReactCompositeComponent",i);return _assign({},e,o)}return e},_checkContextTypes:function(e,t,n){checkReactTypeSpec(e,t,n,this.getName(),null,this._debugID)},receiveComponent:function(e,t,n){var o=this._currentElement,i=this._context;this._pendingElement=null,this.updateComponent(t,o,e,i,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement?ReactReconciler.receiveComponent(this,this._pendingElement,e,this._context):null!==this._pendingStateQueue||this._pendingForceUpdate?this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context):this._updateBatchNumber=null},updateComponent:function(e,t,n,o,i){var r=this._instance;null==r?_prodInvariant("136",this.getName()||"ReactCompositeComponent"):void 0;var a,s,c=!1;this._context===i?a=r.context:(a=this._processContext(i),c=!0),s=n.props,t!==n&&(c=!0),c&&r.componentWillReceiveProps&&r.componentWillReceiveProps(s,a);var p=this._processPendingState(s,a),u=!0;!this._pendingForceUpdate&&r.shouldComponentUpdate&&(u=r.shouldComponentUpdate(s,p,a)),this._updateBatchNumber=null,u?(this._pendingForceUpdate=!1,this._performComponentUpdate(n,s,p,a,e,i)):(this._currentElement=n,this._context=i,r.props=s,r.state=p,r.context=a)},_processPendingState:function(e,t){var n=this._instance,o=this._pendingStateQueue,i=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!o)return n.state;if(i&&1===o.length)return o[0];for(var r=_assign({},i?o[0]:n.state),a=i?1:0;a<o.length;a++){var s=o[a];_assign(r,"function"==typeof s?s.call(n,r,e,t):s)}return r},_performComponentUpdate:function(e,t,n,o,i,r){var a,s,c,p=this._instance,u=Boolean(p.componentDidUpdate);u&&(a=p.props,s=p.state,c=p.context),p.componentWillUpdate&&p.componentWillUpdate(t,n,o),this._currentElement=e,this._context=r,p.props=t,p.state=n,p.context=o,this._updateRenderedComponent(i,r),u&&i.getReactMountReady().enqueue(p.componentDidUpdate.bind(p,a,s,c),p)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,o=n._currentElement,i=this._renderValidatedComponent();if(shouldUpdateReactComponent(o,i))ReactReconciler.receiveComponent(n,i,e,this._processChildContext(t));else{var r=ReactReconciler.getHostNode(n);ReactReconciler.unmountComponent(n,!1);var a=ReactNodeTypes.getType(i);this._renderedNodeType=a;var s=this._instantiateReactComponent(i,a!==ReactNodeTypes.EMPTY);this._renderedComponent=s;var c=ReactReconciler.mountComponent(s,e,this._hostParent,this._hostContainerInfo,this._processChildContext(t));this._replaceNodeWithMarkup(r,c,n)}},_replaceNodeWithMarkup:function(e,t,n){ReactComponentEnvironment.replaceNodeWithMarkup(e,t,n)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e=this._instance,t=e.render();return t},_renderValidatedComponent:function(){var e;ReactCurrentOwner.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{ReactCurrentOwner.current=null}return null===e||e===!1||ReactElement.isValidElement(e)?void 0:_prodInvariant("109",this.getName()||"ReactCompositeComponent"),e},attachRef:function(e,t){var n=this.getPublicInstance();null==n?_prodInvariant("110"):void 0;var o=t.getPublicInstance(),i=n.refs===emptyObject?n.refs={}:n.refs;i[e]=o},detachRef:function(e){var t=this.getPublicInstance().refs;delete t[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){var e=this._instance;return e instanceof StatelessComponent?null:e},_instantiateReactComponent:null},ReactCompositeComponent={Mixin:ReactCompositeComponentMixin};module.exports=ReactCompositeComponent; -},{"./ReactComponentEnvironment":109,"./ReactCurrentOwner":111,"./ReactElement":135,"./ReactErrorUtils":138,"./ReactInstanceMap":144,"./ReactInstrumentation":145,"./ReactNodeTypes":151,"./ReactPropTypeLocationNames":154,"./ReactPropTypeLocations":155,"./ReactReconciler":158,"./ReactUpdateQueue":161,"./shouldUpdateReactComponent":208,"fbjs/lib/emptyObject":219,"fbjs/lib/invariant":226,"fbjs/lib/warning":236,"object-assign":32}],111:[function(require,module,exports){ +},{"./ReactComponentEnvironment":108,"./ReactCurrentOwner":110,"./ReactElement":131,"./ReactErrorUtils":133,"./ReactInstanceMap":140,"./ReactInstrumentation":141,"./ReactNodeTypes":146,"./ReactPropTypeLocations":150,"./ReactReconciler":153,"./checkReactTypeSpec":181,"./reactProdInvariant":202,"./shouldUpdateReactComponent":206,"fbjs/lib/emptyObject":217,"fbjs/lib/invariant":224,"fbjs/lib/warning":232,"object-assign":31}],110:[function(require,module,exports){ "use strict";var ReactCurrentOwner={current:null};module.exports=ReactCurrentOwner; -},{}],112:[function(require,module,exports){ -"use strict";var ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDefaultInjection=require("./ReactDefaultInjection"),ReactMount=require("./ReactMount"),ReactReconciler=require("./ReactReconciler"),ReactUpdates=require("./ReactUpdates"),ReactVersion=require("./ReactVersion"),findDOMNode=require("./findDOMNode"),getNativeComponentFromComposite=require("./getNativeComponentFromComposite"),renderSubtreeIntoContainer=require("./renderSubtreeIntoContainer"),warning=require("fbjs/lib/warning");ReactDefaultInjection.inject();var React={findDOMNode:findDOMNode,render:ReactMount.render,unmountComponentAtNode:ReactMount.unmountComponentAtNode,version:ReactVersion,unstable_batchedUpdates:ReactUpdates.batchedUpdates,unstable_renderSubtreeIntoContainer:renderSubtreeIntoContainer};"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ComponentTree:{getClosestInstanceFromNode:ReactDOMComponentTree.getClosestInstanceFromNode,getNodeFromInstance:function(e){return e._renderedComponent&&(e=getNativeComponentFromComposite(e)),e?ReactDOMComponentTree.getNodeFromInstance(e):null}},Mount:ReactMount,Reconciler:ReactReconciler});var ExecutionEnvironment,showFileUrlMessage,testFunc,ieCompatibilityMode,expectedFeatures,i;module.exports=React; +},{}],111:[function(require,module,exports){ +"use strict";var ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDefaultInjection=require("./ReactDefaultInjection"),ReactMount=require("./ReactMount"),ReactReconciler=require("./ReactReconciler"),ReactUpdates=require("./ReactUpdates"),ReactVersion=require("./ReactVersion"),findDOMNode=require("./findDOMNode"),getHostComponentFromComposite=require("./getHostComponentFromComposite"),renderSubtreeIntoContainer=require("./renderSubtreeIntoContainer"),warning=require("fbjs/lib/warning");ReactDefaultInjection.inject();var React={findDOMNode:findDOMNode,render:ReactMount.render,unmountComponentAtNode:ReactMount.unmountComponentAtNode,version:ReactVersion,unstable_batchedUpdates:ReactUpdates.batchedUpdates,unstable_renderSubtreeIntoContainer:renderSubtreeIntoContainer};"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ComponentTree:{getClosestInstanceFromNode:ReactDOMComponentTree.getClosestInstanceFromNode,getNodeFromInstance:function(e){return e._renderedComponent&&(e=getHostComponentFromComposite(e)),e?ReactDOMComponentTree.getNodeFromInstance(e):null}},Mount:ReactMount,Reconciler:ReactReconciler});var ExecutionEnvironment,showFileUrlMessage,testFunc,ieCompatibilityMode,expectedFeatures,i;module.exports=React; -},{"./ReactDOMComponentTree":116,"./ReactDefaultInjection":134,"./ReactMount":147,"./ReactReconciler":158,"./ReactUpdates":162,"./ReactVersion":163,"./findDOMNode":188,"./getNativeComponentFromComposite":196,"./renderSubtreeIntoContainer":205,"fbjs/lib/warning":236}],113:[function(require,module,exports){ -"use strict";var DisabledInputUtils=require("./DisabledInputUtils"),ReactDOMButton={getNativeProps:DisabledInputUtils.getNativeProps};module.exports=ReactDOMButton; +},{"./ReactDOMComponentTree":115,"./ReactDefaultInjection":130,"./ReactMount":143,"./ReactReconciler":153,"./ReactUpdates":158,"./ReactVersion":159,"./findDOMNode":185,"./getHostComponentFromComposite":192,"./renderSubtreeIntoContainer":203,"fbjs/lib/warning":232}],112:[function(require,module,exports){ +"use strict";var DisabledInputUtils=require("./DisabledInputUtils"),ReactDOMButton={getHostProps:DisabledInputUtils.getHostProps};module.exports=ReactDOMButton; -},{"./DisabledInputUtils":90}],114:[function(require,module,exports){ -"use strict";function getDeclarationErrorAddendum(e){if(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return" This DOM node was rendered by `"+n+"`."}}return""}function friendlyStringify(e){if("object"==typeof e){if(Array.isArray(e))return"["+e.map(friendlyStringify).join(", ")+"]";var t=[];for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=/^[a-z$_][\w$_]*$/i.test(n)?n:JSON.stringify(n);t.push(r+": "+friendlyStringify(e[n]))}return"{"+t.join(", ")+"}"}return"string"==typeof e?JSON.stringify(e):"function"==typeof e?"[function object]":String(e)}function checkAndWarnForMutatedStyle(e,t,n){if(null!=e&&null!=t&&!shallowEqual(e,t)){var r,a=n._tag,i=n._currentElement._owner;i&&(r=i.getName());var o=r+"|"+a;styleMutationWarning.hasOwnProperty(o)||(styleMutationWarning[o]=!0)}}function assertValidProps(e,t){t&&(voidElementTags[e._tag]&&(null!=t.children||null!=t.dangerouslySetInnerHTML?invariant(!1):void 0),null!=t.dangerouslySetInnerHTML&&(null!=t.children?invariant(!1):void 0,"object"==typeof t.dangerouslySetInnerHTML&&HTML in t.dangerouslySetInnerHTML?void 0:invariant(!1)),null!=t.style&&"object"!=typeof t.style?invariant(!1):void 0)}function enqueuePutListener(e,t,n,r){if(!(r instanceof ReactServerRenderingTransaction)){var a=e._nativeContainerInfo,i=a._node&&a._node.nodeType===DOC_FRAGMENT_TYPE,o=i?a._node:a._ownerDocument;listenTo(t,o),r.getReactMountReady().enqueue(putListener,{inst:e,registrationName:t,listener:n})}}function putListener(){var e=this;EventPluginHub.putListener(e.inst,e.registrationName,e.listener)}function optionPostMount(){var e=this;ReactDOMOption.postMountWrapper(e)}function trapBubbledEventsLocal(){var e=this;e._rootNodeID?void 0:invariant(!1);var t=getNode(e);switch(t?void 0:invariant(!1),e._tag){case"iframe":case"object":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad,"load",t)];break;case"video":case"audio":e._wrapperState.listeners=[];for(var n in mediaEvents)mediaEvents.hasOwnProperty(n)&&e._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[n],mediaEvents[n],t));break;case"img":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError,"error",t),ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad,"load",t)];break;case"form":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset,"reset",t),ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit,"submit",t)];break;case"input":case"select":case"textarea":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topInvalid,"invalid",t)]}}function postUpdateSelectWrapper(){ReactDOMSelect.postUpdateWrapper(this)}function validateDangerousTag(e){hasOwnProperty.call(validatedTagCache,e)||(VALID_TAG_REGEX.test(e)?void 0:invariant(!1),validatedTagCache[e]=!0)}function isCustomComponent(e,t){return e.indexOf("-")>=0||null!=t.is}function ReactDOMComponent(e){var t=e.type;validateDangerousTag(t),this._currentElement=e,this._tag=t.toLowerCase(),this._namespaceURI=null,this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._nativeNode=null,this._nativeParent=null,this._rootNodeID=null,this._domID=null,this._nativeContainerInfo=null,this._wrapperState=null,this._topLevelWrapper=null,this._flags=0}var _assign=require("object-assign"),AutoFocusUtils=require("./AutoFocusUtils"),CSSPropertyOperations=require("./CSSPropertyOperations"),DOMLazyTree=require("./DOMLazyTree"),DOMNamespaces=require("./DOMNamespaces"),DOMProperty=require("./DOMProperty"),DOMPropertyOperations=require("./DOMPropertyOperations"),EventConstants=require("./EventConstants"),EventPluginHub=require("./EventPluginHub"),EventPluginRegistry=require("./EventPluginRegistry"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactComponentBrowserEnvironment=require("./ReactComponentBrowserEnvironment"),ReactDOMButton=require("./ReactDOMButton"),ReactDOMComponentFlags=require("./ReactDOMComponentFlags"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMInput=require("./ReactDOMInput"),ReactDOMOption=require("./ReactDOMOption"),ReactDOMSelect=require("./ReactDOMSelect"),ReactDOMTextarea=require("./ReactDOMTextarea"),ReactInstrumentation=require("./ReactInstrumentation"),ReactMultiChild=require("./ReactMultiChild"),ReactServerRenderingTransaction=require("./ReactServerRenderingTransaction"),emptyFunction=require("fbjs/lib/emptyFunction"),escapeTextContentForBrowser=require("./escapeTextContentForBrowser"),invariant=require("fbjs/lib/invariant"),isEventSupported=require("./isEventSupported"),keyOf=require("fbjs/lib/keyOf"),shallowEqual=require("fbjs/lib/shallowEqual"),validateDOMNesting=require("./validateDOMNesting"),warning=require("fbjs/lib/warning"),Flags=ReactDOMComponentFlags,deleteListener=EventPluginHub.deleteListener,getNode=ReactDOMComponentTree.getNodeFromInstance,listenTo=ReactBrowserEventEmitter.listenTo,registrationNameModules=EventPluginRegistry.registrationNameModules,CONTENT_TYPES={string:!0,number:!0},STYLE=keyOf({style:null}),HTML=keyOf({__html:null}),RESERVED_PROPS={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null},DOC_FRAGMENT_TYPE=11,styleMutationWarning={},setContentChildForInstrumentation=emptyFunction,mediaEvents={topAbort:"abort",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topSeeked:"seeked",topSeeking:"seeking",topStalled:"stalled",topSuspend:"suspend",topTimeUpdate:"timeupdate",topVolumeChange:"volumechange",topWaiting:"waiting"},omittedCloseTags={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},newlineEatingTags={listing:!0,pre:!0,textarea:!0},voidElementTags=_assign({menuitem:!0},omittedCloseTags),VALID_TAG_REGEX=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,validatedTagCache={},hasOwnProperty={}.hasOwnProperty,globalIdCounter=1;ReactDOMComponent.displayName="ReactDOMComponent",ReactDOMComponent.Mixin={mountComponent:function(e,t,n,r){this._rootNodeID=globalIdCounter++,this._domID=n._idCounter++,this._nativeParent=t,this._nativeContainerInfo=n;var a=this._currentElement.props;switch(this._tag){case"iframe":case"object":case"img":case"form":case"video":case"audio":this._wrapperState={listeners:null},e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"button":a=ReactDOMButton.getNativeProps(this,a,t);break;case"input":ReactDOMInput.mountWrapper(this,a,t),a=ReactDOMInput.getNativeProps(this,a),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"option":ReactDOMOption.mountWrapper(this,a,t),a=ReactDOMOption.getNativeProps(this,a);break;case"select":ReactDOMSelect.mountWrapper(this,a,t),a=ReactDOMSelect.getNativeProps(this,a),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"textarea":ReactDOMTextarea.mountWrapper(this,a,t),a=ReactDOMTextarea.getNativeProps(this,a),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this)}assertValidProps(this,a);var i,o;null!=t?(i=t._namespaceURI,o=t._tag):n._tag&&(i=n._namespaceURI,o=n._tag),(null==i||i===DOMNamespaces.svg&&"foreignobject"===o)&&(i=DOMNamespaces.html),i===DOMNamespaces.html&&("svg"===this._tag?i=DOMNamespaces.svg:"math"===this._tag&&(i=DOMNamespaces.mathml)),this._namespaceURI=i;var s;if(e.useCreateElement){var l,u=n._ownerDocument;if(i===DOMNamespaces.html)if("script"===this._tag){var p=u.createElement("div"),c=this._currentElement.type;p.innerHTML="<"+c+"></"+c+">",l=p.removeChild(p.firstChild)}else l=u.createElement(this._currentElement.type,a.is||null);else l=u.createElementNS(i,this._currentElement.type);ReactDOMComponentTree.precacheNode(this,l),this._flags|=Flags.hasCachedChildNodes,this._nativeParent||DOMPropertyOperations.setAttributeForRoot(l),this._updateDOMProperties(null,a,e);var d=DOMLazyTree(l);this._createInitialChildren(e,a,r,d),s=d}else{var h=this._createOpenTagMarkupAndPutListeners(e,a),v=this._createContentMarkup(e,a,r);s=!v&&omittedCloseTags[this._tag]?h+"/>":h+">"+v+"</"+this._currentElement.type+">"}switch(this._tag){case"button":case"input":case"select":case"textarea":a.autoFocus&&e.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent,this);break;case"option":e.getReactMountReady().enqueue(optionPostMount,this)}return s},_createOpenTagMarkupAndPutListeners:function(e,t){var n="<"+this._currentElement.type;for(var r in t)if(t.hasOwnProperty(r)){var a=t[r];if(null!=a)if(registrationNameModules.hasOwnProperty(r))a&&enqueuePutListener(this,r,a,e);else{r===STYLE&&(a&&(a=this._previousStyleCopy=_assign({},t.style)),a=CSSPropertyOperations.createMarkupForStyles(a,this));var i=null;null!=this._tag&&isCustomComponent(this._tag,t)?RESERVED_PROPS.hasOwnProperty(r)||(i=DOMPropertyOperations.createMarkupForCustomAttribute(r,a)):i=DOMPropertyOperations.createMarkupForProperty(r,a),i&&(n+=" "+i)}}return e.renderToStaticMarkup?n:(this._nativeParent||(n+=" "+DOMPropertyOperations.createMarkupForRoot()),n+=" "+DOMPropertyOperations.createMarkupForID(this._domID))},_createContentMarkup:function(e,t,n){var r="",a=t.dangerouslySetInnerHTML;if(null!=a)null!=a.__html&&(r=a.__html);else{var i=CONTENT_TYPES[typeof t.children]?t.children:null,o=null!=i?null:t.children;if(null!=i)r=escapeTextContentForBrowser(i);else if(null!=o){var s=this.mountChildren(o,e,n);r=s.join("")}}return newlineEatingTags[this._tag]&&"\n"===r.charAt(0)?"\n"+r:r},_createInitialChildren:function(e,t,n,r){var a=t.dangerouslySetInnerHTML;if(null!=a)null!=a.__html&&DOMLazyTree.queueHTML(r,a.__html);else{var i=CONTENT_TYPES[typeof t.children]?t.children:null,o=null!=i?null:t.children;if(null!=i)DOMLazyTree.queueText(r,i);else if(null!=o)for(var s=this.mountChildren(o,e,n),l=0;l<s.length;l++)DOMLazyTree.queueChild(r,s[l])}},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,r){var a=t.props,i=this._currentElement.props;switch(this._tag){case"button":a=ReactDOMButton.getNativeProps(this,a),i=ReactDOMButton.getNativeProps(this,i);break;case"input":ReactDOMInput.updateWrapper(this),a=ReactDOMInput.getNativeProps(this,a),i=ReactDOMInput.getNativeProps(this,i);break;case"option":a=ReactDOMOption.getNativeProps(this,a),i=ReactDOMOption.getNativeProps(this,i);break;case"select":a=ReactDOMSelect.getNativeProps(this,a),i=ReactDOMSelect.getNativeProps(this,i);break;case"textarea":ReactDOMTextarea.updateWrapper(this),a=ReactDOMTextarea.getNativeProps(this,a),i=ReactDOMTextarea.getNativeProps(this,i)}assertValidProps(this,i),this._updateDOMProperties(a,i,e),this._updateDOMChildren(a,i,e,r),"select"===this._tag&&e.getReactMountReady().enqueue(postUpdateSelectWrapper,this)},_updateDOMProperties:function(e,t,n){var r,a,i;for(r in e)if(!t.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if(r===STYLE){var o=this._previousStyleCopy;for(a in o)o.hasOwnProperty(a)&&(i=i||{},i[a]="");this._previousStyleCopy=null}else registrationNameModules.hasOwnProperty(r)?e[r]&&deleteListener(this,r):(DOMProperty.properties[r]||DOMProperty.isCustomAttribute(r))&&DOMPropertyOperations.deleteValueForProperty(getNode(this),r);for(r in t){var s=t[r],l=r===STYLE?this._previousStyleCopy:null!=e?e[r]:void 0;if(t.hasOwnProperty(r)&&s!==l&&(null!=s||null!=l))if(r===STYLE)if(s?s=this._previousStyleCopy=_assign({},s):this._previousStyleCopy=null,l){for(a in l)!l.hasOwnProperty(a)||s&&s.hasOwnProperty(a)||(i=i||{},i[a]="");for(a in s)s.hasOwnProperty(a)&&l[a]!==s[a]&&(i=i||{},i[a]=s[a])}else i=s;else if(registrationNameModules.hasOwnProperty(r))s?enqueuePutListener(this,r,s,n):l&&deleteListener(this,r);else if(isCustomComponent(this._tag,t))RESERVED_PROPS.hasOwnProperty(r)||DOMPropertyOperations.setValueForAttribute(getNode(this),r,s);else if(DOMProperty.properties[r]||DOMProperty.isCustomAttribute(r)){var u=getNode(this);null!=s?DOMPropertyOperations.setValueForProperty(u,r,s):DOMPropertyOperations.deleteValueForProperty(u,r)}}i&&CSSPropertyOperations.setValueForStyles(getNode(this),i,this)},_updateDOMChildren:function(e,t,n,r){var a=CONTENT_TYPES[typeof e.children]?e.children:null,i=CONTENT_TYPES[typeof t.children]?t.children:null,o=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,s=t.dangerouslySetInnerHTML&&t.dangerouslySetInnerHTML.__html,l=null!=a?null:e.children,u=null!=i?null:t.children,p=null!=a||null!=o,c=null!=i||null!=s;null!=l&&null==u?this.updateChildren(null,n,r):p&&!c&&this.updateTextContent(""),null!=i?a!==i&&this.updateTextContent(""+i):null!=s?o!==s&&this.updateMarkup(""+s):null!=u&&this.updateChildren(u,n,r)},getNativeNode:function(){return getNode(this)},unmountComponent:function(e){switch(this._tag){case"iframe":case"object":case"img":case"form":case"video":case"audio":var t=this._wrapperState.listeners;if(t)for(var n=0;n<t.length;n++)t[n].remove();break;case"html":case"head":case"body":invariant(!1)}this.unmountChildren(e),ReactDOMComponentTree.uncacheNode(this),EventPluginHub.deleteAllListeners(this),ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null,this._domID=null,this._wrapperState=null},getPublicInstance:function(){return getNode(this)}},_assign(ReactDOMComponent.prototype,ReactDOMComponent.Mixin,ReactMultiChild.Mixin),module.exports=ReactDOMComponent; +},{"./DisabledInputUtils":89}],113:[function(require,module,exports){ +"use strict";function getDeclarationErrorAddendum(e){if(e){var t=e._currentElement._owner||null;if(t){var r=t.getName();if(r)return" This DOM node was rendered by `"+r+"`."}}return""}function friendlyStringify(e){if("object"==typeof e){if(Array.isArray(e))return"["+e.map(friendlyStringify).join(", ")+"]";var t=[];for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){var n=/^[a-z$_][\w$_]*$/i.test(r)?r:JSON.stringify(r);t.push(n+": "+friendlyStringify(e[r]))}return"{"+t.join(", ")+"}"}return"string"==typeof e?JSON.stringify(e):"function"==typeof e?"[function object]":String(e)}function checkAndWarnForMutatedStyle(e,t,r){if(null!=e&&null!=t&&!shallowEqual(e,t)){var n,a=r._tag,o=r._currentElement._owner;o&&(n=o.getName());var s=n+"|"+a;styleMutationWarning.hasOwnProperty(s)||(styleMutationWarning[s]=!0)}}function assertValidProps(e,t){t&&(voidElementTags[e._tag]&&(null!=t.children||null!=t.dangerouslySetInnerHTML?_prodInvariant("137",e._tag,e._currentElement._owner?" Check the render method of "+e._currentElement._owner.getName()+".":""):void 0),null!=t.dangerouslySetInnerHTML&&(null!=t.children?_prodInvariant("60"):void 0,"object"==typeof t.dangerouslySetInnerHTML&&HTML in t.dangerouslySetInnerHTML?void 0:_prodInvariant("61")),null!=t.style&&"object"!=typeof t.style?_prodInvariant("62",getDeclarationErrorAddendum(e)):void 0)}function enqueuePutListener(e,t,r,n){if(!(n instanceof ReactServerRenderingTransaction)){var a=e._hostContainerInfo,o=a._node&&a._node.nodeType===DOC_FRAGMENT_TYPE,s=o?a._node:a._ownerDocument;listenTo(t,s),n.getReactMountReady().enqueue(putListener,{inst:e,registrationName:t,listener:r})}}function putListener(){var e=this;EventPluginHub.putListener(e.inst,e.registrationName,e.listener)}function inputPostMount(){var e=this;ReactDOMInput.postMountWrapper(e)}function textareaPostMount(){var e=this;ReactDOMTextarea.postMountWrapper(e)}function optionPostMount(){var e=this;ReactDOMOption.postMountWrapper(e)}function trapBubbledEventsLocal(){var e=this;e._rootNodeID?void 0:_prodInvariant("63");var t=getNode(e);switch(t?void 0:_prodInvariant("64"),e._tag){case"iframe":case"object":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad,"load",t)];break;case"video":case"audio":e._wrapperState.listeners=[];for(var r in mediaEvents)mediaEvents.hasOwnProperty(r)&&e._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[r],mediaEvents[r],t));break;case"source":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError,"error",t)];break;case"img":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError,"error",t),ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad,"load",t)];break;case"form":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset,"reset",t),ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit,"submit",t)];break;case"input":case"select":case"textarea":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topInvalid,"invalid",t)]}}function postUpdateSelectWrapper(){ReactDOMSelect.postUpdateWrapper(this)}function validateDangerousTag(e){hasOwnProperty.call(validatedTagCache,e)||(VALID_TAG_REGEX.test(e)?void 0:_prodInvariant("65",e),validatedTagCache[e]=!0)}function isCustomComponent(e,t){return e.indexOf("-")>=0||null!=t.is}function ReactDOMComponent(e){var t=e.type;validateDangerousTag(t),this._currentElement=e,this._tag=t.toLowerCase(),this._namespaceURI=null,this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._hostNode=null,this._hostParent=null,this._rootNodeID=null,this._domID=null,this._hostContainerInfo=null,this._wrapperState=null,this._topLevelWrapper=null,this._flags=0}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),AutoFocusUtils=require("./AutoFocusUtils"),CSSPropertyOperations=require("./CSSPropertyOperations"),DOMLazyTree=require("./DOMLazyTree"),DOMNamespaces=require("./DOMNamespaces"),DOMProperty=require("./DOMProperty"),DOMPropertyOperations=require("./DOMPropertyOperations"),EventConstants=require("./EventConstants"),EventPluginHub=require("./EventPluginHub"),EventPluginRegistry=require("./EventPluginRegistry"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactComponentBrowserEnvironment=require("./ReactComponentBrowserEnvironment"),ReactDOMButton=require("./ReactDOMButton"),ReactDOMComponentFlags=require("./ReactDOMComponentFlags"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMInput=require("./ReactDOMInput"),ReactDOMOption=require("./ReactDOMOption"),ReactDOMSelect=require("./ReactDOMSelect"),ReactDOMTextarea=require("./ReactDOMTextarea"),ReactInstrumentation=require("./ReactInstrumentation"),ReactMultiChild=require("./ReactMultiChild"),ReactServerRenderingTransaction=require("./ReactServerRenderingTransaction"),emptyFunction=require("fbjs/lib/emptyFunction"),escapeTextContentForBrowser=require("./escapeTextContentForBrowser"),invariant=require("fbjs/lib/invariant"),isEventSupported=require("./isEventSupported"),keyOf=require("fbjs/lib/keyOf"),shallowEqual=require("fbjs/lib/shallowEqual"),validateDOMNesting=require("./validateDOMNesting"),warning=require("fbjs/lib/warning"),Flags=ReactDOMComponentFlags,deleteListener=EventPluginHub.deleteListener,getNode=ReactDOMComponentTree.getNodeFromInstance,listenTo=ReactBrowserEventEmitter.listenTo,registrationNameModules=EventPluginRegistry.registrationNameModules,CONTENT_TYPES={string:!0,number:!0},STYLE=keyOf({style:null}),HTML=keyOf({__html:null}),RESERVED_PROPS={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null},DOC_FRAGMENT_TYPE=11,styleMutationWarning={},setContentChildForInstrumentation=emptyFunction,mediaEvents={topAbort:"abort",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topSeeked:"seeked",topSeeking:"seeking",topStalled:"stalled",topSuspend:"suspend",topTimeUpdate:"timeupdate",topVolumeChange:"volumechange",topWaiting:"waiting"},omittedCloseTags={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},newlineEatingTags={listing:!0,pre:!0,textarea:!0},voidElementTags=_assign({menuitem:!0},omittedCloseTags),VALID_TAG_REGEX=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,validatedTagCache={},hasOwnProperty={}.hasOwnProperty,globalIdCounter=1;ReactDOMComponent.displayName="ReactDOMComponent",ReactDOMComponent.Mixin={mountComponent:function(e,t,r,n){this._rootNodeID=globalIdCounter++,this._domID=r._idCounter++,this._hostParent=t,this._hostContainerInfo=r;var a=this._currentElement.props;switch(this._tag){case"audio":case"form":case"iframe":case"img":case"link":case"object":case"source":case"video":this._wrapperState={listeners:null},e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"button":a=ReactDOMButton.getHostProps(this,a,t);break;case"input":ReactDOMInput.mountWrapper(this,a,t),a=ReactDOMInput.getHostProps(this,a),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"option":ReactDOMOption.mountWrapper(this,a,t),a=ReactDOMOption.getHostProps(this,a);break;case"select":ReactDOMSelect.mountWrapper(this,a,t),a=ReactDOMSelect.getHostProps(this,a),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"textarea":ReactDOMTextarea.mountWrapper(this,a,t),a=ReactDOMTextarea.getHostProps(this,a),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this)}assertValidProps(this,a);var o,s;null!=t?(o=t._namespaceURI,s=t._tag):r._tag&&(o=r._namespaceURI,s=r._tag),(null==o||o===DOMNamespaces.svg&&"foreignobject"===s)&&(o=DOMNamespaces.html),o===DOMNamespaces.html&&("svg"===this._tag?o=DOMNamespaces.svg:"math"===this._tag&&(o=DOMNamespaces.mathml)),this._namespaceURI=o;var i;if(e.useCreateElement){var u,l=r._ownerDocument;if(o===DOMNamespaces.html)if("script"===this._tag){var p=l.createElement("div"),c=this._currentElement.type;p.innerHTML="<"+c+"></"+c+">",u=p.removeChild(p.firstChild)}else u=a.is?l.createElement(this._currentElement.type,a.is):l.createElement(this._currentElement.type);else u=l.createElementNS(o,this._currentElement.type);ReactDOMComponentTree.precacheNode(this,u),this._flags|=Flags.hasCachedChildNodes,this._hostParent||DOMPropertyOperations.setAttributeForRoot(u),this._updateDOMProperties(null,a,e);var d=DOMLazyTree(u);this._createInitialChildren(e,a,n,d),i=d}else{var h=this._createOpenTagMarkupAndPutListeners(e,a),g=this._createContentMarkup(e,a,n);i=!g&&omittedCloseTags[this._tag]?h+"/>":h+">"+g+"</"+this._currentElement.type+">"}switch(this._tag){case"input":e.getReactMountReady().enqueue(inputPostMount,this),a.autoFocus&&e.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent,this);break;case"textarea":e.getReactMountReady().enqueue(textareaPostMount,this),a.autoFocus&&e.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent,this);break;case"select":a.autoFocus&&e.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent,this);break;case"button":a.autoFocus&&e.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent,this);break;case"option":e.getReactMountReady().enqueue(optionPostMount,this)}return i},_createOpenTagMarkupAndPutListeners:function(e,t){var r="<"+this._currentElement.type;for(var n in t)if(t.hasOwnProperty(n)){var a=t[n];if(null!=a)if(registrationNameModules.hasOwnProperty(n))a&&enqueuePutListener(this,n,a,e);else{n===STYLE&&(a&&(a=this._previousStyleCopy=_assign({},t.style)),a=CSSPropertyOperations.createMarkupForStyles(a,this));var o=null;null!=this._tag&&isCustomComponent(this._tag,t)?RESERVED_PROPS.hasOwnProperty(n)||(o=DOMPropertyOperations.createMarkupForCustomAttribute(n,a)):o=DOMPropertyOperations.createMarkupForProperty(n,a),o&&(r+=" "+o)}}return e.renderToStaticMarkup?r:(this._hostParent||(r+=" "+DOMPropertyOperations.createMarkupForRoot()),r+=" "+DOMPropertyOperations.createMarkupForID(this._domID))},_createContentMarkup:function(e,t,r){var n="",a=t.dangerouslySetInnerHTML;if(null!=a)null!=a.__html&&(n=a.__html);else{var o=CONTENT_TYPES[typeof t.children]?t.children:null,s=null!=o?null:t.children;if(null!=o)n=escapeTextContentForBrowser(o);else if(null!=s){var i=this.mountChildren(s,e,r);n=i.join("")}}return newlineEatingTags[this._tag]&&"\n"===n.charAt(0)?"\n"+n:n},_createInitialChildren:function(e,t,r,n){var a=t.dangerouslySetInnerHTML;if(null!=a)null!=a.__html&&DOMLazyTree.queueHTML(n,a.__html);else{var o=CONTENT_TYPES[typeof t.children]?t.children:null,s=null!=o?null:t.children;if(null!=o)DOMLazyTree.queueText(n,o);else if(null!=s)for(var i=this.mountChildren(s,e,r),u=0;u<i.length;u++)DOMLazyTree.queueChild(n,i[u])}},receiveComponent:function(e,t,r){var n=this._currentElement;this._currentElement=e,this.updateComponent(t,n,e,r)},updateComponent:function(e,t,r,n){var a=t.props,o=this._currentElement.props;switch(this._tag){case"button":a=ReactDOMButton.getHostProps(this,a),o=ReactDOMButton.getHostProps(this,o);break;case"input":ReactDOMInput.updateWrapper(this),a=ReactDOMInput.getHostProps(this,a),o=ReactDOMInput.getHostProps(this,o);break;case"option":a=ReactDOMOption.getHostProps(this,a),o=ReactDOMOption.getHostProps(this,o);break;case"select":a=ReactDOMSelect.getHostProps(this,a),o=ReactDOMSelect.getHostProps(this,o);break;case"textarea":ReactDOMTextarea.updateWrapper(this),a=ReactDOMTextarea.getHostProps(this,a),o=ReactDOMTextarea.getHostProps(this,o)}assertValidProps(this,o),this._updateDOMProperties(a,o,e),this._updateDOMChildren(a,o,e,n),"select"===this._tag&&e.getReactMountReady().enqueue(postUpdateSelectWrapper,this)},_updateDOMProperties:function(e,t,r){var n,a,o;for(n in e)if(!t.hasOwnProperty(n)&&e.hasOwnProperty(n)&&null!=e[n])if(n===STYLE){var s=this._previousStyleCopy;for(a in s)s.hasOwnProperty(a)&&(o=o||{},o[a]="");this._previousStyleCopy=null}else registrationNameModules.hasOwnProperty(n)?e[n]&&deleteListener(this,n):isCustomComponent(this._tag,e)?RESERVED_PROPS.hasOwnProperty(n)||DOMPropertyOperations.deleteValueForAttribute(getNode(this),n):(DOMProperty.properties[n]||DOMProperty.isCustomAttribute(n))&&DOMPropertyOperations.deleteValueForProperty(getNode(this),n);for(n in t){var i=t[n],u=n===STYLE?this._previousStyleCopy:null!=e?e[n]:void 0;if(t.hasOwnProperty(n)&&i!==u&&(null!=i||null!=u))if(n===STYLE)if(i?i=this._previousStyleCopy=_assign({},i):this._previousStyleCopy=null,u){for(a in u)!u.hasOwnProperty(a)||i&&i.hasOwnProperty(a)||(o=o||{},o[a]="");for(a in i)i.hasOwnProperty(a)&&u[a]!==i[a]&&(o=o||{},o[a]=i[a])}else o=i;else if(registrationNameModules.hasOwnProperty(n))i?enqueuePutListener(this,n,i,r):u&&deleteListener(this,n);else if(isCustomComponent(this._tag,t))RESERVED_PROPS.hasOwnProperty(n)||DOMPropertyOperations.setValueForAttribute(getNode(this),n,i);else if(DOMProperty.properties[n]||DOMProperty.isCustomAttribute(n)){var l=getNode(this);null!=i?DOMPropertyOperations.setValueForProperty(l,n,i):DOMPropertyOperations.deleteValueForProperty(l,n)}}o&&CSSPropertyOperations.setValueForStyles(getNode(this),o,this)},_updateDOMChildren:function(e,t,r,n){var a=CONTENT_TYPES[typeof e.children]?e.children:null,o=CONTENT_TYPES[typeof t.children]?t.children:null,s=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,i=t.dangerouslySetInnerHTML&&t.dangerouslySetInnerHTML.__html,u=null!=a?null:e.children,l=null!=o?null:t.children,p=null!=a||null!=s,c=null!=o||null!=i;null!=u&&null==l?this.updateChildren(null,r,n):p&&!c&&this.updateTextContent(""),null!=o?a!==o&&this.updateTextContent(""+o):null!=i?s!==i&&this.updateMarkup(""+i):null!=l&&this.updateChildren(l,r,n)},getHostNode:function(){return getNode(this)},unmountComponent:function(e){switch(this._tag){case"audio":case"form":case"iframe":case"img":case"link":case"object":case"source":case"video":var t=this._wrapperState.listeners;if(t)for(var r=0;r<t.length;r++)t[r].remove();break;case"html":case"head":case"body":_prodInvariant("66",this._tag)}this.unmountChildren(e),ReactDOMComponentTree.uncacheNode(this),EventPluginHub.deleteAllListeners(this),ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null,this._domID=null,this._wrapperState=null},getPublicInstance:function(){return getNode(this)}},_assign(ReactDOMComponent.prototype,ReactDOMComponent.Mixin,ReactMultiChild.Mixin),module.exports=ReactDOMComponent; -},{"./AutoFocusUtils":77,"./CSSPropertyOperations":80,"./DOMLazyTree":84,"./DOMNamespaces":85,"./DOMProperty":86,"./DOMPropertyOperations":87,"./EventConstants":92,"./EventPluginHub":93,"./EventPluginRegistry":94,"./ReactBrowserEventEmitter":103,"./ReactComponentBrowserEnvironment":108,"./ReactDOMButton":113,"./ReactDOMComponentFlags":115,"./ReactDOMComponentTree":116,"./ReactDOMInput":123,"./ReactDOMOption":125,"./ReactDOMSelect":126,"./ReactDOMTextarea":129,"./ReactInstrumentation":145,"./ReactMultiChild":148,"./ReactServerRenderingTransaction":160,"./escapeTextContentForBrowser":187,"./isEventSupported":201,"./validateDOMNesting":210,"fbjs/lib/emptyFunction":218,"fbjs/lib/invariant":226,"fbjs/lib/keyOf":230,"fbjs/lib/shallowEqual":235,"fbjs/lib/warning":236,"object-assign":32}],115:[function(require,module,exports){ +},{"./AutoFocusUtils":76,"./CSSPropertyOperations":79,"./DOMLazyTree":83,"./DOMNamespaces":84,"./DOMProperty":85,"./DOMPropertyOperations":86,"./EventConstants":91,"./EventPluginHub":92,"./EventPluginRegistry":93,"./ReactBrowserEventEmitter":102,"./ReactComponentBrowserEnvironment":107,"./ReactDOMButton":112,"./ReactDOMComponentFlags":114,"./ReactDOMComponentTree":115,"./ReactDOMInput":121,"./ReactDOMOption":123,"./ReactDOMSelect":124,"./ReactDOMTextarea":127,"./ReactInstrumentation":141,"./ReactMultiChild":144,"./ReactServerRenderingTransaction":155,"./escapeTextContentForBrowser":184,"./isEventSupported":198,"./reactProdInvariant":202,"./validateDOMNesting":208,"fbjs/lib/emptyFunction":216,"fbjs/lib/invariant":224,"fbjs/lib/keyOf":228,"fbjs/lib/shallowEqual":231,"fbjs/lib/warning":232,"object-assign":31}],114:[function(require,module,exports){ "use strict";var ReactDOMComponentFlags={hasCachedChildNodes:1};module.exports=ReactDOMComponentFlags; -},{}],116:[function(require,module,exports){ -"use strict";function getRenderedNativeOrTextFromComponent(e){for(var n;n=e._renderedComponent;)e=n;return e}function precacheNode(e,n){var t=getRenderedNativeOrTextFromComponent(e);t._nativeNode=n,n[internalInstanceKey]=t}function uncacheNode(e){var n=e._nativeNode;n&&(delete n[internalInstanceKey],e._nativeNode=null)}function precacheChildNodes(e,n){if(!(e._flags&Flags.hasCachedChildNodes)){var t=e._renderedChildren,r=n.firstChild;e:for(var o in t)if(t.hasOwnProperty(o)){var a=t[o],i=getRenderedNativeOrTextFromComponent(a)._domID;if(null!=i){for(;null!==r;r=r.nextSibling)if(1===r.nodeType&&r.getAttribute(ATTR_NAME)===String(i)||8===r.nodeType&&r.nodeValue===" react-text: "+i+" "||8===r.nodeType&&r.nodeValue===" react-empty: "+i+" "){precacheNode(a,r);continue e}invariant(!1)}}e._flags|=Flags.hasCachedChildNodes}}function getClosestInstanceFromNode(e){if(e[internalInstanceKey])return e[internalInstanceKey];for(var n=[];!e[internalInstanceKey];){if(n.push(e),!e.parentNode)return null;e=e.parentNode}for(var t,r;e&&(r=e[internalInstanceKey]);e=n.pop())t=r,n.length&&precacheChildNodes(r,e);return t}function getInstanceFromNode(e){var n=getClosestInstanceFromNode(e);return null!=n&&n._nativeNode===e?n:null}function getNodeFromInstance(e){if(void 0===e._nativeNode?invariant(!1):void 0,e._nativeNode)return e._nativeNode;for(var n=[];!e._nativeNode;)n.push(e),e._nativeParent?void 0:invariant(!1),e=e._nativeParent;for(;n.length;e=n.pop())precacheChildNodes(e,e._nativeNode);return e._nativeNode}var DOMProperty=require("./DOMProperty"),ReactDOMComponentFlags=require("./ReactDOMComponentFlags"),invariant=require("fbjs/lib/invariant"),ATTR_NAME=DOMProperty.ID_ATTRIBUTE_NAME,Flags=ReactDOMComponentFlags,internalInstanceKey="__reactInternalInstance$"+Math.random().toString(36).slice(2),ReactDOMComponentTree={getClosestInstanceFromNode:getClosestInstanceFromNode,getInstanceFromNode:getInstanceFromNode,getNodeFromInstance:getNodeFromInstance,precacheChildNodes:precacheChildNodes,precacheNode:precacheNode,uncacheNode:uncacheNode};module.exports=ReactDOMComponentTree; +},{}],115:[function(require,module,exports){ +"use strict";function getRenderedHostOrTextFromComponent(e){for(var n;n=e._renderedComponent;)e=n;return e}function precacheNode(e,n){var t=getRenderedHostOrTextFromComponent(e);t._hostNode=n,n[internalInstanceKey]=t}function uncacheNode(e){var n=e._hostNode;n&&(delete n[internalInstanceKey],e._hostNode=null)}function precacheChildNodes(e,n){if(!(e._flags&Flags.hasCachedChildNodes)){var t=e._renderedChildren,o=n.firstChild;e:for(var r in t)if(t.hasOwnProperty(r)){var a=t[r],d=getRenderedHostOrTextFromComponent(a)._domID;if(null!=d){for(;null!==o;o=o.nextSibling)if(1===o.nodeType&&o.getAttribute(ATTR_NAME)===String(d)||8===o.nodeType&&o.nodeValue===" react-text: "+d+" "||8===o.nodeType&&o.nodeValue===" react-empty: "+d+" "){precacheNode(a,o);continue e}_prodInvariant("32",d)}}e._flags|=Flags.hasCachedChildNodes}}function getClosestInstanceFromNode(e){if(e[internalInstanceKey])return e[internalInstanceKey];for(var n=[];!e[internalInstanceKey];){if(n.push(e),!e.parentNode)return null;e=e.parentNode}for(var t,o;e&&(o=e[internalInstanceKey]);e=n.pop())t=o,n.length&&precacheChildNodes(o,e);return t}function getInstanceFromNode(e){var n=getClosestInstanceFromNode(e);return null!=n&&n._hostNode===e?n:null}function getNodeFromInstance(e){if(void 0===e._hostNode?_prodInvariant("33"):void 0,e._hostNode)return e._hostNode;for(var n=[];!e._hostNode;)n.push(e),e._hostParent?void 0:_prodInvariant("34"),e=e._hostParent;for(;n.length;e=n.pop())precacheChildNodes(e,e._hostNode);return e._hostNode}var _prodInvariant=require("./reactProdInvariant"),DOMProperty=require("./DOMProperty"),ReactDOMComponentFlags=require("./ReactDOMComponentFlags"),invariant=require("fbjs/lib/invariant"),ATTR_NAME=DOMProperty.ID_ATTRIBUTE_NAME,Flags=ReactDOMComponentFlags,internalInstanceKey="__reactInternalInstance$"+Math.random().toString(36).slice(2),ReactDOMComponentTree={getClosestInstanceFromNode:getClosestInstanceFromNode,getInstanceFromNode:getInstanceFromNode,getNodeFromInstance:getNodeFromInstance,precacheChildNodes:precacheChildNodes,precacheNode:precacheNode,uncacheNode:uncacheNode};module.exports=ReactDOMComponentTree; -},{"./DOMProperty":86,"./ReactDOMComponentFlags":115,"fbjs/lib/invariant":226}],117:[function(require,module,exports){ +},{"./DOMProperty":85,"./ReactDOMComponentFlags":114,"./reactProdInvariant":202,"fbjs/lib/invariant":224}],116:[function(require,module,exports){ "use strict";function ReactDOMContainerInfo(e,n){var t={_topLevelWrapper:e,_idCounter:1,_ownerDocument:n?n.nodeType===DOC_NODE_TYPE?n:n.ownerDocument:null,_node:n,_tag:n?n.nodeName.toLowerCase():null,_namespaceURI:n?n.namespaceURI:null};return t}var validateDOMNesting=require("./validateDOMNesting"),DOC_NODE_TYPE=9;module.exports=ReactDOMContainerInfo; -},{"./validateDOMNesting":210}],118:[function(require,module,exports){ -"use strict";function emitEvent(e,o,t,n,r,a){}var ReactDOMUnknownPropertyDevtool=require("./ReactDOMUnknownPropertyDevtool"),warning=require("fbjs/lib/warning"),eventHandlers=[],handlerDoesThrowForEvent={},ReactDOMDebugTool={addDevtool:function(e){eventHandlers.push(e)},removeDevtool:function(e){for(var o=0;o<eventHandlers.length;o++)eventHandlers[o]===e&&(eventHandlers.splice(o,1),o--)},onCreateMarkupForProperty:function(e,o){emitEvent("onCreateMarkupForProperty",e,o)},onSetValueForProperty:function(e,o,t){emitEvent("onSetValueForProperty",e,o,t)},onDeleteValueForProperty:function(e,o){emitEvent("onDeleteValueForProperty",e,o)}};ReactDOMDebugTool.addDevtool(ReactDOMUnknownPropertyDevtool),module.exports=ReactDOMDebugTool; - -},{"./ReactDOMUnknownPropertyDevtool":131,"fbjs/lib/warning":236}],119:[function(require,module,exports){ -"use strict";var _assign=require("object-assign"),DOMLazyTree=require("./DOMLazyTree"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMEmptyComponent=function(e){this._currentElement=null,this._nativeNode=null,this._nativeParent=null,this._nativeContainerInfo=null,this._domID=null};_assign(ReactDOMEmptyComponent.prototype,{mountComponent:function(e,t,n,o){var r=n._idCounter++;this._domID=r,this._nativeParent=t,this._nativeContainerInfo=n;var a=" react-empty: "+this._domID+" ";if(e.useCreateElement){var i=n._ownerDocument,m=i.createComment(a);return ReactDOMComponentTree.precacheNode(this,m),DOMLazyTree(m)}return e.renderToStaticMarkup?"":"<!--"+a+"-->"},receiveComponent:function(){},getNativeNode:function(){return ReactDOMComponentTree.getNodeFromInstance(this)},unmountComponent:function(){ReactDOMComponentTree.uncacheNode(this)}}),module.exports=ReactDOMEmptyComponent; +},{"./validateDOMNesting":208}],117:[function(require,module,exports){ +"use strict";var _assign=require("object-assign"),DOMLazyTree=require("./DOMLazyTree"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMEmptyComponent=function(e){this._currentElement=null,this._hostNode=null,this._hostParent=null,this._hostContainerInfo=null,this._domID=null};_assign(ReactDOMEmptyComponent.prototype,{mountComponent:function(e,t,n,o){var r=n._idCounter++;this._domID=r,this._hostParent=t,this._hostContainerInfo=n;var a=" react-empty: "+this._domID+" ";if(e.useCreateElement){var i=n._ownerDocument,s=i.createComment(a);return ReactDOMComponentTree.precacheNode(this,s),DOMLazyTree(s)}return e.renderToStaticMarkup?"":"<!--"+a+"-->"},receiveComponent:function(){},getHostNode:function(){return ReactDOMComponentTree.getNodeFromInstance(this)},unmountComponent:function(){ReactDOMComponentTree.uncacheNode(this)}}),module.exports=ReactDOMEmptyComponent; -},{"./DOMLazyTree":84,"./ReactDOMComponentTree":116,"object-assign":32}],120:[function(require,module,exports){ -"use strict";function createDOMFactory(e){return ReactElement.createFactory(e)}var ReactElement=require("./ReactElement"),ReactElementValidator=require("./ReactElementValidator"),mapObject=require("fbjs/lib/mapObject"),ReactDOMFactories=mapObject({a:"a",abbr:"abbr",address:"address",area:"area",article:"article",aside:"aside",audio:"audio",b:"b",base:"base",bdi:"bdi",bdo:"bdo",big:"big",blockquote:"blockquote",body:"body",br:"br",button:"button",canvas:"canvas",caption:"caption",cite:"cite",code:"code",col:"col",colgroup:"colgroup",data:"data",datalist:"datalist",dd:"dd",del:"del",details:"details",dfn:"dfn",dialog:"dialog",div:"div",dl:"dl",dt:"dt",em:"em",embed:"embed",fieldset:"fieldset",figcaption:"figcaption",figure:"figure",footer:"footer",form:"form",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",head:"head",header:"header",hgroup:"hgroup",hr:"hr",html:"html",i:"i",iframe:"iframe",img:"img",input:"input",ins:"ins",kbd:"kbd",keygen:"keygen",label:"label",legend:"legend",li:"li",link:"link",main:"main",map:"map",mark:"mark",menu:"menu",menuitem:"menuitem",meta:"meta",meter:"meter",nav:"nav",noscript:"noscript",object:"object",ol:"ol",optgroup:"optgroup",option:"option",output:"output",p:"p",param:"param",picture:"picture",pre:"pre",progress:"progress",q:"q",rp:"rp",rt:"rt",ruby:"ruby",s:"s",samp:"samp",script:"script",section:"section",select:"select",small:"small",source:"source",span:"span",strong:"strong",style:"style",sub:"sub",summary:"summary",sup:"sup",table:"table",tbody:"tbody",td:"td",textarea:"textarea",tfoot:"tfoot",th:"th",thead:"thead",time:"time",title:"title",tr:"tr",track:"track",u:"u",ul:"ul","var":"var",video:"video",wbr:"wbr",circle:"circle",clipPath:"clipPath",defs:"defs",ellipse:"ellipse",g:"g",image:"image",line:"line",linearGradient:"linearGradient",mask:"mask",path:"path",pattern:"pattern",polygon:"polygon",polyline:"polyline",radialGradient:"radialGradient",rect:"rect",stop:"stop",svg:"svg",text:"text",tspan:"tspan"},createDOMFactory);module.exports=ReactDOMFactories; +},{"./DOMLazyTree":83,"./ReactDOMComponentTree":115,"object-assign":31}],118:[function(require,module,exports){ +"use strict";function createDOMFactory(e){return ReactElement.createFactory(e)}var ReactElement=require("./ReactElement"),mapObject=require("fbjs/lib/mapObject"),ReactDOMFactories=mapObject({a:"a",abbr:"abbr",address:"address",area:"area",article:"article",aside:"aside",audio:"audio",b:"b",base:"base",bdi:"bdi",bdo:"bdo",big:"big",blockquote:"blockquote",body:"body",br:"br",button:"button",canvas:"canvas",caption:"caption",cite:"cite",code:"code",col:"col",colgroup:"colgroup",data:"data",datalist:"datalist",dd:"dd",del:"del",details:"details",dfn:"dfn",dialog:"dialog",div:"div",dl:"dl",dt:"dt",em:"em",embed:"embed",fieldset:"fieldset",figcaption:"figcaption",figure:"figure",footer:"footer",form:"form",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",head:"head",header:"header",hgroup:"hgroup",hr:"hr",html:"html",i:"i",iframe:"iframe",img:"img",input:"input",ins:"ins",kbd:"kbd",keygen:"keygen",label:"label",legend:"legend",li:"li",link:"link",main:"main",map:"map",mark:"mark",menu:"menu",menuitem:"menuitem",meta:"meta",meter:"meter",nav:"nav",noscript:"noscript",object:"object",ol:"ol",optgroup:"optgroup",option:"option",output:"output",p:"p",param:"param",picture:"picture",pre:"pre",progress:"progress",q:"q",rp:"rp",rt:"rt",ruby:"ruby",s:"s",samp:"samp",script:"script",section:"section",select:"select",small:"small",source:"source",span:"span",strong:"strong",style:"style",sub:"sub",summary:"summary",sup:"sup",table:"table",tbody:"tbody",td:"td",textarea:"textarea",tfoot:"tfoot",th:"th",thead:"thead",time:"time",title:"title",tr:"tr",track:"track",u:"u",ul:"ul",var:"var",video:"video",wbr:"wbr",circle:"circle",clipPath:"clipPath",defs:"defs",ellipse:"ellipse",g:"g",image:"image",line:"line",linearGradient:"linearGradient",mask:"mask",path:"path",pattern:"pattern",polygon:"polygon",polyline:"polyline",radialGradient:"radialGradient",rect:"rect",stop:"stop",svg:"svg",text:"text",tspan:"tspan"},createDOMFactory);module.exports=ReactDOMFactories; -},{"./ReactElement":135,"./ReactElementValidator":136,"fbjs/lib/mapObject":231}],121:[function(require,module,exports){ +},{"./ReactElement":131,"fbjs/lib/mapObject":229}],119:[function(require,module,exports){ "use strict";var ReactDOMFeatureFlags={useCreateElement:!0};module.exports=ReactDOMFeatureFlags; -},{}],122:[function(require,module,exports){ +},{}],120:[function(require,module,exports){ "use strict";var DOMChildrenOperations=require("./DOMChildrenOperations"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMIDOperations={dangerouslyProcessChildrenUpdates:function(e,r){var t=ReactDOMComponentTree.getNodeFromInstance(e);DOMChildrenOperations.processUpdates(t,r)}};module.exports=ReactDOMIDOperations; -},{"./DOMChildrenOperations":83,"./ReactDOMComponentTree":116}],123:[function(require,module,exports){ -"use strict";function forceUpdateIfMounted(){this._rootNodeID&&ReactDOMInput.updateWrapper(this)}function warnIfValueIsNull(e){null==e||null!==e.value||didWarnValueNull||(didWarnValueNull=!0)}function _handleChange(e){var t=this._currentElement.props,a=LinkedValueUtils.executeOnChange(t,e);ReactUpdates.asap(forceUpdateIfMounted,this);var n=t.name;if("radio"===t.type&&null!=n){for(var r=ReactDOMComponentTree.getNodeFromInstance(this),l=r;l.parentNode;)l=l.parentNode;for(var i=l.querySelectorAll("input[name="+JSON.stringify(""+n)+'][type="radio"]'),o=0;o<i.length;o++){var u=i[o];if(u!==r&&u.form===r.form){var d=ReactDOMComponentTree.getInstanceFromNode(u);d?void 0:invariant(!1),ReactUpdates.asap(forceUpdateIfMounted,d)}}}return a}var _assign=require("object-assign"),DisabledInputUtils=require("./DisabledInputUtils"),DOMPropertyOperations=require("./DOMPropertyOperations"),LinkedValueUtils=require("./LinkedValueUtils"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),didWarnValueLink=!1,didWarnCheckedLink=!1,didWarnValueNull=!1,didWarnValueDefaultValue=!1,didWarnCheckedDefaultChecked=!1,didWarnControlledToUncontrolled=!1,didWarnUncontrolledToControlled=!1,ReactDOMInput={getNativeProps:function(e,t){var a=LinkedValueUtils.getValue(t),n=LinkedValueUtils.getChecked(t),r=_assign({type:void 0},DisabledInputUtils.getNativeProps(e,t),{defaultChecked:void 0,defaultValue:void 0,value:null!=a?a:e._wrapperState.initialValue,checked:null!=n?n:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange});return r},mountWrapper:function(e,t){var a=t.defaultValue;e._wrapperState={initialChecked:t.defaultChecked||!1,initialValue:null!=a?a:null,listeners:null,onChange:_handleChange.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,a=t.checked;null!=a&&DOMPropertyOperations.setValueForProperty(ReactDOMComponentTree.getNodeFromInstance(e),"checked",a||!1);var n=LinkedValueUtils.getValue(t);null!=n&&DOMPropertyOperations.setValueForProperty(ReactDOMComponentTree.getNodeFromInstance(e),"value",""+n)}};module.exports=ReactDOMInput; +},{"./DOMChildrenOperations":82,"./ReactDOMComponentTree":115}],121:[function(require,module,exports){ +"use strict";function forceUpdateIfMounted(){this._rootNodeID&&ReactDOMInput.updateWrapper(this)}function isControlled(e){var t="checkbox"===e.type||"radio"===e.type;return t?void 0!==e.checked:void 0!==e.value}function _handleChange(e){var t=this._currentElement.props,a=LinkedValueUtils.executeOnChange(t,e);ReactUpdates.asap(forceUpdateIfMounted,this);var n=t.name;if("radio"===t.type&&null!=n){for(var r=ReactDOMComponentTree.getNodeFromInstance(this),l=r;l.parentNode;)l=l.parentNode;for(var d=l.querySelectorAll("input[name="+JSON.stringify(""+n)+'][type="radio"]'),u=0;u<d.length;u++){var i=d[u];if(i!==r&&i.form===r.form){var o=ReactDOMComponentTree.getInstanceFromNode(i);o?void 0:_prodInvariant("90"),ReactUpdates.asap(forceUpdateIfMounted,o)}}}return a}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),DisabledInputUtils=require("./DisabledInputUtils"),DOMPropertyOperations=require("./DOMPropertyOperations"),LinkedValueUtils=require("./LinkedValueUtils"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),didWarnValueLink=!1,didWarnCheckedLink=!1,didWarnValueDefaultValue=!1,didWarnCheckedDefaultChecked=!1,didWarnControlledToUncontrolled=!1,didWarnUncontrolledToControlled=!1,ReactDOMInput={getHostProps:function(e,t){var a=LinkedValueUtils.getValue(t),n=LinkedValueUtils.getChecked(t),r=_assign({type:void 0},DisabledInputUtils.getHostProps(e,t),{defaultChecked:void 0,defaultValue:void 0,value:null!=a?a:e._wrapperState.initialValue,checked:null!=n?n:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange});return r},mountWrapper:function(e,t){var a=t.defaultValue;e._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:null!=t.value?t.value:a,listeners:null,onChange:_handleChange.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,a=t.checked;null!=a&&DOMPropertyOperations.setValueForProperty(ReactDOMComponentTree.getNodeFromInstance(e),"checked",a||!1);var n=ReactDOMComponentTree.getNodeFromInstance(e),r=LinkedValueUtils.getValue(t);if(null!=r){var l=""+r;l!==n.value&&(n.value=l)}else null==t.value&&null!=t.defaultValue&&(n.defaultValue=""+t.defaultValue),null==t.checked&&null!=t.defaultChecked&&(n.defaultChecked=!!t.defaultChecked)},postMountWrapper:function(e){var t=e._currentElement.props,a=ReactDOMComponentTree.getNodeFromInstance(e);"submit"!==t.type&&"reset"!==t.type&&(a.value=a.value);var n=a.name;""!==n&&(a.name=""),a.defaultChecked=!a.defaultChecked,a.defaultChecked=!a.defaultChecked,""!==n&&(a.name=n)}};module.exports=ReactDOMInput; -},{"./DOMPropertyOperations":87,"./DisabledInputUtils":90,"./LinkedValueUtils":100,"./ReactDOMComponentTree":116,"./ReactUpdates":162,"fbjs/lib/invariant":226,"fbjs/lib/warning":236,"object-assign":32}],124:[function(require,module,exports){ -"use strict";var ReactDOMDebugTool=require("./ReactDOMDebugTool");module.exports={debugTool:ReactDOMDebugTool}; +},{"./DOMPropertyOperations":86,"./DisabledInputUtils":89,"./LinkedValueUtils":99,"./ReactDOMComponentTree":115,"./ReactUpdates":158,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232,"object-assign":31}],122:[function(require,module,exports){ +"use strict";var debugTool=null,ReactDOMDebugTool;module.exports={debugTool:debugTool}; -},{"./ReactDOMDebugTool":118}],125:[function(require,module,exports){ -"use strict";var _assign=require("object-assign"),ReactChildren=require("./ReactChildren"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMSelect=require("./ReactDOMSelect"),warning=require("fbjs/lib/warning"),ReactDOMOption={mountWrapper:function(e,t,r){var n=null;if(null!=r){var a=r;"optgroup"===a._tag&&(a=a._nativeParent),null!=a&&"select"===a._tag&&(n=ReactDOMSelect.getSelectValueContext(a))}var l=null;if(null!=n)if(l=!1,Array.isArray(n)){for(var i=0;i<n.length;i++)if(""+n[i]==""+t.value){l=!0;break}}else l=""+n==""+t.value;e._wrapperState={selected:l}},postMountWrapper:function(e){var t=e._currentElement.props;if(null!=t.value){var r=ReactDOMComponentTree.getNodeFromInstance(e);r.setAttribute("value",t.value)}},getNativeProps:function(e,t){var r=_assign({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(r.selected=e._wrapperState.selected);var n="";return ReactChildren.forEach(t.children,function(e){null!=e&&("string"!=typeof e&&"number"!=typeof e||(n+=e))}),n&&(r.children=n),r}};module.exports=ReactDOMOption; +},{}],123:[function(require,module,exports){ +"use strict";function flattenChildren(e){var t="";return ReactChildren.forEach(e,function(e){null!=e&&("string"==typeof e||"number"==typeof e?t+=e:didWarnInvalidOptionChildren||(didWarnInvalidOptionChildren=!0))}),t}var _assign=require("object-assign"),ReactChildren=require("./ReactChildren"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMSelect=require("./ReactDOMSelect"),warning=require("fbjs/lib/warning"),didWarnInvalidOptionChildren=!1,ReactDOMOption={mountWrapper:function(e,t,r){var n=null;if(null!=r){var a=r;"optgroup"===a._tag&&(a=a._hostParent),null!=a&&"select"===a._tag&&(n=ReactDOMSelect.getSelectValueContext(a))}var l=null;if(null!=n){var i;if(i=null!=t.value?t.value+"":flattenChildren(t.children),l=!1,Array.isArray(n)){for(var o=0;o<n.length;o++)if(""+n[o]===i){l=!0;break}}else l=""+n===i}e._wrapperState={selected:l}},postMountWrapper:function(e){var t=e._currentElement.props;if(null!=t.value){var r=ReactDOMComponentTree.getNodeFromInstance(e);r.setAttribute("value",t.value)}},getHostProps:function(e,t){var r=_assign({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(r.selected=e._wrapperState.selected);var n=flattenChildren(t.children);return n&&(r.children=n),r}};module.exports=ReactDOMOption; -},{"./ReactChildren":105,"./ReactDOMComponentTree":116,"./ReactDOMSelect":126,"fbjs/lib/warning":236,"object-assign":32}],126:[function(require,module,exports){ -"use strict";function updateOptionsIfPendingUpdateAndMounted(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=LinkedValueUtils.getValue(e);null!=t&&updateOptions(this,Boolean(e.multiple),t)}}function getDeclarationErrorAddendum(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function warnIfValueIsNull(e){null==e||null!==e.value||didWarnValueNull||(didWarnValueNull=!0)}function checkSelectPropTypes(e,t){var a=e._currentElement._owner;LinkedValueUtils.checkPropTypes("select",t,a),void 0===t.valueLink||didWarnValueLink||(didWarnValueLink=!0);for(var l=0;l<valuePropNames.length;l++){var n=valuePropNames[l];null!=t[n]&&t.multiple}}function updateOptions(e,t,a){var l,n,i=ReactDOMComponentTree.getNodeFromInstance(e).options;if(t){for(l={},n=0;n<a.length;n++)l[""+a[n]]=!0;for(n=0;n<i.length;n++){var u=l.hasOwnProperty(i[n].value);i[n].selected!==u&&(i[n].selected=u)}}else{for(l=""+a,n=0;n<i.length;n++)if(i[n].value===l)return void(i[n].selected=!0);i.length&&(i[0].selected=!0)}}function _handleChange(e){var t=this._currentElement.props,a=LinkedValueUtils.executeOnChange(t,e);return this._rootNodeID&&(this._wrapperState.pendingUpdate=!0),ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted,this),a}var _assign=require("object-assign"),DisabledInputUtils=require("./DisabledInputUtils"),LinkedValueUtils=require("./LinkedValueUtils"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),warning=require("fbjs/lib/warning"),didWarnValueLink=!1,didWarnValueNull=!1,didWarnValueDefaultValue=!1,valuePropNames=["value","defaultValue"],ReactDOMSelect={getNativeProps:function(e,t){return _assign({},DisabledInputUtils.getNativeProps(e,t),{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,t){var a=LinkedValueUtils.getValue(t);e._wrapperState={pendingUpdate:!1,initialValue:null!=a?a:t.defaultValue,listeners:null,onChange:_handleChange.bind(e),wasMultiple:Boolean(t.multiple)},void 0===t.value||void 0===t.defaultValue||didWarnValueDefaultValue||(didWarnValueDefaultValue=!0)},getSelectValueContext:function(e){return e._wrapperState.initialValue},postUpdateWrapper:function(e){var t=e._currentElement.props;e._wrapperState.initialValue=void 0;var a=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=Boolean(t.multiple);var l=LinkedValueUtils.getValue(t);null!=l?(e._wrapperState.pendingUpdate=!1,updateOptions(e,Boolean(t.multiple),l)):a!==Boolean(t.multiple)&&(null!=t.defaultValue?updateOptions(e,Boolean(t.multiple),t.defaultValue):updateOptions(e,Boolean(t.multiple),t.multiple?[]:""))}};module.exports=ReactDOMSelect; +},{"./ReactChildren":104,"./ReactDOMComponentTree":115,"./ReactDOMSelect":124,"fbjs/lib/warning":232,"object-assign":31}],124:[function(require,module,exports){ +"use strict";function updateOptionsIfPendingUpdateAndMounted(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=LinkedValueUtils.getValue(e);null!=t&&updateOptions(this,Boolean(e.multiple),t)}}function getDeclarationErrorAddendum(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function checkSelectPropTypes(e,t){var a=e._currentElement._owner;LinkedValueUtils.checkPropTypes("select",t,a),void 0===t.valueLink||didWarnValueLink||(didWarnValueLink=!0);for(var n=0;n<valuePropNames.length;n++){var l=valuePropNames[n];null!=t[l]&&t.multiple}}function updateOptions(e,t,a){var n,l,i=ReactDOMComponentTree.getNodeFromInstance(e).options;if(t){for(n={},l=0;l<a.length;l++)n[""+a[l]]=!0;for(l=0;l<i.length;l++){var r=n.hasOwnProperty(i[l].value);i[l].selected!==r&&(i[l].selected=r)}}else{for(n=""+a,l=0;l<i.length;l++)if(i[l].value===n)return void(i[l].selected=!0);i.length&&(i[0].selected=!0)}}function _handleChange(e){var t=this._currentElement.props,a=LinkedValueUtils.executeOnChange(t,e);return this._rootNodeID&&(this._wrapperState.pendingUpdate=!0),ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted,this),a}var _assign=require("object-assign"),DisabledInputUtils=require("./DisabledInputUtils"),LinkedValueUtils=require("./LinkedValueUtils"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),warning=require("fbjs/lib/warning"),didWarnValueLink=!1,didWarnValueDefaultValue=!1,valuePropNames=["value","defaultValue"],ReactDOMSelect={getHostProps:function(e,t){return _assign({},DisabledInputUtils.getHostProps(e,t),{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,t){var a=LinkedValueUtils.getValue(t);e._wrapperState={pendingUpdate:!1,initialValue:null!=a?a:t.defaultValue,listeners:null,onChange:_handleChange.bind(e),wasMultiple:Boolean(t.multiple)},void 0===t.value||void 0===t.defaultValue||didWarnValueDefaultValue||(didWarnValueDefaultValue=!0)},getSelectValueContext:function(e){return e._wrapperState.initialValue},postUpdateWrapper:function(e){var t=e._currentElement.props;e._wrapperState.initialValue=void 0;var a=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=Boolean(t.multiple);var n=LinkedValueUtils.getValue(t);null!=n?(e._wrapperState.pendingUpdate=!1,updateOptions(e,Boolean(t.multiple),n)):a!==Boolean(t.multiple)&&(null!=t.defaultValue?updateOptions(e,Boolean(t.multiple),t.defaultValue):updateOptions(e,Boolean(t.multiple),t.multiple?[]:""))}};module.exports=ReactDOMSelect; -},{"./DisabledInputUtils":90,"./LinkedValueUtils":100,"./ReactDOMComponentTree":116,"./ReactUpdates":162,"fbjs/lib/warning":236,"object-assign":32}],127:[function(require,module,exports){ -"use strict";function isCollapsed(e,t,n,o){return e===n&&t===o}function getIEOffsets(e){var t=document.selection,n=t.createRange(),o=n.text.length,s=n.duplicate();s.moveToElementText(e),s.setEndPoint("EndToStart",n);var r=s.text.length,a=r+o;return{start:r,end:a}}function getModernOffsets(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,o=t.anchorOffset,s=t.focusNode,r=t.focusOffset,a=t.getRangeAt(0);try{a.startContainer.nodeType,a.endContainer.nodeType}catch(f){return null}var d=isCollapsed(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),c=d?0:a.toString().length,i=a.cloneRange();i.selectNodeContents(e),i.setEnd(a.startContainer,a.startOffset);var l=isCollapsed(i.startContainer,i.startOffset,i.endContainer,i.endOffset),g=l?0:i.toString().length,u=g+c,O=document.createRange();O.setStart(n,o),O.setEnd(s,r);var v=O.collapsed;return{start:v?u:g,end:v?g:u}}function setIEOffsets(e,t){var n,o,s=document.selection.createRange().duplicate();void 0===t.end?(n=t.start,o=n):t.start>t.end?(n=t.end,o=t.start):(n=t.start,o=t.end),s.moveToElementText(e),s.moveStart("character",n),s.setEndPoint("EndToStart",s),s.moveEnd("character",o-n),s.select()}function setModernOffsets(e,t){if(window.getSelection){var n=window.getSelection(),o=e[getTextContentAccessor()].length,s=Math.min(t.start,o),r=void 0===t.end?s:Math.min(t.end,o);if(!n.extend&&s>r){var a=r;r=s,s=a}var f=getNodeForCharacterOffset(e,s),d=getNodeForCharacterOffset(e,r);if(f&&d){var c=document.createRange();c.setStart(f.node,f.offset),n.removeAllRanges(),s>r?(n.addRange(c),n.extend(d.node,d.offset)):(c.setEnd(d.node,d.offset),n.addRange(c))}}}var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),getNodeForCharacterOffset=require("./getNodeForCharacterOffset"),getTextContentAccessor=require("./getTextContentAccessor"),useIEOffsets=ExecutionEnvironment.canUseDOM&&"selection"in document&&!("getSelection"in window),ReactDOMSelection={getOffsets:useIEOffsets?getIEOffsets:getModernOffsets,setOffsets:useIEOffsets?setIEOffsets:setModernOffsets};module.exports=ReactDOMSelection; +},{"./DisabledInputUtils":89,"./LinkedValueUtils":99,"./ReactDOMComponentTree":115,"./ReactUpdates":158,"fbjs/lib/warning":232,"object-assign":31}],125:[function(require,module,exports){ +"use strict";function isCollapsed(e,t,n,o){return e===n&&t===o}function getIEOffsets(e){var t=document.selection,n=t.createRange(),o=n.text.length,s=n.duplicate();s.moveToElementText(e),s.setEndPoint("EndToStart",n);var r=s.text.length,a=r+o;return{start:r,end:a}}function getModernOffsets(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,o=t.anchorOffset,s=t.focusNode,r=t.focusOffset,a=t.getRangeAt(0);try{a.startContainer.nodeType,a.endContainer.nodeType}catch(e){return null}var f=isCollapsed(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),d=f?0:a.toString().length,c=a.cloneRange();c.selectNodeContents(e),c.setEnd(a.startContainer,a.startOffset);var i=isCollapsed(c.startContainer,c.startOffset,c.endContainer,c.endOffset),l=i?0:c.toString().length,g=l+d,u=document.createRange();u.setStart(n,o),u.setEnd(s,r);var O=u.collapsed;return{start:O?g:l,end:O?l:g}}function setIEOffsets(e,t){var n,o,s=document.selection.createRange().duplicate();void 0===t.end?(n=t.start,o=n):t.start>t.end?(n=t.end,o=t.start):(n=t.start,o=t.end),s.moveToElementText(e),s.moveStart("character",n),s.setEndPoint("EndToStart",s),s.moveEnd("character",o-n),s.select()}function setModernOffsets(e,t){if(window.getSelection){var n=window.getSelection(),o=e[getTextContentAccessor()].length,s=Math.min(t.start,o),r=void 0===t.end?s:Math.min(t.end,o);if(!n.extend&&s>r){var a=r;r=s,s=a}var f=getNodeForCharacterOffset(e,s),d=getNodeForCharacterOffset(e,r);if(f&&d){var c=document.createRange();c.setStart(f.node,f.offset),n.removeAllRanges(),s>r?(n.addRange(c),n.extend(d.node,d.offset)):(c.setEnd(d.node,d.offset),n.addRange(c))}}}var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),getNodeForCharacterOffset=require("./getNodeForCharacterOffset"),getTextContentAccessor=require("./getTextContentAccessor"),useIEOffsets=ExecutionEnvironment.canUseDOM&&"selection"in document&&!("getSelection"in window),ReactDOMSelection={getOffsets:useIEOffsets?getIEOffsets:getModernOffsets,setOffsets:useIEOffsets?setIEOffsets:setModernOffsets};module.exports=ReactDOMSelection; -},{"./getNodeForCharacterOffset":197,"./getTextContentAccessor":198,"fbjs/lib/ExecutionEnvironment":212}],128:[function(require,module,exports){ -"use strict";var _assign=require("object-assign"),DOMChildrenOperations=require("./DOMChildrenOperations"),DOMLazyTree=require("./DOMLazyTree"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactInstrumentation=require("./ReactInstrumentation"),escapeTextContentForBrowser=require("./escapeTextContentForBrowser"),invariant=require("fbjs/lib/invariant"),validateDOMNesting=require("./validateDOMNesting"),ReactDOMTextComponent=function(e){this._currentElement=e,this._stringText=""+e,this._nativeNode=null,this._nativeParent=null,this._domID=null,this._mountIndex=0,this._closingComment=null,this._commentNodes=null};_assign(ReactDOMTextComponent.prototype,{mountComponent:function(e,t,n,i){var r=n._idCounter++,o=" react-text: "+r+" ",a=" /react-text ";if(this._domID=r,this._nativeParent=t,e.useCreateElement){var s=n._ownerDocument,m=s.createComment(o),c=s.createComment(a),u=DOMLazyTree(s.createDocumentFragment());return DOMLazyTree.queueChild(u,DOMLazyTree(m)),this._stringText&&DOMLazyTree.queueChild(u,DOMLazyTree(s.createTextNode(this._stringText))),DOMLazyTree.queueChild(u,DOMLazyTree(c)),ReactDOMComponentTree.precacheNode(this,m),this._closingComment=c,u}var l=escapeTextContentForBrowser(this._stringText);return e.renderToStaticMarkup?l:"<!--"+o+"-->"+l+"<!--"+a+"-->"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=""+e;if(n!==this._stringText){this._stringText=n;var i=this.getNativeNode();DOMChildrenOperations.replaceDelimitedText(i[0],i[1],n)}}},getNativeNode:function(){var e=this._commentNodes;if(e)return e;if(!this._closingComment)for(var t=ReactDOMComponentTree.getNodeFromInstance(this),n=t.nextSibling;;){if(null==n?invariant(!1):void 0,8===n.nodeType&&" /react-text "===n.nodeValue){this._closingComment=n;break}n=n.nextSibling}return e=[this._nativeNode,this._closingComment],this._commentNodes=e,e},unmountComponent:function(){this._closingComment=null,this._commentNodes=null,ReactDOMComponentTree.uncacheNode(this)}}),module.exports=ReactDOMTextComponent; +},{"./getNodeForCharacterOffset":194,"./getTextContentAccessor":195,"fbjs/lib/ExecutionEnvironment":210}],126:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),DOMChildrenOperations=require("./DOMChildrenOperations"),DOMLazyTree=require("./DOMLazyTree"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactInstrumentation=require("./ReactInstrumentation"),escapeTextContentForBrowser=require("./escapeTextContentForBrowser"),invariant=require("fbjs/lib/invariant"),validateDOMNesting=require("./validateDOMNesting"),ReactDOMTextComponent=function(e){this._currentElement=e,this._stringText=""+e,this._hostNode=null,this._hostParent=null,this._domID=null,this._mountIndex=0,this._closingComment=null,this._commentNodes=null};_assign(ReactDOMTextComponent.prototype,{mountComponent:function(e,t,n,r){var o=n._idCounter++,i=" react-text: "+o+" ",s=" /react-text ";if(this._domID=o,this._hostParent=t,e.useCreateElement){var a=n._ownerDocument,m=a.createComment(i),c=a.createComment(s),u=DOMLazyTree(a.createDocumentFragment());return DOMLazyTree.queueChild(u,DOMLazyTree(m)),this._stringText&&DOMLazyTree.queueChild(u,DOMLazyTree(a.createTextNode(this._stringText))),DOMLazyTree.queueChild(u,DOMLazyTree(c)),ReactDOMComponentTree.precacheNode(this,m),this._closingComment=c,u}var h=escapeTextContentForBrowser(this._stringText);return e.renderToStaticMarkup?h:"<!--"+i+"-->"+h+"<!--"+s+"-->"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=""+e;if(n!==this._stringText){this._stringText=n;var r=this.getHostNode();DOMChildrenOperations.replaceDelimitedText(r[0],r[1],n)}}},getHostNode:function(){var e=this._commentNodes;if(e)return e;if(!this._closingComment)for(var t=ReactDOMComponentTree.getNodeFromInstance(this),n=t.nextSibling;;){if(null==n?_prodInvariant("67",this._domID):void 0,8===n.nodeType&&" /react-text "===n.nodeValue){this._closingComment=n;break}n=n.nextSibling}return e=[this._hostNode,this._closingComment],this._commentNodes=e,e},unmountComponent:function(){this._closingComment=null,this._commentNodes=null,ReactDOMComponentTree.uncacheNode(this)}}),module.exports=ReactDOMTextComponent; -},{"./DOMChildrenOperations":83,"./DOMLazyTree":84,"./ReactDOMComponentTree":116,"./ReactInstrumentation":145,"./escapeTextContentForBrowser":187,"./validateDOMNesting":210,"fbjs/lib/invariant":226,"object-assign":32}],129:[function(require,module,exports){ -"use strict";function forceUpdateIfMounted(){this._rootNodeID&&ReactDOMTextarea.updateWrapper(this)}function warnIfValueIsNull(e){null==e||null!==e.value||didWarnValueNull||(didWarnValueNull=!0)}function _handleChange(e){var a=this._currentElement.props,n=LinkedValueUtils.executeOnChange(a,e);return ReactUpdates.asap(forceUpdateIfMounted,this),n}var _assign=require("object-assign"),DisabledInputUtils=require("./DisabledInputUtils"),DOMPropertyOperations=require("./DOMPropertyOperations"),LinkedValueUtils=require("./LinkedValueUtils"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),didWarnValueLink=!1,didWarnValueNull=!1,didWarnValDefaultVal=!1,ReactDOMTextarea={getNativeProps:function(e,a){null!=a.dangerouslySetInnerHTML?invariant(!1):void 0;var n=_assign({},DisabledInputUtils.getNativeProps(e,a),{defaultValue:void 0,value:void 0,children:e._wrapperState.initialValue,onChange:e._wrapperState.onChange});return n},mountWrapper:function(e,a){var n=a.defaultValue,t=a.children;null!=t&&(null!=n?invariant(!1):void 0,Array.isArray(t)&&(t.length<=1?void 0:invariant(!1),t=t[0]),n=""+t),null==n&&(n="");var r=LinkedValueUtils.getValue(a);e._wrapperState={initialValue:""+(null!=r?r:n),listeners:null,onChange:_handleChange.bind(e)}},updateWrapper:function(e){var a=e._currentElement.props,n=LinkedValueUtils.getValue(a);null!=n&&DOMPropertyOperations.setValueForProperty(ReactDOMComponentTree.getNodeFromInstance(e),"value",""+n)}};module.exports=ReactDOMTextarea; +},{"./DOMChildrenOperations":82,"./DOMLazyTree":83,"./ReactDOMComponentTree":115,"./ReactInstrumentation":141,"./escapeTextContentForBrowser":184,"./reactProdInvariant":202,"./validateDOMNesting":208,"fbjs/lib/invariant":224,"object-assign":31}],127:[function(require,module,exports){ +"use strict";function forceUpdateIfMounted(){this._rootNodeID&&ReactDOMTextarea.updateWrapper(this)}function _handleChange(e){var a=this._currentElement.props,t=LinkedValueUtils.executeOnChange(a,e);return ReactUpdates.asap(forceUpdateIfMounted,this),t}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),DisabledInputUtils=require("./DisabledInputUtils"),LinkedValueUtils=require("./LinkedValueUtils"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),didWarnValueLink=!1,didWarnValDefaultVal=!1,ReactDOMTextarea={getHostProps:function(e,a){null!=a.dangerouslySetInnerHTML?_prodInvariant("91"):void 0;var t=_assign({},DisabledInputUtils.getHostProps(e,a),{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue,onChange:e._wrapperState.onChange});return t},mountWrapper:function(e,a){var t=LinkedValueUtils.getValue(a),n=t;if(null==t){var r=a.defaultValue,l=a.children;null!=l&&(null!=r?_prodInvariant("92"):void 0,Array.isArray(l)&&(l.length<=1?void 0:_prodInvariant("93"),l=l[0]),r=""+l),null==r&&(r=""),n=r}e._wrapperState={initialValue:""+n,listeners:null,onChange:_handleChange.bind(e)}},updateWrapper:function(e){var a=e._currentElement.props,t=ReactDOMComponentTree.getNodeFromInstance(e),n=LinkedValueUtils.getValue(a);if(null!=n){var r=""+n;r!==t.value&&(t.value=r),null==a.defaultValue&&(t.defaultValue=r)}null!=a.defaultValue&&(t.defaultValue=a.defaultValue)},postMountWrapper:function(e){var a=ReactDOMComponentTree.getNodeFromInstance(e);a.value=a.textContent}};module.exports=ReactDOMTextarea; -},{"./DOMPropertyOperations":87,"./DisabledInputUtils":90,"./LinkedValueUtils":100,"./ReactDOMComponentTree":116,"./ReactUpdates":162,"fbjs/lib/invariant":226,"fbjs/lib/warning":236,"object-assign":32}],130:[function(require,module,exports){ -"use strict";function getLowestCommonAncestor(e,n){"_nativeNode"in e?void 0:invariant(!1),"_nativeNode"in n?void 0:invariant(!1);for(var t=0,r=e;r;r=r._nativeParent)t++;for(var a=0,i=n;i;i=i._nativeParent)a++;for(;t-a>0;)e=e._nativeParent,t--;for(;a-t>0;)n=n._nativeParent,a--;for(var o=t;o--;){if(e===n)return e;e=e._nativeParent,n=n._nativeParent}return null}function isAncestor(e,n){"_nativeNode"in e?void 0:invariant(!1),"_nativeNode"in n?void 0:invariant(!1);for(;n;){if(n===e)return!0;n=n._nativeParent}return!1}function getParentInstance(e){return"_nativeNode"in e?void 0:invariant(!1),e._nativeParent}function traverseTwoPhase(e,n,t){for(var r=[];e;)r.push(e),e=e._nativeParent;var a;for(a=r.length;a-- >0;)n(r[a],!1,t);for(a=0;a<r.length;a++)n(r[a],!0,t)}function traverseEnterLeave(e,n,t,r,a){for(var i=e&&n?getLowestCommonAncestor(e,n):null,o=[];e&&e!==i;)o.push(e),e=e._nativeParent;for(var v=[];n&&n!==i;)v.push(n),n=n._nativeParent;var s;for(s=0;s<o.length;s++)t(o[s],!0,r);for(s=v.length;s-- >0;)t(v[s],!1,a)}var invariant=require("fbjs/lib/invariant");module.exports={isAncestor:isAncestor,getLowestCommonAncestor:getLowestCommonAncestor,getParentInstance:getParentInstance,traverseTwoPhase:traverseTwoPhase,traverseEnterLeave:traverseEnterLeave}; +},{"./DisabledInputUtils":89,"./LinkedValueUtils":99,"./ReactDOMComponentTree":115,"./ReactUpdates":158,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232,"object-assign":31}],128:[function(require,module,exports){ +"use strict";function getLowestCommonAncestor(r,t){"_hostNode"in r?void 0:_prodInvariant("33"),"_hostNode"in t?void 0:_prodInvariant("33");for(var e=0,n=r;n;n=n._hostParent)e++;for(var o=0,a=t;a;a=a._hostParent)o++;for(;e-o>0;)r=r._hostParent,e--;for(;o-e>0;)t=t._hostParent,o--;for(var s=e;s--;){if(r===t)return r;r=r._hostParent,t=t._hostParent}return null}function isAncestor(r,t){"_hostNode"in r?void 0:_prodInvariant("35"),"_hostNode"in t?void 0:_prodInvariant("35");for(;t;){if(t===r)return!0;t=t._hostParent}return!1}function getParentInstance(r){return"_hostNode"in r?void 0:_prodInvariant("36"),r._hostParent}function traverseTwoPhase(r,t,e){for(var n=[];r;)n.push(r),r=r._hostParent;var o;for(o=n.length;o-- >0;)t(n[o],!1,e);for(o=0;o<n.length;o++)t(n[o],!0,e)}function traverseEnterLeave(r,t,e,n,o){for(var a=r&&t?getLowestCommonAncestor(r,t):null,s=[];r&&r!==a;)s.push(r),r=r._hostParent;for(var i=[];t&&t!==a;)i.push(t),t=t._hostParent;var v;for(v=0;v<s.length;v++)e(s[v],!0,n);for(v=i.length;v-- >0;)e(i[v],!1,o)}var _prodInvariant=require("./reactProdInvariant"),invariant=require("fbjs/lib/invariant");module.exports={isAncestor:isAncestor,getLowestCommonAncestor:getLowestCommonAncestor,getParentInstance:getParentInstance,traverseTwoPhase:traverseTwoPhase,traverseEnterLeave:traverseEnterLeave}; -},{"fbjs/lib/invariant":226}],131:[function(require,module,exports){ -"use strict";var DOMProperty=require("./DOMProperty"),EventPluginRegistry=require("./EventPluginRegistry"),warning=require("fbjs/lib/warning"),reactProps,warnedProperties,warnUnknownProperty,ReactDOMUnknownPropertyDevtool={onCreateMarkupForProperty:function(r,e){warnUnknownProperty(r)},onSetValueForProperty:function(r,e,n){warnUnknownProperty(e)},onDeleteValueForProperty:function(r,e){warnUnknownProperty(e)}};module.exports=ReactDOMUnknownPropertyDevtool; - -},{"./DOMProperty":86,"./EventPluginRegistry":94,"fbjs/lib/warning":236}],132:[function(require,module,exports){ -"use strict";function emitEvent(e,n,t,o,i,r){}function clearHistory(){ReactComponentTreeDevtool.purgeUnmountedComponents(),ReactNativeOperationHistoryDevtool.clearHistory()}function getTreeSnapshot(e){return e.reduce(function(e,n){var t=ReactComponentTreeDevtool.getOwnerID(n),o=ReactComponentTreeDevtool.getParentID(n);return e[n]={displayName:ReactComponentTreeDevtool.getDisplayName(n),text:ReactComponentTreeDevtool.getText(n),updateCount:ReactComponentTreeDevtool.getUpdateCount(n),childIDs:ReactComponentTreeDevtool.getChildIDs(n),ownerID:t||ReactComponentTreeDevtool.getOwnerID(o),parentID:o},e},{})}function resetMeasurements(){}function checkDebugID(e){}var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),performanceNow=require("fbjs/lib/performanceNow"),warning=require("fbjs/lib/warning"),eventHandlers=[],handlerDoesThrowForEvent={},isProfiling=!1,flushHistory=[],currentFlushNesting=0,currentFlushMeasurements=null,currentFlushStartTime=null,currentTimerDebugID=null,currentTimerStartTime=null,currentTimerType=null,ReactDebugTool={addDevtool:function(e){eventHandlers.push(e)},removeDevtool:function(e){for(var n=0;n<eventHandlers.length;n++)eventHandlers[n]===e&&(eventHandlers.splice(n,1),n--)},beginProfiling:function(){},endProfiling:function(){},getFlushHistory:function(){},onBeginFlush:function(){emitEvent("onBeginFlush")},onEndFlush:function(){emitEvent("onEndFlush")},onBeginLifeCycleTimer:function(e,n){checkDebugID(e),emitEvent("onBeginLifeCycleTimer",e,n)},onEndLifeCycleTimer:function(e,n){checkDebugID(e),emitEvent("onEndLifeCycleTimer",e,n)},onBeginReconcilerTimer:function(e,n){checkDebugID(e),emitEvent("onBeginReconcilerTimer",e,n)},onEndReconcilerTimer:function(e,n){checkDebugID(e),emitEvent("onEndReconcilerTimer",e,n)},onBeginProcessingChildContext:function(){emitEvent("onBeginProcessingChildContext")},onEndProcessingChildContext:function(){emitEvent("onEndProcessingChildContext")},onNativeOperation:function(e,n,t){checkDebugID(e),emitEvent("onNativeOperation",e,n,t)},onSetState:function(){emitEvent("onSetState")},onSetDisplayName:function(e,n){checkDebugID(e),emitEvent("onSetDisplayName",e,n)},onSetChildren:function(e,n){checkDebugID(e),emitEvent("onSetChildren",e,n)},onSetOwner:function(e,n){checkDebugID(e),emitEvent("onSetOwner",e,n)},onSetText:function(e,n){checkDebugID(e),emitEvent("onSetText",e,n)},onMountRootComponent:function(e){checkDebugID(e),emitEvent("onMountRootComponent",e)},onMountComponent:function(e){checkDebugID(e),emitEvent("onMountComponent",e)},onUpdateComponent:function(e){checkDebugID(e),emitEvent("onUpdateComponent",e)},onUnmountComponent:function(e){checkDebugID(e),emitEvent("onUnmountComponent",e)}},ReactInvalidSetStateWarningDevTool,ReactNativeOperationHistoryDevtool,ReactComponentTreeDevtool,url;module.exports=ReactDebugTool; - -},{"fbjs/lib/ExecutionEnvironment":212,"fbjs/lib/performanceNow":234,"fbjs/lib/warning":236}],133:[function(require,module,exports){ +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224}],129:[function(require,module,exports){ "use strict";function ReactDefaultBatchingStrategyTransaction(){this.reinitializeTransaction()}var _assign=require("object-assign"),ReactUpdates=require("./ReactUpdates"),Transaction=require("./Transaction"),emptyFunction=require("fbjs/lib/emptyFunction"),RESET_BATCHED_UPDATES={initialize:emptyFunction,close:function(){ReactDefaultBatchingStrategy.isBatchingUpdates=!1}},FLUSH_BATCHED_UPDATES={initialize:emptyFunction,close:ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)},TRANSACTION_WRAPPERS=[FLUSH_BATCHED_UPDATES,RESET_BATCHED_UPDATES];_assign(ReactDefaultBatchingStrategyTransaction.prototype,Transaction.Mixin,{getTransactionWrappers:function(){return TRANSACTION_WRAPPERS}});var transaction=new ReactDefaultBatchingStrategyTransaction,ReactDefaultBatchingStrategy={isBatchingUpdates:!1,batchedUpdates:function(t,a,e,i,n,c){var r=ReactDefaultBatchingStrategy.isBatchingUpdates;ReactDefaultBatchingStrategy.isBatchingUpdates=!0,r?t(a,e,i,n,c):transaction.perform(t,null,a,e,i,n,c)}};module.exports=ReactDefaultBatchingStrategy; -},{"./ReactUpdates":162,"./Transaction":180,"fbjs/lib/emptyFunction":218,"object-assign":32}],134:[function(require,module,exports){ -"use strict";function inject(){alreadyInjected||(alreadyInjected=!0,ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener),ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder),ReactInjection.EventPluginUtils.injectComponentTree(ReactDOMComponentTree),ReactInjection.EventPluginUtils.injectTreeTraversal(ReactDOMTreeTraversal),ReactInjection.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:SimpleEventPlugin,EnterLeaveEventPlugin:EnterLeaveEventPlugin,ChangeEventPlugin:ChangeEventPlugin,SelectEventPlugin:SelectEventPlugin,BeforeInputEventPlugin:BeforeInputEventPlugin}),ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent),ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent),ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig),ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig),ReactInjection.EmptyComponent.injectEmptyComponentFactory(function(e){return new ReactDOMEmptyComponent(e)}),ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction),ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy),ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment))}var BeforeInputEventPlugin=require("./BeforeInputEventPlugin"),ChangeEventPlugin=require("./ChangeEventPlugin"),DefaultEventPluginOrder=require("./DefaultEventPluginOrder"),EnterLeaveEventPlugin=require("./EnterLeaveEventPlugin"),HTMLDOMPropertyConfig=require("./HTMLDOMPropertyConfig"),ReactComponentBrowserEnvironment=require("./ReactComponentBrowserEnvironment"),ReactDOMComponent=require("./ReactDOMComponent"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMEmptyComponent=require("./ReactDOMEmptyComponent"),ReactDOMTreeTraversal=require("./ReactDOMTreeTraversal"),ReactDOMTextComponent=require("./ReactDOMTextComponent"),ReactDefaultBatchingStrategy=require("./ReactDefaultBatchingStrategy"),ReactEventListener=require("./ReactEventListener"),ReactInjection=require("./ReactInjection"),ReactReconcileTransaction=require("./ReactReconcileTransaction"),SVGDOMPropertyConfig=require("./SVGDOMPropertyConfig"),SelectEventPlugin=require("./SelectEventPlugin"),SimpleEventPlugin=require("./SimpleEventPlugin"),alreadyInjected=!1;module.exports={inject:inject}; +},{"./ReactUpdates":158,"./Transaction":176,"fbjs/lib/emptyFunction":216,"object-assign":31}],130:[function(require,module,exports){ +"use strict";function inject(){alreadyInjected||(alreadyInjected=!0,ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener),ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder),ReactInjection.EventPluginUtils.injectComponentTree(ReactDOMComponentTree),ReactInjection.EventPluginUtils.injectTreeTraversal(ReactDOMTreeTraversal),ReactInjection.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:SimpleEventPlugin,EnterLeaveEventPlugin:EnterLeaveEventPlugin,ChangeEventPlugin:ChangeEventPlugin,SelectEventPlugin:SelectEventPlugin,BeforeInputEventPlugin:BeforeInputEventPlugin}),ReactInjection.HostComponent.injectGenericComponentClass(ReactDOMComponent),ReactInjection.HostComponent.injectTextComponentClass(ReactDOMTextComponent),ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig),ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig),ReactInjection.EmptyComponent.injectEmptyComponentFactory(function(e){return new ReactDOMEmptyComponent(e)}),ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction),ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy),ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment))}var BeforeInputEventPlugin=require("./BeforeInputEventPlugin"),ChangeEventPlugin=require("./ChangeEventPlugin"),DefaultEventPluginOrder=require("./DefaultEventPluginOrder"),EnterLeaveEventPlugin=require("./EnterLeaveEventPlugin"),HTMLDOMPropertyConfig=require("./HTMLDOMPropertyConfig"),ReactComponentBrowserEnvironment=require("./ReactComponentBrowserEnvironment"),ReactDOMComponent=require("./ReactDOMComponent"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMEmptyComponent=require("./ReactDOMEmptyComponent"),ReactDOMTreeTraversal=require("./ReactDOMTreeTraversal"),ReactDOMTextComponent=require("./ReactDOMTextComponent"),ReactDefaultBatchingStrategy=require("./ReactDefaultBatchingStrategy"),ReactEventListener=require("./ReactEventListener"),ReactInjection=require("./ReactInjection"),ReactReconcileTransaction=require("./ReactReconcileTransaction"),SVGDOMPropertyConfig=require("./SVGDOMPropertyConfig"),SelectEventPlugin=require("./SelectEventPlugin"),SimpleEventPlugin=require("./SimpleEventPlugin"),alreadyInjected=!1;module.exports={inject:inject}; -},{"./BeforeInputEventPlugin":78,"./ChangeEventPlugin":82,"./DefaultEventPluginOrder":89,"./EnterLeaveEventPlugin":91,"./HTMLDOMPropertyConfig":98,"./ReactComponentBrowserEnvironment":108,"./ReactDOMComponent":114,"./ReactDOMComponentTree":116,"./ReactDOMEmptyComponent":119,"./ReactDOMTextComponent":128,"./ReactDOMTreeTraversal":130,"./ReactDefaultBatchingStrategy":133,"./ReactEventListener":140,"./ReactInjection":142,"./ReactReconcileTransaction":157,"./SVGDOMPropertyConfig":164,"./SelectEventPlugin":165,"./SimpleEventPlugin":166}],135:[function(require,module,exports){ -"use strict";var _assign=require("object-assign"),ReactCurrentOwner=require("./ReactCurrentOwner"),warning=require("fbjs/lib/warning"),canDefineProperty=require("./canDefineProperty"),REACT_ELEMENT_TYPE="function"==typeof Symbol&&Symbol["for"]&&Symbol["for"]("react.element")||60103,RESERVED_PROPS={key:!0,ref:!0,__self:!0,__source:!0},specialPropKeyWarningShown,specialPropRefWarningShown,ReactElement=function(e,r,n,t,l,o,a){var i={$$typeof:REACT_ELEMENT_TYPE,type:e,key:r,ref:n,props:a,_owner:o};return i};ReactElement.createElement=function(e,r,n){var t,l={},o=null,a=null,i=null,c=null;if(null!=r){a=void 0===r.ref?null:r.ref,o=void 0===r.key?null:""+r.key,i=void 0===r.__self?null:r.__self,c=void 0===r.__source?null:r.__source;for(t in r)r.hasOwnProperty(t)&&!RESERVED_PROPS.hasOwnProperty(t)&&(l[t]=r[t])}var f=arguments.length-2;if(1===f)l.children=n;else if(f>1){for(var u=Array(f),E=0;E<f;E++)u[E]=arguments[E+2];l.children=u}if(e&&e.defaultProps){var s=e.defaultProps;for(t in s)void 0===l[t]&&(l[t]=s[t])}return ReactElement(e,o,a,i,c,ReactCurrentOwner.current,l)},ReactElement.createFactory=function(e){var r=ReactElement.createElement.bind(null,e);return r.type=e,r},ReactElement.cloneAndReplaceKey=function(e,r){var n=ReactElement(e.type,r,e.ref,e._self,e._source,e._owner,e.props);return n},ReactElement.cloneElement=function(e,r,n){var t,l=_assign({},e.props),o=e.key,a=e.ref,i=e._self,c=e._source,f=e._owner;if(null!=r){void 0!==r.ref&&(a=r.ref,f=ReactCurrentOwner.current),void 0!==r.key&&(o=""+r.key);var u;e.type&&e.type.defaultProps&&(u=e.type.defaultProps);for(t in r)r.hasOwnProperty(t)&&!RESERVED_PROPS.hasOwnProperty(t)&&(void 0===r[t]&&void 0!==u?l[t]=u[t]:l[t]=r[t])}var E=arguments.length-2;if(1===E)l.children=n;else if(E>1){for(var s=Array(E),p=0;p<E;p++)s[p]=arguments[p+2];l.children=s}return ReactElement(e.type,o,a,i,c,f,l)},ReactElement.isValidElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===REACT_ELEMENT_TYPE},module.exports=ReactElement; +},{"./BeforeInputEventPlugin":77,"./ChangeEventPlugin":81,"./DefaultEventPluginOrder":88,"./EnterLeaveEventPlugin":90,"./HTMLDOMPropertyConfig":97,"./ReactComponentBrowserEnvironment":107,"./ReactDOMComponent":113,"./ReactDOMComponentTree":115,"./ReactDOMEmptyComponent":117,"./ReactDOMTextComponent":126,"./ReactDOMTreeTraversal":128,"./ReactDefaultBatchingStrategy":129,"./ReactEventListener":135,"./ReactInjection":138,"./ReactReconcileTransaction":152,"./SVGDOMPropertyConfig":160,"./SelectEventPlugin":161,"./SimpleEventPlugin":162}],131:[function(require,module,exports){ +"use strict";function hasValidRef(e){return void 0!==e.ref}function hasValidKey(e){return void 0!==e.key}var _assign=require("object-assign"),ReactCurrentOwner=require("./ReactCurrentOwner"),warning=require("fbjs/lib/warning"),canDefineProperty=require("./canDefineProperty"),hasOwnProperty=Object.prototype.hasOwnProperty,REACT_ELEMENT_TYPE="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,RESERVED_PROPS={key:!0,ref:!0,__self:!0,__source:!0},specialPropKeyWarningShown,specialPropRefWarningShown,ReactElement=function(e,r,n,t,l,a,o){var i={$$typeof:REACT_ELEMENT_TYPE,type:e,key:r,ref:n,props:o,_owner:a};return i};ReactElement.createElement=function(e,r,n){var t,l={},a=null,o=null,i=null,c=null;if(null!=r){hasValidRef(r)&&(o=r.ref),hasValidKey(r)&&(a=""+r.key),i=void 0===r.__self?null:r.__self,c=void 0===r.__source?null:r.__source;for(t in r)hasOwnProperty.call(r,t)&&!RESERVED_PROPS.hasOwnProperty(t)&&(l[t]=r[t])}var f=arguments.length-2;if(1===f)l.children=n;else if(f>1){for(var E=Array(f),u=0;u<f;u++)E[u]=arguments[u+2];l.children=E}if(e&&e.defaultProps){var s=e.defaultProps;for(t in s)void 0===l[t]&&(l[t]=s[t])}return ReactElement(e,a,o,i,c,ReactCurrentOwner.current,l)},ReactElement.createFactory=function(e){var r=ReactElement.createElement.bind(null,e);return r.type=e,r},ReactElement.cloneAndReplaceKey=function(e,r){var n=ReactElement(e.type,r,e.ref,e._self,e._source,e._owner,e.props);return n},ReactElement.cloneElement=function(e,r,n){var t,l=_assign({},e.props),a=e.key,o=e.ref,i=e._self,c=e._source,f=e._owner;if(null!=r){hasValidRef(r)&&(o=r.ref,f=ReactCurrentOwner.current),hasValidKey(r)&&(a=""+r.key);var E;e.type&&e.type.defaultProps&&(E=e.type.defaultProps);for(t in r)hasOwnProperty.call(r,t)&&!RESERVED_PROPS.hasOwnProperty(t)&&(void 0===r[t]&&void 0!==E?l[t]=E[t]:l[t]=r[t])}var u=arguments.length-2;if(1===u)l.children=n;else if(u>1){for(var s=Array(u),p=0;p<u;p++)s[p]=arguments[p+2];l.children=s}return ReactElement(e.type,a,o,i,c,f,l)},ReactElement.isValidElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===REACT_ELEMENT_TYPE},ReactElement.REACT_ELEMENT_TYPE=REACT_ELEMENT_TYPE,module.exports=ReactElement; -},{"./ReactCurrentOwner":111,"./canDefineProperty":184,"fbjs/lib/warning":236,"object-assign":32}],136:[function(require,module,exports){ -"use strict";function getDeclarationErrorAddendum(){if(ReactCurrentOwner.current){var e=ReactCurrentOwner.current.getName();if(e)return" Check the render method of `"+e+"`."}return""}function validateExplicitKey(e,r){if(e._store&&!e._store.validated&&null==e.key){e._store.validated=!0;getAddendaForKeyUse("uniqueKey",e,r)}}function getAddendaForKeyUse(e,r,t){var a=getDeclarationErrorAddendum();if(!a){var n="string"==typeof t?t:t.displayName||t.name;n&&(a=" Check the top-level render call using <"+n+">.")}var i=ownerHasKeyUseWarning[e]||(ownerHasKeyUseWarning[e]={});if(i[a])return null;i[a]=!0;var o={parentOrOwner:a,url:" See https://fb.me/react-warning-keys for more information.",childOwner:null};return r&&r._owner&&r._owner!==ReactCurrentOwner.current&&(o.childOwner=" It was passed a child from "+r._owner.getName()+"."),o}function validateChildKeys(e,r){if("object"==typeof e)if(Array.isArray(e))for(var t=0;t<e.length;t++){var a=e[t];ReactElement.isValidElement(a)&&validateExplicitKey(a,r)}else if(ReactElement.isValidElement(e))e._store&&(e._store.validated=!0);else if(e){var n=getIteratorFn(e);if(n&&n!==e.entries)for(var i,o=n.call(e);!(i=o.next()).done;)ReactElement.isValidElement(i.value)&&validateExplicitKey(i.value,r)}}function checkPropTypes(e,r,t,a){for(var n in r)if(r.hasOwnProperty(n)){var i;try{"function"!=typeof r[n]?invariant(!1):void 0,i=r[n](t,n,e,a)}catch(o){i=o}if(i instanceof Error&&!(i.message in loggedTypeFailures)){loggedTypeFailures[i.message]=!0;getDeclarationErrorAddendum()}}}function validatePropTypes(e){var r=e.type;if("function"==typeof r){var t=r.displayName||r.name;r.propTypes&&checkPropTypes(t,r.propTypes,e.props,ReactPropTypeLocations.prop),"function"==typeof r.getDefaultProps}}var ReactElement=require("./ReactElement"),ReactPropTypeLocations=require("./ReactPropTypeLocations"),ReactPropTypeLocationNames=require("./ReactPropTypeLocationNames"),ReactCurrentOwner=require("./ReactCurrentOwner"),canDefineProperty=require("./canDefineProperty"),getIteratorFn=require("./getIteratorFn"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),ownerHasKeyUseWarning={},loggedTypeFailures={},ReactElementValidator={createElement:function(e,r,t){var a="string"==typeof e||"function"==typeof e,n=ReactElement.createElement.apply(this,arguments);if(null==n)return n;if(a)for(var i=2;i<arguments.length;i++)validateChildKeys(arguments[i],e);return validatePropTypes(n),n},createFactory:function(e){var r=ReactElementValidator.createElement.bind(null,e);return r.type=e,r},cloneElement:function(e,r,t){for(var a=ReactElement.cloneElement.apply(this,arguments),n=2;n<arguments.length;n++)validateChildKeys(arguments[n],a.type);return validatePropTypes(a),a}};module.exports=ReactElementValidator; - -},{"./ReactCurrentOwner":111,"./ReactElement":135,"./ReactPropTypeLocationNames":154,"./ReactPropTypeLocations":155,"./canDefineProperty":184,"./getIteratorFn":195,"fbjs/lib/invariant":226,"fbjs/lib/warning":236}],137:[function(require,module,exports){ +},{"./ReactCurrentOwner":110,"./canDefineProperty":180,"fbjs/lib/warning":232,"object-assign":31}],132:[function(require,module,exports){ "use strict";var emptyComponentFactory,ReactEmptyComponentInjection={injectEmptyComponentFactory:function(t){emptyComponentFactory=t}},ReactEmptyComponent={create:function(t){return emptyComponentFactory(t)}};ReactEmptyComponent.injection=ReactEmptyComponentInjection,module.exports=ReactEmptyComponent; -},{}],138:[function(require,module,exports){ -"use strict";function invokeGuardedCallback(r,a,t,o){try{return a(t,o)}catch(u){return void(null===caughtError&&(caughtError=u))}}var caughtError=null,ReactErrorUtils={invokeGuardedCallback:invokeGuardedCallback,invokeGuardedCallbackWithCatch:invokeGuardedCallback,rethrowCaughtError:function(){if(caughtError){var r=caughtError;throw caughtError=null,r}}},fakeNode;module.exports=ReactErrorUtils; +},{}],133:[function(require,module,exports){ +"use strict";function invokeGuardedCallback(r,a,t,o){try{return a(t,o)}catch(r){return void(null===caughtError&&(caughtError=r))}}var caughtError=null,ReactErrorUtils={invokeGuardedCallback:invokeGuardedCallback,invokeGuardedCallbackWithCatch:invokeGuardedCallback,rethrowCaughtError:function(){if(caughtError){var r=caughtError;throw caughtError=null,r}}},fakeNode;module.exports=ReactErrorUtils; -},{}],139:[function(require,module,exports){ +},{}],134:[function(require,module,exports){ "use strict";function runEventQueueInBatch(e){EventPluginHub.enqueueEvents(e),EventPluginHub.processEventQueue(!1)}var EventPluginHub=require("./EventPluginHub"),ReactEventEmitterMixin={handleTopLevel:function(e,n,t,u){var i=EventPluginHub.extractEvents(e,n,t,u);runEventQueueInBatch(i)}};module.exports=ReactEventEmitterMixin; -},{"./EventPluginHub":93}],140:[function(require,module,exports){ -"use strict";function findParent(e){for(;e._nativeParent;)e=e._nativeParent;var n=ReactDOMComponentTree.getNodeFromInstance(e),t=n.parentNode;return ReactDOMComponentTree.getClosestInstanceFromNode(t)}function TopLevelCallbackBookKeeping(e,n){this.topLevelType=e,this.nativeEvent=n,this.ancestors=[]}function handleTopLevelImpl(e){var n=getEventTarget(e.nativeEvent),t=ReactDOMComponentTree.getClosestInstanceFromNode(n),o=t;do e.ancestors.push(o),o=o&&findParent(o);while(o);for(var a=0;a<e.ancestors.length;a++)t=e.ancestors[a],ReactEventListener._handleTopLevel(e.topLevelType,t,e.nativeEvent,getEventTarget(e.nativeEvent))}function scrollValueMonitor(e){var n=getUnboundedScrollPosition(window);e(n)}var _assign=require("object-assign"),EventListener=require("fbjs/lib/EventListener"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),PooledClass=require("./PooledClass"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),getEventTarget=require("./getEventTarget"),getUnboundedScrollPosition=require("fbjs/lib/getUnboundedScrollPosition");_assign(TopLevelCallbackBookKeeping.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),PooledClass.addPoolingTo(TopLevelCallbackBookKeeping,PooledClass.twoArgumentPooler);var ReactEventListener={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:ExecutionEnvironment.canUseDOM?window:null,setHandleTopLevel:function(e){ReactEventListener._handleTopLevel=e},setEnabled:function(e){ReactEventListener._enabled=!!e},isEnabled:function(){return ReactEventListener._enabled},trapBubbledEvent:function(e,n,t){var o=t;return o?EventListener.listen(o,n,ReactEventListener.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,n,t){var o=t;return o?EventListener.capture(o,n,ReactEventListener.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var n=scrollValueMonitor.bind(null,e);EventListener.listen(window,"scroll",n)},dispatchEvent:function(e,n){if(ReactEventListener._enabled){var t=TopLevelCallbackBookKeeping.getPooled(e,n);try{ReactUpdates.batchedUpdates(handleTopLevelImpl,t)}finally{TopLevelCallbackBookKeeping.release(t)}}}};module.exports=ReactEventListener; +},{"./EventPluginHub":92}],135:[function(require,module,exports){ +"use strict";function findParent(e){for(;e._hostParent;)e=e._hostParent;var n=ReactDOMComponentTree.getNodeFromInstance(e),t=n.parentNode;return ReactDOMComponentTree.getClosestInstanceFromNode(t)}function TopLevelCallbackBookKeeping(e,n){this.topLevelType=e,this.nativeEvent=n,this.ancestors=[]}function handleTopLevelImpl(e){var n=getEventTarget(e.nativeEvent),t=ReactDOMComponentTree.getClosestInstanceFromNode(n),o=t;do e.ancestors.push(o),o=o&&findParent(o);while(o);for(var l=0;l<e.ancestors.length;l++)t=e.ancestors[l],ReactEventListener._handleTopLevel(e.topLevelType,t,e.nativeEvent,getEventTarget(e.nativeEvent))}function scrollValueMonitor(e){var n=getUnboundedScrollPosition(window);e(n)}var _assign=require("object-assign"),EventListener=require("fbjs/lib/EventListener"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),PooledClass=require("./PooledClass"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactUpdates=require("./ReactUpdates"),getEventTarget=require("./getEventTarget"),getUnboundedScrollPosition=require("fbjs/lib/getUnboundedScrollPosition");_assign(TopLevelCallbackBookKeeping.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),PooledClass.addPoolingTo(TopLevelCallbackBookKeeping,PooledClass.twoArgumentPooler);var ReactEventListener={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:ExecutionEnvironment.canUseDOM?window:null,setHandleTopLevel:function(e){ReactEventListener._handleTopLevel=e},setEnabled:function(e){ReactEventListener._enabled=!!e},isEnabled:function(){return ReactEventListener._enabled},trapBubbledEvent:function(e,n,t){var o=t;return o?EventListener.listen(o,n,ReactEventListener.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,n,t){var o=t;return o?EventListener.capture(o,n,ReactEventListener.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var n=scrollValueMonitor.bind(null,e);EventListener.listen(window,"scroll",n)},dispatchEvent:function(e,n){if(ReactEventListener._enabled){var t=TopLevelCallbackBookKeeping.getPooled(e,n);try{ReactUpdates.batchedUpdates(handleTopLevelImpl,t)}finally{TopLevelCallbackBookKeeping.release(t)}}}};module.exports=ReactEventListener; -},{"./PooledClass":101,"./ReactDOMComponentTree":116,"./ReactUpdates":162,"./getEventTarget":194,"fbjs/lib/EventListener":211,"fbjs/lib/ExecutionEnvironment":212,"fbjs/lib/getUnboundedScrollPosition":223,"object-assign":32}],141:[function(require,module,exports){ +},{"./PooledClass":100,"./ReactDOMComponentTree":115,"./ReactUpdates":158,"./getEventTarget":191,"fbjs/lib/EventListener":209,"fbjs/lib/ExecutionEnvironment":210,"fbjs/lib/getUnboundedScrollPosition":221,"object-assign":31}],136:[function(require,module,exports){ "use strict";var ReactFeatureFlags={logTopLevelRenders:!1};module.exports=ReactFeatureFlags; -},{}],142:[function(require,module,exports){ -"use strict";var DOMProperty=require("./DOMProperty"),EventPluginHub=require("./EventPluginHub"),EventPluginUtils=require("./EventPluginUtils"),ReactComponentEnvironment=require("./ReactComponentEnvironment"),ReactClass=require("./ReactClass"),ReactEmptyComponent=require("./ReactEmptyComponent"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactNativeComponent=require("./ReactNativeComponent"),ReactUpdates=require("./ReactUpdates"),ReactInjection={Component:ReactComponentEnvironment.injection,Class:ReactClass.injection,DOMProperty:DOMProperty.injection,EmptyComponent:ReactEmptyComponent.injection,EventPluginHub:EventPluginHub.injection,EventPluginUtils:EventPluginUtils.injection,EventEmitter:ReactBrowserEventEmitter.injection,NativeComponent:ReactNativeComponent.injection,Updates:ReactUpdates.injection};module.exports=ReactInjection; +},{}],137:[function(require,module,exports){ +"use strict";function createInternalComponent(n){return genericComponentClass?void 0:_prodInvariant("111",n.type),new genericComponentClass(n)}function createInstanceForText(n){return new textComponentClass(n)}function isTextComponent(n){return n instanceof textComponentClass}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),invariant=require("fbjs/lib/invariant"),genericComponentClass=null,tagToComponentClass={},textComponentClass=null,ReactHostComponentInjection={injectGenericComponentClass:function(n){genericComponentClass=n},injectTextComponentClass:function(n){textComponentClass=n},injectComponentClasses:function(n){_assign(tagToComponentClass,n)}},ReactHostComponent={createInternalComponent:createInternalComponent,createInstanceForText:createInstanceForText,isTextComponent:isTextComponent,injection:ReactHostComponentInjection};module.exports=ReactHostComponent; -},{"./DOMProperty":86,"./EventPluginHub":93,"./EventPluginUtils":95,"./ReactBrowserEventEmitter":103,"./ReactClass":106,"./ReactComponentEnvironment":109,"./ReactEmptyComponent":137,"./ReactNativeComponent":150,"./ReactUpdates":162}],143:[function(require,module,exports){ +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224,"object-assign":31}],138:[function(require,module,exports){ +"use strict";var DOMProperty=require("./DOMProperty"),EventPluginHub=require("./EventPluginHub"),EventPluginUtils=require("./EventPluginUtils"),ReactComponentEnvironment=require("./ReactComponentEnvironment"),ReactClass=require("./ReactClass"),ReactEmptyComponent=require("./ReactEmptyComponent"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactHostComponent=require("./ReactHostComponent"),ReactUpdates=require("./ReactUpdates"),ReactInjection={Component:ReactComponentEnvironment.injection,Class:ReactClass.injection,DOMProperty:DOMProperty.injection,EmptyComponent:ReactEmptyComponent.injection,EventPluginHub:EventPluginHub.injection,EventPluginUtils:EventPluginUtils.injection,EventEmitter:ReactBrowserEventEmitter.injection,HostComponent:ReactHostComponent.injection,Updates:ReactUpdates.injection};module.exports=ReactInjection; + +},{"./DOMProperty":85,"./EventPluginHub":92,"./EventPluginUtils":94,"./ReactBrowserEventEmitter":102,"./ReactClass":105,"./ReactComponentEnvironment":108,"./ReactEmptyComponent":132,"./ReactHostComponent":137,"./ReactUpdates":158}],139:[function(require,module,exports){ "use strict";function isInDocument(e){return containsNode(document.documentElement,e)}var ReactDOMSelection=require("./ReactDOMSelection"),containsNode=require("fbjs/lib/containsNode"),focusNode=require("fbjs/lib/focusNode"),getActiveElement=require("fbjs/lib/getActiveElement"),ReactInputSelection={hasSelectionCapabilities:function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&"text"===e.type||"textarea"===t||"true"===e.contentEditable)},getSelectionInformation:function(){var e=getActiveElement();return{focusedElem:e,selectionRange:ReactInputSelection.hasSelectionCapabilities(e)?ReactInputSelection.getSelection(e):null}},restoreSelection:function(e){var t=getActiveElement(),n=e.focusedElem,o=e.selectionRange;t!==n&&isInDocument(n)&&(ReactInputSelection.hasSelectionCapabilities(n)&&ReactInputSelection.setSelection(n,o),focusNode(n))},getSelection:function(e){var t;if("selectionStart"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&e.nodeName&&"input"===e.nodeName.toLowerCase()){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart("character",-e.value.length),end:-n.moveEnd("character",-e.value.length)})}else t=ReactDOMSelection.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,o=t.end;if(void 0===o&&(o=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(o,e.value.length);else if(document.selection&&e.nodeName&&"input"===e.nodeName.toLowerCase()){var c=e.createTextRange();c.collapse(!0),c.moveStart("character",n),c.moveEnd("character",o-n),c.select()}else ReactDOMSelection.setOffsets(e,t)}};module.exports=ReactInputSelection; -},{"./ReactDOMSelection":127,"fbjs/lib/containsNode":215,"fbjs/lib/focusNode":220,"fbjs/lib/getActiveElement":221}],144:[function(require,module,exports){ +},{"./ReactDOMSelection":125,"fbjs/lib/containsNode":213,"fbjs/lib/focusNode":218,"fbjs/lib/getActiveElement":219}],140:[function(require,module,exports){ "use strict";var ReactInstanceMap={remove:function(n){n._reactInternalInstance=void 0},get:function(n){return n._reactInternalInstance},has:function(n){return void 0!==n._reactInternalInstance},set:function(n,t){n._reactInternalInstance=t}};module.exports=ReactInstanceMap; -},{}],145:[function(require,module,exports){ -"use strict";var ReactDebugTool=require("./ReactDebugTool");module.exports={debugTool:ReactDebugTool}; +},{}],141:[function(require,module,exports){ +"use strict";var debugTool=null,ReactDebugTool;module.exports={debugTool:debugTool}; -},{"./ReactDebugTool":132}],146:[function(require,module,exports){ +},{}],142:[function(require,module,exports){ "use strict";var adler32=require("./adler32"),TAG_END=/\/?>/,COMMENT_START=/^<\!\-\-/,ReactMarkupChecksum={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:function(e){var r=adler32(e);return COMMENT_START.test(e)?e:e.replace(TAG_END," "+ReactMarkupChecksum.CHECKSUM_ATTR_NAME+'="'+r+'"$&')},canReuseMarkup:function(e,r){var a=r.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);a=a&&parseInt(a,10);var u=adler32(e);return u===a}};module.exports=ReactMarkupChecksum; -},{"./adler32":183}],147:[function(require,module,exports){ -"use strict";function firstDifferenceIndex(e,t){for(var n=Math.min(e.length,t.length),r=0;r<n;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function getReactRootElementInContainer(e){return e?e.nodeType===DOC_NODE_TYPE?e.documentElement:e.firstChild:null}function internalGetID(e){return e.getAttribute&&e.getAttribute(ATTR_NAME)||""}function mountComponentIntoNode(e,t,n,r,o){var a;if(ReactFeatureFlags.logTopLevelRenders){var i=e._currentElement.props,c=i.type;a="React mount: "+("string"==typeof c?c:c.displayName||c.name),console.time(a)}var u=ReactReconciler.mountComponent(e,n,null,ReactDOMContainerInfo(e,t),o);a&&console.timeEnd(a),e._renderedComponent._topLevelWrapper=e,ReactMount._mountImageIntoNode(u,t,e,r,n)}function batchedMountComponentIntoNode(e,t,n,r){var o=ReactUpdates.ReactReconcileTransaction.getPooled(!n&&ReactDOMFeatureFlags.useCreateElement);o.perform(mountComponentIntoNode,null,e,t,o,n,r),ReactUpdates.ReactReconcileTransaction.release(o)}function unmountComponentFromNode(e,t,n){for(ReactReconciler.unmountComponent(e,n),t.nodeType===DOC_NODE_TYPE&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)}function hasNonRootReactChild(e){var t=getReactRootElementInContainer(e);if(t){var n=ReactDOMComponentTree.getInstanceFromNode(t);return!(!n||!n._nativeParent)}}function getNativeRootInstanceInContainer(e){var t=getReactRootElementInContainer(e),n=t&&ReactDOMComponentTree.getInstanceFromNode(t);return n&&!n._nativeParent?n:null}function getTopLevelWrapperInContainer(e){var t=getNativeRootInstanceInContainer(e);return t?t._nativeContainerInfo._topLevelWrapper:null}var DOMLazyTree=require("./DOMLazyTree"),DOMProperty=require("./DOMProperty"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMContainerInfo=require("./ReactDOMContainerInfo"),ReactDOMFeatureFlags=require("./ReactDOMFeatureFlags"),ReactElement=require("./ReactElement"),ReactFeatureFlags=require("./ReactFeatureFlags"),ReactInstrumentation=require("./ReactInstrumentation"),ReactMarkupChecksum=require("./ReactMarkupChecksum"),ReactReconciler=require("./ReactReconciler"),ReactUpdateQueue=require("./ReactUpdateQueue"),ReactUpdates=require("./ReactUpdates"),emptyObject=require("fbjs/lib/emptyObject"),instantiateReactComponent=require("./instantiateReactComponent"),invariant=require("fbjs/lib/invariant"),setInnerHTML=require("./setInnerHTML"),shouldUpdateReactComponent=require("./shouldUpdateReactComponent"),warning=require("fbjs/lib/warning"),ATTR_NAME=DOMProperty.ID_ATTRIBUTE_NAME,ROOT_ATTR_NAME=DOMProperty.ROOT_ATTRIBUTE_NAME,ELEMENT_NODE_TYPE=1,DOC_NODE_TYPE=9,DOCUMENT_FRAGMENT_NODE_TYPE=11,instancesByReactRootID={},topLevelRootCounter=1,TopLevelWrapper=function(){this.rootID=topLevelRootCounter++};TopLevelWrapper.prototype.isReactComponent={},TopLevelWrapper.prototype.render=function(){return this.props};var ReactMount={TopLevelWrapper:TopLevelWrapper,_instancesByReactRootID:instancesByReactRootID,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r){return ReactMount.scrollMonitor(n,function(){ReactUpdateQueue.enqueueElementInternal(e,t),r&&ReactUpdateQueue.enqueueCallbackInternal(e,r)}),e},_renderNewRootComponent:function(e,t,n,r){!t||t.nodeType!==ELEMENT_NODE_TYPE&&t.nodeType!==DOC_NODE_TYPE&&t.nodeType!==DOCUMENT_FRAGMENT_NODE_TYPE?invariant(!1):void 0,ReactBrowserEventEmitter.ensureScrollValueMonitoring();var o=instantiateReactComponent(e);ReactUpdates.batchedUpdates(batchedMountComponentIntoNode,o,t,n,r);var a=o._instance.rootID;return instancesByReactRootID[a]=o,o},renderSubtreeIntoContainer:function(e,t,n,r){return null==e||null==e._reactInternalInstance?invariant(!1):void 0,ReactMount._renderSubtreeIntoContainer(e,t,n,r)},_renderSubtreeIntoContainer:function(e,t,n,r){ReactUpdateQueue.validateCallback(r,"ReactDOM.render"),ReactElement.isValidElement(t)?void 0:invariant(!1);var o=ReactElement(TopLevelWrapper,null,null,null,null,null,t),a=getTopLevelWrapperInContainer(n);if(a){var i=a._currentElement,c=i.props;if(shouldUpdateReactComponent(c,t)){var u=a._renderedComponent.getPublicInstance(),l=r&&function(){r.call(u)};return ReactMount._updateRootComponent(a,o,n,l),u}ReactMount.unmountComponentAtNode(n)}var p=getReactRootElementInContainer(n),R=p&&!!internalGetID(p),s=hasNonRootReactChild(n),d=R&&!a&&!s,C=ReactMount._renderNewRootComponent(o,n,d,null!=e?e._reactInternalInstance._processChildContext(e._reactInternalInstance._context):emptyObject)._renderedComponent.getPublicInstance();return r&&r.call(C),C},render:function(e,t,n){return ReactMount._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){!e||e.nodeType!==ELEMENT_NODE_TYPE&&e.nodeType!==DOC_NODE_TYPE&&e.nodeType!==DOCUMENT_FRAGMENT_NODE_TYPE?invariant(!1):void 0;var t=getTopLevelWrapperInContainer(e);if(!t){hasNonRootReactChild(e),1===e.nodeType&&e.hasAttribute(ROOT_ATTR_NAME);return!1}return delete instancesByReactRootID[t._instance.rootID],ReactUpdates.batchedUpdates(unmountComponentFromNode,t,e,!1),!0},_mountImageIntoNode:function(e,t,n,r,o){if(!t||t.nodeType!==ELEMENT_NODE_TYPE&&t.nodeType!==DOC_NODE_TYPE&&t.nodeType!==DOCUMENT_FRAGMENT_NODE_TYPE?invariant(!1):void 0,r){var a=getReactRootElementInContainer(t);if(ReactMarkupChecksum.canReuseMarkup(e,a))return void ReactDOMComponentTree.precacheNode(n,a);var i=a.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);a.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);var c=a.outerHTML;a.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME,i);var u=e,l=firstDifferenceIndex(u,c);" (client) "+u.substring(l-20,l+20)+"\n (server) "+c.substring(l-20,l+20);t.nodeType===DOC_NODE_TYPE?invariant(!1):void 0}if(t.nodeType===DOC_NODE_TYPE?invariant(!1):void 0,o.useCreateElement){for(;t.lastChild;)t.removeChild(t.lastChild);DOMLazyTree.insertTreeBefore(t,e,null)}else setInnerHTML(t,e),ReactDOMComponentTree.precacheNode(n,t.firstChild)}};module.exports=ReactMount; +},{"./adler32":179}],143:[function(require,module,exports){ +"use strict";function firstDifferenceIndex(e,t){for(var n=Math.min(e.length,t.length),o=0;o<n;o++)if(e.charAt(o)!==t.charAt(o))return o;return e.length===t.length?-1:n}function getReactRootElementInContainer(e){return e?e.nodeType===DOC_NODE_TYPE?e.documentElement:e.firstChild:null}function internalGetID(e){return e.getAttribute&&e.getAttribute(ATTR_NAME)||""}function mountComponentIntoNode(e,t,n,o,r){var a;if(ReactFeatureFlags.logTopLevelRenders){var i=e._currentElement.props,c=i.type;a="React mount: "+("string"==typeof c?c:c.displayName||c.name),console.time(a)}var u=ReactReconciler.mountComponent(e,n,null,ReactDOMContainerInfo(e,t),r);a&&console.timeEnd(a),e._renderedComponent._topLevelWrapper=e,ReactMount._mountImageIntoNode(u,t,e,o,n)}function batchedMountComponentIntoNode(e,t,n,o){var r=ReactUpdates.ReactReconcileTransaction.getPooled(!n&&ReactDOMFeatureFlags.useCreateElement);r.perform(mountComponentIntoNode,null,e,t,r,n,o),ReactUpdates.ReactReconcileTransaction.release(r)}function unmountComponentFromNode(e,t,n){for(ReactReconciler.unmountComponent(e,n),t.nodeType===DOC_NODE_TYPE&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)}function hasNonRootReactChild(e){var t=getReactRootElementInContainer(e);if(t){var n=ReactDOMComponentTree.getInstanceFromNode(t);return!(!n||!n._hostParent)}}function getHostRootInstanceInContainer(e){var t=getReactRootElementInContainer(e),n=t&&ReactDOMComponentTree.getInstanceFromNode(t);return n&&!n._hostParent?n:null}function getTopLevelWrapperInContainer(e){var t=getHostRootInstanceInContainer(e);return t?t._hostContainerInfo._topLevelWrapper:null}var _prodInvariant=require("./reactProdInvariant"),DOMLazyTree=require("./DOMLazyTree"),DOMProperty=require("./DOMProperty"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMContainerInfo=require("./ReactDOMContainerInfo"),ReactDOMFeatureFlags=require("./ReactDOMFeatureFlags"),ReactElement=require("./ReactElement"),ReactFeatureFlags=require("./ReactFeatureFlags"),ReactInstanceMap=require("./ReactInstanceMap"),ReactInstrumentation=require("./ReactInstrumentation"),ReactMarkupChecksum=require("./ReactMarkupChecksum"),ReactReconciler=require("./ReactReconciler"),ReactUpdateQueue=require("./ReactUpdateQueue"),ReactUpdates=require("./ReactUpdates"),emptyObject=require("fbjs/lib/emptyObject"),instantiateReactComponent=require("./instantiateReactComponent"),invariant=require("fbjs/lib/invariant"),setInnerHTML=require("./setInnerHTML"),shouldUpdateReactComponent=require("./shouldUpdateReactComponent"),warning=require("fbjs/lib/warning"),ATTR_NAME=DOMProperty.ID_ATTRIBUTE_NAME,ROOT_ATTR_NAME=DOMProperty.ROOT_ATTRIBUTE_NAME,ELEMENT_NODE_TYPE=1,DOC_NODE_TYPE=9,DOCUMENT_FRAGMENT_NODE_TYPE=11,instancesByReactRootID={},topLevelRootCounter=1,TopLevelWrapper=function(){this.rootID=topLevelRootCounter++};TopLevelWrapper.prototype.isReactComponent={},TopLevelWrapper.prototype.render=function(){return this.props};var ReactMount={TopLevelWrapper:TopLevelWrapper,_instancesByReactRootID:instancesByReactRootID,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,o,r){return ReactMount.scrollMonitor(o,function(){ReactUpdateQueue.enqueueElementInternal(e,t,n),r&&ReactUpdateQueue.enqueueCallbackInternal(e,r)}),e},_renderNewRootComponent:function(e,t,n,o){!t||t.nodeType!==ELEMENT_NODE_TYPE&&t.nodeType!==DOC_NODE_TYPE&&t.nodeType!==DOCUMENT_FRAGMENT_NODE_TYPE?_prodInvariant("37"):void 0,ReactBrowserEventEmitter.ensureScrollValueMonitoring();var r=instantiateReactComponent(e,!1);ReactUpdates.batchedUpdates(batchedMountComponentIntoNode,r,t,n,o);var a=r._instance.rootID;return instancesByReactRootID[a]=r,r},renderSubtreeIntoContainer:function(e,t,n,o){return null!=e&&ReactInstanceMap.has(e)?void 0:_prodInvariant("38"),ReactMount._renderSubtreeIntoContainer(e,t,n,o)},_renderSubtreeIntoContainer:function(e,t,n,o){ReactUpdateQueue.validateCallback(o,"ReactDOM.render"),ReactElement.isValidElement(t)?void 0:_prodInvariant("39","string"==typeof t?" Instead of passing a string like 'div', pass React.createElement('div') or <div />.":"function"==typeof t?" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.":null!=t&&void 0!==t.props?" This may be caused by unintentionally loading two independent copies of React.":"");var r,a=ReactElement(TopLevelWrapper,null,null,null,null,null,t);if(e){var i=ReactInstanceMap.get(e);r=i._processChildContext(i._context)}else r=emptyObject;var c=getTopLevelWrapperInContainer(n);if(c){var u=c._currentElement,p=u.props;if(shouldUpdateReactComponent(p,t)){var l=c._renderedComponent.getPublicInstance(),R=o&&function(){o.call(l)};return ReactMount._updateRootComponent(c,a,r,n,R),l}ReactMount.unmountComponentAtNode(n)}var s=getReactRootElementInContainer(n),d=s&&!!internalGetID(s),m=hasNonRootReactChild(n),C=d&&!c&&!m,E=ReactMount._renderNewRootComponent(a,n,C,r)._renderedComponent.getPublicInstance();return o&&o.call(E),E},render:function(e,t,n){return ReactMount._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){!e||e.nodeType!==ELEMENT_NODE_TYPE&&e.nodeType!==DOC_NODE_TYPE&&e.nodeType!==DOCUMENT_FRAGMENT_NODE_TYPE?_prodInvariant("40"):void 0;var t=getTopLevelWrapperInContainer(e);if(!t){hasNonRootReactChild(e),1===e.nodeType&&e.hasAttribute(ROOT_ATTR_NAME);return!1}return delete instancesByReactRootID[t._instance.rootID],ReactUpdates.batchedUpdates(unmountComponentFromNode,t,e,!1),!0},_mountImageIntoNode:function(e,t,n,o,r){if(!t||t.nodeType!==ELEMENT_NODE_TYPE&&t.nodeType!==DOC_NODE_TYPE&&t.nodeType!==DOCUMENT_FRAGMENT_NODE_TYPE?_prodInvariant("41"):void 0,o){var a=getReactRootElementInContainer(t);if(ReactMarkupChecksum.canReuseMarkup(e,a))return void ReactDOMComponentTree.precacheNode(n,a);var i=a.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);a.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);var c=a.outerHTML;a.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME,i);var u=e,p=firstDifferenceIndex(u,c),l=" (client) "+u.substring(p-20,p+20)+"\n (server) "+c.substring(p-20,p+20);t.nodeType===DOC_NODE_TYPE?_prodInvariant("42",l):void 0}if(t.nodeType===DOC_NODE_TYPE?_prodInvariant("43"):void 0,r.useCreateElement){for(;t.lastChild;)t.removeChild(t.lastChild);DOMLazyTree.insertTreeBefore(t,e,null)}else setInnerHTML(t,e),ReactDOMComponentTree.precacheNode(n,t.firstChild)}};module.exports=ReactMount; -},{"./DOMLazyTree":84,"./DOMProperty":86,"./ReactBrowserEventEmitter":103,"./ReactCurrentOwner":111,"./ReactDOMComponentTree":116,"./ReactDOMContainerInfo":117,"./ReactDOMFeatureFlags":121,"./ReactElement":135,"./ReactFeatureFlags":141,"./ReactInstrumentation":145,"./ReactMarkupChecksum":146,"./ReactReconciler":158,"./ReactUpdateQueue":161,"./ReactUpdates":162,"./instantiateReactComponent":200,"./setInnerHTML":206,"./shouldUpdateReactComponent":208,"fbjs/lib/emptyObject":219,"fbjs/lib/invariant":226,"fbjs/lib/warning":236}],148:[function(require,module,exports){ -"use strict";function makeInsertMarkup(e,n,t){return{type:ReactMultiChildUpdateTypes.INSERT_MARKUP,content:e,fromIndex:null,fromNode:null,toIndex:t,afterNode:n}}function makeMove(e,n,t){return{type:ReactMultiChildUpdateTypes.MOVE_EXISTING,content:null,fromIndex:e._mountIndex,fromNode:ReactReconciler.getNativeNode(e),toIndex:t,afterNode:n}}function makeRemove(e,n){return{type:ReactMultiChildUpdateTypes.REMOVE_NODE,content:null,fromIndex:e._mountIndex,fromNode:n,toIndex:null,afterNode:null}}function makeSetMarkup(e){return{type:ReactMultiChildUpdateTypes.SET_MARKUP,content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function makeTextContent(e){return{type:ReactMultiChildUpdateTypes.TEXT_CONTENT,content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function enqueue(e,n){return n&&(e=e||[],e.push(n)),e}function processQueue(e,n){ReactComponentEnvironment.processChildrenUpdates(e,n)}var ReactComponentEnvironment=require("./ReactComponentEnvironment"),ReactInstrumentation=require("./ReactInstrumentation"),ReactMultiChildUpdateTypes=require("./ReactMultiChildUpdateTypes"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactReconciler=require("./ReactReconciler"),ReactChildReconciler=require("./ReactChildReconciler"),emptyFunction=require("fbjs/lib/emptyFunction"),flattenChildren=require("./flattenChildren"),invariant=require("fbjs/lib/invariant"),setChildrenForInstrumentation=emptyFunction,ReactMultiChild={Mixin:{_reconcilerInstantiateChildren:function(e,n,t){return ReactChildReconciler.instantiateChildren(e,n,t)},_reconcilerUpdateChildren:function(e,n,t,r,i){var o;return o=flattenChildren(n),ReactChildReconciler.updateChildren(e,o,t,r,i),o},mountChildren:function(e,n,t){var r=this._reconcilerInstantiateChildren(e,n,t);this._renderedChildren=r;var i=[],o=0;for(var u in r)if(r.hasOwnProperty(u)){var a=r[u],l=ReactReconciler.mountComponent(a,n,this,this._nativeContainerInfo,t);a._mountIndex=o++,i.push(l)}return i},updateTextContent:function(e){var n=this._renderedChildren;ReactChildReconciler.unmountChildren(n,!1);for(var t in n)n.hasOwnProperty(t)&&invariant(!1);var r=[makeTextContent(e)];processQueue(this,r)},updateMarkup:function(e){var n=this._renderedChildren;ReactChildReconciler.unmountChildren(n,!1);for(var t in n)n.hasOwnProperty(t)&&invariant(!1);var r=[makeSetMarkup(e)];processQueue(this,r)},updateChildren:function(e,n,t){this._updateChildren(e,n,t)},_updateChildren:function(e,n,t){var r=this._renderedChildren,i={},o=this._reconcilerUpdateChildren(r,e,i,n,t);if(o||r){var u,a=null,l=0,d=0,c=null;for(u in o)if(o.hasOwnProperty(u)){var h=r&&r[u],C=o[u];h===C?(a=enqueue(a,this.moveChild(h,c,d,l)),l=Math.max(h._mountIndex,l),h._mountIndex=d):(h&&(l=Math.max(h._mountIndex,l)),a=enqueue(a,this._mountChildAtIndex(C,c,d,n,t))),d++,c=ReactReconciler.getNativeNode(C)}for(u in i)i.hasOwnProperty(u)&&(a=enqueue(a,this._unmountChild(r[u],i[u])));a&&processQueue(this,a),this._renderedChildren=o}},unmountChildren:function(e){var n=this._renderedChildren;ReactChildReconciler.unmountChildren(n,e),this._renderedChildren=null},moveChild:function(e,n,t,r){if(e._mountIndex<r)return makeMove(e,n,t)},createChild:function(e,n,t){return makeInsertMarkup(t,n,e._mountIndex)},removeChild:function(e,n){return makeRemove(e,n)},_mountChildAtIndex:function(e,n,t,r,i){var o=ReactReconciler.mountComponent(e,r,this,this._nativeContainerInfo,i);return e._mountIndex=t,this.createChild(e,n,o)},_unmountChild:function(e,n){var t=this.removeChild(e,n);return e._mountIndex=null,t}}};module.exports=ReactMultiChild; +},{"./DOMLazyTree":83,"./DOMProperty":85,"./ReactBrowserEventEmitter":102,"./ReactCurrentOwner":110,"./ReactDOMComponentTree":115,"./ReactDOMContainerInfo":116,"./ReactDOMFeatureFlags":119,"./ReactElement":131,"./ReactFeatureFlags":136,"./ReactInstanceMap":140,"./ReactInstrumentation":141,"./ReactMarkupChecksum":142,"./ReactReconciler":153,"./ReactUpdateQueue":157,"./ReactUpdates":158,"./instantiateReactComponent":197,"./reactProdInvariant":202,"./setInnerHTML":204,"./shouldUpdateReactComponent":206,"fbjs/lib/emptyObject":217,"fbjs/lib/invariant":224,"fbjs/lib/warning":232}],144:[function(require,module,exports){ +"use strict";function makeInsertMarkup(e,n,t){return{type:ReactMultiChildUpdateTypes.INSERT_MARKUP,content:e,fromIndex:null,fromNode:null,toIndex:t,afterNode:n}}function makeMove(e,n,t){return{type:ReactMultiChildUpdateTypes.MOVE_EXISTING,content:null,fromIndex:e._mountIndex,fromNode:ReactReconciler.getHostNode(e),toIndex:t,afterNode:n}}function makeRemove(e,n){return{type:ReactMultiChildUpdateTypes.REMOVE_NODE,content:null,fromIndex:e._mountIndex,fromNode:n,toIndex:null,afterNode:null}}function makeSetMarkup(e){return{type:ReactMultiChildUpdateTypes.SET_MARKUP,content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function makeTextContent(e){return{type:ReactMultiChildUpdateTypes.TEXT_CONTENT,content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function enqueue(e,n){return n&&(e=e||[],e.push(n)),e}function processQueue(e,n){ReactComponentEnvironment.processChildrenUpdates(e,n)}var _prodInvariant=require("./reactProdInvariant"),ReactComponentEnvironment=require("./ReactComponentEnvironment"),ReactInstanceMap=require("./ReactInstanceMap"),ReactInstrumentation=require("./ReactInstrumentation"),ReactMultiChildUpdateTypes=require("./ReactMultiChildUpdateTypes"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactReconciler=require("./ReactReconciler"),ReactChildReconciler=require("./ReactChildReconciler"),emptyFunction=require("fbjs/lib/emptyFunction"),flattenChildren=require("./flattenChildren"),invariant=require("fbjs/lib/invariant"),setParentForInstrumentation=emptyFunction,setChildrenForInstrumentation=emptyFunction,getDebugID,ReactMultiChild={Mixin:{_reconcilerInstantiateChildren:function(e,n,t){return ReactChildReconciler.instantiateChildren(e,n,t)},_reconcilerUpdateChildren:function(e,n,t,r,i){var o;return o=flattenChildren(n),ReactChildReconciler.updateChildren(e,o,t,r,i),o},mountChildren:function(e,n,t){var r=this._reconcilerInstantiateChildren(e,n,t);this._renderedChildren=r;var i=[],o=0;for(var u in r)if(r.hasOwnProperty(u)){var a=r[u],d=ReactReconciler.mountComponent(a,n,this,this._hostContainerInfo,t);a._mountIndex=o++,i.push(d)}return i},updateTextContent:function(e){var n=this._renderedChildren;ReactChildReconciler.unmountChildren(n,!1);for(var t in n)n.hasOwnProperty(t)&&_prodInvariant("118");var r=[makeTextContent(e)];processQueue(this,r)},updateMarkup:function(e){var n=this._renderedChildren;ReactChildReconciler.unmountChildren(n,!1);for(var t in n)n.hasOwnProperty(t)&&_prodInvariant("118");var r=[makeSetMarkup(e)];processQueue(this,r)},updateChildren:function(e,n,t){this._updateChildren(e,n,t)},_updateChildren:function(e,n,t){var r=this._renderedChildren,i={},o=this._reconcilerUpdateChildren(r,e,i,n,t);if(o||r){var u,a=null,d=0,l=0,c=null;for(u in o)if(o.hasOwnProperty(u)){var h=r&&r[u],s=o[u];h===s?(a=enqueue(a,this.moveChild(h,c,l,d)),d=Math.max(h._mountIndex,d),h._mountIndex=l):(h&&(d=Math.max(h._mountIndex,d)),a=enqueue(a,this._mountChildAtIndex(s,c,l,n,t))),l++,c=ReactReconciler.getHostNode(s)}for(u in i)i.hasOwnProperty(u)&&(a=enqueue(a,this._unmountChild(r[u],i[u])));a&&processQueue(this,a),this._renderedChildren=o}},unmountChildren:function(e){var n=this._renderedChildren;ReactChildReconciler.unmountChildren(n,e),this._renderedChildren=null},moveChild:function(e,n,t,r){if(e._mountIndex<r)return makeMove(e,n,t)},createChild:function(e,n,t){return makeInsertMarkup(t,n,e._mountIndex)},removeChild:function(e,n){return makeRemove(e,n)},_mountChildAtIndex:function(e,n,t,r,i){var o=ReactReconciler.mountComponent(e,r,this,this._hostContainerInfo,i);return e._mountIndex=t,this.createChild(e,n,o)},_unmountChild:function(e,n){var t=this.removeChild(e,n);return e._mountIndex=null,t}}};module.exports=ReactMultiChild; -},{"./ReactChildReconciler":104,"./ReactComponentEnvironment":109,"./ReactCurrentOwner":111,"./ReactInstrumentation":145,"./ReactMultiChildUpdateTypes":149,"./ReactReconciler":158,"./flattenChildren":189,"fbjs/lib/emptyFunction":218,"fbjs/lib/invariant":226}],149:[function(require,module,exports){ +},{"./ReactChildReconciler":103,"./ReactComponentEnvironment":108,"./ReactCurrentOwner":110,"./ReactInstanceMap":140,"./ReactInstrumentation":141,"./ReactMultiChildUpdateTypes":145,"./ReactReconciler":153,"./flattenChildren":186,"./reactProdInvariant":202,"fbjs/lib/emptyFunction":216,"fbjs/lib/invariant":224}],145:[function(require,module,exports){ "use strict";var keyMirror=require("fbjs/lib/keyMirror"),ReactMultiChildUpdateTypes=keyMirror({INSERT_MARKUP:null,MOVE_EXISTING:null,REMOVE_NODE:null,SET_MARKUP:null,TEXT_CONTENT:null});module.exports=ReactMultiChildUpdateTypes; -},{"fbjs/lib/keyMirror":229}],150:[function(require,module,exports){ -"use strict";function getComponentClassForElement(n){if("function"==typeof n.type)return n.type;var e=n.type,t=tagToComponentClass[e];return null==t&&(tagToComponentClass[e]=t=autoGenerateWrapperClass(e)),t}function createInternalComponent(n){return genericComponentClass?void 0:invariant(!1),new genericComponentClass(n)}function createInstanceForText(n){return new textComponentClass(n)}function isTextComponent(n){return n instanceof textComponentClass}var _assign=require("object-assign"),invariant=require("fbjs/lib/invariant"),autoGenerateWrapperClass=null,genericComponentClass=null,tagToComponentClass={},textComponentClass=null,ReactNativeComponentInjection={injectGenericComponentClass:function(n){genericComponentClass=n},injectTextComponentClass:function(n){textComponentClass=n},injectComponentClasses:function(n){_assign(tagToComponentClass,n)}},ReactNativeComponent={getComponentClassForElement:getComponentClassForElement,createInternalComponent:createInternalComponent,createInstanceForText:createInstanceForText,isTextComponent:isTextComponent,injection:ReactNativeComponentInjection};module.exports=ReactNativeComponent; - -},{"fbjs/lib/invariant":226,"object-assign":32}],151:[function(require,module,exports){ -"use strict";var ReactElement=require("./ReactElement"),invariant=require("fbjs/lib/invariant"),ReactNodeTypes={NATIVE:0,COMPOSITE:1,EMPTY:2,getType:function(e){return null===e||e===!1?ReactNodeTypes.EMPTY:ReactElement.isValidElement(e)?"function"==typeof e.type?ReactNodeTypes.COMPOSITE:ReactNodeTypes.NATIVE:void invariant(!1)}};module.exports=ReactNodeTypes; +},{"fbjs/lib/keyMirror":227}],146:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),ReactElement=require("./ReactElement"),invariant=require("fbjs/lib/invariant"),ReactNodeTypes={HOST:0,COMPOSITE:1,EMPTY:2,getType:function(e){return null===e||e===!1?ReactNodeTypes.EMPTY:ReactElement.isValidElement(e)?"function"==typeof e.type?ReactNodeTypes.COMPOSITE:ReactNodeTypes.HOST:void _prodInvariant("26",e)}};module.exports=ReactNodeTypes; -},{"./ReactElement":135,"fbjs/lib/invariant":226}],152:[function(require,module,exports){ -"use strict";function warnTDZ(e,t){}var warning=require("fbjs/lib/warning"),ReactNoopUpdateQueue={isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){warnTDZ(e,"forceUpdate")},enqueueReplaceState:function(e,t){warnTDZ(e,"replaceState")},enqueueSetState:function(e,t){warnTDZ(e,"setState")}};module.exports=ReactNoopUpdateQueue; +},{"./ReactElement":131,"./reactProdInvariant":202,"fbjs/lib/invariant":224}],147:[function(require,module,exports){ +"use strict";function warnNoop(e,t){}var warning=require("fbjs/lib/warning"),ReactNoopUpdateQueue={isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){warnNoop(e,"forceUpdate")},enqueueReplaceState:function(e,t){warnNoop(e,"replaceState")},enqueueSetState:function(e,t){warnNoop(e,"setState")}};module.exports=ReactNoopUpdateQueue; -},{"fbjs/lib/warning":236}],153:[function(require,module,exports){ -"use strict";var invariant=require("fbjs/lib/invariant"),ReactOwner={isValidOwner:function(e){return!(!e||"function"!=typeof e.attachRef||"function"!=typeof e.detachRef)},addComponentAsRefTo:function(e,n,t){ReactOwner.isValidOwner(t)?void 0:invariant(!1),t.attachRef(n,e)},removeComponentAsRefFrom:function(e,n,t){ReactOwner.isValidOwner(t)?void 0:invariant(!1);var a=t.getPublicInstance();a&&a.refs[n]===e.getPublicInstance()&&t.detachRef(n)}};module.exports=ReactOwner; +},{"fbjs/lib/warning":232}],148:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),invariant=require("fbjs/lib/invariant"),ReactOwner={isValidOwner:function(e){return!(!e||"function"!=typeof e.attachRef||"function"!=typeof e.detachRef)},addComponentAsRefTo:function(e,n,t){ReactOwner.isValidOwner(t)?void 0:_prodInvariant("119"),t.attachRef(n,e)},removeComponentAsRefFrom:function(e,n,t){ReactOwner.isValidOwner(t)?void 0:_prodInvariant("120");var a=t.getPublicInstance();a&&a.refs[n]===e.getPublicInstance()&&t.detachRef(n)}};module.exports=ReactOwner; -},{"fbjs/lib/invariant":226}],154:[function(require,module,exports){ +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224}],149:[function(require,module,exports){ "use strict";var ReactPropTypeLocationNames={};module.exports=ReactPropTypeLocationNames; -},{}],155:[function(require,module,exports){ +},{}],150:[function(require,module,exports){ "use strict";var keyMirror=require("fbjs/lib/keyMirror"),ReactPropTypeLocations=keyMirror({prop:null,context:null,childContext:null});module.exports=ReactPropTypeLocations; -},{"fbjs/lib/keyMirror":229}],156:[function(require,module,exports){ -"use strict";function is(e,r){return e===r?0!==e||1/e===1/r:e!==e&&r!==r}function createChainableTypeChecker(e){function r(r,n,t,a,o,c){if(a=a||ANONYMOUS,c=c||t,null==n[t]){var i=ReactPropTypeLocationNames[o];return r?new Error("Required "+i+" `"+c+"` was not specified in "+("`"+a+"`.")):null}return e(n,t,a,o,c)}var n=r.bind(null,!1);return n.isRequired=r.bind(null,!0),n}function createPrimitiveTypeChecker(e){function r(r,n,t,a,o){var c=r[n],i=getPropType(c);if(i!==e){var u=ReactPropTypeLocationNames[a],p=getPreciseType(c);return new Error("Invalid "+u+" `"+o+"` of type "+("`"+p+"` supplied to `"+t+"`, expected ")+("`"+e+"`."))}return null}return createChainableTypeChecker(r)}function createAnyTypeChecker(){return createChainableTypeChecker(emptyFunction.thatReturns(null))}function createArrayOfTypeChecker(e){function r(r,n,t,a,o){if("function"!=typeof e)return new Error("Property `"+o+"` of component `"+t+"` has invalid PropType notation inside arrayOf.");var c=r[n];if(!Array.isArray(c)){var i=ReactPropTypeLocationNames[a],u=getPropType(c);return new Error("Invalid "+i+" `"+o+"` of type "+("`"+u+"` supplied to `"+t+"`, expected an array."))}for(var p=0;p<c.length;p++){var f=e(c,p,t,a,o+"["+p+"]");if(f instanceof Error)return f}return null}return createChainableTypeChecker(r)}function createElementTypeChecker(){function e(e,r,n,t,a){if(!ReactElement.isValidElement(e[r])){var o=ReactPropTypeLocationNames[t];return new Error("Invalid "+o+" `"+a+"` supplied to "+("`"+n+"`, expected a single ReactElement."))}return null}return createChainableTypeChecker(e)}function createInstanceTypeChecker(e){function r(r,n,t,a,o){if(!(r[n]instanceof e)){var c=ReactPropTypeLocationNames[a],i=e.name||ANONYMOUS,u=getClassName(r[n]);return new Error("Invalid "+c+" `"+o+"` of type "+("`"+u+"` supplied to `"+t+"`, expected ")+("instance of `"+i+"`."))}return null}return createChainableTypeChecker(r)}function createEnumTypeChecker(e){function r(r,n,t,a,o){for(var c=r[n],i=0;i<e.length;i++)if(is(c,e[i]))return null;var u=ReactPropTypeLocationNames[a],p=JSON.stringify(e);return new Error("Invalid "+u+" `"+o+"` of value `"+c+"` "+("supplied to `"+t+"`, expected one of "+p+"."))}return createChainableTypeChecker(Array.isArray(e)?r:function(){return new Error("Invalid argument supplied to oneOf, expected an instance of array.")})}function createObjectOfTypeChecker(e){function r(r,n,t,a,o){if("function"!=typeof e)return new Error("Property `"+o+"` of component `"+t+"` has invalid PropType notation inside objectOf.");var c=r[n],i=getPropType(c);if("object"!==i){var u=ReactPropTypeLocationNames[a];return new Error("Invalid "+u+" `"+o+"` of type "+("`"+i+"` supplied to `"+t+"`, expected an object."))}for(var p in c)if(c.hasOwnProperty(p)){var f=e(c,p,t,a,o+"."+p);if(f instanceof Error)return f}return null}return createChainableTypeChecker(r)}function createUnionTypeChecker(e){function r(r,n,t,a,o){for(var c=0;c<e.length;c++){var i=e[c];if(null==i(r,n,t,a,o))return null}var u=ReactPropTypeLocationNames[a];return new Error("Invalid "+u+" `"+o+"` supplied to "+("`"+t+"`."))}return createChainableTypeChecker(Array.isArray(e)?r:function(){return new Error("Invalid argument supplied to oneOfType, expected an instance of array.")})}function createNodeChecker(){function e(e,r,n,t,a){if(!isNode(e[r])){var o=ReactPropTypeLocationNames[t];return new Error("Invalid "+o+" `"+a+"` supplied to "+("`"+n+"`, expected a ReactNode."))}return null}return createChainableTypeChecker(e)}function createShapeTypeChecker(e){function r(r,n,t,a,o){var c=r[n],i=getPropType(c);if("object"!==i){var u=ReactPropTypeLocationNames[a];return new Error("Invalid "+u+" `"+o+"` of type `"+i+"` "+("supplied to `"+t+"`, expected `object`."))}for(var p in e){var f=e[p];if(f){var y=f(c,p,t,a,o+"."+p);if(y)return y}}return null}return createChainableTypeChecker(r)}function isNode(e){switch(typeof e){case"number":case"string":case"undefined":return!0;case"boolean":return!e;case"object":if(Array.isArray(e))return e.every(isNode);if(null===e||ReactElement.isValidElement(e))return!0;var r=getIteratorFn(e);if(!r)return!1;var n,t=r.call(e);if(r!==e.entries){for(;!(n=t.next()).done;)if(!isNode(n.value))return!1}else for(;!(n=t.next()).done;){var a=n.value;if(a&&!isNode(a[1]))return!1}return!0;default:return!1}}function getPropType(e){var r=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":r}function getPreciseType(e){var r=getPropType(e);if("object"===r){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return r}function getClassName(e){return e.constructor&&e.constructor.name?e.constructor.name:ANONYMOUS}var ReactElement=require("./ReactElement"),ReactPropTypeLocationNames=require("./ReactPropTypeLocationNames"),emptyFunction=require("fbjs/lib/emptyFunction"),getIteratorFn=require("./getIteratorFn"),ANONYMOUS="<<anonymous>>",ReactPropTypes={array:createPrimitiveTypeChecker("array"),bool:createPrimitiveTypeChecker("boolean"),func:createPrimitiveTypeChecker("function"),number:createPrimitiveTypeChecker("number"),object:createPrimitiveTypeChecker("object"),string:createPrimitiveTypeChecker("string"),any:createAnyTypeChecker(),arrayOf:createArrayOfTypeChecker,element:createElementTypeChecker(),instanceOf:createInstanceTypeChecker,node:createNodeChecker(),objectOf:createObjectOfTypeChecker,oneOf:createEnumTypeChecker,oneOfType:createUnionTypeChecker,shape:createShapeTypeChecker};module.exports=ReactPropTypes; +},{"fbjs/lib/keyMirror":227}],151:[function(require,module,exports){ +"use strict";function is(e,r){return e===r?0!==e||1/e===1/r:e!==e&&r!==r}function createChainableTypeChecker(e){function r(r,n,t,a,o,i){if(a=a||ANONYMOUS,i=i||t,null==n[t]){var c=ReactPropTypeLocationNames[o];return r?new Error("Required "+c+" `"+i+"` was not specified in "+("`"+a+"`.")):null}return e(n,t,a,o,i)}var n=r.bind(null,!1);return n.isRequired=r.bind(null,!0),n}function createPrimitiveTypeChecker(e){function r(r,n,t,a,o){var i=r[n],c=getPropType(i);if(c!==e){var u=ReactPropTypeLocationNames[a],p=getPreciseType(i);return new Error("Invalid "+u+" `"+o+"` of type "+("`"+p+"` supplied to `"+t+"`, expected ")+("`"+e+"`."))}return null}return createChainableTypeChecker(r)}function createAnyTypeChecker(){return createChainableTypeChecker(emptyFunction.thatReturns(null))}function createArrayOfTypeChecker(e){function r(r,n,t,a,o){if("function"!=typeof e)return new Error("Property `"+o+"` of component `"+t+"` has invalid PropType notation inside arrayOf.");var i=r[n];if(!Array.isArray(i)){var c=ReactPropTypeLocationNames[a],u=getPropType(i);return new Error("Invalid "+c+" `"+o+"` of type "+("`"+u+"` supplied to `"+t+"`, expected an array."))}for(var p=0;p<i.length;p++){var y=e(i,p,t,a,o+"["+p+"]");if(y instanceof Error)return y}return null}return createChainableTypeChecker(r)}function createElementTypeChecker(){function e(e,r,n,t,a){if(!ReactElement.isValidElement(e[r])){var o=ReactPropTypeLocationNames[t];return new Error("Invalid "+o+" `"+a+"` supplied to "+("`"+n+"`, expected a single ReactElement."))}return null}return createChainableTypeChecker(e)}function createInstanceTypeChecker(e){function r(r,n,t,a,o){if(!(r[n]instanceof e)){var i=ReactPropTypeLocationNames[a],c=e.name||ANONYMOUS,u=getClassName(r[n]);return new Error("Invalid "+i+" `"+o+"` of type "+("`"+u+"` supplied to `"+t+"`, expected ")+("instance of `"+c+"`."))}return null}return createChainableTypeChecker(r)}function createEnumTypeChecker(e){function r(r,n,t,a,o){for(var i=r[n],c=0;c<e.length;c++)if(is(i,e[c]))return null;var u=ReactPropTypeLocationNames[a],p=JSON.stringify(e);return new Error("Invalid "+u+" `"+o+"` of value `"+i+"` "+("supplied to `"+t+"`, expected one of "+p+"."))}return createChainableTypeChecker(Array.isArray(e)?r:function(){return new Error("Invalid argument supplied to oneOf, expected an instance of array.")})}function createObjectOfTypeChecker(e){function r(r,n,t,a,o){if("function"!=typeof e)return new Error("Property `"+o+"` of component `"+t+"` has invalid PropType notation inside objectOf.");var i=r[n],c=getPropType(i);if("object"!==c){var u=ReactPropTypeLocationNames[a];return new Error("Invalid "+u+" `"+o+"` of type "+("`"+c+"` supplied to `"+t+"`, expected an object."))}for(var p in i)if(i.hasOwnProperty(p)){var y=e(i,p,t,a,o+"."+p);if(y instanceof Error)return y}return null}return createChainableTypeChecker(r)}function createUnionTypeChecker(e){function r(r,n,t,a,o){for(var i=0;i<e.length;i++){var c=e[i];if(null==c(r,n,t,a,o))return null}var u=ReactPropTypeLocationNames[a];return new Error("Invalid "+u+" `"+o+"` supplied to "+("`"+t+"`."))}return createChainableTypeChecker(Array.isArray(e)?r:function(){return new Error("Invalid argument supplied to oneOfType, expected an instance of array.")})}function createNodeChecker(){function e(e,r,n,t,a){if(!isNode(e[r])){var o=ReactPropTypeLocationNames[t];return new Error("Invalid "+o+" `"+a+"` supplied to "+("`"+n+"`, expected a ReactNode."))}return null}return createChainableTypeChecker(e)}function createShapeTypeChecker(e){function r(r,n,t,a,o){var i=r[n],c=getPropType(i);if("object"!==c){var u=ReactPropTypeLocationNames[a];return new Error("Invalid "+u+" `"+o+"` of type `"+c+"` "+("supplied to `"+t+"`, expected `object`."))}for(var p in e){var y=e[p];if(y){var f=y(i,p,t,a,o+"."+p);if(f)return f}}return null}return createChainableTypeChecker(r)}function isNode(e){switch(typeof e){case"number":case"string":case"undefined":return!0;case"boolean":return!e;case"object":if(Array.isArray(e))return e.every(isNode);if(null===e||ReactElement.isValidElement(e))return!0;var r=getIteratorFn(e);if(!r)return!1;var n,t=r.call(e);if(r!==e.entries){for(;!(n=t.next()).done;)if(!isNode(n.value))return!1}else for(;!(n=t.next()).done;){var a=n.value;if(a&&!isNode(a[1]))return!1}return!0;default:return!1}}function isSymbol(e,r){return"symbol"===e||("Symbol"===r["@@toStringTag"]||"function"==typeof Symbol&&r instanceof Symbol)}function getPropType(e){var r=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":isSymbol(r,e)?"symbol":r}function getPreciseType(e){var r=getPropType(e);if("object"===r){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return r}function getClassName(e){return e.constructor&&e.constructor.name?e.constructor.name:ANONYMOUS}var ReactElement=require("./ReactElement"),ReactPropTypeLocationNames=require("./ReactPropTypeLocationNames"),emptyFunction=require("fbjs/lib/emptyFunction"),getIteratorFn=require("./getIteratorFn"),ANONYMOUS="<<anonymous>>",ReactPropTypes={array:createPrimitiveTypeChecker("array"),bool:createPrimitiveTypeChecker("boolean"),func:createPrimitiveTypeChecker("function"),number:createPrimitiveTypeChecker("number"),object:createPrimitiveTypeChecker("object"),string:createPrimitiveTypeChecker("string"),symbol:createPrimitiveTypeChecker("symbol"),any:createAnyTypeChecker(),arrayOf:createArrayOfTypeChecker,element:createElementTypeChecker(),instanceOf:createInstanceTypeChecker,node:createNodeChecker(),objectOf:createObjectOfTypeChecker,oneOf:createEnumTypeChecker,oneOfType:createUnionTypeChecker,shape:createShapeTypeChecker};module.exports=ReactPropTypes; -},{"./ReactElement":135,"./ReactPropTypeLocationNames":154,"./getIteratorFn":195,"fbjs/lib/emptyFunction":218}],157:[function(require,module,exports){ -"use strict";function ReactReconcileTransaction(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=CallbackQueue.getPooled(null),this.useCreateElement=e}var _assign=require("object-assign"),CallbackQueue=require("./CallbackQueue"),PooledClass=require("./PooledClass"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactInputSelection=require("./ReactInputSelection"),Transaction=require("./Transaction"),SELECTION_RESTORATION={initialize:ReactInputSelection.getSelectionInformation,close:ReactInputSelection.restoreSelection},EVENT_SUPPRESSION={initialize:function(){var e=ReactBrowserEventEmitter.isEnabled();return ReactBrowserEventEmitter.setEnabled(!1),e},close:function(e){ReactBrowserEventEmitter.setEnabled(e)}},ON_DOM_READY_QUEUEING={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},TRANSACTION_WRAPPERS=[SELECTION_RESTORATION,EVENT_SUPPRESSION,ON_DOM_READY_QUEUEING],Mixin={getTransactionWrappers:function(){return TRANSACTION_WRAPPERS},getReactMountReady:function(){return this.reactMountReady},checkpoint:function(){return this.reactMountReady.checkpoint()},rollback:function(e){this.reactMountReady.rollback(e)},destructor:function(){CallbackQueue.release(this.reactMountReady),this.reactMountReady=null}};_assign(ReactReconcileTransaction.prototype,Transaction.Mixin,Mixin),PooledClass.addPoolingTo(ReactReconcileTransaction),module.exports=ReactReconcileTransaction; +},{"./ReactElement":131,"./ReactPropTypeLocationNames":149,"./getIteratorFn":193,"fbjs/lib/emptyFunction":216}],152:[function(require,module,exports){ +"use strict";function ReactReconcileTransaction(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=CallbackQueue.getPooled(null),this.useCreateElement=e}var _assign=require("object-assign"),CallbackQueue=require("./CallbackQueue"),PooledClass=require("./PooledClass"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactInputSelection=require("./ReactInputSelection"),ReactInstrumentation=require("./ReactInstrumentation"),Transaction=require("./Transaction"),ReactUpdateQueue=require("./ReactUpdateQueue"),SELECTION_RESTORATION={initialize:ReactInputSelection.getSelectionInformation,close:ReactInputSelection.restoreSelection},EVENT_SUPPRESSION={initialize:function(){var e=ReactBrowserEventEmitter.isEnabled();return ReactBrowserEventEmitter.setEnabled(!1),e},close:function(e){ReactBrowserEventEmitter.setEnabled(e)}},ON_DOM_READY_QUEUEING={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},TRANSACTION_WRAPPERS=[SELECTION_RESTORATION,EVENT_SUPPRESSION,ON_DOM_READY_QUEUEING],Mixin={getTransactionWrappers:function(){return TRANSACTION_WRAPPERS},getReactMountReady:function(){return this.reactMountReady},getUpdateQueue:function(){return ReactUpdateQueue},checkpoint:function(){return this.reactMountReady.checkpoint()},rollback:function(e){this.reactMountReady.rollback(e)},destructor:function(){CallbackQueue.release(this.reactMountReady),this.reactMountReady=null}};_assign(ReactReconcileTransaction.prototype,Transaction.Mixin,Mixin),PooledClass.addPoolingTo(ReactReconcileTransaction),module.exports=ReactReconcileTransaction; -},{"./CallbackQueue":81,"./PooledClass":101,"./ReactBrowserEventEmitter":103,"./ReactInputSelection":143,"./Transaction":180,"object-assign":32}],158:[function(require,module,exports){ -"use strict";function attachRefs(){ReactRef.attachRefs(this,this._currentElement)}var ReactRef=require("./ReactRef"),ReactInstrumentation=require("./ReactInstrumentation"),invariant=require("fbjs/lib/invariant"),ReactReconciler={mountComponent:function(e,t,n,r,a){var u=e.mountComponent(t,n,r,a);return e._currentElement&&null!=e._currentElement.ref&&t.getReactMountReady().enqueue(attachRefs,e),u},getNativeNode:function(e){return e.getNativeNode()},unmountComponent:function(e,t){ReactRef.detachRefs(e,e._currentElement),e.unmountComponent(t)},receiveComponent:function(e,t,n,r){var a=e._currentElement;if(t!==a||r!==e._context){var u=ReactRef.shouldUpdateRefs(a,t);u&&ReactRef.detachRefs(e,a),e.receiveComponent(t,n,r),u&&e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(attachRefs,e)}},performUpdateIfNecessary:function(e,t,n){return e._updateBatchNumber!==n?void(null!=e._updateBatchNumber&&e._updateBatchNumber!==n+1?invariant(!1):void 0):void e.performUpdateIfNecessary(t)}};module.exports=ReactReconciler; +},{"./CallbackQueue":80,"./PooledClass":100,"./ReactBrowserEventEmitter":102,"./ReactInputSelection":139,"./ReactInstrumentation":141,"./ReactUpdateQueue":157,"./Transaction":176,"object-assign":31}],153:[function(require,module,exports){ +"use strict";function attachRefs(){ReactRef.attachRefs(this,this._currentElement)}var _prodInvariant=require("./reactProdInvariant"),ReactRef=require("./ReactRef"),ReactInstrumentation=require("./ReactInstrumentation"),invariant=require("fbjs/lib/invariant"),ReactReconciler={mountComponent:function(e,t,n,r,a){var u=e.mountComponent(t,n,r,a);return e._currentElement&&null!=e._currentElement.ref&&t.getReactMountReady().enqueue(attachRefs,e),u},getHostNode:function(e){return e.getHostNode()},unmountComponent:function(e,t){ReactRef.detachRefs(e,e._currentElement),e.unmountComponent(t)},receiveComponent:function(e,t,n,r){var a=e._currentElement;if(t!==a||r!==e._context){var u=ReactRef.shouldUpdateRefs(a,t);u&&ReactRef.detachRefs(e,a),e.receiveComponent(t,n,r),u&&e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(attachRefs,e)}},performUpdateIfNecessary:function(e,t,n){return e._updateBatchNumber!==n?void(null!=e._updateBatchNumber&&e._updateBatchNumber!==n+1?_prodInvariant("121",n,e._updateBatchNumber):void 0):void e.performUpdateIfNecessary(t)}};module.exports=ReactReconciler; -},{"./ReactInstrumentation":145,"./ReactRef":159,"fbjs/lib/invariant":226}],159:[function(require,module,exports){ +},{"./ReactInstrumentation":141,"./ReactRef":154,"./reactProdInvariant":202,"fbjs/lib/invariant":224}],154:[function(require,module,exports){ "use strict";function attachRef(e,n,t){"function"==typeof e?e(n.getPublicInstance()):ReactOwner.addComponentAsRefTo(n,e,t)}function detachRef(e,n,t){"function"==typeof e?e(null):ReactOwner.removeComponentAsRefFrom(n,e,t)}var ReactOwner=require("./ReactOwner"),ReactRef={};ReactRef.attachRefs=function(e,n){if(null!==n&&n!==!1){var t=n.ref;null!=t&&attachRef(t,e,n._owner)}},ReactRef.shouldUpdateRefs=function(e,n){var t=null===e||e===!1,f=null===n||n===!1;return t||f||n._owner!==e._owner||n.ref!==e.ref},ReactRef.detachRefs=function(e,n){if(null!==n&&n!==!1){var t=n.ref;null!=t&&detachRef(t,e,n._owner)}},module.exports=ReactRef; -},{"./ReactOwner":153}],160:[function(require,module,exports){ -"use strict";function ReactServerRenderingTransaction(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.useCreateElement=!1}var _assign=require("object-assign"),PooledClass=require("./PooledClass"),Transaction=require("./Transaction"),TRANSACTION_WRAPPERS=[],noopCallbackQueue={enqueue:function(){}},Mixin={getTransactionWrappers:function(){return TRANSACTION_WRAPPERS},getReactMountReady:function(){return noopCallbackQueue},destructor:function(){},checkpoint:function(){},rollback:function(){}};_assign(ReactServerRenderingTransaction.prototype,Transaction.Mixin,Mixin),PooledClass.addPoolingTo(ReactServerRenderingTransaction),module.exports=ReactServerRenderingTransaction; +},{"./ReactOwner":148}],155:[function(require,module,exports){ +"use strict";function ReactServerRenderingTransaction(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.useCreateElement=!1,this.updateQueue=new ReactServerUpdateQueue(this)}var _assign=require("object-assign"),PooledClass=require("./PooledClass"),Transaction=require("./Transaction"),ReactInstrumentation=require("./ReactInstrumentation"),ReactServerUpdateQueue=require("./ReactServerUpdateQueue"),TRANSACTION_WRAPPERS=[],noopCallbackQueue={enqueue:function(){}},Mixin={getTransactionWrappers:function(){return TRANSACTION_WRAPPERS},getReactMountReady:function(){return noopCallbackQueue},getUpdateQueue:function(){return this.updateQueue},destructor:function(){},checkpoint:function(){},rollback:function(){}};_assign(ReactServerRenderingTransaction.prototype,Transaction.Mixin,Mixin),PooledClass.addPoolingTo(ReactServerRenderingTransaction),module.exports=ReactServerRenderingTransaction; -},{"./PooledClass":101,"./Transaction":180,"object-assign":32}],161:[function(require,module,exports){ -"use strict";function enqueueUpdate(e){ReactUpdates.enqueueUpdate(e)}function formatUnexpectedArgument(e){var n=typeof e;if("object"!==n)return n;var t=e.constructor&&e.constructor.name||n,a=Object.keys(e);return a.length>0&&a.length<20?t+" (keys: "+a.join(", ")+")":t}function getInternalInstanceReadyForUpdate(e,n){var t=ReactInstanceMap.get(e);return t?t:null}var ReactCurrentOwner=require("./ReactCurrentOwner"),ReactInstanceMap=require("./ReactInstanceMap"),ReactUpdates=require("./ReactUpdates"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),ReactUpdateQueue={isMounted:function(e){var n=ReactInstanceMap.get(e);return!!n&&!!n._renderedComponent},enqueueCallback:function(e,n,t){ReactUpdateQueue.validateCallback(n,t);var a=getInternalInstanceReadyForUpdate(e);return a?(a._pendingCallbacks?a._pendingCallbacks.push(n):a._pendingCallbacks=[n],void enqueueUpdate(a)):null},enqueueCallbackInternal:function(e,n){e._pendingCallbacks?e._pendingCallbacks.push(n):e._pendingCallbacks=[n],enqueueUpdate(e)},enqueueForceUpdate:function(e){var n=getInternalInstanceReadyForUpdate(e,"forceUpdate");n&&(n._pendingForceUpdate=!0,enqueueUpdate(n))},enqueueReplaceState:function(e,n){var t=getInternalInstanceReadyForUpdate(e,"replaceState");t&&(t._pendingStateQueue=[n],t._pendingReplaceState=!0,enqueueUpdate(t))},enqueueSetState:function(e,n){var t=getInternalInstanceReadyForUpdate(e,"setState");if(t){var a=t._pendingStateQueue||(t._pendingStateQueue=[]);a.push(n),enqueueUpdate(t)}},enqueueElementInternal:function(e,n){e._pendingElement=n,enqueueUpdate(e)},validateCallback:function(e,n){e&&"function"!=typeof e?invariant(!1):void 0}};module.exports=ReactUpdateQueue; +},{"./PooledClass":100,"./ReactInstrumentation":141,"./ReactServerUpdateQueue":156,"./Transaction":176,"object-assign":31}],156:[function(require,module,exports){ +"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function warnNoop(e,t){}var ReactUpdateQueue=require("./ReactUpdateQueue"),Transaction=require("./Transaction"),warning=require("fbjs/lib/warning"),ReactServerUpdateQueue=function(){function e(t){_classCallCheck(this,e),this.transaction=t}return e.prototype.isMounted=function(e){return!1},e.prototype.enqueueCallback=function(e,t,a){this.transaction.isInTransaction()&&ReactUpdateQueue.enqueueCallback(e,t,a)},e.prototype.enqueueForceUpdate=function(e){this.transaction.isInTransaction()?ReactUpdateQueue.enqueueForceUpdate(e):warnNoop(e,"forceUpdate")},e.prototype.enqueueReplaceState=function(e,t){this.transaction.isInTransaction()?ReactUpdateQueue.enqueueReplaceState(e,t):warnNoop(e,"replaceState")},e.prototype.enqueueSetState=function(e,t){this.transaction.isInTransaction()?ReactUpdateQueue.enqueueSetState(e,t):warnNoop(e,"setState")},e}();module.exports=ReactServerUpdateQueue; -},{"./ReactCurrentOwner":111,"./ReactInstanceMap":144,"./ReactUpdates":162,"fbjs/lib/invariant":226,"fbjs/lib/warning":236}],162:[function(require,module,exports){ -"use strict";function ensureInjected(){ReactUpdates.ReactReconcileTransaction&&batchingStrategy?void 0:invariant(!1)}function ReactUpdatesFlushTransaction(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=CallbackQueue.getPooled(),this.reconcileTransaction=ReactUpdates.ReactReconcileTransaction.getPooled(!0)}function batchedUpdates(e,t,a,n,i,c){ensureInjected(),batchingStrategy.batchedUpdates(e,t,a,n,i,c)}function mountOrderComparator(e,t){return e._mountOrder-t._mountOrder}function runBatchedUpdates(e){var t=e.dirtyComponentsLength;t!==dirtyComponents.length?invariant(!1):void 0,dirtyComponents.sort(mountOrderComparator),updateBatchNumber++;for(var a=0;a<t;a++){var n=dirtyComponents[a],i=n._pendingCallbacks;n._pendingCallbacks=null;var c;if(ReactFeatureFlags.logTopLevelRenders){var r=n;n._currentElement.props===n._renderedComponent._currentElement&&(r=n._renderedComponent),c="React update: "+r.getName(),console.time(c)}if(ReactReconciler.performUpdateIfNecessary(n,e.reconcileTransaction,updateBatchNumber),c&&console.timeEnd(c),i)for(var o=0;o<i.length;o++)e.callbackQueue.enqueue(i[o],n.getPublicInstance())}}function enqueueUpdate(e){return ensureInjected(),batchingStrategy.isBatchingUpdates?(dirtyComponents.push(e),void(null==e._updateBatchNumber&&(e._updateBatchNumber=updateBatchNumber+1))):void batchingStrategy.batchedUpdates(enqueueUpdate,e)}function asap(e,t){batchingStrategy.isBatchingUpdates?void 0:invariant(!1),asapCallbackQueue.enqueue(e,t),asapEnqueued=!0}var _assign=require("object-assign"),CallbackQueue=require("./CallbackQueue"),PooledClass=require("./PooledClass"),ReactFeatureFlags=require("./ReactFeatureFlags"),ReactInstrumentation=require("./ReactInstrumentation"),ReactReconciler=require("./ReactReconciler"),Transaction=require("./Transaction"),invariant=require("fbjs/lib/invariant"),dirtyComponents=[],updateBatchNumber=0,asapCallbackQueue=CallbackQueue.getPooled(),asapEnqueued=!1,batchingStrategy=null,NESTED_UPDATES={initialize:function(){this.dirtyComponentsLength=dirtyComponents.length},close:function(){this.dirtyComponentsLength!==dirtyComponents.length?(dirtyComponents.splice(0,this.dirtyComponentsLength),flushBatchedUpdates()):dirtyComponents.length=0}},UPDATE_QUEUEING={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},TRANSACTION_WRAPPERS=[NESTED_UPDATES,UPDATE_QUEUEING];_assign(ReactUpdatesFlushTransaction.prototype,Transaction.Mixin,{getTransactionWrappers:function(){return TRANSACTION_WRAPPERS},destructor:function(){this.dirtyComponentsLength=null,CallbackQueue.release(this.callbackQueue),this.callbackQueue=null,ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,a){return Transaction.Mixin.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,a)}}),PooledClass.addPoolingTo(ReactUpdatesFlushTransaction);var flushBatchedUpdates=function(){for(;dirtyComponents.length||asapEnqueued;){if(dirtyComponents.length){var e=ReactUpdatesFlushTransaction.getPooled();e.perform(runBatchedUpdates,null,e),ReactUpdatesFlushTransaction.release(e)}if(asapEnqueued){asapEnqueued=!1;var t=asapCallbackQueue;asapCallbackQueue=CallbackQueue.getPooled(),t.notifyAll(),CallbackQueue.release(t)}}},ReactUpdatesInjection={injectReconcileTransaction:function(e){e?void 0:invariant(!1),ReactUpdates.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){e?void 0:invariant(!1),"function"!=typeof e.batchedUpdates?invariant(!1):void 0,"boolean"!=typeof e.isBatchingUpdates?invariant(!1):void 0,batchingStrategy=e}},ReactUpdates={ReactReconcileTransaction:null,batchedUpdates:batchedUpdates,enqueueUpdate:enqueueUpdate,flushBatchedUpdates:flushBatchedUpdates,injection:ReactUpdatesInjection,asap:asap};module.exports=ReactUpdates; +},{"./ReactUpdateQueue":157,"./Transaction":176,"fbjs/lib/warning":232}],157:[function(require,module,exports){ +"use strict";function enqueueUpdate(e){ReactUpdates.enqueueUpdate(e)}function formatUnexpectedArgument(e){var n=typeof e;if("object"!==n)return n;var t=e.constructor&&e.constructor.name||n,a=Object.keys(e);return a.length>0&&a.length<20?t+" (keys: "+a.join(", ")+")":t}function getInternalInstanceReadyForUpdate(e,n){var t=ReactInstanceMap.get(e);return t?t:null}var _prodInvariant=require("./reactProdInvariant"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactInstanceMap=require("./ReactInstanceMap"),ReactInstrumentation=require("./ReactInstrumentation"),ReactUpdates=require("./ReactUpdates"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),ReactUpdateQueue={isMounted:function(e){var n=ReactInstanceMap.get(e);return!!n&&!!n._renderedComponent},enqueueCallback:function(e,n,t){ReactUpdateQueue.validateCallback(n,t);var a=getInternalInstanceReadyForUpdate(e);return a?(a._pendingCallbacks?a._pendingCallbacks.push(n):a._pendingCallbacks=[n],void enqueueUpdate(a)):null},enqueueCallbackInternal:function(e,n){e._pendingCallbacks?e._pendingCallbacks.push(n):e._pendingCallbacks=[n],enqueueUpdate(e)},enqueueForceUpdate:function(e){var n=getInternalInstanceReadyForUpdate(e,"forceUpdate");n&&(n._pendingForceUpdate=!0,enqueueUpdate(n))},enqueueReplaceState:function(e,n){var t=getInternalInstanceReadyForUpdate(e,"replaceState");t&&(t._pendingStateQueue=[n],t._pendingReplaceState=!0,enqueueUpdate(t))},enqueueSetState:function(e,n){var t=getInternalInstanceReadyForUpdate(e,"setState");if(t){var a=t._pendingStateQueue||(t._pendingStateQueue=[]);a.push(n),enqueueUpdate(t)}},enqueueElementInternal:function(e,n,t){e._pendingElement=n,e._context=t,enqueueUpdate(e)},validateCallback:function(e,n){e&&"function"!=typeof e?_prodInvariant("122",n,formatUnexpectedArgument(e)):void 0}};module.exports=ReactUpdateQueue; -},{"./CallbackQueue":81,"./PooledClass":101,"./ReactFeatureFlags":141,"./ReactInstrumentation":145,"./ReactReconciler":158,"./Transaction":180,"fbjs/lib/invariant":226,"object-assign":32}],163:[function(require,module,exports){ -"use strict";module.exports="15.1.0"; +},{"./ReactCurrentOwner":110,"./ReactInstanceMap":140,"./ReactInstrumentation":141,"./ReactUpdates":158,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232}],158:[function(require,module,exports){ +"use strict";function ensureInjected(){ReactUpdates.ReactReconcileTransaction&&batchingStrategy?void 0:_prodInvariant("123")}function ReactUpdatesFlushTransaction(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=CallbackQueue.getPooled(),this.reconcileTransaction=ReactUpdates.ReactReconcileTransaction.getPooled(!0)}function batchedUpdates(e,t,a,n,r,i){ensureInjected(),batchingStrategy.batchedUpdates(e,t,a,n,r,i)}function mountOrderComparator(e,t){return e._mountOrder-t._mountOrder}function runBatchedUpdates(e){var t=e.dirtyComponentsLength;t!==dirtyComponents.length?_prodInvariant("124",t,dirtyComponents.length):void 0,dirtyComponents.sort(mountOrderComparator),updateBatchNumber++;for(var a=0;a<t;a++){var n=dirtyComponents[a],r=n._pendingCallbacks;n._pendingCallbacks=null;var i;if(ReactFeatureFlags.logTopLevelRenders){var o=n;n._currentElement.props===n._renderedComponent._currentElement&&(o=n._renderedComponent),i="React update: "+o.getName(),console.time(i)}if(ReactReconciler.performUpdateIfNecessary(n,e.reconcileTransaction,updateBatchNumber),i&&console.timeEnd(i),r)for(var c=0;c<r.length;c++)e.callbackQueue.enqueue(r[c],n.getPublicInstance())}}function enqueueUpdate(e){return ensureInjected(),batchingStrategy.isBatchingUpdates?(dirtyComponents.push(e),void(null==e._updateBatchNumber&&(e._updateBatchNumber=updateBatchNumber+1))):void batchingStrategy.batchedUpdates(enqueueUpdate,e)}function asap(e,t){batchingStrategy.isBatchingUpdates?void 0:_prodInvariant("125"),asapCallbackQueue.enqueue(e,t),asapEnqueued=!0}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),CallbackQueue=require("./CallbackQueue"),PooledClass=require("./PooledClass"),ReactFeatureFlags=require("./ReactFeatureFlags"),ReactReconciler=require("./ReactReconciler"),Transaction=require("./Transaction"),invariant=require("fbjs/lib/invariant"),dirtyComponents=[],updateBatchNumber=0,asapCallbackQueue=CallbackQueue.getPooled(),asapEnqueued=!1,batchingStrategy=null,NESTED_UPDATES={initialize:function(){this.dirtyComponentsLength=dirtyComponents.length},close:function(){this.dirtyComponentsLength!==dirtyComponents.length?(dirtyComponents.splice(0,this.dirtyComponentsLength),flushBatchedUpdates()):dirtyComponents.length=0}},UPDATE_QUEUEING={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},TRANSACTION_WRAPPERS=[NESTED_UPDATES,UPDATE_QUEUEING];_assign(ReactUpdatesFlushTransaction.prototype,Transaction.Mixin,{getTransactionWrappers:function(){return TRANSACTION_WRAPPERS},destructor:function(){this.dirtyComponentsLength=null,CallbackQueue.release(this.callbackQueue),this.callbackQueue=null,ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,a){return Transaction.Mixin.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,a)}}),PooledClass.addPoolingTo(ReactUpdatesFlushTransaction);var flushBatchedUpdates=function(){for(;dirtyComponents.length||asapEnqueued;){if(dirtyComponents.length){var e=ReactUpdatesFlushTransaction.getPooled();e.perform(runBatchedUpdates,null,e),ReactUpdatesFlushTransaction.release(e)}if(asapEnqueued){asapEnqueued=!1;var t=asapCallbackQueue;asapCallbackQueue=CallbackQueue.getPooled(),t.notifyAll(),CallbackQueue.release(t)}}},ReactUpdatesInjection={injectReconcileTransaction:function(e){e?void 0:_prodInvariant("126"),ReactUpdates.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){e?void 0:_prodInvariant("127"),"function"!=typeof e.batchedUpdates?_prodInvariant("128"):void 0,"boolean"!=typeof e.isBatchingUpdates?_prodInvariant("129"):void 0,batchingStrategy=e}},ReactUpdates={ReactReconcileTransaction:null,batchedUpdates:batchedUpdates,enqueueUpdate:enqueueUpdate,flushBatchedUpdates:flushBatchedUpdates,injection:ReactUpdatesInjection,asap:asap};module.exports=ReactUpdates; -},{}],164:[function(require,module,exports){ -"use strict";var NS={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace"},ATTRS={accentHeight:"accent-height",accumulate:0,additive:0,alignmentBaseline:"alignment-baseline",allowReorder:"allowReorder",alphabetic:0,amplitude:0,arabicForm:"arabic-form",ascent:0,attributeName:"attributeName",attributeType:"attributeType",autoReverse:"autoReverse",azimuth:0,baseFrequency:"baseFrequency",baseProfile:"baseProfile",baselineShift:"baseline-shift",bbox:0,begin:0,bias:0,by:0,calcMode:"calcMode",capHeight:"cap-height",clip:0,clipPath:"clip-path",clipRule:"clip-rule",clipPathUnits:"clipPathUnits",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",colorProfile:"color-profile",colorRendering:"color-rendering",contentScriptType:"contentScriptType",contentStyleType:"contentStyleType",cursor:0,cx:0,cy:0,d:0,decelerate:0,descent:0,diffuseConstant:"diffuseConstant",direction:0,display:0,divisor:0,dominantBaseline:"dominant-baseline",dur:0,dx:0,dy:0,edgeMode:"edgeMode",elevation:0,enableBackground:"enable-background",end:0,exponent:0,externalResourcesRequired:"externalResourcesRequired",fill:0,fillOpacity:"fill-opacity",fillRule:"fill-rule",filter:0,filterRes:"filterRes",filterUnits:"filterUnits",floodColor:"flood-color",floodOpacity:"flood-opacity",focusable:0,fontFamily:"font-family",fontSize:"font-size",fontSizeAdjust:"font-size-adjust",fontStretch:"font-stretch",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",format:0,from:0,fx:0,fy:0,g1:0,g2:0,glyphName:"glyph-name",glyphOrientationHorizontal:"glyph-orientation-horizontal",glyphOrientationVertical:"glyph-orientation-vertical",glyphRef:"glyphRef",gradientTransform:"gradientTransform",gradientUnits:"gradientUnits",hanging:0,horizAdvX:"horiz-adv-x",horizOriginX:"horiz-origin-x",ideographic:0,imageRendering:"image-rendering","in":0,in2:0,intercept:0,k:0,k1:0,k2:0,k3:0,k4:0,kernelMatrix:"kernelMatrix",kernelUnitLength:"kernelUnitLength",kerning:0,keyPoints:"keyPoints",keySplines:"keySplines",keyTimes:"keyTimes",lengthAdjust:"lengthAdjust",letterSpacing:"letter-spacing",lightingColor:"lighting-color",limitingConeAngle:"limitingConeAngle",local:0,markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",markerHeight:"markerHeight",markerUnits:"markerUnits",markerWidth:"markerWidth",mask:0,maskContentUnits:"maskContentUnits",maskUnits:"maskUnits",mathematical:0,mode:0,numOctaves:"numOctaves",offset:0,opacity:0,operator:0,order:0,orient:0,orientation:0,origin:0,overflow:0,overlinePosition:"overline-position",overlineThickness:"overline-thickness",paintOrder:"paint-order",panose1:"panose-1",pathLength:"pathLength",patternContentUnits:"patternContentUnits",patternTransform:"patternTransform",patternUnits:"patternUnits",pointerEvents:"pointer-events",points:0,pointsAtX:"pointsAtX",pointsAtY:"pointsAtY",pointsAtZ:"pointsAtZ",preserveAlpha:"preserveAlpha",preserveAspectRatio:"preserveAspectRatio",primitiveUnits:"primitiveUnits",r:0,radius:0,refX:"refX",refY:"refY",renderingIntent:"rendering-intent",repeatCount:"repeatCount",repeatDur:"repeatDur",requiredExtensions:"requiredExtensions",requiredFeatures:"requiredFeatures",restart:0,result:0,rotate:0,rx:0,ry:0,scale:0,seed:0,shapeRendering:"shape-rendering",slope:0,spacing:0,specularConstant:"specularConstant",specularExponent:"specularExponent",speed:0,spreadMethod:"spreadMethod",startOffset:"startOffset",stdDeviation:"stdDeviation",stemh:0,stemv:0,stitchTiles:"stitchTiles",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",string:0,stroke:0,strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeMiterlimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",surfaceScale:"surfaceScale",systemLanguage:"systemLanguage",tableValues:"tableValues",targetX:"targetX",targetY:"targetY",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",textLength:"textLength",to:0,transform:0,u1:0,u2:0,underlinePosition:"underline-position",underlineThickness:"underline-thickness",unicode:0,unicodeBidi:"unicode-bidi",unicodeRange:"unicode-range",unitsPerEm:"units-per-em",vAlphabetic:"v-alphabetic",vHanging:"v-hanging",vIdeographic:"v-ideographic",vMathematical:"v-mathematical",values:0,vectorEffect:"vector-effect",version:0,vertAdvY:"vert-adv-y",vertOriginX:"vert-origin-x",vertOriginY:"vert-origin-y",viewBox:"viewBox",viewTarget:"viewTarget",visibility:0,widths:0,wordSpacing:"word-spacing",writingMode:"writing-mode",x:0,xHeight:"x-height",x1:0,x2:0,xChannelSelector:"xChannelSelector",xlinkActuate:"xlink:actuate",xlinkArcrole:"xlink:arcrole",xlinkHref:"xlink:href",xlinkRole:"xlink:role",xlinkShow:"xlink:show",xlinkTitle:"xlink:title",xlinkType:"xlink:type",xmlBase:"xml:base",xmlLang:"xml:lang",xmlSpace:"xml:space",y:0,y1:0,y2:0,yChannelSelector:"yChannelSelector",z:0,zoomAndPan:"zoomAndPan"},SVGDOMPropertyConfig={Properties:{},DOMAttributeNamespaces:{xlinkActuate:NS.xlink,xlinkArcrole:NS.xlink,xlinkHref:NS.xlink,xlinkRole:NS.xlink,xlinkShow:NS.xlink,xlinkTitle:NS.xlink,xlinkType:NS.xlink,xmlBase:NS.xml,xmlLang:NS.xml,xmlSpace:NS.xml},DOMAttributeNames:{}};Object.keys(ATTRS).forEach(function(e){SVGDOMPropertyConfig.Properties[e]=0,ATTRS[e]&&(SVGDOMPropertyConfig.DOMAttributeNames[e]=ATTRS[e])}),module.exports=SVGDOMPropertyConfig; +},{"./CallbackQueue":80,"./PooledClass":100,"./ReactFeatureFlags":136,"./ReactReconciler":153,"./Transaction":176,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"object-assign":31}],159:[function(require,module,exports){ +"use strict";module.exports="15.2.1"; -},{}],165:[function(require,module,exports){ +},{}],160:[function(require,module,exports){ +"use strict";var NS={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace"},ATTRS={accentHeight:"accent-height",accumulate:0,additive:0,alignmentBaseline:"alignment-baseline",allowReorder:"allowReorder",alphabetic:0,amplitude:0,arabicForm:"arabic-form",ascent:0,attributeName:"attributeName",attributeType:"attributeType",autoReverse:"autoReverse",azimuth:0,baseFrequency:"baseFrequency",baseProfile:"baseProfile",baselineShift:"baseline-shift",bbox:0,begin:0,bias:0,by:0,calcMode:"calcMode",capHeight:"cap-height",clip:0,clipPath:"clip-path",clipRule:"clip-rule",clipPathUnits:"clipPathUnits",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",colorProfile:"color-profile",colorRendering:"color-rendering",contentScriptType:"contentScriptType",contentStyleType:"contentStyleType",cursor:0,cx:0,cy:0,d:0,decelerate:0,descent:0,diffuseConstant:"diffuseConstant",direction:0,display:0,divisor:0,dominantBaseline:"dominant-baseline",dur:0,dx:0,dy:0,edgeMode:"edgeMode",elevation:0,enableBackground:"enable-background",end:0,exponent:0,externalResourcesRequired:"externalResourcesRequired",fill:0,fillOpacity:"fill-opacity",fillRule:"fill-rule",filter:0,filterRes:"filterRes",filterUnits:"filterUnits",floodColor:"flood-color",floodOpacity:"flood-opacity",focusable:0,fontFamily:"font-family",fontSize:"font-size",fontSizeAdjust:"font-size-adjust",fontStretch:"font-stretch",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",format:0,from:0,fx:0,fy:0,g1:0,g2:0,glyphName:"glyph-name",glyphOrientationHorizontal:"glyph-orientation-horizontal",glyphOrientationVertical:"glyph-orientation-vertical",glyphRef:"glyphRef",gradientTransform:"gradientTransform",gradientUnits:"gradientUnits",hanging:0,horizAdvX:"horiz-adv-x",horizOriginX:"horiz-origin-x",ideographic:0,imageRendering:"image-rendering",in:0,in2:0,intercept:0,k:0,k1:0,k2:0,k3:0,k4:0,kernelMatrix:"kernelMatrix",kernelUnitLength:"kernelUnitLength",kerning:0,keyPoints:"keyPoints",keySplines:"keySplines",keyTimes:"keyTimes",lengthAdjust:"lengthAdjust",letterSpacing:"letter-spacing",lightingColor:"lighting-color",limitingConeAngle:"limitingConeAngle",local:0,markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",markerHeight:"markerHeight",markerUnits:"markerUnits",markerWidth:"markerWidth",mask:0,maskContentUnits:"maskContentUnits",maskUnits:"maskUnits",mathematical:0,mode:0,numOctaves:"numOctaves",offset:0,opacity:0,operator:0,order:0,orient:0,orientation:0,origin:0,overflow:0,overlinePosition:"overline-position",overlineThickness:"overline-thickness",paintOrder:"paint-order",panose1:"panose-1",pathLength:"pathLength",patternContentUnits:"patternContentUnits",patternTransform:"patternTransform",patternUnits:"patternUnits",pointerEvents:"pointer-events",points:0,pointsAtX:"pointsAtX",pointsAtY:"pointsAtY",pointsAtZ:"pointsAtZ",preserveAlpha:"preserveAlpha",preserveAspectRatio:"preserveAspectRatio",primitiveUnits:"primitiveUnits",r:0,radius:0,refX:"refX",refY:"refY",renderingIntent:"rendering-intent",repeatCount:"repeatCount",repeatDur:"repeatDur",requiredExtensions:"requiredExtensions",requiredFeatures:"requiredFeatures",restart:0,result:0,rotate:0,rx:0,ry:0,scale:0,seed:0,shapeRendering:"shape-rendering",slope:0,spacing:0,specularConstant:"specularConstant",specularExponent:"specularExponent",speed:0,spreadMethod:"spreadMethod",startOffset:"startOffset",stdDeviation:"stdDeviation",stemh:0,stemv:0,stitchTiles:"stitchTiles",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",string:0,stroke:0,strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeMiterlimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",surfaceScale:"surfaceScale",systemLanguage:"systemLanguage",tableValues:"tableValues",targetX:"targetX",targetY:"targetY",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",textLength:"textLength",to:0,transform:0,u1:0,u2:0,underlinePosition:"underline-position",underlineThickness:"underline-thickness",unicode:0,unicodeBidi:"unicode-bidi",unicodeRange:"unicode-range",unitsPerEm:"units-per-em",vAlphabetic:"v-alphabetic",vHanging:"v-hanging",vIdeographic:"v-ideographic",vMathematical:"v-mathematical",values:0,vectorEffect:"vector-effect",version:0,vertAdvY:"vert-adv-y",vertOriginX:"vert-origin-x",vertOriginY:"vert-origin-y",viewBox:"viewBox",viewTarget:"viewTarget",visibility:0,widths:0,wordSpacing:"word-spacing",writingMode:"writing-mode",x:0,xHeight:"x-height",x1:0,x2:0,xChannelSelector:"xChannelSelector",xlinkActuate:"xlink:actuate",xlinkArcrole:"xlink:arcrole",xlinkHref:"xlink:href",xlinkRole:"xlink:role",xlinkShow:"xlink:show",xlinkTitle:"xlink:title",xlinkType:"xlink:type",xmlBase:"xml:base",xmlLang:"xml:lang",xmlSpace:"xml:space",y:0,y1:0,y2:0,yChannelSelector:"yChannelSelector",z:0,zoomAndPan:"zoomAndPan"},SVGDOMPropertyConfig={Properties:{},DOMAttributeNamespaces:{xlinkActuate:NS.xlink,xlinkArcrole:NS.xlink,xlinkHref:NS.xlink,xlinkRole:NS.xlink,xlinkShow:NS.xlink,xlinkTitle:NS.xlink,xlinkType:NS.xlink,xmlBase:NS.xml,xmlLang:NS.xml,xmlSpace:NS.xml},DOMAttributeNames:{}};Object.keys(ATTRS).forEach(function(e){SVGDOMPropertyConfig.Properties[e]=0,ATTRS[e]&&(SVGDOMPropertyConfig.DOMAttributeNames[e]=ATTRS[e])}),module.exports=SVGDOMPropertyConfig; + +},{}],161:[function(require,module,exports){ "use strict";function getSelection(e){if("selectionStart"in e&&ReactInputSelection.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}function constructSelectEvent(e,t){if(mouseDown||null==activeElement||activeElement!==getActiveElement())return null;var n=getSelection(activeElement);if(!lastSelection||!shallowEqual(lastSelection,n)){lastSelection=n;var o=SyntheticEvent.getPooled(eventTypes.select,activeElementInst,e,t);return o.type="select",o.target=activeElement,EventPropagators.accumulateTwoPhaseDispatches(o),o}return null}var EventConstants=require("./EventConstants"),EventPropagators=require("./EventPropagators"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactInputSelection=require("./ReactInputSelection"),SyntheticEvent=require("./SyntheticEvent"),getActiveElement=require("fbjs/lib/getActiveElement"),isTextInputElement=require("./isTextInputElement"),keyOf=require("fbjs/lib/keyOf"),shallowEqual=require("fbjs/lib/shallowEqual"),topLevelTypes=EventConstants.topLevelTypes,skipSelectionChangeEvent=ExecutionEnvironment.canUseDOM&&"documentMode"in document&&document.documentMode<=11,eventTypes={select:{phasedRegistrationNames:{bubbled:keyOf({onSelect:null}),captured:keyOf({onSelectCapture:null})},dependencies:[topLevelTypes.topBlur,topLevelTypes.topContextMenu,topLevelTypes.topFocus,topLevelTypes.topKeyDown,topLevelTypes.topMouseDown,topLevelTypes.topMouseUp,topLevelTypes.topSelectionChange]}},activeElement=null,activeElementInst=null,lastSelection=null,mouseDown=!1,hasListener=!1,ON_SELECT_KEY=keyOf({onSelect:null}),SelectEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,n,o){if(!hasListener)return null;var l=t?ReactDOMComponentTree.getNodeFromInstance(t):window;switch(e){case topLevelTypes.topFocus:(isTextInputElement(l)||"true"===l.contentEditable)&&(activeElement=l,activeElementInst=t,lastSelection=null);break;case topLevelTypes.topBlur:activeElement=null,activeElementInst=null,lastSelection=null;break;case topLevelTypes.topMouseDown:mouseDown=!0;break;case topLevelTypes.topContextMenu:case topLevelTypes.topMouseUp:return mouseDown=!1,constructSelectEvent(n,o);case topLevelTypes.topSelectionChange:if(skipSelectionChangeEvent)break;case topLevelTypes.topKeyDown:case topLevelTypes.topKeyUp:return constructSelectEvent(n,o)}return null},didPutListener:function(e,t,n){t===ON_SELECT_KEY&&(hasListener=!0)}};module.exports=SelectEventPlugin; -},{"./EventConstants":92,"./EventPropagators":96,"./ReactDOMComponentTree":116,"./ReactInputSelection":143,"./SyntheticEvent":171,"./isTextInputElement":202,"fbjs/lib/ExecutionEnvironment":212,"fbjs/lib/getActiveElement":221,"fbjs/lib/keyOf":230,"fbjs/lib/shallowEqual":235}],166:[function(require,module,exports){ -"use strict";var EventConstants=require("./EventConstants"),EventListener=require("fbjs/lib/EventListener"),EventPropagators=require("./EventPropagators"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),SyntheticAnimationEvent=require("./SyntheticAnimationEvent"),SyntheticClipboardEvent=require("./SyntheticClipboardEvent"),SyntheticEvent=require("./SyntheticEvent"),SyntheticFocusEvent=require("./SyntheticFocusEvent"),SyntheticKeyboardEvent=require("./SyntheticKeyboardEvent"),SyntheticMouseEvent=require("./SyntheticMouseEvent"),SyntheticDragEvent=require("./SyntheticDragEvent"),SyntheticTouchEvent=require("./SyntheticTouchEvent"),SyntheticTransitionEvent=require("./SyntheticTransitionEvent"),SyntheticUIEvent=require("./SyntheticUIEvent"),SyntheticWheelEvent=require("./SyntheticWheelEvent"),emptyFunction=require("fbjs/lib/emptyFunction"),getEventCharCode=require("./getEventCharCode"),invariant=require("fbjs/lib/invariant"),keyOf=require("fbjs/lib/keyOf"),topLevelTypes=EventConstants.topLevelTypes,eventTypes={abort:{phasedRegistrationNames:{bubbled:keyOf({onAbort:!0}),captured:keyOf({onAbortCapture:!0})}},animationEnd:{phasedRegistrationNames:{bubbled:keyOf({onAnimationEnd:!0}),captured:keyOf({onAnimationEndCapture:!0})}},animationIteration:{phasedRegistrationNames:{bubbled:keyOf({onAnimationIteration:!0}),captured:keyOf({onAnimationIterationCapture:!0})}},animationStart:{phasedRegistrationNames:{bubbled:keyOf({onAnimationStart:!0}),captured:keyOf({onAnimationStartCapture:!0})}},blur:{phasedRegistrationNames:{bubbled:keyOf({onBlur:!0}),captured:keyOf({onBlurCapture:!0})}},canPlay:{phasedRegistrationNames:{bubbled:keyOf({onCanPlay:!0}),captured:keyOf({onCanPlayCapture:!0})}},canPlayThrough:{phasedRegistrationNames:{bubbled:keyOf({onCanPlayThrough:!0}),captured:keyOf({onCanPlayThroughCapture:!0})}},click:{phasedRegistrationNames:{bubbled:keyOf({onClick:!0}),captured:keyOf({onClickCapture:!0})}},contextMenu:{phasedRegistrationNames:{bubbled:keyOf({onContextMenu:!0}),captured:keyOf({onContextMenuCapture:!0})}},copy:{phasedRegistrationNames:{bubbled:keyOf({onCopy:!0}),captured:keyOf({onCopyCapture:!0})}},cut:{phasedRegistrationNames:{bubbled:keyOf({onCut:!0}),captured:keyOf({onCutCapture:!0})}},doubleClick:{phasedRegistrationNames:{bubbled:keyOf({onDoubleClick:!0}),captured:keyOf({onDoubleClickCapture:!0})}},drag:{phasedRegistrationNames:{bubbled:keyOf({onDrag:!0}),captured:keyOf({onDragCapture:!0})}},dragEnd:{phasedRegistrationNames:{bubbled:keyOf({onDragEnd:!0}),captured:keyOf({onDragEndCapture:!0})}},dragEnter:{phasedRegistrationNames:{bubbled:keyOf({onDragEnter:!0}),captured:keyOf({onDragEnterCapture:!0})}},dragExit:{phasedRegistrationNames:{bubbled:keyOf({onDragExit:!0}),captured:keyOf({onDragExitCapture:!0})}},dragLeave:{phasedRegistrationNames:{bubbled:keyOf({onDragLeave:!0}),captured:keyOf({onDragLeaveCapture:!0})}},dragOver:{phasedRegistrationNames:{bubbled:keyOf({onDragOver:!0}),captured:keyOf({onDragOverCapture:!0})}},dragStart:{phasedRegistrationNames:{bubbled:keyOf({onDragStart:!0}),captured:keyOf({onDragStartCapture:!0})}},drop:{phasedRegistrationNames:{bubbled:keyOf({onDrop:!0}),captured:keyOf({onDropCapture:!0})}},durationChange:{phasedRegistrationNames:{bubbled:keyOf({onDurationChange:!0}),captured:keyOf({onDurationChangeCapture:!0})}},emptied:{phasedRegistrationNames:{bubbled:keyOf({onEmptied:!0}),captured:keyOf({onEmptiedCapture:!0})}},encrypted:{phasedRegistrationNames:{bubbled:keyOf({onEncrypted:!0}),captured:keyOf({onEncryptedCapture:!0})}},ended:{phasedRegistrationNames:{bubbled:keyOf({onEnded:!0}),captured:keyOf({onEndedCapture:!0})}},error:{phasedRegistrationNames:{bubbled:keyOf({onError:!0}),captured:keyOf({onErrorCapture:!0})}},focus:{phasedRegistrationNames:{bubbled:keyOf({onFocus:!0}),captured:keyOf({onFocusCapture:!0})}},input:{phasedRegistrationNames:{bubbled:keyOf({onInput:!0}),captured:keyOf({onInputCapture:!0})}},invalid:{phasedRegistrationNames:{bubbled:keyOf({onInvalid:!0}),captured:keyOf({onInvalidCapture:!0})}},keyDown:{phasedRegistrationNames:{bubbled:keyOf({onKeyDown:!0}),captured:keyOf({onKeyDownCapture:!0})}},keyPress:{phasedRegistrationNames:{bubbled:keyOf({onKeyPress:!0}),captured:keyOf({onKeyPressCapture:!0})}},keyUp:{phasedRegistrationNames:{bubbled:keyOf({onKeyUp:!0}),captured:keyOf({onKeyUpCapture:!0})}},load:{phasedRegistrationNames:{bubbled:keyOf({onLoad:!0}),captured:keyOf({onLoadCapture:!0})}},loadedData:{phasedRegistrationNames:{bubbled:keyOf({onLoadedData:!0}),captured:keyOf({onLoadedDataCapture:!0})}},loadedMetadata:{phasedRegistrationNames:{bubbled:keyOf({onLoadedMetadata:!0}),captured:keyOf({onLoadedMetadataCapture:!0})}},loadStart:{phasedRegistrationNames:{bubbled:keyOf({onLoadStart:!0}),captured:keyOf({onLoadStartCapture:!0})}},mouseDown:{phasedRegistrationNames:{bubbled:keyOf({onMouseDown:!0}),captured:keyOf({onMouseDownCapture:!0})}},mouseMove:{phasedRegistrationNames:{bubbled:keyOf({onMouseMove:!0}),captured:keyOf({onMouseMoveCapture:!0})}},mouseOut:{phasedRegistrationNames:{bubbled:keyOf({onMouseOut:!0}),captured:keyOf({onMouseOutCapture:!0})}},mouseOver:{phasedRegistrationNames:{bubbled:keyOf({onMouseOver:!0}),captured:keyOf({onMouseOverCapture:!0})}},mouseUp:{phasedRegistrationNames:{bubbled:keyOf({onMouseUp:!0}),captured:keyOf({onMouseUpCapture:!0})}},paste:{phasedRegistrationNames:{bubbled:keyOf({onPaste:!0}),captured:keyOf({onPasteCapture:!0})}},pause:{phasedRegistrationNames:{bubbled:keyOf({onPause:!0}),captured:keyOf({onPauseCapture:!0})}},play:{phasedRegistrationNames:{bubbled:keyOf({onPlay:!0}),captured:keyOf({onPlayCapture:!0})}},playing:{phasedRegistrationNames:{bubbled:keyOf({onPlaying:!0}),captured:keyOf({onPlayingCapture:!0})}},progress:{phasedRegistrationNames:{bubbled:keyOf({onProgress:!0}),captured:keyOf({onProgressCapture:!0})}},rateChange:{phasedRegistrationNames:{bubbled:keyOf({onRateChange:!0}),captured:keyOf({onRateChangeCapture:!0})}},reset:{phasedRegistrationNames:{bubbled:keyOf({onReset:!0}),captured:keyOf({onResetCapture:!0})}},scroll:{phasedRegistrationNames:{bubbled:keyOf({onScroll:!0}),captured:keyOf({onScrollCapture:!0})}},seeked:{phasedRegistrationNames:{bubbled:keyOf({onSeeked:!0}),captured:keyOf({onSeekedCapture:!0})}},seeking:{phasedRegistrationNames:{bubbled:keyOf({onSeeking:!0}),captured:keyOf({onSeekingCapture:!0})}},stalled:{phasedRegistrationNames:{bubbled:keyOf({onStalled:!0}),captured:keyOf({onStalledCapture:!0})}},submit:{phasedRegistrationNames:{bubbled:keyOf({onSubmit:!0}),captured:keyOf({onSubmitCapture:!0})}},suspend:{phasedRegistrationNames:{bubbled:keyOf({onSuspend:!0}),captured:keyOf({onSuspendCapture:!0})}},timeUpdate:{phasedRegistrationNames:{bubbled:keyOf({onTimeUpdate:!0}),captured:keyOf({onTimeUpdateCapture:!0})}},touchCancel:{phasedRegistrationNames:{bubbled:keyOf({onTouchCancel:!0}),captured:keyOf({onTouchCancelCapture:!0})}},touchEnd:{phasedRegistrationNames:{bubbled:keyOf({onTouchEnd:!0}),captured:keyOf({onTouchEndCapture:!0})}},touchMove:{phasedRegistrationNames:{bubbled:keyOf({onTouchMove:!0}),captured:keyOf({onTouchMoveCapture:!0})}},touchStart:{phasedRegistrationNames:{bubbled:keyOf({onTouchStart:!0}),captured:keyOf({onTouchStartCapture:!0})}},transitionEnd:{phasedRegistrationNames:{bubbled:keyOf({onTransitionEnd:!0}),captured:keyOf({onTransitionEndCapture:!0})}},volumeChange:{phasedRegistrationNames:{bubbled:keyOf({onVolumeChange:!0}),captured:keyOf({onVolumeChangeCapture:!0})}},waiting:{phasedRegistrationNames:{bubbled:keyOf({onWaiting:!0}),captured:keyOf({onWaitingCapture:!0})}},wheel:{phasedRegistrationNames:{bubbled:keyOf({onWheel:!0}),captured:keyOf({onWheelCapture:!0})}}},topLevelEventsToDispatchConfig={topAbort:eventTypes.abort,topAnimationEnd:eventTypes.animationEnd,topAnimationIteration:eventTypes.animationIteration,topAnimationStart:eventTypes.animationStart,topBlur:eventTypes.blur,topCanPlay:eventTypes.canPlay,topCanPlayThrough:eventTypes.canPlayThrough,topClick:eventTypes.click,topContextMenu:eventTypes.contextMenu,topCopy:eventTypes.copy,topCut:eventTypes.cut,topDoubleClick:eventTypes.doubleClick,topDrag:eventTypes.drag,topDragEnd:eventTypes.dragEnd,topDragEnter:eventTypes.dragEnter,topDragExit:eventTypes.dragExit,topDragLeave:eventTypes.dragLeave,topDragOver:eventTypes.dragOver,topDragStart:eventTypes.dragStart,topDrop:eventTypes.drop,topDurationChange:eventTypes.durationChange,topEmptied:eventTypes.emptied,topEncrypted:eventTypes.encrypted,topEnded:eventTypes.ended,topError:eventTypes.error,topFocus:eventTypes.focus,topInput:eventTypes.input,topInvalid:eventTypes.invalid,topKeyDown:eventTypes.keyDown,topKeyPress:eventTypes.keyPress,topKeyUp:eventTypes.keyUp,topLoad:eventTypes.load,topLoadedData:eventTypes.loadedData,topLoadedMetadata:eventTypes.loadedMetadata,topLoadStart:eventTypes.loadStart,topMouseDown:eventTypes.mouseDown,topMouseMove:eventTypes.mouseMove,topMouseOut:eventTypes.mouseOut,topMouseOver:eventTypes.mouseOver,topMouseUp:eventTypes.mouseUp,topPaste:eventTypes.paste,topPause:eventTypes.pause,topPlay:eventTypes.play,topPlaying:eventTypes.playing,topProgress:eventTypes.progress,topRateChange:eventTypes.rateChange,topReset:eventTypes.reset,topScroll:eventTypes.scroll,topSeeked:eventTypes.seeked,topSeeking:eventTypes.seeking,topStalled:eventTypes.stalled,topSubmit:eventTypes.submit,topSuspend:eventTypes.suspend,topTimeUpdate:eventTypes.timeUpdate,topTouchCancel:eventTypes.touchCancel,topTouchEnd:eventTypes.touchEnd,topTouchMove:eventTypes.touchMove,topTouchStart:eventTypes.touchStart,topTransitionEnd:eventTypes.transitionEnd,topVolumeChange:eventTypes.volumeChange,topWaiting:eventTypes.waiting,topWheel:eventTypes.wheel};for(var type in topLevelEventsToDispatchConfig)topLevelEventsToDispatchConfig[type].dependencies=[type];var ON_CLICK_KEY=keyOf({onClick:null}),onClickListeners={},SimpleEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,a,o){var n=topLevelEventsToDispatchConfig[e];if(!n)return null;var p;switch(e){case topLevelTypes.topAbort:case topLevelTypes.topCanPlay:case topLevelTypes.topCanPlayThrough:case topLevelTypes.topDurationChange:case topLevelTypes.topEmptied:case topLevelTypes.topEncrypted:case topLevelTypes.topEnded:case topLevelTypes.topError:case topLevelTypes.topInput:case topLevelTypes.topInvalid:case topLevelTypes.topLoad:case topLevelTypes.topLoadedData:case topLevelTypes.topLoadedMetadata:case topLevelTypes.topLoadStart:case topLevelTypes.topPause:case topLevelTypes.topPlay:case topLevelTypes.topPlaying:case topLevelTypes.topProgress:case topLevelTypes.topRateChange:case topLevelTypes.topReset:case topLevelTypes.topSeeked:case topLevelTypes.topSeeking:case topLevelTypes.topStalled:case topLevelTypes.topSubmit:case topLevelTypes.topSuspend:case topLevelTypes.topTimeUpdate:case topLevelTypes.topVolumeChange:case topLevelTypes.topWaiting:p=SyntheticEvent;break;case topLevelTypes.topKeyPress:if(0===getEventCharCode(a))return null;case topLevelTypes.topKeyDown:case topLevelTypes.topKeyUp:p=SyntheticKeyboardEvent;break;case topLevelTypes.topBlur:case topLevelTypes.topFocus:p=SyntheticFocusEvent;break;case topLevelTypes.topClick:if(2===a.button)return null;case topLevelTypes.topContextMenu:case topLevelTypes.topDoubleClick:case topLevelTypes.topMouseDown:case topLevelTypes.topMouseMove:case topLevelTypes.topMouseOut:case topLevelTypes.topMouseOver:case topLevelTypes.topMouseUp:p=SyntheticMouseEvent;break;case topLevelTypes.topDrag:case topLevelTypes.topDragEnd:case topLevelTypes.topDragEnter:case topLevelTypes.topDragExit:case topLevelTypes.topDragLeave:case topLevelTypes.topDragOver:case topLevelTypes.topDragStart:case topLevelTypes.topDrop:p=SyntheticDragEvent;break;case topLevelTypes.topTouchCancel:case topLevelTypes.topTouchEnd:case topLevelTypes.topTouchMove:case topLevelTypes.topTouchStart:p=SyntheticTouchEvent;break;case topLevelTypes.topAnimationEnd:case topLevelTypes.topAnimationIteration:case topLevelTypes.topAnimationStart:p=SyntheticAnimationEvent;break;case topLevelTypes.topTransitionEnd:p=SyntheticTransitionEvent;break;case topLevelTypes.topScroll:p=SyntheticUIEvent;break;case topLevelTypes.topWheel:p=SyntheticWheelEvent;break;case topLevelTypes.topCopy:case topLevelTypes.topCut:case topLevelTypes.topPaste:p=SyntheticClipboardEvent}p?void 0:invariant(!1);var s=p.getPooled(n,t,a,o);return EventPropagators.accumulateTwoPhaseDispatches(s),s},didPutListener:function(e,t,a){if(t===ON_CLICK_KEY){var o=e._rootNodeID,n=ReactDOMComponentTree.getNodeFromInstance(e);onClickListeners[o]||(onClickListeners[o]=EventListener.listen(n,"click",emptyFunction))}},willDeleteListener:function(e,t){if(t===ON_CLICK_KEY){var a=e._rootNodeID;onClickListeners[a].remove(),delete onClickListeners[a]}}};module.exports=SimpleEventPlugin; +},{"./EventConstants":91,"./EventPropagators":95,"./ReactDOMComponentTree":115,"./ReactInputSelection":139,"./SyntheticEvent":167,"./isTextInputElement":199,"fbjs/lib/ExecutionEnvironment":210,"fbjs/lib/getActiveElement":219,"fbjs/lib/keyOf":228,"fbjs/lib/shallowEqual":231}],162:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),EventConstants=require("./EventConstants"),EventListener=require("fbjs/lib/EventListener"),EventPropagators=require("./EventPropagators"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),SyntheticAnimationEvent=require("./SyntheticAnimationEvent"),SyntheticClipboardEvent=require("./SyntheticClipboardEvent"),SyntheticEvent=require("./SyntheticEvent"),SyntheticFocusEvent=require("./SyntheticFocusEvent"),SyntheticKeyboardEvent=require("./SyntheticKeyboardEvent"),SyntheticMouseEvent=require("./SyntheticMouseEvent"),SyntheticDragEvent=require("./SyntheticDragEvent"),SyntheticTouchEvent=require("./SyntheticTouchEvent"),SyntheticTransitionEvent=require("./SyntheticTransitionEvent"),SyntheticUIEvent=require("./SyntheticUIEvent"),SyntheticWheelEvent=require("./SyntheticWheelEvent"),emptyFunction=require("fbjs/lib/emptyFunction"),getEventCharCode=require("./getEventCharCode"),invariant=require("fbjs/lib/invariant"),keyOf=require("fbjs/lib/keyOf"),topLevelTypes=EventConstants.topLevelTypes,eventTypes={abort:{phasedRegistrationNames:{bubbled:keyOf({onAbort:!0}),captured:keyOf({onAbortCapture:!0})}},animationEnd:{phasedRegistrationNames:{bubbled:keyOf({onAnimationEnd:!0}),captured:keyOf({onAnimationEndCapture:!0})}},animationIteration:{phasedRegistrationNames:{bubbled:keyOf({onAnimationIteration:!0}),captured:keyOf({onAnimationIterationCapture:!0})}},animationStart:{phasedRegistrationNames:{bubbled:keyOf({onAnimationStart:!0}),captured:keyOf({onAnimationStartCapture:!0})}},blur:{phasedRegistrationNames:{bubbled:keyOf({onBlur:!0}),captured:keyOf({onBlurCapture:!0})}},canPlay:{phasedRegistrationNames:{bubbled:keyOf({onCanPlay:!0}),captured:keyOf({onCanPlayCapture:!0})}},canPlayThrough:{phasedRegistrationNames:{bubbled:keyOf({onCanPlayThrough:!0}),captured:keyOf({onCanPlayThroughCapture:!0})}},click:{phasedRegistrationNames:{bubbled:keyOf({onClick:!0}),captured:keyOf({onClickCapture:!0})}},contextMenu:{phasedRegistrationNames:{bubbled:keyOf({onContextMenu:!0}),captured:keyOf({onContextMenuCapture:!0})}},copy:{phasedRegistrationNames:{bubbled:keyOf({onCopy:!0}),captured:keyOf({onCopyCapture:!0})}},cut:{phasedRegistrationNames:{bubbled:keyOf({onCut:!0}),captured:keyOf({onCutCapture:!0})}},doubleClick:{phasedRegistrationNames:{bubbled:keyOf({onDoubleClick:!0}),captured:keyOf({onDoubleClickCapture:!0})}},drag:{phasedRegistrationNames:{bubbled:keyOf({onDrag:!0}),captured:keyOf({onDragCapture:!0})}},dragEnd:{phasedRegistrationNames:{bubbled:keyOf({onDragEnd:!0}),captured:keyOf({onDragEndCapture:!0})}},dragEnter:{phasedRegistrationNames:{bubbled:keyOf({onDragEnter:!0}),captured:keyOf({onDragEnterCapture:!0})}},dragExit:{phasedRegistrationNames:{bubbled:keyOf({onDragExit:!0}),captured:keyOf({onDragExitCapture:!0})}},dragLeave:{phasedRegistrationNames:{bubbled:keyOf({onDragLeave:!0}),captured:keyOf({onDragLeaveCapture:!0})}},dragOver:{phasedRegistrationNames:{bubbled:keyOf({onDragOver:!0}),captured:keyOf({onDragOverCapture:!0})}},dragStart:{phasedRegistrationNames:{bubbled:keyOf({onDragStart:!0}),captured:keyOf({onDragStartCapture:!0})}},drop:{phasedRegistrationNames:{bubbled:keyOf({onDrop:!0}),captured:keyOf({onDropCapture:!0})}},durationChange:{phasedRegistrationNames:{bubbled:keyOf({onDurationChange:!0}),captured:keyOf({onDurationChangeCapture:!0})}},emptied:{phasedRegistrationNames:{bubbled:keyOf({onEmptied:!0}),captured:keyOf({onEmptiedCapture:!0})}},encrypted:{phasedRegistrationNames:{bubbled:keyOf({onEncrypted:!0}),captured:keyOf({onEncryptedCapture:!0})}},ended:{phasedRegistrationNames:{bubbled:keyOf({onEnded:!0}),captured:keyOf({onEndedCapture:!0})}},error:{phasedRegistrationNames:{bubbled:keyOf({onError:!0}),captured:keyOf({onErrorCapture:!0})}},focus:{phasedRegistrationNames:{bubbled:keyOf({onFocus:!0}),captured:keyOf({onFocusCapture:!0})}},input:{phasedRegistrationNames:{bubbled:keyOf({onInput:!0}),captured:keyOf({onInputCapture:!0})}},invalid:{phasedRegistrationNames:{bubbled:keyOf({onInvalid:!0}),captured:keyOf({onInvalidCapture:!0})}},keyDown:{phasedRegistrationNames:{bubbled:keyOf({onKeyDown:!0}),captured:keyOf({onKeyDownCapture:!0})}},keyPress:{phasedRegistrationNames:{bubbled:keyOf({onKeyPress:!0}),captured:keyOf({onKeyPressCapture:!0})}},keyUp:{phasedRegistrationNames:{bubbled:keyOf({onKeyUp:!0}),captured:keyOf({onKeyUpCapture:!0})}},load:{phasedRegistrationNames:{bubbled:keyOf({onLoad:!0}),captured:keyOf({onLoadCapture:!0})}},loadedData:{phasedRegistrationNames:{bubbled:keyOf({onLoadedData:!0}),captured:keyOf({onLoadedDataCapture:!0})}},loadedMetadata:{phasedRegistrationNames:{bubbled:keyOf({onLoadedMetadata:!0}),captured:keyOf({onLoadedMetadataCapture:!0})}},loadStart:{phasedRegistrationNames:{bubbled:keyOf({onLoadStart:!0}),captured:keyOf({onLoadStartCapture:!0})}},mouseDown:{phasedRegistrationNames:{bubbled:keyOf({onMouseDown:!0}),captured:keyOf({onMouseDownCapture:!0})}},mouseMove:{phasedRegistrationNames:{bubbled:keyOf({onMouseMove:!0}),captured:keyOf({onMouseMoveCapture:!0})}},mouseOut:{phasedRegistrationNames:{bubbled:keyOf({onMouseOut:!0}),captured:keyOf({onMouseOutCapture:!0})}},mouseOver:{phasedRegistrationNames:{bubbled:keyOf({onMouseOver:!0}),captured:keyOf({onMouseOverCapture:!0})}},mouseUp:{phasedRegistrationNames:{bubbled:keyOf({onMouseUp:!0}),captured:keyOf({onMouseUpCapture:!0})}},paste:{phasedRegistrationNames:{bubbled:keyOf({onPaste:!0}),captured:keyOf({onPasteCapture:!0})}},pause:{phasedRegistrationNames:{bubbled:keyOf({onPause:!0}),captured:keyOf({onPauseCapture:!0})}},play:{phasedRegistrationNames:{bubbled:keyOf({onPlay:!0}),captured:keyOf({onPlayCapture:!0})}},playing:{phasedRegistrationNames:{bubbled:keyOf({onPlaying:!0}),captured:keyOf({onPlayingCapture:!0})}},progress:{phasedRegistrationNames:{bubbled:keyOf({onProgress:!0}),captured:keyOf({onProgressCapture:!0})}},rateChange:{phasedRegistrationNames:{bubbled:keyOf({onRateChange:!0}),captured:keyOf({onRateChangeCapture:!0})}},reset:{phasedRegistrationNames:{bubbled:keyOf({onReset:!0}),captured:keyOf({onResetCapture:!0})}},scroll:{phasedRegistrationNames:{bubbled:keyOf({onScroll:!0}),captured:keyOf({onScrollCapture:!0})}},seeked:{phasedRegistrationNames:{bubbled:keyOf({onSeeked:!0}),captured:keyOf({onSeekedCapture:!0})}},seeking:{phasedRegistrationNames:{bubbled:keyOf({onSeeking:!0}),captured:keyOf({onSeekingCapture:!0})}},stalled:{phasedRegistrationNames:{bubbled:keyOf({onStalled:!0}),captured:keyOf({onStalledCapture:!0})}},submit:{phasedRegistrationNames:{bubbled:keyOf({onSubmit:!0}),captured:keyOf({onSubmitCapture:!0})}},suspend:{phasedRegistrationNames:{bubbled:keyOf({onSuspend:!0}),captured:keyOf({onSuspendCapture:!0})}},timeUpdate:{phasedRegistrationNames:{bubbled:keyOf({onTimeUpdate:!0}),captured:keyOf({onTimeUpdateCapture:!0})}},touchCancel:{phasedRegistrationNames:{bubbled:keyOf({onTouchCancel:!0}),captured:keyOf({onTouchCancelCapture:!0})}},touchEnd:{phasedRegistrationNames:{bubbled:keyOf({onTouchEnd:!0}),captured:keyOf({onTouchEndCapture:!0})}},touchMove:{phasedRegistrationNames:{bubbled:keyOf({onTouchMove:!0}),captured:keyOf({onTouchMoveCapture:!0})}},touchStart:{phasedRegistrationNames:{bubbled:keyOf({onTouchStart:!0}),captured:keyOf({onTouchStartCapture:!0})}},transitionEnd:{phasedRegistrationNames:{bubbled:keyOf({onTransitionEnd:!0}),captured:keyOf({onTransitionEndCapture:!0})}},volumeChange:{phasedRegistrationNames:{bubbled:keyOf({onVolumeChange:!0}),captured:keyOf({onVolumeChangeCapture:!0})}},waiting:{phasedRegistrationNames:{bubbled:keyOf({onWaiting:!0}),captured:keyOf({onWaitingCapture:!0})}},wheel:{phasedRegistrationNames:{bubbled:keyOf({onWheel:!0}),captured:keyOf({onWheelCapture:!0})}}},topLevelEventsToDispatchConfig={topAbort:eventTypes.abort,topAnimationEnd:eventTypes.animationEnd,topAnimationIteration:eventTypes.animationIteration,topAnimationStart:eventTypes.animationStart,topBlur:eventTypes.blur,topCanPlay:eventTypes.canPlay,topCanPlayThrough:eventTypes.canPlayThrough,topClick:eventTypes.click,topContextMenu:eventTypes.contextMenu,topCopy:eventTypes.copy,topCut:eventTypes.cut,topDoubleClick:eventTypes.doubleClick,topDrag:eventTypes.drag,topDragEnd:eventTypes.dragEnd,topDragEnter:eventTypes.dragEnter,topDragExit:eventTypes.dragExit,topDragLeave:eventTypes.dragLeave,topDragOver:eventTypes.dragOver,topDragStart:eventTypes.dragStart,topDrop:eventTypes.drop,topDurationChange:eventTypes.durationChange,topEmptied:eventTypes.emptied,topEncrypted:eventTypes.encrypted,topEnded:eventTypes.ended,topError:eventTypes.error,topFocus:eventTypes.focus,topInput:eventTypes.input,topInvalid:eventTypes.invalid,topKeyDown:eventTypes.keyDown,topKeyPress:eventTypes.keyPress,topKeyUp:eventTypes.keyUp,topLoad:eventTypes.load,topLoadedData:eventTypes.loadedData,topLoadedMetadata:eventTypes.loadedMetadata,topLoadStart:eventTypes.loadStart,topMouseDown:eventTypes.mouseDown,topMouseMove:eventTypes.mouseMove,topMouseOut:eventTypes.mouseOut,topMouseOver:eventTypes.mouseOver,topMouseUp:eventTypes.mouseUp,topPaste:eventTypes.paste,topPause:eventTypes.pause,topPlay:eventTypes.play,topPlaying:eventTypes.playing,topProgress:eventTypes.progress,topRateChange:eventTypes.rateChange,topReset:eventTypes.reset,topScroll:eventTypes.scroll,topSeeked:eventTypes.seeked,topSeeking:eventTypes.seeking,topStalled:eventTypes.stalled,topSubmit:eventTypes.submit,topSuspend:eventTypes.suspend,topTimeUpdate:eventTypes.timeUpdate,topTouchCancel:eventTypes.touchCancel,topTouchEnd:eventTypes.touchEnd,topTouchMove:eventTypes.touchMove,topTouchStart:eventTypes.touchStart,topTransitionEnd:eventTypes.transitionEnd,topVolumeChange:eventTypes.volumeChange,topWaiting:eventTypes.waiting,topWheel:eventTypes.wheel};for(var type in topLevelEventsToDispatchConfig)topLevelEventsToDispatchConfig[type].dependencies=[type];var ON_CLICK_KEY=keyOf({onClick:null}),onClickListeners={},SimpleEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,a,o){var n=topLevelEventsToDispatchConfig[e];if(!n)return null;var p;switch(e){case topLevelTypes.topAbort:case topLevelTypes.topCanPlay:case topLevelTypes.topCanPlayThrough:case topLevelTypes.topDurationChange:case topLevelTypes.topEmptied:case topLevelTypes.topEncrypted:case topLevelTypes.topEnded:case topLevelTypes.topError:case topLevelTypes.topInput:case topLevelTypes.topInvalid:case topLevelTypes.topLoad:case topLevelTypes.topLoadedData:case topLevelTypes.topLoadedMetadata:case topLevelTypes.topLoadStart:case topLevelTypes.topPause:case topLevelTypes.topPlay:case topLevelTypes.topPlaying:case topLevelTypes.topProgress:case topLevelTypes.topRateChange:case topLevelTypes.topReset:case topLevelTypes.topSeeked:case topLevelTypes.topSeeking:case topLevelTypes.topStalled:case topLevelTypes.topSubmit:case topLevelTypes.topSuspend:case topLevelTypes.topTimeUpdate:case topLevelTypes.topVolumeChange:case topLevelTypes.topWaiting:p=SyntheticEvent;break;case topLevelTypes.topKeyPress:if(0===getEventCharCode(a))return null;case topLevelTypes.topKeyDown:case topLevelTypes.topKeyUp:p=SyntheticKeyboardEvent;break;case topLevelTypes.topBlur:case topLevelTypes.topFocus:p=SyntheticFocusEvent;break;case topLevelTypes.topClick:if(2===a.button)return null;case topLevelTypes.topContextMenu:case topLevelTypes.topDoubleClick:case topLevelTypes.topMouseDown:case topLevelTypes.topMouseMove:case topLevelTypes.topMouseOut:case topLevelTypes.topMouseOver:case topLevelTypes.topMouseUp:p=SyntheticMouseEvent;break;case topLevelTypes.topDrag:case topLevelTypes.topDragEnd:case topLevelTypes.topDragEnter:case topLevelTypes.topDragExit:case topLevelTypes.topDragLeave:case topLevelTypes.topDragOver:case topLevelTypes.topDragStart:case topLevelTypes.topDrop:p=SyntheticDragEvent;break;case topLevelTypes.topTouchCancel:case topLevelTypes.topTouchEnd:case topLevelTypes.topTouchMove:case topLevelTypes.topTouchStart:p=SyntheticTouchEvent;break;case topLevelTypes.topAnimationEnd:case topLevelTypes.topAnimationIteration:case topLevelTypes.topAnimationStart:p=SyntheticAnimationEvent;break;case topLevelTypes.topTransitionEnd:p=SyntheticTransitionEvent;break;case topLevelTypes.topScroll:p=SyntheticUIEvent;break;case topLevelTypes.topWheel:p=SyntheticWheelEvent;break;case topLevelTypes.topCopy:case topLevelTypes.topCut:case topLevelTypes.topPaste:p=SyntheticClipboardEvent}p?void 0:_prodInvariant("86",e);var s=p.getPooled(n,t,a,o);return EventPropagators.accumulateTwoPhaseDispatches(s),s},didPutListener:function(e,t,a){if(t===ON_CLICK_KEY){var o=e._rootNodeID,n=ReactDOMComponentTree.getNodeFromInstance(e);onClickListeners[o]||(onClickListeners[o]=EventListener.listen(n,"click",emptyFunction))}},willDeleteListener:function(e,t){if(t===ON_CLICK_KEY){var a=e._rootNodeID;onClickListeners[a].remove(),delete onClickListeners[a]}}};module.exports=SimpleEventPlugin; -},{"./EventConstants":92,"./EventPropagators":96,"./ReactDOMComponentTree":116,"./SyntheticAnimationEvent":167,"./SyntheticClipboardEvent":168,"./SyntheticDragEvent":170,"./SyntheticEvent":171,"./SyntheticFocusEvent":172,"./SyntheticKeyboardEvent":174,"./SyntheticMouseEvent":175,"./SyntheticTouchEvent":176,"./SyntheticTransitionEvent":177,"./SyntheticUIEvent":178,"./SyntheticWheelEvent":179,"./getEventCharCode":191,"fbjs/lib/EventListener":211,"fbjs/lib/emptyFunction":218,"fbjs/lib/invariant":226,"fbjs/lib/keyOf":230}],167:[function(require,module,exports){ +},{"./EventConstants":91,"./EventPropagators":95,"./ReactDOMComponentTree":115,"./SyntheticAnimationEvent":163,"./SyntheticClipboardEvent":164,"./SyntheticDragEvent":166,"./SyntheticEvent":167,"./SyntheticFocusEvent":168,"./SyntheticKeyboardEvent":170,"./SyntheticMouseEvent":171,"./SyntheticTouchEvent":172,"./SyntheticTransitionEvent":173,"./SyntheticUIEvent":174,"./SyntheticWheelEvent":175,"./getEventCharCode":188,"./reactProdInvariant":202,"fbjs/lib/EventListener":209,"fbjs/lib/emptyFunction":216,"fbjs/lib/invariant":224,"fbjs/lib/keyOf":228}],163:[function(require,module,exports){ "use strict";function SyntheticAnimationEvent(t,n,e,i){return SyntheticEvent.call(this,t,n,e,i)}var SyntheticEvent=require("./SyntheticEvent"),AnimationEventInterface={animationName:null,elapsedTime:null,pseudoElement:null};SyntheticEvent.augmentClass(SyntheticAnimationEvent,AnimationEventInterface),module.exports=SyntheticAnimationEvent; -},{"./SyntheticEvent":171}],168:[function(require,module,exports){ +},{"./SyntheticEvent":167}],164:[function(require,module,exports){ "use strict";function SyntheticClipboardEvent(t,e,n,a){return SyntheticEvent.call(this,t,e,n,a)}var SyntheticEvent=require("./SyntheticEvent"),ClipboardEventInterface={clipboardData:function(t){return"clipboardData"in t?t.clipboardData:window.clipboardData}};SyntheticEvent.augmentClass(SyntheticClipboardEvent,ClipboardEventInterface),module.exports=SyntheticClipboardEvent; -},{"./SyntheticEvent":171}],169:[function(require,module,exports){ +},{"./SyntheticEvent":167}],165:[function(require,module,exports){ "use strict";function SyntheticCompositionEvent(t,n,e,i){return SyntheticEvent.call(this,t,n,e,i)}var SyntheticEvent=require("./SyntheticEvent"),CompositionEventInterface={data:null};SyntheticEvent.augmentClass(SyntheticCompositionEvent,CompositionEventInterface),module.exports=SyntheticCompositionEvent; -},{"./SyntheticEvent":171}],170:[function(require,module,exports){ +},{"./SyntheticEvent":167}],166:[function(require,module,exports){ "use strict";function SyntheticDragEvent(t,e,n,r){return SyntheticMouseEvent.call(this,t,e,n,r)}var SyntheticMouseEvent=require("./SyntheticMouseEvent"),DragEventInterface={dataTransfer:null};SyntheticMouseEvent.augmentClass(SyntheticDragEvent,DragEventInterface),module.exports=SyntheticDragEvent; -},{"./SyntheticMouseEvent":175}],171:[function(require,module,exports){ +},{"./SyntheticMouseEvent":171}],167:[function(require,module,exports){ "use strict";function SyntheticEvent(t,e,n,r){this.dispatchConfig=t,this._targetInst=e,this.nativeEvent=n;var s=this.constructor.Interface;for(var i in s)if(s.hasOwnProperty(i)){var o=s[i];o?this[i]=o(n):"target"===i?this.target=r:this[i]=n[i]}var a=null!=n.defaultPrevented?n.defaultPrevented:n.returnValue===!1;return a?this.isDefaultPrevented=emptyFunction.thatReturnsTrue:this.isDefaultPrevented=emptyFunction.thatReturnsFalse,this.isPropagationStopped=emptyFunction.thatReturnsFalse,this}function getPooledWarningPropertyDefinition(t,e){function n(t){var e=i?"setting the method":"setting the property";return s(e,"This is effectively a no-op"),t}function r(){var t=i?"accessing the method":"accessing the property",n=i?"This is a no-op function":"This is set to null";return s(t,n),e}function s(t,e){}var i="function"==typeof e;return{configurable:!0,set:n,get:r}}var _assign=require("object-assign"),PooledClass=require("./PooledClass"),emptyFunction=require("fbjs/lib/emptyFunction"),warning=require("fbjs/lib/warning"),didWarnForAddedNewProperty=!1,isProxySupported="function"==typeof Proxy,shouldBeReleasedProperties=["dispatchConfig","_targetInst","nativeEvent","isDefaultPrevented","isPropagationStopped","_dispatchListeners","_dispatchInstances"],EventInterface={type:null,target:null,currentTarget:emptyFunction.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(t){return t.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};_assign(SyntheticEvent.prototype,{preventDefault:function(){this.defaultPrevented=!0;var t=this.nativeEvent;t&&(t.preventDefault?t.preventDefault():t.returnValue=!1,this.isDefaultPrevented=emptyFunction.thatReturnsTrue)},stopPropagation:function(){var t=this.nativeEvent;t&&(t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this.isPropagationStopped=emptyFunction.thatReturnsTrue)},persist:function(){this.isPersistent=emptyFunction.thatReturnsTrue},isPersistent:emptyFunction.thatReturnsFalse,destructor:function(){var t=this.constructor.Interface;for(var e in t)this[e]=null;for(var n=0;n<shouldBeReleasedProperties.length;n++)this[shouldBeReleasedProperties[n]]=null}}),SyntheticEvent.Interface=EventInterface,SyntheticEvent.augmentClass=function(t,e){var n=this,r=function(){};r.prototype=n.prototype;var s=new r;_assign(s,t.prototype),t.prototype=s,t.prototype.constructor=t,t.Interface=_assign({},n.Interface,e),t.augmentClass=n.augmentClass,PooledClass.addPoolingTo(t,PooledClass.fourArgumentPooler)},PooledClass.addPoolingTo(SyntheticEvent,PooledClass.fourArgumentPooler),module.exports=SyntheticEvent; -},{"./PooledClass":101,"fbjs/lib/emptyFunction":218,"fbjs/lib/warning":236,"object-assign":32}],172:[function(require,module,exports){ +},{"./PooledClass":100,"fbjs/lib/emptyFunction":216,"fbjs/lib/warning":232,"object-assign":31}],168:[function(require,module,exports){ "use strict";function SyntheticFocusEvent(t,e,n,c){return SyntheticUIEvent.call(this,t,e,n,c)}var SyntheticUIEvent=require("./SyntheticUIEvent"),FocusEventInterface={relatedTarget:null};SyntheticUIEvent.augmentClass(SyntheticFocusEvent,FocusEventInterface),module.exports=SyntheticFocusEvent; -},{"./SyntheticUIEvent":178}],173:[function(require,module,exports){ +},{"./SyntheticUIEvent":174}],169:[function(require,module,exports){ "use strict";function SyntheticInputEvent(t,n,e,c){return SyntheticEvent.call(this,t,n,e,c)}var SyntheticEvent=require("./SyntheticEvent"),InputEventInterface={data:null};SyntheticEvent.augmentClass(SyntheticInputEvent,InputEventInterface),module.exports=SyntheticInputEvent; -},{"./SyntheticEvent":171}],174:[function(require,module,exports){ +},{"./SyntheticEvent":167}],170:[function(require,module,exports){ "use strict";function SyntheticKeyboardEvent(e,t,n,r){return SyntheticUIEvent.call(this,e,t,n,r)}var SyntheticUIEvent=require("./SyntheticUIEvent"),getEventCharCode=require("./getEventCharCode"),getEventKey=require("./getEventKey"),getEventModifierState=require("./getEventModifierState"),KeyboardEventInterface={key:getEventKey,location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:getEventModifierState,charCode:function(e){return"keypress"===e.type?getEventCharCode(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?getEventCharCode(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}};SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent,KeyboardEventInterface),module.exports=SyntheticKeyboardEvent; -},{"./SyntheticUIEvent":178,"./getEventCharCode":191,"./getEventKey":192,"./getEventModifierState":193}],175:[function(require,module,exports){ +},{"./SyntheticUIEvent":174,"./getEventCharCode":188,"./getEventKey":189,"./getEventModifierState":190}],171:[function(require,module,exports){ "use strict";function SyntheticMouseEvent(e,t,n,r){return SyntheticUIEvent.call(this,e,t,n,r)}var SyntheticUIEvent=require("./SyntheticUIEvent"),ViewportMetrics=require("./ViewportMetrics"),getEventModifierState=require("./getEventModifierState"),MouseEventInterface={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:getEventModifierState,button:function(e){var t=e.button;return"which"in e?t:2===t?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return"pageX"in e?e.pageX:e.clientX+ViewportMetrics.currentScrollLeft},pageY:function(e){return"pageY"in e?e.pageY:e.clientY+ViewportMetrics.currentScrollTop}};SyntheticUIEvent.augmentClass(SyntheticMouseEvent,MouseEventInterface),module.exports=SyntheticMouseEvent; -},{"./SyntheticUIEvent":178,"./ViewportMetrics":181,"./getEventModifierState":193}],176:[function(require,module,exports){ +},{"./SyntheticUIEvent":174,"./ViewportMetrics":177,"./getEventModifierState":190}],172:[function(require,module,exports){ "use strict";function SyntheticTouchEvent(e,t,n,c){return SyntheticUIEvent.call(this,e,t,n,c)}var SyntheticUIEvent=require("./SyntheticUIEvent"),getEventModifierState=require("./getEventModifierState"),TouchEventInterface={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:getEventModifierState};SyntheticUIEvent.augmentClass(SyntheticTouchEvent,TouchEventInterface),module.exports=SyntheticTouchEvent; -},{"./SyntheticUIEvent":178,"./getEventModifierState":193}],177:[function(require,module,exports){ +},{"./SyntheticUIEvent":174,"./getEventModifierState":190}],173:[function(require,module,exports){ "use strict";function SyntheticTransitionEvent(t,n,e,i){return SyntheticEvent.call(this,t,n,e,i)}var SyntheticEvent=require("./SyntheticEvent"),TransitionEventInterface={propertyName:null,elapsedTime:null,pseudoElement:null};SyntheticEvent.augmentClass(SyntheticTransitionEvent,TransitionEventInterface),module.exports=SyntheticTransitionEvent; -},{"./SyntheticEvent":171}],178:[function(require,module,exports){ -"use strict";function SyntheticUIEvent(e,t,n,r){return SyntheticEvent.call(this,e,t,n,r)}var SyntheticEvent=require("./SyntheticEvent"),getEventTarget=require("./getEventTarget"),UIEventInterface={view:function(e){if(e.view)return e.view;var t=getEventTarget(e);if(null!=t&&t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};SyntheticEvent.augmentClass(SyntheticUIEvent,UIEventInterface),module.exports=SyntheticUIEvent; +},{"./SyntheticEvent":167}],174:[function(require,module,exports){ +"use strict";function SyntheticUIEvent(e,t,n,r){return SyntheticEvent.call(this,e,t,n,r)}var SyntheticEvent=require("./SyntheticEvent"),getEventTarget=require("./getEventTarget"),UIEventInterface={view:function(e){if(e.view)return e.view;var t=getEventTarget(e);if(t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};SyntheticEvent.augmentClass(SyntheticUIEvent,UIEventInterface),module.exports=SyntheticUIEvent; -},{"./SyntheticEvent":171,"./getEventTarget":194}],179:[function(require,module,exports){ +},{"./SyntheticEvent":167,"./getEventTarget":191}],175:[function(require,module,exports){ "use strict";function SyntheticWheelEvent(e,t,n,l){return SyntheticMouseEvent.call(this,e,t,n,l)}var SyntheticMouseEvent=require("./SyntheticMouseEvent"),WheelEventInterface={deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null};SyntheticMouseEvent.augmentClass(SyntheticWheelEvent,WheelEventInterface),module.exports=SyntheticWheelEvent; -},{"./SyntheticMouseEvent":175}],180:[function(require,module,exports){ -"use strict";var invariant=require("fbjs/lib/invariant"),Mixin={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(i,t,a,n,r,s,l,e){this.isInTransaction()?invariant(!1):void 0;var c,o;try{this._isInTransaction=!0,c=!0,this.initializeAll(0),o=i.call(t,a,n,r,s,l,e),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(h){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return o},initializeAll:function(i){for(var t=this.transactionWrappers,a=i;a<t.length;a++){var n=t[a];try{this.wrapperInitData[a]=Transaction.OBSERVED_ERROR,this.wrapperInitData[a]=n.initialize?n.initialize.call(this):null}finally{if(this.wrapperInitData[a]===Transaction.OBSERVED_ERROR)try{this.initializeAll(a+1)}catch(r){}}}},closeAll:function(i){this.isInTransaction()?void 0:invariant(!1);for(var t=this.transactionWrappers,a=i;a<t.length;a++){var n,r=t[a],s=this.wrapperInitData[a];try{n=!0,s!==Transaction.OBSERVED_ERROR&&r.close&&r.close.call(this,s),n=!1}finally{if(n)try{this.closeAll(a+1)}catch(l){}}}this.wrapperInitData.length=0}},Transaction={Mixin:Mixin,OBSERVED_ERROR:{}};module.exports=Transaction; +},{"./SyntheticMouseEvent":171}],176:[function(require,module,exports){ +"use strict";var _prodInvariant=require("./reactProdInvariant"),invariant=require("fbjs/lib/invariant"),Mixin={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(i,a,t,n,r,s,l,e){this.isInTransaction()?_prodInvariant("27"):void 0;var c,o;try{this._isInTransaction=!0,c=!0,this.initializeAll(0),o=i.call(a,t,n,r,s,l,e),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(i){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return o},initializeAll:function(i){for(var a=this.transactionWrappers,t=i;t<a.length;t++){var n=a[t];try{this.wrapperInitData[t]=Transaction.OBSERVED_ERROR,this.wrapperInitData[t]=n.initialize?n.initialize.call(this):null}finally{if(this.wrapperInitData[t]===Transaction.OBSERVED_ERROR)try{this.initializeAll(t+1)}catch(i){}}}},closeAll:function(i){this.isInTransaction()?void 0:_prodInvariant("28");for(var a=this.transactionWrappers,t=i;t<a.length;t++){var n,r=a[t],s=this.wrapperInitData[t];try{n=!0,s!==Transaction.OBSERVED_ERROR&&r.close&&r.close.call(this,s),n=!1}finally{if(n)try{this.closeAll(t+1)}catch(i){}}}this.wrapperInitData.length=0}},Transaction={Mixin:Mixin,OBSERVED_ERROR:{}};module.exports=Transaction; -},{"fbjs/lib/invariant":226}],181:[function(require,module,exports){ +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224}],177:[function(require,module,exports){ "use strict";var ViewportMetrics={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(r){ViewportMetrics.currentScrollLeft=r.x,ViewportMetrics.currentScrollTop=r.y}};module.exports=ViewportMetrics; -},{}],182:[function(require,module,exports){ -"use strict";function accumulateInto(r,a){if(null==a?invariant(!1):void 0,null==r)return a;var n=Array.isArray(r),i=Array.isArray(a);return n&&i?(r.push.apply(r,a),r):n?(r.push(a),r):i?[r].concat(a):[r,a]}var invariant=require("fbjs/lib/invariant");module.exports=accumulateInto; +},{}],178:[function(require,module,exports){ +"use strict";function accumulateInto(r,a){return null==a?_prodInvariant("30"):void 0,null==r?a:Array.isArray(r)?Array.isArray(a)?(r.push.apply(r,a),r):(r.push(a),r):Array.isArray(a)?[r].concat(a):[r,a]}var _prodInvariant=require("./reactProdInvariant"),invariant=require("fbjs/lib/invariant");module.exports=accumulateInto; -},{"fbjs/lib/invariant":226}],183:[function(require,module,exports){ +},{"./reactProdInvariant":202,"fbjs/lib/invariant":224}],179:[function(require,module,exports){ "use strict";function adler32(r){for(var e=1,t=0,a=0,o=r.length,d=o&-4;a<d;){for(var c=Math.min(a+4096,d);a<c;a+=4)t+=(e+=r.charCodeAt(a))+(e+=r.charCodeAt(a+1))+(e+=r.charCodeAt(a+2))+(e+=r.charCodeAt(a+3));e%=MOD,t%=MOD}for(;a<o;a++)t+=e+=r.charCodeAt(a);return e%=MOD,t%=MOD,e|t<<16}var MOD=65521;module.exports=adler32; -},{}],184:[function(require,module,exports){ +},{}],180:[function(require,module,exports){ "use strict";var canDefineProperty=!1;module.exports=canDefineProperty; -},{}],185:[function(require,module,exports){ +},{}],181:[function(require,module,exports){ +"use strict";function checkReactTypeSpec(e,a,r,i,n,o){for(var t in e)if(e.hasOwnProperty(t)){var c;try{"function"!=typeof e[t]?_prodInvariant("84",i||"React class",ReactPropTypeLocationNames[r],t):void 0,c=e[t](a,t,i,r)}catch(e){c=e}if(c instanceof Error&&!(c.message in loggedTypeFailures)){loggedTypeFailures[c.message]=!0}}}var _prodInvariant=require("./reactProdInvariant"),ReactPropTypeLocationNames=require("./ReactPropTypeLocationNames"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),loggedTypeFailures={};module.exports=checkReactTypeSpec; + +},{"./ReactPropTypeLocationNames":149,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232}],182:[function(require,module,exports){ "use strict";var createMicrosoftUnsafeLocalFunction=function(n){return"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,c,o,t){MSApp.execUnsafeLocalFunction(function(){return n(e,c,o,t)})}:n};module.exports=createMicrosoftUnsafeLocalFunction; -},{}],186:[function(require,module,exports){ +},{}],183:[function(require,module,exports){ "use strict";function dangerousStyleValue(r,e,s){var i=null==e||"boolean"==typeof e||""===e;if(i)return"";var t=isNaN(e);if(t||0===e||isUnitlessNumber.hasOwnProperty(r)&&isUnitlessNumber[r])return""+e;if("string"==typeof e){e=e.trim()}return e+"px"}var CSSProperty=require("./CSSProperty"),warning=require("fbjs/lib/warning"),isUnitlessNumber=CSSProperty.isUnitlessNumber,styleWarnings={};module.exports=dangerousStyleValue; -},{"./CSSProperty":79,"fbjs/lib/warning":236}],187:[function(require,module,exports){ -"use strict";function escaper(e){return ESCAPE_LOOKUP[e]}function escapeTextContentForBrowser(e){return(""+e).replace(ESCAPE_REGEX,escaper)}var ESCAPE_LOOKUP={"&":"&",">":">","<":"<",'"':""","'":"'"},ESCAPE_REGEX=/[&><"']/g;module.exports=escapeTextContentForBrowser; +},{"./CSSProperty":78,"fbjs/lib/warning":232}],184:[function(require,module,exports){ +"use strict";function escapeHtml(e){var t=""+e,r=matchHtmlRegExp.exec(t);if(!r)return t;var a,n="",s=0,c=0;for(s=r.index;s<t.length;s++){switch(t.charCodeAt(s)){case 34:a=""";break;case 38:a="&";break;case 39:a="'";break;case 60:a="<";break;case 62:a=">";break;default:continue}c!==s&&(n+=t.substring(c,s)),c=s+1,n+=a}return c!==s?n+t.substring(c,s):n}function escapeTextContentForBrowser(e){return"boolean"==typeof e||"number"==typeof e?""+e:escapeHtml(e)}var matchHtmlRegExp=/["'&<>]/;module.exports=escapeTextContentForBrowser; -},{}],188:[function(require,module,exports){ -"use strict";function findDOMNode(e){if(null==e)return null;if(1===e.nodeType)return e;var n=ReactInstanceMap.get(e);return n?(n=getNativeComponentFromComposite(n),n?ReactDOMComponentTree.getNodeFromInstance(n):null):void invariant(("function"==typeof e.render,!1))}var ReactCurrentOwner=require("./ReactCurrentOwner"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactInstanceMap=require("./ReactInstanceMap"),getNativeComponentFromComposite=require("./getNativeComponentFromComposite"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning");module.exports=findDOMNode; +},{}],185:[function(require,module,exports){ +"use strict";function findDOMNode(e){if(null==e)return null;if(1===e.nodeType)return e;var n=ReactInstanceMap.get(e);return n?(n=getHostComponentFromComposite(n),n?ReactDOMComponentTree.getNodeFromInstance(n):null):void("function"==typeof e.render?_prodInvariant("44"):_prodInvariant("45",Object.keys(e)))}var _prodInvariant=require("./reactProdInvariant"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactInstanceMap=require("./ReactInstanceMap"),getHostComponentFromComposite=require("./getHostComponentFromComposite"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning");module.exports=findDOMNode; -},{"./ReactCurrentOwner":111,"./ReactDOMComponentTree":116,"./ReactInstanceMap":144,"./getNativeComponentFromComposite":196,"fbjs/lib/invariant":226,"fbjs/lib/warning":236}],189:[function(require,module,exports){ -"use strict";function flattenSingleChildIntoContext(e,r,l){var n=e,t=void 0===n[l];t&&null!=r&&(n[l]=r)}function flattenChildren(e){if(null==e)return e;var r={};return traverseAllChildren(e,flattenSingleChildIntoContext,r),r}var KeyEscapeUtils=require("./KeyEscapeUtils"),traverseAllChildren=require("./traverseAllChildren"),warning=require("fbjs/lib/warning");module.exports=flattenChildren; +},{"./ReactCurrentOwner":110,"./ReactDOMComponentTree":115,"./ReactInstanceMap":140,"./getHostComponentFromComposite":192,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232}],186:[function(require,module,exports){ +"use strict";function flattenSingleChildIntoContext(e,r,t,l){if(e&&"object"==typeof e){var n=e,i=void 0===n[t];i&&null!=r&&(n[t]=r)}}function flattenChildren(e,r){if(null==e)return e;var t={};return traverseAllChildren(e,flattenSingleChildIntoContext,t),t}var KeyEscapeUtils=require("./KeyEscapeUtils"),traverseAllChildren=require("./traverseAllChildren"),warning=require("fbjs/lib/warning");module.exports=flattenChildren; -},{"./KeyEscapeUtils":99,"./traverseAllChildren":209,"fbjs/lib/warning":236}],190:[function(require,module,exports){ -"use strict";var forEachAccumulated=function(c,r,a){Array.isArray(c)?c.forEach(r,a):c&&r.call(a,c)};module.exports=forEachAccumulated; +},{"./KeyEscapeUtils":98,"./traverseAllChildren":207,"fbjs/lib/warning":232}],187:[function(require,module,exports){ +"use strict";function forEachAccumulated(c,r,a){Array.isArray(c)?c.forEach(r,a):c&&r.call(a,c)}module.exports=forEachAccumulated; -},{}],191:[function(require,module,exports){ +},{}],188:[function(require,module,exports){ "use strict";function getEventCharCode(e){var r,t=e.keyCode;return"charCode"in e?(r=e.charCode,0===r&&13===t&&(r=13)):r=t,r>=32||13===r?r:0}module.exports=getEventCharCode; -},{}],192:[function(require,module,exports){ +},{}],189:[function(require,module,exports){ "use strict";function getEventKey(e){if(e.key){var r=normalizeKey[e.key]||e.key;if("Unidentified"!==r)return r}if("keypress"===e.type){var t=getEventCharCode(e);return 13===t?"Enter":String.fromCharCode(t)}return"keydown"===e.type||"keyup"===e.type?translateToKey[e.keyCode]||"Unidentified":""}var getEventCharCode=require("./getEventCharCode"),normalizeKey={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},translateToKey={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};module.exports=getEventKey; -},{"./getEventCharCode":191}],193:[function(require,module,exports){ +},{"./getEventCharCode":188}],190:[function(require,module,exports){ "use strict";function modifierStateGetter(t){var e=this,r=e.nativeEvent;if(r.getModifierState)return r.getModifierState(t);var i=modifierKeyToProp[t];return!!i&&!!r[i]}function getEventModifierState(t){return modifierStateGetter}var modifierKeyToProp={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};module.exports=getEventModifierState; -},{}],194:[function(require,module,exports){ +},{}],191:[function(require,module,exports){ "use strict";function getEventTarget(e){var t=e.target||e.srcElement||window;return t.correspondingUseElement&&(t=t.correspondingUseElement),3===t.nodeType?t.parentNode:t}module.exports=getEventTarget; -},{}],195:[function(require,module,exports){ -"use strict";function getIteratorFn(t){var r=t&&(ITERATOR_SYMBOL&&t[ITERATOR_SYMBOL]||t[FAUX_ITERATOR_SYMBOL]);if("function"==typeof r)return r}var ITERATOR_SYMBOL="function"==typeof Symbol&&Symbol.iterator,FAUX_ITERATOR_SYMBOL="@@iterator";module.exports=getIteratorFn; +},{}],192:[function(require,module,exports){ +"use strict";function getHostComponentFromComposite(e){for(var o;(o=e._renderedNodeType)===ReactNodeTypes.COMPOSITE;)e=e._renderedComponent;return o===ReactNodeTypes.HOST?e._renderedComponent:o===ReactNodeTypes.EMPTY?null:void 0}var ReactNodeTypes=require("./ReactNodeTypes");module.exports=getHostComponentFromComposite; -},{}],196:[function(require,module,exports){ -"use strict";function getNativeComponentFromComposite(e){for(var o;(o=e._renderedNodeType)===ReactNodeTypes.COMPOSITE;)e=e._renderedComponent;return o===ReactNodeTypes.NATIVE?e._renderedComponent:o===ReactNodeTypes.EMPTY?null:void 0}var ReactNodeTypes=require("./ReactNodeTypes");module.exports=getNativeComponentFromComposite; +},{"./ReactNodeTypes":146}],193:[function(require,module,exports){ +"use strict";function getIteratorFn(t){var r=t&&(ITERATOR_SYMBOL&&t[ITERATOR_SYMBOL]||t[FAUX_ITERATOR_SYMBOL]);if("function"==typeof r)return r}var ITERATOR_SYMBOL="function"==typeof Symbol&&Symbol.iterator,FAUX_ITERATOR_SYMBOL="@@iterator";module.exports=getIteratorFn; -},{"./ReactNodeTypes":151}],197:[function(require,module,exports){ +},{}],194:[function(require,module,exports){ "use strict";function getLeafNode(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function getSiblingNode(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function getNodeForCharacterOffset(e,t){for(var o=getLeafNode(e),n=0,r=0;o;){if(3===o.nodeType){if(r=n+o.textContent.length,n<=t&&r>=t)return{node:o,offset:t-n};n=r}o=getLeafNode(getSiblingNode(o))}}module.exports=getNodeForCharacterOffset; -},{}],198:[function(require,module,exports){ +},{}],195:[function(require,module,exports){ "use strict";function getTextContentAccessor(){return!contentKey&&ExecutionEnvironment.canUseDOM&&(contentKey="textContent"in document.documentElement?"textContent":"innerText"),contentKey}var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),contentKey=null;module.exports=getTextContentAccessor; -},{"fbjs/lib/ExecutionEnvironment":212}],199:[function(require,module,exports){ +},{"fbjs/lib/ExecutionEnvironment":210}],196:[function(require,module,exports){ "use strict";function makePrefixMap(e,n){var i={};return i[e.toLowerCase()]=n.toLowerCase(),i["Webkit"+e]="webkit"+n,i["Moz"+e]="moz"+n,i["ms"+e]="MS"+n,i["O"+e]="o"+n.toLowerCase(),i}function getVendorPrefixedEventName(e){if(prefixedEventNames[e])return prefixedEventNames[e];if(!vendorPrefixes[e])return e;var n=vendorPrefixes[e];for(var i in n)if(n.hasOwnProperty(i)&&i in style)return prefixedEventNames[e]=n[i];return""}var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),vendorPrefixes={animationend:makePrefixMap("Animation","AnimationEnd"),animationiteration:makePrefixMap("Animation","AnimationIteration"),animationstart:makePrefixMap("Animation","AnimationStart"),transitionend:makePrefixMap("Transition","TransitionEnd")},prefixedEventNames={},style={};ExecutionEnvironment.canUseDOM&&(style=document.createElement("div").style,"AnimationEvent"in window||(delete vendorPrefixes.animationend.animation,delete vendorPrefixes.animationiteration.animation,delete vendorPrefixes.animationstart.animation),"TransitionEvent"in window||delete vendorPrefixes.transitionend.transition),module.exports=getVendorPrefixedEventName; -},{"fbjs/lib/ExecutionEnvironment":212}],200:[function(require,module,exports){ -"use strict";function getDeclarationErrorAddendum(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function getDisplayName(e){var t=e._currentElement;return null==t?"#empty":"string"==typeof t||"number"==typeof t?"#text":"string"==typeof t.type?t.type:e.getName?e.getName()||"Unknown":t.type.displayName||t.type.name||"Unknown"}function isInternalComponentType(e){return"function"==typeof e&&"undefined"!=typeof e.prototype&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function instantiateReactComponent(e){var t,n=null===e||e===!1;if(n)t=ReactEmptyComponent.create(instantiateReactComponent);else if("object"==typeof e){var o=e;!o||"function"!=typeof o.type&&"string"!=typeof o.type?invariant(!1):void 0,t="string"==typeof o.type?ReactNativeComponent.createInternalComponent(o):isInternalComponentType(o.type)?new o.type(o):new ReactCompositeComponentWrapper(o)}else"string"==typeof e||"number"==typeof e?t=ReactNativeComponent.createInstanceForText(e):invariant(!1);t._mountIndex=0,t._mountImage=null;return t}var _assign=require("object-assign"),ReactCompositeComponent=require("./ReactCompositeComponent"),ReactEmptyComponent=require("./ReactEmptyComponent"),ReactNativeComponent=require("./ReactNativeComponent"),ReactInstrumentation=require("./ReactInstrumentation"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),ReactCompositeComponentWrapper=function(e){this.construct(e)};_assign(ReactCompositeComponentWrapper.prototype,ReactCompositeComponent.Mixin,{_instantiateReactComponent:instantiateReactComponent});var nextDebugID=1;module.exports=instantiateReactComponent; +},{"fbjs/lib/ExecutionEnvironment":210}],197:[function(require,module,exports){ +"use strict";function getDeclarationErrorAddendum(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function getDisplayName(e){var t=e._currentElement;return null==t?"#empty":"string"==typeof t||"number"==typeof t?"#text":"string"==typeof t.type?t.type:e.getName?e.getName()||"Unknown":t.type.displayName||t.type.name||"Unknown"}function isInternalComponentType(e){return"function"==typeof e&&"undefined"!=typeof e.prototype&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function instantiateReactComponent(e,t){var n;if(null===e||e===!1)n=ReactEmptyComponent.create(instantiateReactComponent);else if("object"==typeof e){var o=e;!o||"function"!=typeof o.type&&"string"!=typeof o.type?_prodInvariant("130",null==o.type?o.type:typeof o.type,getDeclarationErrorAddendum(o._owner)):void 0,"string"==typeof o.type?n=ReactHostComponent.createInternalComponent(o):isInternalComponentType(o.type)?(n=new o.type(o),n.getHostNode||(n.getHostNode=n.getNativeNode)):n=new ReactCompositeComponentWrapper(o)}else"string"==typeof e||"number"==typeof e?n=ReactHostComponent.createInstanceForText(e):_prodInvariant("131",typeof e);n._mountIndex=0,n._mountImage=null;return n}var _prodInvariant=require("./reactProdInvariant"),_assign=require("object-assign"),ReactCompositeComponent=require("./ReactCompositeComponent"),ReactEmptyComponent=require("./ReactEmptyComponent"),ReactHostComponent=require("./ReactHostComponent"),ReactInstrumentation=require("./ReactInstrumentation"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),ReactCompositeComponentWrapper=function(e){this.construct(e)};_assign(ReactCompositeComponentWrapper.prototype,ReactCompositeComponent.Mixin,{_instantiateReactComponent:instantiateReactComponent});var nextDebugID=1;module.exports=instantiateReactComponent; -},{"./ReactCompositeComponent":110,"./ReactEmptyComponent":137,"./ReactInstrumentation":145,"./ReactNativeComponent":150,"fbjs/lib/invariant":226,"fbjs/lib/warning":236,"object-assign":32}],201:[function(require,module,exports){ +},{"./ReactCompositeComponent":109,"./ReactEmptyComponent":132,"./ReactHostComponent":137,"./ReactInstrumentation":141,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232,"object-assign":31}],198:[function(require,module,exports){ "use strict";function isEventSupported(e,t){if(!ExecutionEnvironment.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,u=n in document;if(!u){var i=document.createElement("div");i.setAttribute(n,"return;"),u="function"==typeof i[n]}return!u&&useHasFeature&&"wheel"===e&&(u=document.implementation.hasFeature("Events.wheel","3.0")),u}var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),useHasFeature;ExecutionEnvironment.canUseDOM&&(useHasFeature=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0),module.exports=isEventSupported; -},{"fbjs/lib/ExecutionEnvironment":212}],202:[function(require,module,exports){ -"use strict";function isTextInputElement(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&supportedInputTypes[e.type]||"textarea"===t)}var supportedInputTypes={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};module.exports=isTextInputElement; +},{"fbjs/lib/ExecutionEnvironment":210}],199:[function(require,module,exports){ +"use strict";function isTextInputElement(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!supportedInputTypes[e.type]:"textarea"===t}var supportedInputTypes={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};module.exports=isTextInputElement; -},{}],203:[function(require,module,exports){ -"use strict";function onlyChild(e){return ReactElement.isValidElement(e)?void 0:invariant(!1),e}var ReactElement=require("./ReactElement"),invariant=require("fbjs/lib/invariant");module.exports=onlyChild; +},{}],200:[function(require,module,exports){ +"use strict";function onlyChild(e){return ReactElement.isValidElement(e)?void 0:_prodInvariant("23"),e}var _prodInvariant=require("./reactProdInvariant"),ReactElement=require("./ReactElement"),invariant=require("fbjs/lib/invariant");module.exports=onlyChild; -},{"./ReactElement":135,"fbjs/lib/invariant":226}],204:[function(require,module,exports){ +},{"./ReactElement":131,"./reactProdInvariant":202,"fbjs/lib/invariant":224}],201:[function(require,module,exports){ "use strict";function quoteAttributeValueForBrowser(e){return'"'+escapeTextContentForBrowser(e)+'"'}var escapeTextContentForBrowser=require("./escapeTextContentForBrowser");module.exports=quoteAttributeValueForBrowser; -},{"./escapeTextContentForBrowser":187}],205:[function(require,module,exports){ +},{"./escapeTextContentForBrowser":184}],202:[function(require,module,exports){ +"use strict";function reactProdInvariant(r){for(var e=arguments.length-1,o="Minified React error #"+r+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+r,n=0;n<e;n++)o+="&args[]="+encodeURIComponent(arguments[n+1]);o+=" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";var t=new Error(o);throw t.name="Invariant Violation",t.framesToPop=1,t}module.exports=reactProdInvariant; + +},{}],203:[function(require,module,exports){ "use strict";var ReactMount=require("./ReactMount");module.exports=ReactMount.renderSubtreeIntoContainer; -},{"./ReactMount":147}],206:[function(require,module,exports){ -"use strict";var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),WHITESPACE_TEST=/^[ \r\n\t\f]/,NONVISIBLE_TEST=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,createMicrosoftUnsafeLocalFunction=require("./createMicrosoftUnsafeLocalFunction"),setInnerHTML=createMicrosoftUnsafeLocalFunction(function(e,n){e.innerHTML=n});if(ExecutionEnvironment.canUseDOM){var testElement=document.createElement("div");testElement.innerHTML=" ",""===testElement.innerHTML&&(setInnerHTML=function(e,n){if(e.parentNode&&e.parentNode.replaceChild(e,e),WHITESPACE_TEST.test(n)||"<"===n[0]&&NONVISIBLE_TEST.test(n)){e.innerHTML=String.fromCharCode(65279)+n;var t=e.firstChild;1===t.data.length?e.removeChild(t):t.deleteData(0,1)}else e.innerHTML=n}),testElement=null}module.exports=setInnerHTML; +},{"./ReactMount":143}],204:[function(require,module,exports){ +"use strict";var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),DOMNamespaces=require("./DOMNamespaces"),WHITESPACE_TEST=/^[ \r\n\t\f]/,NONVISIBLE_TEST=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,createMicrosoftUnsafeLocalFunction=require("./createMicrosoftUnsafeLocalFunction"),reusableSVGContainer,setInnerHTML=createMicrosoftUnsafeLocalFunction(function(e,n){if(e.namespaceURI!==DOMNamespaces.svg||"innerHTML"in e)e.innerHTML=n;else{reusableSVGContainer=reusableSVGContainer||document.createElement("div"),reusableSVGContainer.innerHTML="<svg>"+n+"</svg>";for(var t=reusableSVGContainer.firstChild.childNodes,r=0;r<t.length;r++)e.appendChild(t[r])}});if(ExecutionEnvironment.canUseDOM){var testElement=document.createElement("div");testElement.innerHTML=" ",""===testElement.innerHTML&&(setInnerHTML=function(e,n){if(e.parentNode&&e.parentNode.replaceChild(e,e),WHITESPACE_TEST.test(n)||"<"===n[0]&&NONVISIBLE_TEST.test(n)){e.innerHTML=String.fromCharCode(65279)+n;var t=e.firstChild;1===t.data.length?e.removeChild(t):t.deleteData(0,1)}else e.innerHTML=n}),testElement=null}module.exports=setInnerHTML; -},{"./createMicrosoftUnsafeLocalFunction":185,"fbjs/lib/ExecutionEnvironment":212}],207:[function(require,module,exports){ -"use strict";var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),escapeTextContentForBrowser=require("./escapeTextContentForBrowser"),setInnerHTML=require("./setInnerHTML"),setTextContent=function(e,t){e.textContent=t};ExecutionEnvironment.canUseDOM&&("textContent"in document.documentElement||(setTextContent=function(e,t){setInnerHTML(e,escapeTextContentForBrowser(t))})),module.exports=setTextContent; +},{"./DOMNamespaces":84,"./createMicrosoftUnsafeLocalFunction":182,"fbjs/lib/ExecutionEnvironment":210}],205:[function(require,module,exports){ +"use strict";var ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),escapeTextContentForBrowser=require("./escapeTextContentForBrowser"),setInnerHTML=require("./setInnerHTML"),setTextContent=function(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t};ExecutionEnvironment.canUseDOM&&("textContent"in document.documentElement||(setTextContent=function(e,t){setInnerHTML(e,escapeTextContentForBrowser(t))})),module.exports=setTextContent; -},{"./escapeTextContentForBrowser":187,"./setInnerHTML":206,"fbjs/lib/ExecutionEnvironment":212}],208:[function(require,module,exports){ +},{"./escapeTextContentForBrowser":184,"./setInnerHTML":204,"fbjs/lib/ExecutionEnvironment":210}],206:[function(require,module,exports){ "use strict";function shouldUpdateReactComponent(e,t){var n=null===e||e===!1,o=null===t||t===!1;if(n||o)return n===o;var r=typeof e,u=typeof t;return"string"===r||"number"===r?"string"===u||"number"===u:"object"===u&&e.type===t.type&&e.key===t.key}module.exports=shouldUpdateReactComponent; -},{}],209:[function(require,module,exports){ -"use strict";function getComponentKey(e,r){return e&&"object"==typeof e&&null!=e.key?KeyEscapeUtils.escape(e.key):r.toString(36)}function traverseAllChildrenImpl(e,r,t,n){var l=typeof e;if("undefined"!==l&&"boolean"!==l||(e=null),null===e||"string"===l||"number"===l||ReactElement.isValidElement(e))return t(n,e,""===r?SEPARATOR+getComponentKey(e,0):r),1;var a,i,o=0,s=""===r?SEPARATOR:r+SUBSEPARATOR;if(Array.isArray(e))for(var u=0;u<e.length;u++)a=e[u],i=s+getComponentKey(a,u),o+=traverseAllChildrenImpl(a,i,t,n);else{var A=getIteratorFn(e);if(A){var p,v=A.call(e);if(A!==e.entries)for(var c=0;!(p=v.next()).done;)a=p.value,i=s+getComponentKey(a,c++),o+=traverseAllChildrenImpl(a,i,t,n);else for(;!(p=v.next()).done;){var R=p.value;R&&(a=R[1],i=s+KeyEscapeUtils.escape(R[0])+SUBSEPARATOR+getComponentKey(a,0),o+=traverseAllChildrenImpl(a,i,t,n))}}else if("object"===l){String(e);invariant(!1)}}return o}function traverseAllChildren(e,r,t){return null==e?0:traverseAllChildrenImpl(e,"",r,t)}var ReactCurrentOwner=require("./ReactCurrentOwner"),ReactElement=require("./ReactElement"),getIteratorFn=require("./getIteratorFn"),invariant=require("fbjs/lib/invariant"),KeyEscapeUtils=require("./KeyEscapeUtils"),warning=require("fbjs/lib/warning"),SEPARATOR=".",SUBSEPARATOR=":",didWarnAboutMaps=!1;module.exports=traverseAllChildren; +},{}],207:[function(require,module,exports){ +"use strict";function getComponentKey(e,r){return e&&"object"==typeof e&&null!=e.key?KeyEscapeUtils.escape(e.key):r.toString(36)}function traverseAllChildrenImpl(e,r,t,n){var l=typeof e;if("undefined"!==l&&"boolean"!==l||(e=null),null===e||"string"===l||"number"===l||ReactElement.isValidElement(e))return t(n,e,""===r?SEPARATOR+getComponentKey(e,0):r),1;var a,i,o=0,s=""===r?SEPARATOR:r+SUBSEPARATOR;if(Array.isArray(e))for(var u=0;u<e.length;u++)a=e[u],i=s+getComponentKey(a,u),o+=traverseAllChildrenImpl(a,i,t,n);else{var c=getIteratorFn(e);if(c){var v,p=c.call(e);if(c!==e.entries)for(var A=0;!(v=p.next()).done;)a=v.value,i=s+getComponentKey(a,A++),o+=traverseAllChildrenImpl(a,i,t,n);else for(;!(v=p.next()).done;){var d=v.value;d&&(a=d[1],i=s+KeyEscapeUtils.escape(d[0])+SUBSEPARATOR+getComponentKey(a,0),o+=traverseAllChildrenImpl(a,i,t,n))}}else if("object"===l){var y="",R=String(e);_prodInvariant("31","[object Object]"===R?"object with keys {"+Object.keys(e).join(", ")+"}":R,y)}}return o}function traverseAllChildren(e,r,t){return null==e?0:traverseAllChildrenImpl(e,"",r,t)}var _prodInvariant=require("./reactProdInvariant"),ReactCurrentOwner=require("./ReactCurrentOwner"),ReactElement=require("./ReactElement"),getIteratorFn=require("./getIteratorFn"),invariant=require("fbjs/lib/invariant"),KeyEscapeUtils=require("./KeyEscapeUtils"),warning=require("fbjs/lib/warning"),SEPARATOR=".",SUBSEPARATOR=":",didWarnAboutMaps=!1;module.exports=traverseAllChildren; -},{"./KeyEscapeUtils":99,"./ReactCurrentOwner":111,"./ReactElement":135,"./getIteratorFn":195,"fbjs/lib/invariant":226,"fbjs/lib/warning":236}],210:[function(require,module,exports){ +},{"./KeyEscapeUtils":98,"./ReactCurrentOwner":110,"./ReactElement":131,"./getIteratorFn":193,"./reactProdInvariant":202,"fbjs/lib/invariant":224,"fbjs/lib/warning":232}],208:[function(require,module,exports){ "use strict";var _assign=require("object-assign"),emptyFunction=require("fbjs/lib/emptyFunction"),warning=require("fbjs/lib/warning"),validateDOMNesting=emptyFunction,specialTags,inScopeTags,buttonScopeTags,impliedEndTags,emptyAncestorInfo,updatedAncestorInfo,isTagValidWithParent,findInvalidAncestorForTag,findOwnerStack,didWarn;module.exports=validateDOMNesting; -},{"fbjs/lib/emptyFunction":218,"fbjs/lib/warning":236,"object-assign":32}],211:[function(require,module,exports){ +},{"fbjs/lib/emptyFunction":216,"fbjs/lib/warning":232,"object-assign":31}],209:[function(require,module,exports){ "use strict";var emptyFunction=require("./emptyFunction"),EventListener={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent("on"+t,n),{remove:function(){e.detachEvent("on"+t,n)}}):void 0},capture:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!0),{remove:function(){e.removeEventListener(t,n,!0)}}):{remove:emptyFunction}},registerDefault:function(){}};module.exports=EventListener; -},{"./emptyFunction":218}],212:[function(require,module,exports){ +},{"./emptyFunction":216}],210:[function(require,module,exports){ "use strict";var canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement),ExecutionEnvironment={canUseDOM:canUseDOM,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:canUseDOM&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:canUseDOM&&!!window.screen,isInWorker:!canUseDOM};module.exports=ExecutionEnvironment; -},{}],213:[function(require,module,exports){ +},{}],211:[function(require,module,exports){ "use strict";function camelize(e){return e.replace(_hyphenPattern,function(e,t){return t.toUpperCase()})}var _hyphenPattern=/-(.)/g;module.exports=camelize; -},{}],214:[function(require,module,exports){ +},{}],212:[function(require,module,exports){ "use strict";function camelizeStyleName(e){return camelize(e.replace(msPattern,"ms-"))}var camelize=require("./camelize"),msPattern=/^-ms-/;module.exports=camelizeStyleName; -},{"./camelize":213}],215:[function(require,module,exports){ +},{"./camelize":211}],213:[function(require,module,exports){ "use strict";function containsNode(o,e){return!(!o||!e)&&(o===e||!isTextNode(o)&&(isTextNode(e)?containsNode(o,e.parentNode):"contains"in o?o.contains(e):!!o.compareDocumentPosition&&!!(16&o.compareDocumentPosition(e))))}var isTextNode=require("./isTextNode");module.exports=containsNode; -},{"./isTextNode":228}],216:[function(require,module,exports){ -"use strict";function toArray(r){var t=r.length;if(Array.isArray(r)||"object"!=typeof r&&"function"!=typeof r?invariant(!1):void 0,"number"!=typeof t?invariant(!1):void 0,0===t||t-1 in r?void 0:invariant(!1),"function"==typeof r.callee?invariant(!1):void 0,r.hasOwnProperty)try{return Array.prototype.slice.call(r)}catch(e){}for(var a=Array(t),n=0;n<t;n++)a[n]=r[n];return a}function hasArrayNature(r){return!!r&&("object"==typeof r||"function"==typeof r)&&"length"in r&&!("setInterval"in r)&&"number"!=typeof r.nodeType&&(Array.isArray(r)||"callee"in r||"item"in r)}function createArrayFromMixed(r){return hasArrayNature(r)?Array.isArray(r)?r.slice():toArray(r):[r]}var invariant=require("./invariant");module.exports=createArrayFromMixed; +},{"./isTextNode":226}],214:[function(require,module,exports){ +"use strict";function toArray(r){var t=r.length;if(Array.isArray(r)||"object"!=typeof r&&"function"!=typeof r?invariant(!1):void 0,"number"!=typeof t?invariant(!1):void 0,0===t||t-1 in r?void 0:invariant(!1),"function"==typeof r.callee?invariant(!1):void 0,r.hasOwnProperty)try{return Array.prototype.slice.call(r)}catch(r){}for(var e=Array(t),a=0;a<t;a++)e[a]=r[a];return e}function hasArrayNature(r){return!!r&&("object"==typeof r||"function"==typeof r)&&"length"in r&&!("setInterval"in r)&&"number"!=typeof r.nodeType&&(Array.isArray(r)||"callee"in r||"item"in r)}function createArrayFromMixed(r){return hasArrayNature(r)?Array.isArray(r)?r.slice():toArray(r):[r]}var invariant=require("./invariant");module.exports=createArrayFromMixed; -},{"./invariant":226}],217:[function(require,module,exports){ +},{"./invariant":224}],215:[function(require,module,exports){ "use strict";function getNodeName(e){var r=e.match(nodeNamePattern);return r&&r[1].toLowerCase()}function createNodesFromMarkup(e,r){var a=dummyNode;dummyNode?void 0:invariant(!1);var t=getNodeName(e),n=t&&getMarkupWrap(t);if(n){a.innerHTML=n[1]+e+n[2];for(var i=n[0];i--;)a=a.lastChild}else a.innerHTML=e;var o=a.getElementsByTagName("script");o.length&&(r?void 0:invariant(!1),createArrayFromMixed(o).forEach(r));for(var d=Array.from(a.childNodes);a.lastChild;)a.removeChild(a.lastChild);return d}var ExecutionEnvironment=require("./ExecutionEnvironment"),createArrayFromMixed=require("./createArrayFromMixed"),getMarkupWrap=require("./getMarkupWrap"),invariant=require("./invariant"),dummyNode=ExecutionEnvironment.canUseDOM?document.createElement("div"):null,nodeNamePattern=/^\s*<(\w+)/;module.exports=createNodesFromMarkup; -},{"./ExecutionEnvironment":212,"./createArrayFromMixed":216,"./getMarkupWrap":222,"./invariant":226}],218:[function(require,module,exports){ +},{"./ExecutionEnvironment":210,"./createArrayFromMixed":214,"./getMarkupWrap":220,"./invariant":224}],216:[function(require,module,exports){ "use strict";function makeEmptyFunction(t){return function(){return t}}var emptyFunction=function(){};emptyFunction.thatReturns=makeEmptyFunction,emptyFunction.thatReturnsFalse=makeEmptyFunction(!1),emptyFunction.thatReturnsTrue=makeEmptyFunction(!0),emptyFunction.thatReturnsNull=makeEmptyFunction(null),emptyFunction.thatReturnsThis=function(){return this},emptyFunction.thatReturnsArgument=function(t){return t},module.exports=emptyFunction; -},{}],219:[function(require,module,exports){ +},{}],217:[function(require,module,exports){ "use strict";var emptyObject={};module.exports=emptyObject; -},{}],220:[function(require,module,exports){ -"use strict";function focusNode(o){try{o.focus()}catch(c){}}module.exports=focusNode; +},{}],218:[function(require,module,exports){ +"use strict";function focusNode(o){try{o.focus()}catch(o){}}module.exports=focusNode; -},{}],221:[function(require,module,exports){ +},{}],219:[function(require,module,exports){ "use strict";function getActiveElement(){if("undefined"==typeof document)return null;try{return document.activeElement||document.body}catch(e){return document.body}}module.exports=getActiveElement; -},{}],222:[function(require,module,exports){ +},{}],220:[function(require,module,exports){ "use strict";function getMarkupWrap(e){return dummyNode?void 0:invariant(!1),markupWrap.hasOwnProperty(e)||(e="*"),shouldWrap.hasOwnProperty(e)||("*"===e?dummyNode.innerHTML="<link />":dummyNode.innerHTML="<"+e+"></"+e+">",shouldWrap[e]=!dummyNode.firstChild),shouldWrap[e]?markupWrap[e]:null}var ExecutionEnvironment=require("./ExecutionEnvironment"),invariant=require("./invariant"),dummyNode=ExecutionEnvironment.canUseDOM?document.createElement("div"):null,shouldWrap={},selectWrap=[1,'<select multiple="true">',"</select>"],tableWrap=[1,"<table>","</table>"],trWrap=[3,"<table><tbody><tr>","</tr></tbody></table>"],svgWrap=[1,'<svg xmlns="http://www.w3.org/2000/svg">',"</svg>"],markupWrap={"*":[1,"?<div>","</div>"],area:[1,"<map>","</map>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],legend:[1,"<fieldset>","</fieldset>"],param:[1,"<object>","</object>"],tr:[2,"<table><tbody>","</tbody></table>"],optgroup:selectWrap,option:selectWrap,caption:tableWrap,colgroup:tableWrap,tbody:tableWrap,tfoot:tableWrap,thead:tableWrap,td:trWrap,th:trWrap},svgElements=["circle","clipPath","defs","ellipse","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","text","tspan"];svgElements.forEach(function(e){markupWrap[e]=svgWrap,shouldWrap[e]=!0}),module.exports=getMarkupWrap; -},{"./ExecutionEnvironment":212,"./invariant":226}],223:[function(require,module,exports){ +},{"./ExecutionEnvironment":210,"./invariant":224}],221:[function(require,module,exports){ "use strict";function getUnboundedScrollPosition(o){return o===window?{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}:{x:o.scrollLeft,y:o.scrollTop}}module.exports=getUnboundedScrollPosition; -},{}],224:[function(require,module,exports){ +},{}],222:[function(require,module,exports){ "use strict";function hyphenate(e){return e.replace(_uppercasePattern,"-$1").toLowerCase()}var _uppercasePattern=/([A-Z])/g;module.exports=hyphenate; -},{}],225:[function(require,module,exports){ +},{}],223:[function(require,module,exports){ "use strict";function hyphenateStyleName(e){return hyphenate(e).replace(msPattern,"-ms-")}var hyphenate=require("./hyphenate"),msPattern=/^ms-/;module.exports=hyphenateStyleName; -},{"./hyphenate":224}],226:[function(require,module,exports){ +},{"./hyphenate":222}],224:[function(require,module,exports){ "use strict";function invariant(e,n,r,i,o,a,t,f){if(!e){var s;if(void 0===n)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var d=[r,i,o,a,t,f],l=0;s=new Error(n.replace(/%s/g,function(){return d[l++]})),s.name="Invariant Violation"}throw s.framesToPop=1,s}}module.exports=invariant; -},{}],227:[function(require,module,exports){ +},{}],225:[function(require,module,exports){ "use strict";function isNode(e){return!(!e||!("function"==typeof Node?e instanceof Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName))}module.exports=isNode; -},{}],228:[function(require,module,exports){ +},{}],226:[function(require,module,exports){ "use strict";function isTextNode(e){return isNode(e)&&3==e.nodeType}var isNode=require("./isNode");module.exports=isTextNode; -},{"./isNode":227}],229:[function(require,module,exports){ +},{"./isNode":225}],227:[function(require,module,exports){ "use strict";var invariant=require("./invariant"),keyMirror=function(r){var i,n={};r instanceof Object&&!Array.isArray(r)?void 0:invariant(!1);for(i in r)r.hasOwnProperty(i)&&(n[i]=i);return n};module.exports=keyMirror; -},{"./invariant":226}],230:[function(require,module,exports){ +},{"./invariant":224}],228:[function(require,module,exports){ "use strict";var keyOf=function(r){var e;for(e in r)if(r.hasOwnProperty(e))return e;return null};module.exports=keyOf; -},{}],231:[function(require,module,exports){ +},{}],229:[function(require,module,exports){ "use strict";function mapObject(r,t,e){if(!r)return null;var a={};for(var n in r)hasOwnProperty.call(r,n)&&(a[n]=t.call(e,r[n],n,r));return a}var hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=mapObject; -},{}],232:[function(require,module,exports){ +},{}],230:[function(require,module,exports){ "use strict";function memoizeStringOnly(n){var r={};return function(t){return r.hasOwnProperty(t)||(r[t]=n.call(this,t)),r[t]}}module.exports=memoizeStringOnly; -},{}],233:[function(require,module,exports){ -"use strict";var ExecutionEnvironment=require("./ExecutionEnvironment"),performance;ExecutionEnvironment.canUseDOM&&(performance=window.performance||window.msPerformance||window.webkitPerformance),module.exports=performance||{}; - -},{"./ExecutionEnvironment":212}],234:[function(require,module,exports){ -"use strict";var performance=require("./performance"),performanceNow;performanceNow=performance.now?function(){return performance.now()}:function(){return Date.now()},module.exports=performanceNow; - -},{"./performance":233}],235:[function(require,module,exports){ +},{}],231:[function(require,module,exports){ "use strict";function is(t,e){return t===e?0!==t||1/t===1/e:t!==t&&e!==e}function shallowEqual(t,e){if(is(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;var r=Object.keys(t),n=Object.keys(e);if(r.length!==n.length)return!1;for(var l=0;l<r.length;l++)if(!hasOwnProperty.call(e,r[l])||!is(t[r[l]],e[r[l]]))return!1;return!0}var hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=shallowEqual; -},{}],236:[function(require,module,exports){ +},{}],232:[function(require,module,exports){ "use strict";var emptyFunction=require("./emptyFunction"),warning=emptyFunction;module.exports=warning; -},{"./emptyFunction":218}],237:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function applyMiddleware(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return function(e){return function(r,n,o){var a=e(r,n,o),u=a.dispatch,p=[],i={getState:a.getState,dispatch:function(e){return u(e)}};return p=t.map(function(e){return e(i)}),u=_compose2["default"].apply(void 0,p)(a.dispatch),_extends({},a,{dispatch:u})}}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};exports["default"]=applyMiddleware;var _compose=require("./compose"),_compose2=_interopRequireDefault(_compose); +},{"./emptyFunction":216}],233:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function applyMiddleware(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return function(e){return function(r,n,o){var a=e(r,n,o),u=a.dispatch,p=[],i={getState:a.getState,dispatch:function(e){return u(e)}};return p=t.map(function(e){return e(i)}),u=_compose2.default.apply(void 0,p)(a.dispatch),_extends({},a,{dispatch:u})}}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};exports.default=applyMiddleware;var _compose=require("./compose"),_compose2=_interopRequireDefault(_compose); -},{"./compose":240}],238:[function(require,module,exports){ -"use strict";function bindActionCreator(t,o){return function(){return o(t.apply(void 0,arguments))}}function bindActionCreators(t,o){if("function"==typeof t)return bindActionCreator(t,o);if("object"!=typeof t||null===t)throw new Error("bindActionCreators expected an object or a function, instead received "+(null===t?"null":typeof t)+'. Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?');for(var r=Object.keys(t),n={},e=0;e<r.length;e++){var i=r[e],c=t[i];"function"==typeof c&&(n[i]=bindActionCreator(c,o))}return n}exports.__esModule=!0,exports["default"]=bindActionCreators; +},{"./compose":236}],234:[function(require,module,exports){ +"use strict";function bindActionCreator(t,o){return function(){return o(t.apply(void 0,arguments))}}function bindActionCreators(t,o){if("function"==typeof t)return bindActionCreator(t,o);if("object"!=typeof t||null===t)throw new Error("bindActionCreators expected an object or a function, instead received "+(null===t?"null":typeof t)+'. Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?');for(var r=Object.keys(t),n={},e=0;e<r.length;e++){var i=r[e],c=t[i];"function"==typeof c&&(n[i]=bindActionCreator(c,o))}return n}exports.__esModule=!0,exports.default=bindActionCreators; -},{}],239:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function getUndefinedStateErrorMessage(e,t){var n=t&&t.type,r=n&&'"'+n.toString()+'"'||"an action";return"Given action "+r+', reducer "'+e+'" returned undefined. To ignore an action, you must explicitly return the previous state.'}function getUnexpectedStateShapeWarningMessage(e,t,n){var r=Object.keys(t),i=n&&n.type===_createStore.ActionTypes.INIT?"initialState argument passed to createStore":"previous state received by the reducer";if(0===r.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";if(!(0,_isPlainObject2["default"])(e))return"The "+i+' has unexpected type of "'+{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1]+'". Expected argument to be an object with the following '+('keys: "'+r.join('", "')+'"');var a=Object.keys(e).filter(function(e){return!t.hasOwnProperty(e)});return a.length>0?"Unexpected "+(a.length>1?"keys":"key")+" "+('"'+a.join('", "')+'" found in '+i+". ")+"Expected to find one of the known reducer keys instead: "+('"'+r.join('", "')+'". Unexpected keys will be ignored.'):void 0}function assertReducerSanity(e){Object.keys(e).forEach(function(t){var n=e[t],r=n(void 0,{type:_createStore.ActionTypes.INIT});if("undefined"==typeof r)throw new Error('Reducer "'+t+'" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined.');var i="@@redux/PROBE_UNKNOWN_ACTION_"+Math.random().toString(36).substring(7).split("").join(".");if("undefined"==typeof n(void 0,{type:i}))throw new Error('Reducer "'+t+'" returned undefined when probed with a random type. '+("Don't try to handle "+_createStore.ActionTypes.INIT+' or other actions in "redux/*" ')+"namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined.")})}function combineReducers(e){for(var t=Object.keys(e),n={},r=0;r<t.length;r++){var i=t[r];"function"==typeof e[i]&&(n[i]=e[i])}var a,o=Object.keys(n);try{assertReducerSanity(n)}catch(u){a=u}return function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=arguments[1];if(a)throw a;for(var r=!1,i={},u=0;u<o.length;u++){var s=o[u],d=n[s],c=e[s],f=d(c,t);if("undefined"==typeof f){var l=getUndefinedStateErrorMessage(s,t);throw new Error(l)}i[s]=f,r=r||f!==c}return r?i:e}}exports.__esModule=!0,exports["default"]=combineReducers;var _createStore=require("./createStore"),_isPlainObject=require("lodash/isPlainObject"),_isPlainObject2=_interopRequireDefault(_isPlainObject),_warning=require("./utils/warning"),_warning2=_interopRequireDefault(_warning); +},{}],235:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function getUndefinedStateErrorMessage(e,t){var n=t&&t.type,r=n&&'"'+n.toString()+'"'||"an action";return"Given action "+r+', reducer "'+e+'" returned undefined. To ignore an action, you must explicitly return the previous state.'}function getUnexpectedStateShapeWarningMessage(e,t,n){var r=Object.keys(t),i=n&&n.type===_createStore.ActionTypes.INIT?"initialState argument passed to createStore":"previous state received by the reducer";if(0===r.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";if(!(0,_isPlainObject2.default)(e))return"The "+i+' has unexpected type of "'+{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1]+'". Expected argument to be an object with the following '+('keys: "'+r.join('", "')+'"');var a=Object.keys(e).filter(function(e){return!t.hasOwnProperty(e)});return a.length>0?"Unexpected "+(a.length>1?"keys":"key")+" "+('"'+a.join('", "')+'" found in '+i+". ")+"Expected to find one of the known reducer keys instead: "+('"'+r.join('", "')+'". Unexpected keys will be ignored.'):void 0}function assertReducerSanity(e){Object.keys(e).forEach(function(t){var n=e[t],r=n(void 0,{type:_createStore.ActionTypes.INIT});if("undefined"==typeof r)throw new Error('Reducer "'+t+'" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined.');var i="@@redux/PROBE_UNKNOWN_ACTION_"+Math.random().toString(36).substring(7).split("").join(".");if("undefined"==typeof n(void 0,{type:i}))throw new Error('Reducer "'+t+'" returned undefined when probed with a random type. '+("Don't try to handle "+_createStore.ActionTypes.INIT+' or other actions in "redux/*" ')+"namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined.")})}function combineReducers(e){for(var t=Object.keys(e),n={},r=0;r<t.length;r++){var i=t[r];"function"==typeof e[i]&&(n[i]=e[i])}var a,o=Object.keys(n);try{assertReducerSanity(n)}catch(e){a=e}return function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=arguments[1];if(a)throw a;for(var r=!1,i={},u=0;u<o.length;u++){var s=o[u],d=n[s],c=e[s],f=d(c,t);if("undefined"==typeof f){var l=getUndefinedStateErrorMessage(s,t);throw new Error(l)}i[s]=f,r=r||f!==c}return r?i:e}}exports.__esModule=!0,exports.default=combineReducers;var _createStore=require("./createStore"),_isPlainObject=require("lodash/isPlainObject"),_isPlainObject2=_interopRequireDefault(_isPlainObject),_warning=require("./utils/warning"),_warning2=_interopRequireDefault(_warning); -},{"./createStore":241,"./utils/warning":242,"lodash/isPlainObject":31}],240:[function(require,module,exports){ -"use strict";function compose(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];if(0===r.length)return function(e){return e};var n=function(){var e=r[r.length-1],t=r.slice(0,-1);return{v:function(){return t.reduceRight(function(e,r){return r(e)},e.apply(void 0,arguments))}}}();return"object"==typeof n?n.v:void 0}exports.__esModule=!0,exports["default"]=compose; +},{"./createStore":237,"./utils/warning":238,"lodash/isPlainObject":30}],236:[function(require,module,exports){ +"use strict";function compose(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];if(0===r.length)return function(e){return e};var n=function(){var e=r[r.length-1],t=r.slice(0,-1);return{v:function(){return t.reduceRight(function(e,r){return r(e)},e.apply(void 0,arguments))}}}();return"object"==typeof n?n.v:void 0}exports.__esModule=!0,exports.default=compose; -},{}],241:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createStore(e,t,r){function n(){l===b&&(l=b.slice())}function o(){return p}function i(e){if("function"!=typeof e)throw new Error("Expected listener to be a function.");var t=!0;return n(),l.push(e),function(){if(t){t=!1,n();var r=l.indexOf(e);l.splice(r,1)}}}function c(e){if(!(0,_isPlainObject2["default"])(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if("undefined"==typeof e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(d)throw new Error("Reducers may not dispatch actions.");try{d=!0,p=a(p,e)}finally{d=!1}for(var t=b=l,r=0;r<t.length;r++)t[r]();return e}function u(e){if("function"!=typeof e)throw new Error("Expected the nextReducer to be a function.");a=e,c({type:ActionTypes.INIT})}function s(){var e,t=i;return e={subscribe:function(e){function r(){e.next&&e.next(o())}if("object"!=typeof e)throw new TypeError("Expected the observer to be an object.");r();var n=t(r);return{unsubscribe:n}}},e[_symbolObservable2["default"]]=function(){return this},e}var f;if("function"==typeof t&&"undefined"==typeof r&&(r=t,t=void 0),"undefined"!=typeof r){if("function"!=typeof r)throw new Error("Expected the enhancer to be a function.");return r(createStore)(e,t)}if("function"!=typeof e)throw new Error("Expected the reducer to be a function.");var a=e,p=t,b=[],l=b,d=!1;return c({type:ActionTypes.INIT}),f={dispatch:c,subscribe:i,getState:o,replaceReducer:u},f[_symbolObservable2["default"]]=s,f}exports.__esModule=!0,exports.ActionTypes=void 0,exports["default"]=createStore;var _isPlainObject=require("lodash/isPlainObject"),_isPlainObject2=_interopRequireDefault(_isPlainObject),_symbolObservable=require("symbol-observable"),_symbolObservable2=_interopRequireDefault(_symbolObservable),ActionTypes=exports.ActionTypes={INIT:"@@redux/INIT"}; +},{}],237:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function createStore(e,t,r){function n(){l===b&&(l=b.slice())}function o(){return p}function i(e){if("function"!=typeof e)throw new Error("Expected listener to be a function.");var t=!0;return n(),l.push(e),function(){if(t){t=!1,n();var r=l.indexOf(e);l.splice(r,1)}}}function c(e){if(!(0,_isPlainObject2.default)(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if("undefined"==typeof e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(d)throw new Error("Reducers may not dispatch actions.");try{d=!0,p=a(p,e)}finally{d=!1}for(var t=b=l,r=0;r<t.length;r++)t[r]();return e}function u(e){if("function"!=typeof e)throw new Error("Expected the nextReducer to be a function.");a=e,c({type:ActionTypes.INIT})}function s(){var e,t=i;return e={subscribe:function(e){function r(){e.next&&e.next(o())}if("object"!=typeof e)throw new TypeError("Expected the observer to be an object.");r();var n=t(r);return{unsubscribe:n}}},e[_symbolObservable2.default]=function(){return this},e}var f;if("function"==typeof t&&"undefined"==typeof r&&(r=t,t=void 0),"undefined"!=typeof r){if("function"!=typeof r)throw new Error("Expected the enhancer to be a function.");return r(createStore)(e,t)}if("function"!=typeof e)throw new Error("Expected the reducer to be a function.");var a=e,p=t,b=[],l=b,d=!1;return c({type:ActionTypes.INIT}),f={dispatch:c,subscribe:i,getState:o,replaceReducer:u},f[_symbolObservable2.default]=s,f}exports.__esModule=!0,exports.ActionTypes=void 0,exports.default=createStore;var _isPlainObject=require("lodash/isPlainObject"),_isPlainObject2=_interopRequireDefault(_isPlainObject),_symbolObservable=require("symbol-observable"),_symbolObservable2=_interopRequireDefault(_symbolObservable),ActionTypes=exports.ActionTypes={INIT:"@@redux/INIT"}; -},{"lodash/isPlainObject":31,"symbol-observable":244}],242:[function(require,module,exports){ -"use strict";function warning(o){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(o);try{throw new Error(o)}catch(e){}}exports.__esModule=!0,exports["default"]=warning; +},{"lodash/isPlainObject":30,"symbol-observable":241}],238:[function(require,module,exports){ +"use strict";function warning(o){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(o);try{throw new Error(o)}catch(o){}}exports.__esModule=!0,exports.default=warning; -},{}],243:[function(require,module,exports){ +},{}],239:[function(require,module,exports){ +function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function isArrayLike(e){return null!=e&&isLength(getLength(e))}function isIndex(e,t){return e="number"==typeof e||reIsUint.test(e)?+e:-1,t=null==t?MAX_SAFE_INTEGER:t,e>-1&&e%1==0&&e<t}function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=MAX_SAFE_INTEGER}function shimKeys(e){for(var t=keysIn(e),r=t.length,n=r&&e.length,s=!!n&&isLength(n)&&(isArray(e)||isArguments(e)),o=-1,i=[];++o<r;){var u=t[o];(s&&isIndex(u,n)||hasOwnProperty.call(e,u))&&i.push(u)}return i}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function keysIn(e){if(null==e)return[];isObject(e)||(e=Object(e));var t=e.length;t=t&&isLength(t)&&(isArray(e)||isArguments(e))&&t||0;for(var r=e.constructor,n=-1,s="function"==typeof r&&r.prototype===e,o=Array(t),i=t>0;++n<t;)o[n]=n+"";for(var u in e)i&&isIndex(u,t)||"constructor"==u&&(s||!hasOwnProperty.call(e,u))||o.push(u);return o}var getNative=require("lodash._getnative"),isArguments=require("lodash.isarguments"),isArray=require("lodash.isarray"),reIsUint=/^\d+$/,objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,nativeKeys=getNative(Object,"keys"),MAX_SAFE_INTEGER=9007199254740991,getLength=baseProperty("length"),keys=nativeKeys?function(e){var t=null==e?void 0:e.constructor;return"function"==typeof t&&t.prototype===e||"function"!=typeof e&&isArrayLike(e)?shimKeys(e):isObject(e)?nativeKeys(e):[]}:shimKeys;module.exports=keys; + +},{"lodash._getnative":24,"lodash.isarguments":25,"lodash.isarray":26}],240:[function(require,module,exports){ "use strict";module.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}; -},{}],244:[function(require,module,exports){ +},{}],241:[function(require,module,exports){ (function (global){ "use strict";module.exports=require("./ponyfill")(global||window||this); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./ponyfill":245}],245:[function(require,module,exports){ +},{"./ponyfill":242}],242:[function(require,module,exports){ "use strict";module.exports=function(e){var b,o=e.Symbol;return"function"==typeof o?o.observable?b=o.observable:(b=o("observable"),o.observable=b):b="@@observable",b}; -},{}],246:[function(require,module,exports){ +},{}],243:[function(require,module,exports){ "use strict";var warning=function(){};module.exports=warning; },{}],"classnames":[function(require,module,exports){ @@ -746,14 +737,14 @@ function isPlainObject(t){if(!isObjectLike(t)||objectToString.call(t)!=objectTag module.exports.Dispatcher=require("./lib/Dispatcher"); },{"./lib/Dispatcher":5}],"jquery":[function(require,module,exports){ -!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=oe.type(e);return"function"!==n&&!oe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(oe.isFunction(t))return oe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return oe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(ge.test(t))return oe.filter(t,e,n);t=oe.filter(t,e)}return oe.grep(e,function(e){return Z.call(t,e)>-1!==n})}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function o(e){var t={};return oe.each(e.match(we)||[],function(e,n){t[n]=!0}),t}function s(){G.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s),oe.ready()}function a(){this.expando=oe.expando+a.uid++}function u(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(je,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Se.test(n)?oe.parseJSON(n):n)}catch(i){}Ne.set(e,t,n)}else n=void 0;return n}function l(e,t,n,r){var i,o=1,s=20,a=r?function(){return r.cur()}:function(){return oe.css(e,t,"")},u=a(),l=n&&n[3]||(oe.cssNumber[t]?"":"px"),c=(oe.cssNumber[t]||"px"!==l&&+u)&&Ae.exec(oe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,oe.style(e,t,c+l);while(o!==(o=a()/u)&&1!==o&&--s)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function c(e,t){var n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&oe.nodeName(e,t)?oe.merge([e],n):n}function f(e,t){for(var n=0,r=e.length;n<r;n++)Ee.set(e[n],"globalEval",!t||Ee.get(t[n],"globalEval"))}function p(e,t,n,r,i){for(var o,s,a,u,l,p,d=t.createDocumentFragment(),h=[],g=0,v=e.length;g<v;g++)if(o=e[g],o||0===o)if("object"===oe.type(o))oe.merge(h,o.nodeType?[o]:o);else if(Re.test(o)){for(s=s||d.appendChild(t.createElement("div")),a=(Oe.exec(o)||["",""])[1].toLowerCase(),u=Pe[a]||Pe._default,s.innerHTML=u[1]+oe.htmlPrefilter(o)+u[2],p=u[0];p--;)s=s.lastChild;oe.merge(h,s.childNodes),s=d.firstChild,s.textContent=""}else h.push(t.createTextNode(o));for(d.textContent="",g=0;o=h[g++];)if(r&&oe.inArray(o,r)>-1)i&&i.push(o);else if(l=oe.contains(o.ownerDocument,o),s=c(d.appendChild(o),"script"),l&&f(s),n)for(p=0;o=s[p++];)Fe.test(o.type||"")&&n.push(o);return d}function d(){return!0}function h(){return!1}function g(){try{return G.activeElement}catch(e){}}function v(e,t,n,r,i,o){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)v(e,a,n,r,t[a],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=h;else if(!i)return e;return 1===o&&(s=i,i=function(e){return oe().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=oe.guid++)),e.each(function(){oe.event.add(this,t,i,r,n)})}function m(e,t){return oe.nodeName(e,"table")&&oe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function y(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function x(e){var t=Xe.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function b(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(Ee.hasData(e)&&(o=Ee.access(e),s=Ee.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)oe.event.add(t,i,l[i][n])}Ne.hasData(e)&&(a=Ne.access(e),u=oe.extend({},a),Ne.set(t,u))}}function w(e,t){var n=t.nodeName.toLowerCase();"input"===n&&He.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function T(e,t,n,r){t=J.apply([],t);var i,o,s,a,u,l,f=0,d=e.length,h=d-1,g=t[0],v=oe.isFunction(g);if(v||d>1&&"string"==typeof g&&!re.checkClone&&_e.test(g))return e.each(function(i){var o=e.eq(i);v&&(t[0]=g.call(this,i,o.html())),T(o,t,n,r)});if(d&&(i=p(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=oe.map(c(i,"script"),y),a=s.length;f<d;f++)u=i,f!==h&&(u=oe.clone(u,!0,!0),a&&oe.merge(s,c(u,"script"))),n.call(e[f],u,f);if(a)for(l=s[s.length-1].ownerDocument,oe.map(s,x),f=0;f<a;f++)u=s[f],Fe.test(u.type||"")&&!Ee.access(u,"globalEval")&&oe.contains(l,u)&&(u.src?oe._evalUrl&&oe._evalUrl(u.src):oe.globalEval(u.textContent.replace(ze,"")))}return e}function C(e,t,n){for(var r,i=t?oe.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||oe.cleanData(c(r)),r.parentNode&&(n&&oe.contains(r.ownerDocument,r)&&f(c(r,"script")),r.parentNode.removeChild(r));return e}function k(e,t){var n=oe(t.createElement(e)).appendTo(t.body),r=oe.css(n[0],"display");return n.detach(),r}function E(e){var t=G,n=Ve[e];return n||(n=k(e,t),"none"!==n&&n||(Ue=(Ue||oe("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=Ue[0].contentDocument,t.write(),t.close(),n=k(e,t),Ue.detach()),Ve[e]=n),n}function N(e,t,n){var r,i,o,s,a=e.style;return n=n||Qe(e),s=n?n.getPropertyValue(t)||n[t]:void 0,""!==s&&void 0!==s||oe.contains(e.ownerDocument,e)||(s=oe.style(e,t)),n&&!re.pixelMarginRight()&&Ge.test(s)&&Ye.test(t)&&(r=a.width,i=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=i,a.maxWidth=o),void 0!==s?s+"":s}function S(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function j(e){if(e in rt)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=nt.length;n--;)if(e=nt[n]+t,e in rt)return e}function D(e,t,n){var r=Ae.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function A(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;o<4;o+=2)"margin"===n&&(s+=oe.css(e,n+qe[o],!0,i)),r?("content"===n&&(s-=oe.css(e,"padding"+qe[o],!0,i)),"margin"!==n&&(s-=oe.css(e,"border"+qe[o]+"Width",!0,i))):(s+=oe.css(e,"padding"+qe[o],!0,i),"padding"!==n&&(s+=oe.css(e,"border"+qe[o]+"Width",!0,i)));return s}function q(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Qe(e),s="border-box"===oe.css(e,"boxSizing",!1,o);if(i<=0||null==i){if(i=N(e,t,o),(i<0||null==i)&&(i=e.style[t]),Ge.test(i))return i;r=s&&(re.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+A(e,t,n||(s?"border":"content"),r,o)+"px"}function L(e,t){for(var n,r,i,o=[],s=0,a=e.length;s<a;s++)r=e[s],r.style&&(o[s]=Ee.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Le(r)&&(o[s]=Ee.access(r,"olddisplay",E(r.nodeName)))):(i=Le(r),"none"===n&&i||Ee.set(r,"olddisplay",i?n:oe.css(r,"display"))));for(s=0;s<a;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}function H(e,t,n,r,i){return new H.prototype.init(e,t,n,r,i)}function O(){return e.setTimeout(function(){it=void 0}),it=oe.now()}function F(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)n=qe[r],i["margin"+n]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function P(e,t,n){for(var r,i=(I.tweeners[t]||[]).concat(I.tweeners["*"]),o=0,s=i.length;o<s;o++)if(r=i[o].call(n,t,e))return r}function R(e,t,n){var r,i,o,s,a,u,l,c,f=this,p={},d=e.style,h=e.nodeType&&Le(e),g=Ee.get(e,"fxshow");n.queue||(a=oe._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,f.always(function(){f.always(function(){a.unqueued--,oe.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],l=oe.css(e,"display"),c="none"===l?Ee.get(e,"olddisplay")||E(e.nodeName):l,"inline"===c&&"none"===oe.css(e,"float")&&(d.display="inline-block")),n.overflow&&(d.overflow="hidden",f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],st.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}p[r]=g&&g[r]||oe.style(e,r)}else l=void 0;if(oe.isEmptyObject(p))"inline"===("none"===l?E(e.nodeName):l)&&(d.display=l);else{g?"hidden"in g&&(h=g.hidden):g=Ee.access(e,"fxshow",{}),o&&(g.hidden=!h),h?oe(e).show():f.done(function(){oe(e).hide()}),f.done(function(){var t;Ee.remove(e,"fxshow");for(t in p)oe.style(e,t,p[t])});for(r in p)s=P(h?g[r]:0,r,f),r in g||(g[r]=s.start,h&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function M(e,t){var n,r,i,o,s;for(n in e)if(r=oe.camelCase(n),i=t[r],o=e[n],oe.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=oe.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function I(e,t,n){var r,i,o=0,s=I.prefilters.length,a=oe.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=it||O(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;s<u;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),o<1&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:oe.extend({},t),opts:oe.extend(!0,{specialEasing:{},easing:oe.easing._default},n),originalProperties:t,originalOptions:n,startTime:it||O(),duration:n.duration,tweens:[],createTween:function(t,n){var r=oe.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(a.notifyWith(e,[l,1,0]),a.resolveWith(e,[l,t])):a.rejectWith(e,[l,t]),this}}),c=l.props;for(M(c,l.opts.specialEasing);o<s;o++)if(r=I.prefilters[o].call(l,e,c,l.opts))return oe.isFunction(r.stop)&&(oe._queueHooks(l.elem,l.opts.queue).stop=oe.proxy(r.stop,r)),r;return oe.map(c,P,l),oe.isFunction(l.opts.start)&&l.opts.start.call(e,l),oe.fx.timer(oe.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function W(e){return e.getAttribute&&e.getAttribute("class")||""}function $(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(we)||[];if(oe.isFunction(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function B(e,t,n,r){function i(a){var u;return o[a]=!0,oe.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||s||o[l]?s?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},s=e===Nt;return i(t.dataTypes[0])||!o["*"]&&i("*")}function _(e,t){var n,r,i=oe.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&oe.extend(!0,e,r),e}function X(e,t,n){for(var r,i,o,s,a=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}if(o)return o!==u[0]&&u.unshift(o),n[o]}function z(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(f){return{state:"parsererror",error:s?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function U(e,t,n,r){var i;if(oe.isArray(t))oe.each(t,function(t,i){n||At.test(e)?r(e,i):U(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==oe.type(t))r(e,t);else for(i in t)U(e+"["+i+"]",t[i],n,r)}function V(e){return oe.isWindow(e)?e:9===e.nodeType&&e.defaultView}var Y=[],G=e.document,Q=Y.slice,J=Y.concat,K=Y.push,Z=Y.indexOf,ee={},te=ee.toString,ne=ee.hasOwnProperty,re={},ie="2.2.4",oe=function(e,t){return new oe.fn.init(e,t)},se=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ae=/^-ms-/,ue=/-([\da-z])/gi,le=function(e,t){return t.toUpperCase()};oe.fn=oe.prototype={jquery:ie,constructor:oe,selector:"",length:0,toArray:function(){return Q.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:Q.call(this)},pushStack:function(e){var t=oe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e){return oe.each(this,e)},map:function(e){return this.pushStack(oe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(Q.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:K,sort:Y.sort,splice:Y.splice},oe.extend=oe.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[a]||{},a++),"object"==typeof s||oe.isFunction(s)||(s={}),a===u&&(s=this,a--);a<u;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(oe.isPlainObject(r)||(i=oe.isArray(r)))?(i?(i=!1,o=n&&oe.isArray(n)?n:[]):o=n&&oe.isPlainObject(n)?n:{},s[t]=oe.extend(l,o,r)):void 0!==r&&(s[t]=r));return s},oe.extend({expando:"jQuery"+(ie+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===oe.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){var t=e&&e.toString();return!oe.isArray(e)&&t-parseFloat(t)+1>=0},isPlainObject:function(e){var t;if("object"!==oe.type(e)||e.nodeType||oe.isWindow(e))return!1;if(e.constructor&&!ne.call(e,"constructor")&&!ne.call(e.constructor.prototype||{},"isPrototypeOf"))return!1;for(t in e);return void 0===t||ne.call(e,t)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ee[te.call(e)]||"object":typeof e},globalEval:function(e){var t,n=eval;e=oe.trim(e),e&&(1===e.indexOf("use strict")?(t=G.createElement("script"),t.text=e,G.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(ae,"ms-").replace(ue,le)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;i<r&&t.call(e[i],i,e[i])!==!1;i++);else for(i in e)if(t.call(e[i],i,e[i])===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(se,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?oe.merge(r,"string"==typeof e?[e]:e):K.call(r,e)),r},inArray:function(e,t,n){return null==t?-1:Z.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,s=e.length,a=!n;o<s;o++)r=!t(e[o],o),r!==a&&i.push(e[o]);return i},map:function(e,t,r){var i,o,s=0,a=[];if(n(e))for(i=e.length;s<i;s++)o=t(e[s],s,r),null!=o&&a.push(o);else for(s in e)o=t(e[s],s,r),null!=o&&a.push(o);return J.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),oe.isFunction(e))return r=Q.call(arguments,2),i=function(){return e.apply(t||this,r.concat(Q.call(arguments)))},i.guid=e.guid=e.guid||oe.guid++,i},now:Date.now,support:re}),"function"==typeof Symbol&&(oe.fn[Symbol.iterator]=Y[Symbol.iterator]),oe.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){ee["[object "+t+"]"]=t.toLowerCase()});var ce=function(e){function t(e,t,n,r){var i,o,s,a,u,l,f,d,h=t&&t.ownerDocument,g=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==g&&9!==g&&11!==g)return n;if(!r&&((t?t.ownerDocument||t:W)!==L&&q(t),t=t||L,O)){if(11!==g&&(l=me.exec(e)))if(i=l[1]){if(9===g){if(!(s=t.getElementById(i)))return n;if(s.id===i)return n.push(s),n}else if(h&&(s=h.getElementById(i))&&M(t,s)&&s.id===i)return n.push(s),n}else{if(l[2])return K.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&w.getElementsByClassName&&t.getElementsByClassName)return K.apply(n,t.getElementsByClassName(i)),n}if(w.qsa&&!z[e+" "]&&(!F||!F.test(e))){if(1!==g)h=t,d=e;else if("object"!==t.nodeName.toLowerCase()){for((a=t.getAttribute("id"))?a=a.replace(xe,"\\$&"):t.setAttribute("id",a=I),f=E(e),o=f.length,u=pe.test(a)?"#"+a:"[id='"+a+"']";o--;)f[o]=u+" "+p(f[o]);d=f.join(","),h=ye.test(e)&&c(t.parentNode)||t}if(d)try{return K.apply(n,h.querySelectorAll(d)),n}catch(v){}finally{a===I&&t.removeAttribute("id")}}}return S(e.replace(ae,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>T.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[I]=!0,e}function i(e){var t=L.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function p(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,s){var a,u,l,c=[$,o];if(s){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,s))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[I]||(t[I]={}),u=l[t.uniqueID]||(l[t.uniqueID]={}),(a=u[r])&&a[0]===$&&a[1]===o)return c[2]=a[2];if(u[r]=c,c[2]=e(t,n,s))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i<o;i++)t(e,n[i],r);return r}function v(e,t,n,r,i){for(var o,s=[],a=0,u=e.length,l=null!=t;a<u;a++)(o=e[a])&&(n&&!n(o,r,i)||(s.push(o),l&&t.push(a)));return s}function m(e,t,n,i,o,s){return i&&!i[I]&&(i=m(i)),o&&!o[I]&&(o=m(o,s)),r(function(r,s,a,u){var l,c,f,p=[],d=[],h=s.length,m=r||g(t||"*",a.nodeType?[a]:a,[]),y=!e||!r&&t?m:v(m,p,e,a,u),x=n?o||(r?e:h||i)?[]:s:y;if(n&&n(y,x,a,u),i)for(l=v(x,d),i(l,[],a,u),c=l.length;c--;)(f=l[c])&&(x[d[c]]=!(y[d[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(y[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):p[c])>-1&&(r[l]=!(s[l]=f))}}else x=v(x===s?x.splice(h,x.length):x),o?o(null,s,x,u):K.apply(s,x)})}function y(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],s=o||T.relative[" "],a=o?1:0,u=d(function(e){return e===t},s,!0),l=d(function(e){return ee(t,e)>-1},s,!0),c=[function(e,n,r){var i=!o&&(r||n!==j)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];a<i;a++)if(n=T.relative[e[a].type])c=[d(h(c),n)];else{if(n=T.filter[e[a].type].apply(null,e[a].matches),n[I]){for(r=++a;r<i&&!T.relative[e[r].type];r++);return m(a>1&&h(c),a>1&&p(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a<r&&y(e.slice(a,r)),r<i&&y(e=e.slice(r)),r<i&&p(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,o=e.length>0,s=function(r,s,a,u,l){var c,f,p,d=0,h="0",g=r&&[],m=[],y=j,x=r||o&&T.find.TAG("*",l),b=$+=null==y?1:Math.random()||.1,w=x.length;for(l&&(j=s===L||s||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,s||c.ownerDocument===L||(q(c),a=!O);p=e[f++];)if(p(c,s||L,a)){u.push(c);break}l&&($=b)}i&&((c=!p&&c)&&d--,r&&g.push(c))}if(d+=h,i&&h!==d){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(d>0)for(;h--;)g[h]||m[h]||(m[h]=Q.call(u));m=v(m)}K.apply(u,m),l&&!r&&m.length>0&&d+n.length>1&&t.uniqueSort(u)}return l&&($=b,j=y),g};return i?r(s):s}var b,w,T,C,k,E,N,S,j,D,A,q,L,H,O,F,P,R,M,I="sizzle"+1*new Date,W=e.document,$=0,B=0,_=n(),X=n(),z=n(),U=function(e,t){return e===t&&(A=!0),0},V=1<<31,Y={}.hasOwnProperty,G=[],Q=G.pop,J=G.push,K=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+re+"))|)"+ne+"*\\]",oe=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",se=new RegExp(ne+"+","g"),ae=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),le=new RegExp("^"+ne+"*([>+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),pe=new RegExp("^"+re+"$"),de={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,ve=/^[^{]+\{\s*\[native \w/,me=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){q()};try{K.apply(G=Z.call(W.childNodes),W.childNodes),G[W.childNodes.length].nodeType}catch(Ce){K={apply:G.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},q=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,O=!k(L),(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=ve.test(L.getElementsByClassName),w.getById=i(function(e){return H.appendChild(e).id=I,!L.getElementsByName||!L.getElementsByName(I).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&O){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&O)return t.getElementsByClassName(e)},P=[],F=[],(w.qsa=ve.test(L.querySelectorAll))&&(i(function(e){H.appendChild(e).innerHTML="<a id='"+I+"'></a><select id='"+I+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+I+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+I+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=ve.test(R=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&i(function(e){w.disconnectedMatch=R.call(e,"div"),R.call(e,"[s!='']:x"),P.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),P=P.length&&new RegExp(P.join("|")),t=ve.test(H.compareDocumentPosition),M=t||ve.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return A=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return A=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===L?-1:t===L?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&q(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&O&&!z[n+" "]&&(!P||!P.test(n))&&(!F||!F.test(n)))try{var r=R.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&q(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&q(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!O):void 0;return void 0!==r?r:w.attributes||!O?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(A=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),A){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:de,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return de.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=_[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&_(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==s?"nextSibling":"previousSibling",v=t.parentNode,m=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(v){if(o){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===m:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&y){for(p=v,f=p[I]||(p[I]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],d=l[0]===$&&l[1],x=d&&l[2],p=d&&v.childNodes[d];p=++d&&p&&p[g]||(x=d=0)||h.pop();)if(1===p.nodeType&&++x&&p===t){c[e]=[$,d,x];break}}else if(y&&(p=t,f=p[I]||(p[I]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],d=l[0]===$&&l[1],x=d),x===!1)for(;(p=++d&&p&&p[g]||(x=d=0)||h.pop())&&((a?p.nodeName.toLowerCase()!==m:1!==p.nodeType)||!++x||(y&&(f=p[I]||(p[I]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),c[e]=[$,x]),p!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[I]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),s=i.length;s--;)r=ee(e,i[s]),e[r]=!(t[r]=i[s])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=N(e.replace(ae,"$1"));return i[I]?r(function(e,t,n,r){for(var o,s=i(e,null,r,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=O?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n); -return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=a(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,E=t.tokenize=function(e,n){var r,i,o,s,a,u,l,c=X[e+" "];if(c)return n?0:c.slice(0);for(a=e,u=[],l=T.preFilter;a;){r&&!(i=ue.exec(a))||(i&&(a=a.slice(i[0].length)||a),u.push(o=[])),r=!1,(i=le.exec(a))&&(r=i.shift(),o.push({value:r,type:i[0].replace(ae," ")}),a=a.slice(r.length));for(s in T.filter)!(i=de[s].exec(a))||l[s]&&!(i=l[s](i))||(r=i.shift(),o.push({value:r,type:s,matches:i}),a=a.slice(r.length));if(!r)break}return n?a.length:a?t.error(e):X(e,u).slice(0)},N=t.compile=function(e,t){var n,r=[],i=[],o=z[e+" "];if(!o){for(t||(t=E(e)),n=t.length;n--;)o=y(t[n]),o[I]?r.push(o):i.push(o);o=z(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,s,a,u,l="function"==typeof e&&e,f=!r&&E(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"ID"===(s=o[0]).type&&w.getById&&9===t.nodeType&&O&&T.relative[o[1].type]){if(t=(T.find.ID(s.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=de.needsContext.test(e)?0:o.length;i--&&(s=o[i],!T.relative[a=s.type]);)if((u=T.find[a])&&(r=u(s.matches[0].replace(be,we),ye.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&p(o),!e)return K.apply(n,r),n;break}}return(l||N(e,f))(r,t,!O,n,!t||ye.test(e)&&c(t.parentNode)||t),n},w.sortStable=I.split("").sort(U).join("")===I,w.detectDuplicates=!!A,q(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(L.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);oe.find=ce,oe.expr=ce.selectors,oe.expr[":"]=oe.expr.pseudos,oe.uniqueSort=oe.unique=ce.uniqueSort,oe.text=ce.getText,oe.isXMLDoc=ce.isXML,oe.contains=ce.contains;var fe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&oe(e).is(n))break;r.push(e)}return r},pe=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},de=oe.expr.match.needsContext,he=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,ge=/^.[^:#\[\.,]*$/;oe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?oe.find.matchesSelector(r,e)?[r]:[]:oe.find.matches(e,oe.grep(t,function(e){return 1===e.nodeType}))},oe.fn.extend({find:function(e){var t,n=this.length,r=[],i=this;if("string"!=typeof e)return this.pushStack(oe(e).filter(function(){for(t=0;t<n;t++)if(oe.contains(i[t],this))return!0}));for(t=0;t<n;t++)oe.find(e,i[t],r);return r=this.pushStack(n>1?oe.unique(r):r),r.selector=this.selector?this.selector+" "+e:e,r},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&de.test(e)?oe(e):e||[],!1).length}});var ve,me=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ye=oe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||ve,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:me.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof oe?t[0]:t,oe.merge(this,oe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:G,!0)),he.test(r[1])&&oe.isPlainObject(t))for(r in t)oe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=G.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=G,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):oe.isFunction(e)?void 0!==n.ready?n.ready(e):e(oe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),oe.makeArray(e,this))};ye.prototype=oe.fn,ve=oe(G);var xe=/^(?:parents|prev(?:Until|All))/,be={children:!0,contents:!0,next:!0,prev:!0};oe.fn.extend({has:function(e){var t=oe(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(oe.contains(this,t[e]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],s=de.test(e)||"string"!=typeof e?oe(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?s.index(n)>-1:1===n.nodeType&&oe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?oe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?Z.call(oe(e),this[0]):Z.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(oe.uniqueSort(oe.merge(this.get(),oe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),oe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return fe(e,"parentNode")},parentsUntil:function(e,t,n){return fe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return fe(e,"nextSibling")},prevAll:function(e){return fe(e,"previousSibling")},nextUntil:function(e,t,n){return fe(e,"nextSibling",n)},prevUntil:function(e,t,n){return fe(e,"previousSibling",n)},siblings:function(e){return pe((e.parentNode||{}).firstChild,e)},children:function(e){return pe(e.firstChild)},contents:function(e){return e.contentDocument||oe.merge([],e.childNodes)}},function(e,t){oe.fn[e]=function(n,r){var i=oe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=oe.filter(r,i)),this.length>1&&(be[e]||oe.uniqueSort(i),xe.test(e)&&i.reverse()),this.pushStack(i)}});var we=/\S+/g;oe.Callbacks=function(e){e="string"==typeof e?o(e):oe.extend({},e);var t,n,r,i,s=[],a=[],u=-1,l=function(){for(i=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u<s.length;)s[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=s.length,n=!1);e.memory||(n=!1),t=!1,i&&(s=n?[]:"")},c={add:function(){return s&&(n&&!t&&(u=s.length-1,a.push(n)),function r(t){oe.each(t,function(t,n){oe.isFunction(n)?e.unique&&c.has(n)||s.push(n):n&&n.length&&"string"!==oe.type(n)&&r(n)})}(arguments),n&&!t&&l()),this},remove:function(){return oe.each(arguments,function(e,t){for(var n;(n=oe.inArray(t,s,n))>-1;)s.splice(n,1),n<=u&&u--}),this},has:function(e){return e?oe.inArray(e,s)>-1:s.length>0},empty:function(){return s&&(s=[]),this},disable:function(){return i=a=[],s=n="",this},disabled:function(){return!s},lock:function(){return i=a=[],n||(s=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},oe.extend({Deferred:function(e){var t=[["resolve","done",oe.Callbacks("once memory"),"resolved"],["reject","fail",oe.Callbacks("once memory"),"rejected"],["notify","progress",oe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return oe.Deferred(function(n){oe.each(t,function(t,o){var s=oe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&oe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?oe.extend(e,r):r}},i={};return r.pipe=r.then,oe.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=Q.call(arguments),s=o.length,a=1!==s||e&&oe.isFunction(e.promise)?s:0,u=1===a?e:oe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?Q.call(arguments):i,r===t?u.notifyWith(n,r):--a||u.resolveWith(n,r)}};if(s>1)for(t=new Array(s),n=new Array(s),r=new Array(s);i<s;i++)o[i]&&oe.isFunction(o[i].promise)?o[i].promise().progress(l(i,n,t)).done(l(i,r,o)).fail(u.reject):--a;return a||u.resolveWith(r,o),u.promise()}});var Te;oe.fn.ready=function(e){return oe.ready.promise().done(e),this},oe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?oe.readyWait++:oe.ready(!0)},ready:function(e){(e===!0?--oe.readyWait:oe.isReady)||(oe.isReady=!0,e!==!0&&--oe.readyWait>0||(Te.resolveWith(G,[oe]),oe.fn.triggerHandler&&(oe(G).triggerHandler("ready"),oe(G).off("ready"))))}}),oe.ready.promise=function(t){return Te||(Te=oe.Deferred(),"complete"===G.readyState||"loading"!==G.readyState&&!G.documentElement.doScroll?e.setTimeout(oe.ready):(G.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s))),Te.promise(t)},oe.ready.promise();var Ce=function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===oe.type(n)){i=!0;for(a in n)Ce(e,t,a,n[a],!0,o,s)}else if(void 0!==r&&(i=!0,oe.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(oe(e),n)})),t))for(;a<u;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},ke=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};a.uid=1,a.prototype={register:function(e,t){var n=t||{};return e.nodeType?e[this.expando]=n:Object.defineProperty(e,this.expando,{value:n,writable:!0,configurable:!0}),e[this.expando]},cache:function(e){if(!ke(e))return{};var t=e[this.expando];return t||(t={},ke(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[t]=n;else for(r in t)i[r]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][t]},access:function(e,t,n){var r;return void 0===t||t&&"string"==typeof t&&void 0===n?(r=this.get(e,t),void 0!==r?r:this.get(e,oe.camelCase(t))):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r,i,o=e[this.expando];if(void 0!==o){if(void 0===t)this.register(e);else{oe.isArray(t)?r=t.concat(t.map(oe.camelCase)):(i=oe.camelCase(t),t in o?r=[t,i]:(r=i,r=r in o?[r]:r.match(we)||[])),n=r.length;for(;n--;)delete o[r[n]]}(void 0===t||oe.isEmptyObject(o))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!oe.isEmptyObject(t)}};var Ee=new a,Ne=new a,Se=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,je=/[A-Z]/g;oe.extend({hasData:function(e){return Ne.hasData(e)||Ee.hasData(e)},data:function(e,t,n){return Ne.access(e,t,n)},removeData:function(e,t){Ne.remove(e,t)},_data:function(e,t,n){return Ee.access(e,t,n)},_removeData:function(e,t){Ee.remove(e,t)}}),oe.fn.extend({data:function(e,t){var n,r,i,o=this[0],s=o&&o.attributes;if(void 0===e){if(this.length&&(i=Ne.get(o),1===o.nodeType&&!Ee.get(o,"hasDataAttrs"))){for(n=s.length;n--;)s[n]&&(r=s[n].name,0===r.indexOf("data-")&&(r=oe.camelCase(r.slice(5)),u(o,r,i[r])));Ee.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){Ne.set(this,e)}):Ce(this,function(t){var n,r;if(o&&void 0===t){if(n=Ne.get(o,e)||Ne.get(o,e.replace(je,"-$&").toLowerCase()),void 0!==n)return n;if(r=oe.camelCase(e),n=Ne.get(o,r),void 0!==n)return n;if(n=u(o,r,void 0),void 0!==n)return n}else r=oe.camelCase(e),this.each(function(){var n=Ne.get(this,r);Ne.set(this,r,t),e.indexOf("-")>-1&&void 0!==n&&Ne.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Ne.remove(this,e)})}}),oe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Ee.get(e,t),n&&(!r||oe.isArray(n)?r=Ee.access(e,t,oe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=oe.queue(e,t),r=n.length,i=n.shift(),o=oe._queueHooks(e,t),s=function(){oe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Ee.get(e,n)||Ee.access(e,n,{empty:oe.Callbacks("once memory").add(function(){Ee.remove(e,[t+"queue",n])})})}}),oe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?oe.queue(this[0],e):void 0===t?this:this.each(function(){var n=oe.queue(this,e,t);oe._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&oe.dequeue(this,e)})},dequeue:function(e){return this.each(function(){oe.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=oe.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";s--;)n=Ee.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var De=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Ae=new RegExp("^(?:([+-])=|)("+De+")([a-z%]*)$","i"),qe=["Top","Right","Bottom","Left"],Le=function(e,t){return e=t||e,"none"===oe.css(e,"display")||!oe.contains(e.ownerDocument,e)},He=/^(?:checkbox|radio)$/i,Oe=/<([\w:-]+)/,Fe=/^$|\/(?:java|ecma)script/i,Pe={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Pe.optgroup=Pe.option,Pe.tbody=Pe.tfoot=Pe.colgroup=Pe.caption=Pe.thead,Pe.th=Pe.td;var Re=/<|&#?\w+;/;!function(){var e=G.createDocumentFragment(),t=e.appendChild(G.createElement("div")),n=G.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),re.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="<textarea>x</textarea>",re.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Me=/^key/,Ie=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,We=/^([^.]*)(?:\.(.+)|)/;oe.event={global:{},add:function(e,t,n,r,i){var o,s,a,u,l,c,f,p,d,h,g,v=Ee.get(e);if(v)for(n.handler&&(o=n,n=o.handler,i=o.selector),n.guid||(n.guid=oe.guid++),(u=v.events)||(u=v.events={}),(s=v.handle)||(s=v.handle=function(t){return"undefined"!=typeof oe&&oe.event.triggered!==t.type?oe.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(we)||[""],l=t.length;l--;)a=We.exec(t[l])||[],d=g=a[1],h=(a[2]||"").split(".").sort(),d&&(f=oe.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=oe.event.special[d]||{},c=oe.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&oe.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||(p=u[d]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,h,s)!==!1||e.addEventListener&&e.addEventListener(d,s)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),oe.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,s,a,u,l,c,f,p,d,h,g,v=Ee.hasData(e)&&Ee.get(e);if(v&&(u=v.events)){for(t=(t||"").match(we)||[""],l=t.length;l--;)if(a=We.exec(t[l])||[],d=g=a[1],h=(a[2]||"").split(".").sort(),d){for(f=oe.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,p=u[d]||[],a=a[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));s&&!p.length&&(f.teardown&&f.teardown.call(e,h,v.handle)!==!1||oe.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)oe.event.remove(e,d+t[l],n,r,!0);oe.isEmptyObject(u)&&Ee.remove(e,"handle events")}},dispatch:function(e){e=oe.event.fix(e);var t,n,r,i,o,s=[],a=Q.call(arguments),u=(Ee.get(this,"events")||{})[e.type]||[],l=oe.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(s=oe.event.handlers.call(this,e,u),t=0;(i=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((oe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n<a;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?oe(i,this).index(u)>-1:oe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return a<t.length&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||G,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},fix:function(e){if(e[oe.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];for(s||(this.fixHooks[i]=s=Ie.test(i)?this.mouseHooks:Me.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new oe.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=G),3===e.target.nodeType&&(e.target=e.target.parentNode),s.filter?s.filter(e,o):e},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==g()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===g()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&oe.nodeName(this,"input"))return this.click(),!1},_default:function(e){return oe.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},oe.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},oe.Event=function(e,t){return this instanceof oe.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?d:h):this.type=e,t&&oe.extend(this,t),this.timeStamp=e&&e.timeStamp||oe.now(),void(this[oe.expando]=!0)):new oe.Event(e,t)},oe.Event.prototype={constructor:oe.Event,isDefaultPrevented:h,isPropagationStopped:h,isImmediatePropagationStopped:h,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=d,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=d,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=d,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},oe.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){oe.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||oe.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),oe.fn.extend({on:function(e,t,n,r){return v(this,e,t,n,r)},one:function(e,t,n,r){return v(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,oe(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return t!==!1&&"function"!=typeof t||(n=t,t=void 0),n===!1&&(n=h),this.each(function(){oe.event.remove(this,e,n,t)})}});var $e=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Be=/<script|<style|<link/i,_e=/checked\s*(?:[^=]|=\s*.checked.)/i,Xe=/^true\/(.*)/,ze=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;oe.extend({htmlPrefilter:function(e){return e.replace($e,"<$1></$2>")},clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=oe.contains(e.ownerDocument,e);if(!(re.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||oe.isXMLDoc(e)))for(s=c(a),o=c(e),r=0,i=o.length;r<i;r++)w(o[r],s[r]);if(t)if(n)for(o=o||c(e),s=s||c(a),r=0,i=o.length;r<i;r++)b(o[r],s[r]);else b(e,a);return s=c(a,"script"),s.length>0&&f(s,!u&&c(e,"script")),a},cleanData:function(e){for(var t,n,r,i=oe.event.special,o=0;void 0!==(n=e[o]);o++)if(ke(n)){if(t=n[Ee.expando]){if(t.events)for(r in t.events)i[r]?oe.event.remove(n,r):oe.removeEvent(n,r,t.handle);n[Ee.expando]=void 0}n[Ne.expando]&&(n[Ne.expando]=void 0)}}}),oe.fn.extend({domManip:T,detach:function(e){return C(this,e,!0)},remove:function(e){return C(this,e)},text:function(e){return Ce(this,function(e){return void 0===e?oe.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return T(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=m(this,e);t.appendChild(e)}})},prepend:function(){return T(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=m(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return T(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return T(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(oe.cleanData(c(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return oe.clone(this,e,t)})},html:function(e){return Ce(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Be.test(e)&&!Pe[(Oe.exec(e)||["",""])[1].toLowerCase()]){e=oe.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(oe.cleanData(c(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return T(this,arguments,function(t){var n=this.parentNode;oe.inArray(this,e)<0&&(oe.cleanData(c(this)),n&&n.replaceChild(t,this))},e)}}),oe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){oe.fn[e]=function(e){for(var n,r=[],i=oe(e),o=i.length-1,s=0;s<=o;s++)n=s===o?this:this.clone(!0),oe(i[s])[t](n),K.apply(r,n.get());return this.pushStack(r)}});var Ue,Ve={HTML:"block",BODY:"block"},Ye=/^margin/,Ge=new RegExp("^("+De+")(?!px)[a-z%]+$","i"),Qe=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Je=function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i},Ke=G.documentElement;!function(){function t(){a.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",a.innerHTML="",Ke.appendChild(s);var t=e.getComputedStyle(a);n="1%"!==t.top,o="2px"===t.marginLeft,r="4px"===t.width,a.style.marginRight="50%",i="4px"===t.marginRight,Ke.removeChild(s)}var n,r,i,o,s=G.createElement("div"),a=G.createElement("div");a.style&&(a.style.backgroundClip="content-box",a.cloneNode(!0).style.backgroundClip="",re.clearCloneStyle="content-box"===a.style.backgroundClip,s.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",s.appendChild(a),oe.extend(re,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return null==r&&t(),r},pixelMarginRight:function(){return null==r&&t(),i},reliableMarginLeft:function(){return null==r&&t(),o},reliableMarginRight:function(){var t,n=a.appendChild(G.createElement("div"));return n.style.cssText=a.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",n.style.marginRight=n.style.width="0",a.style.width="1px",Ke.appendChild(s),t=!parseFloat(e.getComputedStyle(n).marginRight),Ke.removeChild(s),a.removeChild(n),t}}))}();var Ze=/^(none|table(?!-c[ea]).+)/,et={position:"absolute",visibility:"hidden",display:"block"},tt={letterSpacing:"0",fontWeight:"400"},nt=["Webkit","O","Moz","ms"],rt=G.createElement("div").style;oe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=N(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=oe.camelCase(t),u=e.style;return t=oe.cssProps[a]||(oe.cssProps[a]=j(a)||a),s=oe.cssHooks[t]||oe.cssHooks[a],void 0===n?s&&"get"in s&&void 0!==(i=s.get(e,!1,r))?i:u[t]:(o=typeof n,"string"===o&&(i=Ae.exec(n))&&i[1]&&(n=l(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(oe.cssNumber[a]?"":"px")),re.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&void 0===(n=s.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var i,o,s,a=oe.camelCase(t);return t=oe.cssProps[a]||(oe.cssProps[a]=j(a)||a),s=oe.cssHooks[t]||oe.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),void 0===i&&(i=N(e,t,r)),"normal"===i&&t in tt&&(i=tt[t]),""===n||n?(o=parseFloat(i),n===!0||isFinite(o)?o||0:i):i}}),oe.each(["height","width"],function(e,t){oe.cssHooks[t]={get:function(e,n,r){if(n)return Ze.test(oe.css(e,"display"))&&0===e.offsetWidth?Je(e,et,function(){return q(e,t,r)}):q(e,t,r)},set:function(e,n,r){var i,o=r&&Qe(e),s=r&&A(e,t,r,"border-box"===oe.css(e,"boxSizing",!1,o),o);return s&&(i=Ae.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=oe.css(e,t)),D(e,n,s)}}}),oe.cssHooks.marginLeft=S(re.reliableMarginLeft,function(e,t){if(t)return(parseFloat(N(e,"marginLeft"))||e.getBoundingClientRect().left-Je(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),oe.cssHooks.marginRight=S(re.reliableMarginRight,function(e,t){if(t)return Je(e,{display:"inline-block"},N,[e,"marginRight"])}),oe.each({margin:"",padding:"",border:"Width"},function(e,t){oe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+qe[r]+t]=o[r]||o[r-2]||o[0];return i}},Ye.test(e)||(oe.cssHooks[e+t].set=D)}),oe.fn.extend({css:function(e,t){return Ce(this,function(e,t,n){var r,i,o={},s=0;if(oe.isArray(t)){for(r=Qe(e),i=t.length;s<i;s++)o[t[s]]=oe.css(e,t[s],!1,r);return o}return void 0!==n?oe.style(e,t,n):oe.css(e,t)},e,t,arguments.length>1)},show:function(){return L(this,!0)},hide:function(){return L(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Le(this)?oe(this).show():oe(this).hide()})}}),oe.Tween=H,H.prototype={constructor:H,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||oe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(oe.cssNumber[n]?"":"px")},cur:function(){var e=H.propHooks[this.prop];return e&&e.get?e.get(this):H.propHooks._default.get(this)},run:function(e){var t,n=H.propHooks[this.prop];return this.options.duration?this.pos=t=oe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):H.propHooks._default.set(this),this}},H.prototype.init.prototype=H.prototype,H.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=oe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){oe.fx.step[e.prop]?oe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[oe.cssProps[e.prop]]&&!oe.cssHooks[e.prop]?e.elem[e.prop]=e.now:oe.style(e.elem,e.prop,e.now+e.unit)}}},H.propHooks.scrollTop=H.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},oe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},oe.fx=H.prototype.init,oe.fx.step={};var it,ot,st=/^(?:toggle|show|hide)$/,at=/queueHooks$/;oe.Animation=oe.extend(I,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return l(n.elem,e,Ae.exec(t),n),n}]},tweener:function(e,t){oe.isFunction(e)?(t=e,e=["*"]):e=e.match(we);for(var n,r=0,i=e.length;r<i;r++)n=e[r],I.tweeners[n]=I.tweeners[n]||[],I.tweeners[n].unshift(t)},prefilters:[R],prefilter:function(e,t){t?I.prefilters.unshift(e):I.prefilters.push(e)}}),oe.speed=function(e,t,n){var r=e&&"object"==typeof e?oe.extend({},e):{complete:n||!n&&t||oe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!oe.isFunction(t)&&t};return r.duration=oe.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in oe.fx.speeds?oe.fx.speeds[r.duration]:oe.fx.speeds._default,null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){oe.isFunction(r.old)&&r.old.call(this),r.queue&&oe.dequeue(this,r.queue)},r},oe.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Le).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=oe.isEmptyObject(e),o=oe.speed(t,n,r),s=function(){var t=I(this,oe.extend({},e),o);(i||Ee.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=oe.timers,s=Ee.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&at.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||oe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=Ee.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=oe.timers,s=r?r.length:0;for(n.finish=!0,oe.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<s;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),oe.each(["toggle","show","hide"],function(e,t){var n=oe.fn[t];oe.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(F(t,!0),e,r,i)}}),oe.each({slideDown:F("show"),slideUp:F("hide"),slideToggle:F("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){oe.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),oe.timers=[],oe.fx.tick=function(){var e,t=0,n=oe.timers;for(it=oe.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||oe.fx.stop(),it=void 0},oe.fx.timer=function(e){ -oe.timers.push(e),e()?oe.fx.start():oe.timers.pop()},oe.fx.interval=13,oe.fx.start=function(){ot||(ot=e.setInterval(oe.fx.tick,oe.fx.interval))},oe.fx.stop=function(){e.clearInterval(ot),ot=null},oe.fx.speeds={slow:600,fast:200,_default:400},oe.fn.delay=function(t,n){return t=oe.fx?oe.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=G.createElement("input"),t=G.createElement("select"),n=t.appendChild(G.createElement("option"));e.type="checkbox",re.checkOn=""!==e.value,re.optSelected=n.selected,t.disabled=!0,re.optDisabled=!n.disabled,e=G.createElement("input"),e.value="t",e.type="radio",re.radioValue="t"===e.value}();var ut,lt=oe.expr.attrHandle;oe.fn.extend({attr:function(e,t){return Ce(this,oe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){oe.removeAttr(this,e)})}}),oe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?oe.prop(e,t,n):(1===o&&oe.isXMLDoc(e)||(t=t.toLowerCase(),i=oe.attrHooks[t]||(oe.expr.match.bool.test(t)?ut:void 0)),void 0!==n?null===n?void oe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=oe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!re.radioValue&&"radio"===t&&oe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(we);if(o&&1===e.nodeType)for(;n=o[i++];)r=oe.propFix[n]||n,oe.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)}}),ut={set:function(e,t,n){return t===!1?oe.removeAttr(e,n):e.setAttribute(n,n),n}},oe.each(oe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=lt[t]||oe.find.attr;lt[t]=function(e,t,r){var i,o;return r||(o=lt[t],lt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,lt[t]=o),i}});var ct=/^(?:input|select|textarea|button)$/i,ft=/^(?:a|area)$/i;oe.fn.extend({prop:function(e,t){return Ce(this,oe.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[oe.propFix[e]||e]})}}),oe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&oe.isXMLDoc(e)||(t=oe.propFix[t]||t,i=oe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=oe.find.attr(e,"tabindex");return t?parseInt(t,10):ct.test(e.nodeName)||ft.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),re.optSelected||(oe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),oe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){oe.propFix[this.toLowerCase()]=this});var pt=/[\t\r\n\f]/g;oe.fn.extend({addClass:function(e){var t,n,r,i,o,s,a,u=0;if(oe.isFunction(e))return this.each(function(t){oe(this).addClass(e.call(this,t,W(this)))});if("string"==typeof e&&e)for(t=e.match(we)||[];n=this[u++];)if(i=W(n),r=1===n.nodeType&&(" "+i+" ").replace(pt," ")){for(s=0;o=t[s++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");a=oe.trim(r),i!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,i,o,s,a,u=0;if(oe.isFunction(e))return this.each(function(t){oe(this).removeClass(e.call(this,t,W(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(we)||[];n=this[u++];)if(i=W(n),r=1===n.nodeType&&(" "+i+" ").replace(pt," ")){for(s=0;o=t[s++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");a=oe.trim(r),i!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):oe.isFunction(e)?this.each(function(n){oe(this).toggleClass(e.call(this,n,W(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=oe(this),o=e.match(we)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=W(this),t&&Ee.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Ee.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+W(n)+" ").replace(pt," ").indexOf(t)>-1)return!0;return!1}});var dt=/\r/g,ht=/[\x20\t\r\n\f]+/g;oe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=oe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,oe(this).val()):e,null==i?i="":"number"==typeof i?i+="":oe.isArray(i)&&(i=oe.map(i,function(e){return null==e?"":e+""})),t=oe.valHooks[this.type]||oe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=oe.valHooks[i.type]||oe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(dt,""):null==n?"":n)}}}),oe.extend({valHooks:{option:{get:function(e){var t=oe.find.attr(e,"value");return null!=t?t:oe.trim(oe.text(e)).replace(ht," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,s=o?null:[],a=o?i+1:r.length,u=i<0?a:o?i:0;u<a;u++)if(n=r[u],(n.selected||u===i)&&(re.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!oe.nodeName(n.parentNode,"optgroup"))){if(t=oe(n).val(),o)return t;s.push(t)}return s},set:function(e,t){for(var n,r,i=e.options,o=oe.makeArray(t),s=i.length;s--;)r=i[s],(r.selected=oe.inArray(oe.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),oe.each(["radio","checkbox"],function(){oe.valHooks[this]={set:function(e,t){if(oe.isArray(t))return e.checked=oe.inArray(oe(e).val(),t)>-1}},re.checkOn||(oe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var gt=/^(?:focusinfocus|focusoutblur)$/;oe.extend(oe.event,{trigger:function(t,n,r,i){var o,s,a,u,l,c,f,p=[r||G],d=ne.call(t,"type")?t.type:t,h=ne.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||G,3!==r.nodeType&&8!==r.nodeType&&!gt.test(d+oe.event.triggered)&&(d.indexOf(".")>-1&&(h=d.split("."),d=h.shift(),h.sort()),l=d.indexOf(":")<0&&"on"+d,t=t[oe.expando]?t:new oe.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:oe.makeArray(n,[t]),f=oe.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!oe.isWindow(r)){for(u=f.delegateType||d,gt.test(u+d)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||G)&&p.push(a.defaultView||a.parentWindow||e)}for(o=0;(s=p[o++])&&!t.isPropagationStopped();)t.type=o>1?u:f.bindType||d,c=(Ee.get(s,"events")||{})[t.type]&&Ee.get(s,"handle"),c&&c.apply(s,n),c=l&&s[l],c&&c.apply&&ke(s)&&(t.result=c.apply(s,n),t.result===!1&&t.preventDefault());return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!ke(r)||l&&oe.isFunction(r[d])&&!oe.isWindow(r)&&(a=r[l],a&&(r[l]=null),oe.event.triggered=d,r[d](),oe.event.triggered=void 0,a&&(r[l]=a)),t.result}},simulate:function(e,t,n){var r=oe.extend(new oe.Event,n,{type:e,isSimulated:!0});oe.event.trigger(r,null,t)}}),oe.fn.extend({trigger:function(e,t){return this.each(function(){oe.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return oe.event.trigger(e,t,n,!0)}}),oe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){oe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),oe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),re.focusin="onfocusin"in e,re.focusin||oe.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){oe.event.simulate(t,e.target,oe.event.fix(e))};oe.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=Ee.access(r,t);i||r.addEventListener(e,n,!0),Ee.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=Ee.access(r,t)-1;i?Ee.access(r,t,i):(r.removeEventListener(e,n,!0),Ee.remove(r,t))}}});var vt=e.location,mt=oe.now(),yt=/\?/;oe.parseJSON=function(e){return JSON.parse(e+"")},oe.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(r){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||oe.error("Invalid XML: "+t),n};var xt=/#.*$/,bt=/([?&])_=[^&]*/,wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Tt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ct=/^(?:GET|HEAD)$/,kt=/^\/\//,Et={},Nt={},St="*/".concat("*"),jt=G.createElement("a");jt.href=vt.href,oe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:vt.href,type:"GET",isLocal:Tt.test(vt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":St,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":oe.parseJSON,"text xml":oe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_(_(e,oe.ajaxSettings),t):_(oe.ajaxSettings,e)},ajaxPrefilter:$(Et),ajaxTransport:$(Nt),ajax:function(t,n){function r(t,n,r,a){var l,f,y,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),i=void 0,s=a||"",T.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(x=X(p,T,r)),x=z(p,x,T,l),l?(p.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(oe.lastModified[o]=w),w=T.getResponseHeader("etag"),w&&(oe.etag[o]=w)),204===t||"HEAD"===p.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,y=x.error,l=!y)):(y=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",l?g.resolveWith(d,[f,C,T]):g.rejectWith(d,[T,C,y]),T.statusCode(m),m=void 0,c&&h.trigger(l?"ajaxSuccess":"ajaxError",[T,p,l?f:y]),v.fireWith(d,[T,C]),c&&(h.trigger("ajaxComplete",[T,p]),--oe.active||oe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,s,a,u,l,c,f,p=oe.ajaxSetup({},n),d=p.context||p,h=p.context&&(d.nodeType||d.jquery)?oe(d):oe.event,g=oe.Deferred(),v=oe.Callbacks("once memory"),m=p.statusCode||{},y={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!a)for(a={};t=wt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)m[t]=[m[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return i&&i.abort(t),r(0,t),this}};if(g.promise(T).complete=v.add,T.success=T.done,T.error=T.fail,p.url=((t||p.url||vt.href)+"").replace(xt,"").replace(kt,vt.protocol+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=oe.trim(p.dataType||"*").toLowerCase().match(we)||[""],null==p.crossDomain){l=G.createElement("a");try{l.href=p.url,l.href=l.href,p.crossDomain=jt.protocol+"//"+jt.host!=l.protocol+"//"+l.host}catch(C){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=oe.param(p.data,p.traditional)),B(Et,p,n,T),2===b)return T;c=oe.event&&p.global,c&&0===oe.active++&&oe.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Ct.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(yt.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=bt.test(o)?o.replace(bt,"$1_="+mt++):o+(yt.test(o)?"&":"?")+"_="+mt++)),p.ifModified&&(oe.lastModified[o]&&T.setRequestHeader("If-Modified-Since",oe.lastModified[o]),oe.etag[o]&&T.setRequestHeader("If-None-Match",oe.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",p.contentType),T.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+St+"; q=0.01":""):p.accepts["*"]);for(f in p.headers)T.setRequestHeader(f,p.headers[f]);if(p.beforeSend&&(p.beforeSend.call(d,T,p)===!1||2===b))return T.abort();w="abort";for(f in{success:1,error:1,complete:1})T[f](p[f]);if(i=B(Nt,p,n,T)){if(T.readyState=1,c&&h.trigger("ajaxSend",[T,p]),2===b)return T;p.async&&p.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},p.timeout));try{b=1,i.send(y,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return oe.get(e,t,n,"json")},getScript:function(e,t){return oe.get(e,void 0,t,"script")}}),oe.each(["get","post"],function(e,t){oe[t]=function(e,n,r,i){return oe.isFunction(n)&&(i=i||r,r=n,n=void 0),oe.ajax(oe.extend({url:e,type:t,dataType:i,data:n,success:r},oe.isPlainObject(e)&&e))}}),oe._evalUrl=function(e){return oe.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},oe.fn.extend({wrapAll:function(e){var t;return oe.isFunction(e)?this.each(function(t){oe(this).wrapAll(e.call(this,t))}):(this[0]&&(t=oe(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return oe.isFunction(e)?this.each(function(t){oe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=oe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=oe.isFunction(e);return this.each(function(n){oe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){oe.nodeName(this,"body")||oe(this).replaceWith(this.childNodes)}).end()}}),oe.expr.filters.hidden=function(e){return!oe.expr.filters.visible(e)},oe.expr.filters.visible=function(e){return e.offsetWidth>0||e.offsetHeight>0||e.getClientRects().length>0};var Dt=/%20/g,At=/\[\]$/,qt=/\r?\n/g,Lt=/^(?:submit|button|image|reset|file)$/i,Ht=/^(?:input|select|textarea|keygen)/i;oe.param=function(e,t){var n,r=[],i=function(e,t){t=oe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=oe.ajaxSettings&&oe.ajaxSettings.traditional),oe.isArray(e)||e.jquery&&!oe.isPlainObject(e))oe.each(e,function(){i(this.name,this.value)});else for(n in e)U(n,e[n],t,i);return r.join("&").replace(Dt,"+")},oe.fn.extend({serialize:function(){return oe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=oe.prop(this,"elements");return e?oe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!oe(this).is(":disabled")&&Ht.test(this.nodeName)&&!Lt.test(e)&&(this.checked||!He.test(e))}).map(function(e,t){var n=oe(this).val();return null==n?null:oe.isArray(n)?oe.map(n,function(e){return{name:t.name,value:e.replace(qt,"\r\n")}}):{name:t.name,value:n.replace(qt,"\r\n")}}).get()}}),oe.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(t){}};var Ot={0:200,1223:204},Ft=oe.ajaxSettings.xhr();re.cors=!!Ft&&"withCredentials"in Ft,re.ajax=Ft=!!Ft,oe.ajaxTransport(function(t){var n,r;if(re.cors||Ft&&!t.crossDomain)return{send:function(i,o){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(s in i)a.setRequestHeader(s,i[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?o(0,"error"):o(a.status,a.statusText):o(Ot[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(u){if(n)throw u}},abort:function(){n&&n()}}}),oe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return oe.globalEval(e),e}}}),oe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),oe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=oe("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),G.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Pt=[],Rt=/(=)\?(?=&|$)|\?\?/;oe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Pt.pop()||oe.expando+"_"+mt++;return this[e]=!0,e}}),oe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(Rt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rt.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=oe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Rt,"$1"+i):t.jsonp!==!1&&(t.url+=(yt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||oe.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){void 0===o?oe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Pt.push(i)),s&&oe.isFunction(o)&&o(s[0]),s=o=void 0}),"script"}),oe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||G;var r=he.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=p([e],t,i),i&&i.length&&oe(i).remove(),oe.merge([],r.childNodes))};var Mt=oe.fn.load;oe.fn.load=function(e,t,n){if("string"!=typeof e&&Mt)return Mt.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>-1&&(r=oe.trim(e.slice(a)),e=e.slice(0,a)),oe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),s.length>0&&oe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?oe("<div>").append(oe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},oe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){oe.fn[t]=function(e){return this.on(t,e)}}),oe.expr.filters.animated=function(e){return oe.grep(oe.timers,function(t){return e===t.elem}).length},oe.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=oe.css(e,"position"),f=oe(e),p={};"static"===c&&(e.style.position="relative"),a=f.offset(),o=oe.css(e,"top"),u=oe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=f.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),oe.isFunction(t)&&(t=t.call(e,n,oe.extend({},a))),null!=t.top&&(p.top=t.top-a.top+s),null!=t.left&&(p.left=t.left-a.left+i),"using"in t?t.using.call(e,p):f.css(p)}},oe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){oe.offset.setOffset(this,e,t)});var t,n,r=this[0],i={top:0,left:0},o=r&&r.ownerDocument;if(o)return t=o.documentElement,oe.contains(t,r)?(i=r.getBoundingClientRect(),n=V(o),{top:i.top+n.pageYOffset-t.clientTop,left:i.left+n.pageXOffset-t.clientLeft}):i},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===oe.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),oe.nodeName(e[0],"html")||(r=e.offset()),r.top+=oe.css(e[0],"borderTopWidth",!0),r.left+=oe.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-oe.css(n,"marginTop",!0),left:t.left-r.left-oe.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===oe.css(e,"position");)e=e.offsetParent;return e||Ke})}}),oe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;oe.fn[e]=function(r){return Ce(this,function(e,r,i){var o=V(e);return void 0===i?o?o[t]:e[r]:void(o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i)},e,r,arguments.length)}}),oe.each(["top","left"],function(e,t){oe.cssHooks[t]=S(re.pixelPosition,function(e,n){if(n)return n=N(e,t),Ge.test(n)?oe(e).position()[t]+"px":n})}),oe.each({Height:"height",Width:"width"},function(e,t){oe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){oe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return Ce(this,function(t,n,r){var i;return oe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?oe.css(t,n,s):oe.style(t,n,r,s)},t,o?r:void 0,o,null)}})}),oe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},size:function(){return this.length}}),oe.fn.andSelf=oe.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return oe});var It=e.jQuery,Wt=e.$;return oe.noConflict=function(t){return e.$===oe&&(e.$=Wt),t&&e.jQuery===oe&&(e.jQuery=It),oe},t||(e.jQuery=e.$=oe),oe}); +!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=oe.type(e);return"function"!==n&&!oe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(oe.isFunction(t))return oe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return oe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(ge.test(t))return oe.filter(t,e,n);t=oe.filter(t,e)}return oe.grep(e,function(e){return Z.call(t,e)>-1!==n})}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function o(e){var t={};return oe.each(e.match(we)||[],function(e,n){t[n]=!0}),t}function s(){G.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s),oe.ready()}function a(){this.expando=oe.expando+a.uid++}function u(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(je,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Se.test(n)?oe.parseJSON(n):n)}catch(e){}Ne.set(e,t,n)}else n=void 0;return n}function l(e,t,n,r){var i,o=1,s=20,a=r?function(){return r.cur()}:function(){return oe.css(e,t,"")},u=a(),l=n&&n[3]||(oe.cssNumber[t]?"":"px"),c=(oe.cssNumber[t]||"px"!==l&&+u)&&Ae.exec(oe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,oe.style(e,t,c+l);while(o!==(o=a()/u)&&1!==o&&--s)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function c(e,t){var n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&oe.nodeName(e,t)?oe.merge([e],n):n}function f(e,t){for(var n=0,r=e.length;n<r;n++)Ee.set(e[n],"globalEval",!t||Ee.get(t[n],"globalEval"))}function p(e,t,n,r,i){for(var o,s,a,u,l,p,d=t.createDocumentFragment(),h=[],g=0,v=e.length;g<v;g++)if(o=e[g],o||0===o)if("object"===oe.type(o))oe.merge(h,o.nodeType?[o]:o);else if(Re.test(o)){for(s=s||d.appendChild(t.createElement("div")),a=(Oe.exec(o)||["",""])[1].toLowerCase(),u=Pe[a]||Pe._default,s.innerHTML=u[1]+oe.htmlPrefilter(o)+u[2],p=u[0];p--;)s=s.lastChild;oe.merge(h,s.childNodes),s=d.firstChild,s.textContent=""}else h.push(t.createTextNode(o));for(d.textContent="",g=0;o=h[g++];)if(r&&oe.inArray(o,r)>-1)i&&i.push(o);else if(l=oe.contains(o.ownerDocument,o),s=c(d.appendChild(o),"script"),l&&f(s),n)for(p=0;o=s[p++];)Fe.test(o.type||"")&&n.push(o);return d}function d(){return!0}function h(){return!1}function g(){try{return G.activeElement}catch(e){}}function v(e,t,n,r,i,o){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)v(e,a,n,r,t[a],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=h;else if(!i)return e;return 1===o&&(s=i,i=function(e){return oe().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=oe.guid++)),e.each(function(){oe.event.add(this,t,i,r,n)})}function m(e,t){return oe.nodeName(e,"table")&&oe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function y(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function x(e){var t=Xe.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function b(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(Ee.hasData(e)&&(o=Ee.access(e),s=Ee.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)oe.event.add(t,i,l[i][n])}Ne.hasData(e)&&(a=Ne.access(e),u=oe.extend({},a),Ne.set(t,u))}}function w(e,t){var n=t.nodeName.toLowerCase();"input"===n&&He.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function T(e,t,n,r){t=J.apply([],t);var i,o,s,a,u,l,f=0,d=e.length,h=d-1,g=t[0],v=oe.isFunction(g);if(v||d>1&&"string"==typeof g&&!re.checkClone&&_e.test(g))return e.each(function(i){var o=e.eq(i);v&&(t[0]=g.call(this,i,o.html())),T(o,t,n,r)});if(d&&(i=p(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=oe.map(c(i,"script"),y),a=s.length;f<d;f++)u=i,f!==h&&(u=oe.clone(u,!0,!0),a&&oe.merge(s,c(u,"script"))),n.call(e[f],u,f);if(a)for(l=s[s.length-1].ownerDocument,oe.map(s,x),f=0;f<a;f++)u=s[f],Fe.test(u.type||"")&&!Ee.access(u,"globalEval")&&oe.contains(l,u)&&(u.src?oe._evalUrl&&oe._evalUrl(u.src):oe.globalEval(u.textContent.replace(ze,"")))}return e}function C(e,t,n){for(var r,i=t?oe.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||oe.cleanData(c(r)),r.parentNode&&(n&&oe.contains(r.ownerDocument,r)&&f(c(r,"script")),r.parentNode.removeChild(r));return e}function k(e,t){var n=oe(t.createElement(e)).appendTo(t.body),r=oe.css(n[0],"display");return n.detach(),r}function E(e){var t=G,n=Ve[e];return n||(n=k(e,t),"none"!==n&&n||(Ue=(Ue||oe("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=Ue[0].contentDocument,t.write(),t.close(),n=k(e,t),Ue.detach()),Ve[e]=n),n}function N(e,t,n){var r,i,o,s,a=e.style;return n=n||Qe(e),s=n?n.getPropertyValue(t)||n[t]:void 0,""!==s&&void 0!==s||oe.contains(e.ownerDocument,e)||(s=oe.style(e,t)),n&&!re.pixelMarginRight()&&Ge.test(s)&&Ye.test(t)&&(r=a.width,i=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=i,a.maxWidth=o),void 0!==s?s+"":s}function S(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function j(e){if(e in rt)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=nt.length;n--;)if(e=nt[n]+t,e in rt)return e}function D(e,t,n){var r=Ae.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function A(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;o<4;o+=2)"margin"===n&&(s+=oe.css(e,n+qe[o],!0,i)),r?("content"===n&&(s-=oe.css(e,"padding"+qe[o],!0,i)),"margin"!==n&&(s-=oe.css(e,"border"+qe[o]+"Width",!0,i))):(s+=oe.css(e,"padding"+qe[o],!0,i),"padding"!==n&&(s+=oe.css(e,"border"+qe[o]+"Width",!0,i)));return s}function q(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Qe(e),s="border-box"===oe.css(e,"boxSizing",!1,o);if(i<=0||null==i){if(i=N(e,t,o),(i<0||null==i)&&(i=e.style[t]),Ge.test(i))return i;r=s&&(re.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+A(e,t,n||(s?"border":"content"),r,o)+"px"}function L(e,t){for(var n,r,i,o=[],s=0,a=e.length;s<a;s++)r=e[s],r.style&&(o[s]=Ee.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Le(r)&&(o[s]=Ee.access(r,"olddisplay",E(r.nodeName)))):(i=Le(r),"none"===n&&i||Ee.set(r,"olddisplay",i?n:oe.css(r,"display"))));for(s=0;s<a;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}function H(e,t,n,r,i){return new H.prototype.init(e,t,n,r,i)}function O(){return e.setTimeout(function(){it=void 0}),it=oe.now()}function F(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)n=qe[r],i["margin"+n]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function P(e,t,n){for(var r,i=(I.tweeners[t]||[]).concat(I.tweeners["*"]),o=0,s=i.length;o<s;o++)if(r=i[o].call(n,t,e))return r}function R(e,t,n){var r,i,o,s,a,u,l,c,f=this,p={},d=e.style,h=e.nodeType&&Le(e),g=Ee.get(e,"fxshow");n.queue||(a=oe._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,f.always(function(){f.always(function(){a.unqueued--,oe.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],l=oe.css(e,"display"),c="none"===l?Ee.get(e,"olddisplay")||E(e.nodeName):l,"inline"===c&&"none"===oe.css(e,"float")&&(d.display="inline-block")),n.overflow&&(d.overflow="hidden",f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],st.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}p[r]=g&&g[r]||oe.style(e,r)}else l=void 0;if(oe.isEmptyObject(p))"inline"===("none"===l?E(e.nodeName):l)&&(d.display=l);else{g?"hidden"in g&&(h=g.hidden):g=Ee.access(e,"fxshow",{}),o&&(g.hidden=!h),h?oe(e).show():f.done(function(){oe(e).hide()}),f.done(function(){var t;Ee.remove(e,"fxshow");for(t in p)oe.style(e,t,p[t])});for(r in p)s=P(h?g[r]:0,r,f),r in g||(g[r]=s.start,h&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function M(e,t){var n,r,i,o,s;for(n in e)if(r=oe.camelCase(n),i=t[r],o=e[n],oe.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=oe.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function I(e,t,n){var r,i,o=0,s=I.prefilters.length,a=oe.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=it||O(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;s<u;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),o<1&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:oe.extend({},t),opts:oe.extend(!0,{specialEasing:{},easing:oe.easing._default},n),originalProperties:t,originalOptions:n,startTime:it||O(),duration:n.duration,tweens:[],createTween:function(t,n){var r=oe.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(a.notifyWith(e,[l,1,0]),a.resolveWith(e,[l,t])):a.rejectWith(e,[l,t]),this}}),c=l.props;for(M(c,l.opts.specialEasing);o<s;o++)if(r=I.prefilters[o].call(l,e,c,l.opts))return oe.isFunction(r.stop)&&(oe._queueHooks(l.elem,l.opts.queue).stop=oe.proxy(r.stop,r)),r;return oe.map(c,P,l),oe.isFunction(l.opts.start)&&l.opts.start.call(e,l),oe.fx.timer(oe.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function W(e){return e.getAttribute&&e.getAttribute("class")||""}function $(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(we)||[];if(oe.isFunction(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function B(e,t,n,r){function i(a){var u;return o[a]=!0,oe.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||s||o[l]?s?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},s=e===Nt;return i(t.dataTypes[0])||!o["*"]&&i("*")}function _(e,t){var n,r,i=oe.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&oe.extend(!0,e,r),e}function X(e,t,n){for(var r,i,o,s,a=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}if(o)return o!==u[0]&&u.unshift(o),n[o]}function z(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:"parsererror",error:s?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function U(e,t,n,r){var i;if(oe.isArray(t))oe.each(t,function(t,i){n||At.test(e)?r(e,i):U(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==oe.type(t))r(e,t);else for(i in t)U(e+"["+i+"]",t[i],n,r)}function V(e){return oe.isWindow(e)?e:9===e.nodeType&&e.defaultView}var Y=[],G=e.document,Q=Y.slice,J=Y.concat,K=Y.push,Z=Y.indexOf,ee={},te=ee.toString,ne=ee.hasOwnProperty,re={},ie="2.2.4",oe=function(e,t){return new oe.fn.init(e,t)},se=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ae=/^-ms-/,ue=/-([\da-z])/gi,le=function(e,t){return t.toUpperCase()};oe.fn=oe.prototype={jquery:ie,constructor:oe,selector:"",length:0,toArray:function(){return Q.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:Q.call(this)},pushStack:function(e){var t=oe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e){return oe.each(this,e)},map:function(e){return this.pushStack(oe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(Q.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:K,sort:Y.sort,splice:Y.splice},oe.extend=oe.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[a]||{},a++),"object"==typeof s||oe.isFunction(s)||(s={}),a===u&&(s=this,a--);a<u;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(oe.isPlainObject(r)||(i=oe.isArray(r)))?(i?(i=!1,o=n&&oe.isArray(n)?n:[]):o=n&&oe.isPlainObject(n)?n:{},s[t]=oe.extend(l,o,r)):void 0!==r&&(s[t]=r));return s},oe.extend({expando:"jQuery"+(ie+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===oe.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){var t=e&&e.toString();return!oe.isArray(e)&&t-parseFloat(t)+1>=0},isPlainObject:function(e){var t;if("object"!==oe.type(e)||e.nodeType||oe.isWindow(e))return!1;if(e.constructor&&!ne.call(e,"constructor")&&!ne.call(e.constructor.prototype||{},"isPrototypeOf"))return!1;for(t in e);return void 0===t||ne.call(e,t)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ee[te.call(e)]||"object":typeof e},globalEval:function(e){var t,n=eval;e=oe.trim(e),e&&(1===e.indexOf("use strict")?(t=G.createElement("script"),t.text=e,G.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(ae,"ms-").replace(ue,le)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;i<r&&t.call(e[i],i,e[i])!==!1;i++);else for(i in e)if(t.call(e[i],i,e[i])===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(se,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?oe.merge(r,"string"==typeof e?[e]:e):K.call(r,e)),r},inArray:function(e,t,n){return null==t?-1:Z.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,s=e.length,a=!n;o<s;o++)r=!t(e[o],o),r!==a&&i.push(e[o]);return i},map:function(e,t,r){var i,o,s=0,a=[];if(n(e))for(i=e.length;s<i;s++)o=t(e[s],s,r),null!=o&&a.push(o);else for(s in e)o=t(e[s],s,r),null!=o&&a.push(o);return J.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),oe.isFunction(e))return r=Q.call(arguments,2),i=function(){return e.apply(t||this,r.concat(Q.call(arguments)))},i.guid=e.guid=e.guid||oe.guid++,i},now:Date.now,support:re}),"function"==typeof Symbol&&(oe.fn[Symbol.iterator]=Y[Symbol.iterator]),oe.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){ee["[object "+t+"]"]=t.toLowerCase()});var ce=function(e){function t(e,t,n,r){var i,o,s,a,u,l,f,d,h=t&&t.ownerDocument,g=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==g&&9!==g&&11!==g)return n;if(!r&&((t?t.ownerDocument||t:W)!==L&&q(t),t=t||L,O)){if(11!==g&&(l=me.exec(e)))if(i=l[1]){if(9===g){if(!(s=t.getElementById(i)))return n;if(s.id===i)return n.push(s),n}else if(h&&(s=h.getElementById(i))&&M(t,s)&&s.id===i)return n.push(s),n}else{if(l[2])return K.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&w.getElementsByClassName&&t.getElementsByClassName)return K.apply(n,t.getElementsByClassName(i)),n}if(w.qsa&&!z[e+" "]&&(!F||!F.test(e))){if(1!==g)h=t,d=e;else if("object"!==t.nodeName.toLowerCase()){for((a=t.getAttribute("id"))?a=a.replace(xe,"\\$&"):t.setAttribute("id",a=I),f=E(e),o=f.length,u=pe.test(a)?"#"+a:"[id='"+a+"']";o--;)f[o]=u+" "+p(f[o]);d=f.join(","),h=ye.test(e)&&c(t.parentNode)||t}if(d)try{return K.apply(n,h.querySelectorAll(d)),n}catch(e){}finally{a===I&&t.removeAttribute("id")}}}return S(e.replace(ae,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>T.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[I]=!0,e}function i(e){var t=L.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function p(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,s){var a,u,l,c=[$,o];if(s){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,s))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[I]||(t[I]={}),u=l[t.uniqueID]||(l[t.uniqueID]={}),(a=u[r])&&a[0]===$&&a[1]===o)return c[2]=a[2];if(u[r]=c,c[2]=e(t,n,s))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i<o;i++)t(e,n[i],r);return r}function v(e,t,n,r,i){for(var o,s=[],a=0,u=e.length,l=null!=t;a<u;a++)(o=e[a])&&(n&&!n(o,r,i)||(s.push(o),l&&t.push(a)));return s}function m(e,t,n,i,o,s){return i&&!i[I]&&(i=m(i)),o&&!o[I]&&(o=m(o,s)),r(function(r,s,a,u){var l,c,f,p=[],d=[],h=s.length,m=r||g(t||"*",a.nodeType?[a]:a,[]),y=!e||!r&&t?m:v(m,p,e,a,u),x=n?o||(r?e:h||i)?[]:s:y;if(n&&n(y,x,a,u),i)for(l=v(x,d),i(l,[],a,u),c=l.length;c--;)(f=l[c])&&(x[d[c]]=!(y[d[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(y[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):p[c])>-1&&(r[l]=!(s[l]=f))}}else x=v(x===s?x.splice(h,x.length):x),o?o(null,s,x,u):K.apply(s,x)})}function y(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],s=o||T.relative[" "],a=o?1:0,u=d(function(e){return e===t},s,!0),l=d(function(e){return ee(t,e)>-1},s,!0),c=[function(e,n,r){var i=!o&&(r||n!==j)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];a<i;a++)if(n=T.relative[e[a].type])c=[d(h(c),n)];else{if(n=T.filter[e[a].type].apply(null,e[a].matches),n[I]){for(r=++a;r<i&&!T.relative[e[r].type];r++);return m(a>1&&h(c),a>1&&p(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a<r&&y(e.slice(a,r)),r<i&&y(e=e.slice(r)),r<i&&p(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,o=e.length>0,s=function(r,s,a,u,l){var c,f,p,d=0,h="0",g=r&&[],m=[],y=j,x=r||o&&T.find.TAG("*",l),b=$+=null==y?1:Math.random()||.1,w=x.length;for(l&&(j=s===L||s||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,s||c.ownerDocument===L||(q(c),a=!O);p=e[f++];)if(p(c,s||L,a)){u.push(c);break}l&&($=b)}i&&((c=!p&&c)&&d--,r&&g.push(c))}if(d+=h,i&&h!==d){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(d>0)for(;h--;)g[h]||m[h]||(m[h]=Q.call(u));m=v(m)}K.apply(u,m),l&&!r&&m.length>0&&d+n.length>1&&t.uniqueSort(u)}return l&&($=b,j=y),g};return i?r(s):s}var b,w,T,C,k,E,N,S,j,D,A,q,L,H,O,F,P,R,M,I="sizzle"+1*new Date,W=e.document,$=0,B=0,_=n(),X=n(),z=n(),U=function(e,t){return e===t&&(A=!0),0},V=1<<31,Y={}.hasOwnProperty,G=[],Q=G.pop,J=G.push,K=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+re+"))|)"+ne+"*\\]",oe=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",se=new RegExp(ne+"+","g"),ae=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),le=new RegExp("^"+ne+"*([>+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),pe=new RegExp("^"+re+"$"),de={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,ve=/^[^{]+\{\s*\[native \w/,me=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){q()};try{K.apply(G=Z.call(W.childNodes),W.childNodes),G[W.childNodes.length].nodeType}catch(e){K={apply:G.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},q=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,O=!k(L),(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=ve.test(L.getElementsByClassName),w.getById=i(function(e){return H.appendChild(e).id=I,!L.getElementsByName||!L.getElementsByName(I).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&O){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&O)return t.getElementsByClassName(e)},P=[],F=[],(w.qsa=ve.test(L.querySelectorAll))&&(i(function(e){H.appendChild(e).innerHTML="<a id='"+I+"'></a><select id='"+I+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+I+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+I+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=ve.test(R=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&i(function(e){w.disconnectedMatch=R.call(e,"div"),R.call(e,"[s!='']:x"),P.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),P=P.length&&new RegExp(P.join("|")),t=ve.test(H.compareDocumentPosition),M=t||ve.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return A=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return A=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===L?-1:t===L?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&q(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&O&&!z[n+" "]&&(!P||!P.test(n))&&(!F||!F.test(n)))try{var r=R.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&q(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&q(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!O):void 0;return void 0!==r?r:w.attributes||!O?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(A=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),A){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:de,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return de.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=_[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&_(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==s?"nextSibling":"previousSibling",v=t.parentNode,m=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(v){if(o){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===m:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&y){for(p=v,f=p[I]||(p[I]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],d=l[0]===$&&l[1],x=d&&l[2],p=d&&v.childNodes[d];p=++d&&p&&p[g]||(x=d=0)||h.pop();)if(1===p.nodeType&&++x&&p===t){c[e]=[$,d,x];break}}else if(y&&(p=t,f=p[I]||(p[I]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),l=c[e]||[],d=l[0]===$&&l[1],x=d),x===!1)for(;(p=++d&&p&&p[g]||(x=d=0)||h.pop())&&((a?p.nodeName.toLowerCase()!==m:1!==p.nodeType)||!++x||(y&&(f=p[I]||(p[I]={}),c=f[p.uniqueID]||(f[p.uniqueID]={}),c[e]=[$,x]),p!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[I]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),s=i.length;s--;)r=ee(e,i[s]),e[r]=!(t[r]=i[s])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=N(e.replace(ae,"$1"));return i[I]?r(function(e,t,n,r){for(var o,s=i(e,null,r,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=O?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n); +return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=a(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,E=t.tokenize=function(e,n){var r,i,o,s,a,u,l,c=X[e+" "];if(c)return n?0:c.slice(0);for(a=e,u=[],l=T.preFilter;a;){r&&!(i=ue.exec(a))||(i&&(a=a.slice(i[0].length)||a),u.push(o=[])),r=!1,(i=le.exec(a))&&(r=i.shift(),o.push({value:r,type:i[0].replace(ae," ")}),a=a.slice(r.length));for(s in T.filter)!(i=de[s].exec(a))||l[s]&&!(i=l[s](i))||(r=i.shift(),o.push({value:r,type:s,matches:i}),a=a.slice(r.length));if(!r)break}return n?a.length:a?t.error(e):X(e,u).slice(0)},N=t.compile=function(e,t){var n,r=[],i=[],o=z[e+" "];if(!o){for(t||(t=E(e)),n=t.length;n--;)o=y(t[n]),o[I]?r.push(o):i.push(o);o=z(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,s,a,u,l="function"==typeof e&&e,f=!r&&E(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"ID"===(s=o[0]).type&&w.getById&&9===t.nodeType&&O&&T.relative[o[1].type]){if(t=(T.find.ID(s.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=de.needsContext.test(e)?0:o.length;i--&&(s=o[i],!T.relative[a=s.type]);)if((u=T.find[a])&&(r=u(s.matches[0].replace(be,we),ye.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&p(o),!e)return K.apply(n,r),n;break}}return(l||N(e,f))(r,t,!O,n,!t||ye.test(e)&&c(t.parentNode)||t),n},w.sortStable=I.split("").sort(U).join("")===I,w.detectDuplicates=!!A,q(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(L.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);oe.find=ce,oe.expr=ce.selectors,oe.expr[":"]=oe.expr.pseudos,oe.uniqueSort=oe.unique=ce.uniqueSort,oe.text=ce.getText,oe.isXMLDoc=ce.isXML,oe.contains=ce.contains;var fe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&oe(e).is(n))break;r.push(e)}return r},pe=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},de=oe.expr.match.needsContext,he=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,ge=/^.[^:#\[\.,]*$/;oe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?oe.find.matchesSelector(r,e)?[r]:[]:oe.find.matches(e,oe.grep(t,function(e){return 1===e.nodeType}))},oe.fn.extend({find:function(e){var t,n=this.length,r=[],i=this;if("string"!=typeof e)return this.pushStack(oe(e).filter(function(){for(t=0;t<n;t++)if(oe.contains(i[t],this))return!0}));for(t=0;t<n;t++)oe.find(e,i[t],r);return r=this.pushStack(n>1?oe.unique(r):r),r.selector=this.selector?this.selector+" "+e:e,r},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&de.test(e)?oe(e):e||[],!1).length}});var ve,me=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ye=oe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||ve,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:me.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof oe?t[0]:t,oe.merge(this,oe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:G,!0)),he.test(r[1])&&oe.isPlainObject(t))for(r in t)oe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=G.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=G,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):oe.isFunction(e)?void 0!==n.ready?n.ready(e):e(oe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),oe.makeArray(e,this))};ye.prototype=oe.fn,ve=oe(G);var xe=/^(?:parents|prev(?:Until|All))/,be={children:!0,contents:!0,next:!0,prev:!0};oe.fn.extend({has:function(e){var t=oe(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(oe.contains(this,t[e]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],s=de.test(e)||"string"!=typeof e?oe(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?s.index(n)>-1:1===n.nodeType&&oe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?oe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?Z.call(oe(e),this[0]):Z.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(oe.uniqueSort(oe.merge(this.get(),oe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),oe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return fe(e,"parentNode")},parentsUntil:function(e,t,n){return fe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return fe(e,"nextSibling")},prevAll:function(e){return fe(e,"previousSibling")},nextUntil:function(e,t,n){return fe(e,"nextSibling",n)},prevUntil:function(e,t,n){return fe(e,"previousSibling",n)},siblings:function(e){return pe((e.parentNode||{}).firstChild,e)},children:function(e){return pe(e.firstChild)},contents:function(e){return e.contentDocument||oe.merge([],e.childNodes)}},function(e,t){oe.fn[e]=function(n,r){var i=oe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=oe.filter(r,i)),this.length>1&&(be[e]||oe.uniqueSort(i),xe.test(e)&&i.reverse()),this.pushStack(i)}});var we=/\S+/g;oe.Callbacks=function(e){e="string"==typeof e?o(e):oe.extend({},e);var t,n,r,i,s=[],a=[],u=-1,l=function(){for(i=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u<s.length;)s[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=s.length,n=!1);e.memory||(n=!1),t=!1,i&&(s=n?[]:"")},c={add:function(){return s&&(n&&!t&&(u=s.length-1,a.push(n)),function t(n){oe.each(n,function(n,r){oe.isFunction(r)?e.unique&&c.has(r)||s.push(r):r&&r.length&&"string"!==oe.type(r)&&t(r)})}(arguments),n&&!t&&l()),this},remove:function(){return oe.each(arguments,function(e,t){for(var n;(n=oe.inArray(t,s,n))>-1;)s.splice(n,1),n<=u&&u--}),this},has:function(e){return e?oe.inArray(e,s)>-1:s.length>0},empty:function(){return s&&(s=[]),this},disable:function(){return i=a=[],s=n="",this},disabled:function(){return!s},lock:function(){return i=a=[],n||(s=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},oe.extend({Deferred:function(e){var t=[["resolve","done",oe.Callbacks("once memory"),"resolved"],["reject","fail",oe.Callbacks("once memory"),"rejected"],["notify","progress",oe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return oe.Deferred(function(n){oe.each(t,function(t,o){var s=oe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&oe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?oe.extend(e,r):r}},i={};return r.pipe=r.then,oe.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=Q.call(arguments),s=o.length,a=1!==s||e&&oe.isFunction(e.promise)?s:0,u=1===a?e:oe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?Q.call(arguments):i,r===t?u.notifyWith(n,r):--a||u.resolveWith(n,r)}};if(s>1)for(t=new Array(s),n=new Array(s),r=new Array(s);i<s;i++)o[i]&&oe.isFunction(o[i].promise)?o[i].promise().progress(l(i,n,t)).done(l(i,r,o)).fail(u.reject):--a;return a||u.resolveWith(r,o),u.promise()}});var Te;oe.fn.ready=function(e){return oe.ready.promise().done(e),this},oe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?oe.readyWait++:oe.ready(!0)},ready:function(e){(e===!0?--oe.readyWait:oe.isReady)||(oe.isReady=!0,e!==!0&&--oe.readyWait>0||(Te.resolveWith(G,[oe]),oe.fn.triggerHandler&&(oe(G).triggerHandler("ready"),oe(G).off("ready"))))}}),oe.ready.promise=function(t){return Te||(Te=oe.Deferred(),"complete"===G.readyState||"loading"!==G.readyState&&!G.documentElement.doScroll?e.setTimeout(oe.ready):(G.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s))),Te.promise(t)},oe.ready.promise();var Ce=function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===oe.type(n)){i=!0;for(a in n)Ce(e,t,a,n[a],!0,o,s)}else if(void 0!==r&&(i=!0,oe.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(oe(e),n)})),t))for(;a<u;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},ke=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};a.uid=1,a.prototype={register:function(e,t){var n=t||{};return e.nodeType?e[this.expando]=n:Object.defineProperty(e,this.expando,{value:n,writable:!0,configurable:!0}),e[this.expando]},cache:function(e){if(!ke(e))return{};var t=e[this.expando];return t||(t={},ke(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[t]=n;else for(r in t)i[r]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][t]},access:function(e,t,n){var r;return void 0===t||t&&"string"==typeof t&&void 0===n?(r=this.get(e,t),void 0!==r?r:this.get(e,oe.camelCase(t))):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r,i,o=e[this.expando];if(void 0!==o){if(void 0===t)this.register(e);else{oe.isArray(t)?r=t.concat(t.map(oe.camelCase)):(i=oe.camelCase(t),t in o?r=[t,i]:(r=i,r=r in o?[r]:r.match(we)||[])),n=r.length;for(;n--;)delete o[r[n]]}(void 0===t||oe.isEmptyObject(o))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!oe.isEmptyObject(t)}};var Ee=new a,Ne=new a,Se=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,je=/[A-Z]/g;oe.extend({hasData:function(e){return Ne.hasData(e)||Ee.hasData(e)},data:function(e,t,n){return Ne.access(e,t,n)},removeData:function(e,t){Ne.remove(e,t)},_data:function(e,t,n){return Ee.access(e,t,n)},_removeData:function(e,t){Ee.remove(e,t)}}),oe.fn.extend({data:function(e,t){var n,r,i,o=this[0],s=o&&o.attributes;if(void 0===e){if(this.length&&(i=Ne.get(o),1===o.nodeType&&!Ee.get(o,"hasDataAttrs"))){for(n=s.length;n--;)s[n]&&(r=s[n].name,0===r.indexOf("data-")&&(r=oe.camelCase(r.slice(5)),u(o,r,i[r])));Ee.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){Ne.set(this,e)}):Ce(this,function(t){var n,r;if(o&&void 0===t){if(n=Ne.get(o,e)||Ne.get(o,e.replace(je,"-$&").toLowerCase()),void 0!==n)return n;if(r=oe.camelCase(e),n=Ne.get(o,r),void 0!==n)return n;if(n=u(o,r,void 0),void 0!==n)return n}else r=oe.camelCase(e),this.each(function(){var n=Ne.get(this,r);Ne.set(this,r,t),e.indexOf("-")>-1&&void 0!==n&&Ne.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Ne.remove(this,e)})}}),oe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Ee.get(e,t),n&&(!r||oe.isArray(n)?r=Ee.access(e,t,oe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=oe.queue(e,t),r=n.length,i=n.shift(),o=oe._queueHooks(e,t),s=function(){oe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Ee.get(e,n)||Ee.access(e,n,{empty:oe.Callbacks("once memory").add(function(){Ee.remove(e,[t+"queue",n])})})}}),oe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?oe.queue(this[0],e):void 0===t?this:this.each(function(){var n=oe.queue(this,e,t);oe._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&oe.dequeue(this,e)})},dequeue:function(e){return this.each(function(){oe.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=oe.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";s--;)n=Ee.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var De=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Ae=new RegExp("^(?:([+-])=|)("+De+")([a-z%]*)$","i"),qe=["Top","Right","Bottom","Left"],Le=function(e,t){return e=t||e,"none"===oe.css(e,"display")||!oe.contains(e.ownerDocument,e)},He=/^(?:checkbox|radio)$/i,Oe=/<([\w:-]+)/,Fe=/^$|\/(?:java|ecma)script/i,Pe={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Pe.optgroup=Pe.option,Pe.tbody=Pe.tfoot=Pe.colgroup=Pe.caption=Pe.thead,Pe.th=Pe.td;var Re=/<|&#?\w+;/;!function(){var e=G.createDocumentFragment(),t=e.appendChild(G.createElement("div")),n=G.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),re.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="<textarea>x</textarea>",re.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Me=/^key/,Ie=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,We=/^([^.]*)(?:\.(.+)|)/;oe.event={global:{},add:function(e,t,n,r,i){var o,s,a,u,l,c,f,p,d,h,g,v=Ee.get(e);if(v)for(n.handler&&(o=n,n=o.handler,i=o.selector),n.guid||(n.guid=oe.guid++),(u=v.events)||(u=v.events={}),(s=v.handle)||(s=v.handle=function(t){return"undefined"!=typeof oe&&oe.event.triggered!==t.type?oe.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(we)||[""],l=t.length;l--;)a=We.exec(t[l])||[],d=g=a[1],h=(a[2]||"").split(".").sort(),d&&(f=oe.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=oe.event.special[d]||{},c=oe.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&oe.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||(p=u[d]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,h,s)!==!1||e.addEventListener&&e.addEventListener(d,s)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),oe.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,s,a,u,l,c,f,p,d,h,g,v=Ee.hasData(e)&&Ee.get(e);if(v&&(u=v.events)){for(t=(t||"").match(we)||[""],l=t.length;l--;)if(a=We.exec(t[l])||[],d=g=a[1],h=(a[2]||"").split(".").sort(),d){for(f=oe.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,p=u[d]||[],a=a[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));s&&!p.length&&(f.teardown&&f.teardown.call(e,h,v.handle)!==!1||oe.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)oe.event.remove(e,d+t[l],n,r,!0);oe.isEmptyObject(u)&&Ee.remove(e,"handle events")}},dispatch:function(e){e=oe.event.fix(e);var t,n,r,i,o,s=[],a=Q.call(arguments),u=(Ee.get(this,"events")||{})[e.type]||[],l=oe.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(s=oe.event.handlers.call(this,e,u),t=0;(i=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((oe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n<a;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?oe(i,this).index(u)>-1:oe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return a<t.length&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||G,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},fix:function(e){if(e[oe.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];for(s||(this.fixHooks[i]=s=Ie.test(i)?this.mouseHooks:Me.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new oe.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=G),3===e.target.nodeType&&(e.target=e.target.parentNode),s.filter?s.filter(e,o):e},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==g()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===g()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&oe.nodeName(this,"input"))return this.click(),!1},_default:function(e){return oe.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},oe.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},oe.Event=function(e,t){return this instanceof oe.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?d:h):this.type=e,t&&oe.extend(this,t),this.timeStamp=e&&e.timeStamp||oe.now(),void(this[oe.expando]=!0)):new oe.Event(e,t)},oe.Event.prototype={constructor:oe.Event,isDefaultPrevented:h,isPropagationStopped:h,isImmediatePropagationStopped:h,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=d,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=d,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=d,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},oe.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){oe.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||oe.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),oe.fn.extend({on:function(e,t,n,r){return v(this,e,t,n,r)},one:function(e,t,n,r){return v(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,oe(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return t!==!1&&"function"!=typeof t||(n=t,t=void 0),n===!1&&(n=h),this.each(function(){oe.event.remove(this,e,n,t)})}});var $e=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Be=/<script|<style|<link/i,_e=/checked\s*(?:[^=]|=\s*.checked.)/i,Xe=/^true\/(.*)/,ze=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;oe.extend({htmlPrefilter:function(e){return e.replace($e,"<$1></$2>")},clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=oe.contains(e.ownerDocument,e);if(!(re.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||oe.isXMLDoc(e)))for(s=c(a),o=c(e),r=0,i=o.length;r<i;r++)w(o[r],s[r]);if(t)if(n)for(o=o||c(e),s=s||c(a),r=0,i=o.length;r<i;r++)b(o[r],s[r]);else b(e,a);return s=c(a,"script"),s.length>0&&f(s,!u&&c(e,"script")),a},cleanData:function(e){for(var t,n,r,i=oe.event.special,o=0;void 0!==(n=e[o]);o++)if(ke(n)){if(t=n[Ee.expando]){if(t.events)for(r in t.events)i[r]?oe.event.remove(n,r):oe.removeEvent(n,r,t.handle);n[Ee.expando]=void 0}n[Ne.expando]&&(n[Ne.expando]=void 0)}}}),oe.fn.extend({domManip:T,detach:function(e){return C(this,e,!0)},remove:function(e){return C(this,e)},text:function(e){return Ce(this,function(e){return void 0===e?oe.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return T(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=m(this,e);t.appendChild(e)}})},prepend:function(){return T(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=m(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return T(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return T(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(oe.cleanData(c(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return oe.clone(this,e,t)})},html:function(e){return Ce(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Be.test(e)&&!Pe[(Oe.exec(e)||["",""])[1].toLowerCase()]){e=oe.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(oe.cleanData(c(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return T(this,arguments,function(t){var n=this.parentNode;oe.inArray(this,e)<0&&(oe.cleanData(c(this)),n&&n.replaceChild(t,this))},e)}}),oe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){oe.fn[e]=function(e){for(var n,r=[],i=oe(e),o=i.length-1,s=0;s<=o;s++)n=s===o?this:this.clone(!0),oe(i[s])[t](n),K.apply(r,n.get());return this.pushStack(r)}});var Ue,Ve={HTML:"block",BODY:"block"},Ye=/^margin/,Ge=new RegExp("^("+De+")(?!px)[a-z%]+$","i"),Qe=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Je=function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i},Ke=G.documentElement;!function(){function t(){a.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",a.innerHTML="",Ke.appendChild(s);var t=e.getComputedStyle(a);n="1%"!==t.top,o="2px"===t.marginLeft,r="4px"===t.width,a.style.marginRight="50%",i="4px"===t.marginRight,Ke.removeChild(s)}var n,r,i,o,s=G.createElement("div"),a=G.createElement("div");a.style&&(a.style.backgroundClip="content-box",a.cloneNode(!0).style.backgroundClip="",re.clearCloneStyle="content-box"===a.style.backgroundClip,s.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",s.appendChild(a),oe.extend(re,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return null==r&&t(),r},pixelMarginRight:function(){return null==r&&t(),i},reliableMarginLeft:function(){return null==r&&t(),o},reliableMarginRight:function(){var t,n=a.appendChild(G.createElement("div"));return n.style.cssText=a.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",n.style.marginRight=n.style.width="0",a.style.width="1px",Ke.appendChild(s),t=!parseFloat(e.getComputedStyle(n).marginRight),Ke.removeChild(s),a.removeChild(n),t}}))}();var Ze=/^(none|table(?!-c[ea]).+)/,et={position:"absolute",visibility:"hidden",display:"block"},tt={letterSpacing:"0",fontWeight:"400"},nt=["Webkit","O","Moz","ms"],rt=G.createElement("div").style;oe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=N(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=oe.camelCase(t),u=e.style;return t=oe.cssProps[a]||(oe.cssProps[a]=j(a)||a),s=oe.cssHooks[t]||oe.cssHooks[a],void 0===n?s&&"get"in s&&void 0!==(i=s.get(e,!1,r))?i:u[t]:(o=typeof n,"string"===o&&(i=Ae.exec(n))&&i[1]&&(n=l(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(oe.cssNumber[a]?"":"px")),re.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&void 0===(n=s.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var i,o,s,a=oe.camelCase(t);return t=oe.cssProps[a]||(oe.cssProps[a]=j(a)||a),s=oe.cssHooks[t]||oe.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),void 0===i&&(i=N(e,t,r)),"normal"===i&&t in tt&&(i=tt[t]),""===n||n?(o=parseFloat(i),n===!0||isFinite(o)?o||0:i):i}}),oe.each(["height","width"],function(e,t){oe.cssHooks[t]={get:function(e,n,r){if(n)return Ze.test(oe.css(e,"display"))&&0===e.offsetWidth?Je(e,et,function(){return q(e,t,r)}):q(e,t,r)},set:function(e,n,r){var i,o=r&&Qe(e),s=r&&A(e,t,r,"border-box"===oe.css(e,"boxSizing",!1,o),o);return s&&(i=Ae.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=oe.css(e,t)),D(e,n,s)}}}),oe.cssHooks.marginLeft=S(re.reliableMarginLeft,function(e,t){if(t)return(parseFloat(N(e,"marginLeft"))||e.getBoundingClientRect().left-Je(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),oe.cssHooks.marginRight=S(re.reliableMarginRight,function(e,t){if(t)return Je(e,{display:"inline-block"},N,[e,"marginRight"])}),oe.each({margin:"",padding:"",border:"Width"},function(e,t){oe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+qe[r]+t]=o[r]||o[r-2]||o[0];return i}},Ye.test(e)||(oe.cssHooks[e+t].set=D)}),oe.fn.extend({css:function(e,t){return Ce(this,function(e,t,n){var r,i,o={},s=0;if(oe.isArray(t)){for(r=Qe(e),i=t.length;s<i;s++)o[t[s]]=oe.css(e,t[s],!1,r);return o}return void 0!==n?oe.style(e,t,n):oe.css(e,t)},e,t,arguments.length>1)},show:function(){return L(this,!0)},hide:function(){return L(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Le(this)?oe(this).show():oe(this).hide()})}}),oe.Tween=H,H.prototype={constructor:H,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||oe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(oe.cssNumber[n]?"":"px")},cur:function(){var e=H.propHooks[this.prop];return e&&e.get?e.get(this):H.propHooks._default.get(this)},run:function(e){var t,n=H.propHooks[this.prop];return this.options.duration?this.pos=t=oe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):H.propHooks._default.set(this),this}},H.prototype.init.prototype=H.prototype,H.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=oe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){oe.fx.step[e.prop]?oe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[oe.cssProps[e.prop]]&&!oe.cssHooks[e.prop]?e.elem[e.prop]=e.now:oe.style(e.elem,e.prop,e.now+e.unit)}}},H.propHooks.scrollTop=H.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},oe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},oe.fx=H.prototype.init,oe.fx.step={};var it,ot,st=/^(?:toggle|show|hide)$/,at=/queueHooks$/;oe.Animation=oe.extend(I,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return l(n.elem,e,Ae.exec(t),n),n}]},tweener:function(e,t){oe.isFunction(e)?(t=e,e=["*"]):e=e.match(we);for(var n,r=0,i=e.length;r<i;r++)n=e[r],I.tweeners[n]=I.tweeners[n]||[],I.tweeners[n].unshift(t)},prefilters:[R],prefilter:function(e,t){t?I.prefilters.unshift(e):I.prefilters.push(e)}}),oe.speed=function(e,t,n){var r=e&&"object"==typeof e?oe.extend({},e):{complete:n||!n&&t||oe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!oe.isFunction(t)&&t};return r.duration=oe.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in oe.fx.speeds?oe.fx.speeds[r.duration]:oe.fx.speeds._default,null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){oe.isFunction(r.old)&&r.old.call(this),r.queue&&oe.dequeue(this,r.queue)},r},oe.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Le).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=oe.isEmptyObject(e),o=oe.speed(t,n,r),s=function(){var t=I(this,oe.extend({},e),o);(i||Ee.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=oe.timers,s=Ee.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&at.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||oe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=Ee.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=oe.timers,s=r?r.length:0;for(n.finish=!0,oe.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<s;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),oe.each(["toggle","show","hide"],function(e,t){var n=oe.fn[t];oe.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(F(t,!0),e,r,i)}}),oe.each({slideDown:F("show"),slideUp:F("hide"),slideToggle:F("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){oe.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),oe.timers=[],oe.fx.tick=function(){var e,t=0,n=oe.timers;for(it=oe.now();t<n.length;t++)e=n[t],e()||n[t]!==e||n.splice(t--,1);n.length||oe.fx.stop(),it=void 0},oe.fx.timer=function(e){ +oe.timers.push(e),e()?oe.fx.start():oe.timers.pop()},oe.fx.interval=13,oe.fx.start=function(){ot||(ot=e.setInterval(oe.fx.tick,oe.fx.interval))},oe.fx.stop=function(){e.clearInterval(ot),ot=null},oe.fx.speeds={slow:600,fast:200,_default:400},oe.fn.delay=function(t,n){return t=oe.fx?oe.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=G.createElement("input"),t=G.createElement("select"),n=t.appendChild(G.createElement("option"));e.type="checkbox",re.checkOn=""!==e.value,re.optSelected=n.selected,t.disabled=!0,re.optDisabled=!n.disabled,e=G.createElement("input"),e.value="t",e.type="radio",re.radioValue="t"===e.value}();var ut,lt=oe.expr.attrHandle;oe.fn.extend({attr:function(e,t){return Ce(this,oe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){oe.removeAttr(this,e)})}}),oe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?oe.prop(e,t,n):(1===o&&oe.isXMLDoc(e)||(t=t.toLowerCase(),i=oe.attrHooks[t]||(oe.expr.match.bool.test(t)?ut:void 0)),void 0!==n?null===n?void oe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=oe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!re.radioValue&&"radio"===t&&oe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(we);if(o&&1===e.nodeType)for(;n=o[i++];)r=oe.propFix[n]||n,oe.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)}}),ut={set:function(e,t,n){return t===!1?oe.removeAttr(e,n):e.setAttribute(n,n),n}},oe.each(oe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=lt[t]||oe.find.attr;lt[t]=function(e,t,r){var i,o;return r||(o=lt[t],lt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,lt[t]=o),i}});var ct=/^(?:input|select|textarea|button)$/i,ft=/^(?:a|area)$/i;oe.fn.extend({prop:function(e,t){return Ce(this,oe.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[oe.propFix[e]||e]})}}),oe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&oe.isXMLDoc(e)||(t=oe.propFix[t]||t,i=oe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=oe.find.attr(e,"tabindex");return t?parseInt(t,10):ct.test(e.nodeName)||ft.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),re.optSelected||(oe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),oe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){oe.propFix[this.toLowerCase()]=this});var pt=/[\t\r\n\f]/g;oe.fn.extend({addClass:function(e){var t,n,r,i,o,s,a,u=0;if(oe.isFunction(e))return this.each(function(t){oe(this).addClass(e.call(this,t,W(this)))});if("string"==typeof e&&e)for(t=e.match(we)||[];n=this[u++];)if(i=W(n),r=1===n.nodeType&&(" "+i+" ").replace(pt," ")){for(s=0;o=t[s++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");a=oe.trim(r),i!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,i,o,s,a,u=0;if(oe.isFunction(e))return this.each(function(t){oe(this).removeClass(e.call(this,t,W(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(we)||[];n=this[u++];)if(i=W(n),r=1===n.nodeType&&(" "+i+" ").replace(pt," ")){for(s=0;o=t[s++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");a=oe.trim(r),i!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):oe.isFunction(e)?this.each(function(n){oe(this).toggleClass(e.call(this,n,W(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=oe(this),o=e.match(we)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=W(this),t&&Ee.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Ee.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+W(n)+" ").replace(pt," ").indexOf(t)>-1)return!0;return!1}});var dt=/\r/g,ht=/[\x20\t\r\n\f]+/g;oe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=oe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,oe(this).val()):e,null==i?i="":"number"==typeof i?i+="":oe.isArray(i)&&(i=oe.map(i,function(e){return null==e?"":e+""})),t=oe.valHooks[this.type]||oe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=oe.valHooks[i.type]||oe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(dt,""):null==n?"":n)}}}),oe.extend({valHooks:{option:{get:function(e){var t=oe.find.attr(e,"value");return null!=t?t:oe.trim(oe.text(e)).replace(ht," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,s=o?null:[],a=o?i+1:r.length,u=i<0?a:o?i:0;u<a;u++)if(n=r[u],(n.selected||u===i)&&(re.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!oe.nodeName(n.parentNode,"optgroup"))){if(t=oe(n).val(),o)return t;s.push(t)}return s},set:function(e,t){for(var n,r,i=e.options,o=oe.makeArray(t),s=i.length;s--;)r=i[s],(r.selected=oe.inArray(oe.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),oe.each(["radio","checkbox"],function(){oe.valHooks[this]={set:function(e,t){if(oe.isArray(t))return e.checked=oe.inArray(oe(e).val(),t)>-1}},re.checkOn||(oe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var gt=/^(?:focusinfocus|focusoutblur)$/;oe.extend(oe.event,{trigger:function(t,n,r,i){var o,s,a,u,l,c,f,p=[r||G],d=ne.call(t,"type")?t.type:t,h=ne.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||G,3!==r.nodeType&&8!==r.nodeType&&!gt.test(d+oe.event.triggered)&&(d.indexOf(".")>-1&&(h=d.split("."),d=h.shift(),h.sort()),l=d.indexOf(":")<0&&"on"+d,t=t[oe.expando]?t:new oe.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:oe.makeArray(n,[t]),f=oe.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!oe.isWindow(r)){for(u=f.delegateType||d,gt.test(u+d)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||G)&&p.push(a.defaultView||a.parentWindow||e)}for(o=0;(s=p[o++])&&!t.isPropagationStopped();)t.type=o>1?u:f.bindType||d,c=(Ee.get(s,"events")||{})[t.type]&&Ee.get(s,"handle"),c&&c.apply(s,n),c=l&&s[l],c&&c.apply&&ke(s)&&(t.result=c.apply(s,n),t.result===!1&&t.preventDefault());return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!ke(r)||l&&oe.isFunction(r[d])&&!oe.isWindow(r)&&(a=r[l],a&&(r[l]=null),oe.event.triggered=d,r[d](),oe.event.triggered=void 0,a&&(r[l]=a)),t.result}},simulate:function(e,t,n){var r=oe.extend(new oe.Event,n,{type:e,isSimulated:!0});oe.event.trigger(r,null,t)}}),oe.fn.extend({trigger:function(e,t){return this.each(function(){oe.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return oe.event.trigger(e,t,n,!0)}}),oe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){oe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),oe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),re.focusin="onfocusin"in e,re.focusin||oe.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){oe.event.simulate(t,e.target,oe.event.fix(e))};oe.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=Ee.access(r,t);i||r.addEventListener(e,n,!0),Ee.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=Ee.access(r,t)-1;i?Ee.access(r,t,i):(r.removeEventListener(e,n,!0),Ee.remove(r,t))}}});var vt=e.location,mt=oe.now(),yt=/\?/;oe.parseJSON=function(e){return JSON.parse(e+"")},oe.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||oe.error("Invalid XML: "+t),n};var xt=/#.*$/,bt=/([?&])_=[^&]*/,wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Tt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ct=/^(?:GET|HEAD)$/,kt=/^\/\//,Et={},Nt={},St="*/".concat("*"),jt=G.createElement("a");jt.href=vt.href,oe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:vt.href,type:"GET",isLocal:Tt.test(vt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":St,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":oe.parseJSON,"text xml":oe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_(_(e,oe.ajaxSettings),t):_(oe.ajaxSettings,e)},ajaxPrefilter:$(Et),ajaxTransport:$(Nt),ajax:function(t,n){function r(t,n,r,a){var l,f,y,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),i=void 0,s=a||"",T.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(x=X(p,T,r)),x=z(p,x,T,l),l?(p.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(oe.lastModified[o]=w),w=T.getResponseHeader("etag"),w&&(oe.etag[o]=w)),204===t||"HEAD"===p.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,y=x.error,l=!y)):(y=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",l?g.resolveWith(d,[f,C,T]):g.rejectWith(d,[T,C,y]),T.statusCode(m),m=void 0,c&&h.trigger(l?"ajaxSuccess":"ajaxError",[T,p,l?f:y]),v.fireWith(d,[T,C]),c&&(h.trigger("ajaxComplete",[T,p]),--oe.active||oe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,s,a,u,l,c,f,p=oe.ajaxSetup({},n),d=p.context||p,h=p.context&&(d.nodeType||d.jquery)?oe(d):oe.event,g=oe.Deferred(),v=oe.Callbacks("once memory"),m=p.statusCode||{},y={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!a)for(a={};t=wt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)m[t]=[m[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return i&&i.abort(t),r(0,t),this}};if(g.promise(T).complete=v.add,T.success=T.done,T.error=T.fail,p.url=((t||p.url||vt.href)+"").replace(xt,"").replace(kt,vt.protocol+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=oe.trim(p.dataType||"*").toLowerCase().match(we)||[""],null==p.crossDomain){l=G.createElement("a");try{l.href=p.url,l.href=l.href,p.crossDomain=jt.protocol+"//"+jt.host!=l.protocol+"//"+l.host}catch(e){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=oe.param(p.data,p.traditional)),B(Et,p,n,T),2===b)return T;c=oe.event&&p.global,c&&0===oe.active++&&oe.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Ct.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(yt.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=bt.test(o)?o.replace(bt,"$1_="+mt++):o+(yt.test(o)?"&":"?")+"_="+mt++)),p.ifModified&&(oe.lastModified[o]&&T.setRequestHeader("If-Modified-Since",oe.lastModified[o]),oe.etag[o]&&T.setRequestHeader("If-None-Match",oe.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",p.contentType),T.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+St+"; q=0.01":""):p.accepts["*"]);for(f in p.headers)T.setRequestHeader(f,p.headers[f]);if(p.beforeSend&&(p.beforeSend.call(d,T,p)===!1||2===b))return T.abort();w="abort";for(f in{success:1,error:1,complete:1})T[f](p[f]);if(i=B(Nt,p,n,T)){if(T.readyState=1,c&&h.trigger("ajaxSend",[T,p]),2===b)return T;p.async&&p.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},p.timeout));try{b=1,i.send(y,r)}catch(e){if(!(b<2))throw e;r(-1,e)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return oe.get(e,t,n,"json")},getScript:function(e,t){return oe.get(e,void 0,t,"script")}}),oe.each(["get","post"],function(e,t){oe[t]=function(e,n,r,i){return oe.isFunction(n)&&(i=i||r,r=n,n=void 0),oe.ajax(oe.extend({url:e,type:t,dataType:i,data:n,success:r},oe.isPlainObject(e)&&e))}}),oe._evalUrl=function(e){return oe.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},oe.fn.extend({wrapAll:function(e){var t;return oe.isFunction(e)?this.each(function(t){oe(this).wrapAll(e.call(this,t))}):(this[0]&&(t=oe(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return oe.isFunction(e)?this.each(function(t){oe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=oe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=oe.isFunction(e);return this.each(function(n){oe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){oe.nodeName(this,"body")||oe(this).replaceWith(this.childNodes)}).end()}}),oe.expr.filters.hidden=function(e){return!oe.expr.filters.visible(e)},oe.expr.filters.visible=function(e){return e.offsetWidth>0||e.offsetHeight>0||e.getClientRects().length>0};var Dt=/%20/g,At=/\[\]$/,qt=/\r?\n/g,Lt=/^(?:submit|button|image|reset|file)$/i,Ht=/^(?:input|select|textarea|keygen)/i;oe.param=function(e,t){var n,r=[],i=function(e,t){t=oe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=oe.ajaxSettings&&oe.ajaxSettings.traditional),oe.isArray(e)||e.jquery&&!oe.isPlainObject(e))oe.each(e,function(){i(this.name,this.value)});else for(n in e)U(n,e[n],t,i);return r.join("&").replace(Dt,"+")},oe.fn.extend({serialize:function(){return oe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=oe.prop(this,"elements");return e?oe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!oe(this).is(":disabled")&&Ht.test(this.nodeName)&&!Lt.test(e)&&(this.checked||!He.test(e))}).map(function(e,t){var n=oe(this).val();return null==n?null:oe.isArray(n)?oe.map(n,function(e){return{name:t.name,value:e.replace(qt,"\r\n")}}):{name:t.name,value:n.replace(qt,"\r\n")}}).get()}}),oe.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Ot={0:200,1223:204},Ft=oe.ajaxSettings.xhr();re.cors=!!Ft&&"withCredentials"in Ft,re.ajax=Ft=!!Ft,oe.ajaxTransport(function(t){var n,r;if(re.cors||Ft&&!t.crossDomain)return{send:function(i,o){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(s in i)a.setRequestHeader(s,i[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?o(0,"error"):o(a.status,a.statusText):o(Ot[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),oe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return oe.globalEval(e),e}}}),oe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),oe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=oe("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),G.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Pt=[],Rt=/(=)\?(?=&|$)|\?\?/;oe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Pt.pop()||oe.expando+"_"+mt++;return this[e]=!0,e}}),oe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(Rt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rt.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=oe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Rt,"$1"+i):t.jsonp!==!1&&(t.url+=(yt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||oe.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){void 0===o?oe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Pt.push(i)),s&&oe.isFunction(o)&&o(s[0]),s=o=void 0}),"script"}),oe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||G;var r=he.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=p([e],t,i),i&&i.length&&oe(i).remove(),oe.merge([],r.childNodes))};var Mt=oe.fn.load;oe.fn.load=function(e,t,n){if("string"!=typeof e&&Mt)return Mt.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>-1&&(r=oe.trim(e.slice(a)),e=e.slice(0,a)),oe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),s.length>0&&oe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?oe("<div>").append(oe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},oe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){oe.fn[t]=function(e){return this.on(t,e)}}),oe.expr.filters.animated=function(e){return oe.grep(oe.timers,function(t){return e===t.elem}).length},oe.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=oe.css(e,"position"),f=oe(e),p={};"static"===c&&(e.style.position="relative"),a=f.offset(),o=oe.css(e,"top"),u=oe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=f.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),oe.isFunction(t)&&(t=t.call(e,n,oe.extend({},a))),null!=t.top&&(p.top=t.top-a.top+s),null!=t.left&&(p.left=t.left-a.left+i),"using"in t?t.using.call(e,p):f.css(p)}},oe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){oe.offset.setOffset(this,e,t)});var t,n,r=this[0],i={top:0,left:0},o=r&&r.ownerDocument;if(o)return t=o.documentElement,oe.contains(t,r)?(i=r.getBoundingClientRect(),n=V(o),{top:i.top+n.pageYOffset-t.clientTop,left:i.left+n.pageXOffset-t.clientLeft}):i},position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===oe.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),oe.nodeName(e[0],"html")||(r=e.offset()),r.top+=oe.css(e[0],"borderTopWidth",!0),r.left+=oe.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-oe.css(n,"marginTop",!0),left:t.left-r.left-oe.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===oe.css(e,"position");)e=e.offsetParent;return e||Ke})}}),oe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;oe.fn[e]=function(r){return Ce(this,function(e,r,i){var o=V(e);return void 0===i?o?o[t]:e[r]:void(o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i)},e,r,arguments.length)}}),oe.each(["top","left"],function(e,t){oe.cssHooks[t]=S(re.pixelPosition,function(e,n){if(n)return n=N(e,t),Ge.test(n)?oe(e).position()[t]+"px":n})}),oe.each({Height:"height",Width:"width"},function(e,t){oe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){oe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return Ce(this,function(t,n,r){var i;return oe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?oe.css(t,n,s):oe.style(t,n,r,s)},t,o?r:void 0,o,null)}})}),oe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},size:function(){return this.length}}),oe.fn.andSelf=oe.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return oe});var It=e.jQuery,Wt=e.$;return oe.noConflict=function(t){return e.$===oe&&(e.$=Wt),t&&e.jQuery===oe&&(e.jQuery=It),oe},t||(e.jQuery=e.$=oe),oe}); },{}],"lodash":[function(require,module,exports){ (function (global){ -(function(){function n(n,t){return n.set(t[0],t[1]),n}function t(n,t){return n.add(t),n}function r(n,t,r){var e=r.length;switch(e){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function e(n,t,r,e){for(var u=-1,i=n?n.length:0;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function u(n,t){for(var r=-1,e=n?n.length:0;++r<e&&t(n[r],r,n)!==!1;);return n}function i(n,t){for(var r=n?n.length:0;r--&&t(n[r],r,n)!==!1;);return n}function o(n,t){for(var r=-1,e=n?n.length:0;++r<e;)if(!t(n[r],r,n))return!1;return!0}function f(n,t){for(var r=-1,e=n?n.length:0,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function a(n,t){var r=n?n.length:0;return!!r&&y(n,t,0)>-1}function c(n,t,r){for(var e=-1,u=n?n.length:0;++e<u;)if(r(t,n[e]))return!0;return!1}function l(n,t){for(var r=-1,e=n?n.length:0,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function s(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function h(n,t,r,e){var u=-1,i=n?n.length:0;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);return r}function p(n,t,r,e){var u=n?n.length:0;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function v(n,t){for(var r=-1,e=n?n.length:0;++r<e;)if(t(n[r],r,n))return!0;return!1}function _(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,!1}),e}function g(n,t,r,e){for(var u=n.length,i=r+(e?1:-1);e?i--:++i<u;)if(t(n[i],i,n))return i;return-1}function y(n,t,r){if(t!==t)return z(n,r);for(var e=r-1,u=n.length;++e<u;)if(n[e]===t)return e;return-1}function d(n,t,r,e){for(var u=r-1,i=n.length;++u<i;)if(e(n[u],t))return u;return-1}function b(n,t){var r=n?n.length:0;return r?x(n,t)/r:xn}function w(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=!1,n):t(r,n,u,i)}),r}function m(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].value;return n}function x(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==K&&(r=r===K?i:r+i)}return r}function j(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function A(n,t){return l(t,function(t){return[t,n[t]]})}function O(n){return function(t){return n(t)}}function k(n,t){return l(t,function(t){return n[t]})}function I(n,t){return n.has(t)}function R(n,t){for(var r=-1,e=n.length;++r<e&&y(t,n[r],0)>-1;);return r}function E(n,t){for(var r=n.length;r--&&y(t,n[r],0)>-1;);return r}function S(n){return n&&n.Object===Object?n:null}function W(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&e++;return e}function L(n){return Ar[n]}function C(n){return Or[n]}function B(n){return"\\"+Ir[n]}function $(n,t){return null==n?K:n[t]}function z(n,t,r){for(var e=n.length,u=t+(r?1:-1);r?u--:++u<e;){var i=n[u];if(i!==i)return u}return-1}function U(n){var t=!1;if(null!=n&&"function"!=typeof n.toString)try{t=!!(n+"")}catch(r){}return t}function F(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function M(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function D(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&o!==Q||(n[r]=Q,i[u++]=r)}return i}function P(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=n}),r}function N(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function q(n){if(!n||!dr.test(n))return n.length;for(var t=gr.lastIndex=0;gr.test(n);)t++;return t}function T(n){return n.match(gr)}function Z(n){return kr[n]}function V(S){function Wt(n){if(bf(n)&&!ys(n)&&!(n instanceof Bt)){if(n instanceof Ct)return n;if(Sc.call(n,"__wrapped__"))return si(n)}return new Ct(n)}function Lt(){}function Ct(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=K}function Bt(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=jn,this.__views__=[]}function $t(){var n=new Bt(this.__wrapped__);return n.__actions__=ru(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=ru(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=ru(this.__views__),n}function zt(){if(this.__filtered__){var n=new Bt(this);n.__dir__=-1,n.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n}function Ut(){var n=this.__wrapped__.value(),t=this.__dir__,r=ys(n),e=t<0,u=r?n.length:0,i=Nu(0,u,this.__views__),o=i.start,f=i.end,a=f-o,c=e?f:o-1,l=this.__iteratees__,s=l.length,h=0,p=nl(a,this.__takeCount__);if(!r||u<J||u==a&&p==a)return Ue(n,this.__actions__);var v=[];n:for(;a--&&h<p;){c+=t;for(var _=-1,g=n[c];++_<s;){var y=l[_],d=y.iteratee,b=y.type,w=d(g);if(b==yn)g=w;else if(!w){if(b==gn)continue n;break n}}v[h++]=g}return v}function Ft(n){var t=-1,r=n?n.length:0;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Mt(){this.__data__=sl?sl(null):{}}function Dt(n){return this.has(n)&&delete this.__data__[n]}function Pt(n){var t=this.__data__;if(sl){var r=t[n];return r===H?K:r}return Sc.call(t,n)?t[n]:K}function Nt(n){var t=this.__data__;return sl?t[n]!==K:Sc.call(t,n)}function qt(n,t){var r=this.__data__;return r[n]=sl&&t===K?H:t,this}function Tt(n){var t=-1,r=n?n.length:0;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Zt(){this.__data__=[]}function Vt(n){var t=this.__data__,r=gr(t,n);if(r<0)return!1;var e=t.length-1;return r==e?t.pop():Zc.call(t,r,1),!0}function Kt(n){var t=this.__data__,r=gr(t,n);return r<0?K:t[r][1]}function Gt(n){return gr(this.__data__,n)>-1}function Jt(n,t){var r=this.__data__,e=gr(r,n);return e<0?r.push([n,t]):r[e][1]=t,this}function Yt(n){var t=-1,r=n?n.length:0;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Ht(){this.__data__={hash:new Ft,map:new(fl||Tt),string:new Ft}}function Qt(n){return zu(this,n)["delete"](n)}function Xt(n){return zu(this,n).get(n)}function nr(n){return zu(this,n).has(n)}function tr(n,t){return zu(this,n).set(n,t),this}function rr(n){var t=-1,r=n?n.length:0;for(this.__data__=new Yt;++t<r;)this.add(n[t])}function er(n){return this.__data__.set(n,H),this}function ur(n){return this.__data__.has(n)}function ir(n){this.__data__=new Tt(n)}function or(){this.__data__=new Tt}function fr(n){return this.__data__["delete"](n)}function ar(n){return this.__data__.get(n)}function cr(n){return this.__data__.has(n)}function lr(n,t){var r=this.__data__;return r instanceof Tt&&r.__data__.length==J&&(r=this.__data__=new Yt(r.__data__)),r.set(n,t),this}function sr(n,t,r,e){return n===K||tf(n,Oc[r])&&!Sc.call(e,r)?t:n}function hr(n,t,r){(r===K||tf(n[t],r))&&("number"!=typeof t||r!==K||t in n)||(n[t]=r)}function pr(n,t,r){var e=n[t];Sc.call(n,t)&&tf(e,r)&&(r!==K||t in n)||(n[t]=r)}function gr(n,t){for(var r=n.length;r--;)if(tf(n[r][0],t))return r;return-1}function Ar(n,t,r,e){return jl(n,function(n,u,i){t(e,n,r(n),i)}),e}function Or(n,t){return n&&eu(t,ua(t),n)}function kr(n,t){for(var r=-1,e=null==n,u=t.length,i=Array(u);++r<u;)i[r]=e?K:ta(n,t[r]);return i}function Ir(n,t,r){return n===n&&(r!==K&&(n=n<=r?n:r),t!==K&&(n=n>=t?n:t)),n}function Sr(n,t,r,e,i,o,f){var a;if(e&&(a=o?e(n,i,o,f):e(n)),a!==K)return a;if(!df(n))return n;var c=ys(n);if(c){if(a=Tu(n),!t)return ru(n,a)}else{var l=Pu(n),s=l==Wn||l==Ln;if(ds(n))return Te(n,t);if(l==$n||l==kn||s&&!o){if(U(n))return o?n:{};if(a=Zu(s?{}:n),!t)return uu(n,Or(a,n))}else{if(!jr[l])return o?n:{};a=Vu(n,l,Sr,t)}}f||(f=new ir);var h=f.get(n);if(h)return h;if(f.set(n,a),!c)var p=r?Wu(n):ua(n);return u(p||n,function(u,i){p&&(i=u,u=n[i]),pr(a,i,Sr(u,t,r,e,i,n,f))}),a}function Wr(n){var t=ua(n),r=t.length;return function(e){if(null==e)return!r;for(var u=r;u--;){var i=t[u],o=n[i],f=e[i];if(f===K&&!(i in Object(e))||!o(f))return!1}return!0}}function Cr(n){return df(n)?qc(n):{}}function Br(n,t,r){if("function"!=typeof n)throw new jc(Y);return Vc(function(){n.apply(K,r)},t)}function $r(n,t,r,e){var u=-1,i=a,o=!0,f=n.length,s=[],h=t.length;if(!f)return s;r&&(t=l(t,O(r))),e?(i=c,o=!1):t.length>=J&&(i=I,o=!1,t=new rr(t));n:for(;++u<f;){var p=n[u],v=r?r(p):p;if(p=e||0!==p?p:0,o&&v===v){for(var _=h;_--;)if(t[_]===v)continue n;s.push(p)}else i(t,v,e)||s.push(p)}return s}function Fr(n,t){var r=!0;return jl(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Mr(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(f===K?o===o&&!Cf(o):r(o,f)))var f=o,a=i}return a}function Dr(n,t,r,e){var u=n.length;for(r=Df(r),r<0&&(r=-r>u?0:u+r),e=e===K||e>u?u:Df(e),e<0&&(e+=u),e=r>e?0:Pf(e);r<e;)n[r++]=t;return n}function Pr(n,t){var r=[];return jl(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function Nr(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=Gu),u||(u=[]);++i<o;){var f=n[i];t>0&&r(f)?t>1?Nr(f,t-1,r,e,u):s(u,f):e||(u[u.length]=f)}return u}function qr(n,t){return n&&Ol(n,t,ua)}function Tr(n,t){return n&&kl(n,t,ua)}function Zr(n,t){return f(t,function(t){return _f(n[t])})}function Vr(n,t){t=Qu(t,n)?[t]:Ne(t);for(var r=0,e=t.length;null!=n&&r<e;)n=n[ci(t[r++])];return r&&r==e?n:K}function Kr(n,t,r){var e=t(n);return ys(n)?e:s(e,r(n))}function Gr(n,t){return n>t}function Jr(n,t){return null!=n&&(Sc.call(n,t)||"object"==typeof n&&t in n&&null===Mu(n))}function Yr(n,t){return null!=n&&t in Object(n)}function Hr(n,t,r){return n>=nl(t,r)&&n<Xc(t,r)}function Qr(n,t,r){for(var e=r?c:a,u=n[0].length,i=n.length,o=i,f=Array(i),s=1/0,h=[];o--;){var p=n[o];o&&t&&(p=l(p,O(t))),s=nl(p.length,s),f[o]=!r&&(t||u>=120&&p.length>=120)?new rr(o&&p):K}p=n[0];var v=-1,_=f[0];n:for(;++v<u&&h.length<s;){var g=p[v],y=t?t(g):g;if(g=r||0!==g?g:0,!(_?I(_,y):e(h,y,r))){for(o=i;--o;){var d=f[o];if(!(d?I(d,y):e(n[o],y,r)))continue n}_&&_.push(y),h.push(g)}}return h}function Xr(n,t,r,e){return qr(n,function(n,u,i){t(e,r(n),u,i)}),e}function ne(n,t,e){Qu(t,n)||(t=Ne(t),n=fi(n,t),t=Si(t));var u=null==n?n:n[ci(t)];return null==u?K:r(u,n,e)}function te(n,t,r,e,u){return n===t||(null==n||null==t||!df(n)&&!bf(t)?n!==n&&t!==t:re(n,t,te,r,e,u))}function re(n,t,r,e,u,i){var o=ys(n),f=ys(t),a=In,c=In;o||(a=Pu(n),a=a==kn?$n:a),f||(c=Pu(t),c=c==kn?$n:c);var l=a==$n&&!U(n),s=c==$n&&!U(t),h=a==c;if(h&&!l)return i||(i=new ir),o||Bf(n)?Ru(n,t,r,e,u,i):Eu(n,t,a,r,e,u,i);if(!(u&sn)){var p=l&&Sc.call(n,"__wrapped__"),v=s&&Sc.call(t,"__wrapped__");if(p||v){var _=p?n.value():n,g=v?t.value():t;return i||(i=new ir),r(_,g,e,u,i)}}return!!h&&(i||(i=new ir),Su(n,t,r,e,u,i))}function ee(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=Object(n);u--;){var f=r[u];if(o&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++u<i;){f=r[u];var a=f[0],c=n[a],l=f[1];if(o&&f[2]){if(c===K&&!(a in n))return!1}else{var s=new ir;if(e)var h=e(c,l,a,n,t,s);if(!(h===K?te(l,c,e,ln|sn,s):h))return!1}}return!0}function ue(n){if(!df(n)||ti(n))return!1;var t=_f(n)||U(n)?$c:Ot;return t.test(li(n))}function ie(n){return"function"==typeof n?n:null==n?Ka:"object"==typeof n?ys(n)?se(n[0],n[1]):le(n):tc(n)}function oe(n){return Qc(Object(n))}function fe(n){n=null==n?n:Object(n);var t=[];for(var r in n)t.push(r);return t}function ae(n,t){return n<t}function ce(n,t){var r=-1,e=uf(n)?Array(n.length):[];return jl(n,function(n,u,i){e[++r]=t(n,u,i)}),e}function le(n){var t=Uu(n);return 1==t.length&&t[0][2]?ui(t[0][0],t[0][1]):function(r){return r===n||ee(r,n,t)}}function se(n,t){return Qu(n)&&ei(t)?ui(ci(n),t):function(r){var e=ta(r,n);return e===K&&e===t?ea(r,n):te(t,e,K,ln|sn)}}function he(n,t,r,e,i){if(n!==t){if(!ys(t)&&!Bf(t))var o=ia(t);u(o||t,function(u,f){if(o&&(f=u,u=t[f]),df(u))i||(i=new ir),pe(n,t,f,r,he,e,i);else{var a=e?e(n[f],u,f+"",n,t,i):K;a===K&&(a=u),hr(n,f,a)}})}}function pe(n,t,r,e,u,i,o){var f=n[r],a=t[r],c=o.get(a);if(c)return void hr(n,r,c);var l=i?i(f,a,r+"",n,t,o):K,s=l===K;s&&(l=a,ys(a)||Bf(a)?ys(f)?l=f:of(f)?l=ru(f):(s=!1,l=Sr(a,!0)):Rf(a)||rf(a)?rf(f)?l=qf(f):!df(f)||e&&_f(f)?(s=!1,l=Sr(a,!0)):l=f:s=!1),o.set(a,l),s&&u(l,a,e,i,o),o["delete"](a),hr(n,r,l)}function ve(n,t){var r=n.length;if(r)return t+=t<0?r:0,Yu(t,r)?n[t]:K}function _e(n,t,r){var e=-1;t=l(t.length?t:[Ka],O($u()));var u=ce(n,function(n,r,u){var i=l(t,function(t){return t(n)});return{criteria:i,index:++e,value:n}});return m(u,function(n,t){return Xe(n,t,r)})}function ge(n,t){return n=Object(n),h(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function ye(n,t){for(var r=-1,e=Lu(n),u=e.length,i={};++r<u;){var o=e[r],f=n[o];t(f,o)&&(i[o]=f)}return i}function de(n){return function(t){return null==t?K:t[n]}}function be(n){return function(t){return Vr(t,n)}}function we(n,t,r,e){var u=e?d:y,i=-1,o=t.length,f=n;for(n===t&&(t=ru(t)),r&&(f=l(n,O(r)));++i<o;)for(var a=0,c=t[i],s=r?r(c):c;(a=u(f,s,a,e))>-1;)f!==n&&Zc.call(f,a,1),Zc.call(n,a,1);return n}function me(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;if(Yu(u))Zc.call(n,u,1);else if(Qu(u,n))delete n[ci(u)];else{var o=Ne(u),f=fi(n,o);null!=f&&delete f[ci(Si(o))]}}}return n}function xe(n,t){return n+Gc(rl()*(t-n+1))}function je(n,t,r,e){for(var u=-1,i=Xc(Kc((t-n)/(r||1)),0),o=Array(i);i--;)o[e?i:++u]=n,n+=r;return o}function Ae(n,t){var r="";if(!n||t<1||t>wn)return r;do t%2&&(r+=n),t=Gc(t/2),t&&(n+=n);while(t);return r}function Oe(n,t,r,e){t=Qu(t,n)?[t]:Ne(t);for(var u=-1,i=t.length,o=i-1,f=n;null!=f&&++u<i;){var a=ci(t[u]);if(df(f)){var c=r;if(u!=o){var l=f[a];c=e?e(l,a,f):K,c===K&&(c=null==l?Yu(t[u+1])?[]:{}:l)}pr(f,a,c)}f=f[a]}return n}function ke(n,t,r){var e=-1,u=n.length;t<0&&(t=-t>u?0:u+t),r=r>u?u:r,r<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(u);++e<u;)i[e]=n[e+t];return i}function Ie(n,t){var r;return jl(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function Re(n,t,r){var e=0,u=n?n.length:e;if("number"==typeof t&&t===t&&u<=On){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!Cf(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return Ee(n,t,Ka,r)}function Ee(n,t,r,e){t=r(t);for(var u=0,i=n?n.length:0,o=t!==t,f=null===t,a=Cf(t),c=t===K;u<i;){var l=Gc((u+i)/2),s=r(n[l]),h=s!==K,p=null===s,v=s===s,_=Cf(s);if(o)var g=e||v;else g=c?v&&(e||h):f?v&&h&&(e||!p):a?v&&h&&!p&&(e||!_):!p&&!_&&(e?s<=t:s<t);g?u=l+1:i=l}return nl(i,An)}function Se(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r],f=t?t(o):o;if(!r||!tf(f,a)){var a=f;i[u++]=0===o?0:o}}return i}function We(n){return"number"==typeof n?n:Cf(n)?xn:+n}function Le(n){if("string"==typeof n)return n;if(Cf(n))return xl?xl.call(n):"";var t=n+"";return"0"==t&&1/n==-bn?"-0":t}function Ce(n,t,r){var e=-1,u=a,i=n.length,o=!0,f=[],l=f;if(r)o=!1,u=c;else if(i>=J){var s=t?null:Rl(n);if(s)return P(s);o=!1,u=I,l=new rr}else l=t?[]:f;n:for(;++e<i;){var h=n[e],p=t?t(h):h;if(h=r||0!==h?h:0,o&&p===p){for(var v=l.length;v--;)if(l[v]===p)continue n;t&&l.push(p),f.push(h)}else u(l,p,r)||(l!==f&&l.push(p),f.push(h))}return f}function Be(n,t){t=Qu(t,n)?[t]:Ne(t),n=fi(n,t);var r=ci(Si(t));return!(null!=n&&Jr(n,r))||delete n[r]}function $e(n,t,r,e){return Oe(n,t,r(Vr(n,t)),e)}function ze(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?ke(n,e?0:i,e?i+1:u):ke(n,e?i+1:0,e?u:i)}function Ue(n,t){var r=n;return r instanceof Bt&&(r=r.value()),h(t,function(n,t){return t.func.apply(t.thisArg,s([n],t.args))},r)}function Fe(n,t,r){for(var e=-1,u=n.length;++e<u;)var i=i?s($r(i,n[e],t,r),$r(n[e],i,t,r)):n[e];return i&&i.length?Ce(i,t,r):[]}function Me(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;){var f=e<i?t[e]:K;r(o,n[e],f)}return o}function De(n){return of(n)?n:[]}function Pe(n){return"function"==typeof n?n:Ka}function Ne(n){return ys(n)?n:Bl(n)}function qe(n,t,r){var e=n.length;return r=r===K?e:r,!t&&r>=e?n:ke(n,t,r)}function Te(n,t){if(t)return n.slice();var r=new n.constructor(n.length);return n.copy(r),r}function Ze(n){var t=new n.constructor(n.byteLength);return new Mc(t).set(new Mc(n)),t}function Ve(n,t){var r=t?Ze(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.byteLength)}function Ke(t,r,e){var u=r?e(M(t),!0):M(t);return h(u,n,new t.constructor)}function Ge(n){var t=new n.constructor(n.source,mt.exec(n));return t.lastIndex=n.lastIndex,t}function Je(n,r,e){var u=r?e(P(n),!0):P(n);return h(u,t,new n.constructor)}function Ye(n){return ml?Object(ml.call(n)):{}}function He(n,t){var r=t?Ze(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.length)}function Qe(n,t){if(n!==t){var r=n!==K,e=null===n,u=n===n,i=Cf(n),o=t!==K,f=null===t,a=t===t,c=Cf(t);if(!f&&!c&&!i&&n>t||i&&o&&a&&!f&&!c||e&&o&&a||!r&&a||!u)return 1;if(!e&&!i&&!c&&n<t||c&&r&&u&&!e&&!i||f&&r&&u||!o&&u||!a)return-1}return 0}function Xe(n,t,r){for(var e=-1,u=n.criteria,i=t.criteria,o=u.length,f=r.length;++e<o;){var a=Qe(u[e],i[e]);if(a){if(e>=f)return a;var c=r[e];return a*("desc"==c?-1:1)}}return n.index-t.index}function nu(n,t,r,e){for(var u=-1,i=n.length,o=r.length,f=-1,a=t.length,c=Xc(i-o,0),l=Array(a+c),s=!e;++f<a;)l[f]=t[f];for(;++u<o;)(s||u<i)&&(l[r[u]]=n[u]);for(;c--;)l[f++]=n[u++];return l}function tu(n,t,r,e){for(var u=-1,i=n.length,o=-1,f=r.length,a=-1,c=t.length,l=Xc(i-f,0),s=Array(l+c),h=!e;++u<l;)s[u]=n[u];for(var p=u;++a<c;)s[p+a]=t[a];for(;++o<f;)(h||u<i)&&(s[p+r[o]]=n[u++]);return s}function ru(n,t){var r=-1,e=n.length;for(t||(t=Array(e));++r<e;)t[r]=n[r];return t}function eu(n,t,r,e){r||(r={});for(var u=-1,i=t.length;++u<i;){var o=t[u],f=e?e(r[o],n[o],o,r,n):n[o];pr(r,o,f)}return r}function uu(n,t){return eu(n,Du(n),t)}function iu(n,t){return function(r,u){var i=ys(r)?e:Ar,o=t?t():{};return i(r,n,$u(u),o)}}function ou(n){return Zo(function(t,r){var e=-1,u=r.length,i=u>1?r[u-1]:K,o=u>2?r[2]:K;for(i=n.length>3&&"function"==typeof i?(u--,i):K,o&&Hu(r[0],r[1],o)&&(i=u<3?K:i,u=1),t=Object(t);++e<u;){var f=r[e];f&&n(t,f,e,i)}return t})}function fu(n,t){return function(r,e){if(null==r)return r;if(!uf(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=Object(r);(t?i--:++i<u)&&e(o[i],i,o)!==!1;);return r}}function au(n){return function(t,r,e){for(var u=-1,i=Object(t),o=e(t),f=o.length;f--;){var a=o[n?f:++u];if(r(i[a],a,i)===!1)break}return t}}function cu(n,t,r){function e(){var t=this&&this!==zr&&this instanceof e?i:n;return t.apply(u?r:this,arguments)}var u=t&X,i=hu(n);return e}function lu(n){return function(t){t=Zf(t);var r=dr.test(t)?T(t):K,e=r?r[0]:t.charAt(0),u=r?qe(r,1).join(""):t.slice(1);return e[n]()+u}}function su(n){return function(t){return h(qa(ja(t).replace(vr,"")),n,"")}}function hu(n){return function(){var t=arguments;switch(t.length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=Cr(n.prototype),e=n.apply(r,t);return df(e)?e:r}}function pu(n,t,e){function u(){for(var o=arguments.length,f=Array(o),a=o,c=Bu(u);a--;)f[a]=arguments[a];var l=o<3&&f[0]!==c&&f[o-1]!==c?[]:D(f,c);if(o-=l.length,o<e)return Au(n,t,gu,u.placeholder,K,f,l,K,K,e-o);var s=this&&this!==zr&&this instanceof u?i:n;return r(s,this,f)}var i=hu(n);return u}function vu(n){return function(t,r,e){var u=Object(t);if(r=$u(r,3),!uf(t))var i=ua(t);var o=n(i||t,function(n,t){return i&&(t=n,n=u[t]),r(n,t,u)},e);return o>-1?t[i?i[o]:o]:K}}function _u(n){return Zo(function(t){t=Nr(t,1);var r=t.length,e=r,u=Ct.prototype.thru;for(n&&t.reverse();e--;){var i=t[e];if("function"!=typeof i)throw new jc(Y);if(u&&!o&&"wrapper"==Cu(i))var o=new Ct([],(!0))}for(e=o?e:r;++e<r;){i=t[e];var f=Cu(i),a="wrapper"==f?El(i):K;o=a&&ni(a[0])&&a[1]==(fn|rn|un|an)&&!a[4].length&&1==a[9]?o[Cu(a[0])].apply(o,a[3]):1==i.length&&ni(i)?o[f]():o.thru(i)}return function(){var n=arguments,e=n[0];if(o&&1==n.length&&ys(e)&&e.length>=J)return o.plant(e).value();for(var u=0,i=r?t[u].apply(this,n):e;++u<r;)i=t[u].call(this,i);return i}})}function gu(n,t,r,e,u,i,o,f,a,c){function l(){for(var y=arguments.length,d=Array(y),b=y;b--;)d[b]=arguments[b];if(v)var w=Bu(l),m=W(d,w);if(e&&(d=nu(d,e,u,v)),i&&(d=tu(d,i,o,v)),y-=m,v&&y<c){var x=D(d,w);return Au(n,t,gu,l.placeholder,r,d,x,f,a,c-y)}var j=h?r:this,A=p?j[n]:n;return y=d.length,f?d=ai(d,f):_&&y>1&&d.reverse(),s&&a<y&&(d.length=a),this&&this!==zr&&this instanceof l&&(A=g||hu(A)),A.apply(j,d)}var s=t&fn,h=t&X,p=t&nn,v=t&(rn|en),_=t&cn,g=p?K:hu(n);return l}function yu(n,t){return function(r,e){return Xr(r,n,t(e),{})}}function du(n){return function(t,r){var e;if(t===K&&r===K)return 0;if(t!==K&&(e=t),r!==K){if(e===K)return r;"string"==typeof t||"string"==typeof r?(t=Le(t),r=Le(r)):(t=We(t),r=We(r)),e=n(t,r)}return e}}function bu(n){return Zo(function(t){return t=1==t.length&&ys(t[0])?l(t[0],O($u())):l(Nr(t,1,Ju),O($u())),Zo(function(e){var u=this;return n(t,function(n){return r(n,u,e)})})})}function wu(n,t){t=t===K?" ":Le(t);var r=t.length;if(r<2)return r?Ae(t,n):t;var e=Ae(t,Kc(n/q(t)));return dr.test(t)?qe(T(e),0,n).join(""):e.slice(0,n)}function mu(n,t,e,u){function i(){for(var t=-1,a=arguments.length,c=-1,l=u.length,s=Array(l+a),h=this&&this!==zr&&this instanceof i?f:n;++c<l;)s[c]=u[c];for(;a--;)s[c++]=arguments[++t];return r(h,o?e:this,s)}var o=t&X,f=hu(n);return i}function xu(n){return function(t,r,e){return e&&"number"!=typeof e&&Hu(t,r,e)&&(r=e=K),t=Nf(t),t=t===t?t:0,r===K?(r=t,t=0):r=Nf(r)||0,e=e===K?t<r?1:-1:Nf(e)||0,je(t,r,e,n)}}function ju(n){return function(t,r){return"string"==typeof t&&"string"==typeof r||(t=Nf(t),r=Nf(r)),n(t,r)}}function Au(n,t,r,e,u,i,o,f,a,c){var l=t&rn,s=l?o:K,h=l?K:o,p=l?i:K,v=l?K:i;t|=l?un:on,t&=~(l?on:un),t&tn||(t&=~(X|nn));var _=[n,t,u,p,s,v,h,f,a,c],g=r.apply(K,_);return ni(n)&&Cl(g,_),g.placeholder=e,g}function Ou(n){var t=mc[n];return function(n,r){if(n=Nf(n),r=nl(Df(r),292)){var e=(Zf(n)+"e").split("e"),u=t(e[0]+"e"+(+e[1]+r));return e=(Zf(u)+"e").split("e"),+(e[0]+"e"+(+e[1]-r))}return t(n)}}function ku(n){return function(t){var r=Pu(t);return r==Cn?M(t):r==Fn?N(t):A(t,n(t))}}function Iu(n,t,r,e,u,i,o,f){var a=t&nn;if(!a&&"function"!=typeof n)throw new jc(Y);var c=e?e.length:0;if(c||(t&=~(un|on),e=u=K),o=o===K?o:Xc(Df(o),0),f=f===K?f:Df(f),c-=u?u.length:0,t&on){var l=e,s=u;e=u=K}var h=a?K:El(n),p=[n,t,r,e,u,l,s,i,o,f];if(h&&ii(p,h),n=p[0],t=p[1],r=p[2],e=p[3],u=p[4],f=p[9]=null==p[9]?a?0:n.length:Xc(p[9]-c,0),!f&&t&(rn|en)&&(t&=~(rn|en)),t&&t!=X)v=t==rn||t==en?pu(n,t,f):t!=un&&t!=(X|un)||u.length?gu.apply(K,p):mu(n,t,r,e);else var v=cu(n,t,r);var _=h?Il:Cl;return _(v,p)}function Ru(n,t,r,e,u,i){var o=u&sn,f=n.length,a=t.length;if(f!=a&&!(o&&a>f))return!1;var c=i.get(n);if(c)return c==t;var l=-1,s=!0,h=u&ln?new rr:K;for(i.set(n,t);++l<f;){var p=n[l],_=t[l];if(e)var g=o?e(_,p,l,t,n,i):e(p,_,l,n,t,i);if(g!==K){if(g)continue;s=!1;break}if(h){if(!v(t,function(n,t){if(!h.has(t)&&(p===n||r(p,n,e,u,i)))return h.add(t)})){s=!1;break}}else if(p!==_&&!r(p,_,e,u,i)){s=!1;break}}return i["delete"](n),s}function Eu(n,t,r,e,u,i,o){switch(r){case Tn:if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)return!1;n=n.buffer,t=t.buffer;case qn:return!(n.byteLength!=t.byteLength||!e(new Mc(n),new Mc(t)));case Rn:case En:return+n==+t;case Sn:return n.name==t.name&&n.message==t.message;case Bn:return n!=+n?t!=+t:n==+t;case Un:case Mn:return n==t+"";case Cn:var f=M;case Fn:var a=i&sn;if(f||(f=P),n.size!=t.size&&!a)return!1;var c=o.get(n);return c?c==t:(i|=ln,o.set(n,t),Ru(f(n),f(t),e,u,i,o));case Dn:if(ml)return ml.call(n)==ml.call(t)}return!1}function Su(n,t,r,e,u,i){var o=u&sn,f=ua(n),a=f.length,c=ua(t),l=c.length;if(a!=l&&!o)return!1;for(var s=a;s--;){var h=f[s];if(!(o?h in t:Jr(t,h)))return!1}var p=i.get(n);if(p)return p==t;var v=!0;i.set(n,t);for(var _=o;++s<a;){h=f[s];var g=n[h],y=t[h];if(e)var d=o?e(y,g,h,t,n,i):e(g,y,h,n,t,i);if(!(d===K?g===y||r(g,y,e,u,i):d)){v=!1;break}_||(_="constructor"==h)}if(v&&!_){var b=n.constructor,w=t.constructor;b!=w&&"constructor"in n&&"constructor"in t&&!("function"==typeof b&&b instanceof b&&"function"==typeof w&&w instanceof w)&&(v=!1)}return i["delete"](n),v}function Wu(n){return Kr(n,ua,Du)}function Lu(n){return Kr(n,ia,Wl)}function Cu(n){for(var t=n.name+"",r=vl[t],e=Sc.call(vl,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function Bu(n){var t=Sc.call(Wt,"placeholder")?Wt:n;return t.placeholder}function $u(){var n=Wt.iteratee||Ga;return n=n===Ga?ie:n,arguments.length?n(arguments[0],arguments[1]):n}function zu(n,t){var r=n.__data__;return Xu(t)?r["string"==typeof t?"string":"hash"]:r.map}function Uu(n){for(var t=ua(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,ei(u)]}return t}function Fu(n,t){var r=$(n,t);return ue(r)?r:K}function Mu(n){return Jc(Object(n))}function Du(n){return Pc(Object(n))}function Pu(n){return Cc.call(n)}function Nu(n,t,r){for(var e=-1,u=r.length;++e<u;){var i=r[e],o=i.size;switch(i.type){case"drop":n+=o;break;case"dropRight":t-=o;break;case"take":t=nl(t,n+o);break;case"takeRight":n=Xc(n,t-o)}}return{start:n,end:t}}function qu(n,t,r){t=Qu(t,n)?[t]:Ne(t);for(var e,u=-1,i=t.length;++u<i;){var o=ci(t[u]);if(!(e=null!=n&&r(n,o)))break;n=n[o]}if(e)return e;var i=n?n.length:0;return!!i&&yf(i)&&Yu(o,i)&&(ys(n)||Lf(n)||rf(n))}function Tu(n){var t=n.length,r=n.constructor(t);return t&&"string"==typeof n[0]&&Sc.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function Zu(n){return"function"!=typeof n.constructor||ri(n)?{}:Cr(Mu(n))}function Vu(n,t,r,e){var u=n.constructor;switch(t){case qn:return Ze(n);case Rn:case En:return new u((+n));case Tn:return Ve(n,e);case Zn:case Vn:case Kn:case Gn:case Jn:case Yn:case Hn:case Qn:case Xn:return He(n,e);case Cn:return Ke(n,e,r);case Bn:case Mn:return new u(n);case Un:return Ge(n);case Fn:return Je(n,e,r);case Dn:return Ye(n)}}function Ku(n){var t=n?n.length:K;return yf(t)&&(ys(n)||Lf(n)||rf(n))?j(t,String):null}function Gu(n){return ys(n)||rf(n)}function Ju(n){return ys(n)&&!(2==n.length&&!_f(n[0]))}function Yu(n,t){return t=null==t?wn:t,!!t&&("number"==typeof n||It.test(n))&&n>-1&&n%1==0&&n<t}function Hu(n,t,r){if(!df(r))return!1;var e=typeof t;return!!("number"==e?uf(r)&&Yu(t,r.length):"string"==e&&t in r)&&tf(r[t],n)}function Qu(n,t){if(ys(n))return!1;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!Cf(n))||(st.test(n)||!lt.test(n)||null!=t&&n in Object(t))}function Xu(n){var t=typeof n;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==n:null===n}function ni(n){var t=Cu(n),r=Wt[t];if("function"!=typeof r||!(t in Bt.prototype))return!1;if(n===r)return!0;var e=El(r);return!!e&&n===e[0]}function ti(n){return!!Rc&&Rc in n}function ri(n){var t=n&&n.constructor,r="function"==typeof t&&t.prototype||Oc;return n===r}function ei(n){return n===n&&!df(n)}function ui(n,t){return function(r){return null!=r&&(r[n]===t&&(t!==K||n in Object(r)))}}function ii(n,t){var r=n[1],e=t[1],u=r|e,i=u<(X|nn|fn),o=e==fn&&r==rn||e==fn&&r==an&&n[7].length<=t[8]||e==(fn|an)&&t[7].length<=t[8]&&r==rn;if(!i&&!o)return n;e&X&&(n[2]=t[2],u|=r&X?0:tn);var f=t[3];if(f){var a=n[3];n[3]=a?nu(a,f,t[4]):f,n[4]=a?D(n[3],Q):t[4]}return f=t[5],f&&(a=n[5],n[5]=a?tu(a,f,t[6]):f,n[6]=a?D(n[5],Q):t[6]),f=t[7],f&&(n[7]=f),e&fn&&(n[8]=null==n[8]?t[8]:nl(n[8],t[8])),null==n[9]&&(n[9]=t[9]),n[0]=t[0],n[1]=u,n}function oi(n,t,r,e,u,i){return df(n)&&df(t)&&he(n,t,K,oi,i.set(t,n)),n}function fi(n,t){return 1==t.length?n:Vr(n,ke(t,0,-1))}function ai(n,t){for(var r=n.length,e=nl(t.length,r),u=ru(n);e--;){var i=t[e];n[e]=Yu(i,r)?u[i]:K}return n}function ci(n){if("string"==typeof n||Cf(n))return n;var t=n+"";return"0"==t&&1/n==-bn?"-0":t}function li(n){if(null!=n){try{return Ec.call(n)}catch(t){}try{return n+""}catch(t){}}return""}function si(n){if(n instanceof Bt)return n.clone();var t=new Ct(n.__wrapped__,n.__chain__);return t.__actions__=ru(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function hi(n,t,r){t=(r?Hu(n,t,r):t===K)?1:Xc(Df(t),0);var e=n?n.length:0;if(!e||t<1)return[];for(var u=0,i=0,o=Array(Kc(e/t));u<e;)o[i++]=ke(n,u,u+=t);return o}function pi(n){for(var t=-1,r=n?n.length:0,e=0,u=[];++t<r;){var i=n[t];i&&(u[e++]=i)}return u}function vi(){for(var n=arguments.length,t=Array(n?n-1:0),r=arguments[0],e=n;e--;)t[e-1]=arguments[e];return n?s(ys(r)?ru(r):[r],Nr(t,1)):[]}function _i(n,t,r){var e=n?n.length:0;return e?(t=r||t===K?1:Df(t),ke(n,t<0?0:t,e)):[]}function gi(n,t,r){var e=n?n.length:0;return e?(t=r||t===K?1:Df(t),t=e-t,ke(n,0,t<0?0:t)):[]}function yi(n,t){return n&&n.length?ze(n,$u(t,3),!0,!0):[]}function di(n,t){return n&&n.length?ze(n,$u(t,3),!0):[]}function bi(n,t,r,e){var u=n?n.length:0;return u?(r&&"number"!=typeof r&&Hu(n,t,r)&&(r=0,e=u),Dr(n,t,r,e)):[]}function wi(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=null==r?0:Df(r);return u<0&&(u=Xc(e+u,0)),g(n,$u(t,3),u)}function mi(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=e-1;return r!==K&&(u=Df(r),u=r<0?Xc(e+u,0):nl(u,e-1)),g(n,$u(t,3),u,!0)}function xi(n){var t=n?n.length:0;return t?Nr(n,1):[]}function ji(n){var t=n?n.length:0;return t?Nr(n,bn):[]}function Ai(n,t){var r=n?n.length:0;return r?(t=t===K?1:Df(t),Nr(n,t)):[]}function Oi(n){for(var t=-1,r=n?n.length:0,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e}function ki(n){return n&&n.length?n[0]:K}function Ii(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=null==r?0:Df(r);return u<0&&(u=Xc(e+u,0)),y(n,t,u)}function Ri(n){return gi(n,1)}function Ei(n,t){return n?Hc.call(n,t):""}function Si(n){var t=n?n.length:0;return t?n[t-1]:K}function Wi(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=e;if(r!==K&&(u=Df(r),u=(u<0?Xc(e+u,0):nl(u,e-1))+1),t!==t)return z(n,u-1,!0);for(;u--;)if(n[u]===t)return u;return-1}function Li(n,t){return n&&n.length?ve(n,Df(t)):K}function Ci(n,t){return n&&n.length&&t&&t.length?we(n,t):n}function Bi(n,t,r){return n&&n.length&&t&&t.length?we(n,t,$u(r)):n}function $i(n,t,r){return n&&n.length&&t&&t.length?we(n,t,K,r):n}function zi(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=$u(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),u.push(e))}return me(n,u),r}function Ui(n){return n?ul.call(n):n}function Fi(n,t,r){var e=n?n.length:0;return e?(r&&"number"!=typeof r&&Hu(n,t,r)?(t=0,r=e):(t=null==t?0:Df(t),r=r===K?e:Df(r)),ke(n,t,r)):[]}function Mi(n,t){return Re(n,t)}function Di(n,t,r){return Ee(n,t,$u(r))}function Pi(n,t){var r=n?n.length:0;if(r){var e=Re(n,t);if(e<r&&tf(n[e],t))return e}return-1}function Ni(n,t){return Re(n,t,!0)}function qi(n,t,r){return Ee(n,t,$u(r),!0)}function Ti(n,t){var r=n?n.length:0;if(r){var e=Re(n,t,!0)-1;if(tf(n[e],t))return e}return-1}function Zi(n){return n&&n.length?Se(n):[]}function Vi(n,t){return n&&n.length?Se(n,$u(t)):[]}function Ki(n){return _i(n,1)}function Gi(n,t,r){return n&&n.length?(t=r||t===K?1:Df(t),ke(n,0,t<0?0:t)):[]}function Ji(n,t,r){var e=n?n.length:0;return e?(t=r||t===K?1:Df(t),t=e-t,ke(n,t<0?0:t,e)):[]}function Yi(n,t){return n&&n.length?ze(n,$u(t,3),!1,!0):[]}function Hi(n,t){return n&&n.length?ze(n,$u(t,3)):[]}function Qi(n){return n&&n.length?Ce(n):[]}function Xi(n,t){return n&&n.length?Ce(n,$u(t)):[]}function no(n,t){return n&&n.length?Ce(n,K,t):[]}function to(n){if(!n||!n.length)return[];var t=0;return n=f(n,function(n){if(of(n))return t=Xc(n.length,t),!0}),j(t,function(t){return l(n,de(t))})}function ro(n,t){if(!n||!n.length)return[];var e=to(n);return null==t?e:l(e,function(n){return r(t,K,n)})}function eo(n,t){return Me(n||[],t||[],pr)}function uo(n,t){return Me(n||[],t||[],Oe)}function io(n){var t=Wt(n);return t.__chain__=!0,t}function oo(n,t){return t(n),n}function fo(n,t){return t(n)}function ao(){return io(this)}function co(){return new Ct(this.value(),this.__chain__)}function lo(){this.__values__===K&&(this.__values__=Ff(this.value()));var n=this.__index__>=this.__values__.length,t=n?K:this.__values__[this.__index__++];return{done:n,value:t}}function so(){return this}function ho(n){for(var t,r=this;r instanceof Lt;){var e=si(r);e.__index__=0,e.__values__=K,t?u.__wrapped__=e:t=e;var u=e;r=r.__wrapped__}return u.__wrapped__=n,t}function po(){var n=this.__wrapped__;if(n instanceof Bt){var t=n;return this.__actions__.length&&(t=new Bt(this)),t=t.reverse(),t.__actions__.push({func:fo,args:[Ui],thisArg:K}),new Ct(t,this.__chain__)}return this.thru(Ui)}function vo(){return Ue(this.__wrapped__,this.__actions__)}function _o(n,t,r){var e=ys(n)?o:Fr;return r&&Hu(n,t,r)&&(t=K),e(n,$u(t,3))}function go(n,t){var r=ys(n)?f:Pr;return r(n,$u(t,3))} -function yo(n,t){return Nr(Ao(n,t),1)}function bo(n,t){return Nr(Ao(n,t),bn)}function wo(n,t,r){return r=r===K?1:Df(r),Nr(Ao(n,t),r)}function mo(n,t){var r=ys(n)?u:jl;return r(n,$u(t,3))}function xo(n,t){var r=ys(n)?i:Al;return r(n,$u(t,3))}function jo(n,t,r,e){n=uf(n)?n:ya(n),r=r&&!e?Df(r):0;var u=n.length;return r<0&&(r=Xc(u+r,0)),Lf(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&y(n,t,r)>-1}function Ao(n,t){var r=ys(n)?l:ce;return r(n,$u(t,3))}function Oo(n,t,r,e){return null==n?[]:(ys(t)||(t=null==t?[]:[t]),r=e?K:r,ys(r)||(r=null==r?[]:[r]),_e(n,t,r))}function ko(n,t,r){var e=ys(n)?h:w,u=arguments.length<3;return e(n,$u(t,4),r,u,jl)}function Io(n,t,r){var e=ys(n)?p:w,u=arguments.length<3;return e(n,$u(t,4),r,u,Al)}function Ro(n,t){var r=ys(n)?f:Pr;return t=$u(t,3),r(n,function(n,r,e){return!t(n,r,e)})}function Eo(n){var t=uf(n)?n:ya(n),r=t.length;return r>0?t[xe(0,r-1)]:K}function So(n,t,r){var e=-1,u=Ff(n),i=u.length,o=i-1;for(t=(r?Hu(n,t,r):t===K)?1:Ir(Df(t),0,i);++e<t;){var f=xe(e,o),a=u[f];u[f]=u[e],u[e]=a}return u.length=t,u}function Wo(n){return So(n,jn)}function Lo(n){if(null==n)return 0;if(uf(n)){var t=n.length;return t&&Lf(n)?q(n):t}if(bf(n)){var r=Pu(n);if(r==Cn||r==Fn)return n.size}return ua(n).length}function Co(n,t,r){var e=ys(n)?v:Ie;return r&&Hu(n,t,r)&&(t=K),e(n,$u(t,3))}function Bo(){return bc.now()}function $o(n,t){if("function"!=typeof t)throw new jc(Y);return n=Df(n),function(){if(--n<1)return t.apply(this,arguments)}}function zo(n,t,r){return t=r?K:t,t=n&&null==t?n.length:t,Iu(n,fn,K,K,K,K,t)}function Uo(n,t){var r;if("function"!=typeof t)throw new jc(Y);return n=Df(n),function(){return--n>0&&(r=t.apply(this,arguments)),n<=1&&(t=K),r}}function Fo(n,t,r){t=r?K:t;var e=Iu(n,rn,K,K,K,K,K,t);return e.placeholder=Fo.placeholder,e}function Mo(n,t,r){t=r?K:t;var e=Iu(n,en,K,K,K,K,K,t);return e.placeholder=Mo.placeholder,e}function Do(n,t,r){function e(t){var r=h,e=p;return h=p=K,d=t,_=n.apply(e,r)}function u(n){return d=n,g=Vc(f,t),b?e(n):_}function i(n){var r=n-y,e=n-d,u=t-r;return w?nl(u,v-e):u}function o(n){var r=n-y,e=n-d;return y===K||r>=t||r<0||w&&e>=v}function f(){var n=Bo();return o(n)?a(n):void(g=Vc(f,i(n)))}function a(n){return g=K,m&&h?e(n):(h=p=K,_)}function c(){d=0,h=y=p=g=K}function l(){return g===K?_:a(Bo())}function s(){var n=Bo(),r=o(n);if(h=arguments,p=this,y=n,r){if(g===K)return u(y);if(w)return g=Vc(f,t),e(y)}return g===K&&(g=Vc(f,t)),_}var h,p,v,_,g,y,d=0,b=!1,w=!1,m=!0;if("function"!=typeof n)throw new jc(Y);return t=Nf(t)||0,df(r)&&(b=!!r.leading,w="maxWait"in r,v=w?Xc(Nf(r.maxWait)||0,t):v,m="trailing"in r?!!r.trailing:m),s.cancel=c,s.flush=l,s}function Po(n){return Iu(n,cn)}function No(n,t){if("function"!=typeof n||t&&"function"!=typeof t)throw new jc(Y);var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o),o};return r.cache=new(No.Cache||Yt),r}function qo(n){if("function"!=typeof n)throw new jc(Y);return function(){return!n.apply(this,arguments)}}function To(n){return Uo(2,n)}function Zo(n,t){if("function"!=typeof n)throw new jc(Y);return t=Xc(t===K?n.length-1:Df(t),0),function(){for(var e=arguments,u=-1,i=Xc(e.length-t,0),o=Array(i);++u<i;)o[u]=e[t+u];switch(t){case 0:return n.call(this,o);case 1:return n.call(this,e[0],o);case 2:return n.call(this,e[0],e[1],o)}var f=Array(t+1);for(u=-1;++u<t;)f[u]=e[u];return f[t]=o,r(n,this,f)}}function Vo(n,t){if("function"!=typeof n)throw new jc(Y);return t=t===K?0:Xc(Df(t),0),Zo(function(e){var u=e[t],i=qe(e,0,t);return u&&s(i,u),r(n,this,i)})}function Ko(n,t,r){var e=!0,u=!0;if("function"!=typeof n)throw new jc(Y);return df(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Do(n,t,{leading:e,maxWait:t,trailing:u})}function Go(n){return zo(n,1)}function Jo(n,t){return t=null==t?Ka:t,hs(t,n)}function Yo(){if(!arguments.length)return[];var n=arguments[0];return ys(n)?n:[n]}function Ho(n){return Sr(n,!1,!0)}function Qo(n,t){return Sr(n,!1,!0,t)}function Xo(n){return Sr(n,!0,!0)}function nf(n,t){return Sr(n,!0,!0,t)}function tf(n,t){return n===t||n!==n&&t!==t}function rf(n){return of(n)&&Sc.call(n,"callee")&&(!Tc.call(n,"callee")||Cc.call(n)==kn)}function ef(n){return bf(n)&&Cc.call(n)==qn}function uf(n){return null!=n&&yf(Sl(n))&&!_f(n)}function of(n){return bf(n)&&uf(n)}function ff(n){return n===!0||n===!1||bf(n)&&Cc.call(n)==Rn}function af(n){return bf(n)&&Cc.call(n)==En}function cf(n){return!!n&&1===n.nodeType&&bf(n)&&!Rf(n)}function lf(n){if(uf(n)&&(ys(n)||Lf(n)||_f(n.splice)||rf(n)||ds(n)))return!n.length;if(bf(n)){var t=Pu(n);if(t==Cn||t==Fn)return!n.size}for(var r in n)if(Sc.call(n,r))return!1;return!(pl&&ua(n).length)}function sf(n,t){return te(n,t)}function hf(n,t,r){r="function"==typeof r?r:K;var e=r?r(n,t):K;return e===K?te(n,t,r):!!e}function pf(n){return!!bf(n)&&(Cc.call(n)==Sn||"string"==typeof n.message&&"string"==typeof n.name)}function vf(n){return"number"==typeof n&&Yc(n)}function _f(n){var t=df(n)?Cc.call(n):"";return t==Wn||t==Ln}function gf(n){return"number"==typeof n&&n==Df(n)}function yf(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=wn}function df(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function bf(n){return!!n&&"object"==typeof n}function wf(n){return bf(n)&&Pu(n)==Cn}function mf(n,t){return n===t||ee(n,t,Uu(t))}function xf(n,t,r){return r="function"==typeof r?r:K,ee(n,t,Uu(t),r)}function jf(n){return If(n)&&n!=+n}function Af(n){if(Ll(n))throw new wc("This method is not supported with `core-js`. Try https://github.com/es-shims.");return ue(n)}function Of(n){return null===n}function kf(n){return null==n}function If(n){return"number"==typeof n||bf(n)&&Cc.call(n)==Bn}function Rf(n){if(!bf(n)||Cc.call(n)!=$n||U(n))return!1;var t=Mu(n);if(null===t)return!0;var r=Sc.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&Ec.call(r)==Lc}function Ef(n){return df(n)&&Cc.call(n)==Un}function Sf(n){return gf(n)&&n>=-wn&&n<=wn}function Wf(n){return bf(n)&&Pu(n)==Fn}function Lf(n){return"string"==typeof n||!ys(n)&&bf(n)&&Cc.call(n)==Mn}function Cf(n){return"symbol"==typeof n||bf(n)&&Cc.call(n)==Dn}function Bf(n){return bf(n)&&yf(n.length)&&!!xr[Cc.call(n)]}function $f(n){return n===K}function zf(n){return bf(n)&&Pu(n)==Pn}function Uf(n){return bf(n)&&Cc.call(n)==Nn}function Ff(n){if(!n)return[];if(uf(n))return Lf(n)?T(n):ru(n);if(Nc&&n[Nc])return F(n[Nc]());var t=Pu(n),r=t==Cn?M:t==Fn?P:ya;return r(n)}function Mf(n){if(!n)return 0===n?n:0;if(n=Nf(n),n===bn||n===-bn){var t=n<0?-1:1;return t*mn}return n===n?n:0}function Df(n){var t=Mf(n),r=t%1;return t===t?r?t-r:t:0}function Pf(n){return n?Ir(Df(n),0,jn):0}function Nf(n){if("number"==typeof n)return n;if(Cf(n))return xn;if(df(n)){var t=_f(n.valueOf)?n.valueOf():n;n=df(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(_t,"");var r=At.test(n);return r||kt.test(n)?Er(n.slice(2),r?2:8):jt.test(n)?xn:+n}function qf(n){return eu(n,ia(n))}function Tf(n){return Ir(Df(n),-wn,wn)}function Zf(n){return null==n?"":Le(n)}function Vf(n,t){var r=Cr(n);return t?Or(r,t):r}function Kf(n,t){return _(n,$u(t,3),qr)}function Gf(n,t){return _(n,$u(t,3),Tr)}function Jf(n,t){return null==n?n:Ol(n,$u(t,3),ia)}function Yf(n,t){return null==n?n:kl(n,$u(t,3),ia)}function Hf(n,t){return n&&qr(n,$u(t,3))}function Qf(n,t){return n&&Tr(n,$u(t,3))}function Xf(n){return null==n?[]:Zr(n,ua(n))}function na(n){return null==n?[]:Zr(n,ia(n))}function ta(n,t,r){var e=null==n?K:Vr(n,t);return e===K?r:e}function ra(n,t){return null!=n&&qu(n,t,Jr)}function ea(n,t){return null!=n&&qu(n,t,Yr)}function ua(n){var t=ri(n);if(!t&&!uf(n))return oe(n);var r=Ku(n),e=!!r,u=r||[],i=u.length;for(var o in n)!Jr(n,o)||e&&("length"==o||Yu(o,i))||t&&"constructor"==o||u.push(o);return u}function ia(n){for(var t=-1,r=ri(n),e=fe(n),u=e.length,i=Ku(n),o=!!i,f=i||[],a=f.length;++t<u;){var c=e[t];o&&("length"==c||Yu(c,a))||"constructor"==c&&(r||!Sc.call(n,c))||f.push(c)}return f}function oa(n,t){var r={};return t=$u(t,3),qr(n,function(n,e,u){r[t(n,e,u)]=n}),r}function fa(n,t){var r={};return t=$u(t,3),qr(n,function(n,e,u){r[e]=t(n,e,u)}),r}function aa(n,t){return t=$u(t),ye(n,function(n,r){return!t(n,r)})}function ca(n,t){return null==n?{}:ye(n,$u(t))}function la(n,t,r){t=Qu(t,n)?[t]:Ne(t);var e=-1,u=t.length;for(u||(n=K,u=1);++e<u;){var i=null==n?K:n[ci(t[e])];i===K&&(e=u,i=r),n=_f(i)?i.call(n):i}return n}function sa(n,t,r){return null==n?n:Oe(n,t,r)}function ha(n,t,r,e){return e="function"==typeof e?e:K,null==n?n:Oe(n,t,r,e)}function pa(n,t,r){var e=ys(n)||Bf(n);if(t=$u(t,4),null==r)if(e||df(n)){var i=n.constructor;r=e?ys(n)?new i:[]:_f(i)?Cr(Mu(n)):{}}else r={};return(e?u:qr)(n,function(n,e,u){return t(r,n,e,u)}),r}function va(n,t){return null==n||Be(n,t)}function _a(n,t,r){return null==n?n:$e(n,t,Pe(r))}function ga(n,t,r,e){return e="function"==typeof e?e:K,null==n?n:$e(n,t,Pe(r),e)}function ya(n){return n?k(n,ua(n)):[]}function da(n){return null==n?[]:k(n,ia(n))}function ba(n,t,r){return r===K&&(r=t,t=K),r!==K&&(r=Nf(r),r=r===r?r:0),t!==K&&(t=Nf(t),t=t===t?t:0),Ir(Nf(n),t,r)}function wa(n,t,r){return t=Nf(t)||0,r===K?(r=t,t=0):r=Nf(r)||0,n=Nf(n),Hr(n,t,r)}function ma(n,t,r){if(r&&"boolean"!=typeof r&&Hu(n,t,r)&&(t=r=K),r===K&&("boolean"==typeof t?(r=t,t=K):"boolean"==typeof n&&(r=n,n=K)),n===K&&t===K?(n=0,t=1):(n=Nf(n)||0,t===K?(t=n,n=0):t=Nf(t)||0),n>t){var e=n;n=t,t=e}if(r||n%1||t%1){var u=rl();return nl(n+u*(t-n+Rr("1e-"+((u+"").length-1))),t)}return xe(n,t)}function xa(n){return Ts(Zf(n).toLowerCase())}function ja(n){return n=Zf(n),n&&n.replace(Rt,L).replace(_r,"")}function Aa(n,t,r){n=Zf(n),t=Le(t);var e=n.length;return r=r===K?e:Ir(Df(r),0,e),r-=t.length,r>=0&&n.indexOf(t,r)==r}function Oa(n){return n=Zf(n),n&&ot.test(n)?n.replace(ut,C):n}function ka(n){return n=Zf(n),n&&vt.test(n)?n.replace(pt,"\\$&"):n}function Ia(n,t,r){n=Zf(n),t=Df(t);var e=t?q(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return wu(Gc(u),r)+n+wu(Kc(u),r)}function Ra(n,t,r){n=Zf(n),t=Df(t);var e=t?q(n):0;return t&&e<t?n+wu(t-e,r):n}function Ea(n,t,r){n=Zf(n),t=Df(t);var e=t?q(n):0;return t&&e<t?wu(t-e,r)+n:n}function Sa(n,t,r){return r||null==t?t=0:t&&(t=+t),n=Zf(n).replace(_t,""),tl(n,t||(xt.test(n)?16:10))}function Wa(n,t,r){return t=(r?Hu(n,t,r):t===K)?1:Df(t),Ae(Zf(n),t)}function La(){var n=arguments,t=Zf(n[0]);return n.length<3?t:el.call(t,n[1],n[2])}function Ca(n,t,r){return r&&"number"!=typeof r&&Hu(n,t,r)&&(t=r=K),(r=r===K?jn:r>>>0)?(n=Zf(n),n&&("string"==typeof t||null!=t&&!Ef(t))&&(t=Le(t),""==t&&dr.test(n))?qe(T(n),0,r):il.call(n,t,r)):[]}function Ba(n,t,r){return n=Zf(n),r=Ir(Df(r),0,n.length),n.lastIndexOf(Le(t),r)==r}function $a(n,t,r){var e=Wt.templateSettings;r&&Hu(n,t,r)&&(t=K),n=Zf(n),t=js({},t,e,sr);var u,i,o=js({},t.imports,e.imports,sr),f=ua(o),a=k(o,f),c=0,l=t.interpolate||Et,s="__p += '",h=xc((t.escape||Et).source+"|"+l.source+"|"+(l===ct?wt:Et).source+"|"+(t.evaluate||Et).source+"|$","g"),p="//# sourceURL="+("sourceURL"in t?t.sourceURL:"lodash.templateSources["+ ++mr+"]")+"\n";n.replace(h,function(t,r,e,o,f,a){return e||(e=o),s+=n.slice(c,a).replace(St,B),r&&(u=!0,s+="' +\n__e("+r+") +\n'"),f&&(i=!0,s+="';\n"+f+";\n__p += '"),e&&(s+="' +\n((__t = ("+e+")) == null ? '' : __t) +\n'"),c=a+t.length,t}),s+="';\n";var v=t.variable;v||(s="with (obj) {\n"+s+"\n}\n"),s=(i?s.replace(nt,""):s).replace(tt,"$1").replace(rt,"$1;"),s="function("+(v||"obj")+") {\n"+(v?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(u?", __e = _.escape":"")+(i?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+s+"return __p\n}";var _=Zs(function(){return Function(f,p+"return "+s).apply(K,a)});if(_.source=s,pf(_))throw _;return _}function za(n){return Zf(n).toLowerCase()}function Ua(n){return Zf(n).toUpperCase()}function Fa(n,t,r){if(n=Zf(n),n&&(r||t===K))return n.replace(_t,"");if(!n||!(t=Le(t)))return n;var e=T(n),u=T(t),i=R(e,u),o=E(e,u)+1;return qe(e,i,o).join("")}function Ma(n,t,r){if(n=Zf(n),n&&(r||t===K))return n.replace(yt,"");if(!n||!(t=Le(t)))return n;var e=T(n),u=E(e,T(t))+1;return qe(e,0,u).join("")}function Da(n,t,r){if(n=Zf(n),n&&(r||t===K))return n.replace(gt,"");if(!n||!(t=Le(t)))return n;var e=T(n),u=R(e,T(t));return qe(e,u).join("")}function Pa(n,t){var r=hn,e=pn;if(df(t)){var u="separator"in t?t.separator:u;r="length"in t?Df(t.length):r,e="omission"in t?Le(t.omission):e}n=Zf(n);var i=n.length;if(dr.test(n)){var o=T(n);i=o.length}if(r>=i)return n;var f=r-q(e);if(f<1)return e;var a=o?qe(o,0,f).join(""):n.slice(0,f);if(u===K)return a+e;if(o&&(f+=a.length-f),Ef(u)){if(n.slice(f).search(u)){var c,l=a;for(u.global||(u=xc(u.source,Zf(mt.exec(u))+"g")),u.lastIndex=0;c=u.exec(l);)var s=c.index;a=a.slice(0,s===K?f:s)}}else if(n.indexOf(Le(u),f)!=f){var h=a.lastIndexOf(u);h>-1&&(a=a.slice(0,h))}return a+e}function Na(n){return n=Zf(n),n&&it.test(n)?n.replace(et,Z):n}function qa(n,t,r){return n=Zf(n),t=r?K:t,t===K&&(t=br.test(n)?yr:dt),n.match(t)||[]}function Ta(n){var t=n?n.length:0,e=$u();return n=t?l(n,function(n){if("function"!=typeof n[1])throw new jc(Y);return[e(n[0]),n[1]]}):[],Zo(function(e){for(var u=-1;++u<t;){var i=n[u];if(r(i[0],this,e))return r(i[1],this,e)}})}function Za(n){return Wr(Sr(n,!0))}function Va(n){return function(){return n}}function Ka(n){return n}function Ga(n){return ie("function"==typeof n?n:Sr(n,!0))}function Ja(n){return le(Sr(n,!0))}function Ya(n,t){return se(n,Sr(t,!0))}function Ha(n,t,r){var e=ua(t),i=Zr(t,e);null!=r||df(t)&&(i.length||!e.length)||(r=t,t=n,n=this,i=Zr(t,ua(t)));var o=!(df(r)&&"chain"in r&&!r.chain),f=_f(n);return u(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__),u=r.__actions__=ru(this.__actions__);return u.push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,s([this.value()],arguments))})}),n}function Qa(){return zr._===this&&(zr._=Bc),this}function Xa(){}function nc(n){return n=Df(n),Zo(function(t){return ve(t,n)})}function tc(n){return Qu(n)?de(ci(n)):be(n)}function rc(n){return function(t){return null==n?K:Vr(n,t)}}function ec(){return[]}function uc(){return!1}function ic(){return{}}function oc(){return""}function fc(){return!0}function ac(n,t){if(n=Df(n),n<1||n>wn)return[];var r=jn,e=nl(n,jn);t=$u(t),n-=jn;for(var u=j(e,t);++r<n;)t(r);return u}function cc(n){return ys(n)?l(n,ci):Cf(n)?[n]:ru(Bl(n))}function lc(n){var t=++Wc;return Zf(n)+t}function sc(n){return n&&n.length?Mr(n,Ka,Gr):K}function hc(n,t){return n&&n.length?Mr(n,$u(t),Gr):K}function pc(n){return b(n,Ka)}function vc(n,t){return b(n,$u(t))}function _c(n){return n&&n.length?Mr(n,Ka,ae):K}function gc(n,t){return n&&n.length?Mr(n,$u(t),ae):K}function yc(n){return n&&n.length?x(n,Ka):0}function dc(n,t){return n&&n.length?x(n,$u(t)):0}S=S?Ur.defaults({},S,Ur.pick(zr,wr)):zr;var bc=S.Date,wc=S.Error,mc=S.Math,xc=S.RegExp,jc=S.TypeError,Ac=S.Array.prototype,Oc=S.Object.prototype,kc=S.String.prototype,Ic=S["__core-js_shared__"],Rc=function(){var n=/[^.]+$/.exec(Ic&&Ic.keys&&Ic.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),Ec=S.Function.prototype.toString,Sc=Oc.hasOwnProperty,Wc=0,Lc=Ec.call(Object),Cc=Oc.toString,Bc=zr._,$c=xc("^"+Ec.call(Sc).replace(pt,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),zc=Lr?S.Buffer:K,Uc=S.Reflect,Fc=S.Symbol,Mc=S.Uint8Array,Dc=Uc?Uc.enumerate:K,Pc=Object.getOwnPropertySymbols,Nc="symbol"==typeof(Nc=Fc&&Fc.iterator)?Nc:K,qc=Object.create,Tc=Oc.propertyIsEnumerable,Zc=Ac.splice,Vc=function(n,t){return S.setTimeout.call(zr,n,t)},Kc=mc.ceil,Gc=mc.floor,Jc=Object.getPrototypeOf,Yc=S.isFinite,Hc=Ac.join,Qc=Object.keys,Xc=mc.max,nl=mc.min,tl=S.parseInt,rl=mc.random,el=kc.replace,ul=Ac.reverse,il=kc.split,ol=Fu(S,"DataView"),fl=Fu(S,"Map"),al=Fu(S,"Promise"),cl=Fu(S,"Set"),ll=Fu(S,"WeakMap"),sl=Fu(Object,"create"),hl=ll&&new ll,pl=!Tc.call({valueOf:1},"valueOf"),vl={},_l=li(ol),gl=li(fl),yl=li(al),dl=li(cl),bl=li(ll),wl=Fc?Fc.prototype:K,ml=wl?wl.valueOf:K,xl=wl?wl.toString:K;Wt.templateSettings={escape:ft,evaluate:at,interpolate:ct,variable:"",imports:{_:Wt}},Wt.prototype=Lt.prototype,Wt.prototype.constructor=Wt,Ct.prototype=Cr(Lt.prototype),Ct.prototype.constructor=Ct,Bt.prototype=Cr(Lt.prototype),Bt.prototype.constructor=Bt,Ft.prototype.clear=Mt,Ft.prototype["delete"]=Dt,Ft.prototype.get=Pt,Ft.prototype.has=Nt,Ft.prototype.set=qt,Tt.prototype.clear=Zt,Tt.prototype["delete"]=Vt,Tt.prototype.get=Kt,Tt.prototype.has=Gt,Tt.prototype.set=Jt,Yt.prototype.clear=Ht,Yt.prototype["delete"]=Qt,Yt.prototype.get=Xt,Yt.prototype.has=nr,Yt.prototype.set=tr,rr.prototype.add=rr.prototype.push=er,rr.prototype.has=ur,ir.prototype.clear=or,ir.prototype["delete"]=fr,ir.prototype.get=ar,ir.prototype.has=cr,ir.prototype.set=lr;var jl=fu(qr),Al=fu(Tr,!0),Ol=au(),kl=au(!0);Dc&&!Tc.call({valueOf:1},"valueOf")&&(fe=function(n){return F(Dc(n))});var Il=hl?function(n,t){return hl.set(n,t),n}:Ka,Rl=cl&&1/P(new cl([,-0]))[1]==bn?function(n){return new cl(n)}:Xa,El=hl?function(n){return hl.get(n)}:Xa,Sl=de("length");Pc||(Du=ec);var Wl=Pc?function(n){for(var t=[];n;)s(t,Du(n)),n=Mu(n);return t}:Du;(ol&&Pu(new ol(new ArrayBuffer(1)))!=Tn||fl&&Pu(new fl)!=Cn||al&&Pu(al.resolve())!=zn||cl&&Pu(new cl)!=Fn||ll&&Pu(new ll)!=Pn)&&(Pu=function(n){var t=Cc.call(n),r=t==$n?n.constructor:K,e=r?li(r):K;if(e)switch(e){case _l:return Tn;case gl:return Cn;case yl:return zn;case dl:return Fn;case bl:return Pn}return t});var Ll=Ic?_f:uc,Cl=function(){var n=0,t=0;return function(r,e){var u=Bo(),i=_n-(u-t);if(t=u,i>0){if(++n>=vn)return r}else n=0;return Il(r,e)}}(),Bl=No(function(n){var t=[];return Zf(n).replace(ht,function(n,r,e,u){t.push(e?u.replace(bt,"$1"):r||n)}),t}),$l=Zo(function(n,t){return of(n)?$r(n,Nr(t,1,of,!0)):[]}),zl=Zo(function(n,t){var r=Si(t);return of(r)&&(r=K),of(n)?$r(n,Nr(t,1,of,!0),$u(r)):[]}),Ul=Zo(function(n,t){var r=Si(t);return of(r)&&(r=K),of(n)?$r(n,Nr(t,1,of,!0),K,r):[]}),Fl=Zo(function(n){var t=l(n,De);return t.length&&t[0]===n[0]?Qr(t):[]}),Ml=Zo(function(n){var t=Si(n),r=l(n,De);return t===Si(r)?t=K:r.pop(),r.length&&r[0]===n[0]?Qr(r,$u(t)):[]}),Dl=Zo(function(n){var t=Si(n),r=l(n,De);return t===Si(r)?t=K:r.pop(),r.length&&r[0]===n[0]?Qr(r,K,t):[]}),Pl=Zo(Ci),Nl=Zo(function(n,t){t=Nr(t,1);var r=n?n.length:0,e=kr(n,t);return me(n,l(t,function(n){return Yu(n,r)?+n:n}).sort(Qe)),e}),ql=Zo(function(n){return Ce(Nr(n,1,of,!0))}),Tl=Zo(function(n){var t=Si(n);return of(t)&&(t=K),Ce(Nr(n,1,of,!0),$u(t))}),Zl=Zo(function(n){var t=Si(n);return of(t)&&(t=K),Ce(Nr(n,1,of,!0),K,t)}),Vl=Zo(function(n,t){return of(n)?$r(n,t):[]}),Kl=Zo(function(n){return Fe(f(n,of))}),Gl=Zo(function(n){var t=Si(n);return of(t)&&(t=K),Fe(f(n,of),$u(t))}),Jl=Zo(function(n){var t=Si(n);return of(t)&&(t=K),Fe(f(n,of),K,t)}),Yl=Zo(to),Hl=Zo(function(n){var t=n.length,r=t>1?n[t-1]:K;return r="function"==typeof r?(n.pop(),r):K,ro(n,r)}),Ql=Zo(function(n){n=Nr(n,1);var t=n.length,r=t?n[0]:0,e=this.__wrapped__,u=function(t){return kr(t,n)};return!(t>1||this.__actions__.length)&&e instanceof Bt&&Yu(r)?(e=e.slice(r,+r+(t?1:0)),e.__actions__.push({func:fo,args:[u],thisArg:K}),new Ct(e,this.__chain__).thru(function(n){return t&&!n.length&&n.push(K),n})):this.thru(u)}),Xl=iu(function(n,t,r){Sc.call(n,r)?++n[r]:n[r]=1}),ns=vu(wi),ts=vu(mi),rs=iu(function(n,t,r){Sc.call(n,r)?n[r].push(t):n[r]=[t]}),es=Zo(function(n,t,e){var u=-1,i="function"==typeof t,o=Qu(t),f=uf(n)?Array(n.length):[];return jl(n,function(n){var a=i?t:o&&null!=n?n[t]:K;f[++u]=a?r(a,n,e):ne(n,t,e)}),f}),us=iu(function(n,t,r){n[r]=t}),is=iu(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),os=Zo(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Hu(n,t[0],t[1])?t=[]:r>2&&Hu(t[0],t[1],t[2])&&(t=[t[0]]),t=1==t.length&&ys(t[0])?t[0]:Nr(t,1,Ju),_e(n,t,[])}),fs=Zo(function(n,t,r){var e=X;if(r.length){var u=D(r,Bu(fs));e|=un}return Iu(n,e,t,r,u)}),as=Zo(function(n,t,r){var e=X|nn;if(r.length){var u=D(r,Bu(as));e|=un}return Iu(t,e,n,r,u)}),cs=Zo(function(n,t){return Br(n,1,t)}),ls=Zo(function(n,t,r){return Br(n,Nf(t)||0,r)});No.Cache=Yt;var ss=Zo(function(n,t){t=1==t.length&&ys(t[0])?l(t[0],O($u())):l(Nr(t,1,Ju),O($u()));var e=t.length;return Zo(function(u){for(var i=-1,o=nl(u.length,e);++i<o;)u[i]=t[i].call(this,u[i]);return r(n,this,u)})}),hs=Zo(function(n,t){var r=D(t,Bu(hs));return Iu(n,un,K,t,r)}),ps=Zo(function(n,t){var r=D(t,Bu(ps));return Iu(n,on,K,t,r)}),vs=Zo(function(n,t){return Iu(n,an,K,K,K,Nr(t,1))}),_s=ju(Gr),gs=ju(function(n,t){return n>=t}),ys=Array.isArray,ds=zc?function(n){return n instanceof zc}:uc,bs=ju(ae),ws=ju(function(n,t){return n<=t}),ms=ou(function(n,t){if(pl||ri(t)||uf(t))return void eu(t,ua(t),n);for(var r in t)Sc.call(t,r)&&pr(n,r,t[r])}),xs=ou(function(n,t){if(pl||ri(t)||uf(t))return void eu(t,ia(t),n);for(var r in t)pr(n,r,t[r])}),js=ou(function(n,t,r,e){eu(t,ia(t),n,e)}),As=ou(function(n,t,r,e){eu(t,ua(t),n,e)}),Os=Zo(function(n,t){return kr(n,Nr(t,1))}),ks=Zo(function(n){return n.push(K,sr),r(js,K,n)}),Is=Zo(function(n){return n.push(K,oi),r(Ls,K,n)}),Rs=yu(function(n,t,r){n[t]=r},Va(Ka)),Es=yu(function(n,t,r){Sc.call(n,t)?n[t].push(r):n[t]=[r]},$u),Ss=Zo(ne),Ws=ou(function(n,t,r){he(n,t,r)}),Ls=ou(function(n,t,r,e){he(n,t,r,e)}),Cs=Zo(function(n,t){return null==n?{}:(t=l(Nr(t,1),ci),ge(n,$r(Lu(n),t)))}),Bs=Zo(function(n,t){return null==n?{}:ge(n,l(Nr(t,1),ci))}),$s=ku(ua),zs=ku(ia),Us=su(function(n,t,r){return t=t.toLowerCase(),n+(r?xa(t):t)}),Fs=su(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Ms=su(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),Ds=lu("toLowerCase"),Ps=su(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),Ns=su(function(n,t,r){return n+(r?" ":"")+Ts(t)}),qs=su(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),Ts=lu("toUpperCase"),Zs=Zo(function(n,t){try{return r(n,K,t)}catch(e){return pf(e)?e:new wc(e)}}),Vs=Zo(function(n,t){return u(Nr(t,1),function(t){t=ci(t),n[t]=fs(n[t],n)}),n}),Ks=_u(),Gs=_u(!0),Js=Zo(function(n,t){return function(r){return ne(r,n,t)}}),Ys=Zo(function(n,t){return function(r){return ne(n,r,t)}}),Hs=bu(l),Qs=bu(o),Xs=bu(v),nh=xu(),th=xu(!0),rh=du(function(n,t){return n+t}),eh=Ou("ceil"),uh=du(function(n,t){return n/t}),ih=Ou("floor"),oh=du(function(n,t){return n*t}),fh=Ou("round"),ah=du(function(n,t){return n-t});return Wt.after=$o,Wt.ary=zo,Wt.assign=ms,Wt.assignIn=xs,Wt.assignInWith=js,Wt.assignWith=As,Wt.at=Os,Wt.before=Uo,Wt.bind=fs,Wt.bindAll=Vs,Wt.bindKey=as,Wt.castArray=Yo,Wt.chain=io,Wt.chunk=hi,Wt.compact=pi,Wt.concat=vi,Wt.cond=Ta,Wt.conforms=Za,Wt.constant=Va,Wt.countBy=Xl,Wt.create=Vf,Wt.curry=Fo,Wt.curryRight=Mo,Wt.debounce=Do,Wt.defaults=ks,Wt.defaultsDeep=Is,Wt.defer=cs,Wt.delay=ls,Wt.difference=$l,Wt.differenceBy=zl,Wt.differenceWith=Ul,Wt.drop=_i,Wt.dropRight=gi,Wt.dropRightWhile=yi,Wt.dropWhile=di,Wt.fill=bi,Wt.filter=go,Wt.flatMap=yo,Wt.flatMapDeep=bo,Wt.flatMapDepth=wo,Wt.flatten=xi,Wt.flattenDeep=ji,Wt.flattenDepth=Ai,Wt.flip=Po,Wt.flow=Ks,Wt.flowRight=Gs,Wt.fromPairs=Oi,Wt.functions=Xf,Wt.functionsIn=na,Wt.groupBy=rs,Wt.initial=Ri,Wt.intersection=Fl,Wt.intersectionBy=Ml,Wt.intersectionWith=Dl,Wt.invert=Rs,Wt.invertBy=Es,Wt.invokeMap=es,Wt.iteratee=Ga,Wt.keyBy=us,Wt.keys=ua,Wt.keysIn=ia,Wt.map=Ao,Wt.mapKeys=oa,Wt.mapValues=fa,Wt.matches=Ja,Wt.matchesProperty=Ya,Wt.memoize=No,Wt.merge=Ws,Wt.mergeWith=Ls,Wt.method=Js,Wt.methodOf=Ys,Wt.mixin=Ha,Wt.negate=qo,Wt.nthArg=nc,Wt.omit=Cs,Wt.omitBy=aa,Wt.once=To,Wt.orderBy=Oo,Wt.over=Hs,Wt.overArgs=ss,Wt.overEvery=Qs,Wt.overSome=Xs,Wt.partial=hs,Wt.partialRight=ps,Wt.partition=is,Wt.pick=Bs,Wt.pickBy=ca,Wt.property=tc,Wt.propertyOf=rc,Wt.pull=Pl,Wt.pullAll=Ci,Wt.pullAllBy=Bi,Wt.pullAllWith=$i,Wt.pullAt=Nl,Wt.range=nh,Wt.rangeRight=th,Wt.rearg=vs,Wt.reject=Ro,Wt.remove=zi,Wt.rest=Zo,Wt.reverse=Ui,Wt.sampleSize=So,Wt.set=sa,Wt.setWith=ha,Wt.shuffle=Wo,Wt.slice=Fi,Wt.sortBy=os,Wt.sortedUniq=Zi,Wt.sortedUniqBy=Vi,Wt.split=Ca,Wt.spread=Vo,Wt.tail=Ki,Wt.take=Gi,Wt.takeRight=Ji,Wt.takeRightWhile=Yi,Wt.takeWhile=Hi,Wt.tap=oo,Wt.throttle=Ko,Wt.thru=fo,Wt.toArray=Ff,Wt.toPairs=$s,Wt.toPairsIn=zs,Wt.toPath=cc,Wt.toPlainObject=qf,Wt.transform=pa,Wt.unary=Go,Wt.union=ql,Wt.unionBy=Tl,Wt.unionWith=Zl,Wt.uniq=Qi,Wt.uniqBy=Xi,Wt.uniqWith=no,Wt.unset=va,Wt.unzip=to,Wt.unzipWith=ro,Wt.update=_a,Wt.updateWith=ga,Wt.values=ya,Wt.valuesIn=da,Wt.without=Vl,Wt.words=qa,Wt.wrap=Jo,Wt.xor=Kl,Wt.xorBy=Gl,Wt.xorWith=Jl,Wt.zip=Yl,Wt.zipObject=eo,Wt.zipObjectDeep=uo,Wt.zipWith=Hl,Wt.entries=$s,Wt.entriesIn=zs,Wt.extend=xs,Wt.extendWith=js,Ha(Wt,Wt),Wt.add=rh,Wt.attempt=Zs,Wt.camelCase=Us,Wt.capitalize=xa,Wt.ceil=eh,Wt.clamp=ba,Wt.clone=Ho,Wt.cloneDeep=Xo,Wt.cloneDeepWith=nf,Wt.cloneWith=Qo,Wt.deburr=ja,Wt.divide=uh,Wt.endsWith=Aa,Wt.eq=tf,Wt.escape=Oa,Wt.escapeRegExp=ka,Wt.every=_o,Wt.find=ns,Wt.findIndex=wi,Wt.findKey=Kf,Wt.findLast=ts,Wt.findLastIndex=mi,Wt.findLastKey=Gf,Wt.floor=ih,Wt.forEach=mo,Wt.forEachRight=xo,Wt.forIn=Jf,Wt.forInRight=Yf,Wt.forOwn=Hf,Wt.forOwnRight=Qf,Wt.get=ta,Wt.gt=_s,Wt.gte=gs,Wt.has=ra,Wt.hasIn=ea,Wt.head=ki,Wt.identity=Ka,Wt.includes=jo,Wt.indexOf=Ii,Wt.inRange=wa,Wt.invoke=Ss,Wt.isArguments=rf,Wt.isArray=ys,Wt.isArrayBuffer=ef,Wt.isArrayLike=uf,Wt.isArrayLikeObject=of,Wt.isBoolean=ff,Wt.isBuffer=ds,Wt.isDate=af,Wt.isElement=cf,Wt.isEmpty=lf,Wt.isEqual=sf,Wt.isEqualWith=hf,Wt.isError=pf,Wt.isFinite=vf,Wt.isFunction=_f,Wt.isInteger=gf,Wt.isLength=yf,Wt.isMap=wf,Wt.isMatch=mf,Wt.isMatchWith=xf,Wt.isNaN=jf,Wt.isNative=Af,Wt.isNil=kf,Wt.isNull=Of,Wt.isNumber=If,Wt.isObject=df,Wt.isObjectLike=bf,Wt.isPlainObject=Rf,Wt.isRegExp=Ef,Wt.isSafeInteger=Sf,Wt.isSet=Wf,Wt.isString=Lf,Wt.isSymbol=Cf,Wt.isTypedArray=Bf,Wt.isUndefined=$f,Wt.isWeakMap=zf,Wt.isWeakSet=Uf,Wt.join=Ei,Wt.kebabCase=Fs,Wt.last=Si,Wt.lastIndexOf=Wi,Wt.lowerCase=Ms,Wt.lowerFirst=Ds,Wt.lt=bs,Wt.lte=ws,Wt.max=sc,Wt.maxBy=hc,Wt.mean=pc,Wt.meanBy=vc,Wt.min=_c,Wt.minBy=gc,Wt.stubArray=ec,Wt.stubFalse=uc,Wt.stubObject=ic,Wt.stubString=oc,Wt.stubTrue=fc,Wt.multiply=oh,Wt.nth=Li,Wt.noConflict=Qa,Wt.noop=Xa,Wt.now=Bo,Wt.pad=Ia,Wt.padEnd=Ra,Wt.padStart=Ea,Wt.parseInt=Sa,Wt.random=ma,Wt.reduce=ko,Wt.reduceRight=Io,Wt.repeat=Wa,Wt.replace=La,Wt.result=la,Wt.round=fh,Wt.runInContext=V,Wt.sample=Eo,Wt.size=Lo,Wt.snakeCase=Ps,Wt.some=Co,Wt.sortedIndex=Mi,Wt.sortedIndexBy=Di,Wt.sortedIndexOf=Pi,Wt.sortedLastIndex=Ni,Wt.sortedLastIndexBy=qi,Wt.sortedLastIndexOf=Ti,Wt.startCase=Ns,Wt.startsWith=Ba,Wt.subtract=ah,Wt.sum=yc,Wt.sumBy=dc,Wt.template=$a,Wt.times=ac,Wt.toFinite=Mf,Wt.toInteger=Df,Wt.toLength=Pf,Wt.toLower=za,Wt.toNumber=Nf,Wt.toSafeInteger=Tf,Wt.toString=Zf,Wt.toUpper=Ua,Wt.trim=Fa,Wt.trimEnd=Ma,Wt.trimStart=Da,Wt.truncate=Pa,Wt.unescape=Na,Wt.uniqueId=lc,Wt.upperCase=qs,Wt.upperFirst=Ts,Wt.each=mo,Wt.eachRight=xo,Wt.first=ki,Ha(Wt,function(){var n={};return qr(Wt,function(t,r){Sc.call(Wt.prototype,r)||(n[r]=t)}),n}(),{chain:!1}),Wt.VERSION=G,u(["bind","bindKey","curry","curryRight","partial","partialRight"],function(n){Wt[n].placeholder=Wt}),u(["drop","take"],function(n,t){Bt.prototype[n]=function(r){var e=this.__filtered__;if(e&&!t)return new Bt(this);r=r===K?1:Xc(Df(r),0);var u=this.clone();return e?u.__takeCount__=nl(r,u.__takeCount__):u.__views__.push({size:nl(r,jn),type:n+(u.__dir__<0?"Right":"")}),u},Bt.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),u(["filter","map","takeWhile"],function(n,t){var r=t+1,e=r==gn||r==dn;Bt.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:$u(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),u(["head","last"],function(n,t){var r="take"+(t?"Right":"");Bt.prototype[n]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Bt.prototype[n]=function(){return this.__filtered__?new Bt(this):this[r](1)}}),Bt.prototype.compact=function(){return this.filter(Ka)},Bt.prototype.find=function(n){return this.filter(n).head()},Bt.prototype.findLast=function(n){return this.reverse().find(n)},Bt.prototype.invokeMap=Zo(function(n,t){return"function"==typeof n?new Bt(this):this.map(function(r){return ne(r,n,t)})}),Bt.prototype.reject=function(n){return n=$u(n,3),this.filter(function(t){return!n(t)})},Bt.prototype.slice=function(n,t){n=Df(n);var r=this;return r.__filtered__&&(n>0||t<0)?new Bt(r):(n<0?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==K&&(t=Df(t),r=t<0?r.dropRight(-t):r.take(t-n)),r)},Bt.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Bt.prototype.toArray=function(){return this.take(jn)},qr(Bt.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=Wt[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(Wt.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Bt,a=o[0],c=f||ys(t),l=function(n){var t=u.apply(Wt,s([n],o));return e&&h?t[0]:t};c&&r&&"function"==typeof a&&1!=a.length&&(f=c=!1);var h=this.__chain__,p=!!this.__actions__.length,v=i&&!h,_=f&&!p;if(!i&&c){t=_?t:new Bt(this);var g=n.apply(t,o);return g.__actions__.push({func:fo,args:[l],thisArg:K}),new Ct(g,h)}return v&&_?n.apply(this,o):(g=this.thru(l),v?e?g.value()[0]:g.value():g)})}),u(["pop","push","shift","sort","splice","unshift"],function(n){var t=Ac[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);Wt.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(ys(u)?u:[],n)}return this[r](function(r){return t.apply(ys(r)?r:[],n)})}}),qr(Bt.prototype,function(n,t){var r=Wt[t];if(r){var e=r.name+"",u=vl[e]||(vl[e]=[]);u.push({name:t,func:r})}}),vl[gu(K,nn).name]=[{name:"wrapper",func:K}],Bt.prototype.clone=$t,Bt.prototype.reverse=zt,Bt.prototype.value=Ut,Wt.prototype.at=Ql,Wt.prototype.chain=ao,Wt.prototype.commit=co,Wt.prototype.next=lo,Wt.prototype.plant=ho,Wt.prototype.reverse=po,Wt.prototype.toJSON=Wt.prototype.valueOf=Wt.prototype.value=vo,Nc&&(Wt.prototype[Nc]=so),Wt}var K,G="4.13.1",J=200,Y="Expected a function",H="__lodash_hash_undefined__",Q="__lodash_placeholder__",X=1,nn=2,tn=4,rn=8,en=16,un=32,on=64,fn=128,an=256,cn=512,ln=1,sn=2,hn=30,pn="...",vn=150,_n=16,gn=1,yn=2,dn=3,bn=1/0,wn=9007199254740991,mn=1.7976931348623157e308,xn=NaN,jn=4294967295,An=jn-1,On=jn>>>1,kn="[object Arguments]",In="[object Array]",Rn="[object Boolean]",En="[object Date]",Sn="[object Error]",Wn="[object Function]",Ln="[object GeneratorFunction]",Cn="[object Map]",Bn="[object Number]",$n="[object Object]",zn="[object Promise]",Un="[object RegExp]",Fn="[object Set]",Mn="[object String]",Dn="[object Symbol]",Pn="[object WeakMap]",Nn="[object WeakSet]",qn="[object ArrayBuffer]",Tn="[object DataView]",Zn="[object Float32Array]",Vn="[object Float64Array]",Kn="[object Int8Array]",Gn="[object Int16Array]",Jn="[object Int32Array]",Yn="[object Uint8Array]",Hn="[object Uint8ClampedArray]",Qn="[object Uint16Array]",Xn="[object Uint32Array]",nt=/\b__p \+= '';/g,tt=/\b(__p \+=) '' \+/g,rt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,et=/&(?:amp|lt|gt|quot|#39|#96);/g,ut=/[&<>"'`]/g,it=RegExp(et.source),ot=RegExp(ut.source),ft=/<%-([\s\S]+?)%>/g,at=/<%([\s\S]+?)%>/g,ct=/<%=([\s\S]+?)%>/g,lt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,st=/^\w*$/,ht=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(\.|\[\])(?:\4|$))/g,pt=/[\\^$.*+?()[\]{}|]/g,vt=RegExp(pt.source),_t=/^\s+|\s+$/g,gt=/^\s+/,yt=/\s+$/,dt=/[a-zA-Z0-9]+/g,bt=/\\(\\)?/g,wt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,mt=/\w*$/,xt=/^0x/i,jt=/^[-+]0x[0-9a-f]+$/i,At=/^0b[01]+$/i,Ot=/^\[object .+?Constructor\]$/,kt=/^0o[0-7]+$/i,It=/^(?:0|[1-9]\d*)$/,Rt=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Et=/($^)/,St=/['\n\r\u2028\u2029\\]/g,Wt="\\ud800-\\udfff",Lt="\\u0300-\\u036f\\ufe20-\\ufe23",Ct="\\u20d0-\\u20f0",Bt="\\u2700-\\u27bf",$t="a-z\\xdf-\\xf6\\xf8-\\xff",zt="\\xac\\xb1\\xd7\\xf7",Ut="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Ft="\\u2000-\\u206f",Mt=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Dt="A-Z\\xc0-\\xd6\\xd8-\\xde",Pt="\\ufe0e\\ufe0f",Nt=zt+Ut+Ft+Mt,qt="['’]",Tt="["+Wt+"]",Zt="["+Nt+"]",Vt="["+Lt+Ct+"]",Kt="\\d+",Gt="["+Bt+"]",Jt="["+$t+"]",Yt="[^"+Wt+Nt+Kt+Bt+$t+Dt+"]",Ht="\\ud83c[\\udffb-\\udfff]",Qt="(?:"+Vt+"|"+Ht+")",Xt="[^"+Wt+"]",nr="(?:\\ud83c[\\udde6-\\uddff]){2}",tr="[\\ud800-\\udbff][\\udc00-\\udfff]",rr="["+Dt+"]",er="\\u200d",ur="(?:"+Jt+"|"+Yt+")",ir="(?:"+rr+"|"+Yt+")",or="(?:"+qt+"(?:d|ll|m|re|s|t|ve))?",fr="(?:"+qt+"(?:D|LL|M|RE|S|T|VE))?",ar=Qt+"?",cr="["+Pt+"]?",lr="(?:"+er+"(?:"+[Xt,nr,tr].join("|")+")"+cr+ar+")*",sr=cr+ar+lr,hr="(?:"+[Gt,nr,tr].join("|")+")"+sr,pr="(?:"+[Xt+Vt+"?",Vt,nr,tr,Tt].join("|")+")",vr=RegExp(qt,"g"),_r=RegExp(Vt,"g"),gr=RegExp(Ht+"(?="+Ht+")|"+pr+sr,"g"),yr=RegExp([rr+"?"+Jt+"+"+or+"(?="+[Zt,rr,"$"].join("|")+")",ir+"+"+fr+"(?="+[Zt,rr+ur,"$"].join("|")+")",rr+"?"+ur+"+"+or,rr+"+"+fr,Kt,hr].join("|"),"g"),dr=RegExp("["+er+Wt+Lt+Ct+Pt+"]"),br=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,wr=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","Reflect","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","isFinite","parseInt","setTimeout"],mr=-1,xr={}; +(function(){function n(n,t){return n.set(t[0],t[1]),n}function t(n,t){return n.add(t),n}function r(n,t,r){var e=r.length;switch(e){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function e(n,t,r,e){for(var u=-1,i=n?n.length:0;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function u(n,t){for(var r=-1,e=n?n.length:0;++r<e&&t(n[r],r,n)!==!1;);return n}function i(n,t){for(var r=n?n.length:0;r--&&t(n[r],r,n)!==!1;);return n}function o(n,t){for(var r=-1,e=n?n.length:0;++r<e;)if(!t(n[r],r,n))return!1;return!0}function f(n,t){for(var r=-1,e=n?n.length:0,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function a(n,t){var r=n?n.length:0;return!!r&&y(n,t,0)>-1}function c(n,t,r){for(var e=-1,u=n?n.length:0;++e<u;)if(r(t,n[e]))return!0;return!1}function l(n,t){for(var r=-1,e=n?n.length:0,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function s(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function h(n,t,r,e){var u=-1,i=n?n.length:0;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);return r}function p(n,t,r,e){var u=n?n.length:0;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function v(n,t){for(var r=-1,e=n?n.length:0;++r<e;)if(t(n[r],r,n))return!0;return!1}function _(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,!1}),e}function g(n,t,r,e){for(var u=n.length,i=r+(e?1:-1);e?i--:++i<u;)if(t(n[i],i,n))return i;return-1}function y(n,t,r){if(t!==t)return z(n,r);for(var e=r-1,u=n.length;++e<u;)if(n[e]===t)return e;return-1}function d(n,t,r,e){for(var u=r-1,i=n.length;++u<i;)if(e(n[u],t))return u;return-1}function b(n,t){var r=n?n.length:0;return r?x(n,t)/r:xn}function w(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=!1,n):t(r,n,u,i)}),r}function m(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].value;return n}function x(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==K&&(r=r===K?i:r+i)}return r}function j(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function A(n,t){return l(t,function(t){return[t,n[t]]})}function O(n){return function(t){return n(t)}}function k(n,t){return l(t,function(t){return n[t]})}function I(n,t){return n.has(t)}function R(n,t){for(var r=-1,e=n.length;++r<e&&y(t,n[r],0)>-1;);return r}function E(n,t){for(var r=n.length;r--&&y(t,n[r],0)>-1;);return r}function S(n){return n&&n.Object===Object?n:null}function W(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&e++;return e}function L(n){return Ar[n]}function C(n){return Or[n]}function B(n){return"\\"+Ir[n]}function $(n,t){return null==n?K:n[t]}function z(n,t,r){for(var e=n.length,u=t+(r?1:-1);r?u--:++u<e;){var i=n[u];if(i!==i)return u}return-1}function U(n){var t=!1;if(null!=n&&"function"!=typeof n.toString)try{t=!!(n+"")}catch(n){}return t}function F(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function M(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function D(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&o!==Q||(n[r]=Q,i[u++]=r)}return i}function P(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=n}),r}function N(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function q(n){if(!n||!dr.test(n))return n.length;for(var t=gr.lastIndex=0;gr.test(n);)t++;return t}function T(n){return n.match(gr)}function Z(n){return kr[n]}function V(S){function Wt(n){if(bf(n)&&!ys(n)&&!(n instanceof Bt)){if(n instanceof Ct)return n;if(Sc.call(n,"__wrapped__"))return si(n)}return new Ct(n)}function Lt(){}function Ct(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=K}function Bt(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=jn,this.__views__=[]}function $t(){var n=new Bt(this.__wrapped__);return n.__actions__=ru(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=ru(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=ru(this.__views__),n}function zt(){if(this.__filtered__){var n=new Bt(this);n.__dir__=-1,n.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n}function Ut(){var n=this.__wrapped__.value(),t=this.__dir__,r=ys(n),e=t<0,u=r?n.length:0,i=Nu(0,u,this.__views__),o=i.start,f=i.end,a=f-o,c=e?f:o-1,l=this.__iteratees__,s=l.length,h=0,p=nl(a,this.__takeCount__);if(!r||u<J||u==a&&p==a)return Ue(n,this.__actions__);var v=[];n:for(;a--&&h<p;){c+=t;for(var _=-1,g=n[c];++_<s;){var y=l[_],d=y.iteratee,b=y.type,w=d(g);if(b==yn)g=w;else if(!w){if(b==gn)continue n;break n}}v[h++]=g}return v}function Ft(n){var t=-1,r=n?n.length:0;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Mt(){this.__data__=sl?sl(null):{}}function Dt(n){return this.has(n)&&delete this.__data__[n]}function Pt(n){var t=this.__data__;if(sl){var r=t[n];return r===H?K:r}return Sc.call(t,n)?t[n]:K}function Nt(n){var t=this.__data__;return sl?t[n]!==K:Sc.call(t,n)}function qt(n,t){var r=this.__data__;return r[n]=sl&&t===K?H:t,this}function Tt(n){var t=-1,r=n?n.length:0;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Zt(){this.__data__=[]}function Vt(n){var t=this.__data__,r=gr(t,n);if(r<0)return!1;var e=t.length-1;return r==e?t.pop():Zc.call(t,r,1),!0}function Kt(n){var t=this.__data__,r=gr(t,n);return r<0?K:t[r][1]}function Gt(n){return gr(this.__data__,n)>-1}function Jt(n,t){var r=this.__data__,e=gr(r,n);return e<0?r.push([n,t]):r[e][1]=t,this}function Yt(n){var t=-1,r=n?n.length:0;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Ht(){this.__data__={hash:new Ft,map:new(fl||Tt),string:new Ft}}function Qt(n){return zu(this,n).delete(n)}function Xt(n){return zu(this,n).get(n)}function nr(n){return zu(this,n).has(n)}function tr(n,t){return zu(this,n).set(n,t),this}function rr(n){var t=-1,r=n?n.length:0;for(this.__data__=new Yt;++t<r;)this.add(n[t])}function er(n){return this.__data__.set(n,H),this}function ur(n){return this.__data__.has(n)}function ir(n){this.__data__=new Tt(n)}function or(){this.__data__=new Tt}function fr(n){return this.__data__.delete(n)}function ar(n){return this.__data__.get(n)}function cr(n){return this.__data__.has(n)}function lr(n,t){var r=this.__data__;return r instanceof Tt&&r.__data__.length==J&&(r=this.__data__=new Yt(r.__data__)),r.set(n,t),this}function sr(n,t,r,e){return n===K||tf(n,Oc[r])&&!Sc.call(e,r)?t:n}function hr(n,t,r){(r===K||tf(n[t],r))&&("number"!=typeof t||r!==K||t in n)||(n[t]=r)}function pr(n,t,r){var e=n[t];Sc.call(n,t)&&tf(e,r)&&(r!==K||t in n)||(n[t]=r)}function gr(n,t){for(var r=n.length;r--;)if(tf(n[r][0],t))return r;return-1}function Ar(n,t,r,e){return jl(n,function(n,u,i){t(e,n,r(n),i)}),e}function Or(n,t){return n&&eu(t,ua(t),n)}function kr(n,t){for(var r=-1,e=null==n,u=t.length,i=Array(u);++r<u;)i[r]=e?K:ta(n,t[r]);return i}function Ir(n,t,r){return n===n&&(r!==K&&(n=n<=r?n:r),t!==K&&(n=n>=t?n:t)),n}function Sr(n,t,r,e,i,o,f){var a;if(e&&(a=o?e(n,i,o,f):e(n)),a!==K)return a;if(!df(n))return n;var c=ys(n);if(c){if(a=Tu(n),!t)return ru(n,a)}else{var l=Pu(n),s=l==Wn||l==Ln;if(ds(n))return Te(n,t);if(l==$n||l==kn||s&&!o){if(U(n))return o?n:{};if(a=Zu(s?{}:n),!t)return uu(n,Or(a,n))}else{if(!jr[l])return o?n:{};a=Vu(n,l,Sr,t)}}f||(f=new ir);var h=f.get(n);if(h)return h;if(f.set(n,a),!c)var p=r?Wu(n):ua(n);return u(p||n,function(u,i){p&&(i=u,u=n[i]),pr(a,i,Sr(u,t,r,e,i,n,f))}),a}function Wr(n){var t=ua(n),r=t.length;return function(e){if(null==e)return!r;for(var u=r;u--;){var i=t[u],o=n[i],f=e[i];if(f===K&&!(i in Object(e))||!o(f))return!1}return!0}}function Cr(n){return df(n)?qc(n):{}}function Br(n,t,r){if("function"!=typeof n)throw new jc(Y);return Vc(function(){n.apply(K,r)},t)}function $r(n,t,r,e){var u=-1,i=a,o=!0,f=n.length,s=[],h=t.length;if(!f)return s;r&&(t=l(t,O(r))),e?(i=c,o=!1):t.length>=J&&(i=I,o=!1,t=new rr(t));n:for(;++u<f;){var p=n[u],v=r?r(p):p;if(p=e||0!==p?p:0,o&&v===v){for(var _=h;_--;)if(t[_]===v)continue n;s.push(p)}else i(t,v,e)||s.push(p)}return s}function Fr(n,t){var r=!0;return jl(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Mr(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(f===K?o===o&&!Cf(o):r(o,f)))var f=o,a=i}return a}function Dr(n,t,r,e){var u=n.length;for(r=Df(r),r<0&&(r=-r>u?0:u+r),e=e===K||e>u?u:Df(e),e<0&&(e+=u),e=r>e?0:Pf(e);r<e;)n[r++]=t;return n}function Pr(n,t){var r=[];return jl(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function Nr(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=Gu),u||(u=[]);++i<o;){var f=n[i];t>0&&r(f)?t>1?Nr(f,t-1,r,e,u):s(u,f):e||(u[u.length]=f)}return u}function qr(n,t){return n&&Ol(n,t,ua)}function Tr(n,t){return n&&kl(n,t,ua)}function Zr(n,t){return f(t,function(t){return _f(n[t])})}function Vr(n,t){t=Qu(t,n)?[t]:Ne(t);for(var r=0,e=t.length;null!=n&&r<e;)n=n[ci(t[r++])];return r&&r==e?n:K}function Kr(n,t,r){var e=t(n);return ys(n)?e:s(e,r(n))}function Gr(n,t){return n>t}function Jr(n,t){return null!=n&&(Sc.call(n,t)||"object"==typeof n&&t in n&&null===Mu(n))}function Yr(n,t){return null!=n&&t in Object(n)}function Hr(n,t,r){return n>=nl(t,r)&&n<Xc(t,r)}function Qr(n,t,r){for(var e=r?c:a,u=n[0].length,i=n.length,o=i,f=Array(i),s=1/0,h=[];o--;){var p=n[o];o&&t&&(p=l(p,O(t))),s=nl(p.length,s),f[o]=!r&&(t||u>=120&&p.length>=120)?new rr(o&&p):K}p=n[0];var v=-1,_=f[0];n:for(;++v<u&&h.length<s;){var g=p[v],y=t?t(g):g;if(g=r||0!==g?g:0,!(_?I(_,y):e(h,y,r))){for(o=i;--o;){var d=f[o];if(!(d?I(d,y):e(n[o],y,r)))continue n}_&&_.push(y),h.push(g)}}return h}function Xr(n,t,r,e){return qr(n,function(n,u,i){t(e,r(n),u,i)}),e}function ne(n,t,e){Qu(t,n)||(t=Ne(t),n=fi(n,t),t=Si(t));var u=null==n?n:n[ci(t)];return null==u?K:r(u,n,e)}function te(n,t,r,e,u){return n===t||(null==n||null==t||!df(n)&&!bf(t)?n!==n&&t!==t:re(n,t,te,r,e,u))}function re(n,t,r,e,u,i){var o=ys(n),f=ys(t),a=In,c=In;o||(a=Pu(n),a=a==kn?$n:a),f||(c=Pu(t),c=c==kn?$n:c);var l=a==$n&&!U(n),s=c==$n&&!U(t),h=a==c;if(h&&!l)return i||(i=new ir),o||Bf(n)?Ru(n,t,r,e,u,i):Eu(n,t,a,r,e,u,i);if(!(u&sn)){var p=l&&Sc.call(n,"__wrapped__"),v=s&&Sc.call(t,"__wrapped__");if(p||v){var _=p?n.value():n,g=v?t.value():t;return i||(i=new ir),r(_,g,e,u,i)}}return!!h&&(i||(i=new ir),Su(n,t,r,e,u,i))}function ee(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=Object(n);u--;){var f=r[u];if(o&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++u<i;){f=r[u];var a=f[0],c=n[a],l=f[1];if(o&&f[2]){if(c===K&&!(a in n))return!1}else{var s=new ir;if(e)var h=e(c,l,a,n,t,s);if(!(h===K?te(l,c,e,ln|sn,s):h))return!1}}return!0}function ue(n){if(!df(n)||ti(n))return!1;var t=_f(n)||U(n)?$c:Ot;return t.test(li(n))}function ie(n){return"function"==typeof n?n:null==n?Ka:"object"==typeof n?ys(n)?se(n[0],n[1]):le(n):tc(n)}function oe(n){return Qc(Object(n))}function fe(n){n=null==n?n:Object(n);var t=[];for(var r in n)t.push(r);return t}function ae(n,t){return n<t}function ce(n,t){var r=-1,e=uf(n)?Array(n.length):[];return jl(n,function(n,u,i){e[++r]=t(n,u,i)}),e}function le(n){var t=Uu(n);return 1==t.length&&t[0][2]?ui(t[0][0],t[0][1]):function(r){return r===n||ee(r,n,t)}}function se(n,t){return Qu(n)&&ei(t)?ui(ci(n),t):function(r){var e=ta(r,n);return e===K&&e===t?ea(r,n):te(t,e,K,ln|sn)}}function he(n,t,r,e,i){if(n!==t){if(!ys(t)&&!Bf(t))var o=ia(t);u(o||t,function(u,f){if(o&&(f=u,u=t[f]),df(u))i||(i=new ir),pe(n,t,f,r,he,e,i);else{var a=e?e(n[f],u,f+"",n,t,i):K;a===K&&(a=u),hr(n,f,a)}})}}function pe(n,t,r,e,u,i,o){var f=n[r],a=t[r],c=o.get(a);if(c)return void hr(n,r,c);var l=i?i(f,a,r+"",n,t,o):K,s=l===K;s&&(l=a,ys(a)||Bf(a)?ys(f)?l=f:of(f)?l=ru(f):(s=!1,l=Sr(a,!0)):Rf(a)||rf(a)?rf(f)?l=qf(f):!df(f)||e&&_f(f)?(s=!1,l=Sr(a,!0)):l=f:s=!1),o.set(a,l),s&&u(l,a,e,i,o),o.delete(a),hr(n,r,l)}function ve(n,t){var r=n.length;if(r)return t+=t<0?r:0,Yu(t,r)?n[t]:K}function _e(n,t,r){var e=-1;t=l(t.length?t:[Ka],O($u()));var u=ce(n,function(n,r,u){var i=l(t,function(t){return t(n)});return{criteria:i,index:++e,value:n}});return m(u,function(n,t){return Xe(n,t,r)})}function ge(n,t){return n=Object(n),h(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function ye(n,t){for(var r=-1,e=Lu(n),u=e.length,i={};++r<u;){var o=e[r],f=n[o];t(f,o)&&(i[o]=f)}return i}function de(n){return function(t){return null==t?K:t[n]}}function be(n){return function(t){return Vr(t,n)}}function we(n,t,r,e){var u=e?d:y,i=-1,o=t.length,f=n;for(n===t&&(t=ru(t)),r&&(f=l(n,O(r)));++i<o;)for(var a=0,c=t[i],s=r?r(c):c;(a=u(f,s,a,e))>-1;)f!==n&&Zc.call(f,a,1),Zc.call(n,a,1);return n}function me(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;if(Yu(u))Zc.call(n,u,1);else if(Qu(u,n))delete n[ci(u)];else{var o=Ne(u),f=fi(n,o);null!=f&&delete f[ci(Si(o))]}}}return n}function xe(n,t){return n+Gc(rl()*(t-n+1))}function je(n,t,r,e){for(var u=-1,i=Xc(Kc((t-n)/(r||1)),0),o=Array(i);i--;)o[e?i:++u]=n,n+=r;return o}function Ae(n,t){var r="";if(!n||t<1||t>wn)return r;do t%2&&(r+=n),t=Gc(t/2),t&&(n+=n);while(t);return r}function Oe(n,t,r,e){t=Qu(t,n)?[t]:Ne(t);for(var u=-1,i=t.length,o=i-1,f=n;null!=f&&++u<i;){var a=ci(t[u]);if(df(f)){var c=r;if(u!=o){var l=f[a];c=e?e(l,a,f):K,c===K&&(c=null==l?Yu(t[u+1])?[]:{}:l)}pr(f,a,c)}f=f[a]}return n}function ke(n,t,r){var e=-1,u=n.length;t<0&&(t=-t>u?0:u+t),r=r>u?u:r,r<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(u);++e<u;)i[e]=n[e+t];return i}function Ie(n,t){var r;return jl(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function Re(n,t,r){var e=0,u=n?n.length:e;if("number"==typeof t&&t===t&&u<=On){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!Cf(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return Ee(n,t,Ka,r)}function Ee(n,t,r,e){t=r(t);for(var u=0,i=n?n.length:0,o=t!==t,f=null===t,a=Cf(t),c=t===K;u<i;){var l=Gc((u+i)/2),s=r(n[l]),h=s!==K,p=null===s,v=s===s,_=Cf(s);if(o)var g=e||v;else g=c?v&&(e||h):f?v&&h&&(e||!p):a?v&&h&&!p&&(e||!_):!p&&!_&&(e?s<=t:s<t);g?u=l+1:i=l}return nl(i,An)}function Se(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r],f=t?t(o):o;if(!r||!tf(f,a)){var a=f;i[u++]=0===o?0:o}}return i}function We(n){return"number"==typeof n?n:Cf(n)?xn:+n}function Le(n){if("string"==typeof n)return n;if(Cf(n))return xl?xl.call(n):"";var t=n+"";return"0"==t&&1/n==-bn?"-0":t}function Ce(n,t,r){var e=-1,u=a,i=n.length,o=!0,f=[],l=f;if(r)o=!1,u=c;else if(i>=J){var s=t?null:Rl(n);if(s)return P(s);o=!1,u=I,l=new rr}else l=t?[]:f;n:for(;++e<i;){var h=n[e],p=t?t(h):h;if(h=r||0!==h?h:0,o&&p===p){for(var v=l.length;v--;)if(l[v]===p)continue n;t&&l.push(p),f.push(h)}else u(l,p,r)||(l!==f&&l.push(p),f.push(h))}return f}function Be(n,t){t=Qu(t,n)?[t]:Ne(t),n=fi(n,t);var r=ci(Si(t));return!(null!=n&&Jr(n,r))||delete n[r]}function $e(n,t,r,e){return Oe(n,t,r(Vr(n,t)),e)}function ze(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?ke(n,e?0:i,e?i+1:u):ke(n,e?i+1:0,e?u:i)}function Ue(n,t){var r=n;return r instanceof Bt&&(r=r.value()),h(t,function(n,t){return t.func.apply(t.thisArg,s([n],t.args))},r)}function Fe(n,t,r){for(var e=-1,u=n.length;++e<u;)var i=i?s($r(i,n[e],t,r),$r(n[e],i,t,r)):n[e];return i&&i.length?Ce(i,t,r):[]}function Me(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;){var f=e<i?t[e]:K;r(o,n[e],f)}return o}function De(n){return of(n)?n:[]}function Pe(n){return"function"==typeof n?n:Ka}function Ne(n){return ys(n)?n:Bl(n)}function qe(n,t,r){var e=n.length;return r=r===K?e:r,!t&&r>=e?n:ke(n,t,r)}function Te(n,t){if(t)return n.slice();var r=new n.constructor(n.length);return n.copy(r),r}function Ze(n){var t=new n.constructor(n.byteLength);return new Mc(t).set(new Mc(n)),t}function Ve(n,t){var r=t?Ze(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.byteLength)}function Ke(t,r,e){var u=r?e(M(t),!0):M(t);return h(u,n,new t.constructor)}function Ge(n){var t=new n.constructor(n.source,mt.exec(n));return t.lastIndex=n.lastIndex,t}function Je(n,r,e){var u=r?e(P(n),!0):P(n);return h(u,t,new n.constructor)}function Ye(n){return ml?Object(ml.call(n)):{}}function He(n,t){var r=t?Ze(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.length)}function Qe(n,t){if(n!==t){var r=n!==K,e=null===n,u=n===n,i=Cf(n),o=t!==K,f=null===t,a=t===t,c=Cf(t);if(!f&&!c&&!i&&n>t||i&&o&&a&&!f&&!c||e&&o&&a||!r&&a||!u)return 1;if(!e&&!i&&!c&&n<t||c&&r&&u&&!e&&!i||f&&r&&u||!o&&u||!a)return-1}return 0}function Xe(n,t,r){for(var e=-1,u=n.criteria,i=t.criteria,o=u.length,f=r.length;++e<o;){var a=Qe(u[e],i[e]);if(a){if(e>=f)return a;var c=r[e];return a*("desc"==c?-1:1)}}return n.index-t.index}function nu(n,t,r,e){for(var u=-1,i=n.length,o=r.length,f=-1,a=t.length,c=Xc(i-o,0),l=Array(a+c),s=!e;++f<a;)l[f]=t[f];for(;++u<o;)(s||u<i)&&(l[r[u]]=n[u]);for(;c--;)l[f++]=n[u++];return l}function tu(n,t,r,e){for(var u=-1,i=n.length,o=-1,f=r.length,a=-1,c=t.length,l=Xc(i-f,0),s=Array(l+c),h=!e;++u<l;)s[u]=n[u];for(var p=u;++a<c;)s[p+a]=t[a];for(;++o<f;)(h||u<i)&&(s[p+r[o]]=n[u++]);return s}function ru(n,t){var r=-1,e=n.length;for(t||(t=Array(e));++r<e;)t[r]=n[r];return t}function eu(n,t,r,e){r||(r={});for(var u=-1,i=t.length;++u<i;){var o=t[u],f=e?e(r[o],n[o],o,r,n):n[o];pr(r,o,f)}return r}function uu(n,t){return eu(n,Du(n),t)}function iu(n,t){return function(r,u){var i=ys(r)?e:Ar,o=t?t():{};return i(r,n,$u(u),o)}}function ou(n){return Zo(function(t,r){var e=-1,u=r.length,i=u>1?r[u-1]:K,o=u>2?r[2]:K;for(i=n.length>3&&"function"==typeof i?(u--,i):K,o&&Hu(r[0],r[1],o)&&(i=u<3?K:i,u=1),t=Object(t);++e<u;){var f=r[e];f&&n(t,f,e,i)}return t})}function fu(n,t){return function(r,e){if(null==r)return r;if(!uf(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=Object(r);(t?i--:++i<u)&&e(o[i],i,o)!==!1;);return r}}function au(n){return function(t,r,e){for(var u=-1,i=Object(t),o=e(t),f=o.length;f--;){var a=o[n?f:++u];if(r(i[a],a,i)===!1)break}return t}}function cu(n,t,r){function e(){var t=this&&this!==zr&&this instanceof e?i:n;return t.apply(u?r:this,arguments)}var u=t&X,i=hu(n);return e}function lu(n){return function(t){t=Zf(t);var r=dr.test(t)?T(t):K,e=r?r[0]:t.charAt(0),u=r?qe(r,1).join(""):t.slice(1);return e[n]()+u}}function su(n){return function(t){return h(qa(ja(t).replace(vr,"")),n,"")}}function hu(n){return function(){var t=arguments;switch(t.length){case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=Cr(n.prototype),e=n.apply(r,t);return df(e)?e:r}}function pu(n,t,e){function u(){for(var o=arguments.length,f=Array(o),a=o,c=Bu(u);a--;)f[a]=arguments[a];var l=o<3&&f[0]!==c&&f[o-1]!==c?[]:D(f,c);if(o-=l.length,o<e)return Au(n,t,gu,u.placeholder,K,f,l,K,K,e-o);var s=this&&this!==zr&&this instanceof u?i:n;return r(s,this,f)}var i=hu(n);return u}function vu(n){return function(t,r,e){var u=Object(t);if(r=$u(r,3),!uf(t))var i=ua(t);var o=n(i||t,function(n,t){return i&&(t=n,n=u[t]),r(n,t,u)},e);return o>-1?t[i?i[o]:o]:K}}function _u(n){return Zo(function(t){t=Nr(t,1);var r=t.length,e=r,u=Ct.prototype.thru;for(n&&t.reverse();e--;){var i=t[e];if("function"!=typeof i)throw new jc(Y);if(u&&!o&&"wrapper"==Cu(i))var o=new Ct([],(!0))}for(e=o?e:r;++e<r;){i=t[e];var f=Cu(i),a="wrapper"==f?El(i):K;o=a&&ni(a[0])&&a[1]==(fn|rn|un|an)&&!a[4].length&&1==a[9]?o[Cu(a[0])].apply(o,a[3]):1==i.length&&ni(i)?o[f]():o.thru(i)}return function(){var n=arguments,e=n[0];if(o&&1==n.length&&ys(e)&&e.length>=J)return o.plant(e).value();for(var u=0,i=r?t[u].apply(this,n):e;++u<r;)i=t[u].call(this,i);return i}})}function gu(n,t,r,e,u,i,o,f,a,c){function l(){for(var y=arguments.length,d=Array(y),b=y;b--;)d[b]=arguments[b];if(v)var w=Bu(l),m=W(d,w);if(e&&(d=nu(d,e,u,v)),i&&(d=tu(d,i,o,v)),y-=m,v&&y<c){var x=D(d,w);return Au(n,t,gu,l.placeholder,r,d,x,f,a,c-y)}var j=h?r:this,A=p?j[n]:n;return y=d.length,f?d=ai(d,f):_&&y>1&&d.reverse(),s&&a<y&&(d.length=a),this&&this!==zr&&this instanceof l&&(A=g||hu(A)),A.apply(j,d)}var s=t&fn,h=t&X,p=t&nn,v=t&(rn|en),_=t&cn,g=p?K:hu(n);return l}function yu(n,t){return function(r,e){return Xr(r,n,t(e),{})}}function du(n){return function(t,r){var e;if(t===K&&r===K)return 0;if(t!==K&&(e=t),r!==K){if(e===K)return r;"string"==typeof t||"string"==typeof r?(t=Le(t),r=Le(r)):(t=We(t),r=We(r)),e=n(t,r)}return e}}function bu(n){return Zo(function(t){return t=1==t.length&&ys(t[0])?l(t[0],O($u())):l(Nr(t,1,Ju),O($u())),Zo(function(e){var u=this;return n(t,function(n){return r(n,u,e)})})})}function wu(n,t){t=t===K?" ":Le(t);var r=t.length;if(r<2)return r?Ae(t,n):t;var e=Ae(t,Kc(n/q(t)));return dr.test(t)?qe(T(e),0,n).join(""):e.slice(0,n)}function mu(n,t,e,u){function i(){for(var t=-1,a=arguments.length,c=-1,l=u.length,s=Array(l+a),h=this&&this!==zr&&this instanceof i?f:n;++c<l;)s[c]=u[c];for(;a--;)s[c++]=arguments[++t];return r(h,o?e:this,s)}var o=t&X,f=hu(n);return i}function xu(n){return function(t,r,e){return e&&"number"!=typeof e&&Hu(t,r,e)&&(r=e=K),t=Nf(t),t=t===t?t:0,r===K?(r=t,t=0):r=Nf(r)||0,e=e===K?t<r?1:-1:Nf(e)||0,je(t,r,e,n)}}function ju(n){return function(t,r){return"string"==typeof t&&"string"==typeof r||(t=Nf(t),r=Nf(r)),n(t,r)}}function Au(n,t,r,e,u,i,o,f,a,c){var l=t&rn,s=l?o:K,h=l?K:o,p=l?i:K,v=l?K:i;t|=l?un:on,t&=~(l?on:un),t&tn||(t&=~(X|nn));var _=[n,t,u,p,s,v,h,f,a,c],g=r.apply(K,_);return ni(n)&&Cl(g,_),g.placeholder=e,g}function Ou(n){var t=mc[n];return function(n,r){if(n=Nf(n),r=nl(Df(r),292)){var e=(Zf(n)+"e").split("e"),u=t(e[0]+"e"+(+e[1]+r));return e=(Zf(u)+"e").split("e"),+(e[0]+"e"+(+e[1]-r))}return t(n)}}function ku(n){return function(t){var r=Pu(t);return r==Cn?M(t):r==Fn?N(t):A(t,n(t))}}function Iu(n,t,r,e,u,i,o,f){var a=t&nn;if(!a&&"function"!=typeof n)throw new jc(Y);var c=e?e.length:0;if(c||(t&=~(un|on),e=u=K),o=o===K?o:Xc(Df(o),0),f=f===K?f:Df(f),c-=u?u.length:0,t&on){var l=e,s=u;e=u=K}var h=a?K:El(n),p=[n,t,r,e,u,l,s,i,o,f];if(h&&ii(p,h),n=p[0],t=p[1],r=p[2],e=p[3],u=p[4],f=p[9]=null==p[9]?a?0:n.length:Xc(p[9]-c,0),!f&&t&(rn|en)&&(t&=~(rn|en)),t&&t!=X)v=t==rn||t==en?pu(n,t,f):t!=un&&t!=(X|un)||u.length?gu.apply(K,p):mu(n,t,r,e);else var v=cu(n,t,r);var _=h?Il:Cl;return _(v,p)}function Ru(n,t,r,e,u,i){var o=u&sn,f=n.length,a=t.length;if(f!=a&&!(o&&a>f))return!1;var c=i.get(n);if(c)return c==t;var l=-1,s=!0,h=u&ln?new rr:K;for(i.set(n,t);++l<f;){var p=n[l],_=t[l];if(e)var g=o?e(_,p,l,t,n,i):e(p,_,l,n,t,i);if(g!==K){if(g)continue;s=!1;break}if(h){if(!v(t,function(n,t){if(!h.has(t)&&(p===n||r(p,n,e,u,i)))return h.add(t)})){s=!1;break}}else if(p!==_&&!r(p,_,e,u,i)){s=!1;break}}return i.delete(n),s}function Eu(n,t,r,e,u,i,o){switch(r){case Tn:if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)return!1;n=n.buffer,t=t.buffer;case qn:return!(n.byteLength!=t.byteLength||!e(new Mc(n),new Mc(t)));case Rn:case En:return+n==+t;case Sn:return n.name==t.name&&n.message==t.message;case Bn:return n!=+n?t!=+t:n==+t;case Un:case Mn:return n==t+"";case Cn:var f=M;case Fn:var a=i&sn;if(f||(f=P),n.size!=t.size&&!a)return!1;var c=o.get(n);return c?c==t:(i|=ln,o.set(n,t),Ru(f(n),f(t),e,u,i,o));case Dn:if(ml)return ml.call(n)==ml.call(t)}return!1}function Su(n,t,r,e,u,i){var o=u&sn,f=ua(n),a=f.length,c=ua(t),l=c.length;if(a!=l&&!o)return!1;for(var s=a;s--;){var h=f[s];if(!(o?h in t:Jr(t,h)))return!1}var p=i.get(n);if(p)return p==t;var v=!0;i.set(n,t);for(var _=o;++s<a;){h=f[s];var g=n[h],y=t[h];if(e)var d=o?e(y,g,h,t,n,i):e(g,y,h,n,t,i);if(!(d===K?g===y||r(g,y,e,u,i):d)){v=!1;break}_||(_="constructor"==h)}if(v&&!_){var b=n.constructor,w=t.constructor;b!=w&&"constructor"in n&&"constructor"in t&&!("function"==typeof b&&b instanceof b&&"function"==typeof w&&w instanceof w)&&(v=!1)}return i.delete(n),v}function Wu(n){return Kr(n,ua,Du)}function Lu(n){return Kr(n,ia,Wl)}function Cu(n){for(var t=n.name+"",r=vl[t],e=Sc.call(vl,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function Bu(n){var t=Sc.call(Wt,"placeholder")?Wt:n;return t.placeholder}function $u(){var n=Wt.iteratee||Ga;return n=n===Ga?ie:n,arguments.length?n(arguments[0],arguments[1]):n}function zu(n,t){var r=n.__data__;return Xu(t)?r["string"==typeof t?"string":"hash"]:r.map}function Uu(n){for(var t=ua(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,ei(u)]}return t}function Fu(n,t){var r=$(n,t);return ue(r)?r:K}function Mu(n){return Jc(Object(n))}function Du(n){return Pc(Object(n))}function Pu(n){return Cc.call(n)}function Nu(n,t,r){for(var e=-1,u=r.length;++e<u;){var i=r[e],o=i.size;switch(i.type){case"drop":n+=o;break;case"dropRight":t-=o;break;case"take":t=nl(t,n+o);break;case"takeRight":n=Xc(n,t-o)}}return{start:n,end:t}}function qu(n,t,r){t=Qu(t,n)?[t]:Ne(t);for(var e,u=-1,i=t.length;++u<i;){var o=ci(t[u]);if(!(e=null!=n&&r(n,o)))break;n=n[o]}if(e)return e;var i=n?n.length:0;return!!i&&yf(i)&&Yu(o,i)&&(ys(n)||Lf(n)||rf(n))}function Tu(n){var t=n.length,r=n.constructor(t);return t&&"string"==typeof n[0]&&Sc.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function Zu(n){return"function"!=typeof n.constructor||ri(n)?{}:Cr(Mu(n))}function Vu(n,t,r,e){var u=n.constructor;switch(t){case qn:return Ze(n);case Rn:case En:return new u((+n));case Tn:return Ve(n,e);case Zn:case Vn:case Kn:case Gn:case Jn:case Yn:case Hn:case Qn:case Xn:return He(n,e);case Cn:return Ke(n,e,r);case Bn:case Mn:return new u(n);case Un:return Ge(n);case Fn:return Je(n,e,r);case Dn:return Ye(n)}}function Ku(n){var t=n?n.length:K;return yf(t)&&(ys(n)||Lf(n)||rf(n))?j(t,String):null}function Gu(n){return ys(n)||rf(n)}function Ju(n){return ys(n)&&!(2==n.length&&!_f(n[0]))}function Yu(n,t){return t=null==t?wn:t,!!t&&("number"==typeof n||It.test(n))&&n>-1&&n%1==0&&n<t}function Hu(n,t,r){if(!df(r))return!1;var e=typeof t;return!!("number"==e?uf(r)&&Yu(t,r.length):"string"==e&&t in r)&&tf(r[t],n)}function Qu(n,t){if(ys(n))return!1;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!Cf(n))||(st.test(n)||!lt.test(n)||null!=t&&n in Object(t))}function Xu(n){var t=typeof n;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==n:null===n}function ni(n){var t=Cu(n),r=Wt[t];if("function"!=typeof r||!(t in Bt.prototype))return!1;if(n===r)return!0;var e=El(r);return!!e&&n===e[0]}function ti(n){return!!Rc&&Rc in n}function ri(n){var t=n&&n.constructor,r="function"==typeof t&&t.prototype||Oc;return n===r}function ei(n){return n===n&&!df(n)}function ui(n,t){return function(r){return null!=r&&(r[n]===t&&(t!==K||n in Object(r)))}}function ii(n,t){var r=n[1],e=t[1],u=r|e,i=u<(X|nn|fn),o=e==fn&&r==rn||e==fn&&r==an&&n[7].length<=t[8]||e==(fn|an)&&t[7].length<=t[8]&&r==rn;if(!i&&!o)return n;e&X&&(n[2]=t[2],u|=r&X?0:tn);var f=t[3];if(f){var a=n[3];n[3]=a?nu(a,f,t[4]):f,n[4]=a?D(n[3],Q):t[4]}return f=t[5],f&&(a=n[5],n[5]=a?tu(a,f,t[6]):f,n[6]=a?D(n[5],Q):t[6]),f=t[7],f&&(n[7]=f),e&fn&&(n[8]=null==n[8]?t[8]:nl(n[8],t[8])),null==n[9]&&(n[9]=t[9]),n[0]=t[0],n[1]=u,n}function oi(n,t,r,e,u,i){return df(n)&&df(t)&&he(n,t,K,oi,i.set(t,n)),n}function fi(n,t){return 1==t.length?n:Vr(n,ke(t,0,-1))}function ai(n,t){for(var r=n.length,e=nl(t.length,r),u=ru(n);e--;){var i=t[e];n[e]=Yu(i,r)?u[i]:K}return n}function ci(n){if("string"==typeof n||Cf(n))return n;var t=n+"";return"0"==t&&1/n==-bn?"-0":t}function li(n){if(null!=n){try{return Ec.call(n)}catch(n){}try{return n+""}catch(n){}}return""}function si(n){if(n instanceof Bt)return n.clone();var t=new Ct(n.__wrapped__,n.__chain__);return t.__actions__=ru(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function hi(n,t,r){t=(r?Hu(n,t,r):t===K)?1:Xc(Df(t),0);var e=n?n.length:0;if(!e||t<1)return[];for(var u=0,i=0,o=Array(Kc(e/t));u<e;)o[i++]=ke(n,u,u+=t);return o}function pi(n){for(var t=-1,r=n?n.length:0,e=0,u=[];++t<r;){var i=n[t];i&&(u[e++]=i)}return u}function vi(){for(var n=arguments.length,t=Array(n?n-1:0),r=arguments[0],e=n;e--;)t[e-1]=arguments[e];return n?s(ys(r)?ru(r):[r],Nr(t,1)):[]}function _i(n,t,r){var e=n?n.length:0;return e?(t=r||t===K?1:Df(t),ke(n,t<0?0:t,e)):[]}function gi(n,t,r){var e=n?n.length:0;return e?(t=r||t===K?1:Df(t),t=e-t,ke(n,0,t<0?0:t)):[]}function yi(n,t){return n&&n.length?ze(n,$u(t,3),!0,!0):[]}function di(n,t){return n&&n.length?ze(n,$u(t,3),!0):[]}function bi(n,t,r,e){var u=n?n.length:0;return u?(r&&"number"!=typeof r&&Hu(n,t,r)&&(r=0,e=u),Dr(n,t,r,e)):[]}function wi(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=null==r?0:Df(r);return u<0&&(u=Xc(e+u,0)),g(n,$u(t,3),u)}function mi(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=e-1;return r!==K&&(u=Df(r),u=r<0?Xc(e+u,0):nl(u,e-1)),g(n,$u(t,3),u,!0)}function xi(n){var t=n?n.length:0;return t?Nr(n,1):[]}function ji(n){var t=n?n.length:0;return t?Nr(n,bn):[]}function Ai(n,t){var r=n?n.length:0;return r?(t=t===K?1:Df(t),Nr(n,t)):[]}function Oi(n){for(var t=-1,r=n?n.length:0,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e}function ki(n){return n&&n.length?n[0]:K}function Ii(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=null==r?0:Df(r);return u<0&&(u=Xc(e+u,0)),y(n,t,u)}function Ri(n){return gi(n,1)}function Ei(n,t){return n?Hc.call(n,t):""}function Si(n){var t=n?n.length:0;return t?n[t-1]:K}function Wi(n,t,r){var e=n?n.length:0;if(!e)return-1;var u=e;if(r!==K&&(u=Df(r),u=(u<0?Xc(e+u,0):nl(u,e-1))+1),t!==t)return z(n,u-1,!0);for(;u--;)if(n[u]===t)return u;return-1}function Li(n,t){return n&&n.length?ve(n,Df(t)):K}function Ci(n,t){return n&&n.length&&t&&t.length?we(n,t):n}function Bi(n,t,r){return n&&n.length&&t&&t.length?we(n,t,$u(r)):n}function $i(n,t,r){return n&&n.length&&t&&t.length?we(n,t,K,r):n}function zi(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=$u(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),u.push(e))}return me(n,u),r}function Ui(n){return n?ul.call(n):n}function Fi(n,t,r){var e=n?n.length:0;return e?(r&&"number"!=typeof r&&Hu(n,t,r)?(t=0,r=e):(t=null==t?0:Df(t),r=r===K?e:Df(r)),ke(n,t,r)):[]}function Mi(n,t){return Re(n,t)}function Di(n,t,r){return Ee(n,t,$u(r))}function Pi(n,t){var r=n?n.length:0;if(r){var e=Re(n,t);if(e<r&&tf(n[e],t))return e}return-1}function Ni(n,t){return Re(n,t,!0)}function qi(n,t,r){return Ee(n,t,$u(r),!0)}function Ti(n,t){var r=n?n.length:0;if(r){var e=Re(n,t,!0)-1;if(tf(n[e],t))return e}return-1}function Zi(n){return n&&n.length?Se(n):[]}function Vi(n,t){return n&&n.length?Se(n,$u(t)):[]}function Ki(n){return _i(n,1)}function Gi(n,t,r){return n&&n.length?(t=r||t===K?1:Df(t),ke(n,0,t<0?0:t)):[]}function Ji(n,t,r){var e=n?n.length:0;return e?(t=r||t===K?1:Df(t),t=e-t,ke(n,t<0?0:t,e)):[]}function Yi(n,t){return n&&n.length?ze(n,$u(t,3),!1,!0):[]}function Hi(n,t){return n&&n.length?ze(n,$u(t,3)):[]}function Qi(n){return n&&n.length?Ce(n):[]}function Xi(n,t){return n&&n.length?Ce(n,$u(t)):[]}function no(n,t){return n&&n.length?Ce(n,K,t):[]}function to(n){if(!n||!n.length)return[];var t=0;return n=f(n,function(n){if(of(n))return t=Xc(n.length,t),!0}),j(t,function(t){return l(n,de(t))})}function ro(n,t){if(!n||!n.length)return[];var e=to(n);return null==t?e:l(e,function(n){return r(t,K,n)})}function eo(n,t){return Me(n||[],t||[],pr)}function uo(n,t){return Me(n||[],t||[],Oe)}function io(n){var t=Wt(n);return t.__chain__=!0,t}function oo(n,t){return t(n),n}function fo(n,t){return t(n)}function ao(){return io(this)}function co(){return new Ct(this.value(),this.__chain__)}function lo(){this.__values__===K&&(this.__values__=Ff(this.value()));var n=this.__index__>=this.__values__.length,t=n?K:this.__values__[this.__index__++];return{done:n,value:t}}function so(){return this}function ho(n){for(var t,r=this;r instanceof Lt;){var e=si(r);e.__index__=0,e.__values__=K,t?u.__wrapped__=e:t=e;var u=e;r=r.__wrapped__}return u.__wrapped__=n,t}function po(){var n=this.__wrapped__;if(n instanceof Bt){var t=n;return this.__actions__.length&&(t=new Bt(this)),t=t.reverse(),t.__actions__.push({func:fo,args:[Ui],thisArg:K}),new Ct(t,this.__chain__)}return this.thru(Ui)}function vo(){return Ue(this.__wrapped__,this.__actions__)}function _o(n,t,r){var e=ys(n)?o:Fr;return r&&Hu(n,t,r)&&(t=K),e(n,$u(t,3))}function go(n,t){var r=ys(n)?f:Pr;return r(n,$u(t,3))}function yo(n,t){ +return Nr(Ao(n,t),1)}function bo(n,t){return Nr(Ao(n,t),bn)}function wo(n,t,r){return r=r===K?1:Df(r),Nr(Ao(n,t),r)}function mo(n,t){var r=ys(n)?u:jl;return r(n,$u(t,3))}function xo(n,t){var r=ys(n)?i:Al;return r(n,$u(t,3))}function jo(n,t,r,e){n=uf(n)?n:ya(n),r=r&&!e?Df(r):0;var u=n.length;return r<0&&(r=Xc(u+r,0)),Lf(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&y(n,t,r)>-1}function Ao(n,t){var r=ys(n)?l:ce;return r(n,$u(t,3))}function Oo(n,t,r,e){return null==n?[]:(ys(t)||(t=null==t?[]:[t]),r=e?K:r,ys(r)||(r=null==r?[]:[r]),_e(n,t,r))}function ko(n,t,r){var e=ys(n)?h:w,u=arguments.length<3;return e(n,$u(t,4),r,u,jl)}function Io(n,t,r){var e=ys(n)?p:w,u=arguments.length<3;return e(n,$u(t,4),r,u,Al)}function Ro(n,t){var r=ys(n)?f:Pr;return t=$u(t,3),r(n,function(n,r,e){return!t(n,r,e)})}function Eo(n){var t=uf(n)?n:ya(n),r=t.length;return r>0?t[xe(0,r-1)]:K}function So(n,t,r){var e=-1,u=Ff(n),i=u.length,o=i-1;for(t=(r?Hu(n,t,r):t===K)?1:Ir(Df(t),0,i);++e<t;){var f=xe(e,o),a=u[f];u[f]=u[e],u[e]=a}return u.length=t,u}function Wo(n){return So(n,jn)}function Lo(n){if(null==n)return 0;if(uf(n)){var t=n.length;return t&&Lf(n)?q(n):t}if(bf(n)){var r=Pu(n);if(r==Cn||r==Fn)return n.size}return ua(n).length}function Co(n,t,r){var e=ys(n)?v:Ie;return r&&Hu(n,t,r)&&(t=K),e(n,$u(t,3))}function Bo(){return bc.now()}function $o(n,t){if("function"!=typeof t)throw new jc(Y);return n=Df(n),function(){if(--n<1)return t.apply(this,arguments)}}function zo(n,t,r){return t=r?K:t,t=n&&null==t?n.length:t,Iu(n,fn,K,K,K,K,t)}function Uo(n,t){var r;if("function"!=typeof t)throw new jc(Y);return n=Df(n),function(){return--n>0&&(r=t.apply(this,arguments)),n<=1&&(t=K),r}}function Fo(n,t,r){t=r?K:t;var e=Iu(n,rn,K,K,K,K,K,t);return e.placeholder=Fo.placeholder,e}function Mo(n,t,r){t=r?K:t;var e=Iu(n,en,K,K,K,K,K,t);return e.placeholder=Mo.placeholder,e}function Do(n,t,r){function e(t){var r=h,e=p;return h=p=K,d=t,_=n.apply(e,r)}function u(n){return d=n,g=Vc(f,t),b?e(n):_}function i(n){var r=n-y,e=n-d,u=t-r;return w?nl(u,v-e):u}function o(n){var r=n-y,e=n-d;return y===K||r>=t||r<0||w&&e>=v}function f(){var n=Bo();return o(n)?a(n):void(g=Vc(f,i(n)))}function a(n){return g=K,m&&h?e(n):(h=p=K,_)}function c(){d=0,h=y=p=g=K}function l(){return g===K?_:a(Bo())}function s(){var n=Bo(),r=o(n);if(h=arguments,p=this,y=n,r){if(g===K)return u(y);if(w)return g=Vc(f,t),e(y)}return g===K&&(g=Vc(f,t)),_}var h,p,v,_,g,y,d=0,b=!1,w=!1,m=!0;if("function"!=typeof n)throw new jc(Y);return t=Nf(t)||0,df(r)&&(b=!!r.leading,w="maxWait"in r,v=w?Xc(Nf(r.maxWait)||0,t):v,m="trailing"in r?!!r.trailing:m),s.cancel=c,s.flush=l,s}function Po(n){return Iu(n,cn)}function No(n,t){if("function"!=typeof n||t&&"function"!=typeof t)throw new jc(Y);var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o),o};return r.cache=new(No.Cache||Yt),r}function qo(n){if("function"!=typeof n)throw new jc(Y);return function(){return!n.apply(this,arguments)}}function To(n){return Uo(2,n)}function Zo(n,t){if("function"!=typeof n)throw new jc(Y);return t=Xc(t===K?n.length-1:Df(t),0),function(){for(var e=arguments,u=-1,i=Xc(e.length-t,0),o=Array(i);++u<i;)o[u]=e[t+u];switch(t){case 0:return n.call(this,o);case 1:return n.call(this,e[0],o);case 2:return n.call(this,e[0],e[1],o)}var f=Array(t+1);for(u=-1;++u<t;)f[u]=e[u];return f[t]=o,r(n,this,f)}}function Vo(n,t){if("function"!=typeof n)throw new jc(Y);return t=t===K?0:Xc(Df(t),0),Zo(function(e){var u=e[t],i=qe(e,0,t);return u&&s(i,u),r(n,this,i)})}function Ko(n,t,r){var e=!0,u=!0;if("function"!=typeof n)throw new jc(Y);return df(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Do(n,t,{leading:e,maxWait:t,trailing:u})}function Go(n){return zo(n,1)}function Jo(n,t){return t=null==t?Ka:t,hs(t,n)}function Yo(){if(!arguments.length)return[];var n=arguments[0];return ys(n)?n:[n]}function Ho(n){return Sr(n,!1,!0)}function Qo(n,t){return Sr(n,!1,!0,t)}function Xo(n){return Sr(n,!0,!0)}function nf(n,t){return Sr(n,!0,!0,t)}function tf(n,t){return n===t||n!==n&&t!==t}function rf(n){return of(n)&&Sc.call(n,"callee")&&(!Tc.call(n,"callee")||Cc.call(n)==kn)}function ef(n){return bf(n)&&Cc.call(n)==qn}function uf(n){return null!=n&&yf(Sl(n))&&!_f(n)}function of(n){return bf(n)&&uf(n)}function ff(n){return n===!0||n===!1||bf(n)&&Cc.call(n)==Rn}function af(n){return bf(n)&&Cc.call(n)==En}function cf(n){return!!n&&1===n.nodeType&&bf(n)&&!Rf(n)}function lf(n){if(uf(n)&&(ys(n)||Lf(n)||_f(n.splice)||rf(n)||ds(n)))return!n.length;if(bf(n)){var t=Pu(n);if(t==Cn||t==Fn)return!n.size}for(var r in n)if(Sc.call(n,r))return!1;return!(pl&&ua(n).length)}function sf(n,t){return te(n,t)}function hf(n,t,r){r="function"==typeof r?r:K;var e=r?r(n,t):K;return e===K?te(n,t,r):!!e}function pf(n){return!!bf(n)&&(Cc.call(n)==Sn||"string"==typeof n.message&&"string"==typeof n.name)}function vf(n){return"number"==typeof n&&Yc(n)}function _f(n){var t=df(n)?Cc.call(n):"";return t==Wn||t==Ln}function gf(n){return"number"==typeof n&&n==Df(n)}function yf(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=wn}function df(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function bf(n){return!!n&&"object"==typeof n}function wf(n){return bf(n)&&Pu(n)==Cn}function mf(n,t){return n===t||ee(n,t,Uu(t))}function xf(n,t,r){return r="function"==typeof r?r:K,ee(n,t,Uu(t),r)}function jf(n){return If(n)&&n!=+n}function Af(n){if(Ll(n))throw new wc("This method is not supported with `core-js`. Try https://github.com/es-shims.");return ue(n)}function Of(n){return null===n}function kf(n){return null==n}function If(n){return"number"==typeof n||bf(n)&&Cc.call(n)==Bn}function Rf(n){if(!bf(n)||Cc.call(n)!=$n||U(n))return!1;var t=Mu(n);if(null===t)return!0;var r=Sc.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&Ec.call(r)==Lc}function Ef(n){return df(n)&&Cc.call(n)==Un}function Sf(n){return gf(n)&&n>=-wn&&n<=wn}function Wf(n){return bf(n)&&Pu(n)==Fn}function Lf(n){return"string"==typeof n||!ys(n)&&bf(n)&&Cc.call(n)==Mn}function Cf(n){return"symbol"==typeof n||bf(n)&&Cc.call(n)==Dn}function Bf(n){return bf(n)&&yf(n.length)&&!!xr[Cc.call(n)]}function $f(n){return n===K}function zf(n){return bf(n)&&Pu(n)==Pn}function Uf(n){return bf(n)&&Cc.call(n)==Nn}function Ff(n){if(!n)return[];if(uf(n))return Lf(n)?T(n):ru(n);if(Nc&&n[Nc])return F(n[Nc]());var t=Pu(n),r=t==Cn?M:t==Fn?P:ya;return r(n)}function Mf(n){if(!n)return 0===n?n:0;if(n=Nf(n),n===bn||n===-bn){var t=n<0?-1:1;return t*mn}return n===n?n:0}function Df(n){var t=Mf(n),r=t%1;return t===t?r?t-r:t:0}function Pf(n){return n?Ir(Df(n),0,jn):0}function Nf(n){if("number"==typeof n)return n;if(Cf(n))return xn;if(df(n)){var t=_f(n.valueOf)?n.valueOf():n;n=df(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(_t,"");var r=At.test(n);return r||kt.test(n)?Er(n.slice(2),r?2:8):jt.test(n)?xn:+n}function qf(n){return eu(n,ia(n))}function Tf(n){return Ir(Df(n),-wn,wn)}function Zf(n){return null==n?"":Le(n)}function Vf(n,t){var r=Cr(n);return t?Or(r,t):r}function Kf(n,t){return _(n,$u(t,3),qr)}function Gf(n,t){return _(n,$u(t,3),Tr)}function Jf(n,t){return null==n?n:Ol(n,$u(t,3),ia)}function Yf(n,t){return null==n?n:kl(n,$u(t,3),ia)}function Hf(n,t){return n&&qr(n,$u(t,3))}function Qf(n,t){return n&&Tr(n,$u(t,3))}function Xf(n){return null==n?[]:Zr(n,ua(n))}function na(n){return null==n?[]:Zr(n,ia(n))}function ta(n,t,r){var e=null==n?K:Vr(n,t);return e===K?r:e}function ra(n,t){return null!=n&&qu(n,t,Jr)}function ea(n,t){return null!=n&&qu(n,t,Yr)}function ua(n){var t=ri(n);if(!t&&!uf(n))return oe(n);var r=Ku(n),e=!!r,u=r||[],i=u.length;for(var o in n)!Jr(n,o)||e&&("length"==o||Yu(o,i))||t&&"constructor"==o||u.push(o);return u}function ia(n){for(var t=-1,r=ri(n),e=fe(n),u=e.length,i=Ku(n),o=!!i,f=i||[],a=f.length;++t<u;){var c=e[t];o&&("length"==c||Yu(c,a))||"constructor"==c&&(r||!Sc.call(n,c))||f.push(c)}return f}function oa(n,t){var r={};return t=$u(t,3),qr(n,function(n,e,u){r[t(n,e,u)]=n}),r}function fa(n,t){var r={};return t=$u(t,3),qr(n,function(n,e,u){r[e]=t(n,e,u)}),r}function aa(n,t){return t=$u(t),ye(n,function(n,r){return!t(n,r)})}function ca(n,t){return null==n?{}:ye(n,$u(t))}function la(n,t,r){t=Qu(t,n)?[t]:Ne(t);var e=-1,u=t.length;for(u||(n=K,u=1);++e<u;){var i=null==n?K:n[ci(t[e])];i===K&&(e=u,i=r),n=_f(i)?i.call(n):i}return n}function sa(n,t,r){return null==n?n:Oe(n,t,r)}function ha(n,t,r,e){return e="function"==typeof e?e:K,null==n?n:Oe(n,t,r,e)}function pa(n,t,r){var e=ys(n)||Bf(n);if(t=$u(t,4),null==r)if(e||df(n)){var i=n.constructor;r=e?ys(n)?new i:[]:_f(i)?Cr(Mu(n)):{}}else r={};return(e?u:qr)(n,function(n,e,u){return t(r,n,e,u)}),r}function va(n,t){return null==n||Be(n,t)}function _a(n,t,r){return null==n?n:$e(n,t,Pe(r))}function ga(n,t,r,e){return e="function"==typeof e?e:K,null==n?n:$e(n,t,Pe(r),e)}function ya(n){return n?k(n,ua(n)):[]}function da(n){return null==n?[]:k(n,ia(n))}function ba(n,t,r){return r===K&&(r=t,t=K),r!==K&&(r=Nf(r),r=r===r?r:0),t!==K&&(t=Nf(t),t=t===t?t:0),Ir(Nf(n),t,r)}function wa(n,t,r){return t=Nf(t)||0,r===K?(r=t,t=0):r=Nf(r)||0,n=Nf(n),Hr(n,t,r)}function ma(n,t,r){if(r&&"boolean"!=typeof r&&Hu(n,t,r)&&(t=r=K),r===K&&("boolean"==typeof t?(r=t,t=K):"boolean"==typeof n&&(r=n,n=K)),n===K&&t===K?(n=0,t=1):(n=Nf(n)||0,t===K?(t=n,n=0):t=Nf(t)||0),n>t){var e=n;n=t,t=e}if(r||n%1||t%1){var u=rl();return nl(n+u*(t-n+Rr("1e-"+((u+"").length-1))),t)}return xe(n,t)}function xa(n){return Ts(Zf(n).toLowerCase())}function ja(n){return n=Zf(n),n&&n.replace(Rt,L).replace(_r,"")}function Aa(n,t,r){n=Zf(n),t=Le(t);var e=n.length;return r=r===K?e:Ir(Df(r),0,e),r-=t.length,r>=0&&n.indexOf(t,r)==r}function Oa(n){return n=Zf(n),n&&ot.test(n)?n.replace(ut,C):n}function ka(n){return n=Zf(n),n&&vt.test(n)?n.replace(pt,"\\$&"):n}function Ia(n,t,r){n=Zf(n),t=Df(t);var e=t?q(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return wu(Gc(u),r)+n+wu(Kc(u),r)}function Ra(n,t,r){n=Zf(n),t=Df(t);var e=t?q(n):0;return t&&e<t?n+wu(t-e,r):n}function Ea(n,t,r){n=Zf(n),t=Df(t);var e=t?q(n):0;return t&&e<t?wu(t-e,r)+n:n}function Sa(n,t,r){return r||null==t?t=0:t&&(t=+t),n=Zf(n).replace(_t,""),tl(n,t||(xt.test(n)?16:10))}function Wa(n,t,r){return t=(r?Hu(n,t,r):t===K)?1:Df(t),Ae(Zf(n),t)}function La(){var n=arguments,t=Zf(n[0]);return n.length<3?t:el.call(t,n[1],n[2])}function Ca(n,t,r){return r&&"number"!=typeof r&&Hu(n,t,r)&&(t=r=K),(r=r===K?jn:r>>>0)?(n=Zf(n),n&&("string"==typeof t||null!=t&&!Ef(t))&&(t=Le(t),""==t&&dr.test(n))?qe(T(n),0,r):il.call(n,t,r)):[]}function Ba(n,t,r){return n=Zf(n),r=Ir(Df(r),0,n.length),n.lastIndexOf(Le(t),r)==r}function $a(n,t,r){var e=Wt.templateSettings;r&&Hu(n,t,r)&&(t=K),n=Zf(n),t=js({},t,e,sr);var u,i,o=js({},t.imports,e.imports,sr),f=ua(o),a=k(o,f),c=0,l=t.interpolate||Et,s="__p += '",h=xc((t.escape||Et).source+"|"+l.source+"|"+(l===ct?wt:Et).source+"|"+(t.evaluate||Et).source+"|$","g"),p="//# sourceURL="+("sourceURL"in t?t.sourceURL:"lodash.templateSources["+ ++mr+"]")+"\n";n.replace(h,function(t,r,e,o,f,a){return e||(e=o),s+=n.slice(c,a).replace(St,B),r&&(u=!0,s+="' +\n__e("+r+") +\n'"),f&&(i=!0,s+="';\n"+f+";\n__p += '"),e&&(s+="' +\n((__t = ("+e+")) == null ? '' : __t) +\n'"),c=a+t.length,t}),s+="';\n";var v=t.variable;v||(s="with (obj) {\n"+s+"\n}\n"),s=(i?s.replace(nt,""):s).replace(tt,"$1").replace(rt,"$1;"),s="function("+(v||"obj")+") {\n"+(v?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(u?", __e = _.escape":"")+(i?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+s+"return __p\n}";var _=Zs(function(){return Function(f,p+"return "+s).apply(K,a)});if(_.source=s,pf(_))throw _;return _}function za(n){return Zf(n).toLowerCase()}function Ua(n){return Zf(n).toUpperCase()}function Fa(n,t,r){if(n=Zf(n),n&&(r||t===K))return n.replace(_t,"");if(!n||!(t=Le(t)))return n;var e=T(n),u=T(t),i=R(e,u),o=E(e,u)+1;return qe(e,i,o).join("")}function Ma(n,t,r){if(n=Zf(n),n&&(r||t===K))return n.replace(yt,"");if(!n||!(t=Le(t)))return n;var e=T(n),u=E(e,T(t))+1;return qe(e,0,u).join("")}function Da(n,t,r){if(n=Zf(n),n&&(r||t===K))return n.replace(gt,"");if(!n||!(t=Le(t)))return n;var e=T(n),u=R(e,T(t));return qe(e,u).join("")}function Pa(n,t){var r=hn,e=pn;if(df(t)){var u="separator"in t?t.separator:u;r="length"in t?Df(t.length):r,e="omission"in t?Le(t.omission):e}n=Zf(n);var i=n.length;if(dr.test(n)){var o=T(n);i=o.length}if(r>=i)return n;var f=r-q(e);if(f<1)return e;var a=o?qe(o,0,f).join(""):n.slice(0,f);if(u===K)return a+e;if(o&&(f+=a.length-f),Ef(u)){if(n.slice(f).search(u)){var c,l=a;for(u.global||(u=xc(u.source,Zf(mt.exec(u))+"g")),u.lastIndex=0;c=u.exec(l);)var s=c.index;a=a.slice(0,s===K?f:s)}}else if(n.indexOf(Le(u),f)!=f){var h=a.lastIndexOf(u);h>-1&&(a=a.slice(0,h))}return a+e}function Na(n){return n=Zf(n),n&&it.test(n)?n.replace(et,Z):n}function qa(n,t,r){return n=Zf(n),t=r?K:t,t===K&&(t=br.test(n)?yr:dt),n.match(t)||[]}function Ta(n){var t=n?n.length:0,e=$u();return n=t?l(n,function(n){if("function"!=typeof n[1])throw new jc(Y);return[e(n[0]),n[1]]}):[],Zo(function(e){for(var u=-1;++u<t;){var i=n[u];if(r(i[0],this,e))return r(i[1],this,e)}})}function Za(n){return Wr(Sr(n,!0))}function Va(n){return function(){return n}}function Ka(n){return n}function Ga(n){return ie("function"==typeof n?n:Sr(n,!0))}function Ja(n){return le(Sr(n,!0))}function Ya(n,t){return se(n,Sr(t,!0))}function Ha(n,t,r){var e=ua(t),i=Zr(t,e);null!=r||df(t)&&(i.length||!e.length)||(r=t,t=n,n=this,i=Zr(t,ua(t)));var o=!(df(r)&&"chain"in r&&!r.chain),f=_f(n);return u(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__),u=r.__actions__=ru(this.__actions__);return u.push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,s([this.value()],arguments))})}),n}function Qa(){return zr._===this&&(zr._=Bc),this}function Xa(){}function nc(n){return n=Df(n),Zo(function(t){return ve(t,n)})}function tc(n){return Qu(n)?de(ci(n)):be(n)}function rc(n){return function(t){return null==n?K:Vr(n,t)}}function ec(){return[]}function uc(){return!1}function ic(){return{}}function oc(){return""}function fc(){return!0}function ac(n,t){if(n=Df(n),n<1||n>wn)return[];var r=jn,e=nl(n,jn);t=$u(t),n-=jn;for(var u=j(e,t);++r<n;)t(r);return u}function cc(n){return ys(n)?l(n,ci):Cf(n)?[n]:ru(Bl(n))}function lc(n){var t=++Wc;return Zf(n)+t}function sc(n){return n&&n.length?Mr(n,Ka,Gr):K}function hc(n,t){return n&&n.length?Mr(n,$u(t),Gr):K}function pc(n){return b(n,Ka)}function vc(n,t){return b(n,$u(t))}function _c(n){return n&&n.length?Mr(n,Ka,ae):K}function gc(n,t){return n&&n.length?Mr(n,$u(t),ae):K}function yc(n){return n&&n.length?x(n,Ka):0}function dc(n,t){return n&&n.length?x(n,$u(t)):0}S=S?Ur.defaults({},S,Ur.pick(zr,wr)):zr;var bc=S.Date,wc=S.Error,mc=S.Math,xc=S.RegExp,jc=S.TypeError,Ac=S.Array.prototype,Oc=S.Object.prototype,kc=S.String.prototype,Ic=S["__core-js_shared__"],Rc=function(){var n=/[^.]+$/.exec(Ic&&Ic.keys&&Ic.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),Ec=S.Function.prototype.toString,Sc=Oc.hasOwnProperty,Wc=0,Lc=Ec.call(Object),Cc=Oc.toString,Bc=zr._,$c=xc("^"+Ec.call(Sc).replace(pt,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),zc=Lr?S.Buffer:K,Uc=S.Reflect,Fc=S.Symbol,Mc=S.Uint8Array,Dc=Uc?Uc.enumerate:K,Pc=Object.getOwnPropertySymbols,Nc="symbol"==typeof(Nc=Fc&&Fc.iterator)?Nc:K,qc=Object.create,Tc=Oc.propertyIsEnumerable,Zc=Ac.splice,Vc=function(n,t){return S.setTimeout.call(zr,n,t)},Kc=mc.ceil,Gc=mc.floor,Jc=Object.getPrototypeOf,Yc=S.isFinite,Hc=Ac.join,Qc=Object.keys,Xc=mc.max,nl=mc.min,tl=S.parseInt,rl=mc.random,el=kc.replace,ul=Ac.reverse,il=kc.split,ol=Fu(S,"DataView"),fl=Fu(S,"Map"),al=Fu(S,"Promise"),cl=Fu(S,"Set"),ll=Fu(S,"WeakMap"),sl=Fu(Object,"create"),hl=ll&&new ll,pl=!Tc.call({valueOf:1},"valueOf"),vl={},_l=li(ol),gl=li(fl),yl=li(al),dl=li(cl),bl=li(ll),wl=Fc?Fc.prototype:K,ml=wl?wl.valueOf:K,xl=wl?wl.toString:K;Wt.templateSettings={escape:ft,evaluate:at,interpolate:ct,variable:"",imports:{_:Wt}},Wt.prototype=Lt.prototype,Wt.prototype.constructor=Wt,Ct.prototype=Cr(Lt.prototype),Ct.prototype.constructor=Ct,Bt.prototype=Cr(Lt.prototype),Bt.prototype.constructor=Bt,Ft.prototype.clear=Mt,Ft.prototype.delete=Dt,Ft.prototype.get=Pt,Ft.prototype.has=Nt,Ft.prototype.set=qt,Tt.prototype.clear=Zt,Tt.prototype.delete=Vt,Tt.prototype.get=Kt,Tt.prototype.has=Gt,Tt.prototype.set=Jt,Yt.prototype.clear=Ht,Yt.prototype.delete=Qt,Yt.prototype.get=Xt,Yt.prototype.has=nr,Yt.prototype.set=tr,rr.prototype.add=rr.prototype.push=er,rr.prototype.has=ur,ir.prototype.clear=or,ir.prototype.delete=fr,ir.prototype.get=ar,ir.prototype.has=cr,ir.prototype.set=lr;var jl=fu(qr),Al=fu(Tr,!0),Ol=au(),kl=au(!0);Dc&&!Tc.call({valueOf:1},"valueOf")&&(fe=function(n){return F(Dc(n))});var Il=hl?function(n,t){return hl.set(n,t),n}:Ka,Rl=cl&&1/P(new cl([,-0]))[1]==bn?function(n){return new cl(n)}:Xa,El=hl?function(n){return hl.get(n)}:Xa,Sl=de("length");Pc||(Du=ec);var Wl=Pc?function(n){for(var t=[];n;)s(t,Du(n)),n=Mu(n);return t}:Du;(ol&&Pu(new ol(new ArrayBuffer(1)))!=Tn||fl&&Pu(new fl)!=Cn||al&&Pu(al.resolve())!=zn||cl&&Pu(new cl)!=Fn||ll&&Pu(new ll)!=Pn)&&(Pu=function(n){var t=Cc.call(n),r=t==$n?n.constructor:K,e=r?li(r):K;if(e)switch(e){case _l:return Tn;case gl:return Cn;case yl:return zn;case dl:return Fn;case bl:return Pn}return t});var Ll=Ic?_f:uc,Cl=function(){var n=0,t=0;return function(r,e){var u=Bo(),i=_n-(u-t);if(t=u,i>0){if(++n>=vn)return r}else n=0;return Il(r,e)}}(),Bl=No(function(n){var t=[];return Zf(n).replace(ht,function(n,r,e,u){t.push(e?u.replace(bt,"$1"):r||n)}),t}),$l=Zo(function(n,t){return of(n)?$r(n,Nr(t,1,of,!0)):[]}),zl=Zo(function(n,t){var r=Si(t);return of(r)&&(r=K),of(n)?$r(n,Nr(t,1,of,!0),$u(r)):[]}),Ul=Zo(function(n,t){var r=Si(t);return of(r)&&(r=K),of(n)?$r(n,Nr(t,1,of,!0),K,r):[]}),Fl=Zo(function(n){var t=l(n,De);return t.length&&t[0]===n[0]?Qr(t):[]}),Ml=Zo(function(n){var t=Si(n),r=l(n,De);return t===Si(r)?t=K:r.pop(),r.length&&r[0]===n[0]?Qr(r,$u(t)):[]}),Dl=Zo(function(n){var t=Si(n),r=l(n,De);return t===Si(r)?t=K:r.pop(),r.length&&r[0]===n[0]?Qr(r,K,t):[]}),Pl=Zo(Ci),Nl=Zo(function(n,t){t=Nr(t,1);var r=n?n.length:0,e=kr(n,t);return me(n,l(t,function(n){return Yu(n,r)?+n:n}).sort(Qe)),e}),ql=Zo(function(n){return Ce(Nr(n,1,of,!0))}),Tl=Zo(function(n){var t=Si(n);return of(t)&&(t=K),Ce(Nr(n,1,of,!0),$u(t))}),Zl=Zo(function(n){var t=Si(n);return of(t)&&(t=K),Ce(Nr(n,1,of,!0),K,t)}),Vl=Zo(function(n,t){return of(n)?$r(n,t):[]}),Kl=Zo(function(n){return Fe(f(n,of))}),Gl=Zo(function(n){var t=Si(n);return of(t)&&(t=K),Fe(f(n,of),$u(t))}),Jl=Zo(function(n){var t=Si(n);return of(t)&&(t=K),Fe(f(n,of),K,t)}),Yl=Zo(to),Hl=Zo(function(n){var t=n.length,r=t>1?n[t-1]:K;return r="function"==typeof r?(n.pop(),r):K,ro(n,r)}),Ql=Zo(function(n){n=Nr(n,1);var t=n.length,r=t?n[0]:0,e=this.__wrapped__,u=function(t){return kr(t,n)};return!(t>1||this.__actions__.length)&&e instanceof Bt&&Yu(r)?(e=e.slice(r,+r+(t?1:0)),e.__actions__.push({func:fo,args:[u],thisArg:K}),new Ct(e,this.__chain__).thru(function(n){return t&&!n.length&&n.push(K),n})):this.thru(u)}),Xl=iu(function(n,t,r){Sc.call(n,r)?++n[r]:n[r]=1}),ns=vu(wi),ts=vu(mi),rs=iu(function(n,t,r){Sc.call(n,r)?n[r].push(t):n[r]=[t]}),es=Zo(function(n,t,e){var u=-1,i="function"==typeof t,o=Qu(t),f=uf(n)?Array(n.length):[];return jl(n,function(n){var a=i?t:o&&null!=n?n[t]:K;f[++u]=a?r(a,n,e):ne(n,t,e)}),f}),us=iu(function(n,t,r){n[r]=t}),is=iu(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),os=Zo(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Hu(n,t[0],t[1])?t=[]:r>2&&Hu(t[0],t[1],t[2])&&(t=[t[0]]),t=1==t.length&&ys(t[0])?t[0]:Nr(t,1,Ju),_e(n,t,[])}),fs=Zo(function(n,t,r){var e=X;if(r.length){var u=D(r,Bu(fs));e|=un}return Iu(n,e,t,r,u)}),as=Zo(function(n,t,r){var e=X|nn;if(r.length){var u=D(r,Bu(as));e|=un}return Iu(t,e,n,r,u)}),cs=Zo(function(n,t){return Br(n,1,t)}),ls=Zo(function(n,t,r){return Br(n,Nf(t)||0,r)});No.Cache=Yt;var ss=Zo(function(n,t){t=1==t.length&&ys(t[0])?l(t[0],O($u())):l(Nr(t,1,Ju),O($u()));var e=t.length;return Zo(function(u){for(var i=-1,o=nl(u.length,e);++i<o;)u[i]=t[i].call(this,u[i]);return r(n,this,u)})}),hs=Zo(function(n,t){var r=D(t,Bu(hs));return Iu(n,un,K,t,r)}),ps=Zo(function(n,t){var r=D(t,Bu(ps));return Iu(n,on,K,t,r)}),vs=Zo(function(n,t){return Iu(n,an,K,K,K,Nr(t,1))}),_s=ju(Gr),gs=ju(function(n,t){return n>=t}),ys=Array.isArray,ds=zc?function(n){return n instanceof zc}:uc,bs=ju(ae),ws=ju(function(n,t){return n<=t}),ms=ou(function(n,t){if(pl||ri(t)||uf(t))return void eu(t,ua(t),n);for(var r in t)Sc.call(t,r)&&pr(n,r,t[r])}),xs=ou(function(n,t){if(pl||ri(t)||uf(t))return void eu(t,ia(t),n);for(var r in t)pr(n,r,t[r])}),js=ou(function(n,t,r,e){eu(t,ia(t),n,e)}),As=ou(function(n,t,r,e){eu(t,ua(t),n,e)}),Os=Zo(function(n,t){return kr(n,Nr(t,1))}),ks=Zo(function(n){return n.push(K,sr),r(js,K,n)}),Is=Zo(function(n){return n.push(K,oi),r(Ls,K,n)}),Rs=yu(function(n,t,r){n[t]=r},Va(Ka)),Es=yu(function(n,t,r){Sc.call(n,t)?n[t].push(r):n[t]=[r]},$u),Ss=Zo(ne),Ws=ou(function(n,t,r){he(n,t,r)}),Ls=ou(function(n,t,r,e){he(n,t,r,e)}),Cs=Zo(function(n,t){return null==n?{}:(t=l(Nr(t,1),ci),ge(n,$r(Lu(n),t)))}),Bs=Zo(function(n,t){return null==n?{}:ge(n,l(Nr(t,1),ci))}),$s=ku(ua),zs=ku(ia),Us=su(function(n,t,r){return t=t.toLowerCase(),n+(r?xa(t):t)}),Fs=su(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Ms=su(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),Ds=lu("toLowerCase"),Ps=su(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),Ns=su(function(n,t,r){return n+(r?" ":"")+Ts(t)}),qs=su(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),Ts=lu("toUpperCase"),Zs=Zo(function(n,t){try{return r(n,K,t)}catch(n){return pf(n)?n:new wc(n)}}),Vs=Zo(function(n,t){return u(Nr(t,1),function(t){t=ci(t),n[t]=fs(n[t],n)}),n}),Ks=_u(),Gs=_u(!0),Js=Zo(function(n,t){return function(r){return ne(r,n,t)}}),Ys=Zo(function(n,t){return function(r){return ne(n,r,t)}}),Hs=bu(l),Qs=bu(o),Xs=bu(v),nh=xu(),th=xu(!0),rh=du(function(n,t){return n+t}),eh=Ou("ceil"),uh=du(function(n,t){return n/t}),ih=Ou("floor"),oh=du(function(n,t){return n*t}),fh=Ou("round"),ah=du(function(n,t){return n-t});return Wt.after=$o,Wt.ary=zo,Wt.assign=ms,Wt.assignIn=xs,Wt.assignInWith=js,Wt.assignWith=As,Wt.at=Os,Wt.before=Uo,Wt.bind=fs,Wt.bindAll=Vs,Wt.bindKey=as,Wt.castArray=Yo,Wt.chain=io,Wt.chunk=hi,Wt.compact=pi,Wt.concat=vi,Wt.cond=Ta,Wt.conforms=Za,Wt.constant=Va,Wt.countBy=Xl,Wt.create=Vf,Wt.curry=Fo,Wt.curryRight=Mo,Wt.debounce=Do,Wt.defaults=ks,Wt.defaultsDeep=Is,Wt.defer=cs,Wt.delay=ls,Wt.difference=$l,Wt.differenceBy=zl,Wt.differenceWith=Ul,Wt.drop=_i,Wt.dropRight=gi,Wt.dropRightWhile=yi,Wt.dropWhile=di,Wt.fill=bi,Wt.filter=go,Wt.flatMap=yo,Wt.flatMapDeep=bo,Wt.flatMapDepth=wo,Wt.flatten=xi,Wt.flattenDeep=ji,Wt.flattenDepth=Ai,Wt.flip=Po,Wt.flow=Ks,Wt.flowRight=Gs,Wt.fromPairs=Oi,Wt.functions=Xf,Wt.functionsIn=na,Wt.groupBy=rs,Wt.initial=Ri,Wt.intersection=Fl,Wt.intersectionBy=Ml,Wt.intersectionWith=Dl,Wt.invert=Rs,Wt.invertBy=Es,Wt.invokeMap=es,Wt.iteratee=Ga,Wt.keyBy=us,Wt.keys=ua,Wt.keysIn=ia,Wt.map=Ao,Wt.mapKeys=oa,Wt.mapValues=fa,Wt.matches=Ja,Wt.matchesProperty=Ya,Wt.memoize=No,Wt.merge=Ws,Wt.mergeWith=Ls,Wt.method=Js,Wt.methodOf=Ys,Wt.mixin=Ha,Wt.negate=qo,Wt.nthArg=nc,Wt.omit=Cs,Wt.omitBy=aa,Wt.once=To,Wt.orderBy=Oo,Wt.over=Hs,Wt.overArgs=ss,Wt.overEvery=Qs,Wt.overSome=Xs,Wt.partial=hs,Wt.partialRight=ps,Wt.partition=is,Wt.pick=Bs,Wt.pickBy=ca,Wt.property=tc,Wt.propertyOf=rc,Wt.pull=Pl,Wt.pullAll=Ci,Wt.pullAllBy=Bi,Wt.pullAllWith=$i,Wt.pullAt=Nl,Wt.range=nh,Wt.rangeRight=th,Wt.rearg=vs,Wt.reject=Ro,Wt.remove=zi,Wt.rest=Zo,Wt.reverse=Ui,Wt.sampleSize=So,Wt.set=sa,Wt.setWith=ha,Wt.shuffle=Wo,Wt.slice=Fi,Wt.sortBy=os,Wt.sortedUniq=Zi,Wt.sortedUniqBy=Vi,Wt.split=Ca,Wt.spread=Vo,Wt.tail=Ki,Wt.take=Gi,Wt.takeRight=Ji,Wt.takeRightWhile=Yi,Wt.takeWhile=Hi,Wt.tap=oo,Wt.throttle=Ko,Wt.thru=fo,Wt.toArray=Ff,Wt.toPairs=$s,Wt.toPairsIn=zs,Wt.toPath=cc,Wt.toPlainObject=qf,Wt.transform=pa,Wt.unary=Go,Wt.union=ql,Wt.unionBy=Tl,Wt.unionWith=Zl,Wt.uniq=Qi,Wt.uniqBy=Xi,Wt.uniqWith=no,Wt.unset=va,Wt.unzip=to,Wt.unzipWith=ro,Wt.update=_a,Wt.updateWith=ga,Wt.values=ya,Wt.valuesIn=da,Wt.without=Vl,Wt.words=qa,Wt.wrap=Jo,Wt.xor=Kl,Wt.xorBy=Gl,Wt.xorWith=Jl,Wt.zip=Yl,Wt.zipObject=eo,Wt.zipObjectDeep=uo,Wt.zipWith=Hl,Wt.entries=$s,Wt.entriesIn=zs,Wt.extend=xs,Wt.extendWith=js,Ha(Wt,Wt),Wt.add=rh,Wt.attempt=Zs,Wt.camelCase=Us,Wt.capitalize=xa,Wt.ceil=eh,Wt.clamp=ba,Wt.clone=Ho,Wt.cloneDeep=Xo,Wt.cloneDeepWith=nf,Wt.cloneWith=Qo,Wt.deburr=ja,Wt.divide=uh,Wt.endsWith=Aa,Wt.eq=tf,Wt.escape=Oa,Wt.escapeRegExp=ka,Wt.every=_o,Wt.find=ns,Wt.findIndex=wi,Wt.findKey=Kf,Wt.findLast=ts,Wt.findLastIndex=mi,Wt.findLastKey=Gf,Wt.floor=ih,Wt.forEach=mo,Wt.forEachRight=xo,Wt.forIn=Jf,Wt.forInRight=Yf,Wt.forOwn=Hf,Wt.forOwnRight=Qf,Wt.get=ta,Wt.gt=_s,Wt.gte=gs,Wt.has=ra,Wt.hasIn=ea,Wt.head=ki,Wt.identity=Ka,Wt.includes=jo,Wt.indexOf=Ii,Wt.inRange=wa,Wt.invoke=Ss,Wt.isArguments=rf,Wt.isArray=ys,Wt.isArrayBuffer=ef,Wt.isArrayLike=uf,Wt.isArrayLikeObject=of,Wt.isBoolean=ff,Wt.isBuffer=ds,Wt.isDate=af,Wt.isElement=cf,Wt.isEmpty=lf,Wt.isEqual=sf,Wt.isEqualWith=hf,Wt.isError=pf,Wt.isFinite=vf,Wt.isFunction=_f,Wt.isInteger=gf,Wt.isLength=yf,Wt.isMap=wf,Wt.isMatch=mf,Wt.isMatchWith=xf,Wt.isNaN=jf,Wt.isNative=Af,Wt.isNil=kf,Wt.isNull=Of,Wt.isNumber=If,Wt.isObject=df,Wt.isObjectLike=bf,Wt.isPlainObject=Rf,Wt.isRegExp=Ef,Wt.isSafeInteger=Sf,Wt.isSet=Wf,Wt.isString=Lf,Wt.isSymbol=Cf,Wt.isTypedArray=Bf,Wt.isUndefined=$f,Wt.isWeakMap=zf,Wt.isWeakSet=Uf,Wt.join=Ei,Wt.kebabCase=Fs,Wt.last=Si,Wt.lastIndexOf=Wi,Wt.lowerCase=Ms,Wt.lowerFirst=Ds,Wt.lt=bs,Wt.lte=ws,Wt.max=sc,Wt.maxBy=hc,Wt.mean=pc,Wt.meanBy=vc,Wt.min=_c,Wt.minBy=gc,Wt.stubArray=ec,Wt.stubFalse=uc,Wt.stubObject=ic,Wt.stubString=oc,Wt.stubTrue=fc,Wt.multiply=oh,Wt.nth=Li,Wt.noConflict=Qa,Wt.noop=Xa,Wt.now=Bo,Wt.pad=Ia,Wt.padEnd=Ra,Wt.padStart=Ea,Wt.parseInt=Sa,Wt.random=ma,Wt.reduce=ko,Wt.reduceRight=Io,Wt.repeat=Wa,Wt.replace=La,Wt.result=la,Wt.round=fh,Wt.runInContext=V,Wt.sample=Eo,Wt.size=Lo,Wt.snakeCase=Ps,Wt.some=Co,Wt.sortedIndex=Mi,Wt.sortedIndexBy=Di,Wt.sortedIndexOf=Pi,Wt.sortedLastIndex=Ni,Wt.sortedLastIndexBy=qi,Wt.sortedLastIndexOf=Ti,Wt.startCase=Ns,Wt.startsWith=Ba,Wt.subtract=ah,Wt.sum=yc,Wt.sumBy=dc,Wt.template=$a,Wt.times=ac,Wt.toFinite=Mf,Wt.toInteger=Df,Wt.toLength=Pf,Wt.toLower=za,Wt.toNumber=Nf,Wt.toSafeInteger=Tf,Wt.toString=Zf,Wt.toUpper=Ua,Wt.trim=Fa,Wt.trimEnd=Ma,Wt.trimStart=Da,Wt.truncate=Pa,Wt.unescape=Na,Wt.uniqueId=lc,Wt.upperCase=qs,Wt.upperFirst=Ts,Wt.each=mo,Wt.eachRight=xo,Wt.first=ki,Ha(Wt,function(){var n={};return qr(Wt,function(t,r){Sc.call(Wt.prototype,r)||(n[r]=t)}),n}(),{chain:!1}),Wt.VERSION=G,u(["bind","bindKey","curry","curryRight","partial","partialRight"],function(n){Wt[n].placeholder=Wt}),u(["drop","take"],function(n,t){Bt.prototype[n]=function(r){var e=this.__filtered__;if(e&&!t)return new Bt(this);r=r===K?1:Xc(Df(r),0);var u=this.clone();return e?u.__takeCount__=nl(r,u.__takeCount__):u.__views__.push({size:nl(r,jn),type:n+(u.__dir__<0?"Right":"")}),u},Bt.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),u(["filter","map","takeWhile"],function(n,t){var r=t+1,e=r==gn||r==dn;Bt.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:$u(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),u(["head","last"],function(n,t){var r="take"+(t?"Right":"");Bt.prototype[n]=function(){return this[r](1).value()[0]}}),u(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Bt.prototype[n]=function(){return this.__filtered__?new Bt(this):this[r](1)}}),Bt.prototype.compact=function(){return this.filter(Ka)},Bt.prototype.find=function(n){return this.filter(n).head()},Bt.prototype.findLast=function(n){return this.reverse().find(n)},Bt.prototype.invokeMap=Zo(function(n,t){return"function"==typeof n?new Bt(this):this.map(function(r){return ne(r,n,t)})}),Bt.prototype.reject=function(n){return n=$u(n,3),this.filter(function(t){return!n(t)})},Bt.prototype.slice=function(n,t){n=Df(n);var r=this;return r.__filtered__&&(n>0||t<0)?new Bt(r):(n<0?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==K&&(t=Df(t),r=t<0?r.dropRight(-t):r.take(t-n)),r)},Bt.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Bt.prototype.toArray=function(){return this.take(jn)},qr(Bt.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=Wt[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(Wt.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Bt,a=o[0],c=f||ys(t),l=function(n){var t=u.apply(Wt,s([n],o));return e&&h?t[0]:t};c&&r&&"function"==typeof a&&1!=a.length&&(f=c=!1);var h=this.__chain__,p=!!this.__actions__.length,v=i&&!h,_=f&&!p;if(!i&&c){t=_?t:new Bt(this);var g=n.apply(t,o);return g.__actions__.push({func:fo,args:[l],thisArg:K}),new Ct(g,h)}return v&&_?n.apply(this,o):(g=this.thru(l),v?e?g.value()[0]:g.value():g)})}),u(["pop","push","shift","sort","splice","unshift"],function(n){var t=Ac[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);Wt.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(ys(u)?u:[],n)}return this[r](function(r){return t.apply(ys(r)?r:[],n)})}}),qr(Bt.prototype,function(n,t){var r=Wt[t];if(r){var e=r.name+"",u=vl[e]||(vl[e]=[]);u.push({name:t,func:r})}}),vl[gu(K,nn).name]=[{name:"wrapper",func:K}],Bt.prototype.clone=$t,Bt.prototype.reverse=zt,Bt.prototype.value=Ut,Wt.prototype.at=Ql,Wt.prototype.chain=ao,Wt.prototype.commit=co,Wt.prototype.next=lo,Wt.prototype.plant=ho,Wt.prototype.reverse=po,Wt.prototype.toJSON=Wt.prototype.valueOf=Wt.prototype.value=vo,Nc&&(Wt.prototype[Nc]=so),Wt}var K,G="4.13.1",J=200,Y="Expected a function",H="__lodash_hash_undefined__",Q="__lodash_placeholder__",X=1,nn=2,tn=4,rn=8,en=16,un=32,on=64,fn=128,an=256,cn=512,ln=1,sn=2,hn=30,pn="...",vn=150,_n=16,gn=1,yn=2,dn=3,bn=1/0,wn=9007199254740991,mn=1.7976931348623157e308,xn=NaN,jn=4294967295,An=jn-1,On=jn>>>1,kn="[object Arguments]",In="[object Array]",Rn="[object Boolean]",En="[object Date]",Sn="[object Error]",Wn="[object Function]",Ln="[object GeneratorFunction]",Cn="[object Map]",Bn="[object Number]",$n="[object Object]",zn="[object Promise]",Un="[object RegExp]",Fn="[object Set]",Mn="[object String]",Dn="[object Symbol]",Pn="[object WeakMap]",Nn="[object WeakSet]",qn="[object ArrayBuffer]",Tn="[object DataView]",Zn="[object Float32Array]",Vn="[object Float64Array]",Kn="[object Int8Array]",Gn="[object Int16Array]",Jn="[object Int32Array]",Yn="[object Uint8Array]",Hn="[object Uint8ClampedArray]",Qn="[object Uint16Array]",Xn="[object Uint32Array]",nt=/\b__p \+= '';/g,tt=/\b(__p \+=) '' \+/g,rt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,et=/&(?:amp|lt|gt|quot|#39|#96);/g,ut=/[&<>"'`]/g,it=RegExp(et.source),ot=RegExp(ut.source),ft=/<%-([\s\S]+?)%>/g,at=/<%([\s\S]+?)%>/g,ct=/<%=([\s\S]+?)%>/g,lt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,st=/^\w*$/,ht=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(\.|\[\])(?:\4|$))/g,pt=/[\\^$.*+?()[\]{}|]/g,vt=RegExp(pt.source),_t=/^\s+|\s+$/g,gt=/^\s+/,yt=/\s+$/,dt=/[a-zA-Z0-9]+/g,bt=/\\(\\)?/g,wt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,mt=/\w*$/,xt=/^0x/i,jt=/^[-+]0x[0-9a-f]+$/i,At=/^0b[01]+$/i,Ot=/^\[object .+?Constructor\]$/,kt=/^0o[0-7]+$/i,It=/^(?:0|[1-9]\d*)$/,Rt=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Et=/($^)/,St=/['\n\r\u2028\u2029\\]/g,Wt="\\ud800-\\udfff",Lt="\\u0300-\\u036f\\ufe20-\\ufe23",Ct="\\u20d0-\\u20f0",Bt="\\u2700-\\u27bf",$t="a-z\\xdf-\\xf6\\xf8-\\xff",zt="\\xac\\xb1\\xd7\\xf7",Ut="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Ft="\\u2000-\\u206f",Mt=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Dt="A-Z\\xc0-\\xd6\\xd8-\\xde",Pt="\\ufe0e\\ufe0f",Nt=zt+Ut+Ft+Mt,qt="['’]",Tt="["+Wt+"]",Zt="["+Nt+"]",Vt="["+Lt+Ct+"]",Kt="\\d+",Gt="["+Bt+"]",Jt="["+$t+"]",Yt="[^"+Wt+Nt+Kt+Bt+$t+Dt+"]",Ht="\\ud83c[\\udffb-\\udfff]",Qt="(?:"+Vt+"|"+Ht+")",Xt="[^"+Wt+"]",nr="(?:\\ud83c[\\udde6-\\uddff]){2}",tr="[\\ud800-\\udbff][\\udc00-\\udfff]",rr="["+Dt+"]",er="\\u200d",ur="(?:"+Jt+"|"+Yt+")",ir="(?:"+rr+"|"+Yt+")",or="(?:"+qt+"(?:d|ll|m|re|s|t|ve))?",fr="(?:"+qt+"(?:D|LL|M|RE|S|T|VE))?",ar=Qt+"?",cr="["+Pt+"]?",lr="(?:"+er+"(?:"+[Xt,nr,tr].join("|")+")"+cr+ar+")*",sr=cr+ar+lr,hr="(?:"+[Gt,nr,tr].join("|")+")"+sr,pr="(?:"+[Xt+Vt+"?",Vt,nr,tr,Tt].join("|")+")",vr=RegExp(qt,"g"),_r=RegExp(Vt,"g"),gr=RegExp(Ht+"(?="+Ht+")|"+pr+sr,"g"),yr=RegExp([rr+"?"+Jt+"+"+or+"(?="+[Zt,rr,"$"].join("|")+")",ir+"+"+fr+"(?="+[Zt,rr+ur,"$"].join("|")+")",rr+"?"+ur+"+"+or,rr+"+"+fr,Kt,hr].join("|"),"g"),dr=RegExp("["+er+Wt+Lt+Ct+Pt+"]"),br=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,wr=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","Reflect","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","isFinite","parseInt","setTimeout"],mr=-1,xr={}; xr[Zn]=xr[Vn]=xr[Kn]=xr[Gn]=xr[Jn]=xr[Yn]=xr[Hn]=xr[Qn]=xr[Xn]=!0,xr[kn]=xr[In]=xr[qn]=xr[Rn]=xr[Tn]=xr[En]=xr[Sn]=xr[Wn]=xr[Cn]=xr[Bn]=xr[$n]=xr[Un]=xr[Fn]=xr[Mn]=xr[Pn]=!1;var jr={};jr[kn]=jr[In]=jr[qn]=jr[Tn]=jr[Rn]=jr[En]=jr[Zn]=jr[Vn]=jr[Kn]=jr[Gn]=jr[Jn]=jr[Cn]=jr[Bn]=jr[$n]=jr[Un]=jr[Fn]=jr[Mn]=jr[Dn]=jr[Yn]=jr[Hn]=jr[Qn]=jr[Xn]=!0,jr[Sn]=jr[Wn]=jr[Pn]=!1;var Ar={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Or={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},kr={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},Ir={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Rr=parseFloat,Er=parseInt,Sr="object"==typeof exports&&exports,Wr=Sr&&"object"==typeof module&&module,Lr=Wr&&Wr.exports===Sr,Cr=S("object"==typeof global&&global),Br=S("object"==typeof self&&self),$r=S("object"==typeof this&&this),zr=Cr||Br||$r||Function("return this")(),Ur=V();(Br||{})._=Ur,"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return Ur}):Wr?((Wr.exports=Ur)._=Ur,Sr._=Ur):zr._=Ur}).call(this); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) @@ -761,28 +752,28 @@ xr[Zn]=xr[Vn]=xr[Kn]=xr[Gn]=xr[Jn]=xr[Yn]=xr[Hn]=xr[Qn]=xr[Xn]=!0,xr[kn]=xr[In]= },{}],"react-dom":[function(require,module,exports){ "use strict";module.exports=require("react/lib/ReactDOM"); -},{"react/lib/ReactDOM":112}],"react-redux":[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0,exports.connect=exports.Provider=void 0;var _Provider=require("./components/Provider"),_Provider2=_interopRequireDefault(_Provider),_connect=require("./components/connect"),_connect2=_interopRequireDefault(_connect);exports.Provider=_Provider2["default"],exports.connect=_connect2["default"]; +},{"react/lib/ReactDOM":111}],"react-redux":[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0,exports.connect=exports.Provider=void 0;var _Provider=require("./components/Provider"),_Provider2=_interopRequireDefault(_Provider),_connect=require("./components/connect"),_connect2=_interopRequireDefault(_connect);exports.Provider=_Provider2.default,exports.connect=_connect2.default; -},{"./components/Provider":34,"./components/connect":35}],"react-router":[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0,exports.createMemoryHistory=exports.hashHistory=exports.browserHistory=exports.applyRouterMiddleware=exports.formatPattern=exports.useRouterHistory=exports.match=exports.routerShape=exports.locationShape=exports.PropTypes=exports.RoutingContext=exports.RouterContext=exports.createRoutes=exports.useRoutes=exports.RouteContext=exports.Lifecycle=exports.History=exports.Route=exports.Redirect=exports.IndexRoute=exports.IndexRedirect=exports.withRouter=exports.IndexLink=exports.Link=exports.Router=void 0;var _RouteUtils=require("./RouteUtils");Object.defineProperty(exports,"createRoutes",{enumerable:!0,get:function(){return _RouteUtils.createRoutes}});var _PropTypes2=require("./PropTypes");Object.defineProperty(exports,"locationShape",{enumerable:!0,get:function(){return _PropTypes2.locationShape}}),Object.defineProperty(exports,"routerShape",{enumerable:!0,get:function(){return _PropTypes2.routerShape}});var _PatternUtils=require("./PatternUtils");Object.defineProperty(exports,"formatPattern",{enumerable:!0,get:function(){return _PatternUtils.formatPattern}});var _Router2=require("./Router"),_Router3=_interopRequireDefault(_Router2),_Link2=require("./Link"),_Link3=_interopRequireDefault(_Link2),_IndexLink2=require("./IndexLink"),_IndexLink3=_interopRequireDefault(_IndexLink2),_withRouter2=require("./withRouter"),_withRouter3=_interopRequireDefault(_withRouter2),_IndexRedirect2=require("./IndexRedirect"),_IndexRedirect3=_interopRequireDefault(_IndexRedirect2),_IndexRoute2=require("./IndexRoute"),_IndexRoute3=_interopRequireDefault(_IndexRoute2),_Redirect2=require("./Redirect"),_Redirect3=_interopRequireDefault(_Redirect2),_Route2=require("./Route"),_Route3=_interopRequireDefault(_Route2),_History2=require("./History"),_History3=_interopRequireDefault(_History2),_Lifecycle2=require("./Lifecycle"),_Lifecycle3=_interopRequireDefault(_Lifecycle2),_RouteContext2=require("./RouteContext"),_RouteContext3=_interopRequireDefault(_RouteContext2),_useRoutes2=require("./useRoutes"),_useRoutes3=_interopRequireDefault(_useRoutes2),_RouterContext2=require("./RouterContext"),_RouterContext3=_interopRequireDefault(_RouterContext2),_RoutingContext2=require("./RoutingContext"),_RoutingContext3=_interopRequireDefault(_RoutingContext2),_PropTypes3=_interopRequireDefault(_PropTypes2),_match2=require("./match"),_match3=_interopRequireDefault(_match2),_useRouterHistory2=require("./useRouterHistory"),_useRouterHistory3=_interopRequireDefault(_useRouterHistory2),_applyRouterMiddleware2=require("./applyRouterMiddleware"),_applyRouterMiddleware3=_interopRequireDefault(_applyRouterMiddleware2),_browserHistory2=require("./browserHistory"),_browserHistory3=_interopRequireDefault(_browserHistory2),_hashHistory2=require("./hashHistory"),_hashHistory3=_interopRequireDefault(_hashHistory2),_createMemoryHistory2=require("./createMemoryHistory"),_createMemoryHistory3=_interopRequireDefault(_createMemoryHistory2);exports.Router=_Router3["default"],exports.Link=_Link3["default"],exports.IndexLink=_IndexLink3["default"],exports.withRouter=_withRouter3["default"],exports.IndexRedirect=_IndexRedirect3["default"],exports.IndexRoute=_IndexRoute3["default"],exports.Redirect=_Redirect3["default"],exports.Route=_Route3["default"],exports.History=_History3["default"],exports.Lifecycle=_Lifecycle3["default"],exports.RouteContext=_RouteContext3["default"],exports.useRoutes=_useRoutes3["default"],exports.RouterContext=_RouterContext3["default"],exports.RoutingContext=_RoutingContext3["default"],exports.PropTypes=_PropTypes3["default"],exports.match=_match3["default"],exports.useRouterHistory=_useRouterHistory3["default"],exports.applyRouterMiddleware=_applyRouterMiddleware3["default"],exports.browserHistory=_browserHistory3["default"],exports.hashHistory=_hashHistory3["default"],exports.createMemoryHistory=_createMemoryHistory3["default"]; +},{"./components/Provider":33,"./components/connect":34}],"react-router":[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0,exports.createMemoryHistory=exports.hashHistory=exports.browserHistory=exports.applyRouterMiddleware=exports.formatPattern=exports.useRouterHistory=exports.match=exports.routerShape=exports.locationShape=exports.PropTypes=exports.RoutingContext=exports.RouterContext=exports.createRoutes=exports.useRoutes=exports.RouteContext=exports.Lifecycle=exports.History=exports.Route=exports.Redirect=exports.IndexRoute=exports.IndexRedirect=exports.withRouter=exports.IndexLink=exports.Link=exports.Router=void 0;var _RouteUtils=require("./RouteUtils");Object.defineProperty(exports,"createRoutes",{enumerable:!0,get:function(){return _RouteUtils.createRoutes}});var _PropTypes2=require("./PropTypes");Object.defineProperty(exports,"locationShape",{enumerable:!0,get:function(){return _PropTypes2.locationShape}}),Object.defineProperty(exports,"routerShape",{enumerable:!0,get:function(){return _PropTypes2.routerShape}});var _PatternUtils=require("./PatternUtils");Object.defineProperty(exports,"formatPattern",{enumerable:!0,get:function(){return _PatternUtils.formatPattern}});var _Router2=require("./Router"),_Router3=_interopRequireDefault(_Router2),_Link2=require("./Link"),_Link3=_interopRequireDefault(_Link2),_IndexLink2=require("./IndexLink"),_IndexLink3=_interopRequireDefault(_IndexLink2),_withRouter2=require("./withRouter"),_withRouter3=_interopRequireDefault(_withRouter2),_IndexRedirect2=require("./IndexRedirect"),_IndexRedirect3=_interopRequireDefault(_IndexRedirect2),_IndexRoute2=require("./IndexRoute"),_IndexRoute3=_interopRequireDefault(_IndexRoute2),_Redirect2=require("./Redirect"),_Redirect3=_interopRequireDefault(_Redirect2),_Route2=require("./Route"),_Route3=_interopRequireDefault(_Route2),_History2=require("./History"),_History3=_interopRequireDefault(_History2),_Lifecycle2=require("./Lifecycle"),_Lifecycle3=_interopRequireDefault(_Lifecycle2),_RouteContext2=require("./RouteContext"),_RouteContext3=_interopRequireDefault(_RouteContext2),_useRoutes2=require("./useRoutes"),_useRoutes3=_interopRequireDefault(_useRoutes2),_RouterContext2=require("./RouterContext"),_RouterContext3=_interopRequireDefault(_RouterContext2),_RoutingContext2=require("./RoutingContext"),_RoutingContext3=_interopRequireDefault(_RoutingContext2),_PropTypes3=_interopRequireDefault(_PropTypes2),_match2=require("./match"),_match3=_interopRequireDefault(_match2),_useRouterHistory2=require("./useRouterHistory"),_useRouterHistory3=_interopRequireDefault(_useRouterHistory2),_applyRouterMiddleware2=require("./applyRouterMiddleware"),_applyRouterMiddleware3=_interopRequireDefault(_applyRouterMiddleware2),_browserHistory2=require("./browserHistory"),_browserHistory3=_interopRequireDefault(_browserHistory2),_hashHistory2=require("./hashHistory"),_hashHistory3=_interopRequireDefault(_hashHistory2),_createMemoryHistory2=require("./createMemoryHistory"),_createMemoryHistory3=_interopRequireDefault(_createMemoryHistory2);exports.Router=_Router3.default,exports.Link=_Link3.default,exports.IndexLink=_IndexLink3.default,exports.withRouter=_withRouter3.default,exports.IndexRedirect=_IndexRedirect3.default,exports.IndexRoute=_IndexRoute3.default,exports.Redirect=_Redirect3.default,exports.Route=_Route3.default,exports.History=_History3.default,exports.Lifecycle=_Lifecycle3.default,exports.RouteContext=_RouteContext3.default,exports.useRoutes=_useRoutes3.default,exports.RouterContext=_RouterContext3.default,exports.RoutingContext=_RoutingContext3.default,exports.PropTypes=_PropTypes3.default,exports.match=_match3.default,exports.useRouterHistory=_useRouterHistory3.default,exports.applyRouterMiddleware=_applyRouterMiddleware3.default,exports.browserHistory=_browserHistory3.default,exports.hashHistory=_hashHistory3.default,exports.createMemoryHistory=_createMemoryHistory3.default; -},{"./History":41,"./IndexLink":42,"./IndexRedirect":43,"./IndexRoute":44,"./Lifecycle":46,"./Link":47,"./PatternUtils":48,"./PropTypes":49,"./Redirect":50,"./Route":51,"./RouteContext":52,"./RouteUtils":53,"./Router":54,"./RouterContext":55,"./RoutingContext":57,"./applyRouterMiddleware":59,"./browserHistory":60,"./createMemoryHistory":62,"./hashHistory":68,"./match":71,"./useRouterHistory":74,"./useRoutes":75,"./withRouter":76}],"react":[function(require,module,exports){ +},{"./History":40,"./IndexLink":41,"./IndexRedirect":42,"./IndexRoute":43,"./Lifecycle":45,"./Link":46,"./PatternUtils":47,"./PropTypes":48,"./Redirect":49,"./Route":50,"./RouteContext":51,"./RouteUtils":52,"./Router":53,"./RouterContext":54,"./RoutingContext":56,"./applyRouterMiddleware":58,"./browserHistory":59,"./createMemoryHistory":61,"./hashHistory":67,"./match":70,"./useRouterHistory":73,"./useRoutes":74,"./withRouter":75}],"react":[function(require,module,exports){ "use strict";module.exports=require("./lib/React"); -},{"./lib/React":102}],"redux-logger":[function(require,module,exports){ -"use strict";function _toConsumableArray(t){if(Array.isArray(t)){for(var e=0,r=Array(t.length);e<t.length;e++)r[e]=t[e];return r}return Array.from(t)}function _typeof(t){return t&&"undefined"!=typeof Symbol&&t.constructor===Symbol?"symbol":typeof t}function getLogLevel(t,e,r,o){switch("undefined"==typeof t?"undefined":_typeof(t)){case"object":return"function"==typeof t[o]?t[o].apply(t,_toConsumableArray(r)):t[o];case"function":return t(e);default:return t}}function createLogger(){function t(){x.forEach(function(t,e){var r=t.started,n=t.startedTime,i=t.action,u=t.prevState,f=t.error,l=t.took,s=t.nextState,g=x[e+1];g&&(s=g.prevState,l=g.started-r);var v=S(i),m="function"==typeof c?c(function(){return s},i):c,y=formatTime(n),h=b.title?"color: "+b.title(v)+";":null,L="action "+(p?y:"")+" "+v.type+" "+(d?"(in "+l.toFixed(2)+" ms)":"");try{m?b.title?a.groupCollapsed("%c "+L,h):a.groupCollapsed(L):b.title?a.group("%c "+L,h):a.group(L)}catch(w){a.log(L)}var A=getLogLevel(o,v,[u],"prevState"),T=getLogLevel(o,v,[v],"action"),E=getLogLevel(o,v,[f,u],"error"),C=getLogLevel(o,v,[s],"nextState");A&&(b.prevState?a[A]("%c prev state","color: "+b.prevState(u)+"; font-weight: bold",u):a[A]("prev state",u)),T&&(b.action?a[T]("%c action","color: "+b.action(v)+"; font-weight: bold",v):a[T]("action",v)),f&&E&&(b.error?a[E]("%c error","color: "+b.error(f,u)+"; font-weight: bold",f):a[E]("error",f)),C&&(b.nextState?a[C]("%c next state","color: "+b.nextState(s)+"; font-weight: bold",s):a[C]("next state",s));try{a.groupEnd()}catch(w){a.log("—— log end ——")}}),x.length=0}var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],r=e.level,o=void 0===r?"log":r,n=e.logger,a=void 0===n?console:n,i=e.logErrors,u=void 0===i||i,c=e.collapsed,f=e.predicate,l=e.duration,d=void 0!==l&&l,s=e.timestamp,p=void 0===s||s,g=e.transformer,v=e.stateTransformer,m=void 0===v?function(t){return t}:v,y=e.actionTransformer,S=void 0===y?function(t){return t}:y,h=e.errorTransformer,L=void 0===h?function(t){return t}:h,w=e.colors,b=void 0===w?{title:function(){return"#000000"},prevState:function(){return"#9E9E9E"},action:function(){return"#03A9F4"},nextState:function(){return"#4CAF50"},error:function(){return"#F20404"}}:w;if("undefined"==typeof a)return function(){return function(t){return function(e){return t(e)}}};g&&console.error("Option 'transformer' is deprecated, use stateTransformer instead");var x=[];return function(e){var r=e.getState;return function(e){return function(o){if("function"==typeof f&&!f(r,o))return e(o);var n={};x.push(n),n.started=timer.now(),n.startedTime=new Date,n.prevState=m(r()),n.action=o;var a=void 0;if(u)try{a=e(o)}catch(i){n.error=L(i)}else a=e(o);if(n.took=timer.now()-n.started,n.nextState=m(r()),t(),n.error)throw n.error;return a}}}}var repeat=function(t,e){return new Array(e+1).join(t)},pad=function(t,e){return repeat("0",e-t.toString().length)+t},formatTime=function(t){return"@ "+pad(t.getHours(),2)+":"+pad(t.getMinutes(),2)+":"+pad(t.getSeconds(),2)+"."+pad(t.getMilliseconds(),3)},timer="undefined"!=typeof performance&&"function"==typeof performance.now?performance:Date;module.exports=createLogger; +},{"./lib/React":101}],"redux-logger":[function(require,module,exports){ +"use strict";function _toConsumableArray(t){if(Array.isArray(t)){for(var e=0,r=Array(t.length);e<t.length;e++)r[e]=t[e];return r}return Array.from(t)}function _typeof(t){return t&&"undefined"!=typeof Symbol&&t.constructor===Symbol?"symbol":typeof t}function getLogLevel(t,e,r,o){switch("undefined"==typeof t?"undefined":_typeof(t)){case"object":return"function"==typeof t[o]?t[o].apply(t,_toConsumableArray(r)):t[o];case"function":return t(e);default:return t}}function createLogger(){function t(){x.forEach(function(t,e){var r=t.started,n=t.startedTime,i=t.action,u=t.prevState,f=t.error,l=t.took,s=t.nextState,g=x[e+1];g&&(s=g.prevState,l=g.started-r);var v=S(i),m="function"==typeof c?c(function(){return s},i):c,y=formatTime(n),h=b.title?"color: "+b.title(v)+";":null,L="action "+(p?y:"")+" "+v.type+" "+(d?"(in "+l.toFixed(2)+" ms)":"");try{m?b.title?a.groupCollapsed("%c "+L,h):a.groupCollapsed(L):b.title?a.group("%c "+L,h):a.group(L)}catch(t){a.log(L)}var w=getLogLevel(o,v,[u],"prevState"),A=getLogLevel(o,v,[v],"action"),T=getLogLevel(o,v,[f,u],"error"),E=getLogLevel(o,v,[s],"nextState");w&&(b.prevState?a[w]("%c prev state","color: "+b.prevState(u)+"; font-weight: bold",u):a[w]("prev state",u)),A&&(b.action?a[A]("%c action","color: "+b.action(v)+"; font-weight: bold",v):a[A]("action",v)),f&&T&&(b.error?a[T]("%c error","color: "+b.error(f,u)+"; font-weight: bold",f):a[T]("error",f)),E&&(b.nextState?a[E]("%c next state","color: "+b.nextState(s)+"; font-weight: bold",s):a[E]("next state",s));try{a.groupEnd()}catch(t){a.log("—— log end ——")}}),x.length=0}var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],r=e.level,o=void 0===r?"log":r,n=e.logger,a=void 0===n?console:n,i=e.logErrors,u=void 0===i||i,c=e.collapsed,f=e.predicate,l=e.duration,d=void 0!==l&&l,s=e.timestamp,p=void 0===s||s,g=e.transformer,v=e.stateTransformer,m=void 0===v?function(t){return t}:v,y=e.actionTransformer,S=void 0===y?function(t){return t}:y,h=e.errorTransformer,L=void 0===h?function(t){return t}:h,w=e.colors,b=void 0===w?{title:function(){return"#000000"},prevState:function(){return"#9E9E9E"},action:function(){return"#03A9F4"},nextState:function(){return"#4CAF50"},error:function(){return"#F20404"}}:w;if("undefined"==typeof a)return function(){return function(t){return function(e){return t(e)}}};g&&console.error("Option 'transformer' is deprecated, use stateTransformer instead");var x=[];return function(e){var r=e.getState;return function(e){return function(o){if("function"==typeof f&&!f(r,o))return e(o);var n={};x.push(n),n.started=timer.now(),n.startedTime=new Date,n.prevState=m(r()),n.action=o;var a=void 0;if(u)try{a=e(o)}catch(t){n.error=L(t)}else a=e(o);if(n.took=timer.now()-n.started,n.nextState=m(r()),t(),n.error)throw n.error;return a}}}}var repeat=function(t,e){return new Array(e+1).join(t)},pad=function(t,e){return repeat("0",e-t.toString().length)+t},formatTime=function(t){return"@ "+pad(t.getHours(),2)+":"+pad(t.getMinutes(),2)+":"+pad(t.getSeconds(),2)+"."+pad(t.getMilliseconds(),3)},timer="undefined"!=typeof performance&&"function"==typeof performance.now?performance:Date;module.exports=createLogger; },{}],"redux-thunk":[function(require,module,exports){ -"use strict";function createThunkMiddleware(t){return function(e){var n=e.dispatch,r=e.getState;return function(e){return function(u){return"function"==typeof u?u(n,r,t):e(u)}}}}exports.__esModule=!0;var thunk=createThunkMiddleware();thunk.withExtraArgument=createThunkMiddleware,exports["default"]=thunk; +"use strict";function createThunkMiddleware(t){return function(e){var n=e.dispatch,r=e.getState;return function(e){return function(u){return"function"==typeof u?u(n,r,t):e(u)}}}}exports.__esModule=!0;var thunk=createThunkMiddleware();thunk.withExtraArgument=createThunkMiddleware,exports.default=thunk; },{}],"redux":[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function isCrushed(){}exports.__esModule=!0,exports.compose=exports.applyMiddleware=exports.bindActionCreators=exports.combineReducers=exports.createStore=void 0;var _createStore=require("./createStore"),_createStore2=_interopRequireDefault(_createStore),_combineReducers=require("./combineReducers"),_combineReducers2=_interopRequireDefault(_combineReducers),_bindActionCreators=require("./bindActionCreators"),_bindActionCreators2=_interopRequireDefault(_bindActionCreators),_applyMiddleware=require("./applyMiddleware"),_applyMiddleware2=_interopRequireDefault(_applyMiddleware),_compose=require("./compose"),_compose2=_interopRequireDefault(_compose),_warning=require("./utils/warning"),_warning2=_interopRequireDefault(_warning);exports.createStore=_createStore2["default"],exports.combineReducers=_combineReducers2["default"],exports.bindActionCreators=_bindActionCreators2["default"],exports.applyMiddleware=_applyMiddleware2["default"],exports.compose=_compose2["default"]; +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function isCrushed(){}exports.__esModule=!0,exports.compose=exports.applyMiddleware=exports.bindActionCreators=exports.combineReducers=exports.createStore=void 0;var _createStore=require("./createStore"),_createStore2=_interopRequireDefault(_createStore),_combineReducers=require("./combineReducers"),_combineReducers2=_interopRequireDefault(_combineReducers),_bindActionCreators=require("./bindActionCreators"),_bindActionCreators2=_interopRequireDefault(_bindActionCreators),_applyMiddleware=require("./applyMiddleware"),_applyMiddleware2=_interopRequireDefault(_applyMiddleware),_compose=require("./compose"),_compose2=_interopRequireDefault(_compose),_warning=require("./utils/warning"),_warning2=_interopRequireDefault(_warning);exports.createStore=_createStore2.default,exports.combineReducers=_combineReducers2.default,exports.bindActionCreators=_bindActionCreators2.default,exports.applyMiddleware=_applyMiddleware2.default,exports.compose=_compose2.default; -},{"./applyMiddleware":237,"./bindActionCreators":238,"./combineReducers":239,"./compose":240,"./createStore":241,"./utils/warning":242}],"shallowequal":[function(require,module,exports){ +},{"./applyMiddleware":233,"./bindActionCreators":234,"./combineReducers":235,"./compose":236,"./createStore":237,"./utils/warning":238}],"shallowequal":[function(require,module,exports){ "use strict";var fetchKeys=require("lodash.keys");module.exports=function(e,r,t,n){var o=t?t.call(n,e,r):void 0;if(void 0!==o)return!!o;if(e===r)return!0;if("object"!=typeof e||null===e||"object"!=typeof r||null===r)return!1;var i=fetchKeys(e),l=fetchKeys(r),u=i.length;if(u!==l.length)return!1;n=n||null;for(var f=Object.prototype.hasOwnProperty.bind(r),a=0;a<u;a++){var c=i[a];if(!f(c))return!1;var v=e[c],s=r[c],y=t?t.call(n,v,s,c):void 0;if(y===!1||void 0===y&&v!==s)return!1}return!0}; -},{"lodash.keys":27}]},{},[]) +},{"lodash.keys":239}]},{},[]) //# sourceMappingURL=vendor.js.map diff --git a/netlib/debug.py b/netlib/debug.py index a395afcb..29c7f655 100644 --- a/netlib/debug.py +++ b/netlib/debug.py @@ -7,8 +7,6 @@ import signal import platform import traceback -import psutil - from netlib import version from OpenSSL import SSL @@ -19,7 +17,7 @@ def sysinfo(): "Mitmproxy version: %s" % version.VERSION, "Python version: %s" % platform.python_version(), "Platform: %s" % platform.platform(), - "SSL version: %s" % SSL.SSLeay_version(SSL.SSLEAY_VERSION), + "SSL version: %s" % SSL.SSLeay_version(SSL.SSLEAY_VERSION).decode(), ] d = platform.linux_distribution() t = "Linux distro: %s %s %s" % d @@ -40,15 +38,32 @@ def sysinfo(): def dump_info(sig, frm, file=sys.stdout): # pragma: no cover - p = psutil.Process() - print("****************************************************", file=file) print("Summary", file=file) print("=======", file=file) - print("num threads: ", p.num_threads(), file=file) - if hasattr(p, "num_fds"): - print("num fds: ", p.num_fds(), file=file) - print("memory: ", p.memory_info(), file=file) + + try: + import psutil + except: + print("(psutil not installed, skipping some debug info)", file=file) + else: + p = psutil.Process() + print("num threads: ", p.num_threads(), file=file) + if hasattr(p, "num_fds"): + print("num fds: ", p.num_fds(), file=file) + print("memory: ", p.memory_info(), file=file) + + print(file=file) + print("Files", file=file) + print("=====", file=file) + for i in p.open_files(): + print(i, file=file) + + print(file=file) + print("Connections", file=file) + print("===========", file=file) + for i in p.connections(): + print(i, file=file) print(file=file) print("Threads", file=file) @@ -63,18 +78,6 @@ def dump_info(sig, frm, file=sys.stdout): # pragma: no cover for i in bthreads: print(i._threadinfo(), file=file) - print(file=file) - print("Files", file=file) - print("=====", file=file) - for i in p.open_files(): - print(i, file=file) - - print(file=file) - print("Connections", file=file) - print("===========", file=file) - for i in p.connections(): - print(i, file=file) - print("****************************************************", file=file) diff --git a/netlib/encoding.py b/netlib/encoding.py index 98502451..8b67b543 100644 --- a/netlib/encoding.py +++ b/netlib/encoding.py @@ -1,39 +1,62 @@ """ - Utility functions for decoding response bodies. +Utility functions for decoding response bodies. """ from __future__ import absolute_import + +import codecs from io import BytesIO import gzip import zlib +from typing import Union # noqa + -ENCODINGS = {"identity", "gzip", "deflate"} +def decode(obj, encoding, errors='strict'): + # type: (Union[str, bytes], str) -> Union[str, bytes] + """ + Decode the given input object + Returns: + The decoded value -def decode(e, content): - if not isinstance(content, bytes): - return None - encoding_map = { - "identity": identity, - "gzip": decode_gzip, - "deflate": decode_deflate, - } - if e not in encoding_map: - return None - return encoding_map[e](content) + Raises: + ValueError, if decoding fails. + """ + try: + try: + return custom_decode[encoding](obj) + except KeyError: + return codecs.decode(obj, encoding, errors) + except Exception as e: + raise ValueError("{} when decoding {} with {}".format( + type(e).__name__, + repr(obj)[:10], + repr(encoding), + )) + + +def encode(obj, encoding, errors='strict'): + # type: (Union[str, bytes], str) -> Union[str, bytes] + """ + Encode the given input object + Returns: + The encoded value -def encode(e, content): - if not isinstance(content, bytes): - return None - encoding_map = { - "identity": identity, - "gzip": encode_gzip, - "deflate": encode_deflate, - } - if e not in encoding_map: - return None - return encoding_map[e](content) + Raises: + ValueError, if encoding fails. + """ + try: + try: + return custom_encode[encoding](obj) + except KeyError: + return codecs.encode(obj, encoding, errors) + except Exception as e: + raise ValueError("{} when encoding {} with {}".format( + type(e).__name__, + repr(obj)[:10], + repr(encoding), + )) def identity(content): @@ -46,10 +69,7 @@ def identity(content): def decode_gzip(content): gfile = gzip.GzipFile(fileobj=BytesIO(content)) - try: - return gfile.read() - except (IOError, EOFError): - return None + return gfile.read() def encode_gzip(content): @@ -70,12 +90,9 @@ def decode_deflate(content): http://bugs.python.org/issue5784 """ try: - try: - return zlib.decompress(content) - except zlib.error: - return zlib.decompress(content, -15) + return zlib.decompress(content) except zlib.error: - return None + return zlib.decompress(content, -15) def encode_deflate(content): @@ -84,4 +101,16 @@ def encode_deflate(content): """ return zlib.compress(content) -__all__ = ["ENCODINGS", "encode", "decode"] + +custom_decode = { + "identity": identity, + "gzip": decode_gzip, + "deflate": decode_deflate, +} +custom_encode = { + "identity": identity, + "gzip": encode_gzip, + "deflate": encode_deflate, +} + +__all__ = ["encode", "decode"] diff --git a/netlib/http/cookies.py b/netlib/http/cookies.py index 768a85df..dd0af99c 100644 --- a/netlib/http/cookies.py +++ b/netlib/http/cookies.py @@ -1,7 +1,8 @@ import collections +import email.utils import re +import time -import email.utils from netlib import multidict """ @@ -260,3 +261,29 @@ def refresh_set_cookie_header(c, delta): if not ret: raise ValueError("Invalid Cookie") return ret + + +def is_expired(cookie_attrs): + """ + Determines whether a cookie has expired. + + Returns: boolean + """ + + # See if 'expires' time is in the past + expires = False + if 'expires' in cookie_attrs: + e = email.utils.parsedate_tz(cookie_attrs["expires"]) + if e: + exp_ts = email.utils.mktime_tz(e) + now_ts = time.time() + expires = exp_ts < now_ts + + # or if Max-Age is 0 + max_age = False + try: + max_age = int(cookie_attrs.get('Max-Age', 1)) == 0 + except ValueError: + pass + + return expires or max_age diff --git a/netlib/http/headers.py b/netlib/http/headers.py index 413add87..36e5060c 100644 --- a/netlib/http/headers.py +++ b/netlib/http/headers.py @@ -2,6 +2,7 @@ from __future__ import absolute_import, print_function, division import re +import collections import six from netlib import multidict from netlib import strutils @@ -183,8 +184,8 @@ class Headers(multidict.MultiDict): pass else: replacements += n - fields.append([name, value]) - self.fields = fields + fields.append((name, value)) + self.fields = tuple(fields) return replacements @@ -206,10 +207,22 @@ def parse_content_type(c): ts = parts[0].split("/", 1) if len(ts) != 2: return None - d = {} + d = collections.OrderedDict() if len(parts) == 2: for i in parts[1].split(";"): clause = i.split("=", 1) if len(clause) == 2: d[clause[0].strip()] = clause[1].strip() return ts[0].lower(), ts[1].lower(), d + + +def assemble_content_type(type, subtype, parameters): + if not parameters: + return "{}/{}".format(type, subtype) + params = "; ".join( + "{}={}".format(k, v) + for k, v in parameters.items() + ) + return "{}/{}; {}".format( + type, subtype, params + ) diff --git a/netlib/http/http1/assemble.py b/netlib/http/http1/assemble.py index 511328f1..e74732d2 100644 --- a/netlib/http/http1/assemble.py +++ b/netlib/http/http1/assemble.py @@ -5,7 +5,7 @@ from netlib import exceptions def assemble_request(request): - if request.content is None: + if request.data.content is None: raise exceptions.HttpException("Cannot assemble flow with missing content") head = assemble_request_head(request) body = b"".join(assemble_body(request.data.headers, [request.data.content])) @@ -19,7 +19,7 @@ def assemble_request_head(request): def assemble_response(response): - if response.content is None: + if response.data.content is None: raise exceptions.HttpException("Cannot assemble flow with missing content") head = assemble_response_head(response) body = b"".join(assemble_body(response.data.headers, [response.data.content])) diff --git a/netlib/http/http1/read.py b/netlib/http/http1/read.py index a4c341fd..70fffbd4 100644 --- a/netlib/http/http1/read.py +++ b/netlib/http/http1/read.py @@ -244,7 +244,7 @@ def _read_request_line(rfile): raise exceptions.HttpReadDisconnect("Client disconnected") try: - method, path, http_version = line.split(b" ") + method, path, http_version = line.split() if path == b"*" or path.startswith(b"/"): form = "relative" @@ -291,8 +291,7 @@ def _read_response_line(rfile): raise exceptions.HttpReadDisconnect("Server disconnected") try: - - parts = line.split(b" ", 2) + parts = line.split(None, 2) if len(parts) == 2: # handle missing message gracefully parts.append(b"") diff --git a/netlib/http/message.py b/netlib/http/message.py index b268fec9..34709f0a 100644 --- a/netlib/http/message.py +++ b/netlib/http/message.py @@ -52,7 +52,23 @@ class MessageData(basetypes.Serializable): return cls(**state) +class CachedDecode(object): + __slots__ = ["encoded", "encoding", "strict", "decoded"] + + def __init__(self, object, encoding, strict, decoded): + self.encoded = object + self.encoding = encoding + self.strict = strict + self.decoded = decoded + +no_cached_decode = CachedDecode(None, None, None, None) + + class Message(basetypes.Serializable): + def __init__(self): + self._content_cache = no_cached_decode # type: CachedDecode + self._text_cache = no_cached_decode # type: CachedDecode + def __eq__(self, other): if isinstance(other, Message): return self.data == other.data @@ -90,22 +106,82 @@ class Message(basetypes.Serializable): self.data.headers = h @property - def content(self): + def raw_content(self): + # type: () -> bytes """ The raw (encoded) HTTP message body - See also: :py:attr:`text` + See also: :py:attr:`content`, :py:class:`text` """ return self.data.content - @content.setter - def content(self, content): - # type: (Optional[bytes]) -> None + @raw_content.setter + def raw_content(self, content): self.data.content = content - if isinstance(content, six.text_type): - raise ValueError("Message content must be bytes, not {}".format(type(content).__name__)) - if isinstance(content, bytes): - self.headers["content-length"] = str(len(content)) + + def get_content(self, strict=True): + # type: (bool) -> bytes + """ + The HTTP message body decoded with the content-encoding header (e.g. gzip) + + Raises: + ValueError, when the content-encoding is invalid and strict is True. + + See also: :py:class:`raw_content`, :py:attr:`text` + """ + if self.raw_content is None: + return None + ce = self.headers.get("content-encoding") + cached = ( + self._content_cache.encoded == self.raw_content and + (self._content_cache.strict or not strict) and + self._content_cache.encoding == ce + ) + if not cached: + is_strict = True + if ce: + try: + decoded = encoding.decode(self.raw_content, ce) + except ValueError: + if strict: + raise + is_strict = False + decoded = self.raw_content + else: + decoded = self.raw_content + self._content_cache = CachedDecode(self.raw_content, ce, is_strict, decoded) + return self._content_cache.decoded + + def set_content(self, value): + if value is None: + self.raw_content = None + return + if not isinstance(value, bytes): + raise TypeError( + "Message content must be bytes, not {}. " + "Please use .text if you want to assign a str." + .format(type(value).__name__) + ) + ce = self.headers.get("content-encoding") + cached = ( + self._content_cache.decoded == value and + self._content_cache.encoding == ce and + self._content_cache.strict + ) + if not cached: + try: + encoded = encoding.encode(value, ce or "identity") + except ValueError: + # So we have an invalid content-encoding? + # Let's remove it! + del self.headers["content-encoding"] + ce = None + encoded = value + self._content_cache = CachedDecode(encoded, ce, True, value) + self.raw_content = self._content_cache.encoded + self.headers["content-length"] = str(len(self.raw_content)) + + content = property(get_content, set_content) @property def http_version(self): @@ -140,56 +216,108 @@ class Message(basetypes.Serializable): def timestamp_end(self, timestamp_end): self.data.timestamp_end = timestamp_end - @property - def text(self): - """ - The decoded HTTP message body. - Decoded contents are not cached, so accessing this attribute repeatedly is relatively expensive. + def _get_content_type_charset(self): + # type: () -> Optional[str] + ct = headers.parse_content_type(self.headers.get("content-type", "")) + if ct: + return ct[2].get("charset") - .. note:: - This is not implemented yet. + def _guess_encoding(self): + # type: () -> str + enc = self._get_content_type_charset() + if enc: + return enc - See also: :py:attr:`content`, :py:class:`decoded` + if "json" in self.headers.get("content-type", ""): + return "utf8" + else: + # We may also want to check for HTML meta tags here at some point. + return "latin-1" + + def get_text(self, strict=True): + # type: (bool) -> six.text_type """ - # This attribute should be called text, because that's what requests does. - raise NotImplementedError() + The HTTP message body decoded with both content-encoding header (e.g. gzip) + and content-type header charset. - @text.setter - def text(self, text): - raise NotImplementedError() + Raises: + ValueError, when either content-encoding or charset is invalid and strict is True. - def decode(self): + See also: :py:attr:`content`, :py:class:`raw_content` + """ + if self.raw_content is None: + return None + enc = self._guess_encoding() + + content = self.get_content(strict) + cached = ( + self._text_cache.encoded == content and + (self._text_cache.strict or not strict) and + self._text_cache.encoding == enc + ) + if not cached: + is_strict = self._content_cache.strict + try: + decoded = encoding.decode(content, enc) + except ValueError: + if strict: + raise + is_strict = False + decoded = self.content.decode("utf8", "replace" if six.PY2 else "surrogateescape") + self._text_cache = CachedDecode(content, enc, is_strict, decoded) + return self._text_cache.decoded + + def set_text(self, text): + if text is None: + self.content = None + return + enc = self._guess_encoding() + + cached = ( + self._text_cache.decoded == text and + self._text_cache.encoding == enc and + self._text_cache.strict + ) + if not cached: + try: + encoded = encoding.encode(text, enc) + except ValueError: + # Fall back to UTF-8 and update the content-type header. + ct = headers.parse_content_type(self.headers.get("content-type", "")) or ("text", "plain", {}) + ct[2]["charset"] = "utf-8" + self.headers["content-type"] = headers.assemble_content_type(*ct) + enc = "utf8" + encoded = text.encode(enc, "replace" if six.PY2 else "surrogateescape") + self._text_cache = CachedDecode(encoded, enc, True, text) + self.content = self._text_cache.encoded + + text = property(get_text, set_text) + + def decode(self, strict=True): """ - Decodes body based on the current Content-Encoding header, then - removes the header. If there is no Content-Encoding header, no - action is taken. + Decodes body based on the current Content-Encoding header, then + removes the header. If there is no Content-Encoding header, no + action is taken. - Returns: - True, if decoding succeeded. - False, otherwise. + Raises: + ValueError, when the content-encoding is invalid and strict is True. """ - ce = self.headers.get("content-encoding") - data = encoding.decode(ce, self.content) - if data is None: - return False - self.content = data + self.raw_content = self.get_content(strict) self.headers.pop("content-encoding", None) - return True def encode(self, e): """ - Encodes body with the encoding e, where e is "gzip", "deflate" or "identity". + Encodes body with the encoding e, where e is "gzip", "deflate" or "identity". + Any existing content-encodings are overwritten, + the content is not decoded beforehand. - Returns: - True, if decoding succeeded. - False, otherwise. + Raises: + ValueError, when the specified content-encoding is invalid. """ - data = encoding.encode(e, self.content) - if data is None: - return False - self.content = data self.headers["content-encoding"] = e - return True + self.content = self.raw_content + if "content-encoding" not in self.headers: + raise ValueError("Invalid content encoding {}".format(repr(e))) def replace(self, pattern, repl, flags=0): """ @@ -206,10 +334,9 @@ class Message(basetypes.Serializable): repl = strutils.escaped_str_to_bytes(repl) replacements = 0 if self.content: - with decoded(self): - self.content, replacements = re.subn( - pattern, repl, self.content, flags=flags - ) + self.content, replacements = re.subn( + pattern, repl, self.content, flags=flags + ) replacements += self.headers.replace(pattern, repl, flags) return replacements @@ -228,29 +355,16 @@ class Message(basetypes.Serializable): class decoded(object): """ - A context manager that decodes a request or response, and then - re-encodes it with the same encoding after execution of the block. - - Example: - - .. code-block:: python - - with decoded(request): - request.content = request.content.replace("foo", "bar") + Deprecated: You can now directly use :py:attr:`content`. + :py:attr:`raw_content` has the encoded content. """ - def __init__(self, message): - self.message = message - ce = message.headers.get("content-encoding") - if ce in encoding.ENCODINGS: - self.ce = ce - else: - self.ce = None + def __init__(self, message): # pragma no cover + warnings.warn("decoded() is deprecated, you can now directly use .content instead. " + ".raw_content has the encoded content.", DeprecationWarning) - def __enter__(self): - if self.ce: - self.message.decode() + def __enter__(self): # pragma no cover + pass - def __exit__(self, type, value, tb): - if self.ce: - self.message.encode(self.ce) + def __exit__(self, type, value, tb): # pragma no cover + pass diff --git a/netlib/http/request.py b/netlib/http/request.py index c4c39942..ecaa9b79 100644 --- a/netlib/http/request.py +++ b/netlib/http/request.py @@ -5,7 +5,6 @@ import re import six from six.moves import urllib -from netlib import encoding from netlib import multidict from netlib import strutils from netlib.http import multipart @@ -56,6 +55,7 @@ class Request(message.Message): An HTTP request. """ def __init__(self, *args, **kwargs): + super(Request, self).__init__() self.data = RequestData(*args, **kwargs) def __repr__(self): @@ -339,7 +339,7 @@ class Request(message.Message): self.headers["accept-encoding"] = ( ', '.join( e - for e in encoding.ENCODINGS + for e in {"gzip", "identity", "deflate"} if e in accept_encoding ) ) @@ -359,7 +359,10 @@ class Request(message.Message): def _get_urlencoded_form(self): is_valid_content_type = "application/x-www-form-urlencoded" in self.headers.get("content-type", "").lower() if is_valid_content_type: - return tuple(netlib.http.url.decode(self.content)) + try: + return tuple(netlib.http.url.decode(self.content)) + except ValueError: + pass return () def _set_urlencoded_form(self, value): @@ -388,7 +391,10 @@ class Request(message.Message): def _get_multipart_form(self): is_valid_content_type = "multipart/form-data" in self.headers.get("content-type", "").lower() if is_valid_content_type: - return multipart.decode(self.headers, self.content) + try: + return multipart.decode(self.headers, self.content) + except ValueError: + pass return () def _set_multipart_form(self, value): diff --git a/netlib/http/response.py b/netlib/http/response.py index 7cfb55c8..85f54940 100644 --- a/netlib/http/response.py +++ b/netlib/http/response.py @@ -37,13 +37,14 @@ class Response(message.Message): An HTTP response. """ def __init__(self, *args, **kwargs): + super(Response, self).__init__() self.data = ResponseData(*args, **kwargs) def __repr__(self): - if self.content: + if self.raw_content: details = "{}, {}".format( self.headers.get("content-type", "unknown content type"), - human.pretty_size(len(self.content)) + human.pretty_size(len(self.raw_content)) ) else: details = "no content" diff --git a/netlib/strutils.py b/netlib/strutils.py index 9208f954..32e77927 100644 --- a/netlib/strutils.py +++ b/netlib/strutils.py @@ -57,8 +57,8 @@ def escape_control_characters(text, keep_spacing=True): Args: keep_spacing: If True, tabs and newlines will not be replaced. """ - # type: (six.text_type) -> six.text_type - if not isinstance(text, six.text_type): + # type: (six.string_types) -> six.text_type + if not isinstance(text, six.string_types): raise ValueError("text type must be unicode but is {}".format(type(text).__name__)) trans = _control_char_trans_newline if keep_spacing else _control_char_trans @@ -146,7 +146,7 @@ def hexdump(s): A generator of (offset, hex, str) tuples """ for i in range(0, len(s), 16): - offset = "{:0=10x}".format(i).encode() + offset = "{:0=10x}".format(i) part = s[i:i + 16] x = " ".join("{:0=2x}".format(i) for i in six.iterbytes(part)) x = x.ljust(47) # 16*2 + 15 diff --git a/netlib/utils.py b/netlib/utils.py index 23c16dc3..9eebf22c 100644 --- a/netlib/utils.py +++ b/netlib/utils.py @@ -56,6 +56,13 @@ class Data(object): dirname = os.path.dirname(inspect.getsourcefile(m)) self.dirname = os.path.abspath(dirname) + def push(self, subpath): + """ + Change the data object to a path relative to the module. + """ + self.dirname = os.path.join(self.dirname, subpath) + return self + def path(self, path): """ Returns a path to the package data housed at 'path' under this diff --git a/netlib/wsgi.py b/netlib/wsgi.py index c66fddc2..0def75b5 100644 --- a/netlib/wsgi.py +++ b/netlib/wsgi.py @@ -54,6 +54,10 @@ class WSGIAdaptor(object): self.app, self.domain, self.port, self.sversion = app, domain, port, sversion def make_environ(self, flow, errsoc, **extra): + """ + Raises: + ValueError, if the content-encoding is invalid. + """ path = strutils.native(flow.request.path, "latin-1") if '?' in path: path_info, query = strutils.native(path, "latin-1").split('?', 1) diff --git a/release/rtool.py b/release/rtool.py index 04e1249d..4e43eaef 100755 --- a/release/rtool.py +++ b/release/rtool.py @@ -76,7 +76,7 @@ def get_snapshot_version(): return "{version}dev{tag_dist:04}-0x{commit}".format( version=get_version(), # this should already be the next version tag_dist=tag_dist, - commit=commit + commit=commit.decode() ) @@ -2,13 +2,13 @@ from setuptools import setup, find_packages from codecs import open import os +from netlib import version + # Based on https://github.com/pypa/sampleproject/blob/master/setup.py # and https://python-packaging-user-guide.readthedocs.org/ here = os.path.abspath(os.path.dirname(__file__)) -from netlib import version - with open(os.path.join(here, 'README.rst'), encoding='utf-8') as f: long_description = f.read() @@ -32,6 +32,8 @@ setup( "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Security", @@ -70,9 +72,8 @@ setup( "html2text>=2016.1.8, <=2016.5.29", "hyperframe>=4.0.1, <5", "lxml>=3.5.0, <3.7", - "Pillow>=3.2, <3.3", + "Pillow>=3.2, <3.4", "passlib>=1.6.5, <1.7", - "psutil>=4.2, <4.4", "pyasn1>=0.1.9, <0.2", "pyOpenSSL>=16.0, <17.0", "pyparsing>=2.1.3, <2.2", @@ -99,10 +100,10 @@ setup( 'dev': [ "tox>=2.3, <3", "mock>=2.0, <2.1", - "pytest>=2.8.7, <2.10", - "pytest-cov>=2.2.1, <2.3", - "pytest-timeout>=1.0.0, <1.1", - "pytest-xdist>=1.14, <1.15", + "pytest>=2.8.7, <3", + "pytest-cov>=2.2.1, <3", + "pytest-timeout>=1.0.0, <2", + "pytest-xdist>=1.14, <2", "sphinx>=1.3.5, <1.5", "sphinx-autobuild>=0.5.2, <0.7", "sphinxcontrib-documentedlist>=0.4.0, <0.5", diff --git a/test/mitmproxy/builtins/__init__.py b/test/mitmproxy/builtins/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/mitmproxy/builtins/__init__.py diff --git a/test/mitmproxy/builtins/test_anticache.py b/test/mitmproxy/builtins/test_anticache.py new file mode 100644 index 00000000..127e1c1a --- /dev/null +++ b/test/mitmproxy/builtins/test_anticache.py @@ -0,0 +1,23 @@ +from .. import tutils, mastertest +from mitmproxy.builtins import anticache +from mitmproxy.flow import master +from mitmproxy.flow import state +from mitmproxy.flow import options + + +class TestAntiCache(mastertest.MasterTest): + def test_simple(self): + s = state.State() + m = master.FlowMaster(options.Options(anticache = True), None, s) + sa = anticache.AntiCache() + m.addons.add(sa) + + f = tutils.tflow(resp=True) + self.invoke(m, "request", f) + + f = tutils.tflow(resp=True) + f.request.headers["if-modified-since"] = "test" + f.request.headers["if-none-match"] = "test" + self.invoke(m, "request", f) + assert "if-modified-since" not in f.request.headers + assert "if-none-match" not in f.request.headers diff --git a/test/mitmproxy/builtins/test_anticomp.py b/test/mitmproxy/builtins/test_anticomp.py new file mode 100644 index 00000000..601e56c8 --- /dev/null +++ b/test/mitmproxy/builtins/test_anticomp.py @@ -0,0 +1,22 @@ +from .. import tutils, mastertest +from mitmproxy.builtins import anticomp +from mitmproxy.flow import master +from mitmproxy.flow import state +from mitmproxy.flow import options + + +class TestAntiComp(mastertest.MasterTest): + def test_simple(self): + s = state.State() + m = master.FlowMaster(options.Options(anticomp = True), None, s) + sa = anticomp.AntiComp() + m.addons.add(sa) + + f = tutils.tflow(resp=True) + self.invoke(m, "request", f) + + f = tutils.tflow(resp=True) + + f.request.headers["Accept-Encoding"] = "foobar" + self.invoke(m, "request", f) + assert f.request.headers["Accept-Encoding"] == "identity" diff --git a/test/mitmproxy/builtins/test_dumper.py b/test/mitmproxy/builtins/test_dumper.py new file mode 100644 index 00000000..57e3d036 --- /dev/null +++ b/test/mitmproxy/builtins/test_dumper.py @@ -0,0 +1,86 @@ +from .. import tutils, mastertest +from six.moves import cStringIO as StringIO + +from mitmproxy.builtins import dumper +from mitmproxy.flow import state +from mitmproxy import exceptions +from mitmproxy import dump +from mitmproxy import models +import netlib.tutils +import mock + + +class TestDumper(mastertest.MasterTest): + def test_simple(self): + d = dumper.Dumper() + sio = StringIO() + + d.configure(dump.Options(tfile = sio, flow_detail = 0)) + d.response(tutils.tflow()) + assert not sio.getvalue() + + d.configure(dump.Options(tfile = sio, flow_detail = 4)) + d.response(tutils.tflow()) + assert sio.getvalue() + + sio = StringIO() + d.configure(dump.Options(tfile = sio, flow_detail = 4)) + d.response(tutils.tflow(resp=True)) + assert "<<" in sio.getvalue() + + sio = StringIO() + d.configure(dump.Options(tfile = sio, flow_detail = 4)) + d.response(tutils.tflow(err=True)) + assert "<<" in sio.getvalue() + + sio = StringIO() + d.configure(dump.Options(tfile = sio, flow_detail = 4)) + flow = tutils.tflow() + flow.request = netlib.tutils.treq() + flow.request.stickycookie = True + flow.client_conn = mock.MagicMock() + flow.client_conn.address.host = "foo" + flow.response = netlib.tutils.tresp(content=None) + flow.response.is_replay = True + flow.response.status_code = 300 + d.response(flow) + assert sio.getvalue() + + sio = StringIO() + d.configure(dump.Options(tfile = sio, flow_detail = 4)) + flow = tutils.tflow(resp=netlib.tutils.tresp(content=b"{")) + flow.response.headers["content-type"] = "application/json" + flow.response.status_code = 400 + d.response(flow) + assert sio.getvalue() + + sio = StringIO() + d.configure(dump.Options(tfile = sio)) + flow = tutils.tflow() + flow.request.content = None + flow.response = models.HTTPResponse.wrap(netlib.tutils.tresp()) + flow.response.content = None + d.response(flow) + assert "content missing" in sio.getvalue() + + +class TestContentView(mastertest.MasterTest): + @mock.patch("mitmproxy.contentviews.get_content_view") + def test_contentview(self, get_content_view): + se = exceptions.ContentViewException(""), ("x", iter([])) + get_content_view.side_effect = se + + s = state.State() + sio = StringIO() + m = mastertest.RecordingMaster( + dump.Options( + flow_detail=4, + verbosity=3, + tfile=sio, + ), + None, s + ) + d = dumper.Dumper() + m.addons.add(d) + self.invoke(m, "response", tutils.tflow()) + assert "Content viewer failed" in m.event_log[0][1] diff --git a/test/mitmproxy/builtins/test_filestreamer.py b/test/mitmproxy/builtins/test_filestreamer.py new file mode 100644 index 00000000..002006b7 --- /dev/null +++ b/test/mitmproxy/builtins/test_filestreamer.py @@ -0,0 +1,46 @@ +from __future__ import absolute_import, print_function, division + +from .. import tutils, mastertest + +import os.path + +from mitmproxy.builtins import filestreamer +from mitmproxy.flow import master, FlowReader +from mitmproxy.flow import state +from mitmproxy.flow import options + + +class TestStream(mastertest.MasterTest): + def test_stream(self): + with tutils.tmpdir() as tdir: + p = os.path.join(tdir, "foo") + + def r(): + r = FlowReader(open(p, "rb")) + return list(r.stream()) + + s = state.State() + m = master.FlowMaster( + options.Options( + outfile = (p, "wb") + ), + None, + s + ) + sa = filestreamer.FileStreamer() + + m.addons.add(sa) + f = tutils.tflow(resp=True) + self.invoke(m, "request", f) + self.invoke(m, "response", f) + m.addons.remove(sa) + + assert r()[0].response + + m.options.outfile = (p, "ab") + + m.addons.add(sa) + f = tutils.tflow() + self.invoke(m, "request", f) + m.addons.remove(sa) + assert not r()[1].response diff --git a/test/mitmproxy/builtins/test_replace.py b/test/mitmproxy/builtins/test_replace.py new file mode 100644 index 00000000..f8010bec --- /dev/null +++ b/test/mitmproxy/builtins/test_replace.py @@ -0,0 +1,52 @@ +from .. import tutils, mastertest +from mitmproxy.builtins import replace +from mitmproxy.flow import master +from mitmproxy.flow import state +from mitmproxy.flow import options + + +class TestReplace(mastertest.MasterTest): + def test_configure(self): + r = replace.Replace() + r.configure(options.Options( + replacements=[("one", "two", "three")] + )) + tutils.raises( + "invalid filter pattern", + r.configure, + options.Options( + replacements=[("~b", "two", "three")] + ) + ) + tutils.raises( + "invalid regular expression", + r.configure, + options.Options( + replacements=[("foo", "+", "three")] + ) + ) + + def test_simple(self): + s = state.State() + m = master.FlowMaster( + options.Options( + replacements = [ + ("~q", "foo", "bar"), + ("~s", "foo", "bar"), + ] + ), + None, + s + ) + sa = replace.Replace() + m.addons.add(sa) + + f = tutils.tflow() + f.request.content = b"foo" + self.invoke(m, "request", f) + assert f.request.content == b"bar" + + f = tutils.tflow(resp=True) + f.response.content = b"foo" + self.invoke(m, "response", f) + assert f.response.content == b"bar" diff --git a/test/mitmproxy/builtins/test_script.py b/test/mitmproxy/builtins/test_script.py new file mode 100644 index 00000000..c9616249 --- /dev/null +++ b/test/mitmproxy/builtins/test_script.py @@ -0,0 +1,191 @@ +import time + +from mitmproxy.builtins import script +from mitmproxy import exceptions +from mitmproxy.flow import master +from mitmproxy.flow import state +from mitmproxy.flow import options + +from .. import tutils, mastertest + + +class TestParseCommand: + def test_empty_command(self): + with tutils.raises(exceptions.AddonError): + script.parse_command("") + + with tutils.raises(exceptions.AddonError): + script.parse_command(" ") + + def test_no_script_file(self): + with tutils.raises("not found"): + script.parse_command("notfound") + + with tutils.tmpdir() as dir: + with tutils.raises("not a file"): + script.parse_command(dir) + + def test_parse_args(self): + with tutils.chdir(tutils.test_data.dirname): + assert script.parse_command("data/addonscripts/recorder.py") == ("data/addonscripts/recorder.py", []) + assert script.parse_command("data/addonscripts/recorder.py foo bar") == ("data/addonscripts/recorder.py", ["foo", "bar"]) + assert script.parse_command("data/addonscripts/recorder.py 'foo bar'") == ("data/addonscripts/recorder.py", ["foo bar"]) + + @tutils.skip_not_windows + def test_parse_windows(self): + with tutils.chdir(tutils.test_data.dirname): + assert script.parse_command( + "data\\addonscripts\\recorder.py" + ) == ("data\\addonscripts\\recorder.py", []) + assert script.parse_command( + "data\\addonscripts\\recorder.py 'foo \\ bar'" + ) == ("data\\addonscripts\\recorder.py", ['foo \\ bar']) + + +def test_load_script(): + ns = script.load_script( + tutils.test_data.path( + "data/addonscripts/recorder.py" + ), [] + ) + assert ns["configure"] + + +class TestScript(mastertest.MasterTest): + def test_simple(self): + s = state.State() + m = master.FlowMaster(options.Options(), None, s) + sc = script.Script( + tutils.test_data.path( + "data/addonscripts/recorder.py" + ) + ) + m.addons.add(sc) + assert sc.ns["call_log"] == [ + ("solo", "start", (), {}), + ("solo", "configure", (options.Options(),), {}) + ] + + sc.ns["call_log"] = [] + f = tutils.tflow(resp=True) + self.invoke(m, "request", f) + + recf = sc.ns["call_log"][0] + assert recf[1] == "request" + + def test_reload(self): + s = state.State() + m = mastertest.RecordingMaster(options.Options(), None, s) + with tutils.tmpdir(): + with open("foo.py", "w"): + pass + sc = script.Script("foo.py") + m.addons.add(sc) + + for _ in range(100): + with open("foo.py", "a") as f: + f.write(".") + m.addons.invoke_with_context(sc, "tick") + time.sleep(0.1) + if m.event_log: + return + raise AssertionError("Change event not detected.") + + def test_exception(self): + s = state.State() + m = mastertest.RecordingMaster(options.Options(), None, s) + sc = script.Script( + tutils.test_data.path("data/addonscripts/error.py") + ) + m.addons.add(sc) + f = tutils.tflow(resp=True) + self.invoke(m, "request", f) + assert m.event_log[0][0] == "error" + + def test_duplicate_flow(self): + s = state.State() + fm = master.FlowMaster(None, None, s) + fm.addons.add( + script.Script( + tutils.test_data.path("data/addonscripts/duplicate_flow.py") + ) + ) + f = tutils.tflow() + fm.request(f) + assert fm.state.flow_count() == 2 + assert not fm.state.view[0].request.is_replay + assert fm.state.view[1].request.is_replay + + +class TestScriptLoader(mastertest.MasterTest): + def test_simple(self): + s = state.State() + o = options.Options(scripts=[]) + m = master.FlowMaster(o, None, s) + sc = script.ScriptLoader() + m.addons.add(sc) + assert len(m.addons) == 1 + o.update( + scripts = [ + tutils.test_data.path("data/addonscripts/recorder.py") + ] + ) + assert len(m.addons) == 2 + o.update(scripts = []) + assert len(m.addons) == 1 + + def test_dupes(self): + s = state.State() + o = options.Options(scripts=["one", "one"]) + m = master.FlowMaster(o, None, s) + sc = script.ScriptLoader() + tutils.raises(exceptions.OptionsError, m.addons.add, sc) + + def test_order(self): + rec = tutils.test_data.path("data/addonscripts/recorder.py") + + s = state.State() + o = options.Options( + scripts = [ + "%s %s" % (rec, "a"), + "%s %s" % (rec, "b"), + "%s %s" % (rec, "c"), + ] + ) + m = mastertest.RecordingMaster(o, None, s) + sc = script.ScriptLoader() + m.addons.add(sc) + + debug = [(i[0], i[1]) for i in m.event_log if i[0] == "debug"] + assert debug == [ + ('debug', 'a start'), ('debug', 'a configure'), + ('debug', 'b start'), ('debug', 'b configure'), + ('debug', 'c start'), ('debug', 'c configure') + ] + m.event_log[:] = [] + + o.scripts = [ + "%s %s" % (rec, "c"), + "%s %s" % (rec, "a"), + "%s %s" % (rec, "b"), + ] + debug = [(i[0], i[1]) for i in m.event_log if i[0] == "debug"] + assert debug == [ + ('debug', 'c configure'), + ('debug', 'a configure'), + ('debug', 'b configure'), + ] + m.event_log[:] = [] + + o.scripts = [ + "%s %s" % (rec, "x"), + "%s %s" % (rec, "a"), + ] + debug = [(i[0], i[1]) for i in m.event_log if i[0] == "debug"] + assert debug == [ + ('debug', 'c done'), + ('debug', 'b done'), + ('debug', 'x start'), + ('debug', 'x configure'), + ('debug', 'a configure'), + ] diff --git a/test/mitmproxy/builtins/test_setheaders.py b/test/mitmproxy/builtins/test_setheaders.py new file mode 100644 index 00000000..1a8d048c --- /dev/null +++ b/test/mitmproxy/builtins/test_setheaders.py @@ -0,0 +1,64 @@ +from .. import tutils, mastertest + +from mitmproxy.builtins import setheaders +from mitmproxy.flow import state +from mitmproxy.flow import options + + +class TestSetHeaders(mastertest.MasterTest): + def mkmaster(self, **opts): + s = state.State() + m = mastertest.RecordingMaster(options.Options(**opts), None, s) + sh = setheaders.SetHeaders() + m.addons.add(sh) + return m, sh + + def test_configure(self): + sh = setheaders.SetHeaders() + tutils.raises( + "invalid setheader filter pattern", + sh.configure, + options.Options( + setheaders = [("~b", "one", "two")] + ) + ) + + def test_setheaders(self): + m, sh = self.mkmaster( + setheaders = [ + ("~q", "one", "two"), + ("~s", "one", "three") + ] + ) + f = tutils.tflow() + f.request.headers["one"] = "xxx" + self.invoke(m, "request", f) + assert f.request.headers["one"] == "two" + + f = tutils.tflow(resp=True) + f.response.headers["one"] = "xxx" + self.invoke(m, "response", f) + assert f.response.headers["one"] == "three" + + m, sh = self.mkmaster( + setheaders = [ + ("~s", "one", "two"), + ("~s", "one", "three") + ] + ) + f = tutils.tflow(resp=True) + f.request.headers["one"] = "xxx" + f.response.headers["one"] = "xxx" + self.invoke(m, "response", f) + assert f.response.headers.get_all("one") == ["two", "three"] + + m, sh = self.mkmaster( + setheaders = [ + ("~q", "one", "two"), + ("~q", "one", "three") + ] + ) + f = tutils.tflow() + f.request.headers["one"] = "xxx" + self.invoke(m, "request", f) + assert f.request.headers.get_all("one") == ["two", "three"] diff --git a/test/mitmproxy/builtins/test_stickyauth.py b/test/mitmproxy/builtins/test_stickyauth.py new file mode 100644 index 00000000..1e617402 --- /dev/null +++ b/test/mitmproxy/builtins/test_stickyauth.py @@ -0,0 +1,23 @@ +from .. import tutils, mastertest +from mitmproxy.builtins import stickyauth +from mitmproxy.flow import master +from mitmproxy.flow import state +from mitmproxy.flow import options + + +class TestStickyAuth(mastertest.MasterTest): + def test_simple(self): + s = state.State() + m = master.FlowMaster(options.Options(stickyauth = ".*"), None, s) + sa = stickyauth.StickyAuth() + m.addons.add(sa) + + f = tutils.tflow(resp=True) + f.request.headers["authorization"] = "foo" + self.invoke(m, "request", f) + + assert "address" in sa.hosts + + f = tutils.tflow(resp=True) + self.invoke(m, "request", f) + assert f.request.headers["authorization"] == "foo" diff --git a/test/mitmproxy/builtins/test_stickycookie.py b/test/mitmproxy/builtins/test_stickycookie.py new file mode 100644 index 00000000..b8d703bd --- /dev/null +++ b/test/mitmproxy/builtins/test_stickycookie.py @@ -0,0 +1,131 @@ +from .. import tutils, mastertest +from mitmproxy.builtins import stickycookie +from mitmproxy.flow import master +from mitmproxy.flow import state +from mitmproxy.flow import options +from netlib import tutils as ntutils + + +def test_domain_match(): + assert stickycookie.domain_match("www.google.com", ".google.com") + assert stickycookie.domain_match("google.com", ".google.com") + + +class TestStickyCookie(mastertest.MasterTest): + def mk(self): + s = state.State() + m = master.FlowMaster(options.Options(stickycookie = ".*"), None, s) + sc = stickycookie.StickyCookie() + m.addons.add(sc) + return s, m, sc + + def test_config(self): + sc = stickycookie.StickyCookie() + tutils.raises( + "invalid filter", + sc.configure, + options.Options(stickycookie = "~b") + ) + + def test_simple(self): + s, m, sc = self.mk() + m.addons.add(sc) + + f = tutils.tflow(resp=True) + f.response.headers["set-cookie"] = "foo=bar" + self.invoke(m, "request", f) + + f.reply.acked = False + self.invoke(m, "response", f) + + assert sc.jar + assert "cookie" not in f.request.headers + + f = f.copy() + f.reply.acked = False + self.invoke(m, "request", f) + assert f.request.headers["cookie"] == "foo=bar" + + def _response(self, s, m, sc, cookie, host): + f = tutils.tflow(req=ntutils.treq(host=host, port=80), resp=True) + f.response.headers["Set-Cookie"] = cookie + self.invoke(m, "response", f) + return f + + def test_response(self): + s, m, sc = self.mk() + + c = "SSID=mooo; domain=.google.com, FOO=bar; Domain=.google.com; Path=/; " \ + "Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; " + + self._response(s, m, sc, c, "host") + assert not sc.jar.keys() + + self._response(s, m, sc, c, "www.google.com") + assert sc.jar.keys() + + sc.jar.clear() + self._response( + s, m, sc, "SSID=mooo", "www.google.com" + ) + assert list(sc.jar.keys())[0] == ('www.google.com', 80, '/') + + def test_response_multiple(self): + s, m, sc = self.mk() + + # Test setting of multiple cookies + c1 = "somecookie=test; Path=/" + c2 = "othercookie=helloworld; Path=/" + f = self._response(s, m, sc, c1, "www.google.com") + f.response.headers["Set-Cookie"] = c2 + self.invoke(m, "response", f) + googlekey = list(sc.jar.keys())[0] + assert len(sc.jar[googlekey].keys()) == 2 + + def test_response_weird(self): + s, m, sc = self.mk() + + # Test setting of weird cookie keys + f = tutils.tflow(req=ntutils.treq(host="www.google.com", port=80), resp=True) + cs = [ + "foo/bar=hello", + "foo:bar=world", + "foo@bar=fizz", + "foo,bar=buzz", + ] + for c in cs: + f.response.headers["Set-Cookie"] = c + self.invoke(m, "response", f) + googlekey = list(sc.jar.keys())[0] + assert len(sc.jar[googlekey].keys()) == len(cs) + + def test_response_overwrite(self): + s, m, sc = self.mk() + + # Test overwriting of a cookie value + c1 = "somecookie=helloworld; Path=/" + c2 = "somecookie=newvalue; Path=/" + f = self._response(s, m, sc, c1, "www.google.com") + f.response.headers["Set-Cookie"] = c2 + self.invoke(m, "response", f) + googlekey = list(sc.jar.keys())[0] + assert len(sc.jar[googlekey].keys()) == 1 + assert list(sc.jar[googlekey]["somecookie"].items())[0][1] == "newvalue" + + def test_response_delete(self): + s, m, sc = self.mk() + + # Test that a cookie is be deleted + # by setting the expire time in the past + f = self._response(s, m, sc, "duffer=zafar; Path=/", "www.google.com") + f.response.headers["Set-Cookie"] = "duffer=; Expires=Thu, 01-Jan-1970 00:00:00 GMT" + self.invoke(m, "response", f) + assert not sc.jar.keys() + + def test_request(self): + s, m, sc = self.mk() + + f = self._response(s, m, sc, "SSID=mooo", "www.google.com") + assert "cookie" not in f.request.headers + self.invoke(m, "request", f) + assert "cookie" in f.request.headers diff --git a/test/mitmproxy/console/test_master.py b/test/mitmproxy/console/test_master.py index 33261c28..b84e4c1c 100644 --- a/test/mitmproxy/console/test_master.py +++ b/test/mitmproxy/console/test_master.py @@ -111,12 +111,14 @@ def test_options(): class TestMaster(mastertest.MasterTest): - def mkmaster(self, filt, **options): - o = console.master.Options(filtstr=filt, **options) + def mkmaster(self, **options): + if "verbosity" not in options: + options["verbosity"] = 0 + o = console.master.Options(**options) return console.master.ConsoleMaster(None, o) def test_basic(self): - m = self.mkmaster(None) + m = self.mkmaster() for i in (1, 2, 3): - self.dummy_cycle(m, 1, "") + self.dummy_cycle(m, 1, b"") assert len(m.state.flows) == i diff --git a/test/mitmproxy/data/scripts/concurrent_decorator.py b/test/mitmproxy/data/addonscripts/concurrent_decorator.py index e017f605..a56c2af1 100644 --- a/test/mitmproxy/data/scripts/concurrent_decorator.py +++ b/test/mitmproxy/data/addonscripts/concurrent_decorator.py @@ -1,7 +1,6 @@ import time from mitmproxy.script import concurrent - @concurrent -def request(context, flow): +def request(flow): time.sleep(0.1) diff --git a/test/mitmproxy/data/scripts/concurrent_decorator_err.py b/test/mitmproxy/data/addonscripts/concurrent_decorator_err.py index 349e5dd6..756869c8 100644 --- a/test/mitmproxy/data/scripts/concurrent_decorator_err.py +++ b/test/mitmproxy/data/addonscripts/concurrent_decorator_err.py @@ -2,5 +2,5 @@ from mitmproxy.script import concurrent @concurrent -def start(context): +def start(): pass diff --git a/test/mitmproxy/data/addonscripts/duplicate_flow.py b/test/mitmproxy/data/addonscripts/duplicate_flow.py new file mode 100644 index 00000000..b466423c --- /dev/null +++ b/test/mitmproxy/data/addonscripts/duplicate_flow.py @@ -0,0 +1,6 @@ +from mitmproxy import ctx + + +def request(flow): + f = ctx.master.duplicate_flow(flow) + ctx.master.replay_request(f, block=True) diff --git a/test/mitmproxy/data/addonscripts/error.py b/test/mitmproxy/data/addonscripts/error.py new file mode 100644 index 00000000..8ece9fce --- /dev/null +++ b/test/mitmproxy/data/addonscripts/error.py @@ -0,0 +1,7 @@ + +def mkerr(): + raise ValueError("Error!") + + +def request(flow): + mkerr() diff --git a/test/mitmproxy/data/addonscripts/recorder.py b/test/mitmproxy/data/addonscripts/recorder.py new file mode 100644 index 00000000..b6ac8d89 --- /dev/null +++ b/test/mitmproxy/data/addonscripts/recorder.py @@ -0,0 +1,25 @@ +from mitmproxy import controller +from mitmproxy import ctx +import sys + +call_log = [] + +if len(sys.argv) > 1: + name = sys.argv[1] +else: + name = "solo" + +# Keep a log of all possible event calls +evts = list(controller.Events) + ["configure"] +for i in evts: + def mkprox(): + evt = i + + def prox(*args, **kwargs): + lg = (name, evt, args, kwargs) + if evt != "log": + ctx.log.info(str(lg)) + call_log.append(lg) + ctx.log.debug("%s %s" % (name, evt)) + return prox + globals()[i] = mkprox() diff --git a/test/mitmproxy/data/scripts/stream_modify.py b/test/mitmproxy/data/addonscripts/stream_modify.py index 8221b0dd..bc616342 100644 --- a/test/mitmproxy/data/scripts/stream_modify.py +++ b/test/mitmproxy/data/addonscripts/stream_modify.py @@ -1,7 +1,8 @@ + def modify(chunks): for chunk in chunks: yield chunk.replace(b"foo", b"bar") -def responseheaders(context, flow): +def responseheaders(flow): flow.response.stream = modify diff --git a/test/mitmproxy/data/scripts/tcp_stream_modify.py b/test/mitmproxy/data/addonscripts/tcp_stream_modify.py index 0965beba..af4ccf7e 100644 --- a/test/mitmproxy/data/scripts/tcp_stream_modify.py +++ b/test/mitmproxy/data/addonscripts/tcp_stream_modify.py @@ -1,4 +1,5 @@ -def tcp_message(ctx, flow): + +def tcp_message(flow): message = flow.messages[-1] if not message.from_client: message.content = message.content.replace(b"foo", b"bar") diff --git a/test/mitmproxy/data/dumpfile-010 b/test/mitmproxy/data/dumpfile-010 Binary files differnew file mode 100644 index 00000000..435795bf --- /dev/null +++ b/test/mitmproxy/data/dumpfile-010 diff --git a/test/mitmproxy/data/dumpfile-011 b/test/mitmproxy/data/dumpfile-011 Binary files differnew file mode 100644 index 00000000..2534ad89 --- /dev/null +++ b/test/mitmproxy/data/dumpfile-011 diff --git a/test/mitmproxy/data/dumpfile-012 b/test/mitmproxy/data/dumpfile-012 deleted file mode 100644 index 49c2350d..00000000 --- a/test/mitmproxy/data/dumpfile-012 +++ /dev/null @@ -1,35 +0,0 @@ -4092:8:response,491:11:httpversion,8:1:1#1:1#]13:timestamp_end,14:1449080668.874^3:msg,12:Not Modified,15:timestamp_start,14:1449080668.863^7:headers,330:35:13:Cache-Control,14:max-age=604800,]40:4:Date,29:Wed, 02 Dec 2015 18:24:32 GMT,]32:4:Etag,21:"359670651+gzip+gzip",]43:7:Expires,29:Wed, 09 Dec 2015 18:24:32 GMT,]50:13:Last-Modified,29:Fri, 09 Aug 2013 23:54:35 GMT,]27:6:Server,14:ECS (lga/1312),]26:4:Vary,15:Accept-Encoding,]16:7:X-Cache,3:HIT,]25:17:x-ec-custom-error,1:1,]]7:content,0:,4:code,3:304#}4:type,4:http,2:id,36:d209a4fc-8e12-43cb-9250-b0b052d2caf8,5:error,0:~7:version,9:1:0#2:12#]11:client_conn,208:15:ssl_established,4:true!10:clientcert,0:~13:timestamp_end,0:~19:timestamp_ssl_setup,14:1449080668.754^7:address,53:7:address,20:9:127.0.0.1,5:58199#]8:use_ipv6,5:false!}15:timestamp_start,14:1449080666.523^}11:server_conn,2479:15:ssl_established,4:true!14:source_address,57:7:address,24:12:10.67.56.236,5:58201#]8:use_ipv6,5:false!}13:timestamp_end,0:~7:address,54:7:address,21:11:example.com,3:443#]8:use_ipv6,5:false!}15:timestamp_start,14:1449080668.046^3:sni,11:example.com,4:cert,2122:-----BEGIN CERTIFICATE----- -MIIF8jCCBNqgAwIBAgIQDmTF+8I2reFLFyrrQceMsDANBgkqhkiG9w0BAQsFADBw -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz -dXJhbmNlIFNlcnZlciBDQTAeFw0xNTExMDMwMDAwMDBaFw0xODExMjgxMjAwMDBa -MIGlMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxML -TG9zIEFuZ2VsZXMxPDA6BgNVBAoTM0ludGVybmV0IENvcnBvcmF0aW9uIGZvciBB -c3NpZ25lZCBOYW1lcyBhbmQgTnVtYmVyczETMBEGA1UECxMKVGVjaG5vbG9neTEY -MBYGA1UEAxMPd3d3LmV4YW1wbGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAs0CWL2FjPiXBl61lRfvvE0KzLJmG9LWAC3bcBjgsH6NiVVo2dt6u -Xfzi5bTm7F3K7srfUBYkLO78mraM9qizrHoIeyofrV/n+pZZJauQsPjCPxMEJnRo -D8Z4KpWKX0LyDu1SputoI4nlQ/htEhtiQnuoBfNZxF7WxcxGwEsZuS1KcXIkHl5V -RJOreKFHTaXcB1qcZ/QRaBIv0yhxvK1yBTwWddT4cli6GfHcCe3xGMaSL328Fgs3 -jYrvG29PueB6VJi/tbbPu6qTfwp/H1brqdjh29U52Bhb0fJkM9DWxCP/Cattcc7a -z8EXnCO+LK8vkhw/kAiJWPKx4RBvgy73nwIDAQABo4ICUDCCAkwwHwYDVR0jBBgw -FoAUUWj/kK8CB3U8zNllZGKiErhZcjswHQYDVR0OBBYEFKZPYB4fLdHn8SOgKpUW -5Oia6m5IMIGBBgNVHREEejB4gg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUuY29t -ggtleGFtcGxlLmVkdYILZXhhbXBsZS5uZXSCC2V4YW1wbGUub3Jngg93d3cuZXhh -bXBsZS5jb22CD3d3dy5leGFtcGxlLmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1Ud -DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdQYDVR0f -BG4wbDA0oDKgMIYuaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItaGEtc2Vy -dmVyLWc0LmNybDA0oDKgMIYuaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTIt -aGEtc2VydmVyLWc0LmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwBATAqMCgGCCsG -AQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgGBmeBDAECAjCB -gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy -dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E -aWdpQ2VydFNIQTJIaWdoQXNzdXJhbmNlU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQC -MAAwDQYJKoZIhvcNAQELBQADggEBAISomhGn2L0LJn5SJHuyVZ3qMIlRCIdvqe0Q -6ls+C8ctRwRO3UU3x8q8OH+2ahxlQmpzdC5al4XQzJLiLjiJ2Q1p+hub8MFiMmVP -PZjb2tZm2ipWVuMRM+zgpRVM6nVJ9F3vFfUSHOb4/JsEIUvPY+d8/Krc+kPQwLvy -ieqRbcuFjmqfyPmUv1U9QoI4TQikpw7TZU0zYZANP4C/gj4Ry48/znmUaRvy2kvI -l7gRQ21qJTK5suoiYoYNo3J9T+pXPGU7Lydz/HwW+w0DpArtAaukI8aNX4ohFUKS -wDSiIIWIWJiJGbEeIO0TIFwEVWTOnbNl/faPXpk5IRXicapqiII= ------END CERTIFICATE----- -,19:timestamp_ssl_setup,14:1449080668.358^5:state,0:]19:timestamp_tcp_setup,14:1449080668.177^}11:intercepted,5:false!7:request,727:9:is_replay,5:false!4:port,3:443#6:scheme,5:https,6:method,3:GET,4:path,1:/,8:form_out,8:relative,11:httpversion,8:1:1#1:1#]4:host,11:example.com,7:headers,460:22:4:Host,11:example.com,]91:10:User-Agent,73:Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0,]76:6:Accept,63:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,]46:15:Accept-Language,23:de,en-US;q=0.7,en;q=0.3,]36:15:Accept-Encoding,13:gzip, deflate,]28:10:Connection,10:keep-alive,]54:17:If-Modified-Since,29:Fri, 09 Aug 2013 23:54:35 GMT,]42:13:If-None-Match,21:"359670651+gzip+gzip",]29:13:Cache-Control,9:max-age=0,]]7:content,0:,7:form_in,8:relative,15:timestamp_start,14:1449080668.754^13:timestamp_end,14:1449080668.757^}}
\ No newline at end of file diff --git a/test/mitmproxy/data/dumpfile-013 b/test/mitmproxy/data/dumpfile-013 deleted file mode 100644 index ede06f23..00000000 --- a/test/mitmproxy/data/dumpfile-013 +++ /dev/null @@ -1,35 +0,0 @@ -4092:8:response,491:11:httpversion,8:1:1#1:1#]13:timestamp_end,14:1449080668.874^3:msg,12:Not Modified,15:timestamp_start,14:1449080668.863^7:headers,330:35:13:Cache-Control,14:max-age=604800,]40:4:Date,29:Wed, 02 Dec 2015 18:24:32 GMT,]32:4:Etag,21:"359670651+gzip+gzip",]43:7:Expires,29:Wed, 09 Dec 2015 18:24:32 GMT,]50:13:Last-Modified,29:Fri, 09 Aug 2013 23:54:35 GMT,]27:6:Server,14:ECS (lga/1312),]26:4:Vary,15:Accept-Encoding,]16:7:X-Cache,3:HIT,]25:17:x-ec-custom-error,1:1,]]7:content,0:,4:code,3:304#}4:type,4:http,2:id,36:d209a4fc-8e12-43cb-9250-b0b052d2caf8,5:error,0:~7:version,9:1:0#2:13#]11:client_conn,208:15:ssl_established,4:true!10:clientcert,0:~13:timestamp_end,0:~19:timestamp_ssl_setup,14:1449080668.754^7:address,53:7:address,20:9:127.0.0.1,5:58199#]8:use_ipv6,5:false!}15:timestamp_start,14:1449080666.523^}11:server_conn,2479:15:ssl_established,4:true!14:source_address,57:7:address,24:12:10.67.56.236,5:58201#]8:use_ipv6,5:false!}13:timestamp_end,0:~7:address,54:7:address,21:11:example.com,3:443#]8:use_ipv6,5:false!}15:timestamp_start,14:1449080668.046^3:sni,11:example.com,4:cert,2122:-----BEGIN CERTIFICATE----- -MIIF8jCCBNqgAwIBAgIQDmTF+8I2reFLFyrrQceMsDANBgkqhkiG9w0BAQsFADBw -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz -dXJhbmNlIFNlcnZlciBDQTAeFw0xNTExMDMwMDAwMDBaFw0xODExMjgxMjAwMDBa -MIGlMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxML -TG9zIEFuZ2VsZXMxPDA6BgNVBAoTM0ludGVybmV0IENvcnBvcmF0aW9uIGZvciBB -c3NpZ25lZCBOYW1lcyBhbmQgTnVtYmVyczETMBEGA1UECxMKVGVjaG5vbG9neTEY -MBYGA1UEAxMPd3d3LmV4YW1wbGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAs0CWL2FjPiXBl61lRfvvE0KzLJmG9LWAC3bcBjgsH6NiVVo2dt6u -Xfzi5bTm7F3K7srfUBYkLO78mraM9qizrHoIeyofrV/n+pZZJauQsPjCPxMEJnRo -D8Z4KpWKX0LyDu1SputoI4nlQ/htEhtiQnuoBfNZxF7WxcxGwEsZuS1KcXIkHl5V -RJOreKFHTaXcB1qcZ/QRaBIv0yhxvK1yBTwWddT4cli6GfHcCe3xGMaSL328Fgs3 -jYrvG29PueB6VJi/tbbPu6qTfwp/H1brqdjh29U52Bhb0fJkM9DWxCP/Cattcc7a -z8EXnCO+LK8vkhw/kAiJWPKx4RBvgy73nwIDAQABo4ICUDCCAkwwHwYDVR0jBBgw -FoAUUWj/kK8CB3U8zNllZGKiErhZcjswHQYDVR0OBBYEFKZPYB4fLdHn8SOgKpUW -5Oia6m5IMIGBBgNVHREEejB4gg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUuY29t -ggtleGFtcGxlLmVkdYILZXhhbXBsZS5uZXSCC2V4YW1wbGUub3Jngg93d3cuZXhh -bXBsZS5jb22CD3d3dy5leGFtcGxlLmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1Ud -DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdQYDVR0f -BG4wbDA0oDKgMIYuaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItaGEtc2Vy -dmVyLWc0LmNybDA0oDKgMIYuaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTIt -aGEtc2VydmVyLWc0LmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwBATAqMCgGCCsG -AQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgGBmeBDAECAjCB -gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy -dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E -aWdpQ2VydFNIQTJIaWdoQXNzdXJhbmNlU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQC -MAAwDQYJKoZIhvcNAQELBQADggEBAISomhGn2L0LJn5SJHuyVZ3qMIlRCIdvqe0Q -6ls+C8ctRwRO3UU3x8q8OH+2ahxlQmpzdC5al4XQzJLiLjiJ2Q1p+hub8MFiMmVP -PZjb2tZm2ipWVuMRM+zgpRVM6nVJ9F3vFfUSHOb4/JsEIUvPY+d8/Krc+kPQwLvy -ieqRbcuFjmqfyPmUv1U9QoI4TQikpw7TZU0zYZANP4C/gj4Ry48/znmUaRvy2kvI -l7gRQ21qJTK5suoiYoYNo3J9T+pXPGU7Lydz/HwW+w0DpArtAaukI8aNX4ohFUKS -wDSiIIWIWJiJGbEeIO0TIFwEVWTOnbNl/faPXpk5IRXicapqiII= ------END CERTIFICATE----- -,19:timestamp_ssl_setup,14:1449080668.358^5:state,0:]19:timestamp_tcp_setup,14:1449080668.177^}11:intercepted,5:false!7:request,727:9:is_replay,5:false!4:port,3:443#6:scheme,5:https,6:method,3:GET,4:path,1:/,8:form_out,8:relative,11:httpversion,8:1:1#1:1#]4:host,11:example.com,7:headers,460:22:4:Host,11:example.com,]91:10:User-Agent,73:Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0,]76:6:Accept,63:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,]46:15:Accept-Language,23:de,en-US;q=0.7,en;q=0.3,]36:15:Accept-Encoding,13:gzip, deflate,]28:10:Connection,10:keep-alive,]54:17:If-Modified-Since,29:Fri, 09 Aug 2013 23:54:35 GMT,]42:13:If-None-Match,21:"359670651+gzip+gzip",]29:13:Cache-Control,9:max-age=0,]]7:content,0:,7:form_in,8:relative,15:timestamp_start,14:1449080668.754^13:timestamp_end,14:1449080668.757^}}
\ No newline at end of file diff --git a/test/mitmproxy/data/scripts/a.py b/test/mitmproxy/data/scripts/a.py deleted file mode 100644 index 33dbaa64..00000000 --- a/test/mitmproxy/data/scripts/a.py +++ /dev/null @@ -1,20 +0,0 @@ -import sys - -from a_helper import parser - -var = 0 - - -def start(ctx): - global var - var = parser.parse_args(sys.argv[1:]).var - - -def here(ctx): - global var - var += 1 - return var - - -def errargs(): - pass diff --git a/test/mitmproxy/data/scripts/a_helper.py b/test/mitmproxy/data/scripts/a_helper.py deleted file mode 100644 index e1f1c649..00000000 --- a/test/mitmproxy/data/scripts/a_helper.py +++ /dev/null @@ -1,4 +0,0 @@ -import argparse - -parser = argparse.ArgumentParser() -parser.add_argument('--var', type=int) diff --git a/test/mitmproxy/data/scripts/all.py b/test/mitmproxy/data/scripts/all.py index dad2aade..bf8e93ec 100644 --- a/test/mitmproxy/data/scripts/all.py +++ b/test/mitmproxy/data/scripts/all.py @@ -1,36 +1,37 @@ +import mitmproxy log = [] -def clientconnect(ctx, cc): - ctx.log("XCLIENTCONNECT") +def clientconnect(cc): + mitmproxy.ctx.log("XCLIENTCONNECT") log.append("clientconnect") -def serverconnect(ctx, cc): - ctx.log("XSERVERCONNECT") +def serverconnect(cc): + mitmproxy.ctx.log("XSERVERCONNECT") log.append("serverconnect") -def request(ctx, f): - ctx.log("XREQUEST") +def request(f): + mitmproxy.ctx.log("XREQUEST") log.append("request") -def response(ctx, f): - ctx.log("XRESPONSE") +def response(f): + mitmproxy.ctx.log("XRESPONSE") log.append("response") -def responseheaders(ctx, f): - ctx.log("XRESPONSEHEADERS") +def responseheaders(f): + mitmproxy.ctx.log("XRESPONSEHEADERS") log.append("responseheaders") -def clientdisconnect(ctx, cc): - ctx.log("XCLIENTDISCONNECT") +def clientdisconnect(cc): + mitmproxy.ctx.log("XCLIENTDISCONNECT") log.append("clientdisconnect") -def error(ctx, cc): - ctx.log("XERROR") +def error(cc): + mitmproxy.ctx.log("XERROR") log.append("error") diff --git a/test/mitmproxy/data/scripts/duplicate_flow.py b/test/mitmproxy/data/scripts/duplicate_flow.py deleted file mode 100644 index e13af786..00000000 --- a/test/mitmproxy/data/scripts/duplicate_flow.py +++ /dev/null @@ -1,4 +0,0 @@ - -def request(ctx, f): - f = ctx.duplicate_flow(f) - ctx.replay_request(f) diff --git a/test/mitmproxy/data/scripts/loaderr.py b/test/mitmproxy/data/scripts/loaderr.py deleted file mode 100644 index 8dc4d56d..00000000 --- a/test/mitmproxy/data/scripts/loaderr.py +++ /dev/null @@ -1,3 +0,0 @@ - - -a = x diff --git a/test/mitmproxy/data/scripts/reqerr.py b/test/mitmproxy/data/scripts/reqerr.py deleted file mode 100644 index e7c503a8..00000000 --- a/test/mitmproxy/data/scripts/reqerr.py +++ /dev/null @@ -1,2 +0,0 @@ -def request(ctx, r): - raise ValueError diff --git a/test/mitmproxy/data/scripts/starterr.py b/test/mitmproxy/data/scripts/starterr.py deleted file mode 100644 index 82d773bd..00000000 --- a/test/mitmproxy/data/scripts/starterr.py +++ /dev/null @@ -1,3 +0,0 @@ - -def start(ctx): - raise ValueError() diff --git a/test/mitmproxy/data/scripts/syntaxerr.py b/test/mitmproxy/data/scripts/syntaxerr.py deleted file mode 100644 index 219d6b84..00000000 --- a/test/mitmproxy/data/scripts/syntaxerr.py +++ /dev/null @@ -1,3 +0,0 @@ - - -a + diff --git a/test/mitmproxy/data/scripts/unloaderr.py b/test/mitmproxy/data/scripts/unloaderr.py deleted file mode 100644 index fba02734..00000000 --- a/test/mitmproxy/data/scripts/unloaderr.py +++ /dev/null @@ -1,2 +0,0 @@ -def done(ctx): - raise RuntimeError() diff --git a/test/mitmproxy/mastertest.py b/test/mitmproxy/mastertest.py index 9e726a32..dcc0dc48 100644 --- a/test/mitmproxy/mastertest.py +++ b/test/mitmproxy/mastertest.py @@ -3,24 +3,31 @@ import mock from . import tutils import netlib.tutils -from mitmproxy import flow, proxy, models +from mitmproxy.flow import master +from mitmproxy import flow, proxy, models, controller class MasterTest: + def invoke(self, master, handler, *message): + with master.handlecontext(): + func = getattr(master, handler) + func(*message) + if message: + message[0].reply = controller.DummyReply() + def cycle(self, master, content): f = tutils.tflow(req=netlib.tutils.treq(content=content)) l = proxy.Log("connect") l.reply = mock.MagicMock() master.log(l) - master.clientconnect(f.client_conn) - master.serverconnect(f.server_conn) - master.request(f) + self.invoke(master, "clientconnect", f.client_conn) + self.invoke(master, "clientconnect", f.client_conn) + self.invoke(master, "serverconnect", f.server_conn) + self.invoke(master, "request", f) if not f.error: f.response = models.HTTPResponse.wrap(netlib.tutils.tresp(content=content)) - f.reply.acked = False - f = master.response(f) - f.client_conn.reply.acked = False - master.clientdisconnect(f.client_conn) + self.invoke(master, "response", f) + self.invoke(master, "clientdisconnect", f) return f def dummy_cycle(self, master, n, content): @@ -34,3 +41,12 @@ class MasterTest: t = tutils.tflow(resp=True) fw.add(t) f.close() + + +class RecordingMaster(master.FlowMaster): + def __init__(self, *args, **kwargs): + master.FlowMaster.__init__(self, *args, **kwargs) + self.event_log = [] + + def add_log(self, e, level): + self.event_log.append((level, e)) diff --git a/test/mitmproxy/script/test_concurrent.py b/test/mitmproxy/script/test_concurrent.py index 62541f3f..080746e8 100644 --- a/test/mitmproxy/script/test_concurrent.py +++ b/test/mitmproxy/script/test_concurrent.py @@ -1,28 +1,46 @@ -from mitmproxy.script import Script -from test.mitmproxy import tutils +from test.mitmproxy import tutils, mastertest from mitmproxy import controller +from mitmproxy.builtins import script +from mitmproxy import options +from mitmproxy.flow import master +from mitmproxy.flow import state import time class Thing: def __init__(self): self.reply = controller.DummyReply() + self.live = True -@tutils.skip_appveyor -def test_concurrent(): - with Script(tutils.test_data.path("data/scripts/concurrent_decorator.py"), None) as s: - f1, f2 = Thing(), Thing() - s.run("request", f1) - s.run("request", f2) +class TestConcurrent(mastertest.MasterTest): + @tutils.skip_appveyor + def test_concurrent(self): + s = state.State() + m = master.FlowMaster(options.Options(), None, s) + sc = script.Script( + tutils.test_data.path( + "data/addonscripts/concurrent_decorator.py" + ) + ) + m.addons.add(sc) + f1, f2 = tutils.tflow(), tutils.tflow() + self.invoke(m, "request", f1) + self.invoke(m, "request", f2) start = time.time() while time.time() - start < 5: if f1.reply.acked and f2.reply.acked: return raise ValueError("Script never acked") - -def test_concurrent_err(): - s = Script(tutils.test_data.path("data/scripts/concurrent_decorator_err.py"), None) - with tutils.raises("Concurrent decorator not supported for 'start' method"): - s.load() + def test_concurrent_err(self): + s = state.State() + m = mastertest.RecordingMaster(options.Options(), None, s) + sc = script.Script( + tutils.test_data.path( + "data/addonscripts/concurrent_decorator_err.py" + ) + ) + with m.handlecontext(): + sc.start() + assert "decorator not supported" in m.event_log[0][1] diff --git a/test/mitmproxy/script/test_reloader.py b/test/mitmproxy/script/test_reloader.py deleted file mode 100644 index 0345f6ed..00000000 --- a/test/mitmproxy/script/test_reloader.py +++ /dev/null @@ -1,34 +0,0 @@ -import mock -from mitmproxy.script.reloader import watch, unwatch -from test.mitmproxy import tutils -from threading import Event - - -def test_simple(): - with tutils.tmpdir(): - with open("foo.py", "w"): - pass - - script = mock.Mock() - script.filename = "foo.py" - - e = Event() - - def _onchange(): - e.set() - - watch(script, _onchange) - with tutils.raises("already observed"): - watch(script, _onchange) - - # Some reloaders don't register a change directly after watching, because they first need to initialize. - # To test if watching works at all, we do repeated writes every 100ms. - for _ in range(100): - with open("foo.py", "a") as f: - f.write(".") - if e.wait(0.1): - break - else: - raise AssertionError("No change detected.") - - unwatch(script) diff --git a/test/mitmproxy/script/test_script.py b/test/mitmproxy/script/test_script.py deleted file mode 100644 index fe98fab5..00000000 --- a/test/mitmproxy/script/test_script.py +++ /dev/null @@ -1,83 +0,0 @@ -from mitmproxy.script import Script -from mitmproxy.exceptions import ScriptException -from test.mitmproxy import tutils - - -class TestParseCommand: - def test_empty_command(self): - with tutils.raises(ScriptException): - Script.parse_command("") - - with tutils.raises(ScriptException): - Script.parse_command(" ") - - def test_no_script_file(self): - with tutils.raises("not found"): - Script.parse_command("notfound") - - with tutils.tmpdir() as dir: - with tutils.raises("not a file"): - Script.parse_command(dir) - - def test_parse_args(self): - with tutils.chdir(tutils.test_data.dirname): - assert Script.parse_command("data/scripts/a.py") == ["data/scripts/a.py"] - assert Script.parse_command("data/scripts/a.py foo bar") == ["data/scripts/a.py", "foo", "bar"] - assert Script.parse_command("data/scripts/a.py 'foo bar'") == ["data/scripts/a.py", "foo bar"] - - @tutils.skip_not_windows - def test_parse_windows(self): - with tutils.chdir(tutils.test_data.dirname): - assert Script.parse_command("data\\scripts\\a.py") == ["data\\scripts\\a.py"] - assert Script.parse_command("data\\scripts\\a.py 'foo \\ bar'") == ["data\\scripts\\a.py", 'foo \\ bar'] - - -def test_simple(): - with tutils.chdir(tutils.test_data.path("data/scripts")): - s = Script("a.py --var 42", None) - assert s.filename == "a.py" - assert s.ns is None - - s.load() - assert s.ns["var"] == 42 - - s.run("here") - assert s.ns["var"] == 43 - - s.unload() - assert s.ns is None - - with tutils.raises(ScriptException): - s.run("here") - - with Script("a.py --var 42", None) as s: - s.run("here") - - -def test_script_exception(): - with tutils.chdir(tutils.test_data.path("data/scripts")): - s = Script("syntaxerr.py", None) - with tutils.raises(ScriptException): - s.load() - - s = Script("starterr.py", None) - with tutils.raises(ScriptException): - s.load() - - s = Script("a.py", None) - s.load() - with tutils.raises(ScriptException): - s.load() - - s = Script("a.py", None) - with tutils.raises(ScriptException): - s.run("here") - - with tutils.raises(ScriptException): - with Script("reqerr.py", None) as s: - s.run("request", None) - - s = Script("unloaderr.py", None) - s.load() - with tutils.raises(ScriptException): - s.unload() diff --git a/test/mitmproxy/test_addons.py b/test/mitmproxy/test_addons.py new file mode 100644 index 00000000..1861d4ac --- /dev/null +++ b/test/mitmproxy/test_addons.py @@ -0,0 +1,20 @@ +from __future__ import absolute_import, print_function, division +from mitmproxy import addons +from mitmproxy import controller +from mitmproxy import options + + +class TAddon: + def __init__(self, name): + self.name = name + + def __repr__(self): + return "Addon(%s)" % self.name + + +def test_simple(): + m = controller.Master(options.Options()) + a = addons.Addons(m) + a.add(TAddon("one")) + assert a.has_addon("one") + assert not a.has_addon("two") diff --git a/test/mitmproxy/test_cmdline.py b/test/mitmproxy/test_cmdline.py index 4fe2cf94..55627408 100644 --- a/test/mitmproxy/test_cmdline.py +++ b/test/mitmproxy/test_cmdline.py @@ -1,5 +1,4 @@ import argparse -import base64 from mitmproxy import cmdline from . import tutils @@ -36,34 +35,6 @@ def test_parse_replace_hook(): ) -def test_parse_server_spec(): - tutils.raises("Invalid server specification", cmdline.parse_server_spec, "") - assert cmdline.parse_server_spec( - "http://foo.com:88") == (b"http", (b"foo.com", 88)) - assert cmdline.parse_server_spec( - "http://foo.com") == (b"http", (b"foo.com", 80)) - assert cmdline.parse_server_spec( - "https://foo.com") == (b"https", (b"foo.com", 443)) - tutils.raises( - "Invalid server specification", - cmdline.parse_server_spec, - "foo.com") - tutils.raises( - "Invalid server specification", - cmdline.parse_server_spec, - "http://") - - -def test_parse_upstream_auth(): - tutils.raises("Invalid upstream auth specification", cmdline.parse_upstream_auth, "") - tutils.raises("Invalid upstream auth specification", cmdline.parse_upstream_auth, ":") - tutils.raises("Invalid upstream auth specification", cmdline.parse_upstream_auth, ":test") - assert cmdline.parse_upstream_auth( - "test:test") == b"Basic" + b" " + base64.b64encode(b"test:test") - assert cmdline.parse_upstream_auth( - "test:") == b"Basic" + b" " + base64.b64encode(b"test:") - - def test_parse_setheaders(): x = cmdline.parse_setheader("/foo/bar/voing") assert x == ("foo", "bar", "voing") diff --git a/test/mitmproxy/test_contentview.py b/test/mitmproxy/test_contentview.py index c11a5fe5..2db9ab40 100644 --- a/test/mitmproxy/test_contentview.py +++ b/test/mitmproxy/test_contentview.py @@ -1,6 +1,5 @@ from mitmproxy.exceptions import ContentViewException from netlib.http import Headers -from netlib import encoding from netlib.http import url from netlib import multidict @@ -216,28 +215,6 @@ Larry headers=Headers() ) - r = cv.get_content_view( - cv.get("Auto"), - encoding.encode('gzip', b"[1, 2, 3]"), - headers=Headers( - content_type="application/json", - content_encoding="gzip" - ) - ) - assert "decoded gzip" in r[0] - assert "JSON" in r[0] - - r = cv.get_content_view( - cv.get("XML"), - encoding.encode('gzip', b"[1, 2, 3]"), - headers=Headers( - content_type="application/json", - content_encoding="gzip" - ) - ) - assert "decoded gzip" in r[0] - assert "Raw" in r[0] - def test_add_cv(self): class TestContentView(cv.View): name = "test" diff --git a/test/mitmproxy/test_controller.py b/test/mitmproxy/test_controller.py index 5a68e15b..6d4b8fe6 100644 --- a/test/mitmproxy/test_controller.py +++ b/test/mitmproxy/test_controller.py @@ -25,7 +25,7 @@ class TestMaster(object): # Speed up test super(DummyMaster, self).tick(0) - m = DummyMaster() + m = DummyMaster(None) assert not m.should_exit.is_set() msg = TMsg() msg.reply = controller.DummyReply() @@ -34,7 +34,7 @@ class TestMaster(object): assert m.should_exit.is_set() def test_server_simple(self): - m = controller.Master() + m = controller.Master(None) s = DummyServer(None) m.add_server(s) m.start() diff --git a/test/mitmproxy/test_dump.py b/test/mitmproxy/test_dump.py index 234490f8..90f33264 100644 --- a/test/mitmproxy/test_dump.py +++ b/test/mitmproxy/test_dump.py @@ -1,127 +1,79 @@ import os from six.moves import cStringIO as StringIO -from mitmproxy.exceptions import ContentViewException -import netlib.tutils - -from mitmproxy import dump, flow, models +from mitmproxy import dump, flow, exceptions from . import tutils, mastertest import mock -def test_strfuncs(): - o = dump.Options() - m = dump.DumpMaster(None, o) - - m.outfile = StringIO() - m.o.flow_detail = 0 - m.echo_flow(tutils.tflow()) - assert not m.outfile.getvalue() - - m.o.flow_detail = 4 - m.echo_flow(tutils.tflow()) - assert m.outfile.getvalue() - - m.outfile = StringIO() - m.echo_flow(tutils.tflow(resp=True)) - assert "<<" in m.outfile.getvalue() - - m.outfile = StringIO() - m.echo_flow(tutils.tflow(err=True)) - assert "<<" in m.outfile.getvalue() - - flow = tutils.tflow() - flow.request = netlib.tutils.treq() - flow.request.stickycookie = True - flow.client_conn = mock.MagicMock() - flow.client_conn.address.host = "foo" - flow.response = netlib.tutils.tresp(content=None) - flow.response.is_replay = True - flow.response.status_code = 300 - m.echo_flow(flow) - - flow = tutils.tflow(resp=netlib.tutils.tresp(content="{")) - flow.response.headers["content-type"] = "application/json" - flow.response.status_code = 400 - m.echo_flow(flow) - - -@mock.patch("mitmproxy.contentviews.get_content_view") -def test_contentview(get_content_view): - get_content_view.side_effect = ContentViewException(""), ("x", iter([])) - - o = dump.Options(flow_detail=4, verbosity=3) - m = dump.DumpMaster(None, o, StringIO()) - m.echo_flow(tutils.tflow()) - assert "Content viewer failed" in m.outfile.getvalue() - - class TestDumpMaster(mastertest.MasterTest): def dummy_cycle(self, master, n, content): mastertest.MasterTest.dummy_cycle(self, master, n, content) - return master.outfile.getvalue() + return master.options.tfile.getvalue() def mkmaster(self, filt, **options): - cs = StringIO() - o = dump.Options(filtstr=filt, **options) - return dump.DumpMaster(None, o, outfile=cs) + if "verbosity" not in options: + options["verbosity"] = 0 + if "flow_detail" not in options: + options["flow_detail"] = 0 + o = dump.Options(filtstr=filt, tfile=StringIO(), **options) + return dump.DumpMaster(None, o) def test_basic(self): for i in (1, 2, 3): - assert "GET" in self.dummy_cycle(self.mkmaster("~s", flow_detail=i), 1, "") assert "GET" in self.dummy_cycle( self.mkmaster("~s", flow_detail=i), 1, - "\x00\x00\x00" + b"" + ) + assert "GET" in self.dummy_cycle( + self.mkmaster("~s", flow_detail=i), + 1, + b"\x00\x00\x00" ) assert "GET" in self.dummy_cycle( self.mkmaster("~s", flow_detail=i), - 1, "ascii" + 1, + b"ascii" ) def test_error(self): - cs = StringIO() - o = dump.Options(flow_detail=1) - m = dump.DumpMaster(None, o, outfile=cs) + o = dump.Options( + tfile=StringIO(), + flow_detail=1 + ) + m = dump.DumpMaster(None, o) f = tutils.tflow(err=True) - m.request(f) + m.error(f) assert m.error(f) - assert "error" in cs.getvalue() - - def test_missing_content(self): - cs = StringIO() - o = dump.Options(flow_detail=3) - m = dump.DumpMaster(None, o, outfile=cs) - f = tutils.tflow() - f.request.content = None - m.request(f) - f.response = models.HTTPResponse.wrap(netlib.tutils.tresp()) - f.response.content = None - m.response(f) - assert "content missing" in cs.getvalue() + assert "error" in o.tfile.getvalue() def test_replay(self): - cs = StringIO() - o = dump.Options(server_replay=["nonexistent"], kill=True) - tutils.raises(dump.DumpError, dump.DumpMaster, None, o, outfile=cs) + tutils.raises(dump.DumpError, dump.DumpMaster, None, o) with tutils.tmpdir() as t: p = os.path.join(t, "rep") self.flowfile(p) o = dump.Options(server_replay=[p], kill=True) - m = dump.DumpMaster(None, o, outfile=cs) + o.verbosity = 0 + o.flow_detail = 0 + m = dump.DumpMaster(None, o) - self.cycle(m, "content") - self.cycle(m, "content") + self.cycle(m, b"content") + self.cycle(m, b"content") o = dump.Options(server_replay=[p], kill=False) - m = dump.DumpMaster(None, o, outfile=cs) - self.cycle(m, "nonexistent") + o.verbosity = 0 + o.flow_detail = 0 + m = dump.DumpMaster(None, o) + self.cycle(m, b"nonexistent") o = dump.Options(client_replay=[p], kill=False) - m = dump.DumpMaster(None, o, outfile=cs) + o.verbosity = 0 + o.flow_detail = 0 + m = dump.DumpMaster(None, o) def test_read(self): with tutils.tmpdir() as t: @@ -129,9 +81,8 @@ class TestDumpMaster(mastertest.MasterTest): self.flowfile(p) assert "GET" in self.dummy_cycle( self.mkmaster(None, flow_detail=1, rfile=p), - 0, "", + 1, b"", ) - tutils.raises( dump.DumpError, self.mkmaster, None, verbosity=1, rfile="/nonexistent" @@ -147,7 +98,7 @@ class TestDumpMaster(mastertest.MasterTest): def test_filter(self): assert "GET" not in self.dummy_cycle( - self.mkmaster("~u foo", verbosity=1), 1, "" + self.mkmaster("~u foo", verbosity=1), 1, b"" ) def test_app(self): @@ -157,24 +108,32 @@ class TestDumpMaster(mastertest.MasterTest): assert len(m.apps.apps) == 1 def test_replacements(self): - cs = StringIO() - o = dump.Options(replacements=[(".*", "content", "foo")]) - m = dump.DumpMaster(None, o, outfile=cs) - f = self.cycle(m, "content") - assert f.request.content == "foo" + o = dump.Options( + replacements=[(".*", "content", "foo")], + tfile = StringIO(), + ) + o.verbosity = 0 + o.flow_detail = 0 + m = dump.DumpMaster(None, o) + f = self.cycle(m, b"content") + assert f.request.content == b"foo" def test_setheader(self): - cs = StringIO() - o = dump.Options(setheaders=[(".*", "one", "two")]) - m = dump.DumpMaster(None, o, outfile=cs) - f = self.cycle(m, "content") + o = dump.Options( + setheaders=[(".*", "one", "two")], + tfile=StringIO() + ) + o.verbosity = 0 + o.flow_detail = 0 + m = dump.DumpMaster(None, o) + f = self.cycle(m, b"content") assert f.request.headers["one"] == "two" def test_write(self): with tutils.tmpdir() as d: p = os.path.join(d, "a") self.dummy_cycle( - self.mkmaster(None, outfile=(p, "wb"), verbosity=0), 1, "" + self.mkmaster(None, outfile=(p, "wb"), verbosity=0), 1, b"" ) assert len(list(flow.FlowReader(open(p, "rb")).stream())) == 1 @@ -183,17 +142,17 @@ class TestDumpMaster(mastertest.MasterTest): p = os.path.join(d, "a.append") self.dummy_cycle( self.mkmaster(None, outfile=(p, "wb"), verbosity=0), - 1, "" + 1, b"" ) self.dummy_cycle( self.mkmaster(None, outfile=(p, "ab"), verbosity=0), - 1, "" + 1, b"" ) assert len(list(flow.FlowReader(open(p, "rb")).stream())) == 2 def test_write_err(self): tutils.raises( - dump.DumpError, + exceptions.OptionsError, self.mkmaster, None, outfile = ("nonexistentdir/foo", "wb") ) @@ -201,9 +160,10 @@ class TestDumpMaster(mastertest.MasterTest): ret = self.dummy_cycle( self.mkmaster( None, - scripts=[tutils.test_data.path("data/scripts/all.py")], verbosity=1 + scripts=[tutils.test_data.path("data/scripts/all.py")], + verbosity=2 ), - 1, "", + 1, b"", ) assert "XCLIENTCONNECT" in ret assert "XSERVERCONNECT" in ret @@ -211,12 +171,12 @@ class TestDumpMaster(mastertest.MasterTest): assert "XRESPONSE" in ret assert "XCLIENTDISCONNECT" in ret tutils.raises( - dump.DumpError, + exceptions.AddonError, self.mkmaster, None, scripts=["nonexistent"] ) tutils.raises( - dump.DumpError, + exceptions.AddonError, self.mkmaster, None, scripts=["starterr.py"] ) @@ -224,11 +184,11 @@ class TestDumpMaster(mastertest.MasterTest): def test_stickycookie(self): self.dummy_cycle( self.mkmaster(None, stickycookie = ".*"), - 1, "" + 1, b"" ) def test_stickyauth(self): self.dummy_cycle( self.mkmaster(None, stickyauth = ".*"), - 1, "" + 1, b"" ) diff --git a/test/mitmproxy/test_examples.py b/test/mitmproxy/test_examples.py index f30973e7..0ec85f52 100644 --- a/test/mitmproxy/test_examples.py +++ b/test/mitmproxy/test_examples.py @@ -1,162 +1,126 @@ -import glob import json -import os -import sys -from contextlib import contextmanager -from mitmproxy import script -from mitmproxy.proxy import config +import six +import sys +import os.path +from mitmproxy.flow import master +from mitmproxy.flow import state +from mitmproxy import options +from mitmproxy import contentviews +from mitmproxy.builtins import script import netlib.utils from netlib import tutils as netutils from netlib.http import Headers -from . import tservers, tutils - -example_dir = netlib.utils.Data(__name__).path("../../examples") - - -class DummyContext(object): - """Emulate script.ScriptContext() functionality.""" - - contentview = None - - def log(self, *args, **kwargs): - pass +from . import tutils, mastertest - def add_contentview(self, view_obj): - self.contentview = view_obj +example_dir = netlib.utils.Data(__name__).push("../../examples") - def remove_contentview(self, view_obj): - self.contentview = None +class ScriptError(Exception): + pass -@contextmanager -def example(command): - command = os.path.join(example_dir, command) - ctx = DummyContext() - with script.Script(command, ctx) as s: - yield s +class RaiseMaster(master.FlowMaster): + def add_log(self, e, level): + if level in ("warn", "error"): + raise ScriptError(e) -def test_load_scripts(): - scripts = glob.glob("%s/*.py" % example_dir) - tmaster = tservers.TestMaster(config.ProxyConfig()) +def tscript(cmd, args=""): + cmd = example_dir.path(cmd) + " " + args + m = RaiseMaster(options.Options(), None, state.State()) + sc = script.Script(cmd) + m.addons.add(sc) + return m, sc - for f in scripts: - if "har_extractor" in f: - continue - if "flowwriter" in f: - f += " -" - if "iframe_injector" in f: - f += " foo" # one argument required - if "filt" in f: - f += " ~a" - if "modify_response_body" in f: - f += " foo bar" # two arguments required - s = script.Script(f, script.ScriptContext(tmaster)) - try: - s.load() - except Exception as v: - if "ImportError" not in str(v): - raise - else: - s.unload() +class TestScripts(mastertest.MasterTest): + def test_add_header(self): + m, _ = tscript("add_header.py") + f = tutils.tflow(resp=netutils.tresp()) + self.invoke(m, "response", f) + assert f.response.headers["newheader"] == "foo" - -def test_add_header(): - flow = tutils.tflow(resp=netutils.tresp()) - with example("add_header.py") as ex: - ex.run("response", flow) - assert flow.response.headers["newheader"] == "foo" - - -def test_custom_contentviews(): - with example("custom_contentviews.py") as ex: - pig = ex.ctx.contentview + def test_custom_contentviews(self): + m, sc = tscript("custom_contentviews.py") + pig = contentviews.get("pig_latin_HTML") _, fmt = pig(b"<html>test!</html>") assert any(b'esttay!' in val[0][1] for val in fmt) assert not pig(b"gobbledygook") + def test_iframe_injector(self): + with tutils.raises(ScriptError): + tscript("iframe_injector.py") -def test_iframe_injector(): - with tutils.raises(script.ScriptException): - with example("iframe_injector.py") as ex: - pass - - flow = tutils.tflow(resp=netutils.tresp(content=b"<html>mitmproxy</html>")) - with example("iframe_injector.py http://example.org/evil_iframe") as ex: - ex.run("response", flow) + m, sc = tscript("iframe_injector.py", "http://example.org/evil_iframe") + flow = tutils.tflow(resp=netutils.tresp(content=b"<html>mitmproxy</html>")) + self.invoke(m, "response", flow) content = flow.response.content assert b'iframe' in content and b'evil_iframe' in content - -def test_modify_form(): - form_header = Headers(content_type="application/x-www-form-urlencoded") - flow = tutils.tflow(req=netutils.treq(headers=form_header)) - with example("modify_form.py") as ex: - ex.run("request", flow) - assert flow.request.urlencoded_form[b"mitmproxy"] == b"rocks" - - flow.request.headers["content-type"] = "" - ex.run("request", flow) - assert list(flow.request.urlencoded_form.items()) == [(b"foo", b"bar")] - - -def test_modify_querystring(): - flow = tutils.tflow(req=netutils.treq(path=b"/search?q=term")) - with example("modify_querystring.py") as ex: - ex.run("request", flow) - assert flow.request.query["mitmproxy"] == "rocks" - - flow.request.path = "/" - ex.run("request", flow) - assert flow.request.query["mitmproxy"] == "rocks" - - -def test_modify_response_body(): - with tutils.raises(script.ScriptException): - with example("modify_response_body.py"): - assert True - - flow = tutils.tflow(resp=netutils.tresp(content=b"I <3 mitmproxy")) - with example("modify_response_body.py mitmproxy rocks") as ex: - assert ex.ctx.old == b"mitmproxy" and ex.ctx.new == b"rocks" - ex.run("response", flow) - assert flow.response.content == b"I <3 rocks" - - -def test_redirect_requests(): - flow = tutils.tflow(req=netutils.treq(host=b"example.org")) - with example("redirect_requests.py") as ex: - ex.run("request", flow) - assert flow.request.host == "mitmproxy.org" - - -def test_har_extractor(): - if sys.version_info >= (3, 0): - with tutils.raises("does not work on Python 3"): - with example("har_extractor.py -"): - pass - return - - with tutils.raises(script.ScriptException): - with example("har_extractor.py"): - pass - - times = dict( - timestamp_start=746203272, - timestamp_end=746203272, - ) - - flow = tutils.tflow( - req=netutils.treq(**times), - resp=netutils.tresp(**times) - ) - - with example("har_extractor.py -") as ex: - ex.run("response", flow) - - with open(tutils.test_data.path("data/har_extractor.har")) as fp: - test_data = json.load(fp) - assert json.loads(ex.ctx.HARLog.json()) == test_data["test_response"] + def test_modify_form(self): + m, sc = tscript("modify_form.py") + + form_header = Headers(content_type="application/x-www-form-urlencoded") + f = tutils.tflow(req=netutils.treq(headers=form_header)) + self.invoke(m, "request", f) + + assert f.request.urlencoded_form[b"mitmproxy"] == b"rocks" + + f.request.headers["content-type"] = "" + self.invoke(m, "request", f) + assert list(f.request.urlencoded_form.items()) == [(b"foo", b"bar")] + + def test_modify_querystring(self): + m, sc = tscript("modify_querystring.py") + f = tutils.tflow(req=netutils.treq(path="/search?q=term")) + + self.invoke(m, "request", f) + assert f.request.query["mitmproxy"] == "rocks" + + f.request.path = "/" + self.invoke(m, "request", f) + assert f.request.query["mitmproxy"] == "rocks" + + def test_modify_response_body(self): + with tutils.raises(ScriptError): + tscript("modify_response_body.py") + + m, sc = tscript("modify_response_body.py", "mitmproxy rocks") + f = tutils.tflow(resp=netutils.tresp(content=b"I <3 mitmproxy")) + self.invoke(m, "response", f) + assert f.response.content == b"I <3 rocks" + + def test_redirect_requests(self): + m, sc = tscript("redirect_requests.py") + f = tutils.tflow(req=netutils.treq(host="example.org")) + self.invoke(m, "request", f) + assert f.request.host == "mitmproxy.org" + + def test_har_extractor(self): + if sys.version_info >= (3, 0): + with tutils.raises("does not work on Python 3"): + tscript("har_extractor.py") + return + + with tutils.raises(ScriptError): + tscript("har_extractor.py") + + with tutils.tmpdir() as tdir: + times = dict( + timestamp_start=746203272, + timestamp_end=746203272, + ) + + path = os.path.join(tdir, "file") + m, sc = tscript("har_extractor.py", six.moves.shlex_quote(path)) + f = tutils.tflow( + req=netutils.treq(**times), + resp=netutils.tresp(**times) + ) + self.invoke(m, "response", f) + m.addons.remove(sc) + + with open(path, "rb") as f: + test_data = json.load(f) + assert len(test_data["log"]["pages"]) == 1 diff --git a/test/mitmproxy/test_filt.py b/test/mitmproxy/test_filt.py index 9fe36b2a..69f042bb 100644 --- a/test/mitmproxy/test_filt.py +++ b/test/mitmproxy/test_filt.py @@ -1,6 +1,8 @@ from six.moves import cStringIO as StringIO -from mitmproxy import filt from mock import patch + +from mitmproxy import filt + from . import tutils @@ -73,7 +75,7 @@ class TestParsing: self._dump(a) -class TestMatching: +class TestMatchingHTTPFlow: def req(self): return tutils.tflow() @@ -87,6 +89,11 @@ class TestMatching: def q(self, q, o): return filt.parse(q)(o) + def test_http(self): + s = self.req() + assert self.q("~http", s) + assert not self.q("~tcp", s) + def test_asset(self): s = self.resp() assert not self.q("~a", s) @@ -247,6 +254,186 @@ class TestMatching: assert not self.q("!~c 201 !~c 200", s) +class TestMatchingTCPFlow: + + def flow(self): + return tutils.ttcpflow() + + def err(self): + return tutils.ttcpflow(err=True) + + def q(self, q, o): + return filt.parse(q)(o) + + def test_tcp(self): + f = self.flow() + assert self.q("~tcp", f) + assert not self.q("~http", f) + + def test_ferr(self): + e = self.err() + assert self.q("~e", e) + + def test_body(self): + f = self.flow() + + # Messages sent by client or server + assert self.q("~b hello", f) + assert self.q("~b me", f) + assert not self.q("~b nonexistent", f) + + # Messages sent by client + assert self.q("~bq hello", f) + assert not self.q("~bq me", f) + assert not self.q("~bq nonexistent", f) + + # Messages sent by server + assert self.q("~bs me", f) + assert not self.q("~bs hello", f) + assert not self.q("~bs nonexistent", f) + + def test_src(self): + f = self.flow() + assert self.q("~src address", f) + assert not self.q("~src foobar", f) + assert self.q("~src :22", f) + assert not self.q("~src :99", f) + assert self.q("~src address:22", f) + + def test_dst(self): + f = self.flow() + f.server_conn = tutils.tserver_conn() + assert self.q("~dst address", f) + assert not self.q("~dst foobar", f) + assert self.q("~dst :22", f) + assert not self.q("~dst :99", f) + assert self.q("~dst address:22", f) + + def test_and(self): + f = self.flow() + f.server_conn = tutils.tserver_conn() + assert self.q("~b hello & ~b me", f) + assert not self.q("~src wrongaddress & ~b hello", f) + assert self.q("(~src :22 & ~dst :22) & ~b hello", f) + assert not self.q("(~src address:22 & ~dst :22) & ~b nonexistent", f) + assert not self.q("(~src address:22 & ~dst :99) & ~b hello", f) + + def test_or(self): + f = self.flow() + f.server_conn = tutils.tserver_conn() + assert self.q("~b hello | ~b me", f) + assert self.q("~src :22 | ~b me", f) + assert not self.q("~src :99 | ~dst :99", f) + assert self.q("(~src :22 | ~dst :22) | ~b me", f) + + def test_not(self): + f = self.flow() + assert not self.q("! ~src :22", f) + assert self.q("! ~src :99", f) + assert self.q("!~src :99 !~src :99", f) + assert not self.q("!~src :99 !~src :22", f) + + def test_request(self): + f = self.flow() + assert not self.q("~q", f) + + def test_response(self): + f = self.flow() + assert not self.q("~s", f) + + def test_headers(self): + f = self.flow() + assert not self.q("~h whatever", f) + + # Request headers + assert not self.q("~hq whatever", f) + + # Response headers + assert not self.q("~hs whatever", f) + + def test_content_type(self): + f = self.flow() + assert not self.q("~t whatever", f) + + # Request content-type + assert not self.q("~tq whatever", f) + + # Response content-type + assert not self.q("~ts whatever", f) + + def test_code(self): + f = self.flow() + assert not self.q("~c 200", f) + + def test_domain(self): + f = self.flow() + assert not self.q("~d whatever", f) + + def test_method(self): + f = self.flow() + assert not self.q("~m whatever", f) + + def test_url(self): + f = self.flow() + assert not self.q("~u whatever", f) + + +class TestMatchingDummyFlow: + + def flow(self): + return tutils.tdummyflow() + + def err(self): + return tutils.tdummyflow(err=True) + + def q(self, q, o): + return filt.parse(q)(o) + + def test_filters(self): + e = self.err() + f = self.flow() + f.server_conn = tutils.tserver_conn() + + assert not self.q("~a", f) + + assert not self.q("~b whatever", f) + assert not self.q("~bq whatever", f) + assert not self.q("~bs whatever", f) + + assert not self.q("~c 0", f) + + assert not self.q("~d whatever", f) + + assert self.q("~dst address", f) + assert not self.q("~dst nonexistent", f) + + assert self.q("~e", e) + assert not self.q("~e", f) + + assert not self.q("~http", f) + + assert not self.q("~h whatever", f) + assert not self.q("~hq whatever", f) + assert not self.q("~hs whatever", f) + + assert not self.q("~m whatever", f) + + assert not self.q("~s", f) + + assert self.q("~src address", f) + assert not self.q("~src nonexistent", f) + + assert not self.q("~tcp", f) + + assert not self.q("~t whatever", f) + assert not self.q("~tq whatever", f) + assert not self.q("~ts whatever", f) + + assert not self.q("~u whatever", f) + + assert not self.q("~q", f) + + @patch('traceback.extract_tb') def test_pyparsing_bug(extract_tb): """https://github.com/mitmproxy/mitmproxy/issues/1087""" diff --git a/test/mitmproxy/test_flow.py b/test/mitmproxy/test_flow.py index bf7622f6..e17a125c 100644 --- a/test/mitmproxy/test_flow.py +++ b/test/mitmproxy/test_flow.py @@ -1,19 +1,17 @@ -import os.path - import mock import io import netlib.utils from netlib.http import Headers from mitmproxy import filt, controller, flow +from mitmproxy.flow import options from mitmproxy.contrib import tnetstring -from mitmproxy.exceptions import FlowReadException, ScriptException +from mitmproxy.exceptions import FlowReadException from mitmproxy.models import Error from mitmproxy.models import Flow from mitmproxy.models import HTTPFlow from mitmproxy.models import HTTPRequest from mitmproxy.models import HTTPResponse -from mitmproxy.proxy.config import HostMatcher from mitmproxy.proxy import ProxyConfig from mitmproxy.proxy.server import DummyServer from mitmproxy.models.connections import ClientConnection @@ -40,94 +38,12 @@ def test_app_registry(): assert ar.get(r) -class TestStickyCookieState: - - def _response(self, cookie, host): - s = flow.StickyCookieState(filt.parse(".*")) - f = tutils.tflow(req=netlib.tutils.treq(host=host, port=80), resp=True) - f.response.headers["Set-Cookie"] = cookie - s.handle_response(f) - return s, f - - def test_domain_match(self): - s = flow.StickyCookieState(filt.parse(".*")) - assert s.domain_match("www.google.com", ".google.com") - assert s.domain_match("google.com", ".google.com") - - def test_response(self): - c = "SSID=mooo; domain=.google.com, FOO=bar; Domain=.google.com; Path=/; " \ - "Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; " - - s, f = self._response(c, "host") - assert not s.jar.keys() - - s, f = self._response(c, "www.google.com") - assert s.jar.keys() - - s, f = self._response("SSID=mooo", "www.google.com") - assert list(s.jar.keys())[0] == ('www.google.com', 80, '/') - - # Test setting of multiple cookies - c1 = "somecookie=test; Path=/" - c2 = "othercookie=helloworld; Path=/" - s, f = self._response(c1, "www.google.com") - f.response.headers["Set-Cookie"] = c2 - s.handle_response(f) - googlekey = list(s.jar.keys())[0] - assert len(s.jar[googlekey].keys()) == 2 - - # Test setting of weird cookie keys - s = flow.StickyCookieState(filt.parse(".*")) - f = tutils.tflow(req=netlib.tutils.treq(host="www.google.com", port=80), resp=True) - cs = [ - "foo/bar=hello", - "foo:bar=world", - "foo@bar=fizz", - "foo,bar=buzz", - ] - for c in cs: - f.response.headers["Set-Cookie"] = c - s.handle_response(f) - googlekey = list(s.jar.keys())[0] - assert len(s.jar[googlekey]) == len(cs) - - # Test overwriting of a cookie value - c1 = "somecookie=helloworld; Path=/" - c2 = "somecookie=newvalue; Path=/" - s, f = self._response(c1, "www.google.com") - f.response.headers["Set-Cookie"] = c2 - s.handle_response(f) - googlekey = list(s.jar.keys())[0] - assert len(s.jar[googlekey]) == 1 - assert list(s.jar[googlekey]["somecookie"].values())[0] == "newvalue" - - def test_request(self): - s, f = self._response("SSID=mooo", b"www.google.com") - assert "cookie" not in f.request.headers - s.handle_request(f) - assert "cookie" in f.request.headers - - -class TestStickyAuthState: - - def test_response(self): - s = flow.StickyAuthState(filt.parse(".*")) - f = tutils.tflow(resp=True) - f.request.headers["authorization"] = "foo" - s.handle_request(f) - assert "address" in s.hosts - - f = tutils.tflow(resp=True) - s.handle_request(f) - assert f.request.headers["authorization"] == "foo" - - class TestClientPlaybackState: def test_tick(self): first = tutils.tflow() s = flow.State() - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(None, None, s) fm.start_client_playback([first, tutils.tflow()], True) c = fm.client_playback c.testing = True @@ -377,7 +293,7 @@ class TestServerPlaybackState: assert s._hash(r) == s._hash(r2) -class TestFlow(object): +class TestHTTPFlow(object): def test_copy(self): f = tutils.tflow(resp=True) @@ -458,7 +374,7 @@ class TestFlow(object): def test_kill(self): s = flow.State() - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(None, None, s) f = tutils.tflow() f.intercept(mock.Mock()) f.kill(fm) @@ -467,7 +383,7 @@ class TestFlow(object): def test_killall(self): s = flow.State() - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(None, None, s) f = tutils.tflow() f.intercept(fm) @@ -518,13 +434,27 @@ class TestFlow(object): f.replace("foo", "bar") - assert f.request.content != b"abarb" + assert f.request.raw_content != b"abarb" f.request.decode() - assert f.request.content == b"abarb" + assert f.request.raw_content == b"abarb" - assert f.response.content != b"abarb" + assert f.response.raw_content != b"abarb" f.response.decode() - assert f.response.content == b"abarb" + assert f.response.raw_content == b"abarb" + + +class TestTCPFlow: + + def test_match(self): + f = tutils.ttcpflow() + assert not f.match("~b nonexistent") + assert f.match(None) + assert not f.match("~b nonexistent") + + f = tutils.ttcpflow(err=True) + assert f.match("~e") + + tutils.raises(ValueError, f.match, "~") class TestState: @@ -702,18 +632,19 @@ class TestSerialize: def test_load_flows(self): r = self._treader() s = flow.State() - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(None, None, s) fm.load_flows(r) assert len(s.flows) == 6 def test_load_flows_reverse(self): r = self._treader() s = flow.State() - conf = ProxyConfig( + opts = options.Options( mode="reverse", - upstream_server=("https", ("use-this-domain", 80)) + upstream_server="https://use-this-domain" ) - fm = flow.FlowMaster(DummyServer(conf), s) + conf = ProxyConfig(opts) + fm = flow.FlowMaster(opts, DummyServer(conf), s) fm.load_flows(r) assert s.flows[0].request.host == "use-this-domain" @@ -758,32 +689,9 @@ class TestSerialize: class TestFlowMaster: - def test_load_script(self): - s = flow.State() - fm = flow.FlowMaster(None, s) - - fm.load_script(tutils.test_data.path("data/scripts/a.py")) - fm.load_script(tutils.test_data.path("data/scripts/a.py")) - fm.unload_scripts() - with tutils.raises(ScriptException): - fm.load_script("nonexistent") - try: - fm.load_script(tutils.test_data.path("data/scripts/starterr.py")) - except ScriptException as e: - assert "ValueError" in str(e) - assert len(fm.scripts) == 0 - - def test_getset_ignore(self): - p = mock.Mock() - p.config.check_ignore = HostMatcher() - fm = flow.FlowMaster(p, flow.State()) - assert not fm.get_ignore_filter() - fm.set_ignore_filter(["^apple\.com:", ":443$"]) - assert fm.get_ignore_filter() - def test_replay(self): s = flow.State() - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(None, None, s) f = tutils.tflow(resp=True) f.request.content = None assert "missing" in fm.replay_request(f) @@ -792,55 +700,11 @@ class TestFlowMaster: assert "intercepting" in fm.replay_request(f) f.live = True - assert "live" in fm.replay_request(f, run_scripthooks=True) - - def test_script_reqerr(self): - s = flow.State() - fm = flow.FlowMaster(None, s) - fm.load_script(tutils.test_data.path("data/scripts/reqerr.py")) - f = tutils.tflow() - fm.clientconnect(f.client_conn) - assert fm.request(f) - - def test_script(self): - s = flow.State() - fm = flow.FlowMaster(None, s) - fm.load_script(tutils.test_data.path("data/scripts/all.py")) - f = tutils.tflow(resp=True) - - f.client_conn.acked = False - fm.clientconnect(f.client_conn) - assert fm.scripts[0].ns["log"][-1] == "clientconnect" - f.server_conn.acked = False - fm.serverconnect(f.server_conn) - assert fm.scripts[0].ns["log"][-1] == "serverconnect" - f.reply.acked = False - fm.request(f) - assert fm.scripts[0].ns["log"][-1] == "request" - f.reply.acked = False - fm.response(f) - assert fm.scripts[0].ns["log"][-1] == "response" - # load second script - fm.load_script(tutils.test_data.path("data/scripts/all.py")) - assert len(fm.scripts) == 2 - f.server_conn.reply.acked = False - fm.clientdisconnect(f.server_conn) - assert fm.scripts[0].ns["log"][-1] == "clientdisconnect" - assert fm.scripts[1].ns["log"][-1] == "clientdisconnect" - - # unload first script - fm.unload_scripts() - assert len(fm.scripts) == 0 - fm.load_script(tutils.test_data.path("data/scripts/all.py")) - - f.error = tutils.terr() - f.reply.acked = False - fm.error(f) - assert fm.scripts[0].ns["log"][-1] == "error" + assert "live" in fm.replay_request(f) def test_duplicate_flow(self): s = flow.State() - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(None, None, s) f = tutils.tflow(resp=True) fm.load_flow(f) assert s.flow_count() == 1 @@ -851,14 +715,12 @@ class TestFlowMaster: def test_create_flow(self): s = flow.State() - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(None, None, s) assert fm.create_request("GET", "http", "example.com", 80, "/") def test_all(self): s = flow.State() - fm = flow.FlowMaster(None, s) - fm.anticache = True - fm.anticomp = True + fm = flow.FlowMaster(None, None, s) f = tutils.tflow(req=None) fm.clientconnect(f.client_conn) f.request = HTTPRequest.wrap(netlib.tutils.treq()) @@ -875,7 +737,6 @@ class TestFlowMaster: f.error.reply = controller.DummyReply() fm.error(f) - fm.load_script(tutils.test_data.path("data/scripts/a.py")) fm.shutdown() def test_client_playback(self): @@ -883,7 +744,11 @@ class TestFlowMaster: f = tutils.tflow(resp=True) pb = [tutils.tflow(resp=True), f] - fm = flow.FlowMaster(DummyServer(ProxyConfig()), s) + fm = flow.FlowMaster( + flow.options.Options(), + DummyServer(ProxyConfig(options.Options())), + s + ) assert not fm.start_server_playback( pb, False, @@ -911,7 +776,7 @@ class TestFlowMaster: f.response = HTTPResponse.wrap(netlib.tutils.tresp(content=f.request)) pb = [f] - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(flow.options.Options(), None, s) fm.refresh_server_playback = True assert not fm.do_server_playback(tutils.tflow()) @@ -953,7 +818,7 @@ class TestFlowMaster: f = tutils.tflow() f.response = HTTPResponse.wrap(netlib.tutils.tresp(content=f.request)) pb = [f] - fm = flow.FlowMaster(None, s) + fm = flow.FlowMaster(None, None, s) fm.refresh_server_playback = True fm.start_server_playback( pb, @@ -971,77 +836,6 @@ class TestFlowMaster: fm.process_new_request(f) assert "killed" in f.error.msg - def test_stickycookie(self): - s = flow.State() - fm = flow.FlowMaster(None, s) - assert "Invalid" in fm.set_stickycookie("~h") - fm.set_stickycookie(".*") - assert fm.stickycookie_state - fm.set_stickycookie(None) - assert not fm.stickycookie_state - - fm.set_stickycookie(".*") - f = tutils.tflow(resp=True) - f.response.headers["set-cookie"] = "foo=bar" - fm.request(f) - f.reply.acked = False - fm.response(f) - assert fm.stickycookie_state.jar - assert "cookie" not in f.request.headers - f = f.copy() - f.reply.acked = False - fm.request(f) - assert f.request.headers["cookie"] == "foo=bar" - - def test_stickyauth(self): - s = flow.State() - fm = flow.FlowMaster(None, s) - assert "Invalid" in fm.set_stickyauth("~h") - fm.set_stickyauth(".*") - assert fm.stickyauth_state - fm.set_stickyauth(None) - assert not fm.stickyauth_state - - fm.set_stickyauth(".*") - f = tutils.tflow(resp=True) - f.request.headers["authorization"] = "foo" - fm.request(f) - - f = tutils.tflow(resp=True) - assert fm.stickyauth_state.hosts - assert "authorization" not in f.request.headers - fm.request(f) - assert f.request.headers["authorization"] == "foo" - - def test_stream(self): - with tutils.tmpdir() as tdir: - p = os.path.join(tdir, "foo") - - def read(): - with open(p, "rb") as f: - r = flow.FlowReader(f) - return list(r.stream()) - - s = flow.State() - fm = flow.FlowMaster(None, s) - f = tutils.tflow(resp=True) - - with open(p, "ab") as tmpfile: - fm.start_stream(tmpfile, None) - fm.request(f) - fm.response(f) - fm.stop_stream() - - assert read()[0].response - - with open(p, "ab") as tmpfile: - f = tutils.tflow() - fm.start_stream(tmpfile, None) - fm.request(f) - fm.shutdown() - - assert not read()[1].response - class TestRequest: @@ -1076,15 +870,6 @@ class TestRequest: assert r.url == "https://address:22/path" assert r.pretty_url == "https://foo.com:22/path" - def test_anticache(self): - r = HTTPRequest.wrap(netlib.tutils.treq()) - r.headers = Headers() - r.headers["if-modified-since"] = "test" - r.headers["if-none-match"] = "test" - r.anticache() - assert "if-modified-since" not in r.headers - assert "if-none-match" not in r.headers - def test_replace(self): r = HTTPRequest.wrap(netlib.tutils.treq()) r.path = "path/foo" @@ -1105,16 +890,6 @@ class TestRequest: r.constrain_encoding() assert "oink" not in r.headers["accept-encoding"] - def test_get_decoded_content(self): - r = HTTPRequest.wrap(netlib.tutils.treq()) - r.content = None - r.headers["content-encoding"] = "identity" - assert r.get_decoded_content() is None - - r.content = b"falafel" - r.encode("gzip") - assert r.get_decoded_content() == b"falafel" - def test_get_content_type(self): resp = HTTPResponse.wrap(netlib.tutils.tresp()) resp.headers = Headers(content_type="text/plain") @@ -1183,104 +958,3 @@ class TestClientConnection: assert c3.get_state() == c.get_state() assert str(c) - - -def test_replacehooks(): - h = flow.ReplaceHooks() - h.add("~q", "foo", "bar") - assert h.lst - - h.set( - [ - (".*", "one", "two"), - (".*", "three", "four"), - ] - ) - assert h.count() == 2 - - h.clear() - assert not h.lst - - h.add("~q", "foo", "bar") - h.add("~s", "foo", "bar") - - v = h.get_specs() - assert v == [('~q', 'foo', 'bar'), ('~s', 'foo', 'bar')] - assert h.count() == 2 - h.clear() - assert h.count() == 0 - - f = tutils.tflow() - f.request.content = b"foo" - h.add("~s", "foo", "bar") - h.run(f) - assert f.request.content == b"foo" - - f = tutils.tflow(resp=True) - f.request.content = b"foo" - f.response.content = b"foo" - h.run(f) - assert f.response.content == b"bar" - assert f.request.content == b"foo" - - f = tutils.tflow() - h.clear() - h.add("~q", "foo", "bar") - f.request.content = b"foo" - h.run(f) - assert f.request.content == b"bar" - - assert not h.add("~", "foo", "bar") - assert not h.add("foo", "*", "bar") - - -def test_setheaders(): - h = flow.SetHeaders() - h.add("~q", "foo", "bar") - assert h.lst - - h.set( - [ - (".*", "one", "two"), - (".*", "three", "four"), - ] - ) - assert h.count() == 2 - - h.clear() - assert not h.lst - - h.add("~q", "foo", "bar") - h.add("~s", "foo", "bar") - - v = h.get_specs() - assert v == [('~q', 'foo', 'bar'), ('~s', 'foo', 'bar')] - assert h.count() == 2 - h.clear() - assert h.count() == 0 - - f = tutils.tflow() - f.request.content = b"foo" - h.add("~s", "foo", "bar") - h.run(f) - assert f.request.content == b"foo" - - h.clear() - h.add("~s", "one", "two") - h.add("~s", "one", "three") - f = tutils.tflow(resp=True) - f.request.headers["one"] = "xxx" - f.response.headers["one"] = "xxx" - h.run(f) - assert f.request.headers["one"] == "xxx" - assert f.response.headers.get_all("one") == ["two", "three"] - - h.clear() - h.add("~q", "one", "two") - h.add("~q", "one", "three") - f = tutils.tflow() - f.request.headers["one"] = "xxx" - h.run(f) - assert f.request.headers.get_all("one") == ["two", "three"] - - assert not h.add("~", "foo", "bar") diff --git a/test/mitmproxy/test_flow_format_compat.py b/test/mitmproxy/test_flow_format_compat.py index b2cef88d..cc80db81 100644 --- a/test/mitmproxy/test_flow_format_compat.py +++ b/test/mitmproxy/test_flow_format_compat.py @@ -4,7 +4,7 @@ from . import tutils def test_load(): - with open(tutils.test_data.path("data/dumpfile-013"), "rb") as f: + with open(tutils.test_data.path("data/dumpfile-011"), "rb") as f: flow_reader = FlowReader(f) flows = list(flow_reader.stream()) assert len(flows) == 1 @@ -12,7 +12,7 @@ def test_load(): def test_cannot_convert(): - with open(tutils.test_data.path("data/dumpfile-012"), "rb") as f: + with open(tutils.test_data.path("data/dumpfile-010"), "rb") as f: flow_reader = FlowReader(f) with tutils.raises(FlowReadException): list(flow_reader.stream()) diff --git a/test/mitmproxy/test_options.py b/test/mitmproxy/test_options.py new file mode 100644 index 00000000..af619b27 --- /dev/null +++ b/test/mitmproxy/test_options.py @@ -0,0 +1,100 @@ +from __future__ import absolute_import, print_function, division +import copy + +from mitmproxy import options +from mitmproxy import exceptions +from netlib import tutils + + +class TO(options.Options): + def __init__(self, one=None, two=None): + self.one = one + self.two = two + super(TO, self).__init__() + + +def test_options(): + o = TO(two="three") + assert o.one is None + assert o.two == "three" + o.one = "one" + assert o.one == "one" + + with tutils.raises(TypeError): + TO(nonexistent = "value") + with tutils.raises("no such option"): + o.nonexistent = "value" + with tutils.raises("no such option"): + o.update(nonexistent = "value") + + rec = [] + + def sub(opts): + rec.append(copy.copy(opts)) + + o.changed.connect(sub) + + o.one = "ninety" + assert len(rec) == 1 + assert rec[-1].one == "ninety" + + o.update(one="oink") + assert len(rec) == 2 + assert rec[-1].one == "oink" + + +def test_setter(): + o = TO(two="three") + f = o.setter("two") + f("xxx") + assert o.two == "xxx" + with tutils.raises("no such option"): + o.setter("nonexistent") + + +def test_toggler(): + o = TO(two=True) + f = o.toggler("two") + f() + assert o.two is False + f() + assert o.two is True + with tutils.raises("no such option"): + o.toggler("nonexistent") + + +def test_rollback(): + o = TO(one="two") + + rec = [] + + def sub(opts): + rec.append(copy.copy(opts)) + + recerr = [] + + def errsub(opts, **kwargs): + recerr.append(kwargs) + + def err(opts): + if opts.one == "ten": + raise exceptions.OptionsError() + + o.changed.connect(sub) + o.changed.connect(err) + o.errored.connect(errsub) + + o.one = "ten" + assert isinstance(recerr[0]["exc"], exceptions.OptionsError) + assert o.one == "two" + assert len(rec) == 2 + assert rec[0].one == "ten" + assert rec[1].one == "two" + + +def test_repr(): + assert repr(TO()) == "test.mitmproxy.test_options.TO({'one': None, 'two': None})" + assert repr(TO(one='x' * 60)) == """test.mitmproxy.test_options.TO({ + 'one': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', + 'two': None +})""" diff --git a/test/mitmproxy/test_protocol_http2.py b/test/mitmproxy/test_protocol_http2.py index 58ffb787..a7a3ba3f 100644 --- a/test/mitmproxy/test_protocol_http2.py +++ b/test/mitmproxy/test_protocol_http2.py @@ -9,6 +9,7 @@ import traceback import h2 +from mitmproxy.flow import options from mitmproxy.proxy.config import ProxyConfig from mitmproxy.cmdline import APP_HOST, APP_PORT @@ -60,7 +61,10 @@ class _Http2ServerBase(netlib_tservers.ServerTestBase): except HttpException: print(traceback.format_exc()) assert False + except netlib.exceptions.TcpDisconnect: + break except: + print(traceback.format_exc()) break self.wfile.write(h2_conn.data_to_send()) self.wfile.flush() @@ -70,8 +74,11 @@ class _Http2ServerBase(netlib_tservers.ServerTestBase): if not self.server.handle_server_event(event, h2_conn, self.rfile, self.wfile): done = True break + except netlib.exceptions.TcpDisconnect: + done = True except: done = True + print(traceback.format_exc()) break def handle_server_event(self, h2_conn, rfile, wfile): @@ -81,39 +88,37 @@ class _Http2ServerBase(netlib_tservers.ServerTestBase): class _Http2TestBase(object): @classmethod - def setup_class(self): - self.config = ProxyConfig(**self.get_proxy_config()) + def setup_class(cls): + cls.masteroptions = options.Options() + cnf, opts = cls.get_proxy_config() + cls.config = ProxyConfig(opts, **cnf) - tmaster = tservers.TestMaster(self.config) + tmaster = tservers.TestMaster(opts, cls.config) tmaster.start_app(APP_HOST, APP_PORT) - self.proxy = tservers.ProxyThread(tmaster) - self.proxy.start() + cls.proxy = tservers.ProxyThread(tmaster) + cls.proxy.start() @classmethod def teardown_class(cls): cls.proxy.shutdown() + @classmethod + def get_proxy_config(cls): + opts = options.Options(listen_port=0, no_upstream_cert=False) + opts.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") + d = dict() + return d, opts + @property def master(self): return self.proxy.tmaster - @classmethod - def get_proxy_config(cls): - cls.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") - return dict( - no_upstream_cert = False, - cadir = cls.cadir, - authenticator = None, - ) - def setup(self): self.master.clear_log() self.master.state.clear() self.server.server.handle_server_event = self.handle_server_event def _setup_connection(self): - self.config.http2 = True - client = netlib.tcp.TCPClient(("127.0.0.1", self.proxy.port)) client.connect() @@ -138,11 +143,26 @@ class _Http2TestBase(object): return client, h2_conn - def _send_request(self, wfile, h2_conn, stream_id=1, headers=[], body=b''): + def _send_request(self, + wfile, + h2_conn, + stream_id=1, + headers=[], + body=b'', + end_stream=None, + priority_exclusive=None, + priority_depends_on=None, + priority_weight=None): + if end_stream is None: + end_stream = (len(body) == 0) + h2_conn.send_headers( stream_id=stream_id, headers=headers, - end_stream=(len(body) == 0), + end_stream=end_stream, + priority_exclusive=priority_exclusive, + priority_depends_on=priority_depends_on, + priority_weight=priority_weight, ) if body: h2_conn.send_data(stream_id, body) @@ -151,8 +171,7 @@ class _Http2TestBase(object): wfile.flush() -@requires_alpn -class TestSimple(_Http2TestBase, _Http2ServerBase): +class _Http2Test(_Http2TestBase, _Http2ServerBase): @classmethod def setup_class(self): @@ -164,6 +183,11 @@ class TestSimple(_Http2TestBase, _Http2ServerBase): _Http2TestBase.teardown_class() _Http2ServerBase.teardown_class() + +@requires_alpn +class TestSimple(_Http2Test): + request_body_buffer = b'' + @classmethod def handle_server_event(self, event, h2_conn, rfile, wfile): if isinstance(event, h2.events.ConnectionTerminated): @@ -171,7 +195,7 @@ class TestSimple(_Http2TestBase, _Http2ServerBase): elif isinstance(event, h2.events.RequestReceived): assert (b'client-foo', b'client-bar-1') in event.headers assert (b'client-foo', b'client-bar-2') in event.headers - + elif isinstance(event, h2.events.StreamEnded): import warnings with warnings.catch_warnings(): # Ignore UnicodeWarning: @@ -187,23 +211,30 @@ class TestSimple(_Http2TestBase, _Http2ServerBase): ('föo', 'bär'), ('X-Stream-ID', str(event.stream_id)), ]) - h2_conn.send_data(event.stream_id, b'foobar') + h2_conn.send_data(event.stream_id, b'response body') h2_conn.end_stream(event.stream_id) wfile.write(h2_conn.data_to_send()) wfile.flush() + elif isinstance(event, h2.events.DataReceived): + self.request_body_buffer += event.data return True def test_simple(self): + response_body_buffer = b'' client, h2_conn = self._setup_connection() - self._send_request(client.wfile, h2_conn, headers=[ - (':authority', "127.0.0.1:%s" % self.server.server.address.port), - (':method', 'GET'), - (':scheme', 'https'), - (':path', '/'), - ('ClIeNt-FoO', 'client-bar-1'), - ('ClIeNt-FoO', 'client-bar-2'), - ], body=b'my request body echoed back to me') + self._send_request( + client.wfile, + h2_conn, + headers=[ + (':authority', "127.0.0.1:%s" % self.server.server.address.port), + (':method', 'GET'), + (':scheme', 'https'), + (':path', '/'), + ('ClIeNt-FoO', 'client-bar-1'), + ('ClIeNt-FoO', 'client-bar-2'), + ], + body=b'request body') done = False while not done: @@ -218,7 +249,9 @@ class TestSimple(_Http2TestBase, _Http2ServerBase): client.wfile.flush() for event in events: - if isinstance(event, h2.events.StreamEnded): + if isinstance(event, h2.events.DataReceived): + response_body_buffer += event.data + elif isinstance(event, h2.events.StreamEnded): done = True h2_conn.close_connection() @@ -229,41 +262,226 @@ class TestSimple(_Http2TestBase, _Http2ServerBase): assert self.master.state.flows[0].response.status_code == 200 assert self.master.state.flows[0].response.headers['server-foo'] == 'server-bar' assert self.master.state.flows[0].response.headers['föo'] == 'bär' - assert self.master.state.flows[0].response.body == b'foobar' + assert self.master.state.flows[0].response.body == b'response body' + assert self.request_body_buffer == b'request body' + assert response_body_buffer == b'response body' @requires_alpn -class TestWithBodies(_Http2TestBase, _Http2ServerBase): - tmp_data_buffer_foobar = b'' +class TestRequestWithPriority(_Http2Test): @classmethod - def setup_class(self): - _Http2TestBase.setup_class() - _Http2ServerBase.setup_class() + def handle_server_event(self, event, h2_conn, rfile, wfile): + if isinstance(event, h2.events.ConnectionTerminated): + return False + elif isinstance(event, h2.events.RequestReceived): + import warnings + with warnings.catch_warnings(): + # Ignore UnicodeWarning: + # h2/utilities.py:64: UnicodeWarning: Unicode equal comparison + # failed to convert both arguments to Unicode - interpreting + # them as being unequal. + # elif header[0] in (b'cookie', u'cookie') and len(header[1]) < 20: + + warnings.simplefilter("ignore") + + headers = [(':status', '200')] + if event.priority_updated: + headers.append(('priority_exclusive', event.priority_updated.exclusive)) + headers.append(('priority_depends_on', event.priority_updated.depends_on)) + headers.append(('priority_weight', event.priority_updated.weight)) + h2_conn.send_headers(event.stream_id, headers) + h2_conn.end_stream(event.stream_id) + wfile.write(h2_conn.data_to_send()) + wfile.flush() + return True + + def test_request_with_priority(self): + client, h2_conn = self._setup_connection() + + self._send_request( + client.wfile, + h2_conn, + headers=[ + (':authority', "127.0.0.1:%s" % self.server.server.address.port), + (':method', 'GET'), + (':scheme', 'https'), + (':path', '/'), + ], + priority_exclusive = True, + priority_depends_on = 42424242, + priority_weight = 42, + ) + + done = False + while not done: + try: + raw = b''.join(framereader.http2_read_raw_frame(client.rfile)) + events = h2_conn.receive_data(raw) + except HttpException: + print(traceback.format_exc()) + assert False + + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + for event in events: + if isinstance(event, h2.events.StreamEnded): + done = True + + h2_conn.close_connection() + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + assert len(self.master.state.flows) == 1 + assert self.master.state.flows[0].response.headers['priority_exclusive'] == 'True' + assert self.master.state.flows[0].response.headers['priority_depends_on'] == '42424242' + assert self.master.state.flows[0].response.headers['priority_weight'] == '42' + + def test_request_without_priority(self): + client, h2_conn = self._setup_connection() + + self._send_request( + client.wfile, + h2_conn, + headers=[ + (':authority', "127.0.0.1:%s" % self.server.server.address.port), + (':method', 'GET'), + (':scheme', 'https'), + (':path', '/'), + ], + ) + + done = False + while not done: + try: + raw = b''.join(framereader.http2_read_raw_frame(client.rfile)) + events = h2_conn.receive_data(raw) + except HttpException: + print(traceback.format_exc()) + assert False + + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + for event in events: + if isinstance(event, h2.events.StreamEnded): + done = True + + h2_conn.close_connection() + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + assert len(self.master.state.flows) == 1 + assert 'priority_exclusive' not in self.master.state.flows[0].response.headers + assert 'priority_depends_on' not in self.master.state.flows[0].response.headers + assert 'priority_weight' not in self.master.state.flows[0].response.headers + + +@requires_alpn +class TestPriority(_Http2Test): + priority_data = None @classmethod - def teardown_class(self): - _Http2TestBase.teardown_class() - _Http2ServerBase.teardown_class() + def handle_server_event(self, event, h2_conn, rfile, wfile): + if isinstance(event, h2.events.ConnectionTerminated): + return False + elif isinstance(event, h2.events.PriorityUpdated): + self.priority_data = (event.exclusive, event.depends_on, event.weight) + elif isinstance(event, h2.events.RequestReceived): + import warnings + with warnings.catch_warnings(): + # Ignore UnicodeWarning: + # h2/utilities.py:64: UnicodeWarning: Unicode equal comparison + # failed to convert both arguments to Unicode - interpreting + # them as being unequal. + # elif header[0] in (b'cookie', u'cookie') and len(header[1]) < 20: + + warnings.simplefilter("ignore") + + headers = [(':status', '200')] + h2_conn.send_headers(event.stream_id, headers) + h2_conn.end_stream(event.stream_id) + wfile.write(h2_conn.data_to_send()) + wfile.flush() + return True + + def test_priority(self): + client, h2_conn = self._setup_connection() + + h2_conn.prioritize(1, exclusive=True, depends_on=0, weight=42) + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + self._send_request( + client.wfile, + h2_conn, + headers=[ + (':authority', "127.0.0.1:%s" % self.server.server.address.port), + (':method', 'GET'), + (':scheme', 'https'), + (':path', '/'), + ], + ) + + done = False + while not done: + try: + raw = b''.join(framereader.http2_read_raw_frame(client.rfile)) + events = h2_conn.receive_data(raw) + except HttpException: + print(traceback.format_exc()) + assert False + + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + for event in events: + if isinstance(event, h2.events.StreamEnded): + done = True + + h2_conn.close_connection() + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + assert len(self.master.state.flows) == 1 + assert self.priority_data == (True, 0, 42) + + +@requires_alpn +class TestPriorityWithExistingStream(_Http2Test): + priority_data = [] @classmethod def handle_server_event(self, event, h2_conn, rfile, wfile): if isinstance(event, h2.events.ConnectionTerminated): return False - if isinstance(event, h2.events.DataReceived): - self.tmp_data_buffer_foobar += event.data + elif isinstance(event, h2.events.PriorityUpdated): + self.priority_data.append((event.exclusive, event.depends_on, event.weight)) + elif isinstance(event, h2.events.RequestReceived): + assert not event.priority_updated + + import warnings + with warnings.catch_warnings(): + # Ignore UnicodeWarning: + # h2/utilities.py:64: UnicodeWarning: Unicode equal comparison + # failed to convert both arguments to Unicode - interpreting + # them as being unequal. + # elif header[0] in (b'cookie', u'cookie') and len(header[1]) < 20: + + warnings.simplefilter("ignore") + + headers = [(':status', '200')] + h2_conn.send_headers(event.stream_id, headers) + wfile.write(h2_conn.data_to_send()) + wfile.flush() elif isinstance(event, h2.events.StreamEnded): - h2_conn.send_headers(1, [ - (':status', '200'), - ]) - h2_conn.send_data(1, self.tmp_data_buffer_foobar) - h2_conn.end_stream(1) + h2_conn.end_stream(event.stream_id) wfile.write(h2_conn.data_to_send()) wfile.flush() - return True - def test_with_bodies(self): + def test_priority_with_existing_stream(self): client, h2_conn = self._setup_connection() self._send_request( @@ -275,9 +493,14 @@ class TestWithBodies(_Http2TestBase, _Http2ServerBase): (':scheme', 'https'), (':path', '/'), ], - body=b'foobar with request body', + end_stream=False, ) + h2_conn.prioritize(1, exclusive=True, depends_on=0, weight=42) + h2_conn.end_stream(1) + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + done = False while not done: try: @@ -298,21 +521,112 @@ class TestWithBodies(_Http2TestBase, _Http2ServerBase): client.wfile.write(h2_conn.data_to_send()) client.wfile.flush() - assert self.master.state.flows[0].response.body == b'foobar with request body' + assert len(self.master.state.flows) == 1 + assert self.priority_data == [(True, 0, 42)] @requires_alpn -class TestPushPromise(_Http2TestBase, _Http2ServerBase): +class TestStreamResetFromServer(_Http2Test): @classmethod - def setup_class(self): - _Http2TestBase.setup_class() - _Http2ServerBase.setup_class() + def handle_server_event(self, event, h2_conn, rfile, wfile): + if isinstance(event, h2.events.ConnectionTerminated): + return False + elif isinstance(event, h2.events.RequestReceived): + h2_conn.reset_stream(event.stream_id, 0x8) + wfile.write(h2_conn.data_to_send()) + wfile.flush() + return True + + def test_request_with_priority(self): + client, h2_conn = self._setup_connection() + + self._send_request( + client.wfile, + h2_conn, + headers=[ + (':authority', "127.0.0.1:%s" % self.server.server.address.port), + (':method', 'GET'), + (':scheme', 'https'), + (':path', '/'), + ], + ) + + done = False + while not done: + try: + raw = b''.join(framereader.http2_read_raw_frame(client.rfile)) + events = h2_conn.receive_data(raw) + except HttpException: + print(traceback.format_exc()) + assert False + + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + for event in events: + if isinstance(event, h2.events.StreamReset): + done = True + + h2_conn.close_connection() + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + assert len(self.master.state.flows) == 1 + assert self.master.state.flows[0].response is None + + +@requires_alpn +class TestBodySizeLimit(_Http2Test): @classmethod - def teardown_class(self): - _Http2TestBase.teardown_class() - _Http2ServerBase.teardown_class() + def handle_server_event(self, event, h2_conn, rfile, wfile): + if isinstance(event, h2.events.ConnectionTerminated): + return False + return True + + def test_body_size_limit(self): + self.config.options.body_size_limit = 20 + + client, h2_conn = self._setup_connection() + + self._send_request( + client.wfile, + h2_conn, + headers=[ + (':authority', "127.0.0.1:%s" % self.server.server.address.port), + (':method', 'GET'), + (':scheme', 'https'), + (':path', '/'), + ], + body=b'very long body over 20 characters long', + ) + + done = False + while not done: + try: + raw = b''.join(framereader.http2_read_raw_frame(client.rfile)) + events = h2_conn.receive_data(raw) + except HttpException: + print(traceback.format_exc()) + assert False + + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + for event in events: + if isinstance(event, h2.events.StreamReset): + done = True + + h2_conn.close_connection() + client.wfile.write(h2_conn.data_to_send()) + client.wfile.flush() + + assert len(self.master.state.flows) == 0 + + +@requires_alpn +class TestPushPromise(_Http2Test): @classmethod def handle_server_event(self, event, h2_conn, rfile, wfile): @@ -465,17 +779,7 @@ class TestPushPromise(_Http2TestBase, _Http2ServerBase): @requires_alpn -class TestConnectionLost(_Http2TestBase, _Http2ServerBase): - - @classmethod - def setup_class(self): - _Http2TestBase.setup_class() - _Http2ServerBase.setup_class() - - @classmethod - def teardown_class(self): - _Http2TestBase.teardown_class() - _Http2ServerBase.teardown_class() +class TestConnectionLost(_Http2Test): @classmethod def handle_server_event(self, event, h2_conn, rfile, wfile): @@ -517,7 +821,7 @@ class TestConnectionLost(_Http2TestBase, _Http2ServerBase): @requires_alpn -class TestMaxConcurrentStreams(_Http2TestBase, _Http2ServerBase): +class TestMaxConcurrentStreams(_Http2Test): @classmethod def setup_class(self): @@ -525,11 +829,6 @@ class TestMaxConcurrentStreams(_Http2TestBase, _Http2ServerBase): _Http2ServerBase.setup_class(h2_server_settings={h2.settings.MAX_CONCURRENT_STREAMS: 2}) @classmethod - def teardown_class(self): - _Http2TestBase.teardown_class() - _Http2ServerBase.teardown_class() - - @classmethod def handle_server_event(self, event, h2_conn, rfile, wfile): if isinstance(event, h2.events.ConnectionTerminated): return False @@ -583,17 +882,7 @@ class TestMaxConcurrentStreams(_Http2TestBase, _Http2ServerBase): @requires_alpn -class TestConnectionTerminated(_Http2TestBase, _Http2ServerBase): - - @classmethod - def setup_class(self): - _Http2TestBase.setup_class() - _Http2ServerBase.setup_class() - - @classmethod - def teardown_class(self): - _Http2TestBase.teardown_class() - _Http2ServerBase.teardown_class() +class TestConnectionTerminated(_Http2Test): @classmethod def handle_server_event(self, event, h2_conn, rfile, wfile): diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index cd24fc9f..7095d9d2 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -4,9 +4,10 @@ from OpenSSL import SSL from mitmproxy import cmdline from mitmproxy.proxy import ProxyConfig -from mitmproxy.proxy.config import process_proxy_options from mitmproxy.models.connections import ServerConnection from mitmproxy.proxy.server import DummyServer, ProxyServer, ConnectionHandler +from mitmproxy.flow import options +from mitmproxy.proxy import config from netlib.exceptions import TcpDisconnect from pathod import test from netlib.http import http1 @@ -58,8 +59,10 @@ class TestProcessProxyOptions: def p(self, *args): parser = tutils.MockParser() cmdline.common_options(parser) - opts = parser.parse_args(args=args) - return parser, process_proxy_options(parser, opts) + args = parser.parse_args(args=args) + opts = cmdline.get_common_options(args) + pconf = config.ProxyConfig(options.Options(**opts)) + return parser, pconf def assert_err(self, err, *args): tutils.raises(err, self.p, *args) @@ -82,24 +85,29 @@ class TestProcessProxyOptions: @mock.patch("mitmproxy.platform.resolver") def test_modes(self, _): - self.assert_noerr("-R", "http://localhost") - self.assert_err("expected one argument", "-R") - self.assert_err("Invalid server specification", "-R", "reverse") - - self.assert_noerr("-T") - - self.assert_noerr("-U", "http://localhost") - self.assert_err("expected one argument", "-U") - self.assert_err("Invalid server specification", "-U", "upstream") - - self.assert_noerr("--upstream-auth", "test:test") - self.assert_err("expected one argument", "--upstream-auth") - self.assert_err("Invalid upstream auth specification", "--upstream-auth", "test") - - self.assert_err("mutually exclusive", "-R", "http://localhost", "-T") + # self.assert_noerr("-R", "http://localhost") + # self.assert_err("expected one argument", "-R") + # self.assert_err("Invalid server specification", "-R", "reverse") + # + # self.assert_noerr("-T") + # + # self.assert_noerr("-U", "http://localhost") + # self.assert_err("expected one argument", "-U") + # self.assert_err("Invalid server specification", "-U", "upstream") + # + # self.assert_noerr("--upstream-auth", "test:test") + # self.assert_err("expected one argument", "--upstream-auth") + self.assert_err( + "Invalid upstream auth specification", "--upstream-auth", "test" + ) + # self.assert_err("mutually exclusive", "-R", "http://localhost", "-T") def test_socks_auth(self): - self.assert_err("Proxy Authentication not supported in SOCKS mode.", "--socks", "--nonanonymous") + self.assert_err( + "Proxy Authentication not supported in SOCKS mode.", + "--socks", + "--nonanonymous" + ) def test_client_certs(self): with tutils.tmpdir() as cadir: @@ -145,12 +153,12 @@ class TestProcessProxyOptions: def test_upstream_trusted_cadir(self): expected_dir = "/path/to/a/ca/dir" p = self.assert_noerr("--upstream-trusted-cadir", expected_dir) - assert p.openssl_trusted_cadir_server == expected_dir + assert p.options.ssl_verify_upstream_trusted_cadir == expected_dir def test_upstream_trusted_ca(self): expected_file = "/path/to/a/cert/file" p = self.assert_noerr("--upstream-trusted-ca", expected_file) - assert p.openssl_trusted_ca_server == expected_file + assert p.options.ssl_verify_upstream_trusted_ca == expected_file class TestProxyServer: @@ -159,13 +167,13 @@ class TestProxyServer: @tutils.skip_windows def test_err(self): conf = ProxyConfig( - port=1 + options.Options(listen_port=1), ) tutils.raises("error starting proxy server", ProxyServer, conf) def test_err_2(self): conf = ProxyConfig( - host="invalidhost" + options.Options(listen_host="invalidhost"), ) tutils.raises("error starting proxy server", ProxyServer, conf) @@ -184,7 +192,7 @@ class TestConnectionHandler: config = mock.Mock() root_layer = mock.Mock() root_layer.side_effect = RuntimeError - config.mode.return_value = root_layer + config.options.mode.return_value = root_layer channel = mock.Mock() def ask(_, x): diff --git a/test/mitmproxy/test_proxy_config.py b/test/mitmproxy/test_proxy_config.py new file mode 100644 index 00000000..d8085eb8 --- /dev/null +++ b/test/mitmproxy/test_proxy_config.py @@ -0,0 +1,48 @@ +from . import tutils +import base64 +from mitmproxy.proxy import config + + +def test_parse_server_spec(): + tutils.raises( + "Invalid server specification", config.parse_server_spec, "" + ) + assert config.parse_server_spec("http://foo.com:88") == ( + "http", ("foo.com", 88) + ) + assert config.parse_server_spec("http://foo.com") == ( + "http", ("foo.com", 80) + ) + assert config.parse_server_spec("https://foo.com") == ( + "https", ("foo.com", 443) + ) + tutils.raises( + "Invalid server specification", + config.parse_server_spec, + "foo.com" + ) + tutils.raises( + "Invalid server specification", + config.parse_server_spec, + "http://" + ) + + +def test_parse_upstream_auth(): + tutils.raises( + "Invalid upstream auth specification", + config.parse_upstream_auth, + "" + ) + tutils.raises( + "Invalid upstream auth specification", + config.parse_upstream_auth, + ":" + ) + tutils.raises( + "Invalid upstream auth specification", + config.parse_upstream_auth, + ":test" + ) + assert config.parse_upstream_auth("test:test") == b"Basic" + b" " + base64.b64encode(b"test:test") + assert config.parse_upstream_auth("test:") == b"Basic" + b" " + base64.b64encode(b"test:") diff --git a/test/mitmproxy/test_script.py b/test/mitmproxy/test_script.py deleted file mode 100644 index 81994780..00000000 --- a/test/mitmproxy/test_script.py +++ /dev/null @@ -1,13 +0,0 @@ -from mitmproxy import flow -from . import tutils - - -def test_duplicate_flow(): - s = flow.State() - fm = flow.FlowMaster(None, s) - fm.load_script(tutils.test_data.path("data/scripts/duplicate_flow.py")) - f = tutils.tflow() - fm.request(f) - assert fm.state.flow_count() == 2 - assert not fm.state.view[0].request.is_replay - assert fm.state.view[1].request.is_replay diff --git a/test/mitmproxy/test_server.py b/test/mitmproxy/test_server.py index 0ab7624e..b8b057fd 100644 --- a/test/mitmproxy/test_server.py +++ b/test/mitmproxy/test_server.py @@ -1,6 +1,7 @@ import os import socket import time +import types from OpenSSL import SSL from netlib.exceptions import HttpReadDisconnect, HttpException from netlib.tcp import Address @@ -12,8 +13,9 @@ from netlib.http import authentication, http1 from netlib.tutils import raises from pathod import pathoc, pathod +from mitmproxy.builtins import script from mitmproxy import controller -from mitmproxy.proxy.config import HostMatcher +from mitmproxy.proxy.config import HostMatcher, parse_server_spec from mitmproxy.models import Error, HTTPResponse, HTTPFlow from . import tutils, tservers @@ -286,20 +288,18 @@ class TestHTTP(tservers.HTTPProxyTest, CommonMixin, AppMixin): self.master.set_stream_large_bodies(None) def test_stream_modify(self): - self.master.load_script(tutils.test_data.path("data/scripts/stream_modify.py")) + s = script.Script( + tutils.test_data.path("data/addonscripts/stream_modify.py") + ) + self.master.addons.add(s) d = self.pathod('200:b"foo"') assert d.content == b"bar" - self.master.unload_scripts() + self.master.addons.remove(s) class TestHTTPAuth(tservers.HTTPProxyTest): - authenticator = http.authentication.BasicProxyAuth( - http.authentication.PassManSingleUser( - "test", - "test"), - "realm") - def test_auth(self): + self.master.options.auth_singleuser = "test:test" assert self.pathod("202").status_code == 407 p = self.pathoc() ret = p.request(""" @@ -363,15 +363,17 @@ class TestHTTPSUpstreamServerVerificationWTrustedCert(tservers.HTTPProxyTest): ]) def test_verification_w_cadir(self): - self.config.openssl_verification_mode_server = SSL.VERIFY_PEER - self.config.openssl_trusted_cadir_server = tutils.test_data.path( - "data/trusted-cadir/") - + self.config.options.update( + ssl_verify_upstream_cert = True, + ssl_verify_upstream_trusted_cadir = tutils.test_data.path( + "data/trusted-cadir/" + ) + ) self.pathoc() def test_verification_w_pemfile(self): self.config.openssl_verification_mode_server = SSL.VERIFY_PEER - self.config.openssl_trusted_ca_server = tutils.test_data.path( + self.config.options.ssl_verify_upstream_trusted_ca = tutils.test_data.path( "data/trusted-cadir/trusted-ca.pem") self.pathoc() @@ -396,23 +398,29 @@ class TestHTTPSUpstreamServerVerificationWBadCert(tservers.HTTPProxyTest): def test_default_verification_w_bad_cert(self): """Should use no verification.""" - self.config.openssl_trusted_ca_server = tutils.test_data.path( - "data/trusted-cadir/trusted-ca.pem") - + self.config.options.update( + ssl_verify_upstream_trusted_ca = tutils.test_data.path( + "data/trusted-cadir/trusted-ca.pem" + ) + ) assert self._request().status_code == 242 def test_no_verification_w_bad_cert(self): - self.config.openssl_verification_mode_server = SSL.VERIFY_NONE - self.config.openssl_trusted_ca_server = tutils.test_data.path( - "data/trusted-cadir/trusted-ca.pem") - + self.config.options.update( + ssl_verify_upstream_cert = False, + ssl_verify_upstream_trusted_ca = tutils.test_data.path( + "data/trusted-cadir/trusted-ca.pem" + ) + ) assert self._request().status_code == 242 def test_verification_w_bad_cert(self): - self.config.openssl_verification_mode_server = SSL.VERIFY_PEER - self.config.openssl_trusted_ca_server = tutils.test_data.path( - "data/trusted-cadir/trusted-ca.pem") - + self.config.options.update( + ssl_verify_upstream_cert = True, + ssl_verify_upstream_trusted_ca = tutils.test_data.path( + "data/trusted-cadir/trusted-ca.pem" + ) + ) assert self._request().status_code == 502 @@ -479,9 +487,10 @@ class TestHttps2Http(tservers.ReverseProxyTest): @classmethod def get_proxy_config(cls): - d = super(TestHttps2Http, cls).get_proxy_config() - d["upstream_server"] = ("http", d["upstream_server"][1]) - return d + d, opts = super(TestHttps2Http, cls).get_proxy_config() + s = parse_server_spec(opts.upstream_server) + opts.upstream_server = "http://%s" % s.address + return d, opts def pathoc(self, ssl, sni=None): """ @@ -511,15 +520,15 @@ class TestTransparent(tservers.TransparentProxyTest, CommonMixin, TcpMixin): ssl = False def test_tcp_stream_modify(self): - self.master.load_script(tutils.test_data.path("data/scripts/tcp_stream_modify.py")) - + s = script.Script( + tutils.test_data.path("data/addonscripts/tcp_stream_modify.py") + ) + self.master.addons.add(s) self._tcpproxy_on() d = self.pathod('200:b"foo"') self._tcpproxy_off() - assert d.content == b"bar" - - self.master.unload_scripts() + self.master.addons.remove(s) class TestTransparentSSL(tservers.TransparentProxyTest, CommonMixin, TcpMixin): @@ -834,17 +843,12 @@ class TestUpstreamProxy(tservers.HTTPUpstreamProxyTest, CommonMixin, AppMixin): ssl = False def test_order(self): - self.proxy.tmaster.replacehooks.add( - "~q", - "foo", - "bar") # replace in request - self.chain[0].tmaster.replacehooks.add("~q", "bar", "baz") - self.chain[1].tmaster.replacehooks.add("~q", "foo", "oh noes!") - self.chain[0].tmaster.replacehooks.add( - "~s", - "baz", - "ORLY") # replace in response - + self.proxy.tmaster.options.replacements = [ + ("~q", "foo", "bar"), + ("~q", "bar", "baz"), + ("~q", "foo", "oh noes!"), + ("~s", "baz", "ORLY") + ] p = self.pathoc() req = p.request("get:'%s/p/418:b\"foo\"'" % self.server.urlbase) assert req.content == b"ORLY" @@ -945,7 +949,7 @@ class TestProxyChainingSSLReconnect(tservers.HTTPUpstreamProxyTest): f.reply.kill() return _func(f) - setattr(master, attr, handler) + setattr(master, attr, types.MethodType(handler, master)) kill_requests( self.chain[1].tmaster, diff --git a/test/mitmproxy/test_web_master.py b/test/mitmproxy/test_web_master.py index f0fafe24..2ab440ce 100644 --- a/test/mitmproxy/test_web_master.py +++ b/test/mitmproxy/test_web_master.py @@ -3,15 +3,12 @@ from . import mastertest class TestWebMaster(mastertest.MasterTest): - def mkmaster(self, filt, **options): - o = master.Options( - filtstr=filt, - **options - ) + def mkmaster(self, **options): + o = master.Options(**options) return master.WebMaster(None, o) def test_basic(self): - m = self.mkmaster(None) + m = self.mkmaster() for i in (1, 2, 3): self.dummy_cycle(m, 1, b"") assert len(m.state.flows) == i diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py index 0760cb53..495765da 100644 --- a/test/mitmproxy/tservers.py +++ b/test/mitmproxy/tservers.py @@ -9,7 +9,9 @@ from mitmproxy.proxy.server import ProxyServer import pathod.test import pathod.pathoc from mitmproxy import flow, controller +from mitmproxy.flow import options from mitmproxy.cmdline import APP_HOST, APP_PORT +from mitmproxy import builtins testapp = flask.Flask(__name__) @@ -30,11 +32,11 @@ def errapp(environ, start_response): class TestMaster(flow.FlowMaster): - def __init__(self, config): - config.port = 0 + def __init__(self, opts, config): s = ProxyServer(config) state = flow.State() - flow.FlowMaster.__init__(self, s, state) + flow.FlowMaster.__init__(self, opts, s, state) + self.addons.add(*builtins.default_addons()) self.apps.add(testapp, "testapp", 80) self.apps.add(errapp, "errapp", 80) self.clear_log() @@ -42,7 +44,7 @@ class TestMaster(flow.FlowMaster): def clear_log(self): self.tlog = [] - def add_event(self, message, level=None): + def add_log(self, message, level=None): self.tlog.append(message) @@ -52,7 +54,8 @@ class ProxyThread(threading.Thread): threading.Thread.__init__(self) self.tmaster = tmaster self.name = "ProxyThread (%s:%s)" % ( - tmaster.server.address.host, tmaster.server.address.port) + tmaster.server.address.host, tmaster.server.address.port + ) controller.should_exit = False @property @@ -75,7 +78,6 @@ class ProxyTestBase(object): ssl = None ssloptions = False no_upstream_cert = False - authenticator = None masterclass = TestMaster add_upstream_certs_to_client_chain = False @@ -88,9 +90,9 @@ class ProxyTestBase(object): ssl=cls.ssl, ssloptions=cls.ssloptions) - cls.config = ProxyConfig(**cls.get_proxy_config()) - - tmaster = cls.masterclass(cls.config) + cnf, opts = cls.get_proxy_config() + cls.config = ProxyConfig(opts, **cnf) + tmaster = cls.masterclass(opts, cls.config) tmaster.start_app(APP_HOST, APP_PORT) cls.proxy = ProxyThread(tmaster) cls.proxy.start() @@ -117,11 +119,12 @@ class ProxyTestBase(object): @classmethod def get_proxy_config(cls): cls.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") - return dict( + cnf = dict() + return cnf, options.Options( + listen_port=0, + cadir=cls.cadir, no_upstream_cert = cls.no_upstream_cert, - cadir = cls.cadir, - authenticator = cls.authenticator, - add_upstream_certs_to_client_chain = cls.add_upstream_certs_to_client_chain, + add_upstream_certs_to_client_chain=cls.add_upstream_certs_to_client_chain ) @@ -196,9 +199,9 @@ class TransparentProxyTest(ProxyTestBase): @classmethod def get_proxy_config(cls): - d = ProxyTestBase.get_proxy_config() - d["mode"] = "transparent" - return d + d, opts = ProxyTestBase.get_proxy_config() + opts.mode = "transparent" + return d, opts def pathod(self, spec, sni=None): """ @@ -228,13 +231,17 @@ class ReverseProxyTest(ProxyTestBase): @classmethod def get_proxy_config(cls): - d = ProxyTestBase.get_proxy_config() - d["upstream_server"] = ( - "https" if cls.ssl else "http", - ("127.0.0.1", cls.server.port) + d, opts = ProxyTestBase.get_proxy_config() + opts.upstream_server = "".join( + [ + "https" if cls.ssl else "http", + "://", + "127.0.0.1:", + str(cls.server.port) + ] ) - d["mode"] = "reverse" - return d + opts.mode = "reverse" + return d, opts def pathoc(self, sni=None): """ @@ -263,9 +270,9 @@ class SocksModeTest(HTTPProxyTest): @classmethod def get_proxy_config(cls): - d = ProxyTestBase.get_proxy_config() - d["mode"] = "socks5" - return d + d, opts = ProxyTestBase.get_proxy_config() + opts.mode = "socks5" + return d, opts class ChainProxyTest(ProxyTestBase): @@ -284,15 +291,16 @@ class ChainProxyTest(ProxyTestBase): cls.chain = [] super(ChainProxyTest, cls).setup_class() for _ in range(cls.n): - config = ProxyConfig(**cls.get_proxy_config()) - tmaster = cls.masterclass(config) + cnf, opts = cls.get_proxy_config() + config = ProxyConfig(opts, **cnf) + tmaster = cls.masterclass(opts, config) proxy = ProxyThread(tmaster) proxy.start() cls.chain.insert(0, proxy) # Patch the orginal proxy to upstream mode - cls.config = cls.proxy.tmaster.config = cls.proxy.tmaster.server.config = ProxyConfig( - **cls.get_proxy_config()) + cnf, opts = cls.get_proxy_config() + cls.config = cls.proxy.tmaster.config = cls.proxy.tmaster.server.config = ProxyConfig(opts, **cnf) @classmethod def teardown_class(cls): @@ -308,13 +316,13 @@ class ChainProxyTest(ProxyTestBase): @classmethod def get_proxy_config(cls): - d = super(ChainProxyTest, cls).get_proxy_config() + d, opts = super(ChainProxyTest, cls).get_proxy_config() if cls.chain: # First proxy is in normal mode. - d.update( + opts.update( mode="upstream", - upstream_server=("http", ("127.0.0.1", cls.chain[0].port)) + upstream_server="http://127.0.0.1:%s" % cls.chain[0].port ) - return d + return d, opts class HTTPUpstreamProxyTest(ChainProxyTest, HTTPProxyTest): diff --git a/test/mitmproxy/tutils.py b/test/mitmproxy/tutils.py index d0a09035..d743a9e6 100644 --- a/test/mitmproxy/tutils.py +++ b/test/mitmproxy/tutils.py @@ -4,18 +4,19 @@ import tempfile import argparse import sys -from mitmproxy.models.tcp import TCPMessage -from six.moves import cStringIO as StringIO from contextlib import contextmanager - from unittest.case import SkipTest +from six.moves import cStringIO as StringIO + import netlib.utils import netlib.tutils from mitmproxy import controller from mitmproxy.models import ( ClientConnection, ServerConnection, Error, HTTPRequest, HTTPResponse, HTTPFlow, TCPFlow ) +from mitmproxy.models.tcp import TCPMessage +from mitmproxy.models.flow import Flow def _skip_windows(*args): @@ -47,6 +48,27 @@ def skip_appveyor(fn): return fn +class DummyFlow(Flow): + """A flow that is neither HTTP nor TCP.""" + + def __init__(self, client_conn, server_conn, live=None): + super(DummyFlow, self).__init__("dummy", client_conn, server_conn, live) + + +def tdummyflow(client_conn=True, server_conn=True, err=None): + if client_conn is True: + client_conn = tclient_conn() + if server_conn is True: + server_conn = tserver_conn() + if err is True: + err = terr() + + f = DummyFlow(client_conn, server_conn) + f.error = err + f.reply = controller.DummyReply() + return f + + def ttcpflow(client_conn=True, server_conn=True, messages=True, err=None): if client_conn is True: client_conn = tclient_conn() diff --git a/test/netlib/http/http1/test_read.py b/test/netlib/http/http1/test_read.py index 5285ac1d..c8a40ecb 100644 --- a/test/netlib/http/http1/test_read.py +++ b/test/netlib/http/http1/test_read.py @@ -1,6 +1,9 @@ from __future__ import absolute_import, print_function, division + from io import BytesIO from mock import Mock +import pytest + from netlib.exceptions import HttpException, HttpSyntaxException, HttpReadDisconnect, TcpDisconnect from netlib.http import Headers from netlib.http.http1.read import ( @@ -23,11 +26,18 @@ def test_get_header_tokens(): assert get_header_tokens(headers, "foo") == ["bar", "voing", "oink"] -def test_read_request(): - rfile = BytesIO(b"GET / HTTP/1.1\r\n\r\nskip") +@pytest.mark.parametrize("input", [ + b"GET / HTTP/1.1\r\n\r\nskip", + b"GET / HTTP/1.1\r\n\r\nskip", + b"GET / HTTP/1.1\r\n\r\nskip", + b"GET / HTTP/1.1 \r\n\r\nskip", +]) +def test_read_request(input): + rfile = BytesIO(input) r = read_request(rfile) assert r.method == "GET" assert r.content == b"" + assert r.http_version == "HTTP/1.1" assert r.timestamp_end assert rfile.read() == b"skip" @@ -50,11 +60,19 @@ def test_read_request_head(): assert rfile.read() == b"skip" -def test_read_response(): +@pytest.mark.parametrize("input", [ + b"HTTP/1.1 418 I'm a teapot\r\n\r\nbody", + b"HTTP/1.1 418 I'm a teapot\r\n\r\nbody", + b"HTTP/1.1 418 I'm a teapot\r\n\r\nbody", + b"HTTP/1.1 418 I'm a teapot \r\n\r\nbody", +]) +def test_read_response(input): req = treq() - rfile = BytesIO(b"HTTP/1.1 418 I'm a teapot\r\n\r\nbody") + rfile = BytesIO(input) r = read_response(rfile, req) + assert r.http_version == "HTTP/1.1" assert r.status_code == 418 + assert r.reason == "I'm a teapot" assert r.content == b"body" assert r.timestamp_end diff --git a/test/netlib/http/test_cookies.py b/test/netlib/http/test_cookies.py index 83b85656..17e21b94 100644 --- a/test/netlib/http/test_cookies.py +++ b/test/netlib/http/test_cookies.py @@ -245,3 +245,24 @@ def test_refresh_cookie(): assert cookies.refresh_set_cookie_header(c, 0) c = "foo/bar=bla" assert cookies.refresh_set_cookie_header(c, 0) + + +def test_is_expired(): + CA = cookies.CookieAttrs + + # A cookie can be expired + # by setting the expire time in the past + assert cookies.is_expired(CA([("Expires", "Thu, 01-Jan-1970 00:00:00 GMT")])) + + # or by setting Max-Age to 0 + assert cookies.is_expired(CA([("Max-Age", "0")])) + + # or both + assert cookies.is_expired(CA([("Expires", "Thu, 01-Jan-1970 00:00:00 GMT"), ("Max-Age", "0")])) + + assert not cookies.is_expired(CA([("Expires", "Thu, 24-Aug-2063 00:00:00 GMT")])) + assert not cookies.is_expired(CA([("Max-Age", "1")])) + assert not cookies.is_expired(CA([("Expires", "Thu, 15-Jul-2068 00:00:00 GMT"), ("Max-Age", "1")])) + + assert not cookies.is_expired(CA([("Max-Age", "nan")])) + assert not cookies.is_expired(CA([("Expires", "false")])) diff --git a/test/netlib/http/test_headers.py b/test/netlib/http/test_headers.py index 51819b86..51537310 100644 --- a/test/netlib/http/test_headers.py +++ b/test/netlib/http/test_headers.py @@ -1,4 +1,6 @@ -from netlib.http import Headers, parse_content_type +import collections + +from netlib.http.headers import Headers, parse_content_type, assemble_content_type from netlib.tutils import raises @@ -81,3 +83,10 @@ def test_parse_content_type(): v = p("text/html; charset=UTF-8") assert v == ('text', 'html', {'charset': 'UTF-8'}) + + +def test_assemble_content_type(): + p = assemble_content_type + assert p("text", "html", {}) == "text/html" + assert p("text", "html", {"charset": "utf8"}) == "text/html; charset=utf8" + assert p("text", "html", collections.OrderedDict([("charset", "utf8"), ("foo", "bar")])) == "text/html; charset=utf8; foo=bar" diff --git a/test/netlib/http/test_message.py b/test/netlib/http/test_message.py index ab2ac628..deebd6f2 100644 --- a/test/netlib/http/test_message.py +++ b/test/netlib/http/test_message.py @@ -1,8 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, print_function, division -from netlib.http import decoded +import mock +import six + from netlib.tutils import tresp +from netlib import http, tutils def _test_passthrough_attr(message, attr): @@ -68,6 +71,15 @@ class TestMessage(object): assert resp != 0 + def test_hash(self): + resp = tresp() + assert hash(resp) + + def test_serializable(self): + resp = tresp() + resp2 = http.Response.from_state(resp.get_state()) + assert resp == resp2 + def test_content_length_update(self): resp = tresp() resp.content = b"foo" @@ -76,9 +88,9 @@ class TestMessage(object): resp.content = b"" assert resp.data.content == b"" assert resp.headers["content-length"] == "0" - - def test_content_basic(self): - _test_passthrough_attr(tresp(), "content") + resp.raw_content = b"bar" + assert resp.data.content == b"bar" + assert resp.headers["content-length"] == "0" def test_headers(self): _test_passthrough_attr(tresp(), "headers") @@ -89,65 +101,201 @@ class TestMessage(object): def test_timestamp_end(self): _test_passthrough_attr(tresp(), "timestamp_end") - def teste_http_version(self): + def test_http_version(self): _test_decoded_attr(tresp(), "http_version") -class TestDecodedDecorator(object): - +class TestMessageContentEncoding(object): def test_simple(self): r = tresp() - assert r.content == b"message" + assert r.raw_content == b"message" assert "content-encoding" not in r.headers - assert r.encode("gzip") + r.encode("gzip") assert r.headers["content-encoding"] - assert r.content != b"message" - with decoded(r): - assert "content-encoding" not in r.headers - assert r.content == b"message" - assert r.headers["content-encoding"] - assert r.content != b"message" + assert r.raw_content != b"message" + assert r.content == b"message" + assert r.raw_content != b"message" + + r.raw_content = b"foo" + with mock.patch("netlib.encoding.decode") as e: + assert r.content + assert e.call_count == 1 + e.reset_mock() + assert r.content + assert e.call_count == 0 def test_modify(self): r = tresp() assert "content-encoding" not in r.headers - assert r.encode("gzip") + r.encode("gzip") + + r.content = b"foo" + assert r.raw_content != b"foo" + r.decode() + assert r.raw_content == b"foo" - with decoded(r): + r.encode("identity") + with mock.patch("netlib.encoding.encode") as e: r.content = b"foo" + assert e.call_count == 0 + r.content = b"bar" + assert e.call_count == 1 - assert r.content != b"foo" - r.decode() - assert r.content == b"foo" + with tutils.raises(TypeError): + r.content = u"foo" def test_unknown_ce(self): r = tresp() r.headers["content-encoding"] = "zopfli" - r.content = b"foo" - with decoded(r): - assert r.headers["content-encoding"] - assert r.content == b"foo" + r.raw_content = b"foo" + with tutils.raises(ValueError): + assert r.content assert r.headers["content-encoding"] - assert r.content == b"foo" + assert r.get_content(strict=False) == b"foo" def test_cannot_decode(self): r = tresp() - assert r.encode("gzip") - r.content = b"foo" - with decoded(r): - assert r.headers["content-encoding"] - assert r.content == b"foo" + r.encode("gzip") + r.raw_content = b"foo" + with tutils.raises(ValueError): + assert r.content assert r.headers["content-encoding"] - assert r.content != b"foo" - r.decode() + assert r.get_content(strict=False) == b"foo" + + with tutils.raises(ValueError): + r.decode() + assert r.raw_content == b"foo" + assert "content-encoding" in r.headers + + r.decode(strict=False) assert r.content == b"foo" + assert "content-encoding" not in r.headers + + def test_none(self): + r = tresp(content=None) + assert r.content is None + r.content = b"foo" + assert r.content is not None + r.content = None + assert r.content is None def test_cannot_encode(self): r = tresp() - assert r.encode("gzip") - with decoded(r): - r.content = None + r.encode("gzip") + r.content = None + assert r.headers["content-encoding"] + assert r.raw_content is None + r.headers["content-encoding"] = "zopfli" + r.content = b"foo" assert "content-encoding" not in r.headers - assert r.content is None + assert r.raw_content == b"foo" + + with tutils.raises(ValueError): + r.encode("zopfli") + assert r.raw_content == b"foo" + assert "content-encoding" not in r.headers + + +class TestMessageText(object): + def test_simple(self): + r = tresp(content=b'\xfc') + assert r.raw_content == b"\xfc" + assert r.content == b"\xfc" + assert r.text == u"ü" + + r.encode("gzip") + assert r.text == u"ü" + r.decode() + assert r.text == u"ü" + + r.headers["content-type"] = "text/html; charset=latin1" + r.content = b"\xc3\xbc" + assert r.text == u"ü" + r.headers["content-type"] = "text/html; charset=utf8" + assert r.text == u"ü" + + r.encode("identity") + r.raw_content = b"foo" + with mock.patch("netlib.encoding.decode") as e: + assert r.text + assert e.call_count == 2 + e.reset_mock() + assert r.text + assert e.call_count == 0 + + def test_guess_json(self): + r = tresp(content=b'"\xc3\xbc"') + r.headers["content-type"] = "application/json" + assert r.text == u'"ü"' + + def test_none(self): + r = tresp(content=None) + assert r.text is None + r.text = u"foo" + assert r.text is not None + r.text = None + assert r.text is None + + def test_modify(self): + r = tresp() + + r.text = u"ü" + assert r.raw_content == b"\xfc" + + r.headers["content-type"] = "text/html; charset=utf8" + r.text = u"ü" + assert r.raw_content == b"\xc3\xbc" + assert r.headers["content-length"] == "2" + + r.encode("identity") + with mock.patch("netlib.encoding.encode") as e: + e.return_value = b"" + r.text = u"ü" + assert e.call_count == 0 + r.text = u"ä" + assert e.call_count == 2 + + def test_unknown_ce(self): + r = tresp() + r.headers["content-type"] = "text/html; charset=wtf" + r.raw_content = b"foo" + with tutils.raises(ValueError): + assert r.text == u"foo" + assert r.get_text(strict=False) == u"foo" + + def test_cannot_decode(self): + r = tresp() + r.headers["content-type"] = "text/html; charset=utf8" + r.raw_content = b"\xFF" + with tutils.raises(ValueError): + assert r.text + + assert r.get_text(strict=False) == u'\ufffd' if six.PY2 else '\udcff' + + def test_cannot_encode(self): + r = tresp() + r.content = None + assert "content-type" not in r.headers + assert r.raw_content is None + + r.headers["content-type"] = "text/html; charset=latin1; foo=bar" + r.text = u"☃" + assert r.headers["content-type"] == "text/html; charset=utf-8; foo=bar" + assert r.raw_content == b'\xe2\x98\x83' + + r.headers["content-type"] = "gibberish" + r.text = u"☃" + assert r.headers["content-type"] == "text/plain; charset=utf-8" + assert r.raw_content == b'\xe2\x98\x83' + + del r.headers["content-type"] + r.text = u"☃" + assert r.headers["content-type"] == "text/plain; charset=utf-8" + assert r.raw_content == b'\xe2\x98\x83' + + r.headers["content-type"] = "text/html; charset=latin1" + r.text = u'\udcff' + assert r.headers["content-type"] == "text/html; charset=utf-8" + assert r.raw_content == b'\xed\xb3\xbf' if six.PY2 else b"\xFF" diff --git a/test/netlib/test_encoding.py b/test/netlib/test_encoding.py index 0ff1aad1..de10fc48 100644 --- a/test/netlib/test_encoding.py +++ b/test/netlib/test_encoding.py @@ -1,37 +1,39 @@ -from netlib import encoding +from netlib import encoding, tutils def test_identity(): - assert b"string" == encoding.decode("identity", b"string") - assert b"string" == encoding.encode("identity", b"string") - assert not encoding.encode("nonexistent", b"string") - assert not encoding.decode("nonexistent encoding", b"string") + assert b"string" == encoding.decode(b"string", "identity") + assert b"string" == encoding.encode(b"string", "identity") + with tutils.raises(ValueError): + encoding.encode(b"string", "nonexistent encoding") def test_gzip(): assert b"string" == encoding.decode( - "gzip", encoding.encode( - "gzip", - b"string" - ) + b"string", + "gzip" + ), + "gzip" ) - assert encoding.decode("gzip", b"bogus") is None + with tutils.raises(ValueError): + encoding.decode(b"bogus", "gzip") def test_deflate(): assert b"string" == encoding.decode( - "deflate", encoding.encode( - "deflate", - b"string" - ) + b"string", + "deflate" + ), + "deflate" ) assert b"string" == encoding.decode( - "deflate", encoding.encode( - "deflate", - b"string" - )[2:-4] + b"string", + "deflate" + )[2:-4], + "deflate" ) - assert encoding.decode("deflate", b"bogus") is None + with tutils.raises(ValueError): + encoding.decode(b"bogus", "deflate") diff --git a/test/netlib/test_strutils.py b/test/netlib/test_strutils.py index 68bfdb94..7c3eacc6 100644 --- a/test/netlib/test_strutils.py +++ b/test/netlib/test_strutils.py @@ -38,8 +38,9 @@ def test_escape_control_characters(): u'=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~.' ) - with tutils.raises(ValueError): - strutils.escape_control_characters(b"foo") + if not six.PY2: + with tutils.raises(ValueError): + strutils.escape_control_characters(b"foo") def test_bytes_to_escaped_str(): @@ -7,21 +7,14 @@ deps = {env:CI_DEPS:} -rrequirements.txt passenv = CODECOV_TOKEN CI CI_* TRAVIS TRAVIS_* APPVEYOR APPVEYOR_* -setenv = - TESTS = test/ - HOME = {envtmpdir} +setenv = HOME = {envtmpdir} commands = - py.test --timeout 60 {posargs} {env:TESTS} + py.test --timeout 60 {posargs} {env:CI_COMMANDS:python -c ""} -[testenv:py35] -setenv = - TESTS = --ignore=test/mitmproxy/console/test_master.py --ignore=test/mitmproxy/test_dump.py test/ - HOME = {envtmpdir} - [testenv:docs] changedir = docs -commands = sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html +commands = sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html [testenv:lint] deps = flake8>=2.6.2, <3 diff --git a/web/src/js/__tests__/ducks/flowView.js b/web/src/js/__tests__/ducks/flowView.js new file mode 100644 index 00000000..d5d9a6d9 --- /dev/null +++ b/web/src/js/__tests__/ducks/flowView.js @@ -0,0 +1,67 @@ +jest.unmock('../../ducks/flows') +jest.unmock('../../ducks/flowView') +jest.unmock('../../ducks/utils/view') +jest.unmock('../../ducks/utils/list') +jest.unmock('./tutils') + +import { createStore } from './tutils' + +import flows, * as flowActions from '../../ducks/flows' +import flowView, * as flowViewActions from '../../ducks/flowView' + + +function testStore() { + let store = createStore({ + flows, + flowView + }) + for (let i of [1, 2, 3, 4]) { + store.dispatch( + flowActions.addFlow({ id: i }) + ) + } + return store +} + +describe('select relative', () => { + + function testSelect(start, relative, result) { + const store = testStore() + store.dispatch(flowActions.select(start)) + expect(store.getState().flows.selected).toEqual(start ? [start] : []) + store.dispatch(flowViewActions.selectRelative(relative)) + expect(store.getState().flows.selected).toEqual([result]) + } + + describe('previous', () => { + + it('should select the previous flow', () => { + testSelect(3, -1, 2) + }) + + it('should not changed when first flow is selected', () => { + testSelect(1, -1, 1) + }) + + it('should select first flow if no flow is selected', () => { + testSelect(undefined, -1, 1) + }) + + }) + + describe('next', () => { + + it('should select the next flow', () => { + testSelect(2, 1, 3) + }) + + it('should not changed when last flow is selected', () => { + testSelect(4, 1, 4) + }) + + it('should select last flow if no flow is selected', () => { + testSelect(undefined, 1, 4) + }) + + }) +}) diff --git a/web/src/js/__tests__/ducks/flows.js b/web/src/js/__tests__/ducks/flows.js new file mode 100644 index 00000000..2b261cb1 --- /dev/null +++ b/web/src/js/__tests__/ducks/flows.js @@ -0,0 +1,30 @@ +jest.unmock('../../ducks/flows'); + +import reduceFlows, * as flowActions from '../../ducks/flows' + + +describe('select flow', () => { + + let state = reduceFlows(undefined, {}) + for (let i of [1, 2, 3, 4]) { + state = reduceFlows(state, flowActions.addFlow({ id: i })) + } + + it('should be possible to select a single flow', () => { + expect(reduceFlows(state, flowActions.select(2))).toEqual( + { + ...state, + selected: [2], + } + ) + }) + + it('should be possible to deselect a flow', () => { + expect(reduceFlows({ ...state, selected: [1] }, flowActions.select())).toEqual( + { + ...state, + selected: [], + } + ) + }) +}) diff --git a/web/src/js/__tests__/ducks/tutils.js b/web/src/js/__tests__/ducks/tutils.js new file mode 100644 index 00000000..90a21b78 --- /dev/null +++ b/web/src/js/__tests__/ducks/tutils.js @@ -0,0 +1,12 @@ +jest.unmock('redux') +jest.unmock('redux-thunk') + +import { combineReducers, applyMiddleware, createStore as createReduxStore } from 'redux' +import thunk from 'redux-thunk' + +export function createStore(parts) { + return createReduxStore( + combineReducers(parts), + applyMiddleware(...[thunk]) + ) +} diff --git a/web/src/js/__tests__/ducks/ui.js b/web/src/js/__tests__/ducks/ui.js index 2388a9ad..d3242815 100644 --- a/web/src/js/__tests__/ducks/ui.js +++ b/web/src/js/__tests__/ducks/ui.js @@ -1,36 +1,36 @@ -jest.unmock("../../ducks/ui"); -// @todo fix it ( this is why I don't like to add tests until our architecture is stable :P ) -jest.unmock("../../ducks/views/main"); +jest.unmock('../../ducks/ui') +jest.unmock('../../ducks/flows') -import reducer, { setActiveMenu } from '../../ducks/ui'; -import { SELECT } from '../../ducks/views/main'; +import reducer, { setActiveMenu } from '../../ducks/ui' +import * as flowActions from '../../ducks/flows' -describe("ui reducer", () => { - it("should return the initial state", () => { - expect(reducer(undefined, {})).toEqual({ activeMenu: 'Start'}) - }), - it("should return the state for view", () => { - expect(reducer(undefined, setActiveMenu('View'))).toEqual({ activeMenu: 'View'}) - }), - it("should change the state to Start when deselecting a flow and we a currently at the flow tab", () => { - expect(reducer({activeMenu: 'Flow'}, - { type: SELECT, - currentSelection: '1', - flowId : undefined - })).toEqual({ activeMenu: 'Start'}) - }), - it("should change the state to Flow when we selected a flow and no flow was selected before", () => { - expect(reducer({activeMenu: 'Start'}, - { type: SELECT, - currentSelection: undefined, - flowId : '1' - })).toEqual({ activeMenu: 'Flow'}) - }), - it("should not change the state to Flow when OPTIONS tab is selected and we selected a flow and a flow as selected before", () => { - expect(reducer({activeMenu: 'Options'}, - { type: SELECT, - currentSelection: '1', - flowId : '2' - })).toEqual({ activeMenu: 'Options'}) +describe('ui reducer', () => { + it('should return the initial state', () => { + expect(reducer(undefined, {}).activeMenu).toEqual('Start') }) -}); + + it('should return the state for view', () => { + expect(reducer(undefined, setActiveMenu('View')).activeMenu).toEqual('View') + }) + + it('should change the state to Start when deselecting a flow and we a currently at the flow tab', () => { + expect(reducer( + { activeMenu: 'Flow', isFlowSelected: true }, + flowActions.select(undefined)).activeMenu + ).toEqual('Start') + }) + + it('should change the state to Flow when we selected a flow and no flow was selected before', () => { + expect(reducer( + { activeMenu: 'Start', isFlowSelected: false }, + flowActions.select(1)).activeMenu + ).toEqual('Flow') + }) + + it('should not change the state to Flow when OPTIONS tab is selected and we selected a flow and a flow as selected before', () => { + expect(reducer( + { activeMenu: 'Options', isFlowSelected: true }, + flowActions.select(1) + ).activeMenu).toEqual('Options') + }) +}) diff --git a/web/src/js/__tests__/ducks/utils/list.js b/web/src/js/__tests__/ducks/utils/list.js index 8cae91ec..72d162f2 100644 --- a/web/src/js/__tests__/ducks/utils/list.js +++ b/web/src/js/__tests__/ducks/utils/list.js @@ -27,7 +27,7 @@ describe('list reduce', () => { { id: 1, val: 1 }, { id: 2, val: 3 } ]) - expect(reduce(state, list.update(2, { id: 2, val: 3 }))).toEqual(result) + expect(reduce(state, list.update({ id: 2, val: 3 }))).toEqual(result) }) it('should remove item', () => { diff --git a/web/src/js/__tests__/ducks/utils/view.js b/web/src/js/__tests__/ducks/utils/view.js index 1b07f723..f0b147da 100644 --- a/web/src/js/__tests__/ducks/utils/view.js +++ b/web/src/js/__tests__/ducks/utils/view.js @@ -14,7 +14,7 @@ describe('view reduce', () => { const result = createState([ { id: 1 } ]) - expect(reduce(state, view.updateFilter(state, item => item.id === 1))).toEqual(result) + expect(reduce(state, view.updateFilter(state.data, item => item.id === 1))).toEqual(result) }) it('should sort items', () => { @@ -72,7 +72,7 @@ describe('view reduce', () => { { id: 1, val: 1 }, { id: 2, val: 3 } ]) - expect(reduce(state, view.update(2, { id: 2, val: 3 }))).toEqual(result) + expect(reduce(state, view.update({ id: 2, val: 3 }))).toEqual(result) }) it('should sort updated item', () => { @@ -84,7 +84,7 @@ describe('view reduce', () => { { id: 2, val: 3 }, { id: 1, val: 1 } ]) - expect(reduce(state, view.update(2, { id: 2, val: 3 }, undefined, (a, b) => b.id - a.id))).toEqual(result) + expect(reduce(state, view.update({ id: 2, val: 3 }, undefined, (a, b) => b.id - a.id))).toEqual(result) }) it('should filter updated item', () => { @@ -96,7 +96,7 @@ describe('view reduce', () => { { id: 1, val: 1 } ]) result.indexOf[2] = null - expect(reduce(state, view.update(2, { id: 2, val: 3 }, i => i.id === i.val))).toEqual(result) + expect(reduce(state, view.update({ id: 2, val: 3 }, i => i.id === i.val))).toEqual(result) }) it('should remove item', () => { @@ -119,7 +119,7 @@ describe('view reduce', () => { const result = createState([ { id: 1 } ]) - expect(reduce(state, view.receive({ data: [{ id: 1 }] }))).toEqual(result) + expect(reduce(state, view.receive([{ id: 1 }]))).toEqual(result) }) it('should sort received items', () => { @@ -131,7 +131,7 @@ describe('view reduce', () => { { id: 2 }, { id: 1 } ]) - expect(reduce(state, view.receive({ data: [{ id: 1 }, { id: 2 }] }, undefined, (a, b) => b.id - a.id))).toEqual(result) + expect(reduce(state, view.receive([{ id: 1 }, { id: 2 }], undefined, (a, b) => b.id - a.id))).toEqual(result) }) it('should filter received', () => { @@ -142,7 +142,7 @@ describe('view reduce', () => { const result = createState([ { id: 1 } ]) - expect(reduce(state, view.receive({ data: [{ id: 1 }, { id: 2 }] }, i => i.id === 1))).toEqual(result) + expect(reduce(state, view.receive([{ id: 1 }, { id: 2 }], i => i.id === 1))).toEqual(result) }) }) diff --git a/web/src/js/app.jsx b/web/src/js/app.jsx index 5acf5dd4..726b2ae1 100644 --- a/web/src/js/app.jsx +++ b/web/src/js/app.jsx @@ -12,7 +12,7 @@ import { add as addLog } from './ducks/eventLog' const middlewares = [thunk]; -if (process.env.NODE_ENV === 'development' ) { +if (process.env.NODE_ENV !== 'production') { const createLogger = require('redux-logger'); middlewares.push(createLogger()); } diff --git a/web/src/js/components/ContentView.jsx b/web/src/js/components/ContentView.jsx index 3cd9990c..0b93d3f0 100644 --- a/web/src/js/components/ContentView.jsx +++ b/web/src/js/components/ContentView.jsx @@ -1,121 +1,68 @@ import React, { Component, PropTypes } from 'react' import { connect } from 'react-redux' import { MessageUtils } from '../flow/utils.js' -import { ViewAuto, ViewImage } from './ContentView/ContentViews' +import * as ContentViews from './ContentView/ContentViews' import * as MetaViews from './ContentView/MetaViews' import ContentLoader from './ContentView/ContentLoader' import ViewSelector from './ContentView/ViewSelector' +import { setContentView, setDisplayLarge } from '../ducks/ui' import CodeEditor from './common/CodeEditor' import {setModifiedFlowContent} from '../ducks/flows' +ContentView.propTypes = { + // It may seem a bit weird at the first glance: + // Every view takes the flow and the message as props, e.g. + // <Auto flow={flow} message={flow.request}/> + flow: React.PropTypes.object.isRequired, + message: React.PropTypes.object.isRequired, +} -class ContentView extends Component { - - static propTypes = { - // It may seem a bit weird at the first glance: - // Every view takes the flow and the message as props, e.g. - // <Auto flow={flow} message={flow.request}/> - flow: React.PropTypes.object.isRequired, - message: React.PropTypes.object.isRequired, - onContentChange: React.PropTypes.func.isRequired - } - - constructor(props, context) { - super(props, context) - this.state = { displayLarge: false, View: ViewAuto} - this.selectView = this.selectView.bind(this) - } - - selectView(View) { - this.setState({ View }) - } +ContentView.isContentTooLarge = msg => msg.contentLength > 1024 * 1024 * (ContentViews.ViewImage.matches(msg) ? 10 : 0.2) - displayLarge() { - this.setState({ displayLarge: true }) - } +function ContentView(props) { + const { flow, message, contentView, selectView, displayLarge, setDisplayLarge } = props - componentWillReceiveProps(nextProps) { - if (nextProps.message !== this.props.message) { - this.setState({ displayLarge: false, View: ViewAuto }) - } + if (message.contentLength === 0) { + return <MetaViews.ContentEmpty {...props}/> } - isContentTooLarge(msg) { - return msg.contentLength > 1024 * 1024 * (ViewImage.matches(msg) ? 10 : 0.2) + if (message.contentLength === null) { + return <MetaViews.ContentMissing {...props}/> } - onOpenFile(e) { - if (e.target.files.length > 0) { - this.props.onContentChange(e.target.files[0]) - } - e.preventDefault() + if (!displayLarge && ContentView.isContentTooLarge(message)) { + return <MetaViews.ContentTooLarge {...props} onClick={() => setDisplayLarge(true)}/> } - render() { - const { flow, message, setModifiedFlowContent, isFlowEditorOpen } = this.props - const { displayLarge, View } = this.state - - if (message.contentLength === 0) { - return <MetaViews.ContentEmpty {...this.props}/> - } - - if (message.contentLength === null) { - return <MetaViews.ContentMissing {...this.props}/> - } - - if (!displayLarge && this.isContentTooLarge(message)) { - return <MetaViews.ContentTooLarge {...this.props} onClick={this.displayLarge}/> - } - - return ( - <div> - {isFlowEditorOpen ? ( - <ContentLoader flow={flow} message={message}> - <CodeEditor content="" onChange={content =>{setModifiedFlowContent(content)}}/> - </ContentLoader> - ): (<div> - {View.textView ? ( - <ContentLoader flow={flow} message={message}> - <this.state.View content="" /> - </ContentLoader> - ) : ( - <View flow={flow} message={message} /> - )} - - - - <div className="view-options text-center"> - <ViewSelector onSelectView={this.selectView} active={View} message={message}/> - - <a className="btn btn-default btn-xs" - href={MessageUtils.getContentURL(flow, message)} - title="Download the content of the flow." - > - <i className="fa fa-download"/> - </a> - - <a className="btn btn-default btn-xs" - href="#" - onClick={e => {this.fileInput.click(); e.preventDefault();}} - title="Upload a file to replace the content." - > - <i className="fa fa-upload"/> - </a> - <input - ref={ref => this.fileInput = ref} - className="hidden" - type="file" - onChange={e => this.onOpenFile(e)} - /> - </div> - </div>)} + const View = ContentViews[contentView] + + return ( + <div> + {View.textView ? ( + <ContentLoader flow={flow} message={message}> + <View content="" /> + </ContentLoader> + ) : ( + <View flow={flow} message={message} /> + )} + <div className="view-options text-center"> + <ViewSelector onSelectView={selectView} active={View} message={message}/> + + <a className="btn btn-default btn-xs" href={MessageUtils.getContentURL(flow, message)}> + <i className="fa fa-download"/> + </a> </div> - ) - } + </div> + ) } + export default connect( - state => ( - {isFlowEditorOpen : state.ui.isFlowEditorOpen} - ), { - setModifiedFlowContent - })(ContentView) + state => ({ + contentView: state.ui.contentView, + displayLarge: state.ui.displayLarge, + }), + { + selectView: setContentView, + setDisplayLarge, + } +)(ContentView) diff --git a/web/src/js/components/ContentView/MetaViews.jsx b/web/src/js/components/ContentView/MetaViews.jsx index 83720a13..2d064b54 100644 --- a/web/src/js/components/ContentView/MetaViews.jsx +++ b/web/src/js/components/ContentView/MetaViews.jsx @@ -1,5 +1,5 @@ import React from 'react' -import {formatSize} from '../../utils.js' +import { formatSize } from '../../utils.js' export function ContentEmpty({ flow, message }) { return ( diff --git a/web/src/js/components/ContentView/ViewSelector.jsx b/web/src/js/components/ContentView/ViewSelector.jsx index df3a5b83..9b151a5b 100644 --- a/web/src/js/components/ContentView/ViewSelector.jsx +++ b/web/src/js/components/ContentView/ViewSelector.jsx @@ -14,7 +14,7 @@ export default function ViewSelector({ active, message, onSelectView }) { {views.map(View => ( <button key={View.name} - onClick={() => onSelectView(View)} + onClick={() => onSelectView(View.name)} className={classnames('btn btn-default', { active: View === active })}> {View === ViewAuto ? ( `auto: ${ViewAuto.findView(message).name.toLowerCase().replace('view', '')}` diff --git a/web/src/js/components/FlowTable/FlowTableHead.jsx b/web/src/js/components/FlowTable/FlowTableHead.jsx index f65369bd..50242737 100644 --- a/web/src/js/components/FlowTable/FlowTableHead.jsx +++ b/web/src/js/components/FlowTable/FlowTableHead.jsx @@ -3,7 +3,7 @@ import { connect } from 'react-redux' import classnames from 'classnames' import columns from './FlowColumns' -import { updateSort } from '../../ducks/views/main' +import { updateSort } from '../../ducks/flowView' FlowTableHead.propTypes = { updateSort: PropTypes.func.isRequired, @@ -29,8 +29,8 @@ function FlowTableHead({ sortColumn, sortDesc, updateSort }) { export default connect( state => ({ - sortDesc: state.flows.views.main.sort.desc, - sortColumn: state.flows.views.main.sort.column, + sortDesc: state.flowView.sort.desc, + sortColumn: state.flowView.sort.column, }), { updateSort diff --git a/web/src/js/components/FlowView.jsx b/web/src/js/components/FlowView.jsx index 0ef6e5cd..5ba472a5 100644 --- a/web/src/js/components/FlowView.jsx +++ b/web/src/js/components/FlowView.jsx @@ -1,4 +1,5 @@ import React, { Component } from 'react' +import { connect } from 'react-redux' import _ from 'lodash' import Nav from './FlowView/Nav' @@ -6,47 +7,29 @@ import { Request, Response, ErrorView as Error } from './FlowView/Messages' import Details from './FlowView/Details' import Prompt from './Prompt' +import { setPrompt, selectTab } from '../ducks/ui' + export default class FlowView extends Component { static allTabs = { Request, Response, Error, Details } constructor(props, context) { super(props, context) - - this.state = { prompt: false } - - this.closePrompt = this.closePrompt.bind(this) - this.selectTab = this.selectTab.bind(this) - } - - getTabs() { - return ['request', 'response', 'error'].filter(k => this.props.flow[k]).concat(['details']) - } - - nextTab(increment) { - const tabs = this.getTabs() - // JS modulo operator doesn't correct negative numbers, make sure that we are positive. - this.selectTab(tabs[(tabs.indexOf(this.props.tab) + increment + tabs.length) % tabs.length]) + this.onPromptFinish = this.onPromptFinish.bind(this) } - selectTab(panel) { - this.props.updateLocation(`/flows/${this.props.flow.id}/${panel}`) - } - - closePrompt(edit) { - this.setState({ prompt: false }) + onPromptFinish(edit) { + this.props.setPrompt(false) if (edit && this.tabComponent) { this.tabComponent.edit(edit) } } - promptEdit() { - let options - + getPromptOptions() { switch (this.props.tab) { case 'request': - options = [ + return [ 'method', 'url', { text: 'http version', key: 'v' }, @@ -55,7 +38,7 @@ export default class FlowView extends Component { break case 'response': - options = [ + return [ { text: 'http version', key: 'v' }, 'code', 'message', @@ -69,13 +52,11 @@ export default class FlowView extends Component { default: throw 'Unknown tab for edit: ' + this.props.tab } - - this.setState({ prompt: { options, done: this.closePrompt } }) } render() { - const tabs = this.getTabs() let { flow, tab: active, updateFlow } = this.props + const tabs = ['request', 'response', 'error'].filter(k => flow[k]).concat(['details']) if (tabs.indexOf(active) < 0) { if (active === 'response' && flow.error) { @@ -95,13 +76,23 @@ export default class FlowView extends Component { flow={flow} tabs={tabs} active={active} - onSelectTab={this.selectTab} + onSelectTab={this.props.selectTab} /> <Tab ref={ tab => this.tabComponent = tab } flow={flow} updateFlow={updateFlow} /> - {this.state.prompt && ( - <Prompt {...this.state.prompt}/> + {this.props.promptOpen && ( + <Prompt options={this.getPromptOptions()} done={this.onPromptFinish} /> )} </div> ) } } + +export default connect( + state => ({ + promptOpen: state.ui.promptOpen, + }), + { + setPrompt, + selectTab, + } +)(FlowView) diff --git a/web/src/js/components/Header.jsx b/web/src/js/components/Header.jsx index b6ef1cc7..5de885ae 100644 --- a/web/src/js/components/Header.jsx +++ b/web/src/js/components/Header.jsx @@ -17,10 +17,10 @@ class Header extends Component { } render() { - const { updateLocation, query, selectedFlow, activeMenu} = this.props + const { query, selectedFlowId, activeMenu} = this.props let entries = [...Header.entries] - if(selectedFlow) + if(selectedFlowId) entries.push(FlowMenu) const Active = _.find(entries, (e) => e.title == activeMenu) @@ -41,7 +41,6 @@ class Header extends Component { <div className="menu"> <Active ref="active" - updateLocation={updateLocation} query={query} /> </div> @@ -52,7 +51,7 @@ class Header extends Component { export default connect( state => ({ - selectedFlow: state.flows.views.main.selected[0], + selectedFlowId: state.flows.selected[0], activeMenu: state.ui.activeMenu, }), { diff --git a/web/src/js/components/Header/FilterInput.jsx b/web/src/js/components/Header/FilterInput.jsx index 5b49b788..e421f1a4 100644 --- a/web/src/js/components/Header/FilterInput.jsx +++ b/web/src/js/components/Header/FilterInput.jsx @@ -7,10 +7,6 @@ import FilterDocs from './FilterDocs' export default class FilterInput extends Component { - static contextTypes = { - returnFocus: React.PropTypes.func, - } - constructor(props, context) { super(props, context) @@ -91,7 +87,6 @@ export default class FilterInput extends Component { blur() { ReactDOM.findDOMNode(this.refs.input).blur() - this.context.returnFocus() } select() { diff --git a/web/src/js/components/Header/FlowMenu.jsx b/web/src/js/components/Header/FlowMenu.jsx index 8d13dd6a..bdd30d5e 100644 --- a/web/src/js/components/Header/FlowMenu.jsx +++ b/web/src/js/components/Header/FlowMenu.jsx @@ -15,11 +15,11 @@ function FlowMenu({ flow, acceptFlow, replayFlow, duplicateFlow, removeFlow, rev return ( <div> <div className="menu-row"> - <Button disabled={!flow.intercepted} title="[a]ccept intercepted flow" text="Accept" icon="fa-play" onClick={() => acceptFlow(flow)} /> + <Button disabled={!flow || !flow.intercepted} title="[a]ccept intercepted flow" text="Accept" icon="fa-play" onClick={() => acceptFlow(flow)} /> <Button title="[r]eplay flow" text="Replay" icon="fa-repeat" onClick={() => replayFlow(flow)} /> <Button title="[D]uplicate flow" text="Duplicate" icon="fa-copy" onClick={() => duplicateFlow(flow)} /> <Button title="[d]elete flow" text="Delete" icon="fa-trash" onClick={() => removeFlow(flow)}/> - <Button disabled={!flow.modified} title="revert changes to flow [V]" text="Revert" icon="fa-history" onClick={() => revertFlow(flow)} /> + <Button disabled={!flow || !flow.modified} title="revert changes to flow [V]" text="Revert" icon="fa-history" onClick={() => revertFlow(flow)} /> <Button title="download" text="Download" icon="fa-download" onClick={() => window.location = MessageUtils.getContentURL(flow, flow.response)}/> </div> <div className="clearfix"/> @@ -29,7 +29,7 @@ function FlowMenu({ flow, acceptFlow, replayFlow, duplicateFlow, removeFlow, rev export default connect( state => ({ - flow: state.flows.list.byId[state.flows.views.main.selected[0]], + flow: state.flows.byId[state.flows.selected[0]], }), { acceptFlow: flowsActions.accept, diff --git a/web/src/js/components/Header/MainMenu.jsx b/web/src/js/components/Header/MainMenu.jsx index 48fea5a2..27a4be60 100644 --- a/web/src/js/components/Header/MainMenu.jsx +++ b/web/src/js/components/Header/MainMenu.jsx @@ -3,6 +3,7 @@ import { connect } from 'react-redux' import FilterInput from './FilterInput' import { Query } from '../../actions.js' import { update as updateSettings } from '../../ducks/settings' +import { updateQuery, setSelectedInput } from '../../ducks/ui' class MainMenu extends Component { @@ -12,8 +13,8 @@ class MainMenu extends Component { static propTypes = { query: PropTypes.object.isRequired, settings: PropTypes.object.isRequired, - updateLocation: PropTypes.func.isRequired, updateSettings: PropTypes.func.isRequired, + updateQuery: PropTypes.func.isRequired, } constructor(props, context) { @@ -22,12 +23,19 @@ class MainMenu extends Component { this.onHighlightChange = this.onHighlightChange.bind(this) } + componentWillReceiveProps(nextProps) { + if(this.refs[nextProps.selectedInput]) { + this.refs[nextProps.selectedInput].select() + } + this.props.setSelectedInput(undefined) + } + onSearchChange(val) { - this.props.updateLocation(undefined, { [Query.SEARCH]: val }) + this.props.updateQuery({ [Query.SEARCH]: val }) } onHighlightChange(val) { - this.props.updateLocation(undefined, { [Query.HIGHLIGHT]: val }) + this.props.updateQuery({ [Query.HIGHLIGHT]: val }) } render() { @@ -70,9 +78,12 @@ class MainMenu extends Component { export default connect( state => ({ settings: state.settings.settings, + selectedInput: state.ui.selectedInput }), { updateSettings, + updateQuery, + setSelectedInput }, null, { diff --git a/web/src/js/components/MainView.jsx b/web/src/js/components/MainView.jsx index 93f7b299..b0bbf70e 100644 --- a/web/src/js/components/MainView.jsx +++ b/web/src/js/components/MainView.jsx @@ -1,12 +1,11 @@ import React, { Component, PropTypes } from 'react' import { connect } from 'react-redux' import { Query } from '../actions.js' -import { Key } from '../utils.js' import Splitter from './common/Splitter' import FlowTable from './FlowTable' import FlowView from './FlowView' import * as flowsActions from '../ducks/flows' -import { select as selectFlow, updateFilter, updateHighlight } from '../ducks/views/main' +import { updateFilter, updateHighlight } from '../ducks/flowView' class MainView extends Component { @@ -20,10 +19,6 @@ class MainView extends Component { * @todo replace with mapStateToProps */ componentWillReceiveProps(nextProps) { - // Update redux store with route changes - if (nextProps.routeParams.flowId !== (nextProps.selectedFlow || {}).id) { - this.props.selectFlow(nextProps.routeParams.flowId) - } if (nextProps.location.query[Query.SEARCH] !== nextProps.filter) { this.props.updateFilter(nextProps.location.query[Query.SEARCH], false) } @@ -32,127 +27,6 @@ class MainView extends Component { } } - /** - * @todo move to actions - */ - selectFlow(flow) { - if (flow) { - this.props.updateLocation(`/flows/${flow.id}/${this.props.routeParams.detailTab || 'request'}`) - } else { - this.props.updateLocation('/flows') - } - } - - /** - * @todo move to actions - */ - selectFlowRelative(shift) { - const { flows, routeParams, selectedFlow } = this.props - let index = 0 - if (!routeParams.flowId) { - if (shift < 0) { - index = flows.length - 1 - } - } else { - index = Math.min( - Math.max(0, flows.indexOf(selectedFlow) + shift), - flows.length - 1 - ) - } - this.selectFlow(flows[index]) - } - - /** - * @todo move to actions - */ - onMainKeyDown(e) { - var flow = this.props.selectedFlow - if (e.ctrlKey) { - return - } - switch (e.keyCode) { - case Key.K: - case Key.UP: - this.selectFlowRelative(-1) - break - case Key.J: - case Key.DOWN: - this.selectFlowRelative(+1) - break - case Key.SPACE: - case Key.PAGE_DOWN: - this.selectFlowRelative(+10) - break - case Key.PAGE_UP: - this.selectFlowRelative(-10) - break - case Key.END: - this.selectFlowRelative(+1e10) - break - case Key.HOME: - this.selectFlowRelative(-1e10) - break - case Key.ESC: - this.selectFlow(null) - break - case Key.H: - case Key.LEFT: - if (this.refs.flowDetails) { - this.refs.flowDetails.nextTab(-1) - } - break - case Key.L: - case Key.TAB: - case Key.RIGHT: - if (this.refs.flowDetails) { - this.refs.flowDetails.nextTab(+1) - } - break - case Key.C: - if (e.shiftKey) { - this.props.clearFlows() - } - break - case Key.D: - if (flow) { - if (e.shiftKey) { - this.props.duplicateFlow(flow) - } else { - this.props.removeFlow(flow) - } - } - break - case Key.A: - if (e.shiftKey) { - this.props.acceptAllFlows() - } else if (flow && flow.intercepted) { - this.props.acceptFlow(flow) - } - break - case Key.R: - if (!e.shiftKey && flow) { - this.props.replayFlow(flow) - } - break - case Key.V: - if (e.shiftKey && flow && flow.modified) { - this.props.revertFlow(flow) - } - break - case Key.E: - if (this.refs.flowDetails) { - this.refs.flowDetails.promptEdit() - } - break - case Key.SHIFT: - break - default: - console.debug('keydown', e.keyCode) - return - } - e.preventDefault() - } - render() { const { flows, selectedFlow, highlight } = this.props return ( @@ -162,7 +36,7 @@ class MainView extends Component { flows={flows} selected={selectedFlow} highlight={highlight} - onSelect={flow => this.selectFlow(flow)} + onSelect={flow => this.props.selectFlow(flow.id)} /> {selectedFlow && [ <Splitter key="splitter"/>, @@ -171,7 +45,6 @@ class MainView extends Component { ref="flowDetails" tab={this.props.routeParams.detailTab} query={this.props.query} - updateLocation={this.props.updateLocation} updateFlow={data => this.props.updateFlow(selectedFlow, data)} flow={selectedFlow} /> @@ -183,24 +56,19 @@ class MainView extends Component { export default connect( state => ({ - flows: state.flows.views.main.view.data, - filter: state.flows.views.main.filter, - highlight: state.flows.views.main.highlight, - selectedFlow: state.flows.list.byId[state.flows.views.main.selected[0]] + flows: state.flowView.data, + filter: state.flowView.filter, + highlight: state.flowView.highlight, + selectedFlow: state.flows.byId[state.flows.selected[0]] }), { - selectFlow, + selectFlow: flowsActions.select, updateFilter, updateHighlight, updateFlow: flowsActions.update, - clearFlows: flowsActions.clear, - duplicateFlow: flowsActions.duplicate, - removeFlow: flowsActions.remove, - acceptAllFlows: flowsActions.acceptAll, - acceptFlow: flowsActions.accept, - replayFlow: flowsActions.replay, - revertFlow: flowsActions.revert, }, undefined, - { withRef: true } + { + withRef: true + } )(MainView) diff --git a/web/src/js/components/Prompt.jsx b/web/src/js/components/Prompt.jsx index e6564896..1c20b1a9 100755 --- a/web/src/js/components/Prompt.jsx +++ b/web/src/js/components/Prompt.jsx @@ -4,23 +4,15 @@ import _ from 'lodash' import {Key} from '../utils.js' -Prompt.contextTypes = { - returnFocus: PropTypes.func -} - Prompt.propTypes = { options: PropTypes.array.isRequired, done: PropTypes.func.isRequired, prompt: PropTypes.string, } -export default function Prompt({ prompt, done, options }, context) { +export default function Prompt({ prompt, done, options }) { const opts = [] - function keyTaken(k) { - return _.map(opts, 'key').includes(k) - } - for (let i = 0; i < options.length; i++) { let opt = options[i] if (_.isString(opt)) { @@ -35,7 +27,11 @@ export default function Prompt({ prompt, done, options }, context) { } opts.push(opt) } - + + function keyTaken(k) { + return _.map(opts, 'key').includes(k) + } + function onKeyDown(event) { event.stopPropagation() event.preventDefault() @@ -44,7 +40,6 @@ export default function Prompt({ prompt, done, options }, context) { return } done(key.key || false) - context.returnFocus() } return ( diff --git a/web/src/js/components/ProxyApp.jsx b/web/src/js/components/ProxyApp.jsx index 1ac979bc..2962fc2b 100644 --- a/web/src/js/components/ProxyApp.jsx +++ b/web/src/js/components/ProxyApp.jsx @@ -4,6 +4,7 @@ import _ from 'lodash' import { connect } from 'react-redux' import { init as appInit, destruct as appDestruct } from '../ducks/app' +import { onKeyDown } from '../ducks/ui' import Header from './Header' import EventLog from './EventLog' import Footer from './Footer' @@ -11,124 +12,39 @@ import { Key } from '../utils.js' class ProxyAppMain extends Component { - static childContextTypes = { - returnFocus: PropTypes.func.isRequired, - } - static contextTypes = { router: PropTypes.object.isRequired, } - constructor(props, context) { - super(props, context) - - this.focus = this.focus.bind(this) - this.onKeyDown = this.onKeyDown.bind(this) - this.updateLocation = this.updateLocation.bind(this) - } - componentWillMount() { - this.props.appInit() - } - - /** - * @todo listen to window's key events - */ - componentDidMount() { - this.focus() + this.props.appInit(this.context.router) + window.addEventListener('keydown', this.props.onKeyDown); } componentWillUnmount() { - this.props.appDestruct() - } - - /** - * @todo use props - */ - getChildContext() { - return { returnFocus: this.focus } - } - - /** - * @todo remove it - */ - focus() { - document.activeElement.blur() - window.getSelection().removeAllRanges() - ReactDOM.findDOMNode(this).focus() - } - - /** - * @todo move to actions - * @todo bind on window - */ - onKeyDown(e) { - let name = null - - switch (e.keyCode) { - case Key.I: - name = 'intercept' - break - case Key.L: - name = 'search' - break - case Key.H: - name = 'highlight' - break - default: - let main = this.refs.view - if (this.refs.view.refs.wrappedInstance) { - main = this.refs.view.refs.wrappedInstance - } - if (main.onMainKeyDown) { - main.onMainKeyDown(e) - } - return // don't prevent default then - } - - if (name) { - const headerComponent = this.refs.header.refs.wrappedInstance || this.refs.header - headerComponent.setState({ active: Header.entries[0] }, () => { - const active = headerComponent.refs.active.refs.wrappedInstance || headerComponent.refs.active - active.refs[name].select() - }) - } - - e.preventDefault() + this.props.appDestruct(this.context.router) + window.removeEventListener('keydown', this.props.onKeyDown); } - /** - * @todo move to actions - */ - updateLocation(pathname, queryUpdate) { - if (pathname === undefined) { - pathname = this.props.location.pathname + componentWillReceiveProps(nextProps) { + if (nextProps.query === this.props.query && nextProps.selectedFlowId === this.props.selectedFlowId && nextProps.panel === this.props.panel) { + return } - const query = this.props.location.query - for (const key of Object.keys(queryUpdate || {})) { - query[key] = queryUpdate[key] || undefined + if (nextProps.selectedFlowId) { + this.context.router.replace({ pathname: `/flows/${nextProps.selectedFlowId}/${nextProps.panel}`, query: nextProps.query }) + } else { + this.context.router.replace({ pathname: '/flows', query: nextProps.query }) } - this.context.router.replace({ pathname, query }) - } - - /** - * @todo pass in with props - */ - getQuery() { - // For whatever reason, react-router always returns the same object, which makes comparing - // the current props with nextProps impossible. As a workaround, we just clone the query object. - return _.clone(this.props.location.query) } render() { - const { showEventLog, location, children } = this.props - const query = this.getQuery() + const { showEventLog, location, children, query } = this.props return ( - <div id="container" tabIndex="0" onKeyDown={this.onKeyDown}> - <Header ref="header" updateLocation={this.updateLocation} query={query} /> + <div id="container" tabIndex="0"> + <Header ref="header" query={query} /> {React.cloneElement( children, - { ref: 'view', location, query, updateLocation: this.updateLocation } + { ref: 'view', location, query } )} {showEventLog && ( <EventLog key="eventlog"/> @@ -142,10 +58,13 @@ class ProxyAppMain extends Component { export default connect( state => ({ showEventLog: state.eventLog.visible, - settings: state.settings.settings, + query: state.ui.query, + panel: state.ui.panel, + selectedFlowId: state.flows.selected[0] }), { appInit, appDestruct, + onKeyDown } )(ProxyAppMain) diff --git a/web/src/js/components/ValueEditor.jsx b/web/src/js/components/ValueEditor.jsx index 0316924f..5f1bf2dc 100755 --- a/web/src/js/components/ValueEditor.jsx +++ b/web/src/js/components/ValueEditor.jsx @@ -4,27 +4,17 @@ import ValidateEditor from './ValueEditor/ValidateEditor' export default class ValueEditor extends Component { - static contextTypes = { - returnFocus: PropTypes.func, - } - static propTypes = { content: PropTypes.string.isRequired, onDone: PropTypes.func.isRequired, inline: PropTypes.bool, } - constructor(props) { - super(props) - this.focus = this.focus.bind(this) - } - render() { - var tag = this.props.inline ? "span" : 'div' + var tag = this.props.inline ? 'span' : 'div' return ( <ValidateEditor {...this.props} - onStop={() => this.context.returnFocus()} tag={tag} /> ) diff --git a/web/src/js/components/ValueEditor/EditorBase.jsx b/web/src/js/components/ValueEditor/EditorBase.jsx index e737d2af..aa09dad5 100755 --- a/web/src/js/components/ValueEditor/EditorBase.jsx +++ b/web/src/js/components/ValueEditor/EditorBase.jsx @@ -54,7 +54,6 @@ export default class EditorBase extends Component { render() { return ( <this.props.tag - {...this.props} tabIndex="0" className={`inline-input ${this.props.className}`} contentEditable={this.state.editable || undefined} diff --git a/web/src/js/ducks/eventLog.js b/web/src/js/ducks/eventLog.js index 52eec1cd..f72d7bd6 100644 --- a/web/src/js/ducks/eventLog.js +++ b/web/src/js/ducks/eventLog.js @@ -35,7 +35,7 @@ export default function reduce(state = defaultState, action) { return { ...state, filters, - view: reduceView(state.view, viewActions.updateFilter(state.list, log => filters[log.level])), + view: reduceView(state.view, viewActions.updateFilter(state.list.data, log => filters[log.level])), } case ADD: @@ -55,7 +55,7 @@ export default function reduce(state = defaultState, action) { return { ...state, list: reduceList(state.list, listActions.receive(action.list)), - view: reduceView(state.view, viewActions.receive(list, log => state.filters[log.level])), + view: reduceView(state.view, viewActions.receive(action.list, log => state.filters[log.level])), } default: diff --git a/web/src/js/ducks/views/main.js b/web/src/js/ducks/flowView.js index f4968de4..dd5bea41 100755..100644 --- a/web/src/js/ducks/views/main.js +++ b/web/src/js/ducks/flowView.js @@ -1,12 +1,12 @@ -import Filt from '../../filt/filt' -import { RequestUtils } from '../../flow/utils' -import reduceView, * as viewActions from '../utils/view' -import * as viewsActions from '../views' +import reduceView, * as viewActions from './utils/view' +import * as flowActions from './flows' +import Filt from '../filt/filt' +import { RequestUtils } from '../flow/utils' + +export const UPDATE_FILTER = 'FLOWVIEW_UPDATE_FILTER' +export const UPDATE_SORT = 'FLOWVIEW_UPDATE_SORT' +export const UPDATE_HIGHLIGHT = 'FLOWVIEW_UPDATE_HIGHLIGHT' -export const UPDATE_FILTER = 'FLOW_VIEWS_MAIN_UPDATE_FILTER' -export const UPDATE_SORT = 'FLOW_VIEWS_MAIN_UPDATE_SORT' -export const UPDATE_HIGHLIGHT = 'FLOW_VIEWS_MAIN_UPDATE_HIGHLIGHT' -export const SELECT = 'FLOW_VIEWS_MAIN_SELECT' const sortKeyFuns = { @@ -29,12 +29,37 @@ const sortKeyFuns = { }, } +export function makeFilter(filter) { + if (!filter) { + return + } + return Filt.parse(filter) +} + +export function makeSort({ column, desc }) { + const sortKeyFun = sortKeyFuns[column] + if (!sortKeyFun) { + return + } + return (a, b) => { + const ka = sortKeyFun(a) + const kb = sortKeyFun(b) + if (ka > kb) { + return desc ? -1 : 1 + } + if (ka < kb) { + return desc ? 1 : -1 + } + return 0 + } +} + + const defaultState = { highlight: null, - selected: [], filter: null, sort: { column: null, desc: false }, - view: undefined, + ...reduceView(undefined, {}) } export default function reduce(state = defaultState, action) { @@ -46,44 +71,35 @@ export default function reduce(state = defaultState, action) { highlight: action.highlight, } - case SELECT: - return { - ...state, - selected: [action.id] - } - case UPDATE_FILTER: return { - ...state, - filter: action.filter, - view: reduceView( - state.view, + ...reduceView( + state, viewActions.updateFilter( - action.list, + action.flows, makeFilter(action.filter), makeSort(state.sort) ) ), + filter: action.filter, } case UPDATE_SORT: const sort = { column: action.column, desc: action.desc } return { - ...state, - sort, - view: reduceView( - state.view, + ...reduceView( + state, viewActions.updateSort( makeSort(sort) ) ), + sort, } - case viewsActions.ADD: + case flowActions.ADD: return { - ...state, - view: reduceView( - state.view, + ...reduceView( + state, viewActions.add( action.item, makeFilter(state.filter), @@ -92,13 +108,11 @@ export default function reduce(state = defaultState, action) { ), } - case viewsActions.UPDATE: + case flowActions.UPDATE: return { - ...state, - view: reduceView( - state.view, + ...reduceView( + state, viewActions.update( - action.id, action.item, makeFilter(state.filter), makeSort(state.sort) @@ -106,22 +120,20 @@ export default function reduce(state = defaultState, action) { ), } - case viewsActions.REMOVE: + case flowActions.REMOVE: return { - ...state, - view: reduceView( - state.view, + ...reduceView( + state, viewActions.remove( action.id ) ), } - case viewsActions.RECEIVE: + case flowActions.RECEIVE: return { - ...state, - view: reduceView( - state.view, + ...reduceView( + state, viewActions.receive( action.list, makeFilter(state.filter), @@ -132,8 +144,7 @@ export default function reduce(state = defaultState, action) { default: return { - ...state, - view: reduceView(state.view, action) + ...reduceView(state, action), } } } @@ -143,7 +154,7 @@ export default function reduce(state = defaultState, action) { */ export function updateFilter(filter) { return (dispatch, getState) => { - dispatch({ type: UPDATE_FILTER, filter, list: getState().flows.list }) + dispatch({ type: UPDATE_FILTER, filter, flows: getState().flows.data }) } } @@ -161,42 +172,24 @@ export function updateSort(column, desc) { return { type: UPDATE_SORT, column, desc } } + /** * @public */ -export function select(id) { +export function selectRelative(shift) { return (dispatch, getState) => { - dispatch({ type: SELECT, currentSelection: getState().flows.views.main.selected[0], id }) - } -} - -/** - * @private - */ -function makeFilter(filter) { - if (!filter) { - return - } - return Filt.parse(filter) -} - -/** - * @private - */ -function makeSort({ column, desc }) { - const sortKeyFun = sortKeyFuns[column] - if (!sortKeyFun) { - return - } - return (a, b) => { - const ka = sortKeyFun(a) - const kb = sortKeyFun(b) - if (ka > kb) { - return desc ? -1 : 1 + let currentSelectionIndex = getState().flowView.indexOf[getState().flows.selected[0]] + let minIndex = 0 + let maxIndex = getState().flowView.data.length - 1 + let newIndex + if (currentSelectionIndex === undefined) { + newIndex = (shift < 0) ? minIndex : maxIndex + } else { + newIndex = currentSelectionIndex + shift + newIndex = Math.max(newIndex, minIndex) + newIndex = Math.min(newIndex, maxIndex) } - if (ka < kb) { - return desc ? 1 : -1 - } - return 0 + let flow = getState().flowView.data[newIndex] + dispatch(flowActions.select(flow ? flow.id : undefined)) } } diff --git a/web/src/js/ducks/flows.js b/web/src/js/ducks/flows.js index eea91924..ffb7ac87 100644 --- a/web/src/js/ducks/flows.js +++ b/web/src/js/ducks/flows.js @@ -1,25 +1,25 @@ import { fetchApi } from '../utils' import reduceList, * as listActions from './utils/list' -import reduceViews, * as viewsActions from './views' + import * as msgQueueActions from './msgQueue' import * as websocketActions from './websocket' export const MSG_TYPE = 'UPDATE_FLOWS' export const DATA_URL = '/flows' -export const ADD = 'FLOWS_ADD' -export const UPDATE = 'FLOWS_UPDATE' -export const REMOVE = 'FLOWS_REMOVE' -export const RECEIVE = 'FLOWS_RECEIVE' +export const ADD = 'FLOWS_ADD' +export const UPDATE = 'FLOWS_UPDATE' +export const REMOVE = 'FLOWS_REMOVE' +export const RECEIVE = 'FLOWS_RECEIVE' export const REQUEST_ACTION = 'FLOWS_REQUEST_ACTION' -export const UNKNOWN_CMD = 'FLOWS_UNKNOWN_CMD' -export const FETCH_ERROR = 'FLOWS_FETCH_ERROR' -export const SET_MODIFIED_FLOW_CONTENT = "FLOWS_SET_MODIFIED_FLOW" +export const UNKNOWN_CMD = 'FLOWS_UNKNOWN_CMD' +export const FETCH_ERROR = 'FLOWS_FETCH_ERROR' +export const SELECT = 'FLOWS_SELECT' + const defaultState = { - list: undefined, - views: undefined, - modifiedFlow: {headers: "", content: ""} + selected: [], + ...reduceList(undefined, {}), } export default function reduce(state = defaultState, action) { @@ -28,43 +28,37 @@ export default function reduce(state = defaultState, action) { case ADD: return { ...state, - list: reduceList(state.list, listActions.add(action.item)), - views: reduceViews(state.views, viewsActions.add(action.item)), + ...reduceList(state, listActions.add(action.item)), } case UPDATE: return { ...state, - list: reduceList(state.list, listActions.update(action.id, action.item)), - views: reduceViews(state.views, viewsActions.update(action.id, action.item)), + ...reduceList(state, listActions.update(action.item)), } case REMOVE: return { ...state, - list: reduceList(state.list, listActions.remove(action.id)), - views: reduceViews(state.views, viewsActions.remove(action.id)), + ...reduceList(state, listActions.remove(action.id)), } case RECEIVE: - const list = reduceList(state.list, listActions.receive(action.list)) return { ...state, - list, - views: reduceViews(state.views, viewsActions.receive(list)), + ...reduceList(state, listActions.receive(action.list)), } - case SET_MODIFIED_FLOW_CONTENT: - return{ + + case SELECT: + return { ...state, - modifiedFlow: {...state.modifiedFlow, content: action.content} + selected: action.flowIds } - default: return { ...state, - list: reduceList(state.list, action), - views: reduceViews(state.views, action), + ...reduceList(state, action), } } } @@ -72,17 +66,6 @@ export default function reduce(state = defaultState, action) { /** * @public */ -export function setModifiedFlowContent(content) { - return { - type: SET_MODIFIED_FLOW_CONTENT, - content - } -} - - -/** - * @public - */ export function accept(flow) { fetchApi(`/flows/${flow.id}/accept`, { method: 'POST' }) return { type: REQUEST_ACTION } @@ -172,6 +155,15 @@ export function upload(file) { return { type: REQUEST_ACTION } } + +export function select(id) { + return { + type: SELECT, + flowIds: id ? [id] : [] + } +} + + /** * This action creater takes all WebSocket events * @@ -181,16 +173,16 @@ export function handleWsMsg(msg) { switch (msg.cmd) { case websocketActions.CMD_ADD: - return addItem(msg.data) + return addFlow(msg.data) case websocketActions.CMD_UPDATE: - return updateItem(msg.data.id, msg.data) + return updateFlow(msg.data) case websocketActions.CMD_REMOVE: - return removeItem(msg.data.id) + return removeFlow(msg.data.id) case websocketActions.CMD_RESET: - return fetchData() + return fetchFlows() default: return { type: UNKNOWN_CMD, msg } @@ -200,7 +192,7 @@ export function handleWsMsg(msg) { /** * @public websocket */ -export function fetchData() { +export function fetchFlows() { return msgQueueActions.fetchData(MSG_TYPE) } @@ -214,20 +206,20 @@ export function receiveData(list) { /** * @private */ -export function addItem(item) { +export function addFlow(item) { return { type: ADD, item } } /** * @private */ -export function updateItem(id, item) { - return { type: UPDATE, id, item } +export function updateFlow(item) { + return { type: UPDATE, item } } /** * @private */ -export function removeItem(id) { +export function removeFlow(id) { return { type: REMOVE, id } } diff --git a/web/src/js/ducks/index.js b/web/src/js/ducks/index.js index c2488d70..16193530 100644 --- a/web/src/js/ducks/index.js +++ b/web/src/js/ducks/index.js @@ -2,6 +2,7 @@ import { combineReducers } from 'redux' import eventLog from './eventLog' import websocket from './websocket' import flows from './flows' +import flowView from './flowView' import settings from './settings' import ui from './ui' import msgQueue from './msgQueue' @@ -10,6 +11,7 @@ export default combineReducers({ eventLog, websocket, flows, + flowView, settings, ui, msgQueue, diff --git a/web/src/js/ducks/ui.js b/web/src/js/ducks/ui.js index f8234fdb..f745f0af 100644 --- a/web/src/js/ducks/ui.js +++ b/web/src/js/ducks/ui.js @@ -1,42 +1,259 @@ -import {SELECT} from "./views/main" -export const SET_ACTIVE_MENU = 'SET_ACTIVE_MENU'; +import { selectRelative as selectFlowRelative } from './flowView' +import { Key } from '../utils.js' +import * as flowsActions from './flows' +export const SET_ACTIVE_MENU = 'UI_SET_ACTIVE_MENU' +export const SET_CONTENT_VIEW = 'UI_SET_CONTENT_VIEW' +export const SET_SELECTED_INPUT = 'UI_SET_SELECTED_INPUT' +export const UPDATE_QUERY = 'UI_UPDATE_QUERY' +export const SELECT_TAB = 'UI_SELECT_TAB' +export const SET_PROMPT = 'UI_SET_PROMPT' +export const SET_DISPLAY_LARGE = 'UI_SET_DISPLAY_LARGE' const defaultState = { activeMenu: 'Start', + isFlowSelected: false, + selectedInput: null, + displayLarge: false, + promptOpen: false, + contentView: 'ViewAuto', + query: {}, + panel: 'request' } + export default function reducer(state = defaultState, action) { switch (action.type) { + case SET_ACTIVE_MENU: return { ...state, - activeMenu: action.activeMenu + activeMenu: action.activeMenu, } - case SELECT: - let isNewSelect = (action.flowId && !action.currentSelection) - let isDeselect = (!action.flowId && action.currentSelection) - if(isNewSelect) { + + case flowsActions.SELECT: + if (action.flowIds.length && !state.isFlowSelected) { return { ...state, - activeMenu: "Flow" + displayLarge: false, + activeMenu: 'Flow', + isFlowSelected: true, } } - if(isDeselect && state.activeMenu === "Flow") { + + if (!action.flowIds.length && state.isFlowSelected) { + let activeMenu = state.activeMenu + if (activeMenu == 'Flow') { + activeMenu = 'Start' + } return { ...state, - activeMenu: "Start" + activeMenu, + isFlowSelected: false, } } - return state + + return { + ...state, + displayLarge: false, + } + + case SET_CONTENT_VIEW: + return { + ...state, + contentView: action.contentView, + } + + case SET_SELECTED_INPUT: + return { + ...state, + selectedInput: action.input + } + + case UPDATE_QUERY: + return { + ...state, + query: { ...state.query, ...action.query } + } + + case SELECT_TAB: + return { + ...state, + panel: action.panel + } + + case SET_PROMPT: + return { + ...state, + promptOpen: action.open, + } + + case SET_DISPLAY_LARGE: + return { + ...state, + displayLarge: action.displayLarge, + } + default: return state } } export function setActiveMenu(activeMenu) { - return { - type: SET_ACTIVE_MENU, - activeMenu - } + return { type: SET_ACTIVE_MENU, activeMenu } +} + +export function setContentView(contentView) { + return { type: SET_CONTENT_VIEW, contentView } } +export function setSelectedInput(input) { + return { type: SET_SELECTED_INPUT, input } +} + +export function updateQuery(query) { + return { type: UPDATE_QUERY, query } +} + +export function selectTab(panel) { + return { type: SELECT_TAB, panel } +} + +export function setPrompt(open) { + return { type: SET_PROMPT, open } +} + +export function setDisplayLarge(displayLarge) { + return { type: SET_DISPLAY_LARGE, displayLarge } +} + +export function onKeyDown(e) { + if (e.ctrlKey) { + return () => { + } + } + var key = e.keyCode + var shiftKey = e.shiftKey + e.preventDefault() + return (dispatch, getState) => { + + const flow = getState().flows.byId[getState().flows.selected[0]] + + switch (key) { + + case Key.I: + dispatch(setSelectedInput('intercept')) + break + + case Key.L: + dispatch(setSelectedInput('search')) + break + + case Key.H: + dispatch(setSelectedInput('highlight')) + break + + case Key.K: + case Key.UP: + dispatch(selectFlowRelative(-1)) + break + + case Key.J: + case Key.DOWN: + dispatch(selectFlowRelative(+1)) + break + + case Key.SPACE: + case Key.PAGE_DOWN: + dispatch(selectFlowRelative(+10)) + break + + case Key.PAGE_UP: + dispatch(selectFlowRelative(-10)) + break + + case Key.END: + dispatch(selectFlowRelative(+1e10)) + break + + case Key.HOME: + dispatch(selectFlowRelative(-1e10)) + break + + case Key.ESC: + dispatch(flowsActions.select(null)) + break + + case Key.LEFT: + { + let tabs = ['request', 'response', 'error'].filter(k => flow[k]).concat(['details']), + currentTab = getState().ui.panel, + nextTab = tabs[(tabs.indexOf(currentTab) - 1 + tabs.length) % tabs.length] + dispatch(selectTab(nextTab)) + break + } + + case Key.TAB: + case Key.RIGHT: + { + let tabs = ['request', 'response', 'error'].filter(k => flow[k]).concat(['details']), + currentTab = getState().ui.panel, + nextTab = tabs[(tabs.indexOf(currentTab) + 1) % tabs.length] + dispatch(selectTab(nextTab)) + break + } + + case Key.C: + if (shiftKey) { + dispatch(flowsActions.clear()) + } + break + + case Key.D: + { + if (!flow) { + return + } + if (shiftKey) { + dispatch(flowsActions.duplicate(flow)) + } else { + dispatch(flowsActions.remove(flow)) + } + break + } + + case Key.A: + { + if (shiftKey) { + dispatch(flowsActions.acceptAll()) + } else if (flow && flow.intercepted) { + dispatch(flowsActions.accept(flow)) + } + break + } + + case Key.R: + { + if (!shiftKey && flow) { + dispatch(flowsActions.replay(flow)) + } + break + } + + case Key.V: + { + if (!shiftKey && flow && flow.modified) { + dispatch(flowsActions.revert(flow)) + } + break + } + + case Key.E: + dispatch(setPrompt(true)) + break + + default: + return () => { + } + } + } +} diff --git a/web/src/js/ducks/utils/list.js b/web/src/js/ducks/utils/list.js index 4f631590..fdeb5856 100644 --- a/web/src/js/ducks/utils/list.js +++ b/web/src/js/ducks/utils/list.js @@ -23,7 +23,7 @@ export default function reduce(state = defaultState, action) { } case UPDATE: { - const index = state.indexOf[action.id] + const index = state.indexOf[action.item.id] if (index == null) { return state @@ -36,7 +36,7 @@ export default function reduce(state = defaultState, action) { return { ...state, data, - byId: { ...state.byId, [action.id]: action.item } + byId: { ...state.byId, [action.item.id]: action.item } } } @@ -86,8 +86,8 @@ export function add(item) { /** * @public */ -export function update(id, item) { - return { type: UPDATE, id, item } +export function update(item) { + return { type: UPDATE, item } } /** diff --git a/web/src/js/ducks/utils/view.js b/web/src/js/ducks/utils/view.js index 0349a398..c00f00bd 100755 --- a/web/src/js/ducks/utils/view.js +++ b/web/src/js/ducks/utils/view.js @@ -15,8 +15,9 @@ const defaultState = { export default function reduce(state = defaultState, action) { switch (action.type) { - case UPDATE_FILTER: { - const data = action.list.data.filter(action.filter).sort(action.sort) + case UPDATE_FILTER: + { + const data = action.list.filter(action.filter).sort(action.sort) return { ...state, data, @@ -24,7 +25,8 @@ export default function reduce(state = defaultState, action) { } } - case UPDATE_SORT: { + case UPDATE_SORT: + { const data = [...state.data].sort(action.sort) return { ...state, @@ -51,13 +53,13 @@ export default function reduce(state = defaultState, action) { ...sortedRemove(state, action.id), } - case UPDATE: { - if (state.indexOf[action.id] == null) { + case UPDATE: + if (state.indexOf[action.item.id] == null) { return } const nextState = { ...state, - ...sortedRemove(state, action.id), + ...sortedRemove(state, action.item.id), } if (!action.filter(action.item)) { return nextState @@ -66,10 +68,10 @@ export default function reduce(state = defaultState, action) { ...nextState, ...sortedInsert(nextState, action.item, action.sort) } - } - case RECEIVE: { - const data = action.list.data.filter(action.filter).sort(action.sort) + case RECEIVE: + { + const data = action.list.filter(action.filter).sort(action.sort) return { ...state, data, @@ -94,8 +96,8 @@ export function add(item, filter = defaultFilter, sort = defaultSort) { return { type: ADD, item, filter, sort } } -export function update(id, item, filter = defaultFilter, sort = defaultSort) { - return { type: UPDATE, id, item, filter, sort } +export function update(item, filter = defaultFilter, sort = defaultSort) { + return { type: UPDATE, item, filter, sort } } export function remove(id) { diff --git a/web/src/js/ducks/views.js b/web/src/js/ducks/views.js deleted file mode 100755 index e1e46c2e..00000000 --- a/web/src/js/ducks/views.js +++ /dev/null @@ -1,40 +0,0 @@ -import { combineReducers } from 'redux' -import * as viewActions from './utils/view' -import main from './views/main.js' - -export const ADD = 'FLOW_VIEWS_ADD' -export const UPDATE = 'FLOW_VIEWS_UPDATE' -export const REMOVE = 'FLOW_VIEWS_REMOVE' -export const RECEIVE = 'FLOW_VIEWS_RECEIVE' - -export default combineReducers({ - main, -}) - -/** - * @public - */ -export function add(item) { - return { type: ADD, item } -} - -/** - * @public - */ -export function update(id, item) { - return { type: UPDATE, id, item } -} - -/** - * @public - */ -export function remove(id) { - return { type: REMOVE, id } -} - -/** - * @public - */ -export function receive(list) { - return { type: RECEIVE, list } -} diff --git a/web/src/js/ducks/websocket.js b/web/src/js/ducks/websocket.js index 5ba7baef..21400bb5 100644 --- a/web/src/js/ducks/websocket.js +++ b/web/src/js/ducks/websocket.js @@ -68,7 +68,7 @@ export function onConnect() { return dispatch => { dispatch({ type: CONNECTED }) dispatch(settingsActions.fetchData()) - dispatch(flowsActions.fetchData()) + dispatch(flowsActions.fetchFlows()) dispatch(eventLogActions.fetchData()) } } |