Overview

URLredeliver-parcel-au.firebaseapp.com/
IP 199.36.158.100 (United States)
ASN#54113 FASTLY
UserAgentMozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Referer
Report completed2022-09-22 22:17:04 UTC
StatusLoading report..
IDS alerts0
Blocklist alert5
urlquery alerts No alerts detected
Tags None

Domain Summary (48)

Fully Qualifying Domain Name Rank First Seen Last Seen IP Comment
firefox.settings.services.mozilla.com (2) 867 2020-06-04 20:08:41 UTC 2022-09-22 17:04:12 UTC 143.204.55.36
redeliver-parcel-au.firebaseapp.com (1) 0 2022-08-23 04:37:12 UTC 2022-09-22 13:41:06 UTC 199.36.158.100 Unknown ranking
content-signature-2.cdn.mozilla.net (1) 1152 2020-11-03 12:26:46 UTC 2022-09-22 05:24:31 UTC 143.204.55.49
ocsp.digicert.com (11) 86 2012-05-21 07:02:23 UTC 2022-09-22 14:06:31 UTC 93.184.220.29
ipwhois.app (1) 234315 2020-06-10 18:52:00 UTC 2022-09-21 08:55:27 UTC 195.201.57.90
dpm.demdex.net (3) 204 2017-01-30 04:59:39 UTC 2022-09-22 04:52:36 UTC 34.241.100.149
t.co (1) 569 2012-07-25 19:09:44 UTC 2022-09-22 04:52:31 UTC 104.244.42.133
ct.pinterest.com (3) 852 2015-03-12 08:12:48 UTC 2022-09-22 04:47:37 UTC 151.101.84.84
contile.services.mozilla.com (1) 1114 2021-05-27 18:32:35 UTC 2022-09-22 04:34:04 UTC 34.117.237.239
push.services.mozilla.com (1) 2140 2015-09-03 10:29:36 UTC 2022-09-22 05:01:22 UTC 34.218.168.248
ocsp.entrust.net (2) 1208 2013-07-24 12:09:14 UTC 2022-09-22 04:32:03 UTC 104.110.10.32
assets.adobedtm.com (2) 512 2014-01-28 04:51:35 UTC 2022-09-22 04:51:19 UTC 23.38.200.237
adservice.google.com (1) 76 2021-02-20 16:10:48 UTC 2022-09-22 18:05:53 UTC 142.250.74.130
analytics.tiktok.com (4) 1182 2020-02-29 13:09:05 UTC 2022-09-22 05:12:25 UTC 23.36.79.32
static.ads-twitter.com (1) 614 2017-01-30 05:00:15 UTC 2022-09-22 05:18:54 UTC 151.101.84.157
px.ads.linkedin.com (2) 522 2017-08-08 16:28:50 UTC 2022-09-22 16:31:57 UTC 13.107.42.14
analytics.twitter.com (1) 526 2013-04-10 19:53:18 UTC 2022-09-22 05:18:54 UTC 104.244.42.67
www.googletagmanager.com (1) 75 2012-12-25 14:52:06 UTC 2022-09-22 04:31:50 UTC 142.250.74.72
connect.facebook.net (1) 139 2012-05-22 02:51:28 UTC 2022-09-22 04:31:51 UTC 157.240.200.14
www.google.no (1) 25607 2016-04-05 19:50:59 UTC 2022-09-22 06:07:28 UTC 142.250.74.3
www.linkedin.com (1) 608 2014-04-09 13:16:08 UTC 2022-09-22 04:51:34 UTC 13.107.42.14
js-agent.newrelic.com (1) 378 2017-01-30 05:00:15 UTC 2022-09-22 05:01:51 UTC 151.101.86.137
ocsp.sca1b.amazontrust.com (2) 1015 2017-03-03 15:20:51 UTC 2019-03-27 04:05:54 UTC 143.204.42.158
auspost.com.au (27) 32146 2020-10-22 08:52:04 UTC 2022-09-22 10:31:22 UTC 54.230.111.13
ajax.googleapis.com (1) 12905 2014-10-18 20:16:48 UTC 2022-09-22 19:06:03 UTC 142.250.74.42
4621208.fls.doubleclick.net (1) 0 2015-08-12 00:51:52 UTC 2022-09-09 04:56:38 UTC 142.250.74.70 Domain (doubleclick.net) ranked at: 2267
adservice.google.no (1) 96969 2017-09-26 14:23:08 UTC 2022-09-22 04:32:08 UTC 142.250.74.98
www.google.com (1) 7 2016-08-04 12:36:31 UTC 2022-09-22 20:44:09 UTC 142.250.74.164
auspost.demdex.net (1) 532161 2017-01-31 07:48:36 UTC 2022-09-22 10:31:28 UTC 34.249.106.217
googleads.g.doubleclick.net (1) 42 2021-02-20 15:43:32 UTC 2022-09-22 18:11:52 UTC 142.250.74.66
cm.everesttech.net (1) 996 2017-01-30 04:59:57 UTC 2022-09-22 05:18:06 UTC 52.17.180.229
r3.o.lencr.org (6) 344 2020-12-02 08:52:13 UTC 2022-09-22 04:32:00 UTC 23.36.77.32
secure.adnxs.com (4) 396 2012-05-22 16:37:37 UTC 2022-09-22 04:31:50 UTC 185.83.142.19
au-gmtdmp.mookie1.com (1) 232381 2015-04-10 07:51:10 UTC 2022-09-21 18:19:29 UTC 35.227.202.26
app.link (1) 6772 2017-03-14 20:36:16 UTC 2022-09-22 13:11:40 UTC 54.230.111.16
s.pinimg.com (2) 732 2017-01-13 22:40:08 UTC 2022-09-22 10:55:59 UTC 23.38.200.197
www.facebook.com (1) 99 2017-01-30 05:00:00 UTC 2022-09-22 04:32:10 UTC 157.240.200.35
ocsp.pki.goog (15) 175 2017-06-14 07:23:31 UTC 2022-09-22 04:32:28 UTC 142.250.74.3
ocsp.usertrust.com (1) 899 2012-05-21 15:43:18 UTC 2022-09-22 04:34:37 UTC 172.64.155.188
region1.google-analytics.com (1) 0 2022-03-17 11:26:33 UTC 2022-09-22 05:38:43 UTC 216.239.32.36 Domain (google-analytics.com) ranked at: 8401
ssl.o.auspost.com.au (2) 515455 2014-01-29 13:00:34 UTC 2022-09-22 10:31:33 UTC 15.188.95.229
snap.licdn.com (1) 1044 2014-10-06 08:43:45 UTC 2022-09-22 04:33:40 UTC 23.36.76.210
target.auspost.com.au (1) 513363 2020-10-07 16:44:55 UTC 2022-09-22 10:31:26 UTC 15.236.176.210
bam.nr-data.net (2) 630 2015-02-10 00:06:27 UTC 2022-09-22 04:40:07 UTC 162.247.241.14
haytchapifullz.herokuapp.com (1) 0 2022-08-24 08:33:32 UTC 2022-09-07 21:47:06 UTC 54.220.192.176 Unknown ranking
img-getpocket.cdn.mozilla.net (6) 1631 2017-09-01 03:40:57 UTC 2022-09-22 14:28:12 UTC 34.120.237.76
api2.branch.io (2) 537 2020-06-27 01:56:30 UTC 2022-09-22 19:37:00 UTC 143.204.55.28
geolocation-db.com (1) 237326 2019-10-31 01:19:14 UTC 2022-09-22 12:50:41 UTC 159.89.102.253

Network Intrusion Detection Systemsinfo

Suricata /w Emerging Threats Pro
 No alerts detected

Blocklists

OpenPhish
Scan Date Severity Indicator Comment
2022-09-22 2 redeliver-parcel-au.firebaseapp.com/ Australia Post

PhishTank
 No alerts detected

Fortinet's Web Filter
Scan Date Severity Indicator Comment
2022-09-22 2 redeliver-parcel-au.firebaseapp.com/ Phishing

mnemonic secure dns
Scan Date Severity Indicator Comment
2022-09-22 2 ipwhois.app Sinkholed

Quad9 DNS
Scan Date Severity Indicator Comment
2022-09-22 2 redeliver-parcel-au.firebaseapp.com Sinkholed
2022-09-22 2 ipwhois.app Sinkholed


Files

No files detected

Recent reports on same IP/ASN/Domain/Screenshot

Last 5 reports on IP: 199.36.158.100
Date UQ / IDS / BL URL IP
2023-02-05 09:57:50 +0000 0 - 0 - 6 inform-01.firebaseapp.com/ 199.36.158.100
2023-02-05 09:57:38 +0000 0 - 0 - 6 infopostasinfo.web.app/ 199.36.158.100
2023-02-05 09:44:32 +0000 0 - 0 - 6 info-sg.firebaseapp.com/ 199.36.158.100
2023-02-05 09:37:16 +0000 0 - 0 - 2 bbgyu-eb375.firebaseapp.com/ 199.36.158.100
2023-02-05 09:08:12 +0000 0 - 0 - 8 hy-xi1.firebaseapp.com/ 199.36.158.100


Last 5 reports on ASN: FASTLY
Date UQ / IDS / BL URL IP
2023-02-05 09:57:50 +0000 0 - 0 - 6 inform-01.firebaseapp.com/ 199.36.158.100
2023-02-05 09:57:38 +0000 0 - 0 - 6 infopostasinfo.web.app/ 199.36.158.100
2023-02-05 09:44:32 +0000 0 - 0 - 6 info-sg.firebaseapp.com/ 199.36.158.100
2023-02-05 09:37:16 +0000 0 - 0 - 2 bbgyu-eb375.firebaseapp.com/ 199.36.158.100
2023-02-05 09:08:12 +0000 0 - 0 - 8 hy-xi1.firebaseapp.com/ 199.36.158.100


Last 3 reports on domain: redeliver-parcel-au.firebaseapp.com
Date UQ / IDS / BL URL IP
2022-10-08 16:12:03 +0000 0 - 0 - 7 redeliver-parcel-au.firebaseapp.com/ 199.36.158.100
2022-09-22 22:17:04 +0000 0 - 0 - 5 redeliver-parcel-au.firebaseapp.com/ 199.36.158.100
2022-09-01 06:24:47 +0000 0 - 0 - 8 redeliver-parcel-au.firebaseapp.com/ 199.36.158.100


No other reports with similar screenshot

JavaScript

Executed Scripts (63)

Executed Evals (18)
#1 JavaScript::Eval (size: 120353) - SHA256: 54811d037f0715518c988e5fb141374e404f9bcc100ae91ce69be163145d48ed
/*
Copyright � 2013 Adobe Systems Incorporated.

Licensed under the Apache License, Version 2.0 (the License);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an AS IS BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

/**
 * See <a href="http://jquery.com">http://jquery.com</a>.
 * @name jquery
 * @class
 * See the jQuery Library  (<a href="http://jquery.com">http://jquery.com</a>) for full details.  This just
 * documents the function and classes that are added to jQuery by this plug-in.
 */

/**
 * See <a href="http://jquery.com">http://jquery.com</a>
 * @name fn
 * @class
 * See the jQuery Library  (<a href="http://jquery.com">http://jquery.com</a>) for full details.  This just
 * documents the function and classes that are added to jQuery by this plug-in.
 * @memberOf jquery
 */

/**
 * @fileOverview accessibleMegaMenu plugin
 *
 *<p>Licensed under the Apache License, Version 2.0 (the License)
 *<br />Copyright � 2013 Adobe Systems Incorporated.
 *<br />Project page <a href="https://github.com/adobe-accessibility/Accessible-Mega-Menu">https://github.com/adobe-accessibility/Accessible-Mega-Menu</a>
 * @version 0.1
 * @author Michael Jordan
 * @requires jquery
 */

/*jslint browser: true, devel: true, plusplus: true, nomen: true */

/*global jQuery */
(function($, window, document) {
    "use strict";

    var pluginName = "megaMenu",
        defaults = {
            uuidPrefix: "accessible-megamenu",
            // unique ID's are required to indicate aria-owns, aria-controls and aria-labelledby
            menuClass: "accessible-megamenu",
            // default css class used to define the megamenu styling
            topNavItemClass: "accessible-megamenu-top-nav-item",
            // default css class for a top-level navigation item in the megamenu
            panelClass: "accessible-megamenu-panel",
            // default css class for a megamenu panel
            panelGroupClass: "accessible-megamenu-panel-group",
            // default css class for a group of items within a megamenu panel
            hoverClass: "hover",
            // default css class for the hover state
            focusClass: "focus",
            // default css class for the focus state
            openClass: "open" // default css class for the open state

        },
        Keyboard = {
            BACKSPACE: 8,
            COMMA: 188,
            DELETE: 46,
            DOWN: 40,
            END: 35,
            ENTER: 13,
            ESCAPE: 27,
            HOME: 36,
            LEFT: 37,
            PAGE_DOWN: 34,
            PAGE_UP: 33,
            PERIOD: 190,
            RIGHT: 39,
            SPACE: 32,
            TAB: 9,
            UP: 38,
            keyMap: {
                48: "0",
                49: "1",
                50: "2",
                51: "3",
                52: "4",
                53: "5",
                54: "6",
                55: "7",
                56: "8",
                57: "9",
                59: ";",
                65: "a",
                66: "b",
                67: "c",
                68: "d",
                69: "e",
                70: "f",
                71: "g",
                72: "h",
                73: "i",
                74: "j",
                75: "k",
                76: "l",
                77: "m",
                78: "n",
                79: "o",
                80: "p",
                81: "q",
                82: "r",
                83: "s",
                84: "t",
                85: "u",
                86: "v",
                87: "w",
                88: "x",
                89: "y",
                90: "z",
                96: "0",
                97: "1",
                98: "2",
                99: "3",
                100: "4",
                101: "5",
                102: "6",
                103: "7",
                104: "8",
                105: "9",
                190: "."
            }
        };
    /**
     * @desc Creates a new accessible mega menu instance.
     * @param {jquery} element
     * @param {object} [options] Mega Menu options
     * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby
     * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling
     * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu
     * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel
     * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel
     * @param {string} [options.hoverClass=hover] - CSS class for the hover state
     * @param {string} [options.focusClass=focus] - CSS class for the focus state
     * @param {string} [options.openClass=open] - CSS class for the open state
     * @constructor
     */

    function AccessibleMegaMenu(element, options) {
        this.element = element; // merge optional settings and defaults into settings

        this.settings = $.extend({}, defaults, options);
        this._defaults = defaults;
        this._name = pluginName;
        this.mouseTimeoutID = null;
        this.focusTimeoutID = null;
        this.mouseFocused = false;
        this.justFocused = false;
        this.init();
    }

    AccessibleMegaMenu.prototype = function() {
        /* private attributes and methods ------------------------ */
        var uuid = 0,
            keydownTimeoutDuration = 1000,
            keydownSearchString = "",
            isTouch = typeof window.hasOwnProperty === "function" && !!window.hasOwnProperty("ontouchstart"),
            _getPlugin,
            _addUniqueId,
            _togglePanel,
            _clickHandler,
            _clickOutsideHandler,
            _DOMAttrModifiedHandler,
            _focusInHandler,
            _focusOutHandler,
            _keyDownHandler,
            _mouseDownHandler,
            _mouseOverHandler,
            _mouseOutHandler,
            _toggleExpandedEventHandlers;
        /**
         * @name jQuery.fn.accessibleMegaMenu~_getPlugin
         * @desc Returns the parent accessibleMegaMenu instance for a given element
         * @param {jQuery} element
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _getPlugin = function _getPlugin(element) {
            return $(element).closest(':data(plugin_' + pluginName + ')').data("plugin_" + pluginName);
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_addUniqueId
         * @desc Adds a unique id and element.
         * The id string starts with the
         * string defined in settings.uuidPrefix.
         * @param {jQuery} element
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _addUniqueId = function _addUniqueId(element) {
            element = $(element);
            var settings = this.settings;

            if (!element.attr("id")) {
                element.attr("id", settings.uuidPrefix + "-" + new Date().getTime() + "-" + ++uuid);
            }
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_togglePanel
         * @desc Toggle the display of mega menu panels in response to an event.
         * The optional boolean value 'hide' forces all panels to hide.
         * @param {event} event
         * @param {Boolean} [hide] Hide all mega menu panels when true
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _togglePanel = function _togglePanel(event, hide) {
            var target = $(event.target),
                that = this,
                settings = this.settings,
                menu = this.menu,
                topli = target.closest('.' + settings.topNavItemClass),
                panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),
                newfocus;

            _toggleExpandedEventHandlers.call(this, true);

            if (window.matchMedia("(min-width: 970px)").matches) {
                if (hide) {
                    topli = menu.find('.' + settings.topNavItemClass + ':visible .' + settings.openClass + ':first').closest('.' + settings.topNavItemClass);

                    if (!(topli.is(event.relatedTarget) || topli.has(event.relatedTarget).length > 0)) {
                        if ((event.type === 'mouseout' || event.type === 'focusout') && topli.has(document.activeElement).length > 0) {
                            return;
                        }

                        topli.find('[aria-expanded]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');

                        if (event.type === 'keydown' && event.keyCode === Keyboard.ESCAPE || event.type === 'DOMAttrModified') {
                            newfocus = topli.find(':tabbable:first');
                            setTimeout(function() {
                                menu.find('[aria-expanded].' + that.settings.panelClass).off('DOMAttrModified.accessible-megamenu');
                                newfocus.focus();
                                that.justFocused = false;
                            }, 99);
                        }
                    } else if (topli.length === 0) {
                        menu.find('[aria-expanded=true]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
                    }
                } else {
                    clearTimeout(that.focusTimeoutID);
                    topli.siblings().find('[aria-expanded]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true');
                    topli.find('[aria-expanded]').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false');

                    if (event.type === 'mouseover' && target.is(':tabbable') && topli.length === 1 && panel.length === 0 && menu.has(document.activeElement).length > 0) {
                        target.focus();
                        that.justFocused = false;
                    }

                    _toggleExpandedEventHandlers.call(that);
                }
            }
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_clickHandler
         * @desc Handle click event on mega menu item
         * @param {event} Event object
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _clickHandler = function _clickHandler(event) {
            var target = $(event.currentTarget),
                topli = target.closest('.' + this.settings.topNavItemClass),
                panel = target.closest('.' + this.settings.panelClass);

            if (topli.length === 1 && panel.length === 0 && topli.find('.' + this.settings.panelClass).length === 1) {
                if (!target.hasClass(this.settings.openClass)) {
                    event.preventDefault();
                    event.stopPropagation();

                    _togglePanel.call(this, event);

                    this.justFocused = false;
                } else {
                    if (this.justFocused) {
                        event.preventDefault();
                        event.stopPropagation();
                        this.justFocused = false;
                    } else if (isTouch) {
                        event.preventDefault();
                        event.stopPropagation();

                        _togglePanel.call(this, event, target.hasClass(this.settings.openClass));
                    }
                }
            }
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_clickOutsideHandler
         * @desc Handle click event outside of a the megamenu
         * @param {event} Event object
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _clickOutsideHandler = function _clickOutsideHandler(event) {
            if ($(event.target).closest(this.menu).length === 0) {
                event.preventDefault();
                event.stopPropagation();

                _togglePanel.call(this, event, true);
            }
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_DOMAttrModifiedHandler
         * @desc Handle DOMAttrModified event on panel to respond to Windows 8 Narrator ExpandCollapse pattern
         * @param {event} Event object
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _DOMAttrModifiedHandler = function _DOMAttrModifiedHandler(event) {
            if (event.originalEvent.attrName === 'aria-expanded' && event.originalEvent.newValue === 'false' && $(event.target).hasClass(this.settings.openClass)) {
                event.preventDefault();
                event.stopPropagation();

                _togglePanel.call(this, event, true);
            }
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_focusInHandler
         * @desc Handle focusin event on mega menu item.
         * @param {event} Event object
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _focusInHandler = function _focusInHandler(event) {
            clearTimeout(this.focusTimeoutID);
            var target = $(event.target),
                panel = target.closest('.' + this.settings.panelClass);
            target.addClass(this.settings.focusClass).on('click.accessible-megamenu', $.proxy(_clickHandler, this));
            this.justFocused = !this.mouseFocused;
            this.mouseFocused = false;

            if (this.panels.not(panel).filter('.' + this.settings.openClass).length) {
                _togglePanel.call(this, event);
            }
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_focusOutHandler
         * @desc Handle focusout event on mega menu item.
         * @param {event} Event object
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _focusOutHandler = function _focusOutHandler(event) {
            this.justFocused = false;
            var that = this,
                target = $(event.target),
                topli = target.closest('.' + this.settings.topNavItemClass),
                keepOpen = false;
            target.removeClass(this.settings.focusClass).off('click.accessible-megamenu');

            if (window.cvox) {
                // If ChromeVox is running...
                that.focusTimeoutID = setTimeout(function() {
                    window.cvox.Api.getCurrentNode(function(node) {
                        if (topli.has(node).length) {
                            // and the current node being voiced is in
                            // the mega menu, clearTimeout,
                            // so the panel stays open.
                            clearTimeout(that.focusTimeoutID);
                        } else {
                            that.focusTimeoutID = setTimeout(function(scope, event, hide) {
                                _togglePanel.call(scope, event, hide);
                            }, 275, that, event, true);
                        }
                    });
                }, 25);
            } else {
                that.focusTimeoutID = setTimeout(function() {
                    _togglePanel.call(that, event, true);
                }, 300);
            }
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_keyDownHandler
         * @desc Handle keydown event on mega menu.
         * @param {event} Event object
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _keyDownHandler = function _keyDownHandler(event) {
            var that = this.constructor === AccessibleMegaMenu ? this : _getPlugin(this),
                // determine the AccessibleMegaMenu plugin instance
                settings = that.settings,
                target = $($(this).is('.' + settings.hoverClass + ':tabbable') ? this : event.target),
                // if the element is hovered the target is this, otherwise, its the focused element
                menu = that.menu,
                topnavitems = that.topnavitems,
                topli = target.closest('.' + settings.topNavItemClass),
                tabbables = menu.find(':tabbable'),
                panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass),
                panelGroups = panel.find('.' + settings.panelGroupClass),
                currentPanelGroup = target.closest('.' + settings.panelGroupClass),
                next,
                keycode = event.keyCode || event.which,
                start,
                i,
                o,
                label,
                found = false,
                newString = Keyboard.keyMap[event.keyCode] || '',
                regex,
                isTopNavItem = topli.length === 1 && panel.length === 0;

            if (target.is("input:focus, select:focus, textarea:focus, button:focus")) {
                // if the event target is a form element we should handle keydown normally
                return;
            }

            if (target.is('.' + settings.hoverClass + ':tabbable')) {
                $('html').off('keydown.accessible-megamenu');
            }

            switch (keycode) {
                case Keyboard.ESCAPE:
                    _togglePanel.call(that, event, true);

                    break;

                case Keyboard.DOWN:
                    event.preventDefault();

                    if (isTopNavItem) {
                        _togglePanel.call(that, event);

                        found = topli.find('.' + settings.panelClass + ' :tabbable:first').focus().length === 1;
                    } else {
                        found = tabbables.filter(':gt(' + tabbables.index(target) + '):first').focus().length === 1;
                    }

                    if (!found && window.opera && opera.toString() === "[object Opera]" && (event.ctrlKey || event.metaKey)) {
                        tabbables = $(':tabbable');
                        i = tabbables.index(target);
                        found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
                    }

                    break;

                case Keyboard.UP:
                    event.preventDefault();

                    if (isTopNavItem && target.hasClass(settings.openClass)) {
                        _togglePanel.call(that, event, true);

                        next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');

                        if (next.children('.' + settings.panelClass).length) {
                            found = next.children().attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus() === 1;
                        }
                    } else if (!isTopNavItem) {
                        found = tabbables.filter(':lt(' + tabbables.index(target) + '):last').focus().length === 1;
                    }

                    if (!found && window.opera && opera.toString() === "[object Opera]" && (event.ctrlKey || event.metaKey)) {
                        tabbables = $(':tabbable');
                        i = tabbables.index(target);
                        found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
                    }

                    break;

                case Keyboard.RIGHT:
                    event.preventDefault();

                    if (isTopNavItem) {
                        found = topnavitems.filter(':gt(' + topnavitems.index(topli) + '):first').find(':tabbable:first').focus().length === 1;
                    } else {
                        if (panelGroups.length && currentPanelGroup.length) {
                            // if the current panel contains panel groups, and we are able to focus the first tabbable element of the next panel group
                            found = panelGroups.filter(':gt(' + panelGroups.index(currentPanelGroup) + '):first').find(':tabbable:first').focus().length === 1;
                        }

                        if (!found) {
                            found = topli.find(':tabbable:first').focus().length === 1;
                        }
                    }

                    break;

                case Keyboard.LEFT:
                    event.preventDefault();

                    if (isTopNavItem) {
                        found = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last').find(':tabbable:first').focus().length === 1;
                    } else {
                        if (panelGroups.length && currentPanelGroup.length) {
                            // if the current panel contains panel groups, and we are able to focus the first tabbable element of the previous panel group
                            found = panelGroups.filter(':lt(' + panelGroups.index(currentPanelGroup) + '):last').find(':tabbable:first').focus().length === 1;
                        }

                        if (!found) {
                            found = topli.find(':tabbable:first').focus().length === 1;
                        }
                    }

                    break;

                case Keyboard.TAB:
                    i = tabbables.index(target);

                    if (event.shiftKey && isTopNavItem && target.hasClass(settings.openClass)) {
                        _togglePanel.call(that, event, true);

                        next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last');

                        if (next.children('.' + settings.panelClass).length) {
                            found = next.children().attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus();
                        }
                    } else if (event.shiftKey && i > 0) {
                        found = tabbables.filter(':lt(' + i + '):last').focus().length === 1;
                    } else if (!event.shiftKey && i < tabbables.length - 1) {
                        found = tabbables.filter(':gt(' + i + '):first').focus().length === 1;
                    } else if (window.opera && opera.toString() === "[object Opera]") {
                        tabbables = $(':tabbable');
                        i = tabbables.index(target);

                        if (event.shiftKey) {
                            found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):last').focus().length === 1;
                        } else {
                            found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1;
                        }
                    }

                    if (found) {
                        event.preventDefault();
                    }

                    break;

                case Keyboard.SPACE:
                    if (isTopNavItem) {
                        event.preventDefault();

                        _clickHandler.call(that, event);
                    } else {
                        return true;
                    }

                    break;

                case Keyboard.ENTER:
                    return true;
                    break;

                default:
                    // alphanumeric filter
                    clearTimeout(this.keydownTimeoutID);
                    keydownSearchString += newString !== keydownSearchString ? newString : '';

                    if (keydownSearchString.length === 0) {
                        return;
                    }

                    this.keydownTimeoutID = setTimeout(function() {
                        keydownSearchString = '';
                    }, keydownTimeoutDuration);

                    if (isTopNavItem && !target.hasClass(settings.openClass)) {
                        tabbables = tabbables.filter(':not(.' + settings.panelClass + ' :tabbable)');
                    } else {
                        tabbables = topli.find(':tabbable');
                    }

                    if (event.shiftKey) {
                        tabbables = $(tabbables.get().reverse());
                    }

                    for (i = 0; i < tabbables.length; i++) {
                        o = tabbables.eq(i);

                        if (o.is(target)) {
                            start = keydownSearchString.length === 1 ? i + 1 : i;
                            break;
                        }
                    }

                    regex = new RegExp('^' + keydownSearchString.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'), 'i');

                    for (i = start; i < tabbables.length; i++) {
                        o = tabbables.eq(i);
                        label = $.trim(o.text());

                        if (regex.test(label)) {
                            found = true;
                            o.focus();
                            break;
                        }
                    }

                    if (!found) {
                        for (i = 0; i < start; i++) {
                            o = tabbables.eq(i);
                            label = $.trim(o.text());

                            if (regex.test(label)) {
                                o.focus();
                                break;
                            }
                        }
                    }

                    break;
            }

            that.justFocused = false;
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_mouseDownHandler
         * @desc Handle mousedown event on mega menu.
         * @param {event} Event object
         * @memberof accessibleMegaMenu
         * @inner
         * @private
         */


        _mouseDownHandler = function _mouseDownHandler(event) {
            if ($(event.target).is(this.settings.panelClass) || $(event.target).closest(":focusable").length) {
                this.mouseFocused = true;
            }

            this.mouseTimeoutID = setTimeout(function() {
                clearTimeout(this.focusTimeoutID);
            }, 1);
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_mouseOverHandler
         * @desc Handle mouseover event on mega menu.
         * @param {event} Event object
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _mouseOverHandler = function _mouseOverHandler(event) {
            clearTimeout(this.mouseTimeoutID);
            $(event.target).addClass(this.settings.hoverClass);

            _togglePanel.call(this, event);

            if ($(event.target).is(':tabbable')) {
                $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target));
            }
        };
        /**
         * @name jQuery.fn.accessibleMegaMenu~_mouseOutHandler
         * @desc Handle mouseout event on mega menu.
         * @param {event} Event object
         * @memberof jQuery.fn.accessibleMegaMenu
         * @inner
         * @private
         */


        _mouseOutHandler = function _mouseOutHandler(event) {
            var that = this;
            $(event.target).removeClass(that.settings.hoverClass);
            that.mouseTimeoutID = setTimeout(function() {
                _togglePanel.call(that, event, true);
            }, 250);

            if ($(event.target).is(':tabbable')) {
                $('html').off('keydown.accessible-megamenu');
            }
        };

        _toggleExpandedEventHandlers = function _toggleExpandedEventHandlers(hide) {
            var menu = this.menu;

            if (hide) {
                $('html').off('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu,  pointerup.outside-accessible-megamenu');
                menu.find('[aria-expanded].' + this.settings.panelClass).off('DOMAttrModified.accessible-megamenu');
            } else {
                $('html').on('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu,  pointerup.outside-accessible-megamenu', $.proxy(_clickOutsideHandler, this));
                /* Narrator in Windows 8 automatically toggles the aria-expanded property on double tap or click.
                   To respond to the change to collapse the panel, we must add a listener for a DOMAttrModified event. */

                menu.find('[aria-expanded=true].' + this.settings.panelClass).on('DOMAttrModified.accessible-megamenu', $.proxy(_DOMAttrModifiedHandler, this));
            }
        };
        /* public attributes and methods ------------------------- */


        return {
            constructor: AccessibleMegaMenu,

            /**
             * @lends jQuery.fn.accessibleMegaMenu
             * @desc Initializes an instance of the accessibleMegaMenu plugins
             * @memberof jQuery.fn.accessibleMegaMenu
             * @instance
             */
            init: function init() {
                var settings = this.settings,
                    nav = $(this.element),
                    menu = nav.children('ul').first(),
                    topnavitems = menu.children();
                this.start(settings, nav, menu, topnavitems);
            },
            start: function start(settings, nav, menu, topnavitems) {
                var that = this;
                var CLASS_PRIMARY_TOOLS_LIST = 'pn-link--tools';
                var CLASS_PRIMARY_UTILITY_LIST = 'pn-link--utility';
                this.settings = settings;
                this.menu = menu;
                this.topnavitems = topnavitems;
                nav.attr("role", "navigation");
                menu.addClass(settings.menuClass);
                topnavitems.each(function(i, topnavitem) {
                    var topnavitemlink, topnavitempanel;
                    topnavitem = $(topnavitem);
                    topnavitem.addClass(settings.topNavItemClass);
                    topnavitemlink = topnavitem.find(":tabbable:first");
                    topnavitempanel = topnavitem.children(":not(:tabbable):last");

                    _addUniqueId.call(that, topnavitemlink);

                    if (topnavitempanel.length) {
                        _addUniqueId.call(that, topnavitempanel);

                        if (!topnavitempanel.hasClass('is-open')) {
                            //DTN-1565: Tools and Utility has no collapse/expand
                            if (!(topnavitemlink.hasClass(CLASS_PRIMARY_TOOLS_LIST) || topnavitemlink.hasClass(CLASS_PRIMARY_UTILITY_LIST))) {
                                topnavitemlink.attr({
                                    "aria-expanded": false
                                });
                            }
                        } // only set aria-expanded and aria-hidden for panel that is not open.
                        // 'is-open' attribute is set on the aem sightly template (primary-nav.html)
                        // e.g. if we're on a page that is under Business, then dom for business panel is 'is-open'


                        if (!topnavitempanel.hasClass('is-open')) {
                            topnavitempanel.attr({
                                "role": "group",
                                "aria-expanded": false,
                                "aria-hidden": true
                            }).addClass(settings.panelClass);
                        }
                    }
                });
                this.panels = menu.find("." + settings.panelClass);
                menu.on("focusin.accessible-megamenu", ":focusable, ." + settings.panelClass, $.proxy(_focusInHandler, this)).on("focusout.accessible-megamenu", ":focusable, ." + settings.panelClass, $.proxy(_focusOutHandler, this)).on("keydown.accessible-megamenu", $.proxy(_keyDownHandler, this)).on("mouseover.accessible-megamenu", $.proxy(_mouseOverHandler, this)).on("mouseout.accessible-megamenu", $.proxy(_mouseOutHandler, this)).on("mousedown.accessible-megamenu", $.proxy(_mouseDownHandler, this));

                if (isTouch) {
                    menu.on("touchstart.accessible-megamenu", $.proxy(_clickHandler, this));
                }

                menu.find("hr").attr("role", "separator");

                if ($(document.activeElement).closest(menu).length) {
                    $(document.activeElement).trigger("focusin.accessible-megamenu");
                }
            },

            /**
             * @desc Get default values
             * @example $(selector).accessibleMegaMenu("getDefaults");
             * @return {object}
             * @memberof jQuery.fn.accessibleMegaMenu
             * @instance
             */
            getDefaults: function getDefaults() {
                return this._defaults;
            },

            /**
             * @desc Get any option set to plugin using its name (as string)
             * @example $(selector).accessibleMegaMenu("getOption", some_option);
             * @param {string} opt
             * @return {string}
             * @memberof jQuery.fn.accessibleMegaMenu
             * @instance
             */
            getOption: function getOption(opt) {
                return this.settings[opt];
            },

            /**
             * @desc Get all options
             * @example $(selector).accessibleMegaMenu("getAllOptions");
             * @return {object}
             * @memberof jQuery.fn.accessibleMegaMenu
             * @instance
             */
            getAllOptions: function getAllOptions() {
                return this.settings;
            },

            /**
             * @desc Set option
             * @example $(selector).accessibleMegaMenu("setOption", "option_name",  "option_value",  reinitialize);
             * @param {string} opt - Option name
             * @param {string} val - Option value
             * @param {boolean} [reinitialize] - boolean to re-initialize the menu.
             * @memberof jQuery.fn.accessibleMegaMenu
             * @instance
             */
            setOption: function setOption(opt, value, reinitialize) {
                this.settings[opt] = value;

                if (reinitialize) {
                    this.init();
                }
            }
        };
    }();

    $.fn[pluginName] = function(options) {
        return this.each(function() {
            if (!$.data(this, "plugin_" + pluginName)) {
                $.data(this, "plugin_" + pluginName, new $.fn[pluginName].AccessibleMegaMenu(this, options));
            }
        });
    };

    $.fn[pluginName].AccessibleMegaMenu = AccessibleMegaMenu;
    /**
     * @private
     */

    function visible(element) {
            return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function() {
                return $.css(this, "visibility") === "hidden";
            }).length;
        }
        /**
         * @private
         */


    function _focusable(element, isTabIndexNotNaN) {
        var map,
            mapName,
            img,
            nodeName = element.nodeName.toLowerCase();

        if ("area" === nodeName) {
            map = element.parentNode;
            mapName = map.name;

            if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
                return false;
            }

            img = $("img[usemap=#" + mapName + "]")[0];
            return !!img && visible(img);
        }

        return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible
            visible(element);
    }

    $.extend($.expr[":"], {
        data: $.expr.createPseudo ? $.expr.createPseudo(function(dataName) {
                return function(elem) {
                    return !!$.data(elem, dataName);
                };
            }) : // support: jQuery <1.8
            function(elem, i, match) {
                return !!$.data(elem, match[3]);
            },
        focusable: function focusable(element) {
            return _focusable(element, !isNaN($.attr(element, "tabindex")));
        },
        tabbable: function tabbable(element) {
            var tabIndex = $.attr(element, "tabindex"),
                isTabIndexNaN = isNaN(tabIndex);
            return (isTabIndexNaN || tabIndex >= 0) && _focusable(element, !isTabIndexNaN);
        }
    });
})(jQuery, window, document); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE1LmpzIiwibmFtZXMiOlsiJCIsIndpbmRvdyIsImRvY3VtZW50IiwicGx1Z2luTmFtZSIsImRlZmF1bHRzIiwidXVpZFByZWZpeCIsIm1lbnVDbGFzcyIsInRvcE5hdkl0ZW1DbGFzcyIsInBhbmVsQ2xhc3MiLCJwYW5lbEdyb3VwQ2xhc3MiLCJob3ZlckNsYXNzIiwiZm9jdXNDbGFzcyIsIm9wZW5DbGFzcyIsIktleWJvYXJkIiwiQkFDS1NQQUNFIiwiQ09NTUEiLCJERUxFVEUiLCJET1dOIiwiRU5EIiwiRU5URVIiLCJFU0NBUEUiLCJIT01FIiwiTEVGVCIsIlBBR0VfRE9XTiIsIlBBR0VfVVAiLCJQRVJJT0QiLCJSSUdIVCIsIlNQQUNFIiwiVEFCIiwiVVAiLCJrZXlNYXAiLCJBY2Nlc3NpYmxlTWVnYU1lbnUiLCJlbGVtZW50Iiwib3B0aW9ucyIsInNldHRpbmdzIiwiZXh0ZW5kIiwiX2RlZmF1bHRzIiwiX25hbWUiLCJtb3VzZVRpbWVvdXRJRCIsImZvY3VzVGltZW91dElEIiwibW91c2VGb2N1c2VkIiwianVzdEZvY3VzZWQiLCJpbml0IiwicHJvdG90eXBlIiwidXVpZCIsImtleWRvd25UaW1lb3V0RHVyYXRpb24iLCJrZXlkb3duU2VhcmNoU3RyaW5nIiwiaXNUb3VjaCIsImhhc093blByb3BlcnR5IiwiX2dldFBsdWdpbiIsIl9hZGRVbmlxdWVJZCIsIl90b2dnbGVQYW5lbCIsIl9jbGlja0hhbmRsZXIiLCJfY2xpY2tPdXRzaWRlSGFuZGxlciIsIl9ET01BdHRyTW9kaWZpZWRIYW5kbGVyIiwiX2ZvY3VzSW5IYW5kbGVyIiwiX2ZvY3VzT3V0SGFuZGxlciIsIl9rZXlEb3duSGFuZGxlciIsIl9tb3VzZURvd25IYW5kbGVyIiwiX21vdXNlT3ZlckhhbmRsZXIiLCJfbW91c2VPdXRIYW5kbGVyIiwiX3RvZ2dsZUV4cGFuZGVkRXZlbnRIYW5kbGVycyIsImNsb3Nlc3QiLCJkYXRhIiwiYXR0ciIsIkRhdGUiLCJnZXRUaW1lIiwiZXZlbnQiLCJoaWRlIiwidGFyZ2V0IiwidGhhdCIsIm1lbnUiLCJ0b3BsaSIsInBhbmVsIiwiaGFzQ2xhc3MiLCJuZXdmb2N1cyIsImNhbGwiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsImZpbmQiLCJpcyIsInJlbGF0ZWRUYXJnZXQiLCJoYXMiLCJsZW5ndGgiLCJ0eXBlIiwiYWN0aXZlRWxlbWVudCIsInJlbW92ZUNsYXNzIiwiZmlsdGVyIiwia2V5Q29kZSIsInNldFRpbWVvdXQiLCJvZmYiLCJmb2N1cyIsImNsZWFyVGltZW91dCIsInNpYmxpbmdzIiwiYWRkQ2xhc3MiLCJjdXJyZW50VGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJvcmlnaW5hbEV2ZW50IiwiYXR0ck5hbWUiLCJuZXdWYWx1ZSIsIm9uIiwicHJveHkiLCJwYW5lbHMiLCJub3QiLCJrZWVwT3BlbiIsImN2b3giLCJBcGkiLCJnZXRDdXJyZW50Tm9kZSIsIm5vZGUiLCJzY29wZSIsImNvbnN0cnVjdG9yIiwidG9wbmF2aXRlbXMiLCJ0YWJiYWJsZXMiLCJwYW5lbEdyb3VwcyIsImN1cnJlbnRQYW5lbEdyb3VwIiwibmV4dCIsImtleWNvZGUiLCJ3aGljaCIsInN0YXJ0IiwiaSIsIm8iLCJsYWJlbCIsImZvdW5kIiwibmV3U3RyaW5nIiwicmVnZXgiLCJpc1RvcE5hdkl0ZW0iLCJpbmRleCIsIm9wZXJhIiwidG9TdHJpbmciLCJjdHJsS2V5IiwibWV0YUtleSIsImNoaWxkcmVuIiwic2hpZnRLZXkiLCJrZXlkb3duVGltZW91dElEIiwiZ2V0IiwicmV2ZXJzZSIsImVxIiwiUmVnRXhwIiwicmVwbGFjZSIsInRyaW0iLCJ0ZXh0IiwidGVzdCIsIm5hdiIsImZpcnN0IiwiQ0xBU1NfUFJJTUFSWV9UT09MU19MSVNUIiwiQ0xBU1NfUFJJTUFSWV9VVElMSVRZX0xJU1QiLCJlYWNoIiwidG9wbmF2aXRlbSIsInRvcG5hdml0ZW1saW5rIiwidG9wbmF2aXRlbXBhbmVsIiwidHJpZ2dlciIsImdldERlZmF1bHRzIiwiZ2V0T3B0aW9uIiwib3B0IiwiZ2V0QWxsT3B0aW9ucyIsInNldE9wdGlvbiIsInZhbHVlIiwicmVpbml0aWFsaXplIiwiZm4iLCJ2aXNpYmxlIiwiZXhwciIsImZpbHRlcnMiLCJwYXJlbnRzIiwiYWRkQmFjayIsImNzcyIsImZvY3VzYWJsZSIsImlzVGFiSW5kZXhOb3ROYU4iLCJtYXAiLCJtYXBOYW1lIiwiaW1nIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsInBhcmVudE5vZGUiLCJuYW1lIiwiaHJlZiIsImRpc2FibGVkIiwiY3JlYXRlUHNldWRvIiwiZGF0YU5hbWUiLCJlbGVtIiwibWF0Y2giLCJpc05hTiIsInRhYmJhYmxlIiwidGFiSW5kZXgiLCJpc1RhYkluZGV4TmFOIiwialF1ZXJ5Il0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvdmVuZG9ycy9tZWdhbWVudS5qcz9kYjQ2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgwqkgMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIOKAnExpY2Vuc2XigJ0pO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiDigJxBUyBJU+KAnSBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG4vKipcbiAqIFNlZSA8YSBocmVmPVwiaHR0cDovL2pxdWVyeS5jb21cIj5odHRwOi8vanF1ZXJ5LmNvbTwvYT4uXG4gKiBAbmFtZSBqcXVlcnlcbiAqIEBjbGFzc1xuICogU2VlIHRoZSBqUXVlcnkgTGlicmFyeSAgKDxhIGhyZWY9XCJodHRwOi8vanF1ZXJ5LmNvbVwiPmh0dHA6Ly9qcXVlcnkuY29tPC9hPikgZm9yIGZ1bGwgZGV0YWlscy4gIFRoaXMganVzdFxuICogZG9jdW1lbnRzIHRoZSBmdW5jdGlvbiBhbmQgY2xhc3NlcyB0aGF0IGFyZSBhZGRlZCB0byBqUXVlcnkgYnkgdGhpcyBwbHVnLWluLlxuICovXG5cbi8qKlxuICogU2VlIDxhIGhyZWY9XCJodHRwOi8vanF1ZXJ5LmNvbVwiPmh0dHA6Ly9qcXVlcnkuY29tPC9hPlxuICogQG5hbWUgZm5cbiAqIEBjbGFzc1xuICogU2VlIHRoZSBqUXVlcnkgTGlicmFyeSAgKDxhIGhyZWY9XCJodHRwOi8vanF1ZXJ5LmNvbVwiPmh0dHA6Ly9qcXVlcnkuY29tPC9hPikgZm9yIGZ1bGwgZGV0YWlscy4gIFRoaXMganVzdFxuICogZG9jdW1lbnRzIHRoZSBmdW5jdGlvbiBhbmQgY2xhc3NlcyB0aGF0IGFyZSBhZGRlZCB0byBqUXVlcnkgYnkgdGhpcyBwbHVnLWluLlxuICogQG1lbWJlck9mIGpxdWVyeVxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlldyBhY2Nlc3NpYmxlTWVnYU1lbnUgcGx1Z2luXG4gKlxuICo8cD5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg4oCcTGljZW5zZeKAnSlcbiAqPGJyIC8+Q29weXJpZ2h0IMKpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuXG4gKjxiciAvPlByb2plY3QgcGFnZSA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2Fkb2JlLWFjY2Vzc2liaWxpdHkvQWNjZXNzaWJsZS1NZWdhLU1lbnVcIj5odHRwczovL2dpdGh1Yi5jb20vYWRvYmUtYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmxlLU1lZ2EtTWVudTwvYT5cbiAqIEB2ZXJzaW9uIDAuMVxuICogQGF1dGhvciBNaWNoYWVsIEpvcmRhblxuICogQHJlcXVpcmVzIGpxdWVyeVxuICovXG5cbi8qanNsaW50IGJyb3dzZXI6IHRydWUsIGRldmVsOiB0cnVlLCBwbHVzcGx1czogdHJ1ZSwgbm9tZW46IHRydWUgKi9cbi8qZ2xvYmFsIGpRdWVyeSAqL1xuKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50KSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBwbHVnaW5OYW1lID0gXCJtZWdhTWVudVwiLFxuICAgICAgICBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIHV1aWRQcmVmaXg6IFwiYWNjZXNzaWJsZS1tZWdhbWVudVwiLCAvLyB1bmlxdWUgSUQncyBhcmUgcmVxdWlyZWQgdG8gaW5kaWNhdGUgYXJpYS1vd25zLCBhcmlhLWNvbnRyb2xzIGFuZCBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgIG1lbnVDbGFzczogXCJhY2Nlc3NpYmxlLW1lZ2FtZW51XCIsIC8vIGRlZmF1bHQgY3NzIGNsYXNzIHVzZWQgdG8gZGVmaW5lIHRoZSBtZWdhbWVudSBzdHlsaW5nXG4gICAgICAgICAgICB0b3BOYXZJdGVtQ2xhc3M6IFwiYWNjZXNzaWJsZS1tZWdhbWVudS10b3AtbmF2LWl0ZW1cIiwgLy8gZGVmYXVsdCBjc3MgY2xhc3MgZm9yIGEgdG9wLWxldmVsIG5hdmlnYXRpb24gaXRlbSBpbiB0aGUgbWVnYW1lbnVcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwiYWNjZXNzaWJsZS1tZWdhbWVudS1wYW5lbFwiLCAvLyBkZWZhdWx0IGNzcyBjbGFzcyBmb3IgYSBtZWdhbWVudSBwYW5lbFxuICAgICAgICAgICAgcGFuZWxHcm91cENsYXNzOiBcImFjY2Vzc2libGUtbWVnYW1lbnUtcGFuZWwtZ3JvdXBcIiwgLy8gZGVmYXVsdCBjc3MgY2xhc3MgZm9yIGEgZ3JvdXAgb2YgaXRlbXMgd2l0aGluIGEgbWVnYW1lbnUgcGFuZWxcbiAgICAgICAgICAgIGhvdmVyQ2xhc3M6IFwiaG92ZXJcIiwgLy8gZGVmYXVsdCBjc3MgY2xhc3MgZm9yIHRoZSBob3ZlciBzdGF0ZVxuICAgICAgICAgICAgZm9jdXNDbGFzczogXCJmb2N1c1wiLCAvLyBkZWZhdWx0IGNzcyBjbGFzcyBmb3IgdGhlIGZvY3VzIHN0YXRlXG4gICAgICAgICAgICBvcGVuQ2xhc3M6IFwib3BlblwiIC8vIGRlZmF1bHQgY3NzIGNsYXNzIGZvciB0aGUgb3BlbiBzdGF0ZVxuICAgICAgICB9LFxuICAgICAgICBLZXlib2FyZCA9IHtcbiAgICAgICAgICAgIEJBQ0tTUEFDRTogOCxcbiAgICAgICAgICAgIENPTU1BOiAxODgsXG4gICAgICAgICAgICBERUxFVEU6IDQ2LFxuICAgICAgICAgICAgRE9XTjogNDAsXG4gICAgICAgICAgICBFTkQ6IDM1LFxuICAgICAgICAgICAgRU5URVI6IDEzLFxuICAgICAgICAgICAgRVNDQVBFOiAyNyxcbiAgICAgICAgICAgIEhPTUU6IDM2LFxuICAgICAgICAgICAgTEVGVDogMzcsXG4gICAgICAgICAgICBQQUdFX0RPV046IDM0LFxuICAgICAgICAgICAgUEFHRV9VUDogMzMsXG4gICAgICAgICAgICBQRVJJT0Q6IDE5MCxcbiAgICAgICAgICAgIFJJR0hUOiAzOSxcbiAgICAgICAgICAgIFNQQUNFOiAzMixcbiAgICAgICAgICAgIFRBQjogOSxcbiAgICAgICAgICAgIFVQOiAzOCxcbiAgICAgICAgICAgIGtleU1hcDoge1xuICAgICAgICAgICAgICAgIDQ4OiBcIjBcIixcbiAgICAgICAgICAgICAgICA0OTogXCIxXCIsXG4gICAgICAgICAgICAgICAgNTA6IFwiMlwiLFxuICAgICAgICAgICAgICAgIDUxOiBcIjNcIixcbiAgICAgICAgICAgICAgICA1MjogXCI0XCIsXG4gICAgICAgICAgICAgICAgNTM6IFwiNVwiLFxuICAgICAgICAgICAgICAgIDU0OiBcIjZcIixcbiAgICAgICAgICAgICAgICA1NTogXCI3XCIsXG4gICAgICAgICAgICAgICAgNTY6IFwiOFwiLFxuICAgICAgICAgICAgICAgIDU3OiBcIjlcIixcbiAgICAgICAgICAgICAgICA1OTogXCI7XCIsXG4gICAgICAgICAgICAgICAgNjU6IFwiYVwiLFxuICAgICAgICAgICAgICAgIDY2OiBcImJcIixcbiAgICAgICAgICAgICAgICA2NzogXCJjXCIsXG4gICAgICAgICAgICAgICAgNjg6IFwiZFwiLFxuICAgICAgICAgICAgICAgIDY5OiBcImVcIixcbiAgICAgICAgICAgICAgICA3MDogXCJmXCIsXG4gICAgICAgICAgICAgICAgNzE6IFwiZ1wiLFxuICAgICAgICAgICAgICAgIDcyOiBcImhcIixcbiAgICAgICAgICAgICAgICA3MzogXCJpXCIsXG4gICAgICAgICAgICAgICAgNzQ6IFwialwiLFxuICAgICAgICAgICAgICAgIDc1OiBcImtcIixcbiAgICAgICAgICAgICAgICA3NjogXCJsXCIsXG4gICAgICAgICAgICAgICAgNzc6IFwibVwiLFxuICAgICAgICAgICAgICAgIDc4OiBcIm5cIixcbiAgICAgICAgICAgICAgICA3OTogXCJvXCIsXG4gICAgICAgICAgICAgICAgODA6IFwicFwiLFxuICAgICAgICAgICAgICAgIDgxOiBcInFcIixcbiAgICAgICAgICAgICAgICA4MjogXCJyXCIsXG4gICAgICAgICAgICAgICAgODM6IFwic1wiLFxuICAgICAgICAgICAgICAgIDg0OiBcInRcIixcbiAgICAgICAgICAgICAgICA4NTogXCJ1XCIsXG4gICAgICAgICAgICAgICAgODY6IFwidlwiLFxuICAgICAgICAgICAgICAgIDg3OiBcIndcIixcbiAgICAgICAgICAgICAgICA4ODogXCJ4XCIsXG4gICAgICAgICAgICAgICAgODk6IFwieVwiLFxuICAgICAgICAgICAgICAgIDkwOiBcInpcIixcbiAgICAgICAgICAgICAgICA5NjogXCIwXCIsXG4gICAgICAgICAgICAgICAgOTc6IFwiMVwiLFxuICAgICAgICAgICAgICAgIDk4OiBcIjJcIixcbiAgICAgICAgICAgICAgICA5OTogXCIzXCIsXG4gICAgICAgICAgICAgICAgMTAwOiBcIjRcIixcbiAgICAgICAgICAgICAgICAxMDE6IFwiNVwiLFxuICAgICAgICAgICAgICAgIDEwMjogXCI2XCIsXG4gICAgICAgICAgICAgICAgMTAzOiBcIjdcIixcbiAgICAgICAgICAgICAgICAxMDQ6IFwiOFwiLFxuICAgICAgICAgICAgICAgIDEwNTogXCI5XCIsXG4gICAgICAgICAgICAgICAgMTkwOiBcIi5cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjIENyZWF0ZXMgYSBuZXcgYWNjZXNzaWJsZSBtZWdhIG1lbnUgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtqcXVlcnl9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIE1lZ2EgTWVudSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnV1aWRQcmVmaXg9YWNjZXNzaWJsZS1tZWdhbWVudV0gLSBQcmVmaXggZm9yIGdlbmVyYXRlZCB1bmlxdWUgaWQgYXR0cmlidXRlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGluZGljYXRlIGFyaWEtb3ducywgYXJpYS1jb250cm9scyBhbmQgYXJpYS1sYWJlbGxlZGJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lbnVDbGFzcz1hY2Nlc3NpYmxlLW1lZ2FtZW51XSAtIENTUyBjbGFzcyB1c2VkIHRvIGRlZmluZSB0aGUgbWVnYW1lbnUgc3R5bGluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50b3BOYXZJdGVtQ2xhc3M9YWNjZXNzaWJsZS1tZWdhbWVudS10b3AtbmF2LWl0ZW1dIC0gQ1NTIGNsYXNzIGZvciBhIHRvcC1sZXZlbCBuYXZpZ2F0aW9uIGl0ZW0gaW4gdGhlIG1lZ2FtZW51XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnBhbmVsQ2xhc3M9YWNjZXNzaWJsZS1tZWdhbWVudS1wYW5lbF0gLSBDU1MgY2xhc3MgZm9yIGEgbWVnYW1lbnUgcGFuZWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGFuZWxHcm91cENsYXNzPWFjY2Vzc2libGUtbWVnYW1lbnUtcGFuZWwtZ3JvdXBdIC0gQ1NTIGNsYXNzIGZvciBhIGdyb3VwIG9mIGl0ZW1zIHdpdGhpbiBhIG1lZ2FtZW51IHBhbmVsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmhvdmVyQ2xhc3M9aG92ZXJdIC0gQ1NTIGNsYXNzIGZvciB0aGUgaG92ZXIgc3RhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZm9jdXNDbGFzcz1mb2N1c10gLSBDU1MgY2xhc3MgZm9yIHRoZSBmb2N1cyBzdGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vcGVuQ2xhc3M9b3Blbl0gLSBDU1MgY2xhc3MgZm9yIHRoZSBvcGVuIHN0YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gQWNjZXNzaWJsZU1lZ2FNZW51KGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICAvLyBtZXJnZSBvcHRpb25hbCBzZXR0aW5ncyBhbmQgZGVmYXVsdHMgaW50byBzZXR0aW5nc1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9kZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgICAgICB0aGlzLl9uYW1lID0gcGx1Z2luTmFtZTtcblxuICAgICAgICB0aGlzLm1vdXNlVGltZW91dElEID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb2N1c1RpbWVvdXRJRCA9IG51bGw7XG4gICAgICAgIHRoaXMubW91c2VGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuanVzdEZvY3VzZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBBY2Nlc3NpYmxlTWVnYU1lbnUucHJvdG90eXBlID0gKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvKiBwcml2YXRlIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gICAgICAgIHZhciB1dWlkID0gMCxcbiAgICAgICAgICAgIGtleWRvd25UaW1lb3V0RHVyYXRpb24gPSAxMDAwLFxuICAgICAgICAgICAga2V5ZG93blNlYXJjaFN0cmluZyA9IFwiXCIsXG4gICAgICAgICAgICBpc1RvdWNoID0gdHlwZW9mIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSA9PT0gXCJmdW5jdGlvblwiICYmICEhd2luZG93Lmhhc093blByb3BlcnR5KFwib250b3VjaHN0YXJ0XCIpLFxuICAgICAgICAgICAgX2dldFBsdWdpbixcbiAgICAgICAgICAgIF9hZGRVbmlxdWVJZCxcbiAgICAgICAgICAgIF90b2dnbGVQYW5lbCxcbiAgICAgICAgICAgIF9jbGlja0hhbmRsZXIsXG4gICAgICAgICAgICBfY2xpY2tPdXRzaWRlSGFuZGxlcixcbiAgICAgICAgICAgIF9ET01BdHRyTW9kaWZpZWRIYW5kbGVyLFxuICAgICAgICAgICAgX2ZvY3VzSW5IYW5kbGVyLFxuICAgICAgICAgICAgX2ZvY3VzT3V0SGFuZGxlcixcbiAgICAgICAgICAgIF9rZXlEb3duSGFuZGxlcixcbiAgICAgICAgICAgIF9tb3VzZURvd25IYW5kbGVyLFxuICAgICAgICAgICAgX21vdXNlT3ZlckhhbmRsZXIsXG4gICAgICAgICAgICBfbW91c2VPdXRIYW5kbGVyLFxuICAgICAgICAgICAgX3RvZ2dsZUV4cGFuZGVkRXZlbnRIYW5kbGVycztcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudX5fZ2V0UGx1Z2luXG4gICAgICAgICAqIEBkZXNjIFJldHVybnMgdGhlIHBhcmVudCBhY2Nlc3NpYmxlTWVnYU1lbnUgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0ge2pRdWVyeX0gZWxlbWVudFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9nZXRQbHVnaW4gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICQoZWxlbWVudCkuY2xvc2VzdCgnOmRhdGEocGx1Z2luXycgKyBwbHVnaW5OYW1lICsgJyknKS5kYXRhKFwicGx1Z2luX1wiICsgcGx1Z2luTmFtZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X2FkZFVuaXF1ZUlkXG4gICAgICAgICAqIEBkZXNjIEFkZHMgYSB1bmlxdWUgaWQgYW5kIGVsZW1lbnQuXG4gICAgICAgICAqIFRoZSBpZCBzdHJpbmcgc3RhcnRzIHdpdGggdGhlXG4gICAgICAgICAqIHN0cmluZyBkZWZpbmVkIGluIHNldHRpbmdzLnV1aWRQcmVmaXguXG4gICAgICAgICAqIEBwYXJhbSB7alF1ZXJ5fSBlbGVtZW50XG4gICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAqIEBpbm5lclxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX2FkZFVuaXF1ZUlkID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcbiAgICAgICAgICAgIGlmICghZWxlbWVudC5hdHRyKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHIoXCJpZFwiLCBzZXR0aW5ncy51dWlkUHJlZml4ICsgXCItXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIFwiLVwiICsgKCsrdXVpZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51fl90b2dnbGVQYW5lbFxuICAgICAgICAgKiBAZGVzYyBUb2dnbGUgdGhlIGRpc3BsYXkgb2YgbWVnYSBtZW51IHBhbmVscyBpbiByZXNwb25zZSB0byBhbiBldmVudC5cbiAgICAgICAgICogVGhlIG9wdGlvbmFsIGJvb2xlYW4gdmFsdWUgJ2hpZGUnIGZvcmNlcyBhbGwgcGFuZWxzIHRvIGhpZGUuXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IGV2ZW50XG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2hpZGVdIEhpZGUgYWxsIG1lZ2EgbWVudSBwYW5lbHMgd2hlbiB0cnVlXG4gICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAqIEBpbm5lclxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX3RvZ2dsZVBhbmVsID0gZnVuY3Rpb24gKGV2ZW50LCBoaWRlKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gJChldmVudC50YXJnZXQpLFxuICAgICAgICAgICAgICAgIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncyxcbiAgICAgICAgICAgICAgICBtZW51ID0gdGhpcy5tZW51LFxuICAgICAgICAgICAgICAgIHRvcGxpID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgc2V0dGluZ3MudG9wTmF2SXRlbUNsYXNzKSxcbiAgICAgICAgICAgICAgICBwYW5lbCA9IHRhcmdldC5oYXNDbGFzcyhzZXR0aW5ncy5wYW5lbENsYXNzKSA/IHRhcmdldCA6IHRhcmdldC5jbG9zZXN0KCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpLFxuICAgICAgICAgICAgICAgIG5ld2ZvY3VzO1xuXG4gICAgICAgICAgICBfdG9nZ2xlRXhwYW5kZWRFdmVudEhhbmRsZXJzLmNhbGwodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEoXCIobWluLXdpZHRoOiA5NzBweClcIikubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIGlmIChoaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcGxpID0gbWVudS5maW5kKCcuJyArIHNldHRpbmdzLnRvcE5hdkl0ZW1DbGFzcyArICc6dmlzaWJsZSAuJyArIHNldHRpbmdzLm9wZW5DbGFzcyArICc6Zmlyc3QnKS5jbG9zZXN0KCcuJyArIHNldHRpbmdzLnRvcE5hdkl0ZW1DbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHRvcGxpLmlzKGV2ZW50LnJlbGF0ZWRUYXJnZXQpIHx8IHRvcGxpLmhhcyhldmVudC5yZWxhdGVkVGFyZ2V0KS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChldmVudC50eXBlID09PSAnbW91c2VvdXQnIHx8IGV2ZW50LnR5cGUgPT09ICdmb2N1c291dCcpICYmIHRvcGxpLmhhcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wbGkuZmluZCgnW2FyaWEtZXhwYW5kZWRdJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHNldHRpbmdzLm9wZW5DbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nICYmIGV2ZW50LmtleUNvZGUgPT09IEtleWJvYXJkLkVTQ0FQRSkgfHwgZXZlbnQudHlwZSA9PT0gJ0RPTUF0dHJNb2RpZmllZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdmb2N1cyA9IHRvcGxpLmZpbmQoJzp0YWJiYWJsZTpmaXJzdCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51LmZpbmQoJ1thcmlhLWV4cGFuZGVkXS4nICsgdGhhdC5zZXR0aW5ncy5wYW5lbENsYXNzKS5vZmYoJ0RPTUF0dHJNb2RpZmllZC5hY2Nlc3NpYmxlLW1lZ2FtZW51Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ZvY3VzLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuanVzdEZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA5OSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9wbGkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51LmZpbmQoJ1thcmlhLWV4cGFuZGVkPXRydWVdJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHNldHRpbmdzLm9wZW5DbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGF0LmZvY3VzVGltZW91dElEKTtcbiAgICAgICAgICAgICAgICAgICAgdG9wbGkuc2libGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ1thcmlhLWV4cGFuZGVkXScpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3Moc2V0dGluZ3Mub3BlbkNsYXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcignLicgKyBzZXR0aW5ncy5wYW5lbENsYXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgdG9wbGkuZmluZCgnW2FyaWEtZXhwYW5kZWRdJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKHNldHRpbmdzLm9wZW5DbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoJy4nICsgc2V0dGluZ3MucGFuZWxDbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlb3ZlcicgJiYgdGFyZ2V0LmlzKCc6dGFiYmFibGUnKSAmJiB0b3BsaS5sZW5ndGggPT09IDEgJiYgcGFuZWwubGVuZ3RoID09PSAwICYmIG1lbnUuaGFzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5qdXN0Rm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZUV4cGFuZGVkRXZlbnRIYW5kbGVycy5jYWxsKHRoYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51fl9jbGlja0hhbmRsZXJcbiAgICAgICAgICogQGRlc2MgSGFuZGxlIGNsaWNrIGV2ZW50IG9uIG1lZ2EgbWVudSBpdGVtXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9jbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLFxuICAgICAgICAgICAgICAgIHRvcGxpID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgdGhpcy5zZXR0aW5ncy50b3BOYXZJdGVtQ2xhc3MpLFxuICAgICAgICAgICAgICAgIHBhbmVsID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgdGhpcy5zZXR0aW5ncy5wYW5lbENsYXNzKTtcbiAgICAgICAgICAgIGlmICh0b3BsaS5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgcGFuZWwubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgICYmIHRvcGxpLmZpbmQoJy4nICsgdGhpcy5zZXR0aW5ncy5wYW5lbENsYXNzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5oYXNDbGFzcyh0aGlzLnNldHRpbmdzLm9wZW5DbGFzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdXN0Rm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmp1c3RGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1c3RGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZVBhbmVsLmNhbGwodGhpcywgZXZlbnQsIHRhcmdldC5oYXNDbGFzcyh0aGlzLnNldHRpbmdzLm9wZW5DbGFzcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51fl9jbGlja091dHNpZGVIYW5kbGVyXG4gICAgICAgICAqIEBkZXNjIEhhbmRsZSBjbGljayBldmVudCBvdXRzaWRlIG9mIGEgdGhlIG1lZ2FtZW51XG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9jbGlja091dHNpZGVIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmNsb3Nlc3QodGhpcy5tZW51KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoaXMsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudX5fRE9NQXR0ck1vZGlmaWVkSGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUgRE9NQXR0ck1vZGlmaWVkIGV2ZW50IG9uIHBhbmVsIHRvIHJlc3BvbmQgdG8gV2luZG93cyA4IE5hcnJhdG9yIEV4cGFuZENvbGxhcHNlIHBhdHRlcm5cbiAgICAgICAgICogQHBhcmFtIHtldmVudH0gRXZlbnQgb2JqZWN0XG4gICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAqIEBpbm5lclxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX0RPTUF0dHJNb2RpZmllZEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50LmF0dHJOYW1lID09PSAnYXJpYS1leHBhbmRlZCdcbiAgICAgICAgICAgICAgICAgICAgJiYgZXZlbnQub3JpZ2luYWxFdmVudC5uZXdWYWx1ZSA9PT0gJ2ZhbHNlJ1xuICAgICAgICAgICAgICAgICAgICAmJiAkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3ModGhpcy5zZXR0aW5ncy5vcGVuQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBfdG9nZ2xlUGFuZWwuY2FsbCh0aGlzLCBldmVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X2ZvY3VzSW5IYW5kbGVyXG4gICAgICAgICAqIEBkZXNjIEhhbmRsZSBmb2N1c2luIGV2ZW50IG9uIG1lZ2EgbWVudSBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge2V2ZW50fSBFdmVudCBvYmplY3RcbiAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICogQGlubmVyXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfZm9jdXNJbkhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvY3VzVGltZW91dElEKTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCksXG4gICAgICAgICAgICAgICAgcGFuZWwgPSB0YXJnZXQuY2xvc2VzdCgnLicgKyB0aGlzLnNldHRpbmdzLnBhbmVsQ2xhc3MpO1xuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuZm9jdXNDbGFzcylcbiAgICAgICAgICAgICAgICAub24oJ2NsaWNrLmFjY2Vzc2libGUtbWVnYW1lbnUnLCAkLnByb3h5KF9jbGlja0hhbmRsZXIsIHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuanVzdEZvY3VzZWQgPSAhdGhpcy5tb3VzZUZvY3VzZWQ7XG4gICAgICAgICAgICB0aGlzLm1vdXNlRm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMucGFuZWxzLm5vdChwYW5lbCkuZmlsdGVyKCcuJyArIHRoaXMuc2V0dGluZ3Mub3BlbkNsYXNzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfdG9nZ2xlUGFuZWwuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X2ZvY3VzT3V0SGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUgZm9jdXNvdXQgZXZlbnQgb24gbWVnYSBtZW51IGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9mb2N1c091dEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuanVzdEZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCksXG4gICAgICAgICAgICAgICAgdG9wbGkgPSB0YXJnZXQuY2xvc2VzdCgnLicgKyB0aGlzLnNldHRpbmdzLnRvcE5hdkl0ZW1DbGFzcyksXG4gICAgICAgICAgICAgICAga2VlcE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyh0aGlzLnNldHRpbmdzLmZvY3VzQ2xhc3MpXG4gICAgICAgICAgICAgICAgLm9mZignY2xpY2suYWNjZXNzaWJsZS1tZWdhbWVudScpO1xuXG4gICAgICAgICAgICBpZiAod2luZG93LmN2b3gpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBDaHJvbWVWb3ggaXMgcnVubmluZy4uLlxuICAgICAgICAgICAgICAgIHRoYXQuZm9jdXNUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmN2b3guQXBpLmdldEN1cnJlbnROb2RlKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wbGkuaGFzKG5vZGUpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBub2RlIGJlaW5nIHZvaWNlZCBpcyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZWdhIG1lbnUsIGNsZWFyVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgcGFuZWwgc3RheXMgb3Blbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhhdC5mb2N1c1RpbWVvdXRJRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuZm9jdXNUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChzY29wZSwgZXZlbnQsIGhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZVBhbmVsLmNhbGwoc2NvcGUsIGV2ZW50LCBoaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyNzUsIHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgMjUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGF0LmZvY3VzVGltZW91dElEID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51fl9rZXlEb3duSGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUga2V5ZG93biBldmVudCBvbiBtZWdhIG1lbnUuXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9rZXlEb3duSGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQWNjZXNzaWJsZU1lZ2FNZW51KSA/IHRoaXMgOiBfZ2V0UGx1Z2luKHRoaXMpLCAvLyBkZXRlcm1pbmUgdGhlIEFjY2Vzc2libGVNZWdhTWVudSBwbHVnaW4gaW5zdGFuY2VcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHRoYXQuc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gJCgkKHRoaXMpLmlzKCcuJyArIHNldHRpbmdzLmhvdmVyQ2xhc3MgKyAnOnRhYmJhYmxlJykgPyB0aGlzIDogZXZlbnQudGFyZ2V0KSwgLy8gaWYgdGhlIGVsZW1lbnQgaXMgaG92ZXJlZCB0aGUgdGFyZ2V0IGlzIHRoaXMsIG90aGVyd2lzZSwgaXRzIHRoZSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBtZW51ID0gdGhhdC5tZW51LFxuICAgICAgICAgICAgICAgIHRvcG5hdml0ZW1zID0gdGhhdC50b3BuYXZpdGVtcyxcbiAgICAgICAgICAgICAgICB0b3BsaSA9IHRhcmdldC5jbG9zZXN0KCcuJyArIHNldHRpbmdzLnRvcE5hdkl0ZW1DbGFzcyksXG4gICAgICAgICAgICAgICAgdGFiYmFibGVzID0gbWVudS5maW5kKCc6dGFiYmFibGUnKSxcbiAgICAgICAgICAgICAgICBwYW5lbCA9IHRhcmdldC5oYXNDbGFzcyhzZXR0aW5ncy5wYW5lbENsYXNzKSA/IHRhcmdldCA6IHRhcmdldC5jbG9zZXN0KCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpLFxuICAgICAgICAgICAgICAgIHBhbmVsR3JvdXBzID0gcGFuZWwuZmluZCgnLicgKyBzZXR0aW5ncy5wYW5lbEdyb3VwQ2xhc3MpLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYW5lbEdyb3VwID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgc2V0dGluZ3MucGFuZWxHcm91cENsYXNzKSxcbiAgICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAgIGtleWNvZGUgPSBldmVudC5rZXlDb2RlIHx8IGV2ZW50LndoaWNoLFxuICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlLFxuICAgICAgICAgICAgICAgIG5ld1N0cmluZyA9IEtleWJvYXJkLmtleU1hcFtldmVudC5rZXlDb2RlXSB8fCAnJyxcbiAgICAgICAgICAgICAgICByZWdleCxcbiAgICAgICAgICAgICAgICBpc1RvcE5hdkl0ZW0gPSAodG9wbGkubGVuZ3RoID09PSAxICYmIHBhbmVsLmxlbmd0aCA9PT0gMCk7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaXMoXCJpbnB1dDpmb2N1cywgc2VsZWN0OmZvY3VzLCB0ZXh0YXJlYTpmb2N1cywgYnV0dG9uOmZvY3VzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGV2ZW50IHRhcmdldCBpcyBhIGZvcm0gZWxlbWVudCB3ZSBzaG91bGQgaGFuZGxlIGtleWRvd24gbm9ybWFsbHlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuaXMoJy4nICsgc2V0dGluZ3MuaG92ZXJDbGFzcyArICc6dGFiYmFibGUnKSkge1xuICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5vZmYoJ2tleWRvd24uYWNjZXNzaWJsZS1tZWdhbWVudScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGtleWNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuRVNDQVBFOlxuICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuRE9XTjpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpc1RvcE5hdkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZVBhbmVsLmNhbGwodGhhdCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICh0b3BsaS5maW5kKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MgKyAnIDp0YWJiYWJsZTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICh0YWJiYWJsZXMuZmlsdGVyKCc6Z3QoJyArIHRhYmJhYmxlcy5pbmRleCh0YXJnZXQpICsgJyk6Zmlyc3QnKS5mb2N1cygpLmxlbmd0aCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiB3aW5kb3cub3BlcmEgJiYgb3BlcmEudG9TdHJpbmcoKSA9PT0gXCJbb2JqZWN0IE9wZXJhXVwiICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmJhYmxlcyA9ICQoJzp0YWJiYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICBpID0gdGFiYmFibGVzLmluZGV4KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKCQoJzp0YWJiYWJsZTpndCgnICsgJCgnOnRhYmJhYmxlJykuaW5kZXgodGFyZ2V0KSArICcpOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuVVA6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNUb3BOYXZJdGVtICYmIHRhcmdldC5oYXNDbGFzcyhzZXR0aW5ncy5vcGVuQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHRvcG5hdml0ZW1zLmZpbHRlcignOmx0KCcgKyB0b3BuYXZpdGVtcy5pbmRleCh0b3BsaSkgKyAnKTpsYXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmNoaWxkcmVuKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAobmV4dC5jaGlsZHJlbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKHNldHRpbmdzLm9wZW5DbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnOnRhYmJhYmxlOmxhc3QnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpID09PSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVG9wTmF2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICh0YWJiYWJsZXMuZmlsdGVyKCc6bHQoJyArIHRhYmJhYmxlcy5pbmRleCh0YXJnZXQpICsgJyk6bGFzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIHdpbmRvdy5vcGVyYSAmJiBvcGVyYS50b1N0cmluZygpID09PSBcIltvYmplY3QgT3BlcmFdXCIgJiYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFiYmFibGVzID0gJCgnOnRhYmJhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0YWJiYWJsZXMuaW5kZXgodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAoJCgnOnRhYmJhYmxlOmx0KCcgKyAkKCc6dGFiYmFibGUnKS5pbmRleCh0YXJnZXQpICsgJyk6Zmlyc3QnKS5mb2N1cygpLmxlbmd0aCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlib2FyZC5SSUdIVDpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpc1RvcE5hdkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAodG9wbmF2aXRlbXMuZmlsdGVyKCc6Z3QoJyArIHRvcG5hdml0ZW1zLmluZGV4KHRvcGxpKSArICcpOmZpcnN0JykuZmluZCgnOnRhYmJhYmxlOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYW5lbEdyb3Vwcy5sZW5ndGggJiYgY3VycmVudFBhbmVsR3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBwYW5lbCBjb250YWlucyBwYW5lbCBncm91cHMsIGFuZCB3ZSBhcmUgYWJsZSB0byBmb2N1cyB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudCBvZiB0aGUgbmV4dCBwYW5lbCBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAocGFuZWxHcm91cHMuZmlsdGVyKCc6Z3QoJyArIHBhbmVsR3JvdXBzLmluZGV4KGN1cnJlbnRQYW5lbEdyb3VwKSArICcpOmZpcnN0JykuZmluZCgnOnRhYmJhYmxlOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAodG9wbGkuZmluZCgnOnRhYmJhYmxlOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlib2FyZC5MRUZUOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzVG9wTmF2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICh0b3BuYXZpdGVtcy5maWx0ZXIoJzpsdCgnICsgdG9wbmF2aXRlbXMuaW5kZXgodG9wbGkpICsgJyk6bGFzdCcpLmZpbmQoJzp0YWJiYWJsZTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuZWxHcm91cHMubGVuZ3RoICYmIGN1cnJlbnRQYW5lbEdyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgcGFuZWwgY29udGFpbnMgcGFuZWwgZ3JvdXBzLCBhbmQgd2UgYXJlIGFibGUgdG8gZm9jdXMgdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnQgb2YgdGhlIHByZXZpb3VzIHBhbmVsIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IChwYW5lbEdyb3Vwcy5maWx0ZXIoJzpsdCgnICsgcGFuZWxHcm91cHMuaW5kZXgoY3VycmVudFBhbmVsR3JvdXApICsgJyk6bGFzdCcpLmZpbmQoJzp0YWJiYWJsZTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKHRvcGxpLmZpbmQoJzp0YWJiYWJsZTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuVEFCOlxuICAgICAgICAgICAgICAgIGkgPSB0YWJiYWJsZXMuaW5kZXgodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgaXNUb3BOYXZJdGVtICYmIHRhcmdldC5oYXNDbGFzcyhzZXR0aW5ncy5vcGVuQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHRvcG5hdml0ZW1zLmZpbHRlcignOmx0KCcgKyB0b3BuYXZpdGVtcy5pbmRleCh0b3BsaSkgKyAnKTpsYXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmNoaWxkcmVuKCcuJyArIHNldHRpbmdzLnBhbmVsQ2xhc3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBuZXh0LmNoaWxkcmVuKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3Moc2V0dGluZ3Mub3BlbkNsYXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoJy4nICsgc2V0dGluZ3MucGFuZWxDbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCc6dGFiYmFibGU6bGFzdCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKHRhYmJhYmxlcy5maWx0ZXIoJzpsdCgnICsgaSArICcpOmxhc3QnKS5mb2N1cygpLmxlbmd0aCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgaSA8IHRhYmJhYmxlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKHRhYmJhYmxlcy5maWx0ZXIoJzpndCgnICsgaSArICcpOmZpcnN0JykuZm9jdXMoKS5sZW5ndGggPT09IDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93Lm9wZXJhICYmIG9wZXJhLnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBPcGVyYV1cIikge1xuICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZXMgPSAkKCc6dGFiYmFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRhYmJhYmxlcy5pbmRleCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gKCQoJzp0YWJiYWJsZTpsdCgnICsgJCgnOnRhYmJhYmxlJykuaW5kZXgodGFyZ2V0KSArICcpOmxhc3QnKS5mb2N1cygpLmxlbmd0aCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICgkKCc6dGFiYmFibGU6Z3QoJyArICQoJzp0YWJiYWJsZScpLmluZGV4KHRhcmdldCkgKyAnKTpmaXJzdCcpLmZvY3VzKCkubGVuZ3RoID09PSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuU1BBQ0U6XG4gICAgICAgICAgICAgICAgaWYgKGlzVG9wTmF2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBfY2xpY2tIYW5kbGVyLmNhbGwodGhhdCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmQuRU5URVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGFscGhhbnVtZXJpYyBmaWx0ZXJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5rZXlkb3duVGltZW91dElEKTtcblxuICAgICAgICAgICAgICAgIGtleWRvd25TZWFyY2hTdHJpbmcgKz0gbmV3U3RyaW5nICE9PSBrZXlkb3duU2VhcmNoU3RyaW5nID8gbmV3U3RyaW5nIDogJyc7XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5ZG93blNlYXJjaFN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMua2V5ZG93blRpbWVvdXRJRCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBrZXlkb3duU2VhcmNoU3RyaW5nID0gJyc7XG4gICAgICAgICAgICAgICAgfSwga2V5ZG93blRpbWVvdXREdXJhdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNUb3BOYXZJdGVtICYmICF0YXJnZXQuaGFzQ2xhc3Moc2V0dGluZ3Mub3BlbkNsYXNzKSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZXMgPSB0YWJiYWJsZXMuZmlsdGVyKCc6bm90KC4nICsgc2V0dGluZ3MucGFuZWxDbGFzcyArICcgOnRhYmJhYmxlKScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmJhYmxlcyA9IHRvcGxpLmZpbmQoJzp0YWJiYWJsZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZXMgPSAkKHRhYmJhYmxlcy5nZXQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmJhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBvID0gdGFiYmFibGVzLmVxKGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoby5pcyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IChrZXlkb3duU2VhcmNoU3RyaW5nLmxlbmd0aCA9PT0gMSkgPyBpICsgMSA6IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyBrZXlkb3duU2VhcmNoU3RyaW5nLnJlcGxhY2UoL1tcXC1cXFtcXF17fSgpKis/LixcXFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyksICdpJyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHRhYmJhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBvID0gdGFiYmFibGVzLmVxKGkpO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICQudHJpbShvLnRleHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KGxhYmVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgby5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhcnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHRhYmJhYmxlcy5lcShpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gJC50cmltKG8udGV4dCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KGxhYmVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoYXQuanVzdEZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudX5fbW91c2VEb3duSGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUgbW91c2Vkb3duIGV2ZW50IG9uIG1lZ2EgbWVudS5cbiAgICAgICAgICogQHBhcmFtIHtldmVudH0gRXZlbnQgb2JqZWN0XG4gICAgICAgICAqIEBtZW1iZXJvZiBhY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICogQGlubmVyXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfbW91c2VEb3duSGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKCQoZXZlbnQudGFyZ2V0KS5pcyh0aGlzLnNldHRpbmdzLnBhbmVsQ2xhc3MpIHx8ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiOmZvY3VzYWJsZVwiKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdXNlRm9jdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1vdXNlVGltZW91dElEID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNUaW1lb3V0SUQpO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X21vdXNlT3ZlckhhbmRsZXJcbiAgICAgICAgICogQGRlc2MgSGFuZGxlIG1vdXNlb3ZlciBldmVudCBvbiBtZWdhIG1lbnUuXG4gICAgICAgICAqIEBwYXJhbSB7ZXZlbnR9IEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAbWVtYmVyb2YgalF1ZXJ5LmZuLmFjY2Vzc2libGVNZWdhTWVudVxuICAgICAgICAgKiBAaW5uZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9tb3VzZU92ZXJIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZVRpbWVvdXRJRCk7XG4gICAgICAgICAgICAkKGV2ZW50LnRhcmdldClcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5ob3ZlckNsYXNzKTtcbiAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaXMoJzp0YWJiYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgJCgnaHRtbCcpLm9uKCdrZXlkb3duLmFjY2Vzc2libGUtbWVnYW1lbnUnLCAkLnByb3h5KF9rZXlEb3duSGFuZGxlciwgZXZlbnQudGFyZ2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnV+X21vdXNlT3V0SGFuZGxlclxuICAgICAgICAgKiBAZGVzYyBIYW5kbGUgbW91c2VvdXQgZXZlbnQgb24gbWVnYSBtZW51LlxuICAgICAgICAgKiBAcGFyYW0ge2V2ZW50fSBFdmVudCBvYmplY3RcbiAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICogQGlubmVyXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfbW91c2VPdXRIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAkKGV2ZW50LnRhcmdldClcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3ModGhhdC5zZXR0aW5ncy5ob3ZlckNsYXNzKTtcblxuICAgICAgICAgICAgdGhhdC5tb3VzZVRpbWVvdXRJRCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90b2dnbGVQYW5lbC5jYWxsKHRoYXQsIGV2ZW50LCB0cnVlKTtcbiAgICAgICAgICAgIH0sIDI1MCk7XG4gICAgICAgICAgICBpZiAoJChldmVudC50YXJnZXQpLmlzKCc6dGFiYmFibGUnKSkge1xuICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5vZmYoJ2tleWRvd24uYWNjZXNzaWJsZS1tZWdhbWVudScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIF90b2dnbGVFeHBhbmRlZEV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbiAoaGlkZSkge1xuICAgICAgICAgICAgdmFyIG1lbnUgPSB0aGlzLm1lbnU7XG4gICAgICAgICAgICBpZiAoaGlkZSkge1xuICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5vZmYoJ21vdXNldXAub3V0c2lkZS1hY2Nlc3NpYmxlLW1lZ2FtZW51LCB0b3VjaGVuZC5vdXRzaWRlLWFjY2Vzc2libGUtbWVnYW1lbnUsIG1zcG9pbnRlcnVwLm91dHNpZGUtYWNjZXNzaWJsZS1tZWdhbWVudSwgIHBvaW50ZXJ1cC5vdXRzaWRlLWFjY2Vzc2libGUtbWVnYW1lbnUnKTtcblxuICAgICAgICAgICAgICAgIG1lbnUuZmluZCgnW2FyaWEtZXhwYW5kZWRdLicgKyB0aGlzLnNldHRpbmdzLnBhbmVsQ2xhc3MpLm9mZignRE9NQXR0ck1vZGlmaWVkLmFjY2Vzc2libGUtbWVnYW1lbnUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCgnaHRtbCcpLm9uKCdtb3VzZXVwLm91dHNpZGUtYWNjZXNzaWJsZS1tZWdhbWVudSwgdG91Y2hlbmQub3V0c2lkZS1hY2Nlc3NpYmxlLW1lZ2FtZW51LCBtc3BvaW50ZXJ1cC5vdXRzaWRlLWFjY2Vzc2libGUtbWVnYW1lbnUsICBwb2ludGVydXAub3V0c2lkZS1hY2Nlc3NpYmxlLW1lZ2FtZW51JywgJC5wcm94eShfY2xpY2tPdXRzaWRlSGFuZGxlciwgdGhpcykpO1xuXG4gICAgICAgICAgICAgICAgLyogTmFycmF0b3IgaW4gV2luZG93cyA4IGF1dG9tYXRpY2FsbHkgdG9nZ2xlcyB0aGUgYXJpYS1leHBhbmRlZCBwcm9wZXJ0eSBvbiBkb3VibGUgdGFwIG9yIGNsaWNrLlxuICAgICAgICAgICAgICAgICAgIFRvIHJlc3BvbmQgdG8gdGhlIGNoYW5nZSB0byBjb2xsYXBzZSB0aGUgcGFuZWwsIHdlIG11c3QgYWRkIGEgbGlzdGVuZXIgZm9yIGEgRE9NQXR0ck1vZGlmaWVkIGV2ZW50LiAqL1xuICAgICAgICAgICAgICAgIG1lbnUuZmluZCgnW2FyaWEtZXhwYW5kZWQ9dHJ1ZV0uJyArIHRoaXMuc2V0dGluZ3MucGFuZWxDbGFzcykub24oJ0RPTUF0dHJNb2RpZmllZC5hY2Nlc3NpYmxlLW1lZ2FtZW51JywgJC5wcm94eShfRE9NQXR0ck1vZGlmaWVkSGFuZGxlciwgdGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qIHB1YmxpYyBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBBY2Nlc3NpYmxlTWVnYU1lbnUsXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQGxlbmRzIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICAgICAqIEBkZXNjIEluaXRpYWxpemVzIGFuIGluc3RhbmNlIG9mIHRoZSBhY2Nlc3NpYmxlTWVnYU1lbnUgcGx1Z2luc1xuICAgICAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgbmF2ID0gJCh0aGlzLmVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICBtZW51ID0gbmF2LmNoaWxkcmVuKCd1bCcpLmZpcnN0KCksXG4gICAgICAgICAgICAgICAgICAgIHRvcG5hdml0ZW1zID0gbWVudS5jaGlsZHJlbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQoc2V0dGluZ3MsIG5hdiwgbWVudSwgdG9wbmF2aXRlbXMpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKHNldHRpbmdzLCBuYXYsIG1lbnUsIHRvcG5hdml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGNvbnN0IENMQVNTX1BSSU1BUllfVE9PTFNfTElTVCA9ICdwbi1saW5rLS10b29scyc7XG4gICAgICAgICAgICAgICAgY29uc3QgQ0xBU1NfUFJJTUFSWV9VVElMSVRZX0xJU1QgPSAncG4tbGluay0tdXRpbGl0eSc7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICAgICAgICAgIHRoaXMubWVudSA9IG1lbnU7XG4gICAgICAgICAgICAgICAgdGhpcy50b3BuYXZpdGVtcyA9IHRvcG5hdml0ZW1zO1xuXG4gICAgICAgICAgICAgICAgbmF2LmF0dHIoXCJyb2xlXCIsIFwibmF2aWdhdGlvblwiKTtcbiAgICAgICAgICAgICAgICBtZW51LmFkZENsYXNzKHNldHRpbmdzLm1lbnVDbGFzcyk7XG4gICAgICAgICAgICAgICAgdG9wbmF2aXRlbXMuZWFjaChmdW5jdGlvbiAoaSwgdG9wbmF2aXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9wbmF2aXRlbWxpbmssIHRvcG5hdml0ZW1wYW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdG9wbmF2aXRlbSA9ICQodG9wbmF2aXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHRvcG5hdml0ZW0uYWRkQ2xhc3Moc2V0dGluZ3MudG9wTmF2SXRlbUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgdG9wbmF2aXRlbWxpbmsgPSB0b3BuYXZpdGVtLmZpbmQoXCI6dGFiYmFibGU6Zmlyc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHRvcG5hdml0ZW1wYW5lbCA9IHRvcG5hdml0ZW0uY2hpbGRyZW4oXCI6bm90KDp0YWJiYWJsZSk6bGFzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgX2FkZFVuaXF1ZUlkLmNhbGwodGhhdCwgdG9wbmF2aXRlbWxpbmspO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9wbmF2aXRlbXBhbmVsLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2FkZFVuaXF1ZUlkLmNhbGwodGhhdCwgdG9wbmF2aXRlbXBhbmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9wbmF2aXRlbXBhbmVsLmhhc0NsYXNzKCdpcy1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EVE4tMTU2NTogVG9vbHMgYW5kIFV0aWxpdHkgaGFzIG5vIGNvbGxhcHNlL2V4cGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0b3BuYXZpdGVtbGluay5oYXNDbGFzcyhDTEFTU19QUklNQVJZX1RPT0xTX0xJU1QpIHx8IHRvcG5hdml0ZW1saW5rLmhhc0NsYXNzKENMQVNTX1BSSU1BUllfVVRJTElUWV9MSVNUKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BuYXZpdGVtbGluay5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCBhcmlhLWV4cGFuZGVkIGFuZCBhcmlhLWhpZGRlbiBmb3IgcGFuZWwgdGhhdCBpcyBub3Qgb3Blbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICdpcy1vcGVuJyBhdHRyaWJ1dGUgaXMgc2V0IG9uIHRoZSBhZW0gc2lnaHRseSB0ZW1wbGF0ZSAocHJpbWFyeS1uYXYuaHRtbClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gaWYgd2UncmUgb24gYSBwYWdlIHRoYXQgaXMgdW5kZXIgQnVzaW5lc3MsIHRoZW4gZG9tIGZvciBidXNpbmVzcyBwYW5lbCBpcyAnaXMtb3BlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9wbmF2aXRlbXBhbmVsLmhhc0NsYXNzKCdpcy1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wbmF2aXRlbXBhbmVsLmF0dHIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyb2xlXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhzZXR0aW5ncy5wYW5lbENsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wYW5lbHMgPSBtZW51LmZpbmQoXCIuXCIgKyBzZXR0aW5ncy5wYW5lbENsYXNzKTtcblxuICAgICAgICAgICAgICAgIG1lbnUub24oXCJmb2N1c2luLmFjY2Vzc2libGUtbWVnYW1lbnVcIiwgXCI6Zm9jdXNhYmxlLCAuXCIgKyBzZXR0aW5ncy5wYW5lbENsYXNzLCAkLnByb3h5KF9mb2N1c0luSGFuZGxlciwgdGhpcykpXG4gICAgICAgICAgICAgICAgICAgIC5vbihcImZvY3Vzb3V0LmFjY2Vzc2libGUtbWVnYW1lbnVcIiwgXCI6Zm9jdXNhYmxlLCAuXCIgKyBzZXR0aW5ncy5wYW5lbENsYXNzLCAkLnByb3h5KF9mb2N1c091dEhhbmRsZXIsIHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICAub24oXCJrZXlkb3duLmFjY2Vzc2libGUtbWVnYW1lbnVcIiwgJC5wcm94eShfa2V5RG93bkhhbmRsZXIsIHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICAub24oXCJtb3VzZW92ZXIuYWNjZXNzaWJsZS1tZWdhbWVudVwiLCAkLnByb3h5KF9tb3VzZU92ZXJIYW5kbGVyLCB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uKFwibW91c2VvdXQuYWNjZXNzaWJsZS1tZWdhbWVudVwiLCAkLnByb3h5KF9tb3VzZU91dEhhbmRsZXIsIHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICAub24oXCJtb3VzZWRvd24uYWNjZXNzaWJsZS1tZWdhbWVudVwiLCAkLnByb3h5KF9tb3VzZURvd25IYW5kbGVyLCB0aGlzKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgICAgICBtZW51Lm9uKFwidG91Y2hzdGFydC5hY2Nlc3NpYmxlLW1lZ2FtZW51XCIsICAkLnByb3h5KF9jbGlja0hhbmRsZXIsIHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtZW51LmZpbmQoXCJoclwiKS5hdHRyKFwicm9sZVwiLCBcInNlcGFyYXRvclwiKTtcblxuICAgICAgICAgICAgICAgIGlmICgkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmNsb3Nlc3QobWVudSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRyaWdnZXIoXCJmb2N1c2luLmFjY2Vzc2libGUtbWVnYW1lbnVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAZGVzYyBHZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAqIEBleGFtcGxlICQoc2VsZWN0b3IpLmFjY2Vzc2libGVNZWdhTWVudShcImdldERlZmF1bHRzXCIpO1xuICAgICAgICAgICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXREZWZhdWx0czogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0cztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQGRlc2MgR2V0IGFueSBvcHRpb24gc2V0IHRvIHBsdWdpbiB1c2luZyBpdHMgbmFtZSAoYXMgc3RyaW5nKVxuICAgICAgICAgICAgICogQGV4YW1wbGUgJChzZWxlY3RvcikuYWNjZXNzaWJsZU1lZ2FNZW51KFwiZ2V0T3B0aW9uXCIsIHNvbWVfb3B0aW9uKTtcbiAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRcbiAgICAgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0T3B0aW9uOiBmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3Nbb3B0XTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQGRlc2MgR2V0IGFsbCBvcHRpb25zXG4gICAgICAgICAgICAgKiBAZXhhbXBsZSAkKHNlbGVjdG9yKS5hY2Nlc3NpYmxlTWVnYU1lbnUoXCJnZXRBbGxPcHRpb25zXCIpO1xuICAgICAgICAgICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIGpRdWVyeS5mbi5hY2Nlc3NpYmxlTWVnYU1lbnVcbiAgICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXRBbGxPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBkZXNjIFNldCBvcHRpb25cbiAgICAgICAgICAgICAqIEBleGFtcGxlICQoc2VsZWN0b3IpLmFjY2Vzc2libGVNZWdhTWVudShcInNldE9wdGlvblwiLCBcIm9wdGlvbl9uYW1lXCIsICBcIm9wdGlvbl92YWx1ZVwiLCAgcmVpbml0aWFsaXplKTtcbiAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHQgLSBPcHRpb24gbmFtZVxuICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIE9wdGlvbiB2YWx1ZVxuICAgICAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbcmVpbml0aWFsaXplXSAtIGJvb2xlYW4gdG8gcmUtaW5pdGlhbGl6ZSB0aGUgbWVudS5cbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBqUXVlcnkuZm4uYWNjZXNzaWJsZU1lZ2FNZW51XG4gICAgICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0T3B0aW9uOiBmdW5jdGlvbiAob3B0LCB2YWx1ZSwgcmVpbml0aWFsaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1tvcHRdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlaW5pdGlhbGl6ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSgpKTtcblxuXG4gICAgJC5mbltwbHVnaW5OYW1lXSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCEkLmRhdGEodGhpcywgXCJwbHVnaW5fXCIgKyBwbHVnaW5OYW1lKSkge1xuICAgICAgICAgICAgICAgICQuZGF0YSh0aGlzLCBcInBsdWdpbl9cIiArIHBsdWdpbk5hbWUsIG5ldyAkLmZuW3BsdWdpbk5hbWVdLkFjY2Vzc2libGVNZWdhTWVudSh0aGlzLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkLmZuW3BsdWdpbk5hbWVdLkFjY2Vzc2libGVNZWdhTWVudSA9IEFjY2Vzc2libGVNZWdhTWVudTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmlzaWJsZShlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAkLmV4cHIuZmlsdGVycy52aXNpYmxlKGVsZW1lbnQpICYmICEkKGVsZW1lbnQpLnBhcmVudHMoKS5hZGRCYWNrKCkuZmlsdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAkLmNzcyh0aGlzLCBcInZpc2liaWxpdHlcIikgPT09IFwiaGlkZGVuXCI7XG4gICAgICAgIH0pLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvY3VzYWJsZShlbGVtZW50LCBpc1RhYkluZGV4Tm90TmFOKSB7XG4gICAgICAgIHZhciBtYXAsIG1hcE5hbWUsIGltZyxcbiAgICAgICAgICAgIG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXCJhcmVhXCIgPT09IG5vZGVOYW1lKSB7XG4gICAgICAgICAgICBtYXAgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICBtYXBOYW1lID0gbWFwLm5hbWU7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuaHJlZiB8fCAhbWFwTmFtZSB8fCBtYXAubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJtYXBcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGltZyA9ICQoXCJpbWdbdXNlbWFwPSNcIiArIG1hcE5hbWUgKyBcIl1cIilbMF07XG4gICAgICAgICAgICByZXR1cm4gISFpbWcgJiYgdmlzaWJsZShpbWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KG5vZGVOYW1lKSA/ICFlbGVtZW50LmRpc2FibGVkIDpcbiAgICAgICAgICAgICAgICBcImFcIiA9PT0gbm9kZU5hbWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ocmVmIHx8IGlzVGFiSW5kZXhOb3ROYU4gOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWJJbmRleE5vdE5hTikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBhbmNlc3RvcnMgbXVzdCBiZSB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZShlbGVtZW50KTtcbiAgICB9XG5cbiAgICAkLmV4dGVuZCgkLmV4cHJbXCI6XCJdLCB7XG4gICAgICAgIGRhdGE6ICQuZXhwci5jcmVhdGVQc2V1ZG8gPyAkLmV4cHIuY3JlYXRlUHNldWRvKGZ1bmN0aW9uIChkYXRhTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhJC5kYXRhKGVsZW0sIGRhdGFOYW1lKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pIDogLy8gc3VwcG9ydDogalF1ZXJ5IDwxLjhcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZWxlbSwgaSwgbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhJC5kYXRhKGVsZW0sIG1hdGNoWzNdKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgIGZvY3VzYWJsZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGUoZWxlbWVudCwgIWlzTmFOKCQuYXR0cihlbGVtZW50LCBcInRhYmluZGV4XCIpKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdGFiYmFibGU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICB2YXIgdGFiSW5kZXggPSAkLmF0dHIoZWxlbWVudCwgXCJ0YWJpbmRleFwiKSxcbiAgICAgICAgICAgICAgICBpc1RhYkluZGV4TmFOID0gaXNOYU4odGFiSW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIChpc1RhYkluZGV4TmFOIHx8IHRhYkluZGV4ID49IDApICYmIGZvY3VzYWJsZShlbGVtZW50LCAhaXNUYWJJbmRleE5hTik7XG4gICAgICAgIH1cbiAgICB9KTtcbn0oalF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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
//# sourceURL=webpack-internal:///115
#2 JavaScript::Eval (size: 2240) - SHA256: e6803275d0a4a846a6a6a91f23a30948ee7553f586af08007b45122c046c291e
$(document).ready(function() {
    var stickyOffset = 200;
    var $sticky = $('.fbtn__button');

    if ($('.fbtn__button').length) {
        $(window).on('scroll', function() {
            var scroll = $(window).scrollTop();

            if (scroll > stickyOffset) {
                $sticky.addClass('fbtn__button--show');
            }

            if (scroll < stickyOffset) {
                $sticky.removeClass('fbtn__button--show');
            }
        });
    }
}); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5hcHBzL3NyYy9tYWluL2NvbnRlbnQvamNyX3Jvb3QvYXBwcy9nbG9iYWwvY29tcG9uZW50cy9mZWVkYmFjay1idXR0b24vY2xpZW50bGliL3NyYy9qcy9mZWVkYmFjay1idXR0b24uanM/ODYyYyJdLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsInN0aWNreU9mZnNldCIsIiRzdGlja3kiLCJsZW5ndGgiLCJ3aW5kb3ciLCJvbiIsInNjcm9sbCIsInNjcm9sbFRvcCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiXSwibWFwcGluZ3MiOiJBQUFhOztBQUNiQSxDQUFDLENBQUNDLFFBQUQsQ0FBRCxDQUFZQyxLQUFaLENBQWtCLFlBQU07RUFDdEIsSUFBSUMsWUFBWSxHQUFHLEdBQW5CO0VBQ0EsSUFBSUMsT0FBTyxHQUFHSixDQUFDLENBQUMsZUFBRCxDQUFmOztFQUVBLElBQUlBLENBQUMsQ0FBQyxlQUFELENBQUQsQ0FBbUJLLE1BQXZCLEVBQStCO0lBQzdCTCxDQUFDLENBQUNNLE1BQUQsQ0FBRCxDQUFVQyxFQUFWLENBQWEsUUFBYixFQUF1QixZQUFXO01BQ2hDLElBQUlDLE1BQU0sR0FBR1IsQ0FBQyxDQUFDTSxNQUFELENBQUQsQ0FBVUcsU0FBVixFQUFiOztNQUNBLElBQUlELE1BQU0sR0FBR0wsWUFBYixFQUEyQjtRQUN6QkMsT0FBTyxDQUFDTSxRQUFSLENBQWlCLG9CQUFqQjtNQUNEOztNQUNELElBQUlGLE1BQU0sR0FBR0wsWUFBYixFQUEyQjtRQUN6QkMsT0FBTyxDQUFDTyxXQUFSLENBQW9CLG9CQUFwQjtNQUNEO0lBQ0YsQ0FSRDtFQVNEO0FBQ0YsQ0FmRCIsImZpbGUiOiIzNjQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBsZXQgc3RpY2t5T2Zmc2V0ID0gMjAwO1xuICBsZXQgJHN0aWNreSA9ICQoJy5mYnRuX19idXR0b24nKTtcblxuICBpZiAoJCgnLmZidG5fX2J1dHRvbicpLmxlbmd0aCkge1xuICAgICQod2luZG93KS5vbignc2Nyb2xsJywgZnVuY3Rpb24oKSB7XG4gICAgICBsZXQgc2Nyb2xsID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpO1xuICAgICAgaWYgKHNjcm9sbCA+IHN0aWNreU9mZnNldCkge1xuICAgICAgICAkc3RpY2t5LmFkZENsYXNzKCdmYnRuX19idXR0b24tLXNob3cnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzY3JvbGwgPCBzdGlja3lPZmZzZXQpIHtcbiAgICAgICAgJHN0aWNreS5yZW1vdmVDbGFzcygnZmJ0bl9fYnV0dG9uLS1zaG93Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
//# sourceURL=webpack-internal:///3645
#3 JavaScript::Eval (size: 122108) - SHA256: a970b8b0a7040710d1d790c4e68b59bc2bf2aebdf55fb02e93b8389283518968
var __WEBPACK_AMD_DEFINE_RESULT__;
/*! picturefill - v3.0.2 - 2016-02-12
 * https://scottjehl.github.io/picturefill/
 * Copyright (c) 2016 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT
 */
/*! Gecko-Picture - v1.0
 * https://github.com/scottjehl/picturefill/tree/3.0/src/plugins/gecko-picture
 * Firefox's early picture implementation (prior to FF41) is static and does
 * not react to viewport changes. This tiny module fixes this.
 */
(function(window) {
    /*jshint eqnull:true */
    var ua = navigator.userAgent;

    if (window.HTMLPictureElement && ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 < 45)) {
        addEventListener("resize", (function() {
            var timer;

            var dummySrc = document.createElement("source");

            var fixRespimg = function(img) {
                var source, sizes;
                var picture = img.parentNode;

                if (picture.nodeName.toUpperCase() === "PICTURE") {
                    source = dummySrc.cloneNode();

                    picture.insertBefore(source, picture.firstElementChild);
                    setTimeout(function() {
                        picture.removeChild(source);
                    });
                } else if (!img._pfLastSize || img.offsetWidth > img._pfLastSize) {
                    img._pfLastSize = img.offsetWidth;
                    sizes = img.sizes;
                    img.sizes += ",100vw";
                    setTimeout(function() {
                        img.sizes = sizes;
                    });
                }
            };

            var findPictureImgs = function() {
                var i;
                var imgs = document.querySelectorAll("picture > img, img[srcset][sizes]");
                for (i = 0; i < imgs.length; i++) {
                    fixRespimg(imgs[i]);
                }
            };
            var onResize = function() {
                clearTimeout(timer);
                timer = setTimeout(findPictureImgs, 99);
            };
            var mq = window.matchMedia && matchMedia("(orientation: landscape)");
            var init = function() {
                onResize();

                if (mq && mq.addListener) {
                    mq.addListener(onResize);
                }
            };

            dummySrc.srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";

            if (/^[c|i]|d$/.test(document.readyState || "")) {
                init();
            } else {
                document.addEventListener("DOMContentLoaded", init);
            }

            return onResize;
        })());
    }
})(window);

/*! Picturefill - v3.0.2
 * http://scottjehl.github.io/picturefill
 * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt;
 *  License: MIT
 */

(function(window, document, undefined) {
    // Enable strict mode
    "use strict";

    // HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround)
    document.createElement("picture");

    var warn, eminpx, alwaysCheckWDescriptor, evalId;
    // local object for method references and testing exposure
    var pf = {};
    var isSupportTestReady = false;
    var noop = function() {};
    var image = document.createElement("img");
    var getImgAttr = image.getAttribute;
    var setImgAttr = image.setAttribute;
    var removeImgAttr = image.removeAttribute;
    var docElem = document.documentElement;
    var types = {};
    var cfg = {
        //resource selection:
        algorithm: ""
    };
    var srcAttr = "data-pfsrc";
    var srcsetAttr = srcAttr + "set";
    // ua sniffing is done for undetectable img loading features,
    // to do some non crucial perf optimizations
    var ua = navigator.userAgent;
    var supportAbort = (/rident/).test(ua) || ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 > 35);
    var curSrcProp = "currentSrc";
    var regWDesc = /\s+\+?\d+(e\d+)?w/;
    var regSize = /(\([^)]+\))?\s*(.+)/;
    var setOptions = window.picturefillCFG;
    /**
     * Shortcut property for https://w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests )
     */
    // baseStyle also used by getEmValue (i.e.: width: 1em is important)
    var baseStyle = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)";
    var fsCss = "font-size:100%!important;";
    var isVwDirty = true;

    var cssCache = {};
    var sizeLengthCache = {};
    var DPR = window.devicePixelRatio;
    var units = {
        px: 1,
        "in": 96
    };
    var anchor = document.createElement("a");
    /**
     * alreadyRun flag used for setOptions. is it true setOptions will reevaluate
     * @type {boolean}
     */
    var alreadyRun = false;

    // Reusable, non-"g" Regexes

    // (Don't use \s, to avoid matching non-breaking space.)
    var regexLeadingSpaces = /^[ \t\n\r\u000c]+/,
        regexLeadingCommasOrSpaces = /^[, \t\n\r\u000c]+/,
        regexLeadingNotSpaces = /^[^ \t\n\r\u000c]+/,
        regexTrailingCommas = /[,]+$/,
        regexNonNegativeInteger = /^\d+$/,

        // ( Positive or negative or unsigned integers or decimals, without or without exponents.
        // Must include at least one digit.
        // According to spec tests any decimal point must be followed by a digit.
        // No leading plus sign is allowed.)
        // https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number
        regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;

    var on = function(obj, evt, fn, capture) {
        if (obj.addEventListener) {
            obj.addEventListener(evt, fn, capture || false);
        } else if (obj.attachEvent) {
            obj.attachEvent("on" + evt, fn);
        }
    };

    /**
     * simple memoize function:
     */

    var memoize = function(fn) {
        var cache = {};
        return function(input) {
            if (!(input in cache)) {
                cache[input] = fn(input);
            }
            return cache[input];
        };
    };

    // UTILITY FUNCTIONS

    // Manual is faster than RegEx
    // http://jsperf.com/whitespace-character/5
    function isSpace(c) {
        return (c === "\u0020" || // space
            c === "\u0009" || // horizontal tab
            c === "\u000A" || // new line
            c === "\u000C" || // form feed
            c === "\u000D"); // carriage return
    }

    /**
     * gets a mediaquery and returns a boolean or gets a css length and returns a number
     * @param css mediaqueries or css length
     * @returns {boolean|number}
     *
     * based on: https://gist.github.com/jonathantneal/db4f77009b155f083738
     */
    var evalCSS = (function() {

        var regLength = /^([\d\.]+)(em|vw|px)$/;
        var replace = function() {
            var args = arguments,
                index = 0,
                string = args[0];
            while (++index in args) {
                string = string.replace(args[index], args[++index]);
            }
            return string;
        };

        var buildStr = memoize(function(css) {

            return "return " + replace((css || "").toLowerCase(),
                // interpret `and`
                /\band\b/g, "&&",

                // interpret `,`
                /,/g, "||",

                // interpret `min-` as >=
                /min-([a-z-\s]+):/g, "e.$1>=",

                // interpret `max-` as <=
                /max-([a-z-\s]+):/g, "e.$1<=",

                //calc value
                /calc([^)]+)/g, "($1)",

                // interpret css values
                /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)",
                //make eval less evil
                /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/ig, ""
            ) + ";";
        });

        return function(css, length) {
            var parsedLength;
            if (!(css in cssCache)) {
                cssCache[css] = false;
                if (length && (parsedLength = css.match(regLength))) {
                    cssCache[css] = parsedLength[1] * units[parsedLength[2]];
                } else {
                    /*jshint evil:true */
                    try {
                        cssCache[css] = new Function("e", buildStr(css))(units);
                    } catch (e) {}
                    /*jshint evil:false */
                }
            }
            return cssCache[css];
        };
    })();

    var setResolution = function(candidate, sizesattr) {
        if (candidate.w) { // h = means height: || descriptor.type === 'h' do not handle yet...
            candidate.cWidth = pf.calcListLength(sizesattr || "100vw");
            candidate.res = candidate.w / candidate.cWidth;
        } else {
            candidate.res = candidate.d;
        }
        return candidate;
    };

    /**
     *
     * @param opt
     */
    var picturefill = function(opt) {

        if (!isSupportTestReady) {
            return;
        }

        var elements, i, plen;

        var options = opt || {};

        if (options.elements && options.elements.nodeType === 1) {
            if (options.elements.nodeName.toUpperCase() === "IMG") {
                options.elements = [options.elements];
            } else {
                options.context = options.elements;
                options.elements = null;
            }
        }

        elements = options.elements || pf.qsa((options.context || document), (options.reevaluate || options.reselect) ? pf.sel : pf.selShort);

        if ((plen = elements.length)) {

            pf.setupRun(options);
            alreadyRun = true;

            // Loop through all elements
            for (i = 0; i < plen; i++) {
                pf.fillImg(elements[i], options);
            }

            pf.teardownRun(options);
        }
    };

    /**
     * outputs a warning for the developer
     * @param {message}
     * @type {Function}
     */
    warn = (window.console && console.warn) ?
        function(message) {
            console.warn(message);
        } :
        noop;

    if (!(curSrcProp in image)) {
        curSrcProp = "src";
    }

    // Add support for standard mime types.
    types["image/jpeg"] = true;
    types["image/gif"] = true;
    types["image/png"] = true;

    function detectTypeSupport(type, typeUri) {
        // based on Modernizr's lossless img-webp test
        // note: asynchronous
        var image = new window.Image();
        image.onerror = function() {
            types[type] = false;
            picturefill();
        };
        image.onload = function() {
            types[type] = image.width === 1;
            picturefill();
        };
        image.src = typeUri;
        return "pending";
    }

    // test svg support
    types["image/svg+xml"] = document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");

    /**
     * updates the internal vW property with the current viewport width in px
     */
    function updateMetrics() {

        isVwDirty = false;
        DPR = window.devicePixelRatio;
        cssCache = {};
        sizeLengthCache = {};

        pf.DPR = DPR || 1;

        units.width = Math.max(window.innerWidth || 0, docElem.clientWidth);
        units.height = Math.max(window.innerHeight || 0, docElem.clientHeight);

        units.vw = units.width / 100;
        units.vh = units.height / 100;

        evalId = [units.height, units.width, DPR].join("-");

        units.em = pf.getEmValue();
        units.rem = units.em;
    }

    function chooseLowRes(lowerValue, higherValue, dprValue, isCached) {
        var bonusFactor, tooMuch, bonus, meanDensity;

        //experimental
        if (cfg.algorithm === "saveData") {
            if (lowerValue > 2.7) {
                meanDensity = dprValue + 1;
            } else {
                tooMuch = higherValue - dprValue;
                bonusFactor = Math.pow(lowerValue - 0.6, 1.5);

                bonus = tooMuch * bonusFactor;

                if (isCached) {
                    bonus += 0.1 * bonusFactor;
                }

                meanDensity = lowerValue + bonus;
            }
        } else {
            meanDensity = (dprValue > 1) ?
                Math.sqrt(lowerValue * higherValue) :
                lowerValue;
        }

        return meanDensity > dprValue;
    }

    function applyBestCandidate(img) {
        var srcSetCandidates;
        var matchingSet = pf.getSet(img);
        var evaluated = false;
        if (matchingSet !== "pending") {
            evaluated = evalId;
            if (matchingSet) {
                srcSetCandidates = pf.setRes(matchingSet);
                pf.applySetCandidate(srcSetCandidates, img);
            }
        }
        img[pf.ns].evaled = evaluated;
    }

    function ascendingSort(a, b) {
        return a.res - b.res;
    }

    function setSrcToCur(img, src, set) {
        var candidate;
        if (!set && src) {
            set = img[pf.ns].sets;
            set = set && set[set.length - 1];
        }

        candidate = getCandidateForSrc(src, set);

        if (candidate) {
            src = pf.makeUrl(src);
            img[pf.ns].curSrc = src;
            img[pf.ns].curCan = candidate;

            if (!candidate.res) {
                setResolution(candidate, candidate.set.sizes);
            }
        }
        return candidate;
    }

    function getCandidateForSrc(src, set) {
        var i, candidate, candidates;
        if (src && set) {
            candidates = pf.parseSet(set);
            src = pf.makeUrl(src);
            for (i = 0; i < candidates.length; i++) {
                if (src === pf.makeUrl(candidates[i].url)) {
                    candidate = candidates[i];
                    break;
                }
            }
        }
        return candidate;
    }

    function getAllSourceElements(picture, candidates) {
        var i, len, source, srcset;

        // SPEC mismatch intended for size and perf:
        // actually only source elements preceding the img should be used
        // also note: don't use qsa here, because IE8 sometimes doesn't like source as the key part in a selector
        var sources = picture.getElementsByTagName("source");

        for (i = 0, len = sources.length; i < len; i++) {
            source = sources[i];
            source[pf.ns] = true;
            srcset = source.getAttribute("srcset");

            // if source does not have a srcset attribute, skip
            if (srcset) {
                candidates.push({
                    srcset: srcset,
                    media: source.getAttribute("media"),
                    type: source.getAttribute("type"),
                    sizes: source.getAttribute("sizes")
                });
            }
        }
    }

    /**
     * Srcset Parser
     * By Alex Bell |  MIT License
     *
     * @returns Array [{url: _, d: _, w: _, h:_, set:_(????)}, ...]
     *
     * Based super duper closely on the reference algorithm at:
     * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute
     */

    // 1. Let input be the value passed to this algorithm.
    // (TO-DO : Explain what "set" argument is here. Maybe choose a more
    // descriptive & more searchable name.  Since passing the "set" in really has
    // nothing to do with parsing proper, I would prefer this assignment eventually
    // go in an external fn.)
    function parseSrcset(input, set) {

        function collectCharacters(regEx) {
            var chars,
                match = regEx.exec(input.substring(pos));
            if (match) {
                chars = match[0];
                pos += chars.length;
                return chars;
            }
        }

        var inputLength = input.length,
            url,
            descriptors,
            currentDescriptor,
            state,
            c,

            // 2. Let position be a pointer into input, initially pointing at the start
            //    of the string.
            pos = 0,

            // 3. Let candidates be an initially empty source set.
            candidates = [];

        /**
         * Adds descriptor properties to a candidate, pushes to the candidates array
         * @return undefined
         */
        // (Declared outside of the while loop so that it's only created once.
        // (This fn is defined before it is used, in order to pass JSHINT.
        // Unfortunately this breaks the sequencing of the spec comments. :/ )
        function parseDescriptors() {

                // 9. Descriptor parser: Let error be no.
                var pError = false,

                    // 10. Let width be absent.
                    // 11. Let density be absent.
                    // 12. Let future-compat-h be absent. (We're implementing it now as h)
                    w, d, h, i,
                    candidate = {},
                    desc, lastChar, value, intVal, floatVal;

                // 13. For each descriptor in descriptors, run the appropriate set of steps
                // from the following list:
                for (i = 0; i < descriptors.length; i++) {
                    desc = descriptors[i];

                    lastChar = desc[desc.length - 1];
                    value = desc.substring(0, desc.length - 1);
                    intVal = parseInt(value, 10);
                    floatVal = parseFloat(value);

                    // If the descriptor consists of a valid non-negative integer followed by
                    // a U+0077 LATIN SMALL LETTER W character
                    if (regexNonNegativeInteger.test(value) && (lastChar === "w")) {

                        // If width and density are not both absent, then let error be yes.
                        if (w || d) {
                            pError = true;
                        }

                        // Apply the rules for parsing non-negative integers to the descriptor.
                        // If the result is zero, let error be yes.
                        // Otherwise, let width be the result.
                        if (intVal === 0) {
                            pError = true;
                        } else {
                            w = intVal;
                        }

                        // If the descriptor consists of a valid floating-point number followed by
                        // a U+0078 LATIN SMALL LETTER X character
                    } else if (regexFloatingPoint.test(value) && (lastChar === "x")) {

                        // If width, density and future-compat-h are not all absent, then let error
                        // be yes.
                        if (w || d || h) {
                            pError = true;
                        }

                        // Apply the rules for parsing floating-point number values to the descriptor.
                        // If the result is less than zero, let error be yes. Otherwise, let density
                        // be the result.
                        if (floatVal < 0) {
                            pError = true;
                        } else {
                            d = floatVal;
                        }

                        // If the descriptor consists of a valid non-negative integer followed by
                        // a U+0068 LATIN SMALL LETTER H character
                    } else if (regexNonNegativeInteger.test(value) && (lastChar === "h")) {

                        // If height and density are not both absent, then let error be yes.
                        if (h || d) {
                            pError = true;
                        }

                        // Apply the rules for parsing non-negative integers to the descriptor.
                        // If the result is zero, let error be yes. Otherwise, let future-compat-h
                        // be the result.
                        if (intVal === 0) {
                            pError = true;
                        } else {
                            h = intVal;
                        }

                        // Anything else, Let error be yes.
                    } else {
                        pError = true;
                    }
                } // (close step 13 for loop)

                // 15. If error is still no, then append a new image source to candidates whose
                // URL is url, associated with a width width if not absent and a pixel
                // density density if not absent. Otherwise, there is a parse error.
                if (!pError) {
                    candidate.url = url;

                    if (w) {
                        candidate.w = w;
                    }
                    if (d) {
                        candidate.d = d;
                    }
                    if (h) {
                        candidate.h = h;
                    }
                    if (!h && !d && !w) {
                        candidate.d = 1;
                    }
                    if (candidate.d === 1) {
                        set.has1x = true;
                    }
                    candidate.set = set;

                    candidates.push(candidate);
                }
            } // (close parseDescriptors fn)

        /**
         * Tokenizes descriptor properties prior to parsing
         * Returns undefined.
         * (Again, this fn is defined before it is used, in order to pass JSHINT.
         * Unfortunately this breaks the logical sequencing of the spec comments. :/ )
         */
        function tokenize() {

            // 8.1. Descriptor tokeniser: Skip whitespace
            collectCharacters(regexLeadingSpaces);

            // 8.2. Let current descriptor be the empty string.
            currentDescriptor = "";

            // 8.3. Let state be in descriptor.
            state = "in descriptor";

            while (true) {

                // 8.4. Let c be the character at position.
                c = input.charAt(pos);

                //  Do the following depending on the value of state.
                //  For the purpose of this step, "EOF" is a special character representing
                //  that position is past the end of input.

                // In descriptor
                if (state === "in descriptor") {
                    // Do the following, depending on the value of c:

                    // Space character
                    // If current descriptor is not empty, append current descriptor to
                    // descriptors and let current descriptor be the empty string.
                    // Set state to after descriptor.
                    if (isSpace(c)) {
                        if (currentDescriptor) {
                            descriptors.push(currentDescriptor);
                            currentDescriptor = "";
                            state = "after descriptor";
                        }

                        // U+002C COMMA (,)
                        // Advance position to the next character in input. If current descriptor
                        // is not empty, append current descriptor to descriptors. Jump to the step
                        // labeled descriptor parser.
                    } else if (c === ",") {
                        pos += 1;
                        if (currentDescriptor) {
                            descriptors.push(currentDescriptor);
                        }
                        parseDescriptors();
                        return;

                        // U+0028 LEFT PARENTHESIS (()
                        // Append c to current descriptor. Set state to in parens.
                    } else if (c === "\u0028") {
                        currentDescriptor = currentDescriptor + c;
                        state = "in parens";

                        // EOF
                        // If current descriptor is not empty, append current descriptor to
                        // descriptors. Jump to the step labeled descriptor parser.
                    } else if (c === "") {
                        if (currentDescriptor) {
                            descriptors.push(currentDescriptor);
                        }
                        parseDescriptors();
                        return;

                        // Anything else
                        // Append c to current descriptor.
                    } else {
                        currentDescriptor = currentDescriptor + c;
                    }
                    // (end "in descriptor"

                    // In parens
                } else if (state === "in parens") {

                    // U+0029 RIGHT PARENTHESIS ())
                    // Append c to current descriptor. Set state to in descriptor.
                    if (c === ")") {
                        currentDescriptor = currentDescriptor + c;
                        state = "in descriptor";

                        // EOF
                        // Append current descriptor to descriptors. Jump to the step labeled
                        // descriptor parser.
                    } else if (c === "") {
                        descriptors.push(currentDescriptor);
                        parseDescriptors();
                        return;

                        // Anything else
                        // Append c to current descriptor.
                    } else {
                        currentDescriptor = currentDescriptor + c;
                    }

                    // After descriptor
                } else if (state === "after descriptor") {

                    // Do the following, depending on the value of c:
                    // Space character: Stay in this state.
                    if (isSpace(c)) {

                        // EOF: Jump to the step labeled descriptor parser.
                    } else if (c === "") {
                        parseDescriptors();
                        return;

                        // Anything else
                        // Set state to in descriptor. Set position to the previous character in input.
                    } else {
                        state = "in descriptor";
                        pos -= 1;

                    }
                }

                // Advance position to the next character in input.
                pos += 1;

                // Repeat this step.
            } // (close while true loop)
        }

        // 4. Splitting loop: Collect a sequence of characters that are space
        //    characters or U+002C COMMA characters. If any U+002C COMMA characters
        //    were collected, that is a parse error.
        while (true) {
            collectCharacters(regexLeadingCommasOrSpaces);

            // 5. If position is past the end of input, return candidates and abort these steps.
            if (pos >= inputLength) {
                return candidates; // (we're done, this is the sole return path)
            }

            // 6. Collect a sequence of characters that are not space characters,
            //    and let that be url.
            url = collectCharacters(regexLeadingNotSpaces);

            // 7. Let descriptors be a new empty list.
            descriptors = [];

            // 8. If url ends with a U+002C COMMA character (,), follow these substeps:
            //		(1). Remove all trailing U+002C COMMA characters from url. If this removed
            //         more than one character, that is a parse error.
            if (url.slice(-1) === ",") {
                url = url.replace(regexTrailingCommas, "");
                // (Jump ahead to step 9 to skip tokenization and just push the candidate).
                parseDescriptors();

                //	Otherwise, follow these substeps:
            } else {
                tokenize();
            } // (close else of step 8)

            // 16. Return to the step labeled splitting loop.
        } // (Close of big while loop.)
    }

    /*
     * Sizes Parser
     *
     * By Alex Bell |  MIT License
     *
     * Non-strict but accurate and lightweight JS Parser for the string value <img sizes="here">
     *
     * Reference algorithm at:
     * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-sizes-attribute
     *
     * Most comments are copied in directly from the spec
     * (except for comments in parens).
     *
     * Grammar is:
     * <source-size-list> = <source-size># [ , <source-size-value> ]? | <source-size-value>
     * <source-size> = <media-condition> <source-size-value>
     * <source-size-value> = <length>
     * http://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-sizes
     *
     * E.g. "(max-width: 30em) 100vw, (max-width: 50em) 70vw, 100vw"
     * or "(min-width: 30em), calc(30vw - 15px)" or just "30vw"
     *
     * Returns the first valid <css-length> with a media condition that evaluates to true,
     * or "100vw" if all valid media conditions evaluate to false.
     *
     */

    function parseSizes(strValue) {

        // (Percentage CSS lengths are not allowed in this case, to avoid confusion:
        // https://html.spec.whatwg.org/multipage/embedded-content.html#valid-source-size-list
        // CSS allows a single optional plus or minus sign:
        // http://www.w3.org/TR/CSS2/syndata.html#numbers
        // CSS is ASCII case-insensitive:
        // http://www.w3.org/TR/CSS2/syndata.html#characters )
        // Spec allows exponential notation for <number> type:
        // http://dev.w3.org/csswg/css-values/#numbers
        var regexCssLengthWithUnits = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i;

        // (This is a quick and lenient test. Because of optional unlimited-depth internal
        // grouping parens and strict spacing rules, this could get very complicated.)
        var regexCssCalc = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i;

        var i;
        var unparsedSizesList;
        var unparsedSizesListLength;
        var unparsedSize;
        var lastComponentValue;
        var size;

        // UTILITY FUNCTIONS

        //  (Toy CSS parser. The goals here are:
        //  1) expansive test coverage without the weight of a full CSS parser.
        //  2) Avoiding regex wherever convenient.
        //  Quick tests: http://jsfiddle.net/gtntL4gr/3/
        //  Returns an array of arrays.)
        function parseComponentValues(str) {
            var chrctr;
            var component = "";
            var componentArray = [];
            var listArray = [];
            var parenDepth = 0;
            var pos = 0;
            var inComment = false;

            function pushComponent() {
                if (component) {
                    componentArray.push(component);
                    component = "";
                }
            }

            function pushComponentArray() {
                if (componentArray[0]) {
                    listArray.push(componentArray);
                    componentArray = [];
                }
            }

            // (Loop forwards from the beginning of the string.)
            while (true) {
                chrctr = str.charAt(pos);

                if (chrctr === "") { // ( End of string reached.)
                    pushComponent();
                    pushComponentArray();
                    return listArray;
                } else if (inComment) {
                    if ((chrctr === "*") && (str[pos + 1] === "/")) { // (At end of a comment.)
                        inComment = false;
                        pos += 2;
                        pushComponent();
                        continue;
                    } else {
                        pos += 1; // (Skip all characters inside comments.)
                        continue;
                    }
                } else if (isSpace(chrctr)) {
                    // (If previous character in loop was also a space, or if
                    // at the beginning of the string, do not add space char to
                    // component.)
                    if ((str.charAt(pos - 1) && isSpace(str.charAt(pos - 1))) || !component) {
                        pos += 1;
                        continue;
                    } else if (parenDepth === 0) {
                        pushComponent();
                        pos += 1;
                        continue;
                    } else {
                        // (Replace any space character with a plain space for legibility.)
                        chrctr = " ";
                    }
                } else if (chrctr === "(") {
                    parenDepth += 1;
                } else if (chrctr === ")") {
                    parenDepth -= 1;
                } else if (chrctr === ",") {
                    pushComponent();
                    pushComponentArray();
                    pos += 1;
                    continue;
                } else if ((chrctr === "/") && (str.charAt(pos + 1) === "*")) {
                    inComment = true;
                    pos += 2;
                    continue;
                }

                component = component + chrctr;
                pos += 1;
            }
        }

        function isValidNonNegativeSourceSizeValue(s) {
            if (regexCssLengthWithUnits.test(s) && (parseFloat(s) >= 0)) {
                return true;
            }
            if (regexCssCalc.test(s)) {
                return true;
            }
            // ( http://www.w3.org/TR/CSS2/syndata.html#numbers says:
            // "-0 is equivalent to 0 and is not a negative number." which means that
            // unitless zero and unitless negative zero must be accepted as special cases.)
            if ((s === "0") || (s === "-0") || (s === "+0")) {
                return true;
            }
            return false;
        }

        // When asked to parse a sizes attribute from an element, parse a
        // comma-separated list of component values from the value of the element's
        // sizes attribute (or the empty string, if the attribute is absent), and let
        // unparsed sizes list be the result.
        // http://dev.w3.org/csswg/css-syntax/#parse-comma-separated-list-of-component-values

        unparsedSizesList = parseComponentValues(strValue);
        unparsedSizesListLength = unparsedSizesList.length;

        // For each unparsed size in unparsed sizes list:
        for (i = 0; i < unparsedSizesListLength; i++) {
            unparsedSize = unparsedSizesList[i];

            // 1. Remove all consecutive <whitespace-token>s from the end of unparsed size.
            // ( parseComponentValues() already omits spaces outside of parens. )

            // If unparsed size is now empty, that is a parse error; continue to the next
            // iteration of this algorithm.
            // ( parseComponentValues() won't push an empty array. )

            // 2. If the last component value in unparsed size is a valid non-negative
            // <source-size-value>, let size be its value and remove the component value
            // from unparsed size. Any CSS function other than the calc() function is
            // invalid. Otherwise, there is a parse error; continue to the next iteration
            // of this algorithm.
            // http://dev.w3.org/csswg/css-syntax/#parse-component-value
            lastComponentValue = unparsedSize[unparsedSize.length - 1];

            if (isValidNonNegativeSourceSizeValue(lastComponentValue)) {
                size = lastComponentValue;
                unparsedSize.pop();
            } else {
                continue;
            }

            // 3. Remove all consecutive <whitespace-token>s from the end of unparsed
            // size. If unparsed size is now empty, return size and exit this algorithm.
            // If this was not the last item in unparsed sizes list, that is a parse error.
            if (unparsedSize.length === 0) {
                return size;
            }

            // 4. Parse the remaining component values in unparsed size as a
            // <media-condition>. If it does not parse correctly, or it does parse
            // correctly but the <media-condition> evaluates to false, continue to the
            // next iteration of this algorithm.
            // (Parsing all possible compound media conditions in JS is heavy, complicated,
            // and the payoff is unclear. Is there ever an situation where the
            // media condition parses incorrectly but still somehow evaluates to true?
            // Can we just rely on the browser/polyfill to do it?)
            unparsedSize = unparsedSize.join(" ");
            if (!(pf.matchesMedia(unparsedSize))) {
                continue;
            }

            // 5. Return size and exit this algorithm.
            return size;
        }

        // If the above algorithm exhausts unparsed sizes list without returning a
        // size value, return 100vw.
        return "100vw";
    }

    // namespace
    pf.ns = ("pf" + new Date().getTime()).substr(0, 9);

    // srcset support test
    pf.supSrcset = "srcset" in image;
    pf.supSizes = "sizes" in image;
    pf.supPicture = !!window.HTMLPictureElement;

    // UC browser does claim to support srcset and picture, but not sizes,
    // this extended test reveals the browser does support nothing
    if (pf.supSrcset && pf.supPicture && !pf.supSizes) {
        (function(image2) {
            image.srcset = "data:,a";
            image2.src = "data:,a";
            pf.supSrcset = image.complete === image2.complete;
            pf.supPicture = pf.supSrcset && pf.supPicture;
        })(document.createElement("img"));
    }

    // Safari9 has basic support for sizes, but does't expose the `sizes` idl attribute
    if (pf.supSrcset && !pf.supSizes) {

        (function() {
            var width2 = "data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==";
            var width1 = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
            var img = document.createElement("img");
            var test = function() {
                var width = img.width;

                if (width === 2) {
                    pf.supSizes = true;
                }

                alwaysCheckWDescriptor = pf.supSrcset && !pf.supSizes;

                isSupportTestReady = true;
                // force async
                setTimeout(picturefill);
            };

            img.onload = test;
            img.onerror = test;
            img.setAttribute("sizes", "9px");

            img.srcset = width1 + " 1w," + width2 + " 9w";
            img.src = width1;
        })();

    } else {
        isSupportTestReady = true;
    }

    // using pf.qsa instead of dom traversing does scale much better,
    // especially on sites mixing responsive and non-responsive images
    pf.selShort = "picture>img,img[srcset]";
    pf.sel = pf.selShort;
    pf.cfg = cfg;

    /**
     * Shortcut property for `devicePixelRatio` ( for easy overriding in tests )
     */
    pf.DPR = (DPR || 1);
    pf.u = units;

    // container of supported mime types that one might need to qualify before using
    pf.types = types;

    pf.setSize = noop;

    /**
     * Gets a string and returns the absolute URL
     * @param src
     * @returns {String} absolute URL
     */

    pf.makeUrl = memoize(function(src) {
        anchor.href = src;
        return anchor.href;
    });

    /**
     * Gets a DOM element or document and a selctor and returns the found matches
     * Can be extended with jQuery/Sizzle for IE7 support
     * @param context
     * @param sel
     * @returns {NodeList|Array}
     */
    pf.qsa = function(context, sel) {
        return ("querySelector" in context) ? context.querySelectorAll(sel) : [];
    };

    /**
     * Shortcut method for matchMedia ( for easy overriding in tests )
     * wether native or pf.mMQ is used will be decided lazy on first call
     * @returns {boolean}
     */
    pf.matchesMedia = function() {
        if (window.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches) {
            pf.matchesMedia = function(media) {
                return !media || (matchMedia(media).matches);
            };
        } else {
            pf.matchesMedia = pf.mMQ;
        }

        return pf.matchesMedia.apply(this, arguments);
    };

    /**
     * A simplified matchMedia implementation for IE8 and IE9
     * handles only min-width/max-width with px or em values
     * @param media
     * @returns {boolean}
     */
    pf.mMQ = function(media) {
        return media ? evalCSS(media) : true;
    };

    /**
     * Returns the calculated length in css pixel from the given sourceSizeValue
     * http://dev.w3.org/csswg/css-values-3/#length-value
     * intended Spec mismatches:
     * * Does not check for invalid use of CSS functions
     * * Does handle a computed length of 0 the same as a negative and therefore invalid value
     * @param sourceSizeValue
     * @returns {Number}
     */
    pf.calcLength = function(sourceSizeValue) {

        var value = evalCSS(sourceSizeValue, true) || false;
        if (value < 0) {
            value = false;
        }

        return value;
    };

    /**
     * Takes a type string and checks if its supported
     */

    pf.supportsType = function(type) {
        return (type) ? types[type] : true;
    };

    /**
     * Parses a sourceSize into mediaCondition (media) and sourceSizeValue (length)
     * @param sourceSizeStr
     * @returns {*}
     */
    pf.parseSize = memoize(function(sourceSizeStr) {
        var match = (sourceSizeStr || "").match(regSize);
        return {
            media: match && match[1],
            length: match && match[2]
        };
    });

    pf.parseSet = function(set) {
        if (!set.cands) {
            set.cands = parseSrcset(set.srcset, set);
        }
        return set.cands;
    };

    /**
     * returns 1em in css px for html/body default size
     * function taken from respondjs
     * @returns {*|number}
     */
    pf.getEmValue = function() {
        var body;
        if (!eminpx && (body = document.body)) {
            var div = document.createElement("div"),
                originalHTMLCSS = docElem.style.cssText,
                originalBodyCSS = body.style.cssText;

            div.style.cssText = baseStyle;

            // 1em in a media query is the value of the default font size of the browser
            // reset docElem and body to ensure the correct value is returned
            docElem.style.cssText = fsCss;
            body.style.cssText = fsCss;

            body.appendChild(div);
            eminpx = div.offsetWidth;
            body.removeChild(div);

            //also update eminpx before returning
            eminpx = parseFloat(eminpx, 10);

            // restore the original values
            docElem.style.cssText = originalHTMLCSS;
            body.style.cssText = originalBodyCSS;

        }
        return eminpx || 16;
    };

    /**
     * Takes a string of sizes and returns the width in pixels as a number
     */
    pf.calcListLength = function(sourceSizeListStr) {
        // Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33%
        //
        //                           or (min-width:30em) calc(30% - 15px)
        if (!(sourceSizeListStr in sizeLengthCache) || cfg.uT) {
            var winningLength = pf.calcLength(parseSizes(sourceSizeListStr));

            sizeLengthCache[sourceSizeListStr] = !winningLength ? units.width : winningLength;
        }

        return sizeLengthCache[sourceSizeListStr];
    };

    /**
     * Takes a candidate object with a srcset property in the form of url/
     * ex. "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or
     *     "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or
     *     "images/pic-small.png"
     * Get an array of image candidates in the form of
     *      {url: "/foo/bar.png", resolution: 1}
     * where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value
     * If sizes is specified, res is calculated
     */
    pf.setRes = function(set) {
        var candidates;
        if (set) {

            candidates = pf.parseSet(set);

            for (var i = 0, len = candidates.length; i < len; i++) {
                setResolution(candidates[i], set.sizes);
            }
        }
        return candidates;
    };

    pf.setRes.res = setResolution;

    pf.applySetCandidate = function(candidates, img) {
        if (!candidates.length) {
            return;
        }
        var candidate,
            i,
            j,
            length,
            bestCandidate,
            curSrc,
            curCan,
            candidateSrc,
            abortCurSrc;

        var imageData = img[pf.ns];
        var dpr = pf.DPR;

        curSrc = imageData.curSrc || img[curSrcProp];

        curCan = imageData.curCan || setSrcToCur(img, curSrc, candidates[0].set);

        // if we have a current source, we might either become lazy or give this source some advantage
        if (curCan && curCan.set === candidates[0].set) {

            // if browser can abort image request and the image has a higher pixel density than needed
            // and this image isn't downloaded yet, we skip next part and try to save bandwidth
            abortCurSrc = (supportAbort && !img.complete && curCan.res - 0.1 > dpr);

            if (!abortCurSrc) {
                curCan.cached = true;

                // if current candidate is "best", "better" or "okay",
                // set it to bestCandidate
                if (curCan.res >= dpr) {
                    bestCandidate = curCan;
                }
            }
        }

        if (!bestCandidate) {

            candidates.sort(ascendingSort);

            length = candidates.length;
            bestCandidate = candidates[length - 1];

            for (i = 0; i < length; i++) {
                candidate = candidates[i];
                if (candidate.res >= dpr) {
                    j = i - 1;

                    // we have found the perfect candidate,
                    // but let's improve this a little bit with some assumptions ;-)
                    if (candidates[j] &&
                        (abortCurSrc || curSrc !== pf.makeUrl(candidate.url)) &&
                        chooseLowRes(candidates[j].res, candidate.res, dpr, candidates[j].cached)) {

                        bestCandidate = candidates[j];

                    } else {
                        bestCandidate = candidate;
                    }
                    break;
                }
            }
        }

        if (bestCandidate) {

            candidateSrc = pf.makeUrl(bestCandidate.url);

            imageData.curSrc = candidateSrc;
            imageData.curCan = bestCandidate;

            if (candidateSrc !== curSrc) {
                pf.setSrc(img, bestCandidate);
            }
            pf.setSize(img);
        }
    };

    pf.setSrc = function(img, bestCandidate) {
        var origWidth;
        img.src = bestCandidate.url;

        // although this is a specific Safari issue, we don't want to take too much different code paths
        if (bestCandidate.set.type === "image/svg+xml") {
            origWidth = img.style.width;
            img.style.width = (img.offsetWidth + 1) + "px";

            // next line only should trigger a repaint
            // if... is only done to trick dead code removal
            if (img.offsetWidth + 1) {
                img.style.width = origWidth;
            }
        }
    };

    pf.getSet = function(img) {
        var i, set, supportsType;
        var match = false;
        var sets = img[pf.ns].sets;

        for (i = 0; i < sets.length && !match; i++) {
            set = sets[i];

            if (!set.srcset || !pf.matchesMedia(set.media) || !(supportsType = pf.supportsType(set.type))) {
                continue;
            }

            if (supportsType === "pending") {
                set = supportsType;
            }

            match = set;
            break;
        }

        return match;
    };

    pf.parseSets = function(element, parent, options) {
        var srcsetAttribute, imageSet, isWDescripor, srcsetParsed;

        var hasPicture = parent && parent.nodeName.toUpperCase() === "PICTURE";
        var imageData = element[pf.ns];

        if (imageData.src === undefined || options.src) {
            imageData.src = getImgAttr.call(element, "src");
            if (imageData.src) {
                setImgAttr.call(element, srcAttr, imageData.src);
            } else {
                removeImgAttr.call(element, srcAttr);
            }
        }

        if (imageData.srcset === undefined || options.srcset || !pf.supSrcset || element.srcset) {
            srcsetAttribute = getImgAttr.call(element, "srcset");
            imageData.srcset = srcsetAttribute;
            srcsetParsed = true;
        }

        imageData.sets = [];

        if (hasPicture) {
            imageData.pic = true;
            getAllSourceElements(parent, imageData.sets);
        }

        if (imageData.srcset) {
            imageSet = {
                srcset: imageData.srcset,
                sizes: getImgAttr.call(element, "sizes")
            };

            imageData.sets.push(imageSet);

            isWDescripor = (alwaysCheckWDescriptor || imageData.src) && regWDesc.test(imageData.srcset || "");

            // add normal src as candidate, if source has no w descriptor
            if (!isWDescripor && imageData.src && !getCandidateForSrc(imageData.src, imageSet) && !imageSet.has1x) {
                imageSet.srcset += ", " + imageData.src;
                imageSet.cands.push({
                    url: imageData.src,
                    d: 1,
                    set: imageSet
                });
            }

        } else if (imageData.src) {
            imageData.sets.push({
                srcset: imageData.src,
                sizes: null
            });
        }

        imageData.curCan = null;
        imageData.curSrc = undefined;

        // if img has picture or the srcset was removed or has a srcset and does not support srcset at all
        // or has a w descriptor (and does not support sizes) set support to false to evaluate
        imageData.supported = !(hasPicture || (imageSet && !pf.supSrcset) || (isWDescripor && !pf.supSizes));

        if (srcsetParsed && pf.supSrcset && !imageData.supported) {
            if (srcsetAttribute) {
                setImgAttr.call(element, srcsetAttr, srcsetAttribute);
                element.srcset = "";
            } else {
                removeImgAttr.call(element, srcsetAttr);
            }
        }

        if (imageData.supported && !imageData.srcset && ((!imageData.src && element.src) || element.src !== pf.makeUrl(imageData.src))) {
            if (imageData.src === null) {
                element.removeAttribute("src");
            } else {
                element.src = imageData.src;
            }
        }

        imageData.parsed = true;
    };

    pf.fillImg = function(element, options) {
        var imageData;
        var extreme = options.reselect || options.reevaluate;

        // expando for caching data on the img
        if (!element[pf.ns]) {
            element[pf.ns] = {};
        }

        imageData = element[pf.ns];

        // if the element has already been evaluated, skip it
        // unless `options.reevaluate` is set to true ( this, for example,
        // is set to true when running `picturefill` on `resize` ).
        if (!extreme && imageData.evaled === evalId) {
            return;
        }

        if (!imageData.parsed || options.reevaluate) {
            pf.parseSets(element, element.parentNode, options);
        }

        if (!imageData.supported) {
            applyBestCandidate(element);
        } else {
            imageData.evaled = evalId;
        }
    };

    pf.setupRun = function() {
        if (!alreadyRun || isVwDirty || (DPR !== window.devicePixelRatio)) {
            updateMetrics();
        }
    };

    // If picture is supported, well, that's awesome.
    if (pf.supPicture) {
        picturefill = noop;
        pf.fillImg = noop;
    } else {

        // Set up picture polyfill by polling the document
        (function() {
            var isDomReady;
            var regReady = window.attachEvent ? /d$|^c/ : /d$|^c|^i/;

            var run = function() {
                var readyState = document.readyState || "";

                timerId = setTimeout(run, readyState === "loading" ? 200 : 999);
                if (document.body) {
                    pf.fillImgs();
                    isDomReady = isDomReady || regReady.test(readyState);
                    if (isDomReady) {
                        clearTimeout(timerId);
                    }

                }
            };

            var timerId = setTimeout(run, document.body ? 9 : 99);

            // Also attach picturefill on resize and readystatechange
            // http://modernjavascript.blogspot.com/2013/08/building-better-debounce.html
            var debounce = function(func, wait) {
                var timeout, timestamp;
                var later = function() {
                    var last = (new Date()) - timestamp;

                    if (last < wait) {
                        timeout = setTimeout(later, wait - last);
                    } else {
                        timeout = null;
                        func();
                    }
                };

                return function() {
                    timestamp = new Date();

                    if (!timeout) {
                        timeout = setTimeout(later, wait);
                    }
                };
            };
            var lastClientWidth = docElem.clientHeight;
            var onResize = function() {
                isVwDirty = Math.max(window.innerWidth || 0, docElem.clientWidth) !== units.width || docElem.clientHeight !== lastClientWidth;
                lastClientWidth = docElem.clientHeight;
                if (isVwDirty) {
                    pf.fillImgs();
                }
            };

            on(window, "resize", debounce(onResize, 99));
            on(document, "readystatechange", run);
        })();
    }

    pf.picturefill = picturefill;
    //use this internally for easy monkey patching/performance testing
    pf.fillImgs = picturefill;
    pf.teardownRun = noop;

    /* expose methods for testing */
    picturefill._ = pf;

    window.picturefillCFG = {
        pf: pf,
        push: function(args) {
            var name = args.shift();
            if (typeof pf[name] === "function") {
                pf[name].apply(pf, args);
            } else {
                cfg[name] = args[0];
                if (alreadyRun) {
                    pf.fillImgs({
                        reselect: true
                    });
                }
            }
        }
    };

    while (setOptions && setOptions.length) {
        window.picturefillCFG.push(setOptions.shift());
    }

    /* expose picturefill */
    window.picturefill = picturefill;

    /* expose picturefill */
    if (true && typeof module.exports === "object") {
        // CommonJS, just export
        module.exports = picturefill;
    } else if (true) {
        // AMD support
        !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
                return picturefill;
            }).call(exports, __webpack_require__, exports, module),
            __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
    }

    // IE8 evals this sync, so it must be the last thing we do
    if (!pf.supPicture) {
        types["image/webp"] = detectTypeSupport("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==");
    }

})(window, document);
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi9ub2RlX21vZHVsZXMvcGljdHVyZWZpbGwvZGlzdC9waWN0dXJlZmlsbC5qcz9lZWM4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQSx1RkFBdUY7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLE9BQU8sa0JBQWtCLGNBQWMsVUFBVSxZQUFZLGNBQWMsVUFBVSxnQkFBZ0I7QUFDekksdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7O0FBRTVCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsdUJBQXVCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0MsU0FBUztBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHFDQUFxQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBLGVBQWUsd0JBQXdCO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWUsT0FBTzs7QUFFOUM7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWUsT0FBTzs7QUFFOUM7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlLE9BQU87O0FBRTlDO0FBQ0EsS0FBSyxPQUFPO0FBQ1osSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7QUFDWixZQUFZO0FBQ1osWUFBWTtBQUNaLHlCQUF5QjtBQUN6Qiw0QkFBNEI7QUFDNUI7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGVBQWU7QUFDZjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUVBQWlFO0FBQ2pFLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLDZCQUE2QjtBQUMxQzs7QUFFQTtBQUNBOztBQUVBLDJEQUEyRDtBQUMzRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEMsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVILEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsNENBQTRDLFNBQVM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYywyQkFBMkI7QUFDekM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsbUJBQW1CLGlCQUFpQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE1BQU0sS0FBMEI7QUFDaEM7QUFDQTtBQUNBLEVBQUUsV0FBVyxJQUEwQztBQUN2RDtBQUNBLEVBQUUsbUNBQXVCLFlBQVksb0JBQW9CLEVBQUU7QUFBQSxrR0FBRTtBQUM3RDs7QUFFQTtBQUNBO0FBQ0EsMkVBQTJFO0FBQzNFOztBQUVBLENBQUMiLCJmaWxlIjoiNzIyOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBwaWN0dXJlZmlsbCAtIHYzLjAuMiAtIDIwMTYtMDItMTJcbiAqIGh0dHBzOi8vc2NvdHRqZWhsLmdpdGh1Yi5pby9waWN0dXJlZmlsbC9cbiAqIENvcHlyaWdodCAoYykgMjAxNiBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL3BpY3R1cmVmaWxsL2Jsb2IvbWFzdGVyL0F1dGhvcnMudHh0OyBMaWNlbnNlZCBNSVRcbiAqL1xuLyohIEdlY2tvLVBpY3R1cmUgLSB2MS4wXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL3BpY3R1cmVmaWxsL3RyZWUvMy4wL3NyYy9wbHVnaW5zL2dlY2tvLXBpY3R1cmVcbiAqIEZpcmVmb3gncyBlYXJseSBwaWN0dXJlIGltcGxlbWVudGF0aW9uIChwcmlvciB0byBGRjQxKSBpcyBzdGF0aWMgYW5kIGRvZXNcbiAqIG5vdCByZWFjdCB0byB2aWV3cG9ydCBjaGFuZ2VzLiBUaGlzIHRpbnkgbW9kdWxlIGZpeGVzIHRoaXMuXG4gKi9cbihmdW5jdGlvbih3aW5kb3cpIHtcblx0Lypqc2hpbnQgZXFudWxsOnRydWUgKi9cblx0dmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcblxuXHRpZiAoIHdpbmRvdy5IVE1MUGljdHVyZUVsZW1lbnQgJiYgKCgvZWNrby8pLnRlc3QodWEpICYmIHVhLm1hdGNoKC9ydlxcOihcXGQrKS8pICYmIFJlZ0V4cC4kMSA8IDQ1KSApIHtcblx0XHRhZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIChmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0aW1lcjtcblxuXHRcdFx0dmFyIGR1bW15U3JjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNvdXJjZVwiKTtcblxuXHRcdFx0dmFyIGZpeFJlc3BpbWcgPSBmdW5jdGlvbihpbWcpIHtcblx0XHRcdFx0dmFyIHNvdXJjZSwgc2l6ZXM7XG5cdFx0XHRcdHZhciBwaWN0dXJlID0gaW1nLnBhcmVudE5vZGU7XG5cblx0XHRcdFx0aWYgKHBpY3R1cmUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJQSUNUVVJFXCIpIHtcblx0XHRcdFx0XHRzb3VyY2UgPSBkdW1teVNyYy5jbG9uZU5vZGUoKTtcblxuXHRcdFx0XHRcdHBpY3R1cmUuaW5zZXJ0QmVmb3JlKHNvdXJjZSwgcGljdHVyZS5maXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHBpY3R1cmUucmVtb3ZlQ2hpbGQoc291cmNlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmICghaW1nLl9wZkxhc3RTaXplIHx8IGltZy5vZmZzZXRXaWR0aCA+IGltZy5fcGZMYXN0U2l6ZSkge1xuXHRcdFx0XHRcdGltZy5fcGZMYXN0U2l6ZSA9IGltZy5vZmZzZXRXaWR0aDtcblx0XHRcdFx0XHRzaXplcyA9IGltZy5zaXplcztcblx0XHRcdFx0XHRpbWcuc2l6ZXMgKz0gXCIsMTAwdndcIjtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aW1nLnNpemVzID0gc2l6ZXM7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdHZhciBmaW5kUGljdHVyZUltZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGk7XG5cdFx0XHRcdHZhciBpbWdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcInBpY3R1cmUgPiBpbWcsIGltZ1tzcmNzZXRdW3NpemVzXVwiKTtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGltZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRmaXhSZXNwaW1nKGltZ3NbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dmFyIG9uUmVzaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdHRpbWVyID0gc2V0VGltZW91dChmaW5kUGljdHVyZUltZ3MsIDk5KTtcblx0XHRcdH07XG5cdFx0XHR2YXIgbXEgPSB3aW5kb3cubWF0Y2hNZWRpYSAmJiBtYXRjaE1lZGlhKFwiKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpXCIpO1xuXHRcdFx0dmFyIGluaXQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0b25SZXNpemUoKTtcblxuXHRcdFx0XHRpZiAobXEgJiYgbXEuYWRkTGlzdGVuZXIpIHtcblx0XHRcdFx0XHRtcS5hZGRMaXN0ZW5lcihvblJlc2l6ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGR1bW15U3JjLnNyY3NldCA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT1cIjtcblxuXHRcdFx0aWYgKC9eW2N8aV18ZCQvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSB8fCBcIlwiKSkge1xuXHRcdFx0XHRpbml0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBpbml0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9uUmVzaXplO1xuXHRcdH0pKCkpO1xuXHR9XG59KSh3aW5kb3cpO1xuXG4vKiEgUGljdHVyZWZpbGwgLSB2My4wLjJcbiAqIGh0dHA6Ly9zY290dGplaGwuZ2l0aHViLmlvL3BpY3R1cmVmaWxsXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0amVobC9waWN0dXJlZmlsbC9ibG9iL21hc3Rlci9BdXRob3JzLnR4dDtcbiAqICBMaWNlbnNlOiBNSVRcbiAqL1xuXG4oZnVuY3Rpb24oIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCApIHtcblx0Ly8gRW5hYmxlIHN0cmljdCBtb2RlXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdC8vIEhUTUwgc2hpbXx2IGl0IGZvciBvbGQgSUUgKElFOSB3aWxsIHN0aWxsIG5lZWQgdGhlIEhUTUwgdmlkZW8gdGFnIHdvcmthcm91bmQpXG5cdGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwicGljdHVyZVwiICk7XG5cblx0dmFyIHdhcm4sIGVtaW5weCwgYWx3YXlzQ2hlY2tXRGVzY3JpcHRvciwgZXZhbElkO1xuXHQvLyBsb2NhbCBvYmplY3QgZm9yIG1ldGhvZCByZWZlcmVuY2VzIGFuZCB0ZXN0aW5nIGV4cG9zdXJlXG5cdHZhciBwZiA9IHt9O1xuXHR2YXIgaXNTdXBwb3J0VGVzdFJlYWR5ID0gZmFsc2U7XG5cdHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblx0dmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbWdcIiApO1xuXHR2YXIgZ2V0SW1nQXR0ciA9IGltYWdlLmdldEF0dHJpYnV0ZTtcblx0dmFyIHNldEltZ0F0dHIgPSBpbWFnZS5zZXRBdHRyaWJ1dGU7XG5cdHZhciByZW1vdmVJbWdBdHRyID0gaW1hZ2UucmVtb3ZlQXR0cmlidXRlO1xuXHR2YXIgZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0dmFyIHR5cGVzID0ge307XG5cdHZhciBjZmcgPSB7XG5cdFx0Ly9yZXNvdXJjZSBzZWxlY3Rpb246XG5cdFx0YWxnb3JpdGhtOiBcIlwiXG5cdH07XG5cdHZhciBzcmNBdHRyID0gXCJkYXRhLXBmc3JjXCI7XG5cdHZhciBzcmNzZXRBdHRyID0gc3JjQXR0ciArIFwic2V0XCI7XG5cdC8vIHVhIHNuaWZmaW5nIGlzIGRvbmUgZm9yIHVuZGV0ZWN0YWJsZSBpbWcgbG9hZGluZyBmZWF0dXJlcyxcblx0Ly8gdG8gZG8gc29tZSBub24gY3J1Y2lhbCBwZXJmIG9wdGltaXphdGlvbnNcblx0dmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcblx0dmFyIHN1cHBvcnRBYm9ydCA9ICgvcmlkZW50LykudGVzdCh1YSkgfHwgKCgvZWNrby8pLnRlc3QodWEpICYmIHVhLm1hdGNoKC9ydlxcOihcXGQrKS8pICYmIFJlZ0V4cC4kMSA+IDM1ICk7XG5cdHZhciBjdXJTcmNQcm9wID0gXCJjdXJyZW50U3JjXCI7XG5cdHZhciByZWdXRGVzYyA9IC9cXHMrXFwrP1xcZCsoZVxcZCspP3cvO1xuXHR2YXIgcmVnU2l6ZSA9IC8oXFwoW14pXStcXCkpP1xccyooLispLztcblx0dmFyIHNldE9wdGlvbnMgPSB3aW5kb3cucGljdHVyZWZpbGxDRkc7XG5cdC8qKlxuXHQgKiBTaG9ydGN1dCBwcm9wZXJ0eSBmb3IgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy9zcGVjcy9taXhlZGNvbnRlbnQvI3Jlc3RyaWN0cy1taXhlZC1jb250ZW50ICggZm9yIGVhc3kgb3ZlcnJpZGluZyBpbiB0ZXN0cyApXG5cdCAqL1xuXHQvLyBiYXNlU3R5bGUgYWxzbyB1c2VkIGJ5IGdldEVtVmFsdWUgKGkuZS46IHdpZHRoOiAxZW0gaXMgaW1wb3J0YW50KVxuXHR2YXIgYmFzZVN0eWxlID0gXCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dmlzaWJpbGl0eTpoaWRkZW47ZGlzcGxheTpibG9jaztwYWRkaW5nOjA7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjFlbTt3aWR0aDoxZW07b3ZlcmZsb3c6aGlkZGVuO2NsaXA6cmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXCI7XG5cdHZhciBmc0NzcyA9IFwiZm9udC1zaXplOjEwMCUhaW1wb3J0YW50O1wiO1xuXHR2YXIgaXNWd0RpcnR5ID0gdHJ1ZTtcblxuXHR2YXIgY3NzQ2FjaGUgPSB7fTtcblx0dmFyIHNpemVMZW5ndGhDYWNoZSA9IHt9O1xuXHR2YXIgRFBSID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG5cdHZhciB1bml0cyA9IHtcblx0XHRweDogMSxcblx0XHRcImluXCI6IDk2XG5cdH07XG5cdHZhciBhbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXHQvKipcblx0ICogYWxyZWFkeVJ1biBmbGFnIHVzZWQgZm9yIHNldE9wdGlvbnMuIGlzIGl0IHRydWUgc2V0T3B0aW9ucyB3aWxsIHJlZXZhbHVhdGVcblx0ICogQHR5cGUge2Jvb2xlYW59XG5cdCAqL1xuXHR2YXIgYWxyZWFkeVJ1biA9IGZhbHNlO1xuXG5cdC8vIFJldXNhYmxlLCBub24tXCJnXCIgUmVnZXhlc1xuXG5cdC8vIChEb24ndCB1c2UgXFxzLCB0byBhdm9pZCBtYXRjaGluZyBub24tYnJlYWtpbmcgc3BhY2UuKVxuXHR2YXIgcmVnZXhMZWFkaW5nU3BhY2VzID0gL15bIFxcdFxcblxcclxcdTAwMGNdKy8sXG5cdCAgICByZWdleExlYWRpbmdDb21tYXNPclNwYWNlcyA9IC9eWywgXFx0XFxuXFxyXFx1MDAwY10rLyxcblx0ICAgIHJlZ2V4TGVhZGluZ05vdFNwYWNlcyA9IC9eW14gXFx0XFxuXFxyXFx1MDAwY10rLyxcblx0ICAgIHJlZ2V4VHJhaWxpbmdDb21tYXMgPSAvWyxdKyQvLFxuXHQgICAgcmVnZXhOb25OZWdhdGl2ZUludGVnZXIgPSAvXlxcZCskLyxcblxuXHQgICAgLy8gKCBQb3NpdGl2ZSBvciBuZWdhdGl2ZSBvciB1bnNpZ25lZCBpbnRlZ2VycyBvciBkZWNpbWFscywgd2l0aG91dCBvciB3aXRob3V0IGV4cG9uZW50cy5cblx0ICAgIC8vIE11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgZGlnaXQuXG5cdCAgICAvLyBBY2NvcmRpbmcgdG8gc3BlYyB0ZXN0cyBhbnkgZGVjaW1hbCBwb2ludCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZGlnaXQuXG5cdCAgICAvLyBObyBsZWFkaW5nIHBsdXMgc2lnbiBpcyBhbGxvd2VkLilcblx0ICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjdmFsaWQtZmxvYXRpbmctcG9pbnQtbnVtYmVyXG5cdCAgICByZWdleEZsb2F0aW5nUG9pbnQgPSAvXi0/KD86WzAtOV0rfFswLTldKlxcLlswLTldKykoPzpbZUVdWystXT9bMC05XSspPyQvO1xuXG5cdHZhciBvbiA9IGZ1bmN0aW9uKG9iaiwgZXZ0LCBmbiwgY2FwdHVyZSkge1xuXHRcdGlmICggb2JqLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRvYmouYWRkRXZlbnRMaXN0ZW5lcihldnQsIGZuLCBjYXB0dXJlIHx8IGZhbHNlKTtcblx0XHR9IGVsc2UgaWYgKCBvYmouYXR0YWNoRXZlbnQgKSB7XG5cdFx0XHRvYmouYXR0YWNoRXZlbnQoIFwib25cIiArIGV2dCwgZm4pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogc2ltcGxlIG1lbW9pemUgZnVuY3Rpb246XG5cdCAqL1xuXG5cdHZhciBtZW1vaXplID0gZnVuY3Rpb24oZm4pIHtcblx0XHR2YXIgY2FjaGUgPSB7fTtcblx0XHRyZXR1cm4gZnVuY3Rpb24oaW5wdXQpIHtcblx0XHRcdGlmICggIShpbnB1dCBpbiBjYWNoZSkgKSB7XG5cdFx0XHRcdGNhY2hlWyBpbnB1dCBdID0gZm4oaW5wdXQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNhY2hlWyBpbnB1dCBdO1xuXHRcdH07XG5cdH07XG5cblx0Ly8gVVRJTElUWSBGVU5DVElPTlNcblxuXHQvLyBNYW51YWwgaXMgZmFzdGVyIHRoYW4gUmVnRXhcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vd2hpdGVzcGFjZS1jaGFyYWN0ZXIvNVxuXHRmdW5jdGlvbiBpc1NwYWNlKGMpIHtcblx0XHRyZXR1cm4gKGMgPT09IFwiXFx1MDAyMFwiIHx8IC8vIHNwYWNlXG5cdFx0ICAgICAgICBjID09PSBcIlxcdTAwMDlcIiB8fCAvLyBob3Jpem9udGFsIHRhYlxuXHRcdCAgICAgICAgYyA9PT0gXCJcXHUwMDBBXCIgfHwgLy8gbmV3IGxpbmVcblx0XHQgICAgICAgIGMgPT09IFwiXFx1MDAwQ1wiIHx8IC8vIGZvcm0gZmVlZFxuXHRcdCAgICAgICAgYyA9PT0gXCJcXHUwMDBEXCIpOyAgLy8gY2FycmlhZ2UgcmV0dXJuXG5cdH1cblxuXHQvKipcblx0ICogZ2V0cyBhIG1lZGlhcXVlcnkgYW5kIHJldHVybnMgYSBib29sZWFuIG9yIGdldHMgYSBjc3MgbGVuZ3RoIGFuZCByZXR1cm5zIGEgbnVtYmVyXG5cdCAqIEBwYXJhbSBjc3MgbWVkaWFxdWVyaWVzIG9yIGNzcyBsZW5ndGhcblx0ICogQHJldHVybnMge2Jvb2xlYW58bnVtYmVyfVxuXHQgKlxuXHQgKiBiYXNlZCBvbjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vam9uYXRoYW50bmVhbC9kYjRmNzcwMDliMTU1ZjA4MzczOFxuXHQgKi9cblx0dmFyIGV2YWxDU1MgPSAoZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgcmVnTGVuZ3RoID0gL14oW1xcZFxcLl0rKShlbXx2d3xweCkkLztcblx0XHR2YXIgcmVwbGFjZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHMsIGluZGV4ID0gMCwgc3RyaW5nID0gYXJnc1swXTtcblx0XHRcdHdoaWxlICgrK2luZGV4IGluIGFyZ3MpIHtcblx0XHRcdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoYXJnc1tpbmRleF0sIGFyZ3NbKytpbmRleF0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHN0cmluZztcblx0XHR9O1xuXG5cdFx0dmFyIGJ1aWxkU3RyID0gbWVtb2l6ZShmdW5jdGlvbihjc3MpIHtcblxuXHRcdFx0cmV0dXJuIFwicmV0dXJuIFwiICsgcmVwbGFjZSgoY3NzIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdC8vIGludGVycHJldCBgYW5kYFxuXHRcdFx0XHQvXFxiYW5kXFxiL2csIFwiJiZcIixcblxuXHRcdFx0XHQvLyBpbnRlcnByZXQgYCxgXG5cdFx0XHRcdC8sL2csIFwifHxcIixcblxuXHRcdFx0XHQvLyBpbnRlcnByZXQgYG1pbi1gIGFzID49XG5cdFx0XHRcdC9taW4tKFthLXotXFxzXSspOi9nLCBcImUuJDE+PVwiLFxuXG5cdFx0XHRcdC8vIGludGVycHJldCBgbWF4LWAgYXMgPD1cblx0XHRcdFx0L21heC0oW2Etei1cXHNdKyk6L2csIFwiZS4kMTw9XCIsXG5cblx0XHRcdFx0Ly9jYWxjIHZhbHVlXG5cdFx0XHRcdC9jYWxjKFteKV0rKS9nLCBcIigkMSlcIixcblxuXHRcdFx0XHQvLyBpbnRlcnByZXQgY3NzIHZhbHVlc1xuXHRcdFx0XHQvKFxcZCtbXFwuXSpbXFxkXSopKFthLXpdKykvZywgXCIoJDEgKiBlLiQyKVwiLFxuXHRcdFx0XHQvL21ha2UgZXZhbCBsZXNzIGV2aWxcblx0XHRcdFx0L14oPyEoZS5bYS16XXxbMC05XFwuJj18PjxcXCtcXC1cXCpcXChcXClcXC9dKSkuKi9pZywgXCJcIlxuXHRcdFx0KSArIFwiO1wiO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGNzcywgbGVuZ3RoKSB7XG5cdFx0XHR2YXIgcGFyc2VkTGVuZ3RoO1xuXHRcdFx0aWYgKCEoY3NzIGluIGNzc0NhY2hlKSkge1xuXHRcdFx0XHRjc3NDYWNoZVtjc3NdID0gZmFsc2U7XG5cdFx0XHRcdGlmIChsZW5ndGggJiYgKHBhcnNlZExlbmd0aCA9IGNzcy5tYXRjaCggcmVnTGVuZ3RoICkpKSB7XG5cdFx0XHRcdFx0Y3NzQ2FjaGVbY3NzXSA9IHBhcnNlZExlbmd0aFsgMSBdICogdW5pdHNbcGFyc2VkTGVuZ3RoWyAyIF1dO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qanNoaW50IGV2aWw6dHJ1ZSAqL1xuXHRcdFx0XHRcdHRyeXtcblx0XHRcdFx0XHRcdGNzc0NhY2hlW2Nzc10gPSBuZXcgRnVuY3Rpb24oXCJlXCIsIGJ1aWxkU3RyKGNzcykpKHVuaXRzKTtcblx0XHRcdFx0XHR9IGNhdGNoKGUpIHt9XG5cdFx0XHRcdFx0Lypqc2hpbnQgZXZpbDpmYWxzZSAqL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3NzQ2FjaGVbY3NzXTtcblx0XHR9O1xuXHR9KSgpO1xuXG5cdHZhciBzZXRSZXNvbHV0aW9uID0gZnVuY3Rpb24oIGNhbmRpZGF0ZSwgc2l6ZXNhdHRyICkge1xuXHRcdGlmICggY2FuZGlkYXRlLncgKSB7IC8vIGggPSBtZWFucyBoZWlnaHQ6IHx8IGRlc2NyaXB0b3IudHlwZSA9PT0gJ2gnIGRvIG5vdCBoYW5kbGUgeWV0Li4uXG5cdFx0XHRjYW5kaWRhdGUuY1dpZHRoID0gcGYuY2FsY0xpc3RMZW5ndGgoIHNpemVzYXR0ciB8fCBcIjEwMHZ3XCIgKTtcblx0XHRcdGNhbmRpZGF0ZS5yZXMgPSBjYW5kaWRhdGUudyAvIGNhbmRpZGF0ZS5jV2lkdGggO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYW5kaWRhdGUucmVzID0gY2FuZGlkYXRlLmQ7XG5cdFx0fVxuXHRcdHJldHVybiBjYW5kaWRhdGU7XG5cdH07XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBvcHRcblx0ICovXG5cdHZhciBwaWN0dXJlZmlsbCA9IGZ1bmN0aW9uKCBvcHQgKSB7XG5cblx0XHRpZiAoIWlzU3VwcG9ydFRlc3RSZWFkeSkge3JldHVybjt9XG5cblx0XHR2YXIgZWxlbWVudHMsIGksIHBsZW47XG5cblx0XHR2YXIgb3B0aW9ucyA9IG9wdCB8fCB7fTtcblxuXHRcdGlmICggb3B0aW9ucy5lbGVtZW50cyAmJiBvcHRpb25zLmVsZW1lbnRzLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0aWYgKCBvcHRpb25zLmVsZW1lbnRzLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSU1HXCIgKSB7XG5cdFx0XHRcdG9wdGlvbnMuZWxlbWVudHMgPSAgWyBvcHRpb25zLmVsZW1lbnRzIF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmVsZW1lbnRzO1xuXHRcdFx0XHRvcHRpb25zLmVsZW1lbnRzID0gIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzIHx8IHBmLnFzYSggKG9wdGlvbnMuY29udGV4dCB8fCBkb2N1bWVudCksICggb3B0aW9ucy5yZWV2YWx1YXRlIHx8IG9wdGlvbnMucmVzZWxlY3QgKSA/IHBmLnNlbCA6IHBmLnNlbFNob3J0ICk7XG5cblx0XHRpZiAoIChwbGVuID0gZWxlbWVudHMubGVuZ3RoKSApIHtcblxuXHRcdFx0cGYuc2V0dXBSdW4oIG9wdGlvbnMgKTtcblx0XHRcdGFscmVhZHlSdW4gPSB0cnVlO1xuXG5cdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIGVsZW1lbnRzXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHBsZW47IGkrKyApIHtcblx0XHRcdFx0cGYuZmlsbEltZyhlbGVtZW50c1sgaSBdLCBvcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0cGYudGVhcmRvd25SdW4oIG9wdGlvbnMgKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIG91dHB1dHMgYSB3YXJuaW5nIGZvciB0aGUgZGV2ZWxvcGVyXG5cdCAqIEBwYXJhbSB7bWVzc2FnZX1cblx0ICogQHR5cGUge0Z1bmN0aW9ufVxuXHQgKi9cblx0d2FybiA9ICggd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuICkgP1xuXHRcdGZ1bmN0aW9uKCBtZXNzYWdlICkge1xuXHRcdFx0Y29uc29sZS53YXJuKCBtZXNzYWdlICk7XG5cdFx0fSA6XG5cdFx0bm9vcFxuXHQ7XG5cblx0aWYgKCAhKGN1clNyY1Byb3AgaW4gaW1hZ2UpICkge1xuXHRcdGN1clNyY1Byb3AgPSBcInNyY1wiO1xuXHR9XG5cblx0Ly8gQWRkIHN1cHBvcnQgZm9yIHN0YW5kYXJkIG1pbWUgdHlwZXMuXG5cdHR5cGVzWyBcImltYWdlL2pwZWdcIiBdID0gdHJ1ZTtcblx0dHlwZXNbIFwiaW1hZ2UvZ2lmXCIgXSA9IHRydWU7XG5cdHR5cGVzWyBcImltYWdlL3BuZ1wiIF0gPSB0cnVlO1xuXG5cdGZ1bmN0aW9uIGRldGVjdFR5cGVTdXBwb3J0KCB0eXBlLCB0eXBlVXJpICkge1xuXHRcdC8vIGJhc2VkIG9uIE1vZGVybml6cidzIGxvc3NsZXNzIGltZy13ZWJwIHRlc3Rcblx0XHQvLyBub3RlOiBhc3luY2hyb25vdXNcblx0XHR2YXIgaW1hZ2UgPSBuZXcgd2luZG93LkltYWdlKCk7XG5cdFx0aW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dHlwZXNbIHR5cGUgXSA9IGZhbHNlO1xuXHRcdFx0cGljdHVyZWZpbGwoKTtcblx0XHR9O1xuXHRcdGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dHlwZXNbIHR5cGUgXSA9IGltYWdlLndpZHRoID09PSAxO1xuXHRcdFx0cGljdHVyZWZpbGwoKTtcblx0XHR9O1xuXHRcdGltYWdlLnNyYyA9IHR5cGVVcmk7XG5cdFx0cmV0dXJuIFwicGVuZGluZ1wiO1xuXHR9XG5cblx0Ly8gdGVzdCBzdmcgc3VwcG9ydFxuXHR0eXBlc1sgXCJpbWFnZS9zdmcreG1sXCIgXSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIFwiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNJbWFnZVwiLCBcIjEuMVwiICk7XG5cblx0LyoqXG5cdCAqIHVwZGF0ZXMgdGhlIGludGVybmFsIHZXIHByb3BlcnR5IHdpdGggdGhlIGN1cnJlbnQgdmlld3BvcnQgd2lkdGggaW4gcHhcblx0ICovXG5cdGZ1bmN0aW9uIHVwZGF0ZU1ldHJpY3MoKSB7XG5cblx0XHRpc1Z3RGlydHkgPSBmYWxzZTtcblx0XHREUFIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcblx0XHRjc3NDYWNoZSA9IHt9O1xuXHRcdHNpemVMZW5ndGhDYWNoZSA9IHt9O1xuXG5cdFx0cGYuRFBSID0gRFBSIHx8IDE7XG5cblx0XHR1bml0cy53aWR0aCA9IE1hdGgubWF4KHdpbmRvdy5pbm5lcldpZHRoIHx8IDAsIGRvY0VsZW0uY2xpZW50V2lkdGgpO1xuXHRcdHVuaXRzLmhlaWdodCA9IE1hdGgubWF4KHdpbmRvdy5pbm5lckhlaWdodCB8fCAwLCBkb2NFbGVtLmNsaWVudEhlaWdodCk7XG5cblx0XHR1bml0cy52dyA9IHVuaXRzLndpZHRoIC8gMTAwO1xuXHRcdHVuaXRzLnZoID0gdW5pdHMuaGVpZ2h0IC8gMTAwO1xuXG5cdFx0ZXZhbElkID0gWyB1bml0cy5oZWlnaHQsIHVuaXRzLndpZHRoLCBEUFIgXS5qb2luKFwiLVwiKTtcblxuXHRcdHVuaXRzLmVtID0gcGYuZ2V0RW1WYWx1ZSgpO1xuXHRcdHVuaXRzLnJlbSA9IHVuaXRzLmVtO1xuXHR9XG5cblx0ZnVuY3Rpb24gY2hvb3NlTG93UmVzKCBsb3dlclZhbHVlLCBoaWdoZXJWYWx1ZSwgZHByVmFsdWUsIGlzQ2FjaGVkICkge1xuXHRcdHZhciBib251c0ZhY3RvciwgdG9vTXVjaCwgYm9udXMsIG1lYW5EZW5zaXR5O1xuXG5cdFx0Ly9leHBlcmltZW50YWxcblx0XHRpZiAoY2ZnLmFsZ29yaXRobSA9PT0gXCJzYXZlRGF0YVwiICl7XG5cdFx0XHRpZiAoIGxvd2VyVmFsdWUgPiAyLjcgKSB7XG5cdFx0XHRcdG1lYW5EZW5zaXR5ID0gZHByVmFsdWUgKyAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG9vTXVjaCA9IGhpZ2hlclZhbHVlIC0gZHByVmFsdWU7XG5cdFx0XHRcdGJvbnVzRmFjdG9yID0gTWF0aC5wb3cobG93ZXJWYWx1ZSAtIDAuNiwgMS41KTtcblxuXHRcdFx0XHRib251cyA9IHRvb011Y2ggKiBib251c0ZhY3RvcjtcblxuXHRcdFx0XHRpZiAoaXNDYWNoZWQpIHtcblx0XHRcdFx0XHRib251cyArPSAwLjEgKiBib251c0ZhY3Rvcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG1lYW5EZW5zaXR5ID0gbG93ZXJWYWx1ZSArIGJvbnVzO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZWFuRGVuc2l0eSA9IChkcHJWYWx1ZSA+IDEpID9cblx0XHRcdFx0TWF0aC5zcXJ0KGxvd2VyVmFsdWUgKiBoaWdoZXJWYWx1ZSkgOlxuXHRcdFx0XHRsb3dlclZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBtZWFuRGVuc2l0eSA+IGRwclZhbHVlO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXBwbHlCZXN0Q2FuZGlkYXRlKCBpbWcgKSB7XG5cdFx0dmFyIHNyY1NldENhbmRpZGF0ZXM7XG5cdFx0dmFyIG1hdGNoaW5nU2V0ID0gcGYuZ2V0U2V0KCBpbWcgKTtcblx0XHR2YXIgZXZhbHVhdGVkID0gZmFsc2U7XG5cdFx0aWYgKCBtYXRjaGluZ1NldCAhPT0gXCJwZW5kaW5nXCIgKSB7XG5cdFx0XHRldmFsdWF0ZWQgPSBldmFsSWQ7XG5cdFx0XHRpZiAoIG1hdGNoaW5nU2V0ICkge1xuXHRcdFx0XHRzcmNTZXRDYW5kaWRhdGVzID0gcGYuc2V0UmVzKCBtYXRjaGluZ1NldCApO1xuXHRcdFx0XHRwZi5hcHBseVNldENhbmRpZGF0ZSggc3JjU2V0Q2FuZGlkYXRlcywgaW1nICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGltZ1sgcGYubnMgXS5ldmFsZWQgPSBldmFsdWF0ZWQ7XG5cdH1cblxuXHRmdW5jdGlvbiBhc2NlbmRpbmdTb3J0KCBhLCBiICkge1xuXHRcdHJldHVybiBhLnJlcyAtIGIucmVzO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U3JjVG9DdXIoIGltZywgc3JjLCBzZXQgKSB7XG5cdFx0dmFyIGNhbmRpZGF0ZTtcblx0XHRpZiAoICFzZXQgJiYgc3JjICkge1xuXHRcdFx0c2V0ID0gaW1nWyBwZi5ucyBdLnNldHM7XG5cdFx0XHRzZXQgPSBzZXQgJiYgc2V0W3NldC5sZW5ndGggLSAxXTtcblx0XHR9XG5cblx0XHRjYW5kaWRhdGUgPSBnZXRDYW5kaWRhdGVGb3JTcmMoc3JjLCBzZXQpO1xuXG5cdFx0aWYgKCBjYW5kaWRhdGUgKSB7XG5cdFx0XHRzcmMgPSBwZi5tYWtlVXJsKHNyYyk7XG5cdFx0XHRpbWdbIHBmLm5zIF0uY3VyU3JjID0gc3JjO1xuXHRcdFx0aW1nWyBwZi5ucyBdLmN1ckNhbiA9IGNhbmRpZGF0ZTtcblxuXHRcdFx0aWYgKCAhY2FuZGlkYXRlLnJlcyApIHtcblx0XHRcdFx0c2V0UmVzb2x1dGlvbiggY2FuZGlkYXRlLCBjYW5kaWRhdGUuc2V0LnNpemVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYW5kaWRhdGU7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRDYW5kaWRhdGVGb3JTcmMoIHNyYywgc2V0ICkge1xuXHRcdHZhciBpLCBjYW5kaWRhdGUsIGNhbmRpZGF0ZXM7XG5cdFx0aWYgKCBzcmMgJiYgc2V0ICkge1xuXHRcdFx0Y2FuZGlkYXRlcyA9IHBmLnBhcnNlU2V0KCBzZXQgKTtcblx0XHRcdHNyYyA9IHBmLm1ha2VVcmwoc3JjKTtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBzcmMgPT09IHBmLm1ha2VVcmwoY2FuZGlkYXRlc1sgaSBdLnVybCkgKSB7XG5cdFx0XHRcdFx0Y2FuZGlkYXRlID0gY2FuZGlkYXRlc1sgaSBdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYW5kaWRhdGU7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRBbGxTb3VyY2VFbGVtZW50cyggcGljdHVyZSwgY2FuZGlkYXRlcyApIHtcblx0XHR2YXIgaSwgbGVuLCBzb3VyY2UsIHNyY3NldDtcblxuXHRcdC8vIFNQRUMgbWlzbWF0Y2ggaW50ZW5kZWQgZm9yIHNpemUgYW5kIHBlcmY6XG5cdFx0Ly8gYWN0dWFsbHkgb25seSBzb3VyY2UgZWxlbWVudHMgcHJlY2VkaW5nIHRoZSBpbWcgc2hvdWxkIGJlIHVzZWRcblx0XHQvLyBhbHNvIG5vdGU6IGRvbid0IHVzZSBxc2EgaGVyZSwgYmVjYXVzZSBJRTggc29tZXRpbWVzIGRvZXNuJ3QgbGlrZSBzb3VyY2UgYXMgdGhlIGtleSBwYXJ0IGluIGEgc2VsZWN0b3Jcblx0XHR2YXIgc291cmNlcyA9IHBpY3R1cmUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwic291cmNlXCIgKTtcblxuXHRcdGZvciAoIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0c291cmNlID0gc291cmNlc1sgaSBdO1xuXHRcdFx0c291cmNlWyBwZi5ucyBdID0gdHJ1ZTtcblx0XHRcdHNyY3NldCA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUoIFwic3Jjc2V0XCIgKTtcblxuXHRcdFx0Ly8gaWYgc291cmNlIGRvZXMgbm90IGhhdmUgYSBzcmNzZXQgYXR0cmlidXRlLCBza2lwXG5cdFx0XHRpZiAoIHNyY3NldCApIHtcblx0XHRcdFx0Y2FuZGlkYXRlcy5wdXNoKCB7XG5cdFx0XHRcdFx0c3Jjc2V0OiBzcmNzZXQsXG5cdFx0XHRcdFx0bWVkaWE6IHNvdXJjZS5nZXRBdHRyaWJ1dGUoIFwibWVkaWFcIiApLFxuXHRcdFx0XHRcdHR5cGU6IHNvdXJjZS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICksXG5cdFx0XHRcdFx0c2l6ZXM6IHNvdXJjZS5nZXRBdHRyaWJ1dGUoIFwic2l6ZXNcIiApXG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3Jjc2V0IFBhcnNlclxuXHQgKiBCeSBBbGV4IEJlbGwgfCAgTUlUIExpY2Vuc2Vcblx0ICpcblx0ICogQHJldHVybnMgQXJyYXkgW3t1cmw6IF8sIGQ6IF8sIHc6IF8sIGg6Xywgc2V0Ol8oPz8/Pyl9LCAuLi5dXG5cdCAqXG5cdCAqIEJhc2VkIHN1cGVyIGR1cGVyIGNsb3NlbHkgb24gdGhlIHJlZmVyZW5jZSBhbGdvcml0aG0gYXQ6XG5cdCAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNwYXJzZS1hLXNyY3NldC1hdHRyaWJ1dGVcblx0ICovXG5cblx0Ly8gMS4gTGV0IGlucHV0IGJlIHRoZSB2YWx1ZSBwYXNzZWQgdG8gdGhpcyBhbGdvcml0aG0uXG5cdC8vIChUTy1ETyA6IEV4cGxhaW4gd2hhdCBcInNldFwiIGFyZ3VtZW50IGlzIGhlcmUuIE1heWJlIGNob29zZSBhIG1vcmVcblx0Ly8gZGVzY3JpcHRpdmUgJiBtb3JlIHNlYXJjaGFibGUgbmFtZS4gIFNpbmNlIHBhc3NpbmcgdGhlIFwic2V0XCIgaW4gcmVhbGx5IGhhc1xuXHQvLyBub3RoaW5nIHRvIGRvIHdpdGggcGFyc2luZyBwcm9wZXIsIEkgd291bGQgcHJlZmVyIHRoaXMgYXNzaWdubWVudCBldmVudHVhbGx5XG5cdC8vIGdvIGluIGFuIGV4dGVybmFsIGZuLilcblx0ZnVuY3Rpb24gcGFyc2VTcmNzZXQoaW5wdXQsIHNldCkge1xuXG5cdFx0ZnVuY3Rpb24gY29sbGVjdENoYXJhY3RlcnMocmVnRXgpIHtcblx0XHRcdHZhciBjaGFycyxcblx0XHRcdCAgICBtYXRjaCA9IHJlZ0V4LmV4ZWMoaW5wdXQuc3Vic3RyaW5nKHBvcykpO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNoYXJzID0gbWF0Y2hbIDAgXTtcblx0XHRcdFx0cG9zICs9IGNoYXJzLmxlbmd0aDtcblx0XHRcdFx0cmV0dXJuIGNoYXJzO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgdXJsLFxuXHRcdCAgICBkZXNjcmlwdG9ycyxcblx0XHQgICAgY3VycmVudERlc2NyaXB0b3IsXG5cdFx0ICAgIHN0YXRlLFxuXHRcdCAgICBjLFxuXG5cdFx0ICAgIC8vIDIuIExldCBwb3NpdGlvbiBiZSBhIHBvaW50ZXIgaW50byBpbnB1dCwgaW5pdGlhbGx5IHBvaW50aW5nIGF0IHRoZSBzdGFydFxuXHRcdCAgICAvLyAgICBvZiB0aGUgc3RyaW5nLlxuXHRcdCAgICBwb3MgPSAwLFxuXG5cdFx0ICAgIC8vIDMuIExldCBjYW5kaWRhdGVzIGJlIGFuIGluaXRpYWxseSBlbXB0eSBzb3VyY2Ugc2V0LlxuXHRcdCAgICBjYW5kaWRhdGVzID0gW107XG5cblx0XHQvKipcblx0XHQqIEFkZHMgZGVzY3JpcHRvciBwcm9wZXJ0aWVzIHRvIGEgY2FuZGlkYXRlLCBwdXNoZXMgdG8gdGhlIGNhbmRpZGF0ZXMgYXJyYXlcblx0XHQqIEByZXR1cm4gdW5kZWZpbmVkXG5cdFx0Ki9cblx0XHQvLyAoRGVjbGFyZWQgb3V0c2lkZSBvZiB0aGUgd2hpbGUgbG9vcCBzbyB0aGF0IGl0J3Mgb25seSBjcmVhdGVkIG9uY2UuXG5cdFx0Ly8gKFRoaXMgZm4gaXMgZGVmaW5lZCBiZWZvcmUgaXQgaXMgdXNlZCwgaW4gb3JkZXIgdG8gcGFzcyBKU0hJTlQuXG5cdFx0Ly8gVW5mb3J0dW5hdGVseSB0aGlzIGJyZWFrcyB0aGUgc2VxdWVuY2luZyBvZiB0aGUgc3BlYyBjb21tZW50cy4gOi8gKVxuXHRcdGZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRvcnMoKSB7XG5cblx0XHRcdC8vIDkuIERlc2NyaXB0b3IgcGFyc2VyOiBMZXQgZXJyb3IgYmUgbm8uXG5cdFx0XHR2YXIgcEVycm9yID0gZmFsc2UsXG5cblx0XHRcdC8vIDEwLiBMZXQgd2lkdGggYmUgYWJzZW50LlxuXHRcdFx0Ly8gMTEuIExldCBkZW5zaXR5IGJlIGFic2VudC5cblx0XHRcdC8vIDEyLiBMZXQgZnV0dXJlLWNvbXBhdC1oIGJlIGFic2VudC4gKFdlJ3JlIGltcGxlbWVudGluZyBpdCBub3cgYXMgaClcblx0XHRcdCAgICB3LCBkLCBoLCBpLFxuXHRcdFx0ICAgIGNhbmRpZGF0ZSA9IHt9LFxuXHRcdFx0ICAgIGRlc2MsIGxhc3RDaGFyLCB2YWx1ZSwgaW50VmFsLCBmbG9hdFZhbDtcblxuXHRcdFx0Ly8gMTMuIEZvciBlYWNoIGRlc2NyaXB0b3IgaW4gZGVzY3JpcHRvcnMsIHJ1biB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHN0ZXBzXG5cdFx0XHQvLyBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDpcblx0XHRcdGZvciAoaSA9IDAgOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0ZGVzYyA9IGRlc2NyaXB0b3JzWyBpIF07XG5cblx0XHRcdFx0bGFzdENoYXIgPSBkZXNjWyBkZXNjLmxlbmd0aCAtIDEgXTtcblx0XHRcdFx0dmFsdWUgPSBkZXNjLnN1YnN0cmluZygwLCBkZXNjLmxlbmd0aCAtIDEpO1xuXHRcdFx0XHRpbnRWYWwgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuXHRcdFx0XHRmbG9hdFZhbCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBkZXNjcmlwdG9yIGNvbnNpc3RzIG9mIGEgdmFsaWQgbm9uLW5lZ2F0aXZlIGludGVnZXIgZm9sbG93ZWQgYnlcblx0XHRcdFx0Ly8gYSBVKzAwNzcgTEFUSU4gU01BTEwgTEVUVEVSIFcgY2hhcmFjdGVyXG5cdFx0XHRcdGlmIChyZWdleE5vbk5lZ2F0aXZlSW50ZWdlci50ZXN0KHZhbHVlKSAmJiAobGFzdENoYXIgPT09IFwid1wiKSkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgd2lkdGggYW5kIGRlbnNpdHkgYXJlIG5vdCBib3RoIGFic2VudCwgdGhlbiBsZXQgZXJyb3IgYmUgeWVzLlxuXHRcdFx0XHRcdGlmICh3IHx8IGQpIHtwRXJyb3IgPSB0cnVlO31cblxuXHRcdFx0XHRcdC8vIEFwcGx5IHRoZSBydWxlcyBmb3IgcGFyc2luZyBub24tbmVnYXRpdmUgaW50ZWdlcnMgdG8gdGhlIGRlc2NyaXB0b3IuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBsZXQgZXJyb3IgYmUgeWVzLlxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgbGV0IHdpZHRoIGJlIHRoZSByZXN1bHQuXG5cdFx0XHRcdFx0aWYgKGludFZhbCA9PT0gMCkge3BFcnJvciA9IHRydWU7fSBlbHNlIHt3ID0gaW50VmFsO31cblxuXHRcdFx0XHQvLyBJZiB0aGUgZGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIHZhbGlkIGZsb2F0aW5nLXBvaW50IG51bWJlciBmb2xsb3dlZCBieVxuXHRcdFx0XHQvLyBhIFUrMDA3OCBMQVRJTiBTTUFMTCBMRVRURVIgWCBjaGFyYWN0ZXJcblx0XHRcdFx0fSBlbHNlIGlmIChyZWdleEZsb2F0aW5nUG9pbnQudGVzdCh2YWx1ZSkgJiYgKGxhc3RDaGFyID09PSBcInhcIikpIHtcblxuXHRcdFx0XHRcdC8vIElmIHdpZHRoLCBkZW5zaXR5IGFuZCBmdXR1cmUtY29tcGF0LWggYXJlIG5vdCBhbGwgYWJzZW50LCB0aGVuIGxldCBlcnJvclxuXHRcdFx0XHRcdC8vIGJlIHllcy5cblx0XHRcdFx0XHRpZiAodyB8fCBkIHx8IGgpIHtwRXJyb3IgPSB0cnVlO31cblxuXHRcdFx0XHRcdC8vIEFwcGx5IHRoZSBydWxlcyBmb3IgcGFyc2luZyBmbG9hdGluZy1wb2ludCBudW1iZXIgdmFsdWVzIHRvIHRoZSBkZXNjcmlwdG9yLlxuXHRcdFx0XHRcdC8vIElmIHRoZSByZXN1bHQgaXMgbGVzcyB0aGFuIHplcm8sIGxldCBlcnJvciBiZSB5ZXMuIE90aGVyd2lzZSwgbGV0IGRlbnNpdHlcblx0XHRcdFx0XHQvLyBiZSB0aGUgcmVzdWx0LlxuXHRcdFx0XHRcdGlmIChmbG9hdFZhbCA8IDApIHtwRXJyb3IgPSB0cnVlO30gZWxzZSB7ZCA9IGZsb2F0VmFsO31cblxuXHRcdFx0XHQvLyBJZiB0aGUgZGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIHZhbGlkIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGZvbGxvd2VkIGJ5XG5cdFx0XHRcdC8vIGEgVSswMDY4IExBVElOIFNNQUxMIExFVFRFUiBIIGNoYXJhY3RlclxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlZ2V4Tm9uTmVnYXRpdmVJbnRlZ2VyLnRlc3QodmFsdWUpICYmIChsYXN0Q2hhciA9PT0gXCJoXCIpKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBoZWlnaHQgYW5kIGRlbnNpdHkgYXJlIG5vdCBib3RoIGFic2VudCwgdGhlbiBsZXQgZXJyb3IgYmUgeWVzLlxuXHRcdFx0XHRcdGlmIChoIHx8IGQpIHtwRXJyb3IgPSB0cnVlO31cblxuXHRcdFx0XHRcdC8vIEFwcGx5IHRoZSBydWxlcyBmb3IgcGFyc2luZyBub24tbmVnYXRpdmUgaW50ZWdlcnMgdG8gdGhlIGRlc2NyaXB0b3IuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBsZXQgZXJyb3IgYmUgeWVzLiBPdGhlcndpc2UsIGxldCBmdXR1cmUtY29tcGF0LWhcblx0XHRcdFx0XHQvLyBiZSB0aGUgcmVzdWx0LlxuXHRcdFx0XHRcdGlmIChpbnRWYWwgPT09IDApIHtwRXJyb3IgPSB0cnVlO30gZWxzZSB7aCA9IGludFZhbDt9XG5cblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSwgTGV0IGVycm9yIGJlIHllcy5cblx0XHRcdFx0fSBlbHNlIHtwRXJyb3IgPSB0cnVlO31cblx0XHRcdH0gLy8gKGNsb3NlIHN0ZXAgMTMgZm9yIGxvb3ApXG5cblx0XHRcdC8vIDE1LiBJZiBlcnJvciBpcyBzdGlsbCBubywgdGhlbiBhcHBlbmQgYSBuZXcgaW1hZ2Ugc291cmNlIHRvIGNhbmRpZGF0ZXMgd2hvc2Vcblx0XHRcdC8vIFVSTCBpcyB1cmwsIGFzc29jaWF0ZWQgd2l0aCBhIHdpZHRoIHdpZHRoIGlmIG5vdCBhYnNlbnQgYW5kIGEgcGl4ZWxcblx0XHRcdC8vIGRlbnNpdHkgZGVuc2l0eSBpZiBub3QgYWJzZW50LiBPdGhlcndpc2UsIHRoZXJlIGlzIGEgcGFyc2UgZXJyb3IuXG5cdFx0XHRpZiAoIXBFcnJvcikge1xuXHRcdFx0XHRjYW5kaWRhdGUudXJsID0gdXJsO1xuXG5cdFx0XHRcdGlmICh3KSB7IGNhbmRpZGF0ZS53ID0gdzt9XG5cdFx0XHRcdGlmIChkKSB7IGNhbmRpZGF0ZS5kID0gZDt9XG5cdFx0XHRcdGlmIChoKSB7IGNhbmRpZGF0ZS5oID0gaDt9XG5cdFx0XHRcdGlmICghaCAmJiAhZCAmJiAhdykge2NhbmRpZGF0ZS5kID0gMTt9XG5cdFx0XHRcdGlmIChjYW5kaWRhdGUuZCA9PT0gMSkge3NldC5oYXMxeCA9IHRydWU7fVxuXHRcdFx0XHRjYW5kaWRhdGUuc2V0ID0gc2V0O1xuXG5cdFx0XHRcdGNhbmRpZGF0ZXMucHVzaChjYW5kaWRhdGUpO1xuXHRcdFx0fVxuXHRcdH0gLy8gKGNsb3NlIHBhcnNlRGVzY3JpcHRvcnMgZm4pXG5cblx0XHQvKipcblx0XHQqIFRva2VuaXplcyBkZXNjcmlwdG9yIHByb3BlcnRpZXMgcHJpb3IgdG8gcGFyc2luZ1xuXHRcdCogUmV0dXJucyB1bmRlZmluZWQuXG5cdFx0KiAoQWdhaW4sIHRoaXMgZm4gaXMgZGVmaW5lZCBiZWZvcmUgaXQgaXMgdXNlZCwgaW4gb3JkZXIgdG8gcGFzcyBKU0hJTlQuXG5cdFx0KiBVbmZvcnR1bmF0ZWx5IHRoaXMgYnJlYWtzIHRoZSBsb2dpY2FsIHNlcXVlbmNpbmcgb2YgdGhlIHNwZWMgY29tbWVudHMuIDovIClcblx0XHQqL1xuXHRcdGZ1bmN0aW9uIHRva2VuaXplKCkge1xuXG5cdFx0XHQvLyA4LjEuIERlc2NyaXB0b3IgdG9rZW5pc2VyOiBTa2lwIHdoaXRlc3BhY2Vcblx0XHRcdGNvbGxlY3RDaGFyYWN0ZXJzKHJlZ2V4TGVhZGluZ1NwYWNlcyk7XG5cblx0XHRcdC8vIDguMi4gTGV0IGN1cnJlbnQgZGVzY3JpcHRvciBiZSB0aGUgZW1wdHkgc3RyaW5nLlxuXHRcdFx0Y3VycmVudERlc2NyaXB0b3IgPSBcIlwiO1xuXG5cdFx0XHQvLyA4LjMuIExldCBzdGF0ZSBiZSBpbiBkZXNjcmlwdG9yLlxuXHRcdFx0c3RhdGUgPSBcImluIGRlc2NyaXB0b3JcIjtcblxuXHRcdFx0d2hpbGUgKHRydWUpIHtcblxuXHRcdFx0XHQvLyA4LjQuIExldCBjIGJlIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24uXG5cdFx0XHRcdGMgPSBpbnB1dC5jaGFyQXQocG9zKTtcblxuXHRcdFx0XHQvLyAgRG8gdGhlIGZvbGxvd2luZyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHN0YXRlLlxuXHRcdFx0XHQvLyAgRm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgc3RlcCwgXCJFT0ZcIiBpcyBhIHNwZWNpYWwgY2hhcmFjdGVyIHJlcHJlc2VudGluZ1xuXHRcdFx0XHQvLyAgdGhhdCBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQuXG5cblx0XHRcdFx0Ly8gSW4gZGVzY3JpcHRvclxuXHRcdFx0XHRpZiAoc3RhdGUgPT09IFwiaW4gZGVzY3JpcHRvclwiKSB7XG5cdFx0XHRcdFx0Ly8gRG8gdGhlIGZvbGxvd2luZywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjOlxuXG5cdFx0XHRcdCAgLy8gU3BhY2UgY2hhcmFjdGVyXG5cdFx0XHRcdCAgLy8gSWYgY3VycmVudCBkZXNjcmlwdG9yIGlzIG5vdCBlbXB0eSwgYXBwZW5kIGN1cnJlbnQgZGVzY3JpcHRvciB0b1xuXHRcdFx0XHQgIC8vIGRlc2NyaXB0b3JzIGFuZCBsZXQgY3VycmVudCBkZXNjcmlwdG9yIGJlIHRoZSBlbXB0eSBzdHJpbmcuXG5cdFx0XHRcdCAgLy8gU2V0IHN0YXRlIHRvIGFmdGVyIGRlc2NyaXB0b3IuXG5cdFx0XHRcdFx0aWYgKGlzU3BhY2UoYykpIHtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50RGVzY3JpcHRvcikge1xuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdG9ycy5wdXNoKGN1cnJlbnREZXNjcmlwdG9yKTtcblx0XHRcdFx0XHRcdFx0Y3VycmVudERlc2NyaXB0b3IgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRzdGF0ZSA9IFwiYWZ0ZXIgZGVzY3JpcHRvclwiO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVSswMDJDIENPTU1BICgsKVxuXHRcdFx0XHRcdC8vIEFkdmFuY2UgcG9zaXRpb24gdG8gdGhlIG5leHQgY2hhcmFjdGVyIGluIGlucHV0LiBJZiBjdXJyZW50IGRlc2NyaXB0b3Jcblx0XHRcdFx0XHQvLyBpcyBub3QgZW1wdHksIGFwcGVuZCBjdXJyZW50IGRlc2NyaXB0b3IgdG8gZGVzY3JpcHRvcnMuIEp1bXAgdG8gdGhlIHN0ZXBcblx0XHRcdFx0XHQvLyBsYWJlbGVkIGRlc2NyaXB0b3IgcGFyc2VyLlxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYyA9PT0gXCIsXCIpIHtcblx0XHRcdFx0XHRcdHBvcyArPSAxO1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnREZXNjcmlwdG9yKSB7XG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0b3JzLnB1c2goY3VycmVudERlc2NyaXB0b3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cGFyc2VEZXNjcmlwdG9ycygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0Ly8gVSswMDI4IExFRlQgUEFSRU5USEVTSVMgKCgpXG5cdFx0XHRcdFx0Ly8gQXBwZW5kIGMgdG8gY3VycmVudCBkZXNjcmlwdG9yLiBTZXQgc3RhdGUgdG8gaW4gcGFyZW5zLlxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYyA9PT0gXCJcXHUwMDI4XCIpIHtcblx0XHRcdFx0XHRcdGN1cnJlbnREZXNjcmlwdG9yID0gY3VycmVudERlc2NyaXB0b3IgKyBjO1xuXHRcdFx0XHRcdFx0c3RhdGUgPSBcImluIHBhcmVuc1wiO1xuXG5cdFx0XHRcdFx0Ly8gRU9GXG5cdFx0XHRcdFx0Ly8gSWYgY3VycmVudCBkZXNjcmlwdG9yIGlzIG5vdCBlbXB0eSwgYXBwZW5kIGN1cnJlbnQgZGVzY3JpcHRvciB0b1xuXHRcdFx0XHRcdC8vIGRlc2NyaXB0b3JzLiBKdW1wIHRvIHRoZSBzdGVwIGxhYmVsZWQgZGVzY3JpcHRvciBwYXJzZXIuXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudERlc2NyaXB0b3IpIHtcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRvcnMucHVzaChjdXJyZW50RGVzY3JpcHRvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwYXJzZURlc2NyaXB0b3JzKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlXG5cdFx0XHRcdFx0Ly8gQXBwZW5kIGMgdG8gY3VycmVudCBkZXNjcmlwdG9yLlxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RGVzY3JpcHRvciA9IGN1cnJlbnREZXNjcmlwdG9yICsgYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdC8vIChlbmQgXCJpbiBkZXNjcmlwdG9yXCJcblxuXHRcdFx0XHQvLyBJbiBwYXJlbnNcblx0XHRcdFx0fSBlbHNlIGlmIChzdGF0ZSA9PT0gXCJpbiBwYXJlbnNcIikge1xuXG5cdFx0XHRcdFx0Ly8gVSswMDI5IFJJR0hUIFBBUkVOVEhFU0lTICgpKVxuXHRcdFx0XHRcdC8vIEFwcGVuZCBjIHRvIGN1cnJlbnQgZGVzY3JpcHRvci4gU2V0IHN0YXRlIHRvIGluIGRlc2NyaXB0b3IuXG5cdFx0XHRcdFx0aWYgKGMgPT09IFwiKVwiKSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RGVzY3JpcHRvciA9IGN1cnJlbnREZXNjcmlwdG9yICsgYztcblx0XHRcdFx0XHRcdHN0YXRlID0gXCJpbiBkZXNjcmlwdG9yXCI7XG5cblx0XHRcdFx0XHQvLyBFT0Zcblx0XHRcdFx0XHQvLyBBcHBlbmQgY3VycmVudCBkZXNjcmlwdG9yIHRvIGRlc2NyaXB0b3JzLiBKdW1wIHRvIHRoZSBzdGVwIGxhYmVsZWRcblx0XHRcdFx0XHQvLyBkZXNjcmlwdG9yIHBhcnNlci5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGMgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdGRlc2NyaXB0b3JzLnB1c2goY3VycmVudERlc2NyaXB0b3IpO1xuXHRcdFx0XHRcdFx0cGFyc2VEZXNjcmlwdG9ycygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZVxuXHRcdFx0XHRcdC8vIEFwcGVuZCBjIHRvIGN1cnJlbnQgZGVzY3JpcHRvci5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y3VycmVudERlc2NyaXB0b3IgPSBjdXJyZW50RGVzY3JpcHRvciArIGM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFmdGVyIGRlc2NyaXB0b3Jcblx0XHRcdFx0fSBlbHNlIGlmIChzdGF0ZSA9PT0gXCJhZnRlciBkZXNjcmlwdG9yXCIpIHtcblxuXHRcdFx0XHRcdC8vIERvIHRoZSBmb2xsb3dpbmcsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYzpcblx0XHRcdFx0XHQvLyBTcGFjZSBjaGFyYWN0ZXI6IFN0YXkgaW4gdGhpcyBzdGF0ZS5cblx0XHRcdFx0XHRpZiAoaXNTcGFjZShjKSkge1xuXG5cdFx0XHRcdFx0Ly8gRU9GOiBKdW1wIHRvIHRoZSBzdGVwIGxhYmVsZWQgZGVzY3JpcHRvciBwYXJzZXIuXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHRwYXJzZURlc2NyaXB0b3JzKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlXG5cdFx0XHRcdFx0Ly8gU2V0IHN0YXRlIHRvIGluIGRlc2NyaXB0b3IuIFNldCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGluIGlucHV0LlxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdGF0ZSA9IFwiaW4gZGVzY3JpcHRvclwiO1xuXHRcdFx0XHRcdFx0cG9zIC09IDE7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZHZhbmNlIHBvc2l0aW9uIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiBpbnB1dC5cblx0XHRcdFx0cG9zICs9IDE7XG5cblx0XHRcdC8vIFJlcGVhdCB0aGlzIHN0ZXAuXG5cdFx0XHR9IC8vIChjbG9zZSB3aGlsZSB0cnVlIGxvb3ApXG5cdFx0fVxuXG5cdFx0Ly8gNC4gU3BsaXR0aW5nIGxvb3A6IENvbGxlY3QgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNwYWNlXG5cdFx0Ly8gICAgY2hhcmFjdGVycyBvciBVKzAwMkMgQ09NTUEgY2hhcmFjdGVycy4gSWYgYW55IFUrMDAyQyBDT01NQSBjaGFyYWN0ZXJzXG5cdFx0Ly8gICAgd2VyZSBjb2xsZWN0ZWQsIHRoYXQgaXMgYSBwYXJzZSBlcnJvci5cblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0Y29sbGVjdENoYXJhY3RlcnMocmVnZXhMZWFkaW5nQ29tbWFzT3JTcGFjZXMpO1xuXG5cdFx0XHQvLyA1LiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHJldHVybiBjYW5kaWRhdGVzIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy5cblx0XHRcdGlmIChwb3MgPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIGNhbmRpZGF0ZXM7IC8vICh3ZSdyZSBkb25lLCB0aGlzIGlzIHRoZSBzb2xlIHJldHVybiBwYXRoKVxuXHRcdFx0fVxuXG5cdFx0XHQvLyA2LiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBub3Qgc3BhY2UgY2hhcmFjdGVycyxcblx0XHRcdC8vICAgIGFuZCBsZXQgdGhhdCBiZSB1cmwuXG5cdFx0XHR1cmwgPSBjb2xsZWN0Q2hhcmFjdGVycyhyZWdleExlYWRpbmdOb3RTcGFjZXMpO1xuXG5cdFx0XHQvLyA3LiBMZXQgZGVzY3JpcHRvcnMgYmUgYSBuZXcgZW1wdHkgbGlzdC5cblx0XHRcdGRlc2NyaXB0b3JzID0gW107XG5cblx0XHRcdC8vIDguIElmIHVybCBlbmRzIHdpdGggYSBVKzAwMkMgQ09NTUEgY2hhcmFjdGVyICgsKSwgZm9sbG93IHRoZXNlIHN1YnN0ZXBzOlxuXHRcdFx0Ly9cdFx0KDEpLiBSZW1vdmUgYWxsIHRyYWlsaW5nIFUrMDAyQyBDT01NQSBjaGFyYWN0ZXJzIGZyb20gdXJsLiBJZiB0aGlzIHJlbW92ZWRcblx0XHRcdC8vICAgICAgICAgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIsIHRoYXQgaXMgYSBwYXJzZSBlcnJvci5cblx0XHRcdGlmICh1cmwuc2xpY2UoLTEpID09PSBcIixcIikge1xuXHRcdFx0XHR1cmwgPSB1cmwucmVwbGFjZShyZWdleFRyYWlsaW5nQ29tbWFzLCBcIlwiKTtcblx0XHRcdFx0Ly8gKEp1bXAgYWhlYWQgdG8gc3RlcCA5IHRvIHNraXAgdG9rZW5pemF0aW9uIGFuZCBqdXN0IHB1c2ggdGhlIGNhbmRpZGF0ZSkuXG5cdFx0XHRcdHBhcnNlRGVzY3JpcHRvcnMoKTtcblxuXHRcdFx0Ly9cdE90aGVyd2lzZSwgZm9sbG93IHRoZXNlIHN1YnN0ZXBzOlxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG9rZW5pemUoKTtcblx0XHRcdH0gLy8gKGNsb3NlIGVsc2Ugb2Ygc3RlcCA4KVxuXG5cdFx0Ly8gMTYuIFJldHVybiB0byB0aGUgc3RlcCBsYWJlbGVkIHNwbGl0dGluZyBsb29wLlxuXHRcdH0gLy8gKENsb3NlIG9mIGJpZyB3aGlsZSBsb29wLilcblx0fVxuXG5cdC8qXG5cdCAqIFNpemVzIFBhcnNlclxuXHQgKlxuXHQgKiBCeSBBbGV4IEJlbGwgfCAgTUlUIExpY2Vuc2Vcblx0ICpcblx0ICogTm9uLXN0cmljdCBidXQgYWNjdXJhdGUgYW5kIGxpZ2h0d2VpZ2h0IEpTIFBhcnNlciBmb3IgdGhlIHN0cmluZyB2YWx1ZSA8aW1nIHNpemVzPVwiaGVyZVwiPlxuXHQgKlxuXHQgKiBSZWZlcmVuY2UgYWxnb3JpdGhtIGF0OlxuXHQgKiBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjcGFyc2UtYS1zaXplcy1hdHRyaWJ1dGVcblx0ICpcblx0ICogTW9zdCBjb21tZW50cyBhcmUgY29waWVkIGluIGRpcmVjdGx5IGZyb20gdGhlIHNwZWNcblx0ICogKGV4Y2VwdCBmb3IgY29tbWVudHMgaW4gcGFyZW5zKS5cblx0ICpcblx0ICogR3JhbW1hciBpczpcblx0ICogPHNvdXJjZS1zaXplLWxpc3Q+ID0gPHNvdXJjZS1zaXplPiMgWyAsIDxzb3VyY2Utc2l6ZS12YWx1ZT4gXT8gfCA8c291cmNlLXNpemUtdmFsdWU+XG5cdCAqIDxzb3VyY2Utc2l6ZT4gPSA8bWVkaWEtY29uZGl0aW9uPiA8c291cmNlLXNpemUtdmFsdWU+XG5cdCAqIDxzb3VyY2Utc2l6ZS12YWx1ZT4gPSA8bGVuZ3RoPlxuXHQgKiBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9lbWJlZGRlZC1jb250ZW50Lmh0bWwjYXR0ci1pbWctc2l6ZXNcblx0ICpcblx0ICogRS5nLiBcIihtYXgtd2lkdGg6IDMwZW0pIDEwMHZ3LCAobWF4LXdpZHRoOiA1MGVtKSA3MHZ3LCAxMDB2d1wiXG5cdCAqIG9yIFwiKG1pbi13aWR0aDogMzBlbSksIGNhbGMoMzB2dyAtIDE1cHgpXCIgb3IganVzdCBcIjMwdndcIlxuXHQgKlxuXHQgKiBSZXR1cm5zIHRoZSBmaXJzdCB2YWxpZCA8Y3NzLWxlbmd0aD4gd2l0aCBhIG1lZGlhIGNvbmRpdGlvbiB0aGF0IGV2YWx1YXRlcyB0byB0cnVlLFxuXHQgKiBvciBcIjEwMHZ3XCIgaWYgYWxsIHZhbGlkIG1lZGlhIGNvbmRpdGlvbnMgZXZhbHVhdGUgdG8gZmFsc2UuXG5cdCAqXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIHBhcnNlU2l6ZXMoc3RyVmFsdWUpIHtcblxuXHRcdC8vIChQZXJjZW50YWdlIENTUyBsZW5ndGhzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIGNhc2UsIHRvIGF2b2lkIGNvbmZ1c2lvbjpcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjdmFsaWQtc291cmNlLXNpemUtbGlzdFxuXHRcdC8vIENTUyBhbGxvd3MgYSBzaW5nbGUgb3B0aW9uYWwgcGx1cyBvciBtaW51cyBzaWduOlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIvc3luZGF0YS5odG1sI251bWJlcnNcblx0XHQvLyBDU1MgaXMgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZTpcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyL3N5bmRhdGEuaHRtbCNjaGFyYWN0ZXJzIClcblx0XHQvLyBTcGVjIGFsbG93cyBleHBvbmVudGlhbCBub3RhdGlvbiBmb3IgPG51bWJlcj4gdHlwZTpcblx0XHQvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtdmFsdWVzLyNudW1iZXJzXG5cdFx0dmFyIHJlZ2V4Q3NzTGVuZ3RoV2l0aFVuaXRzID0gL14oPzpbKy1dP1swLTldK3xbMC05XSpcXC5bMC05XSspKD86W2VFXVsrLV0/WzAtOV0rKT8oPzpjaHxjbXxlbXxleHxpbnxtbXxwY3xwdHxweHxyZW18dmh8dm1pbnx2bWF4fHZ3KSQvaTtcblxuXHRcdC8vIChUaGlzIGlzIGEgcXVpY2sgYW5kIGxlbmllbnQgdGVzdC4gQmVjYXVzZSBvZiBvcHRpb25hbCB1bmxpbWl0ZWQtZGVwdGggaW50ZXJuYWxcblx0XHQvLyBncm91cGluZyBwYXJlbnMgYW5kIHN0cmljdCBzcGFjaW5nIHJ1bGVzLCB0aGlzIGNvdWxkIGdldCB2ZXJ5IGNvbXBsaWNhdGVkLilcblx0XHR2YXIgcmVnZXhDc3NDYWxjID0gL15jYWxjXFwoKD86WzAtOWEteiBcXC5cXCtcXC1cXCpcXC9cXChcXCldKylcXCkkL2k7XG5cblx0XHR2YXIgaTtcblx0XHR2YXIgdW5wYXJzZWRTaXplc0xpc3Q7XG5cdFx0dmFyIHVucGFyc2VkU2l6ZXNMaXN0TGVuZ3RoO1xuXHRcdHZhciB1bnBhcnNlZFNpemU7XG5cdFx0dmFyIGxhc3RDb21wb25lbnRWYWx1ZTtcblx0XHR2YXIgc2l6ZTtcblxuXHRcdC8vIFVUSUxJVFkgRlVOQ1RJT05TXG5cblx0XHQvLyAgKFRveSBDU1MgcGFyc2VyLiBUaGUgZ29hbHMgaGVyZSBhcmU6XG5cdFx0Ly8gIDEpIGV4cGFuc2l2ZSB0ZXN0IGNvdmVyYWdlIHdpdGhvdXQgdGhlIHdlaWdodCBvZiBhIGZ1bGwgQ1NTIHBhcnNlci5cblx0XHQvLyAgMikgQXZvaWRpbmcgcmVnZXggd2hlcmV2ZXIgY29udmVuaWVudC5cblx0XHQvLyAgUXVpY2sgdGVzdHM6IGh0dHA6Ly9qc2ZpZGRsZS5uZXQvZ3RudEw0Z3IvMy9cblx0XHQvLyAgUmV0dXJucyBhbiBhcnJheSBvZiBhcnJheXMuKVxuXHRcdGZ1bmN0aW9uIHBhcnNlQ29tcG9uZW50VmFsdWVzKHN0cikge1xuXHRcdFx0dmFyIGNocmN0cjtcblx0XHRcdHZhciBjb21wb25lbnQgPSBcIlwiO1xuXHRcdFx0dmFyIGNvbXBvbmVudEFycmF5ID0gW107XG5cdFx0XHR2YXIgbGlzdEFycmF5ID0gW107XG5cdFx0XHR2YXIgcGFyZW5EZXB0aCA9IDA7XG5cdFx0XHR2YXIgcG9zID0gMDtcblx0XHRcdHZhciBpbkNvbW1lbnQgPSBmYWxzZTtcblxuXHRcdFx0ZnVuY3Rpb24gcHVzaENvbXBvbmVudCgpIHtcblx0XHRcdFx0aWYgKGNvbXBvbmVudCkge1xuXHRcdFx0XHRcdGNvbXBvbmVudEFycmF5LnB1c2goY29tcG9uZW50KTtcblx0XHRcdFx0XHRjb21wb25lbnQgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIHB1c2hDb21wb25lbnRBcnJheSgpIHtcblx0XHRcdFx0aWYgKGNvbXBvbmVudEFycmF5WzBdKSB7XG5cdFx0XHRcdFx0bGlzdEFycmF5LnB1c2goY29tcG9uZW50QXJyYXkpO1xuXHRcdFx0XHRcdGNvbXBvbmVudEFycmF5ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gKExvb3AgZm9yd2FyZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuKVxuXHRcdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdFx0Y2hyY3RyID0gc3RyLmNoYXJBdChwb3MpO1xuXG5cdFx0XHRcdGlmIChjaHJjdHIgPT09IFwiXCIpIHsgLy8gKCBFbmQgb2Ygc3RyaW5nIHJlYWNoZWQuKVxuXHRcdFx0XHRcdHB1c2hDb21wb25lbnQoKTtcblx0XHRcdFx0XHRwdXNoQ29tcG9uZW50QXJyYXkoKTtcblx0XHRcdFx0XHRyZXR1cm4gbGlzdEFycmF5O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGluQ29tbWVudCkge1xuXHRcdFx0XHRcdGlmICgoY2hyY3RyID09PSBcIipcIikgJiYgKHN0cltwb3MgKyAxXSA9PT0gXCIvXCIpKSB7IC8vIChBdCBlbmQgb2YgYSBjb21tZW50Lilcblx0XHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0cG9zICs9IDI7XG5cdFx0XHRcdFx0XHRwdXNoQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cG9zICs9IDE7IC8vIChTa2lwIGFsbCBjaGFyYWN0ZXJzIGluc2lkZSBjb21tZW50cy4pXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNTcGFjZShjaHJjdHIpKSB7XG5cdFx0XHRcdFx0Ly8gKElmIHByZXZpb3VzIGNoYXJhY3RlciBpbiBsb29wIHdhcyBhbHNvIGEgc3BhY2UsIG9yIGlmXG5cdFx0XHRcdFx0Ly8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCBkbyBub3QgYWRkIHNwYWNlIGNoYXIgdG9cblx0XHRcdFx0XHQvLyBjb21wb25lbnQuKVxuXHRcdFx0XHRcdGlmICggKHN0ci5jaGFyQXQocG9zIC0gMSkgJiYgaXNTcGFjZSggc3RyLmNoYXJBdChwb3MgLSAxKSApICkgfHwgIWNvbXBvbmVudCApIHtcblx0XHRcdFx0XHRcdHBvcyArPSAxO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChwYXJlbkRlcHRoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRwdXNoQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRwb3MgKz0xO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIChSZXBsYWNlIGFueSBzcGFjZSBjaGFyYWN0ZXIgd2l0aCBhIHBsYWluIHNwYWNlIGZvciBsZWdpYmlsaXR5Lilcblx0XHRcdFx0XHRcdGNocmN0ciA9IFwiIFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChjaHJjdHIgPT09IFwiKFwiKSB7XG5cdFx0XHRcdFx0cGFyZW5EZXB0aCArPSAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNocmN0ciA9PT0gXCIpXCIpIHtcblx0XHRcdFx0XHRwYXJlbkRlcHRoIC09IDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY2hyY3RyID09PSBcIixcIikge1xuXHRcdFx0XHRcdHB1c2hDb21wb25lbnQoKTtcblx0XHRcdFx0XHRwdXNoQ29tcG9uZW50QXJyYXkoKTtcblx0XHRcdFx0XHRwb3MgKz0gMTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fSBlbHNlIGlmICggKGNocmN0ciA9PT0gXCIvXCIpICYmIChzdHIuY2hhckF0KHBvcyArIDEpID09PSBcIipcIikgKSB7XG5cdFx0XHRcdFx0aW5Db21tZW50ID0gdHJ1ZTtcblx0XHRcdFx0XHRwb3MgKz0gMjtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbXBvbmVudCA9IGNvbXBvbmVudCArIGNocmN0cjtcblx0XHRcdFx0cG9zICs9IDE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaXNWYWxpZE5vbk5lZ2F0aXZlU291cmNlU2l6ZVZhbHVlKHMpIHtcblx0XHRcdGlmIChyZWdleENzc0xlbmd0aFdpdGhVbml0cy50ZXN0KHMpICYmIChwYXJzZUZsb2F0KHMpID49IDApKSB7cmV0dXJuIHRydWU7fVxuXHRcdFx0aWYgKHJlZ2V4Q3NzQ2FsYy50ZXN0KHMpKSB7cmV0dXJuIHRydWU7fVxuXHRcdFx0Ly8gKCBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyL3N5bmRhdGEuaHRtbCNudW1iZXJzIHNheXM6XG5cdFx0XHQvLyBcIi0wIGlzIGVxdWl2YWxlbnQgdG8gMCBhbmQgaXMgbm90IGEgbmVnYXRpdmUgbnVtYmVyLlwiIHdoaWNoIG1lYW5zIHRoYXRcblx0XHRcdC8vIHVuaXRsZXNzIHplcm8gYW5kIHVuaXRsZXNzIG5lZ2F0aXZlIHplcm8gbXVzdCBiZSBhY2NlcHRlZCBhcyBzcGVjaWFsIGNhc2VzLilcblx0XHRcdGlmICgocyA9PT0gXCIwXCIpIHx8IChzID09PSBcIi0wXCIpIHx8IChzID09PSBcIiswXCIpKSB7cmV0dXJuIHRydWU7fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gYXNrZWQgdG8gcGFyc2UgYSBzaXplcyBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LCBwYXJzZSBhXG5cdFx0Ly8gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29tcG9uZW50IHZhbHVlcyBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCdzXG5cdFx0Ly8gc2l6ZXMgYXR0cmlidXRlIChvciB0aGUgZW1wdHkgc3RyaW5nLCBpZiB0aGUgYXR0cmlidXRlIGlzIGFic2VudCksIGFuZCBsZXRcblx0XHQvLyB1bnBhcnNlZCBzaXplcyBsaXN0IGJlIHRoZSByZXN1bHQuXG5cdFx0Ly8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLXN5bnRheC8jcGFyc2UtY29tbWEtc2VwYXJhdGVkLWxpc3Qtb2YtY29tcG9uZW50LXZhbHVlc1xuXG5cdFx0dW5wYXJzZWRTaXplc0xpc3QgPSBwYXJzZUNvbXBvbmVudFZhbHVlcyhzdHJWYWx1ZSk7XG5cdFx0dW5wYXJzZWRTaXplc0xpc3RMZW5ndGggPSB1bnBhcnNlZFNpemVzTGlzdC5sZW5ndGg7XG5cblx0XHQvLyBGb3IgZWFjaCB1bnBhcnNlZCBzaXplIGluIHVucGFyc2VkIHNpemVzIGxpc3Q6XG5cdFx0Zm9yIChpID0gMDsgaSA8IHVucGFyc2VkU2l6ZXNMaXN0TGVuZ3RoOyBpKyspIHtcblx0XHRcdHVucGFyc2VkU2l6ZSA9IHVucGFyc2VkU2l6ZXNMaXN0W2ldO1xuXG5cdFx0XHQvLyAxLiBSZW1vdmUgYWxsIGNvbnNlY3V0aXZlIDx3aGl0ZXNwYWNlLXRva2VuPnMgZnJvbSB0aGUgZW5kIG9mIHVucGFyc2VkIHNpemUuXG5cdFx0XHQvLyAoIHBhcnNlQ29tcG9uZW50VmFsdWVzKCkgYWxyZWFkeSBvbWl0cyBzcGFjZXMgb3V0c2lkZSBvZiBwYXJlbnMuIClcblxuXHRcdFx0Ly8gSWYgdW5wYXJzZWQgc2l6ZSBpcyBub3cgZW1wdHksIHRoYXQgaXMgYSBwYXJzZSBlcnJvcjsgY29udGludWUgdG8gdGhlIG5leHRcblx0XHRcdC8vIGl0ZXJhdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cblx0XHRcdC8vICggcGFyc2VDb21wb25lbnRWYWx1ZXMoKSB3b24ndCBwdXNoIGFuIGVtcHR5IGFycmF5LiApXG5cblx0XHRcdC8vIDIuIElmIHRoZSBsYXN0IGNvbXBvbmVudCB2YWx1ZSBpbiB1bnBhcnNlZCBzaXplIGlzIGEgdmFsaWQgbm9uLW5lZ2F0aXZlXG5cdFx0XHQvLyA8c291cmNlLXNpemUtdmFsdWU+LCBsZXQgc2l6ZSBiZSBpdHMgdmFsdWUgYW5kIHJlbW92ZSB0aGUgY29tcG9uZW50IHZhbHVlXG5cdFx0XHQvLyBmcm9tIHVucGFyc2VkIHNpemUuIEFueSBDU1MgZnVuY3Rpb24gb3RoZXIgdGhhbiB0aGUgY2FsYygpIGZ1bmN0aW9uIGlzXG5cdFx0XHQvLyBpbnZhbGlkLiBPdGhlcndpc2UsIHRoZXJlIGlzIGEgcGFyc2UgZXJyb3I7IGNvbnRpbnVlIHRvIHRoZSBuZXh0IGl0ZXJhdGlvblxuXHRcdFx0Ly8gb2YgdGhpcyBhbGdvcml0aG0uXG5cdFx0XHQvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3Mtc3ludGF4LyNwYXJzZS1jb21wb25lbnQtdmFsdWVcblx0XHRcdGxhc3RDb21wb25lbnRWYWx1ZSA9IHVucGFyc2VkU2l6ZVt1bnBhcnNlZFNpemUubGVuZ3RoIC0gMV07XG5cblx0XHRcdGlmIChpc1ZhbGlkTm9uTmVnYXRpdmVTb3VyY2VTaXplVmFsdWUobGFzdENvbXBvbmVudFZhbHVlKSkge1xuXHRcdFx0XHRzaXplID0gbGFzdENvbXBvbmVudFZhbHVlO1xuXHRcdFx0XHR1bnBhcnNlZFNpemUucG9wKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gMy4gUmVtb3ZlIGFsbCBjb25zZWN1dGl2ZSA8d2hpdGVzcGFjZS10b2tlbj5zIGZyb20gdGhlIGVuZCBvZiB1bnBhcnNlZFxuXHRcdFx0Ly8gc2l6ZS4gSWYgdW5wYXJzZWQgc2l6ZSBpcyBub3cgZW1wdHksIHJldHVybiBzaXplIGFuZCBleGl0IHRoaXMgYWxnb3JpdGhtLlxuXHRcdFx0Ly8gSWYgdGhpcyB3YXMgbm90IHRoZSBsYXN0IGl0ZW0gaW4gdW5wYXJzZWQgc2l6ZXMgbGlzdCwgdGhhdCBpcyBhIHBhcnNlIGVycm9yLlxuXHRcdFx0aWYgKHVucGFyc2VkU2l6ZS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIHNpemU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIDQuIFBhcnNlIHRoZSByZW1haW5pbmcgY29tcG9uZW50IHZhbHVlcyBpbiB1bnBhcnNlZCBzaXplIGFzIGFcblx0XHRcdC8vIDxtZWRpYS1jb25kaXRpb24+LiBJZiBpdCBkb2VzIG5vdCBwYXJzZSBjb3JyZWN0bHksIG9yIGl0IGRvZXMgcGFyc2Vcblx0XHRcdC8vIGNvcnJlY3RseSBidXQgdGhlIDxtZWRpYS1jb25kaXRpb24+IGV2YWx1YXRlcyB0byBmYWxzZSwgY29udGludWUgdG8gdGhlXG5cdFx0XHQvLyBuZXh0IGl0ZXJhdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cblx0XHRcdC8vIChQYXJzaW5nIGFsbCBwb3NzaWJsZSBjb21wb3VuZCBtZWRpYSBjb25kaXRpb25zIGluIEpTIGlzIGhlYXZ5LCBjb21wbGljYXRlZCxcblx0XHRcdC8vIGFuZCB0aGUgcGF5b2ZmIGlzIHVuY2xlYXIuIElzIHRoZXJlIGV2ZXIgYW4gc2l0dWF0aW9uIHdoZXJlIHRoZVxuXHRcdFx0Ly8gbWVkaWEgY29uZGl0aW9uIHBhcnNlcyBpbmNvcnJlY3RseSBidXQgc3RpbGwgc29tZWhvdyBldmFsdWF0ZXMgdG8gdHJ1ZT9cblx0XHRcdC8vIENhbiB3ZSBqdXN0IHJlbHkgb24gdGhlIGJyb3dzZXIvcG9seWZpbGwgdG8gZG8gaXQ/KVxuXHRcdFx0dW5wYXJzZWRTaXplID0gdW5wYXJzZWRTaXplLmpvaW4oXCIgXCIpO1xuXHRcdFx0aWYgKCEocGYubWF0Y2hlc01lZGlhKCB1bnBhcnNlZFNpemUgKSApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gNS4gUmV0dXJuIHNpemUgYW5kIGV4aXQgdGhpcyBhbGdvcml0aG0uXG5cdFx0XHRyZXR1cm4gc2l6ZTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgYWJvdmUgYWxnb3JpdGhtIGV4aGF1c3RzIHVucGFyc2VkIHNpemVzIGxpc3Qgd2l0aG91dCByZXR1cm5pbmcgYVxuXHRcdC8vIHNpemUgdmFsdWUsIHJldHVybiAxMDB2dy5cblx0XHRyZXR1cm4gXCIxMDB2d1wiO1xuXHR9XG5cblx0Ly8gbmFtZXNwYWNlXG5cdHBmLm5zID0gKFwicGZcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKS5zdWJzdHIoMCwgOSk7XG5cblx0Ly8gc3Jjc2V0IHN1cHBvcnQgdGVzdFxuXHRwZi5zdXBTcmNzZXQgPSBcInNyY3NldFwiIGluIGltYWdlO1xuXHRwZi5zdXBTaXplcyA9IFwic2l6ZXNcIiBpbiBpbWFnZTtcblx0cGYuc3VwUGljdHVyZSA9ICEhd2luZG93LkhUTUxQaWN0dXJlRWxlbWVudDtcblxuXHQvLyBVQyBicm93c2VyIGRvZXMgY2xhaW0gdG8gc3VwcG9ydCBzcmNzZXQgYW5kIHBpY3R1cmUsIGJ1dCBub3Qgc2l6ZXMsXG5cdC8vIHRoaXMgZXh0ZW5kZWQgdGVzdCByZXZlYWxzIHRoZSBicm93c2VyIGRvZXMgc3VwcG9ydCBub3RoaW5nXG5cdGlmIChwZi5zdXBTcmNzZXQgJiYgcGYuc3VwUGljdHVyZSAmJiAhcGYuc3VwU2l6ZXMpIHtcblx0XHQoZnVuY3Rpb24oaW1hZ2UyKSB7XG5cdFx0XHRpbWFnZS5zcmNzZXQgPSBcImRhdGE6LGFcIjtcblx0XHRcdGltYWdlMi5zcmMgPSBcImRhdGE6LGFcIjtcblx0XHRcdHBmLnN1cFNyY3NldCA9IGltYWdlLmNvbXBsZXRlID09PSBpbWFnZTIuY29tcGxldGU7XG5cdFx0XHRwZi5zdXBQaWN0dXJlID0gcGYuc3VwU3Jjc2V0ICYmIHBmLnN1cFBpY3R1cmU7XG5cdFx0fSkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKSk7XG5cdH1cblxuXHQvLyBTYWZhcmk5IGhhcyBiYXNpYyBzdXBwb3J0IGZvciBzaXplcywgYnV0IGRvZXMndCBleHBvc2UgdGhlIGBzaXplc2AgaWRsIGF0dHJpYnV0ZVxuXHRpZiAocGYuc3VwU3Jjc2V0ICYmICFwZi5zdXBTaXplcykge1xuXG5cdFx0KGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHdpZHRoMiA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQWdBQkFQQUFBUC8vL3dBQUFDSDVCQUFBQUFBQUxBQUFBQUFDQUFFQUFBSUNCQW9BT3c9PVwiO1xuXHRcdFx0dmFyIHdpZHRoMSA9IFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT1cIjtcblx0XHRcdHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuXHRcdFx0dmFyIHRlc3QgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHdpZHRoID0gaW1nLndpZHRoO1xuXG5cdFx0XHRcdGlmICh3aWR0aCA9PT0gMikge1xuXHRcdFx0XHRcdHBmLnN1cFNpemVzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFsd2F5c0NoZWNrV0Rlc2NyaXB0b3IgPSBwZi5zdXBTcmNzZXQgJiYgIXBmLnN1cFNpemVzO1xuXG5cdFx0XHRcdGlzU3VwcG9ydFRlc3RSZWFkeSA9IHRydWU7XG5cdFx0XHRcdC8vIGZvcmNlIGFzeW5jXG5cdFx0XHRcdHNldFRpbWVvdXQocGljdHVyZWZpbGwpO1xuXHRcdFx0fTtcblxuXHRcdFx0aW1nLm9ubG9hZCA9IHRlc3Q7XG5cdFx0XHRpbWcub25lcnJvciA9IHRlc3Q7XG5cdFx0XHRpbWcuc2V0QXR0cmlidXRlKFwic2l6ZXNcIiwgXCI5cHhcIik7XG5cblx0XHRcdGltZy5zcmNzZXQgPSB3aWR0aDEgKyBcIiAxdyxcIiArIHdpZHRoMiArIFwiIDl3XCI7XG5cdFx0XHRpbWcuc3JjID0gd2lkdGgxO1xuXHRcdH0pKCk7XG5cblx0fSBlbHNlIHtcblx0XHRpc1N1cHBvcnRUZXN0UmVhZHkgPSB0cnVlO1xuXHR9XG5cblx0Ly8gdXNpbmcgcGYucXNhIGluc3RlYWQgb2YgZG9tIHRyYXZlcnNpbmcgZG9lcyBzY2FsZSBtdWNoIGJldHRlcixcblx0Ly8gZXNwZWNpYWxseSBvbiBzaXRlcyBtaXhpbmcgcmVzcG9uc2l2ZSBhbmQgbm9uLXJlc3BvbnNpdmUgaW1hZ2VzXG5cdHBmLnNlbFNob3J0ID0gXCJwaWN0dXJlPmltZyxpbWdbc3Jjc2V0XVwiO1xuXHRwZi5zZWwgPSBwZi5zZWxTaG9ydDtcblx0cGYuY2ZnID0gY2ZnO1xuXG5cdC8qKlxuXHQgKiBTaG9ydGN1dCBwcm9wZXJ0eSBmb3IgYGRldmljZVBpeGVsUmF0aW9gICggZm9yIGVhc3kgb3ZlcnJpZGluZyBpbiB0ZXN0cyApXG5cdCAqL1xuXHRwZi5EUFIgPSAoRFBSICB8fCAxICk7XG5cdHBmLnUgPSB1bml0cztcblxuXHQvLyBjb250YWluZXIgb2Ygc3VwcG9ydGVkIG1pbWUgdHlwZXMgdGhhdCBvbmUgbWlnaHQgbmVlZCB0byBxdWFsaWZ5IGJlZm9yZSB1c2luZ1xuXHRwZi50eXBlcyA9ICB0eXBlcztcblxuXHRwZi5zZXRTaXplID0gbm9vcDtcblxuXHQvKipcblx0ICogR2V0cyBhIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgYWJzb2x1dGUgVVJMXG5cdCAqIEBwYXJhbSBzcmNcblx0ICogQHJldHVybnMge1N0cmluZ30gYWJzb2x1dGUgVVJMXG5cdCAqL1xuXG5cdHBmLm1ha2VVcmwgPSBtZW1vaXplKGZ1bmN0aW9uKHNyYykge1xuXHRcdGFuY2hvci5ocmVmID0gc3JjO1xuXHRcdHJldHVybiBhbmNob3IuaHJlZjtcblx0fSk7XG5cblx0LyoqXG5cdCAqIEdldHMgYSBET00gZWxlbWVudCBvciBkb2N1bWVudCBhbmQgYSBzZWxjdG9yIGFuZCByZXR1cm5zIHRoZSBmb3VuZCBtYXRjaGVzXG5cdCAqIENhbiBiZSBleHRlbmRlZCB3aXRoIGpRdWVyeS9TaXp6bGUgZm9yIElFNyBzdXBwb3J0XG5cdCAqIEBwYXJhbSBjb250ZXh0XG5cdCAqIEBwYXJhbSBzZWxcblx0ICogQHJldHVybnMge05vZGVMaXN0fEFycmF5fVxuXHQgKi9cblx0cGYucXNhID0gZnVuY3Rpb24oY29udGV4dCwgc2VsKSB7XG5cdFx0cmV0dXJuICggXCJxdWVyeVNlbGVjdG9yXCIgaW4gY29udGV4dCApID8gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkgOiBbXTtcblx0fTtcblxuXHQvKipcblx0ICogU2hvcnRjdXQgbWV0aG9kIGZvciBtYXRjaE1lZGlhICggZm9yIGVhc3kgb3ZlcnJpZGluZyBpbiB0ZXN0cyApXG5cdCAqIHdldGhlciBuYXRpdmUgb3IgcGYubU1RIGlzIHVzZWQgd2lsbCBiZSBkZWNpZGVkIGxhenkgb24gZmlyc3QgY2FsbFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdHBmLm1hdGNoZXNNZWRpYSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggd2luZG93Lm1hdGNoTWVkaWEgJiYgKG1hdGNoTWVkaWEoIFwiKG1pbi13aWR0aDogMC4xZW0pXCIgKSB8fCB7fSkubWF0Y2hlcyApIHtcblx0XHRcdHBmLm1hdGNoZXNNZWRpYSA9IGZ1bmN0aW9uKCBtZWRpYSApIHtcblx0XHRcdFx0cmV0dXJuICFtZWRpYSB8fCAoIG1hdGNoTWVkaWEoIG1lZGlhICkubWF0Y2hlcyApO1xuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGYubWF0Y2hlc01lZGlhID0gcGYubU1RO1xuXHRcdH1cblxuXHRcdHJldHVybiBwZi5tYXRjaGVzTWVkaWEuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBBIHNpbXBsaWZpZWQgbWF0Y2hNZWRpYSBpbXBsZW1lbnRhdGlvbiBmb3IgSUU4IGFuZCBJRTlcblx0ICogaGFuZGxlcyBvbmx5IG1pbi13aWR0aC9tYXgtd2lkdGggd2l0aCBweCBvciBlbSB2YWx1ZXNcblx0ICogQHBhcmFtIG1lZGlhXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cGYubU1RID0gZnVuY3Rpb24oIG1lZGlhICkge1xuXHRcdHJldHVybiBtZWRpYSA/IGV2YWxDU1MobWVkaWEpIDogdHJ1ZTtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCBsZW5ndGggaW4gY3NzIHBpeGVsIGZyb20gdGhlIGdpdmVuIHNvdXJjZVNpemVWYWx1ZVxuXHQgKiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtdmFsdWVzLTMvI2xlbmd0aC12YWx1ZVxuXHQgKiBpbnRlbmRlZCBTcGVjIG1pc21hdGNoZXM6XG5cdCAqICogRG9lcyBub3QgY2hlY2sgZm9yIGludmFsaWQgdXNlIG9mIENTUyBmdW5jdGlvbnNcblx0ICogKiBEb2VzIGhhbmRsZSBhIGNvbXB1dGVkIGxlbmd0aCBvZiAwIHRoZSBzYW1lIGFzIGEgbmVnYXRpdmUgYW5kIHRoZXJlZm9yZSBpbnZhbGlkIHZhbHVlXG5cdCAqIEBwYXJhbSBzb3VyY2VTaXplVmFsdWVcblx0ICogQHJldHVybnMge051bWJlcn1cblx0ICovXG5cdHBmLmNhbGNMZW5ndGggPSBmdW5jdGlvbiggc291cmNlU2l6ZVZhbHVlICkge1xuXG5cdFx0dmFyIHZhbHVlID0gZXZhbENTUyhzb3VyY2VTaXplVmFsdWUsIHRydWUpIHx8IGZhbHNlO1xuXHRcdGlmICh2YWx1ZSA8IDApIHtcblx0XHRcdHZhbHVlID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUYWtlcyBhIHR5cGUgc3RyaW5nIGFuZCBjaGVja3MgaWYgaXRzIHN1cHBvcnRlZFxuXHQgKi9cblxuXHRwZi5zdXBwb3J0c1R5cGUgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gKCB0eXBlICkgPyB0eXBlc1sgdHlwZSBdIDogdHJ1ZTtcblx0fTtcblxuXHQvKipcblx0ICogUGFyc2VzIGEgc291cmNlU2l6ZSBpbnRvIG1lZGlhQ29uZGl0aW9uIChtZWRpYSkgYW5kIHNvdXJjZVNpemVWYWx1ZSAobGVuZ3RoKVxuXHQgKiBAcGFyYW0gc291cmNlU2l6ZVN0clxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICovXG5cdHBmLnBhcnNlU2l6ZSA9IG1lbW9pemUoZnVuY3Rpb24oIHNvdXJjZVNpemVTdHIgKSB7XG5cdFx0dmFyIG1hdGNoID0gKCBzb3VyY2VTaXplU3RyIHx8IFwiXCIgKS5tYXRjaChyZWdTaXplKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVkaWE6IG1hdGNoICYmIG1hdGNoWzFdLFxuXHRcdFx0bGVuZ3RoOiBtYXRjaCAmJiBtYXRjaFsyXVxuXHRcdH07XG5cdH0pO1xuXG5cdHBmLnBhcnNlU2V0ID0gZnVuY3Rpb24oIHNldCApIHtcblx0XHRpZiAoICFzZXQuY2FuZHMgKSB7XG5cdFx0XHRzZXQuY2FuZHMgPSBwYXJzZVNyY3NldChzZXQuc3Jjc2V0LCBzZXQpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2V0LmNhbmRzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm5zIDFlbSBpbiBjc3MgcHggZm9yIGh0bWwvYm9keSBkZWZhdWx0IHNpemVcblx0ICogZnVuY3Rpb24gdGFrZW4gZnJvbSByZXNwb25kanNcblx0ICogQHJldHVybnMgeyp8bnVtYmVyfVxuXHQgKi9cblx0cGYuZ2V0RW1WYWx1ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBib2R5O1xuXHRcdGlmICggIWVtaW5weCAmJiAoYm9keSA9IGRvY3VtZW50LmJvZHkpICkge1xuXHRcdFx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRcdFx0b3JpZ2luYWxIVE1MQ1NTID0gZG9jRWxlbS5zdHlsZS5jc3NUZXh0LFxuXHRcdFx0XHRvcmlnaW5hbEJvZHlDU1MgPSBib2R5LnN0eWxlLmNzc1RleHQ7XG5cblx0XHRcdGRpdi5zdHlsZS5jc3NUZXh0ID0gYmFzZVN0eWxlO1xuXG5cdFx0XHQvLyAxZW0gaW4gYSBtZWRpYSBxdWVyeSBpcyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgZm9udCBzaXplIG9mIHRoZSBicm93c2VyXG5cdFx0XHQvLyByZXNldCBkb2NFbGVtIGFuZCBib2R5IHRvIGVuc3VyZSB0aGUgY29ycmVjdCB2YWx1ZSBpcyByZXR1cm5lZFxuXHRcdFx0ZG9jRWxlbS5zdHlsZS5jc3NUZXh0ID0gZnNDc3M7XG5cdFx0XHRib2R5LnN0eWxlLmNzc1RleHQgPSBmc0NzcztcblxuXHRcdFx0Ym9keS5hcHBlbmRDaGlsZCggZGl2ICk7XG5cdFx0XHRlbWlucHggPSBkaXYub2Zmc2V0V2lkdGg7XG5cdFx0XHRib2R5LnJlbW92ZUNoaWxkKCBkaXYgKTtcblxuXHRcdFx0Ly9hbHNvIHVwZGF0ZSBlbWlucHggYmVmb3JlIHJldHVybmluZ1xuXHRcdFx0ZW1pbnB4ID0gcGFyc2VGbG9hdCggZW1pbnB4LCAxMCApO1xuXG5cdFx0XHQvLyByZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdGRvY0VsZW0uc3R5bGUuY3NzVGV4dCA9IG9yaWdpbmFsSFRNTENTUztcblx0XHRcdGJvZHkuc3R5bGUuY3NzVGV4dCA9IG9yaWdpbmFsQm9keUNTUztcblxuXHRcdH1cblx0XHRyZXR1cm4gZW1pbnB4IHx8IDE2O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUYWtlcyBhIHN0cmluZyBvZiBzaXplcyBhbmQgcmV0dXJucyB0aGUgd2lkdGggaW4gcGl4ZWxzIGFzIGEgbnVtYmVyXG5cdCAqL1xuXHRwZi5jYWxjTGlzdExlbmd0aCA9IGZ1bmN0aW9uKCBzb3VyY2VTaXplTGlzdFN0ciApIHtcblx0XHQvLyBTcGxpdCB1cCBzb3VyY2Ugc2l6ZSBsaXN0LCBpZSAoIG1heC13aWR0aDogMzBlbSApIDEwMCUsICggbWF4LXdpZHRoOiA1MGVtICkgNTAlLCAzMyVcblx0XHQvL1xuXHRcdC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgKG1pbi13aWR0aDozMGVtKSBjYWxjKDMwJSAtIDE1cHgpXG5cdFx0aWYgKCAhKHNvdXJjZVNpemVMaXN0U3RyIGluIHNpemVMZW5ndGhDYWNoZSkgfHwgY2ZnLnVUICkge1xuXHRcdFx0dmFyIHdpbm5pbmdMZW5ndGggPSBwZi5jYWxjTGVuZ3RoKCBwYXJzZVNpemVzKCBzb3VyY2VTaXplTGlzdFN0ciApICk7XG5cblx0XHRcdHNpemVMZW5ndGhDYWNoZVsgc291cmNlU2l6ZUxpc3RTdHIgXSA9ICF3aW5uaW5nTGVuZ3RoID8gdW5pdHMud2lkdGggOiB3aW5uaW5nTGVuZ3RoO1xuXHRcdH1cblxuXHRcdHJldHVybiBzaXplTGVuZ3RoQ2FjaGVbIHNvdXJjZVNpemVMaXN0U3RyIF07XG5cdH07XG5cblx0LyoqXG5cdCAqIFRha2VzIGEgY2FuZGlkYXRlIG9iamVjdCB3aXRoIGEgc3Jjc2V0IHByb3BlcnR5IGluIHRoZSBmb3JtIG9mIHVybC9cblx0ICogZXguIFwiaW1hZ2VzL3BpYy1tZWRpdW0ucG5nIDF4LCBpbWFnZXMvcGljLW1lZGl1bS0yeC5wbmcgMnhcIiBvclxuXHQgKiAgICAgXCJpbWFnZXMvcGljLW1lZGl1bS5wbmcgNDAwdywgaW1hZ2VzL3BpYy1tZWRpdW0tMngucG5nIDgwMHdcIiBvclxuXHQgKiAgICAgXCJpbWFnZXMvcGljLXNtYWxsLnBuZ1wiXG5cdCAqIEdldCBhbiBhcnJheSBvZiBpbWFnZSBjYW5kaWRhdGVzIGluIHRoZSBmb3JtIG9mXG5cdCAqICAgICAge3VybDogXCIvZm9vL2Jhci5wbmdcIiwgcmVzb2x1dGlvbjogMX1cblx0ICogd2hlcmUgcmVzb2x1dGlvbiBpcyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtdmFsdWVzLTMvI3Jlc29sdXRpb24tdmFsdWVcblx0ICogSWYgc2l6ZXMgaXMgc3BlY2lmaWVkLCByZXMgaXMgY2FsY3VsYXRlZFxuXHQgKi9cblx0cGYuc2V0UmVzID0gZnVuY3Rpb24oIHNldCApIHtcblx0XHR2YXIgY2FuZGlkYXRlcztcblx0XHRpZiAoIHNldCApIHtcblxuXHRcdFx0Y2FuZGlkYXRlcyA9IHBmLnBhcnNlU2V0KCBzZXQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsZW4gPSBjYW5kaWRhdGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRzZXRSZXNvbHV0aW9uKCBjYW5kaWRhdGVzWyBpIF0sIHNldC5zaXplcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2FuZGlkYXRlcztcblx0fTtcblxuXHRwZi5zZXRSZXMucmVzID0gc2V0UmVzb2x1dGlvbjtcblxuXHRwZi5hcHBseVNldENhbmRpZGF0ZSA9IGZ1bmN0aW9uKCBjYW5kaWRhdGVzLCBpbWcgKSB7XG5cdFx0aWYgKCAhY2FuZGlkYXRlcy5sZW5ndGggKSB7cmV0dXJuO31cblx0XHR2YXIgY2FuZGlkYXRlLFxuXHRcdFx0aSxcblx0XHRcdGosXG5cdFx0XHRsZW5ndGgsXG5cdFx0XHRiZXN0Q2FuZGlkYXRlLFxuXHRcdFx0Y3VyU3JjLFxuXHRcdFx0Y3VyQ2FuLFxuXHRcdFx0Y2FuZGlkYXRlU3JjLFxuXHRcdFx0YWJvcnRDdXJTcmM7XG5cblx0XHR2YXIgaW1hZ2VEYXRhID0gaW1nWyBwZi5ucyBdO1xuXHRcdHZhciBkcHIgPSBwZi5EUFI7XG5cblx0XHRjdXJTcmMgPSBpbWFnZURhdGEuY3VyU3JjIHx8IGltZ1tjdXJTcmNQcm9wXTtcblxuXHRcdGN1ckNhbiA9IGltYWdlRGF0YS5jdXJDYW4gfHwgc2V0U3JjVG9DdXIoaW1nLCBjdXJTcmMsIGNhbmRpZGF0ZXNbMF0uc2V0KTtcblxuXHRcdC8vIGlmIHdlIGhhdmUgYSBjdXJyZW50IHNvdXJjZSwgd2UgbWlnaHQgZWl0aGVyIGJlY29tZSBsYXp5IG9yIGdpdmUgdGhpcyBzb3VyY2Ugc29tZSBhZHZhbnRhZ2Vcblx0XHRpZiAoIGN1ckNhbiAmJiBjdXJDYW4uc2V0ID09PSBjYW5kaWRhdGVzWyAwIF0uc2V0ICkge1xuXG5cdFx0XHQvLyBpZiBicm93c2VyIGNhbiBhYm9ydCBpbWFnZSByZXF1ZXN0IGFuZCB0aGUgaW1hZ2UgaGFzIGEgaGlnaGVyIHBpeGVsIGRlbnNpdHkgdGhhbiBuZWVkZWRcblx0XHRcdC8vIGFuZCB0aGlzIGltYWdlIGlzbid0IGRvd25sb2FkZWQgeWV0LCB3ZSBza2lwIG5leHQgcGFydCBhbmQgdHJ5IHRvIHNhdmUgYmFuZHdpZHRoXG5cdFx0XHRhYm9ydEN1clNyYyA9IChzdXBwb3J0QWJvcnQgJiYgIWltZy5jb21wbGV0ZSAmJiBjdXJDYW4ucmVzIC0gMC4xID4gZHByKTtcblxuXHRcdFx0aWYgKCAhYWJvcnRDdXJTcmMgKSB7XG5cdFx0XHRcdGN1ckNhbi5jYWNoZWQgPSB0cnVlO1xuXG5cdFx0XHRcdC8vIGlmIGN1cnJlbnQgY2FuZGlkYXRlIGlzIFwiYmVzdFwiLCBcImJldHRlclwiIG9yIFwib2theVwiLFxuXHRcdFx0XHQvLyBzZXQgaXQgdG8gYmVzdENhbmRpZGF0ZVxuXHRcdFx0XHRpZiAoIGN1ckNhbi5yZXMgPj0gZHByICkge1xuXHRcdFx0XHRcdGJlc3RDYW5kaWRhdGUgPSBjdXJDYW47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFiZXN0Q2FuZGlkYXRlICkge1xuXG5cdFx0XHRjYW5kaWRhdGVzLnNvcnQoIGFzY2VuZGluZ1NvcnQgKTtcblxuXHRcdFx0bGVuZ3RoID0gY2FuZGlkYXRlcy5sZW5ndGg7XG5cdFx0XHRiZXN0Q2FuZGlkYXRlID0gY2FuZGlkYXRlc1sgbGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRjYW5kaWRhdGUgPSBjYW5kaWRhdGVzWyBpIF07XG5cdFx0XHRcdGlmICggY2FuZGlkYXRlLnJlcyA+PSBkcHIgKSB7XG5cdFx0XHRcdFx0aiA9IGkgLSAxO1xuXG5cdFx0XHRcdFx0Ly8gd2UgaGF2ZSBmb3VuZCB0aGUgcGVyZmVjdCBjYW5kaWRhdGUsXG5cdFx0XHRcdFx0Ly8gYnV0IGxldCdzIGltcHJvdmUgdGhpcyBhIGxpdHRsZSBiaXQgd2l0aCBzb21lIGFzc3VtcHRpb25zIDstKVxuXHRcdFx0XHRcdGlmIChjYW5kaWRhdGVzWyBqIF0gJiZcblx0XHRcdFx0XHRcdChhYm9ydEN1clNyYyB8fCBjdXJTcmMgIT09IHBmLm1ha2VVcmwoIGNhbmRpZGF0ZS51cmwgKSkgJiZcblx0XHRcdFx0XHRcdGNob29zZUxvd1JlcyhjYW5kaWRhdGVzWyBqIF0ucmVzLCBjYW5kaWRhdGUucmVzLCBkcHIsIGNhbmRpZGF0ZXNbIGogXS5jYWNoZWQpKSB7XG5cblx0XHRcdFx0XHRcdGJlc3RDYW5kaWRhdGUgPSBjYW5kaWRhdGVzWyBqIF07XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YmVzdENhbmRpZGF0ZSA9IGNhbmRpZGF0ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGJlc3RDYW5kaWRhdGUgKSB7XG5cblx0XHRcdGNhbmRpZGF0ZVNyYyA9IHBmLm1ha2VVcmwoIGJlc3RDYW5kaWRhdGUudXJsICk7XG5cblx0XHRcdGltYWdlRGF0YS5jdXJTcmMgPSBjYW5kaWRhdGVTcmM7XG5cdFx0XHRpbWFnZURhdGEuY3VyQ2FuID0gYmVzdENhbmRpZGF0ZTtcblxuXHRcdFx0aWYgKCBjYW5kaWRhdGVTcmMgIT09IGN1clNyYyApIHtcblx0XHRcdFx0cGYuc2V0U3JjKCBpbWcsIGJlc3RDYW5kaWRhdGUgKTtcblx0XHRcdH1cblx0XHRcdHBmLnNldFNpemUoIGltZyApO1xuXHRcdH1cblx0fTtcblxuXHRwZi5zZXRTcmMgPSBmdW5jdGlvbiggaW1nLCBiZXN0Q2FuZGlkYXRlICkge1xuXHRcdHZhciBvcmlnV2lkdGg7XG5cdFx0aW1nLnNyYyA9IGJlc3RDYW5kaWRhdGUudXJsO1xuXG5cdFx0Ly8gYWx0aG91Z2ggdGhpcyBpcyBhIHNwZWNpZmljIFNhZmFyaSBpc3N1ZSwgd2UgZG9uJ3Qgd2FudCB0byB0YWtlIHRvbyBtdWNoIGRpZmZlcmVudCBjb2RlIHBhdGhzXG5cdFx0aWYgKCBiZXN0Q2FuZGlkYXRlLnNldC50eXBlID09PSBcImltYWdlL3N2Zyt4bWxcIiApIHtcblx0XHRcdG9yaWdXaWR0aCA9IGltZy5zdHlsZS53aWR0aDtcblx0XHRcdGltZy5zdHlsZS53aWR0aCA9IChpbWcub2Zmc2V0V2lkdGggKyAxKSArIFwicHhcIjtcblxuXHRcdFx0Ly8gbmV4dCBsaW5lIG9ubHkgc2hvdWxkIHRyaWdnZXIgYSByZXBhaW50XG5cdFx0XHQvLyBpZi4uLiBpcyBvbmx5IGRvbmUgdG8gdHJpY2sgZGVhZCBjb2RlIHJlbW92YWxcblx0XHRcdGlmICggaW1nLm9mZnNldFdpZHRoICsgMSApIHtcblx0XHRcdFx0aW1nLnN0eWxlLndpZHRoID0gb3JpZ1dpZHRoO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRwZi5nZXRTZXQgPSBmdW5jdGlvbiggaW1nICkge1xuXHRcdHZhciBpLCBzZXQsIHN1cHBvcnRzVHlwZTtcblx0XHR2YXIgbWF0Y2ggPSBmYWxzZTtcblx0XHR2YXIgc2V0cyA9IGltZyBbIHBmLm5zIF0uc2V0cztcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgc2V0cy5sZW5ndGggJiYgIW1hdGNoOyBpKysgKSB7XG5cdFx0XHRzZXQgPSBzZXRzW2ldO1xuXG5cdFx0XHRpZiAoICFzZXQuc3Jjc2V0IHx8ICFwZi5tYXRjaGVzTWVkaWEoIHNldC5tZWRpYSApIHx8ICEoc3VwcG9ydHNUeXBlID0gcGYuc3VwcG9ydHNUeXBlKCBzZXQudHlwZSApKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3VwcG9ydHNUeXBlID09PSBcInBlbmRpbmdcIiApIHtcblx0XHRcdFx0c2V0ID0gc3VwcG9ydHNUeXBlO1xuXHRcdFx0fVxuXG5cdFx0XHRtYXRjaCA9IHNldDtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaDtcblx0fTtcblxuXHRwZi5wYXJzZVNldHMgPSBmdW5jdGlvbiggZWxlbWVudCwgcGFyZW50LCBvcHRpb25zICkge1xuXHRcdHZhciBzcmNzZXRBdHRyaWJ1dGUsIGltYWdlU2V0LCBpc1dEZXNjcmlwb3IsIHNyY3NldFBhcnNlZDtcblxuXHRcdHZhciBoYXNQaWN0dXJlID0gcGFyZW50ICYmIHBhcmVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlBJQ1RVUkVcIjtcblx0XHR2YXIgaW1hZ2VEYXRhID0gZWxlbWVudFsgcGYubnMgXTtcblxuXHRcdGlmICggaW1hZ2VEYXRhLnNyYyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuc3JjICkge1xuXHRcdFx0aW1hZ2VEYXRhLnNyYyA9IGdldEltZ0F0dHIuY2FsbCggZWxlbWVudCwgXCJzcmNcIiApO1xuXHRcdFx0aWYgKCBpbWFnZURhdGEuc3JjICkge1xuXHRcdFx0XHRzZXRJbWdBdHRyLmNhbGwoIGVsZW1lbnQsIHNyY0F0dHIsIGltYWdlRGF0YS5zcmMgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZUltZ0F0dHIuY2FsbCggZWxlbWVudCwgc3JjQXR0ciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggaW1hZ2VEYXRhLnNyY3NldCA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuc3Jjc2V0IHx8ICFwZi5zdXBTcmNzZXQgfHwgZWxlbWVudC5zcmNzZXQgKSB7XG5cdFx0XHRzcmNzZXRBdHRyaWJ1dGUgPSBnZXRJbWdBdHRyLmNhbGwoIGVsZW1lbnQsIFwic3Jjc2V0XCIgKTtcblx0XHRcdGltYWdlRGF0YS5zcmNzZXQgPSBzcmNzZXRBdHRyaWJ1dGU7XG5cdFx0XHRzcmNzZXRQYXJzZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGltYWdlRGF0YS5zZXRzID0gW107XG5cblx0XHRpZiAoIGhhc1BpY3R1cmUgKSB7XG5cdFx0XHRpbWFnZURhdGEucGljID0gdHJ1ZTtcblx0XHRcdGdldEFsbFNvdXJjZUVsZW1lbnRzKCBwYXJlbnQsIGltYWdlRGF0YS5zZXRzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBpbWFnZURhdGEuc3Jjc2V0ICkge1xuXHRcdFx0aW1hZ2VTZXQgPSB7XG5cdFx0XHRcdHNyY3NldDogaW1hZ2VEYXRhLnNyY3NldCxcblx0XHRcdFx0c2l6ZXM6IGdldEltZ0F0dHIuY2FsbCggZWxlbWVudCwgXCJzaXplc1wiIClcblx0XHRcdH07XG5cblx0XHRcdGltYWdlRGF0YS5zZXRzLnB1c2goIGltYWdlU2V0ICk7XG5cblx0XHRcdGlzV0Rlc2NyaXBvciA9IChhbHdheXNDaGVja1dEZXNjcmlwdG9yIHx8IGltYWdlRGF0YS5zcmMpICYmIHJlZ1dEZXNjLnRlc3QoaW1hZ2VEYXRhLnNyY3NldCB8fCBcIlwiKTtcblxuXHRcdFx0Ly8gYWRkIG5vcm1hbCBzcmMgYXMgY2FuZGlkYXRlLCBpZiBzb3VyY2UgaGFzIG5vIHcgZGVzY3JpcHRvclxuXHRcdFx0aWYgKCAhaXNXRGVzY3JpcG9yICYmIGltYWdlRGF0YS5zcmMgJiYgIWdldENhbmRpZGF0ZUZvclNyYyhpbWFnZURhdGEuc3JjLCBpbWFnZVNldCkgJiYgIWltYWdlU2V0LmhhczF4ICkge1xuXHRcdFx0XHRpbWFnZVNldC5zcmNzZXQgKz0gXCIsIFwiICsgaW1hZ2VEYXRhLnNyYztcblx0XHRcdFx0aW1hZ2VTZXQuY2FuZHMucHVzaCh7XG5cdFx0XHRcdFx0dXJsOiBpbWFnZURhdGEuc3JjLFxuXHRcdFx0XHRcdGQ6IDEsXG5cdFx0XHRcdFx0c2V0OiBpbWFnZVNldFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGltYWdlRGF0YS5zcmMgKSB7XG5cdFx0XHRpbWFnZURhdGEuc2V0cy5wdXNoKCB7XG5cdFx0XHRcdHNyY3NldDogaW1hZ2VEYXRhLnNyYyxcblx0XHRcdFx0c2l6ZXM6IG51bGxcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpbWFnZURhdGEuY3VyQ2FuID0gbnVsbDtcblx0XHRpbWFnZURhdGEuY3VyU3JjID0gdW5kZWZpbmVkO1xuXG5cdFx0Ly8gaWYgaW1nIGhhcyBwaWN0dXJlIG9yIHRoZSBzcmNzZXQgd2FzIHJlbW92ZWQgb3IgaGFzIGEgc3Jjc2V0IGFuZCBkb2VzIG5vdCBzdXBwb3J0IHNyY3NldCBhdCBhbGxcblx0XHQvLyBvciBoYXMgYSB3IGRlc2NyaXB0b3IgKGFuZCBkb2VzIG5vdCBzdXBwb3J0IHNpemVzKSBzZXQgc3VwcG9ydCB0byBmYWxzZSB0byBldmFsdWF0ZVxuXHRcdGltYWdlRGF0YS5zdXBwb3J0ZWQgPSAhKCBoYXNQaWN0dXJlIHx8ICggaW1hZ2VTZXQgJiYgIXBmLnN1cFNyY3NldCApIHx8IChpc1dEZXNjcmlwb3IgJiYgIXBmLnN1cFNpemVzKSApO1xuXG5cdFx0aWYgKCBzcmNzZXRQYXJzZWQgJiYgcGYuc3VwU3Jjc2V0ICYmICFpbWFnZURhdGEuc3VwcG9ydGVkICkge1xuXHRcdFx0aWYgKCBzcmNzZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdHNldEltZ0F0dHIuY2FsbCggZWxlbWVudCwgc3Jjc2V0QXR0ciwgc3Jjc2V0QXR0cmlidXRlICk7XG5cdFx0XHRcdGVsZW1lbnQuc3Jjc2V0ID0gXCJcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW92ZUltZ0F0dHIuY2FsbCggZWxlbWVudCwgc3Jjc2V0QXR0ciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpbWFnZURhdGEuc3VwcG9ydGVkICYmICFpbWFnZURhdGEuc3Jjc2V0ICYmICgoIWltYWdlRGF0YS5zcmMgJiYgZWxlbWVudC5zcmMpIHx8ICBlbGVtZW50LnNyYyAhPT0gcGYubWFrZVVybChpbWFnZURhdGEuc3JjKSkpIHtcblx0XHRcdGlmIChpbWFnZURhdGEuc3JjID09PSBudWxsKSB7XG5cdFx0XHRcdGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwic3JjXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudC5zcmMgPSBpbWFnZURhdGEuc3JjO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGltYWdlRGF0YS5wYXJzZWQgPSB0cnVlO1xuXHR9O1xuXG5cdHBmLmZpbGxJbWcgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cdFx0dmFyIGltYWdlRGF0YTtcblx0XHR2YXIgZXh0cmVtZSA9IG9wdGlvbnMucmVzZWxlY3QgfHwgb3B0aW9ucy5yZWV2YWx1YXRlO1xuXG5cdFx0Ly8gZXhwYW5kbyBmb3IgY2FjaGluZyBkYXRhIG9uIHRoZSBpbWdcblx0XHRpZiAoICFlbGVtZW50WyBwZi5ucyBdICkge1xuXHRcdFx0ZWxlbWVudFsgcGYubnMgXSA9IHt9O1xuXHRcdH1cblxuXHRcdGltYWdlRGF0YSA9IGVsZW1lbnRbIHBmLm5zIF07XG5cblx0XHQvLyBpZiB0aGUgZWxlbWVudCBoYXMgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZCwgc2tpcCBpdFxuXHRcdC8vIHVubGVzcyBgb3B0aW9ucy5yZWV2YWx1YXRlYCBpcyBzZXQgdG8gdHJ1ZSAoIHRoaXMsIGZvciBleGFtcGxlLFxuXHRcdC8vIGlzIHNldCB0byB0cnVlIHdoZW4gcnVubmluZyBgcGljdHVyZWZpbGxgIG9uIGByZXNpemVgICkuXG5cdFx0aWYgKCAhZXh0cmVtZSAmJiBpbWFnZURhdGEuZXZhbGVkID09PSBldmFsSWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCAhaW1hZ2VEYXRhLnBhcnNlZCB8fCBvcHRpb25zLnJlZXZhbHVhdGUgKSB7XG5cdFx0XHRwZi5wYXJzZVNldHMoIGVsZW1lbnQsIGVsZW1lbnQucGFyZW50Tm9kZSwgb3B0aW9ucyApO1xuXHRcdH1cblxuXHRcdGlmICggIWltYWdlRGF0YS5zdXBwb3J0ZWQgKSB7XG5cdFx0XHRhcHBseUJlc3RDYW5kaWRhdGUoIGVsZW1lbnQgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aW1hZ2VEYXRhLmV2YWxlZCA9IGV2YWxJZDtcblx0XHR9XG5cdH07XG5cblx0cGYuc2V0dXBSdW4gPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoICFhbHJlYWR5UnVuIHx8IGlzVndEaXJ0eSB8fCAoRFBSICE9PSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgKSB7XG5cdFx0XHR1cGRhdGVNZXRyaWNzKCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIElmIHBpY3R1cmUgaXMgc3VwcG9ydGVkLCB3ZWxsLCB0aGF0J3MgYXdlc29tZS5cblx0aWYgKCBwZi5zdXBQaWN0dXJlICkge1xuXHRcdHBpY3R1cmVmaWxsID0gbm9vcDtcblx0XHRwZi5maWxsSW1nID0gbm9vcDtcblx0fSBlbHNlIHtcblxuXHRcdCAvLyBTZXQgdXAgcGljdHVyZSBwb2x5ZmlsbCBieSBwb2xsaW5nIHRoZSBkb2N1bWVudFxuXHRcdChmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpc0RvbVJlYWR5O1xuXHRcdFx0dmFyIHJlZ1JlYWR5ID0gd2luZG93LmF0dGFjaEV2ZW50ID8gL2QkfF5jLyA6IC9kJHxeY3xeaS87XG5cblx0XHRcdHZhciBydW4gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHJlYWR5U3RhdGUgPSBkb2N1bWVudC5yZWFkeVN0YXRlIHx8IFwiXCI7XG5cblx0XHRcdFx0dGltZXJJZCA9IHNldFRpbWVvdXQocnVuLCByZWFkeVN0YXRlID09PSBcImxvYWRpbmdcIiA/IDIwMCA6ICA5OTkpO1xuXHRcdFx0XHRpZiAoIGRvY3VtZW50LmJvZHkgKSB7XG5cdFx0XHRcdFx0cGYuZmlsbEltZ3MoKTtcblx0XHRcdFx0XHRpc0RvbVJlYWR5ID0gaXNEb21SZWFkeSB8fCByZWdSZWFkeS50ZXN0KHJlYWR5U3RhdGUpO1xuXHRcdFx0XHRcdGlmICggaXNEb21SZWFkeSApIHtcblx0XHRcdFx0XHRcdGNsZWFyVGltZW91dCggdGltZXJJZCApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdGltZXJJZCA9IHNldFRpbWVvdXQocnVuLCBkb2N1bWVudC5ib2R5ID8gOSA6IDk5KTtcblxuXHRcdFx0Ly8gQWxzbyBhdHRhY2ggcGljdHVyZWZpbGwgb24gcmVzaXplIGFuZCByZWFkeXN0YXRlY2hhbmdlXG5cdFx0XHQvLyBodHRwOi8vbW9kZXJuamF2YXNjcmlwdC5ibG9nc3BvdC5jb20vMjAxMy8wOC9idWlsZGluZy1iZXR0ZXItZGVib3VuY2UuaHRtbFxuXHRcdFx0dmFyIGRlYm91bmNlID0gZnVuY3Rpb24oZnVuYywgd2FpdCkge1xuXHRcdFx0XHR2YXIgdGltZW91dCwgdGltZXN0YW1wO1xuXHRcdFx0XHR2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR2YXIgbGFzdCA9IChuZXcgRGF0ZSgpKSAtIHRpbWVzdGFtcDtcblxuXHRcdFx0XHRcdGlmIChsYXN0IDwgd2FpdCkge1xuXHRcdFx0XHRcdFx0dGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRcdFx0XHRmdW5jKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuXG5cdFx0XHRcdFx0aWYgKCF0aW1lb3V0KSB7XG5cdFx0XHRcdFx0XHR0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblx0XHRcdHZhciBsYXN0Q2xpZW50V2lkdGggPSBkb2NFbGVtLmNsaWVudEhlaWdodDtcblx0XHRcdHZhciBvblJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpc1Z3RGlydHkgPSBNYXRoLm1heCh3aW5kb3cuaW5uZXJXaWR0aCB8fCAwLCBkb2NFbGVtLmNsaWVudFdpZHRoKSAhPT0gdW5pdHMud2lkdGggfHwgZG9jRWxlbS5jbGllbnRIZWlnaHQgIT09IGxhc3RDbGllbnRXaWR0aDtcblx0XHRcdFx0bGFzdENsaWVudFdpZHRoID0gZG9jRWxlbS5jbGllbnRIZWlnaHQ7XG5cdFx0XHRcdGlmICggaXNWd0RpcnR5ICkge1xuXHRcdFx0XHRcdHBmLmZpbGxJbWdzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdG9uKCB3aW5kb3csIFwicmVzaXplXCIsIGRlYm91bmNlKG9uUmVzaXplLCA5OSApICk7XG5cdFx0XHRvbiggZG9jdW1lbnQsIFwicmVhZHlzdGF0ZWNoYW5nZVwiLCBydW4gKTtcblx0XHR9KSgpO1xuXHR9XG5cblx0cGYucGljdHVyZWZpbGwgPSBwaWN0dXJlZmlsbDtcblx0Ly91c2UgdGhpcyBpbnRlcm5hbGx5IGZvciBlYXN5IG1vbmtleSBwYXRjaGluZy9wZXJmb3JtYW5jZSB0ZXN0aW5nXG5cdHBmLmZpbGxJbWdzID0gcGljdHVyZWZpbGw7XG5cdHBmLnRlYXJkb3duUnVuID0gbm9vcDtcblxuXHQvKiBleHBvc2UgbWV0aG9kcyBmb3IgdGVzdGluZyAqL1xuXHRwaWN0dXJlZmlsbC5fID0gcGY7XG5cblx0d2luZG93LnBpY3R1cmVmaWxsQ0ZHID0ge1xuXHRcdHBmOiBwZixcblx0XHRwdXNoOiBmdW5jdGlvbihhcmdzKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGFyZ3Muc2hpZnQoKTtcblx0XHRcdGlmICh0eXBlb2YgcGZbbmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRwZltuYW1lXS5hcHBseShwZiwgYXJncyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjZmdbbmFtZV0gPSBhcmdzWzBdO1xuXHRcdFx0XHRpZiAoYWxyZWFkeVJ1bikge1xuXHRcdFx0XHRcdHBmLmZpbGxJbWdzKCB7IHJlc2VsZWN0OiB0cnVlIH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR3aGlsZSAoc2V0T3B0aW9ucyAmJiBzZXRPcHRpb25zLmxlbmd0aCkge1xuXHRcdHdpbmRvdy5waWN0dXJlZmlsbENGRy5wdXNoKHNldE9wdGlvbnMuc2hpZnQoKSk7XG5cdH1cblxuXHQvKiBleHBvc2UgcGljdHVyZWZpbGwgKi9cblx0d2luZG93LnBpY3R1cmVmaWxsID0gcGljdHVyZWZpbGw7XG5cblx0LyogZXhwb3NlIHBpY3R1cmVmaWxsICovXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Ly8gQ29tbW9uSlMsIGp1c3QgZXhwb3J0XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBwaWN0dXJlZmlsbDtcblx0fSBlbHNlIGlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgKSB7XG5cdFx0Ly8gQU1EIHN1cHBvcnRcblx0XHRkZWZpbmUoIFwicGljdHVyZWZpbGxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBwaWN0dXJlZmlsbDsgfSApO1xuXHR9XG5cblx0Ly8gSUU4IGV2YWxzIHRoaXMgc3luYywgc28gaXQgbXVzdCBiZSB0aGUgbGFzdCB0aGluZyB3ZSBkb1xuXHRpZiAoICFwZi5zdXBQaWN0dXJlICkge1xuXHRcdHR5cGVzWyBcImltYWdlL3dlYnBcIiBdID0gZGV0ZWN0VHlwZVN1cHBvcnQoXCJpbWFnZS93ZWJwXCIsIFwiZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmtvQUFBQlhSVUpRVmxBNFdBb0FBQUFRQUFBQUFBQUFBQUFBUVV4UVNBd0FBQUFCQnhBUi9ROUVSUDhEQUFCV1VEZ2dHQUFBQURBQkFKMEJLZ0VBQVFBREFEUWxwQUFEY0FEKysvMVFBQT09XCIgKTtcblx0fVxuXG59ICkoIHdpbmRvdywgZG9jdW1lbnQgKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceURL=webpack-internal:///7229
#4 JavaScript::Eval (size: 323273) - SHA256: 5fe853fd886e3701282b49c3a06ff742a83561af89b6c60b7f58d348b34964ad
/** @license React v17.0.1
 * react-dom.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
/*
 Modernizr 3.0.0pre (Custom Build) | MIT
*/
var aa = __webpack_require__(7294),
    m = __webpack_require__(7418),
    r = __webpack_require__(3840);

function y(a) {
    for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++) b += "&args[]=" + encodeURIComponent(arguments[c]);
    return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."
}
if (!aa) throw Error(y(227));
var ba = new Set,
    ca = {};

function da(a, b) {
    ea(a, b);
    ea(a + "Capture", b)
}

function ea(a, b) {
    ca[a] = b;
    for (a = 0; a < b.length; a++) ba.add(b[a])
}
var fa = !("undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement),
    ha = /^[: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][: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\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,
    ia = Object.prototype.hasOwnProperty,
    ja = {},
    ka = {};

function la(a) {
    if (ia.call(ka, a)) return !0;
    if (ia.call(ja, a)) return !1;
    if (ha.test(a)) return ka[a] = !0;
    ja[a] = !0;
    return !1
}

function ma(a, b, c, d) {
    if (null !== c && 0 === c.type) return !1;
    switch (typeof b) {
        case "function":
        case "symbol":
            return !0;
        case "boolean":
            if (d) return !1;
            if (null !== c) return !c.acceptsBooleans;
            a = a.toLowerCase().slice(0, 5);
            return "data-" !== a && "aria-" !== a;
        default:
            return !1
    }
}

function na(a, b, c, d) {
    if (null === b || "undefined" === typeof b || ma(a, b, c, d)) return !0;
    if (d) return !1;
    if (null !== c) switch (c.type) {
        case 3:
            return !b;
        case 4:
            return !1 === b;
        case 5:
            return isNaN(b);
        case 6:
            return isNaN(b) || 1 > b
    }
    return !1
}

function B(a, b, c, d, e, f, g) {
    this.acceptsBooleans = 2 === b || 3 === b || 4 === b;
    this.attributeName = d;
    this.attributeNamespace = e;
    this.mustUseProperty = c;
    this.propertyName = a;
    this.type = b;
    this.sanitizeURL = f;
    this.removeEmptyString = g
}
var D = {};
"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a) {
    D[a] = new B(a, 0, !1, a, null, !1, !1)
});
[
    ["acceptCharset", "accept-charset"],
    ["className", "class"],
    ["htmlFor", "for"],
    ["httpEquiv", "http-equiv"]
].forEach(function(a) {
    var b = a[0];
    D[b] = new B(b, 1, !1, a[1], null, !1, !1)
});
["contentEditable", "draggable", "spellCheck", "value"].forEach(function(a) {
    D[a] = new B(a, 2, !1, a.toLowerCase(), null, !1, !1)
});
["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(a) {
    D[a] = new B(a, 2, !1, a, null, !1, !1)
});
"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a) {
    D[a] = new B(a, 3, !1, a.toLowerCase(), null, !1, !1)
});
["checked", "multiple", "muted", "selected"].forEach(function(a) {
    D[a] = new B(a, 3, !0, a, null, !1, !1)
});
["capture", "download"].forEach(function(a) {
    D[a] = new B(a, 4, !1, a, null, !1, !1)
});
["cols", "rows", "size", "span"].forEach(function(a) {
    D[a] = new B(a, 6, !1, a, null, !1, !1)
});
["rowSpan", "start"].forEach(function(a) {
    D[a] = new B(a, 5, !1, a.toLowerCase(), null, !1, !1)
});
var oa = /[\-:]([a-z])/g;

function pa(a) {
    return a[1].toUpperCase()
}
"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a) {
    var b = a.replace(oa,
        pa);
    D[b] = new B(b, 1, !1, a, null, !1, !1)
});
"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a) {
    var b = a.replace(oa, pa);
    D[b] = new B(b, 1, !1, a, "http://www.w3.org/1999/xlink", !1, !1)
});
["xml:base", "xml:lang", "xml:space"].forEach(function(a) {
    var b = a.replace(oa, pa);
    D[b] = new B(b, 1, !1, a, "http://www.w3.org/XML/1998/namespace", !1, !1)
});
["tabIndex", "crossOrigin"].forEach(function(a) {
    D[a] = new B(a, 1, !1, a.toLowerCase(), null, !1, !1)
});
D.xlinkHref = new B("xlinkHref", 1, !1, "xlink:href", "http://www.w3.org/1999/xlink", !0, !1);
["src", "href", "action", "formAction"].forEach(function(a) {
    D[a] = new B(a, 1, !1, a.toLowerCase(), null, !0, !0)
});

function qa(a, b, c, d) {
    var e = D.hasOwnProperty(b) ? D[b] : null;
    var f = null !== e ? 0 === e.type : d ? !1 : !(2 < b.length) || "o" !== b[0] && "O" !== b[0] || "n" !== b[1] && "N" !== b[1] ? !1 : !0;
    f || (na(b, c, e, d) && (c = null), d || null === e ? la(b) && (null === c ? a.removeAttribute(b) : a.setAttribute(b, "" + c)) : e.mustUseProperty ? a[e.propertyName] = null === c ? 3 === e.type ? !1 : "" : c : (b = e.attributeName, d = e.attributeNamespace, null === c ? a.removeAttribute(b) : (e = e.type, c = 3 === e || 4 === e && !0 === c ? "" : "" + c, d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c))))
}
var ra = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
    sa = 60103,
    ta = 60106,
    ua = 60107,
    wa = 60108,
    xa = 60114,
    ya = 60109,
    za = 60110,
    Aa = 60112,
    Ba = 60113,
    Ca = 60120,
    Da = 60115,
    Ea = 60116,
    Fa = 60121,
    Ga = 60128,
    Ha = 60129,
    Ia = 60130,
    Ja = 60131;
if ("function" === typeof Symbol && Symbol.for) {
    var E = Symbol.for;
    sa = E("react.element");
    ta = E("react.portal");
    ua = E("react.fragment");
    wa = E("react.strict_mode");
    xa = E("react.profiler");
    ya = E("react.provider");
    za = E("react.context");
    Aa = E("react.forward_ref");
    Ba = E("react.suspense");
    Ca = E("react.suspense_list");
    Da = E("react.memo");
    Ea = E("react.lazy");
    Fa = E("react.block");
    E("react.scope");
    Ga = E("react.opaque.id");
    Ha = E("react.debug_trace_mode");
    Ia = E("react.offscreen");
    Ja = E("react.legacy_hidden")
}
var Ka = "function" === typeof Symbol && Symbol.iterator;

function La(a) {
    if (null === a || "object" !== typeof a) return null;
    a = Ka && a[Ka] || a["@@iterator"];
    return "function" === typeof a ? a : null
}
var Ma;

function Na(a) {
    if (void 0 === Ma) try {
        throw Error();
    } catch (c) {
        var b = c.stack.trim().match(/\n( *(at )?)/);
        Ma = b && b[1] || ""
    }
    return "\n" + Ma + a
}
var Oa = !1;

function Pa(a, b) {
    if (!a || Oa) return "";
    Oa = !0;
    var c = Error.prepareStackTrace;
    Error.prepareStackTrace = void 0;
    try {
        if (b)
            if (b = function() {
                    throw Error();
                }, Object.defineProperty(b.prototype, "props", {set: function() {
                        throw Error();
                    }
                }), "object" === typeof Reflect && Reflect.construct) {
                try {
                    Reflect.construct(b, [])
                } catch (k) {
                    var d = k
                }
                Reflect.construct(a, [], b)
            } else {
                try {
                    b.call()
                } catch (k) {
                    d = k
                }
                a.call(b.prototype)
            } else {
            try {
                throw Error();
            } catch (k) {
                d = k
            }
            a()
        }
    } catch (k) {
        if (k && d && "string" === typeof k.stack) {
            for (var e = k.stack.split("\n"),
                    f = d.stack.split("\n"), g = e.length - 1, h = f.length - 1; 1 <= g && 0 <= h && e[g] !== f[h];) h--;
            for (; 1 <= g && 0 <= h; g--, h--)
                if (e[g] !== f[h]) {
                    if (1 !== g || 1 !== h) {
                        do
                            if (g--, h--, 0 > h || e[g] !== f[h]) return "\n" + e[g].replace(" at new ", " at ");
                        while (1 <= g && 0 <= h)
                    }
                    break
                }
        }
    } finally {
        Oa = !1, Error.prepareStackTrace = c
    }
    return (a = a ? a.displayName || a.name : "") ? Na(a) : ""
}

function Qa(a) {
    switch (a.tag) {
        case 5:
            return Na(a.type);
        case 16:
            return Na("Lazy");
        case 13:
            return Na("Suspense");
        case 19:
            return Na("SuspenseList");
        case 0:
        case 2:
        case 15:
            return a = Pa(a.type, !1), a;
        case 11:
            return a = Pa(a.type.render, !1), a;
        case 22:
            return a = Pa(a.type._render, !1), a;
        case 1:
            return a = Pa(a.type, !0), a;
        default:
            return ""
    }
}

function Ra(a) {
    if (null == a) return null;
    if ("function" === typeof a) return a.displayName || a.name || null;
    if ("string" === typeof a) return a;
    switch (a) {
        case ua:
            return "Fragment";
        case ta:
            return "Portal";
        case xa:
            return "Profiler";
        case wa:
            return "StrictMode";
        case Ba:
            return "Suspense";
        case Ca:
            return "SuspenseList"
    }
    if ("object" === typeof a) switch (a.$$typeof) {
        case za:
            return (a.displayName || "Context") + ".Consumer";
        case ya:
            return (a._context.displayName || "Context") + ".Provider";
        case Aa:
            var b = a.render;
            b = b.displayName || b.name || "";
            return a.displayName || ("" !== b ? "ForwardRef(" + b + ")" : "ForwardRef");
        case Da:
            return Ra(a.type);
        case Fa:
            return Ra(a._render);
        case Ea:
            b = a._payload;
            a = a._init;
            try {
                return Ra(a(b))
            } catch (c) {}
    }
    return null
}

function Sa(a) {
    switch (typeof a) {
        case "boolean":
        case "number":
        case "object":
        case "string":
        case "undefined":
            return a;
        default:
            return ""
    }
}

function Ta(a) {
    var b = a.type;
    return (a = a.nodeName) && "input" === a.toLowerCase() && ("checkbox" === b || "radio" === b)
}

function Ua(a) {
    var b = Ta(a) ? "checked" : "value",
        c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b),
        d = "" + a[b];
    if (!a.hasOwnProperty(b) && "undefined" !== typeof c && "function" === typeof c.get && "function" === typeof c.set) {
        var e = c.get,
            f = c.set;
        Object.defineProperty(a, b, {
            configurable: !0,
            get: function() {
                return e.call(this)
            },
            set: function(a) {
                d = "" + a;
                f.call(this, a)
            }
        });
        Object.defineProperty(a, b, {
            enumerable: c.enumerable
        });
        return {
            getValue: function() {
                return d
            },
            setValue: function(a) {
                d = "" + a
            },
            stopTracking: function() {
                a._valueTracker =
                    null;
                delete a[b]
            }
        }
    }
}

function Va(a) {
    a._valueTracker || (a._valueTracker = Ua(a))
}

function Wa(a) {
    if (!a) return !1;
    var b = a._valueTracker;
    if (!b) return !0;
    var c = b.getValue();
    var d = "";
    a && (d = Ta(a) ? a.checked ? "true" : "false" : a.value);
    a = d;
    return a !== c ? (b.setValue(a), !0) : !1
}

function Xa(a) {
    a = a || ("undefined" !== typeof document ? document : void 0);
    if ("undefined" === typeof a) return null;
    try {
        return a.activeElement || a.body
    } catch (b) {
        return a.body
    }
}

function Ya(a, b) {
    var c = b.checked;
    return m({}, b, {
        defaultChecked: void 0,
        defaultValue: void 0,
        value: void 0,
        checked: null != c ? c : a._wrapperState.initialChecked
    })
}

function Za(a, b) {
    var c = null == b.defaultValue ? "" : b.defaultValue,
        d = null != b.checked ? b.checked : b.defaultChecked;
    c = Sa(null != b.value ? b.value : c);
    a._wrapperState = {
        initialChecked: d,
        initialValue: c,
        controlled: "checkbox" === b.type || "radio" === b.type ? null != b.checked : null != b.value
    }
}

function $a(a, b) {
    b = b.checked;
    null != b && qa(a, "checked", b, !1)
}

function ab(a, b) {
    $a(a, b);
    var c = Sa(b.value),
        d = b.type;
    if (null != c)
        if ("number" === d) {
            if (0 === c && "" === a.value || a.value != c) a.value = "" + c
        } else a.value !== "" + c && (a.value = "" + c);
    else if ("submit" === d || "reset" === d) {
        a.removeAttribute("value");
        return
    }
    b.hasOwnProperty("value") ? bb(a, b.type, c) : b.hasOwnProperty("defaultValue") && bb(a, b.type, Sa(b.defaultValue));
    null == b.checked && null != b.defaultChecked && (a.defaultChecked = !!b.defaultChecked)
}

function cb(a, b, c) {
    if (b.hasOwnProperty("value") || b.hasOwnProperty("defaultValue")) {
        var d = b.type;
        if (!("submit" !== d && "reset" !== d || void 0 !== b.value && null !== b.value)) return;
        b = "" + a._wrapperState.initialValue;
        c || b === a.value || (a.value = b);
        a.defaultValue = b
    }
    c = a.name;
    "" !== c && (a.name = "");
    a.defaultChecked = !!a._wrapperState.initialChecked;
    "" !== c && (a.name = c)
}

function bb(a, b, c) {
    if ("number" !== b || Xa(a.ownerDocument) !== a) null == c ? a.defaultValue = "" + a._wrapperState.initialValue : a.defaultValue !== "" + c && (a.defaultValue = "" + c)
}

function db(a) {
    var b = "";
    aa.Children.forEach(a, function(a) {
        null != a && (b += a)
    });
    return b
}

function eb(a, b) {
    a = m({
        children: void 0
    }, b);
    if (b = db(b.children)) a.children = b;
    return a
}

function fb(a, b, c, d) {
    a = a.options;
    if (b) {
        b = {};
        for (var e = 0; e < c.length; e++) b["$" + c[e]] = !0;
        for (c = 0; c < a.length; c++) e = b.hasOwnProperty("$" + a[c].value), a[c].selected !== e && (a[c].selected = e), e && d && (a[c].defaultSelected = !0)
    } else {
        c = "" + Sa(c);
        b = null;
        for (e = 0; e < a.length; e++) {
            if (a[e].value === c) {
                a[e].selected = !0;
                d && (a[e].defaultSelected = !0);
                return
            }
            null !== b || a[e].disabled || (b = a[e])
        }
        null !== b && (b.selected = !0)
    }
}

function gb(a, b) {
    if (null != b.dangerouslySetInnerHTML) throw Error(y(91));
    return m({}, b, {
        value: void 0,
        defaultValue: void 0,
        children: "" + a._wrapperState.initialValue
    })
}

function hb(a, b) {
    var c = b.value;
    if (null == c) {
        c = b.children;
        b = b.defaultValue;
        if (null != c) {
            if (null != b) throw Error(y(92));
            if (Array.isArray(c)) {
                if (!(1 >= c.length)) throw Error(y(93));
                c = c[0]
            }
            b = c
        }
        null == b && (b = "");
        c = b
    }
    a._wrapperState = {
        initialValue: Sa(c)
    }
}

function ib(a, b) {
    var c = Sa(b.value),
        d = Sa(b.defaultValue);
    null != c && (c = "" + c, c !== a.value && (a.value = c), null == b.defaultValue && a.defaultValue !== c && (a.defaultValue = c));
    null != d && (a.defaultValue = "" + d)
}

function jb(a) {
    var b = a.textContent;
    b === a._wrapperState.initialValue && "" !== b && null !== b && (a.value = b)
}
var kb = {
    html: "http://www.w3.org/1999/xhtml",
    mathml: "http://www.w3.org/1998/Math/MathML",
    svg: "http://www.w3.org/2000/svg"
};

function lb(a) {
    switch (a) {
        case "svg":
            return "http://www.w3.org/2000/svg";
        case "math":
            return "http://www.w3.org/1998/Math/MathML";
        default:
            return "http://www.w3.org/1999/xhtml"
    }
}

function mb(a, b) {
    return null == a || "http://www.w3.org/1999/xhtml" === a ? lb(b) : "http://www.w3.org/2000/svg" === a && "foreignObject" === b ? "http://www.w3.org/1999/xhtml" : a
}
var nb, ob = function(a) {
    return "undefined" !== typeof MSApp && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) {
        MSApp.execUnsafeLocalFunction(function() {
            return a(b, c, d, e)
        })
    } : a
}(function(a, b) {
    if (a.namespaceURI !== kb.svg || "innerHTML" in a) a.innerHTML = b;
    else {
        nb = nb || document.createElement("div");
        nb.innerHTML = "<svg>" + b.valueOf().toString() + "</svg>";
        for (b = nb.firstChild; a.firstChild;) a.removeChild(a.firstChild);
        for (; b.firstChild;) a.appendChild(b.firstChild)
    }
});

function pb(a, b) {
    if (b) {
        var c = a.firstChild;
        if (c && c === a.lastChild && 3 === c.nodeType) {
            c.nodeValue = b;
            return
        }
    }
    a.textContent = b
}
var qb = {
        animationIterationCount: !0,
        borderImageOutset: !0,
        borderImageSlice: !0,
        borderImageWidth: !0,
        boxFlex: !0,
        boxFlexGroup: !0,
        boxOrdinalGroup: !0,
        columnCount: !0,
        columns: !0,
        flex: !0,
        flexGrow: !0,
        flexPositive: !0,
        flexShrink: !0,
        flexNegative: !0,
        flexOrder: !0,
        gridArea: !0,
        gridRow: !0,
        gridRowEnd: !0,
        gridRowSpan: !0,
        gridRowStart: !0,
        gridColumn: !0,
        gridColumnEnd: !0,
        gridColumnSpan: !0,
        gridColumnStart: !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
    },
    rb = ["Webkit", "ms", "Moz", "O"];
Object.keys(qb).forEach(function(a) {
    rb.forEach(function(b) {
        b = b + a.charAt(0).toUpperCase() + a.substring(1);
        qb[b] = qb[a]
    })
});

function sb(a, b, c) {
    return null == b || "boolean" === typeof b || "" === b ? "" : c || "number" !== typeof b || 0 === b || qb.hasOwnProperty(a) && qb[a] ? ("" + b).trim() : b + "px"
}

function tb(a, b) {
    a = a.style;
    for (var c in b)
        if (b.hasOwnProperty(c)) {
            var d = 0 === c.indexOf("--"),
                e = sb(c, b[c], d);
            "float" === c && (c = "cssFloat");
            d ? a.setProperty(c, e) : a[c] = e
        }
}
var ub = m({
    menuitem: !0
}, {
    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
});

function vb(a, b) {
    if (b) {
        if (ub[a] && (null != b.children || null != b.dangerouslySetInnerHTML)) throw Error(y(137, a));
        if (null != b.dangerouslySetInnerHTML) {
            if (null != b.children) throw Error(y(60));
            if (!("object" === typeof b.dangerouslySetInnerHTML && "__html" in b.dangerouslySetInnerHTML)) throw Error(y(61));
        }
        if (null != b.style && "object" !== typeof b.style) throw Error(y(62));
    }
}

function wb(a, b) {
    if (-1 === a.indexOf("-")) return "string" === typeof b.is;
    switch (a) {
        case "annotation-xml":
        case "color-profile":
        case "font-face":
        case "font-face-src":
        case "font-face-uri":
        case "font-face-format":
        case "font-face-name":
        case "missing-glyph":
            return !1;
        default:
            return !0
    }
}

function xb(a) {
    a = a.target || a.srcElement || window;
    a.correspondingUseElement && (a = a.correspondingUseElement);
    return 3 === a.nodeType ? a.parentNode : a
}
var yb = null,
    zb = null,
    Ab = null;

function Bb(a) {
    if (a = Cb(a)) {
        if ("function" !== typeof yb) throw Error(y(280));
        var b = a.stateNode;
        b && (b = Db(b), yb(a.stateNode, a.type, b))
    }
}

function Eb(a) {
    zb ? Ab ? Ab.push(a) : Ab = [a] : zb = a
}

function Fb() {
    if (zb) {
        var a = zb,
            b = Ab;
        Ab = zb = null;
        Bb(a);
        if (b)
            for (a = 0; a < b.length; a++) Bb(b[a])
    }
}

function Gb(a, b) {
    return a(b)
}

function Hb(a, b, c, d, e) {
    return a(b, c, d, e)
}

function Ib() {}
var Jb = Gb,
    Kb = !1,
    Lb = !1;

function Mb() {
    if (null !== zb || null !== Ab) Ib(), Fb()
}

function Nb(a, b, c) {
    if (Lb) return a(b, c);
    Lb = !0;
    try {
        return Jb(a, b, c)
    } finally {
        Lb = !1, Mb()
    }
}

function Ob(a, b) {
    var c = a.stateNode;
    if (null === c) return null;
    var d = Db(c);
    if (null === d) return null;
    c = d[b];
    a: switch (b) {
        case "onClick":
        case "onClickCapture":
        case "onDoubleClick":
        case "onDoubleClickCapture":
        case "onMouseDown":
        case "onMouseDownCapture":
        case "onMouseMove":
        case "onMouseMoveCapture":
        case "onMouseUp":
        case "onMouseUpCapture":
        case "onMouseEnter":
            (d = !d.disabled) || (a = a.type, d = !("button" === a || "input" === a || "select" === a || "textarea" === a));
            a = !d;
            break a;
        default:
            a = !1
    }
    if (a) return null;
    if (c && "function" !==
        typeof c) throw Error(y(231, b, typeof c));
    return c
}
var Pb = !1;
if (fa) try {
    var Qb = {};
    Object.defineProperty(Qb, "passive", {get: function() {
            Pb = !0
        }
    });
    window.addEventListener("test", Qb, Qb);
    window.removeEventListener("test", Qb, Qb)
} catch (a) {
    Pb = !1
}

function Rb(a, b, c, d, e, f, g, h, k) {
    var l = Array.prototype.slice.call(arguments, 3);
    try {
        b.apply(c, l)
    } catch (n) {
        this.onError(n)
    }
}
var Sb = !1,
    Tb = null,
    Ub = !1,
    Vb = null,
    Wb = {
        onError: function(a) {
            Sb = !0;
            Tb = a
        }
    };

function Xb(a, b, c, d, e, f, g, h, k) {
    Sb = !1;
    Tb = null;
    Rb.apply(Wb, arguments)
}

function Yb(a, b, c, d, e, f, g, h, k) {
    Xb.apply(this, arguments);
    if (Sb) {
        if (Sb) {
            var l = Tb;
            Sb = !1;
            Tb = null
        } else throw Error(y(198));
        Ub || (Ub = !0, Vb = l)
    }
}

function Zb(a) {
    var b = a,
        c = a;
    if (a.alternate)
        for (; b.return;) b = b.return;
    else {
        a = b;
        do b = a, 0 !== (b.flags & 1026) && (c = b.return), a = b.return; while (a)
    }
    return 3 === b.tag ? c : null
}

function $b(a) {
    if (13 === a.tag) {
        var b = a.memoizedState;
        null === b && (a = a.alternate, null !== a && (b = a.memoizedState));
        if (null !== b) return b.dehydrated
    }
    return null
}

function ac(a) {
    if (Zb(a) !== a) throw Error(y(188));
}

function bc(a) {
    var b = a.alternate;
    if (!b) {
        b = Zb(a);
        if (null === b) throw Error(y(188));
        return b !== a ? null : a
    }
    for (var c = a, d = b;;) {
        var e = c.return;
        if (null === e) break;
        var f = e.alternate;
        if (null === f) {
            d = e.return;
            if (null !== d) {
                c = d;
                continue
            }
            break
        }
        if (e.child === f.child) {
            for (f = e.child; f;) {
                if (f === c) return ac(e), a;
                if (f === d) return ac(e), b;
                f = f.sibling
            }
            throw Error(y(188));
        }
        if (c.return !== d.return) c = e, d = f;
        else {
            for (var g = !1, h = e.child; h;) {
                if (h === c) {
                    g = !0;
                    c = e;
                    d = f;
                    break
                }
                if (h === d) {
                    g = !0;
                    d = e;
                    c = f;
                    break
                }
                h = h.sibling
            }
            if (!g) {
                for (h = f.child; h;) {
                    if (h ===
                        c) {
                        g = !0;
                        c = f;
                        d = e;
                        break
                    }
                    if (h === d) {
                        g = !0;
                        d = f;
                        c = e;
                        break
                    }
                    h = h.sibling
                }
                if (!g) throw Error(y(189));
            }
        }
        if (c.alternate !== d) throw Error(y(190));
    }
    if (3 !== c.tag) throw Error(y(188));
    return c.stateNode.current === c ? a : b
}

function cc(a) {
    a = bc(a);
    if (!a) return null;
    for (var b = a;;) {
        if (5 === b.tag || 6 === b.tag) return b;
        if (b.child) b.child.return = b, b = b.child;
        else {
            if (b === a) break;
            for (; !b.sibling;) {
                if (!b.return || b.return === a) return null;
                b = b.return
            }
            b.sibling.return = b.return;
            b = b.sibling
        }
    }
    return null
}

function dc(a, b) {
    for (var c = a.alternate; null !== b;) {
        if (b === a || b === c) return !0;
        b = b.return
    }
    return !1
}
var ec, fc, gc, hc, ic = !1,
    jc = [],
    kc = null,
    lc = null,
    mc = null,
    nc = new Map,
    oc = new Map,
    pc = [],
    qc = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");

function rc(a, b, c, d, e) {
    return {
        blockedOn: a,
        domEventName: b,
        eventSystemFlags: c | 16,
        nativeEvent: e,
        targetContainers: [d]
    }
}

function sc(a, b) {
    switch (a) {
        case "focusin":
        case "focusout":
            kc = null;
            break;
        case "dragenter":
        case "dragleave":
            lc = null;
            break;
        case "mouseover":
        case "mouseout":
            mc = null;
            break;
        case "pointerover":
        case "pointerout":
            nc.delete(b.pointerId);
            break;
        case "gotpointercapture":
        case "lostpointercapture":
            oc.delete(b.pointerId)
    }
}

function tc(a, b, c, d, e, f) {
    if (null === a || a.nativeEvent !== f) return a = rc(b, c, d, e, f), null !== b && (b = Cb(b), null !== b && fc(b)), a;
    a.eventSystemFlags |= d;
    b = a.targetContainers;
    null !== e && -1 === b.indexOf(e) && b.push(e);
    return a
}

function uc(a, b, c, d, e) {
    switch (b) {
        case "focusin":
            return kc = tc(kc, a, b, c, d, e), !0;
        case "dragenter":
            return lc = tc(lc, a, b, c, d, e), !0;
        case "mouseover":
            return mc = tc(mc, a, b, c, d, e), !0;
        case "pointerover":
            var f = e.pointerId;
            nc.set(f, tc(nc.get(f) || null, a, b, c, d, e));
            return !0;
        case "gotpointercapture":
            return f = e.pointerId, oc.set(f, tc(oc.get(f) || null, a, b, c, d, e)), !0
    }
    return !1
}

function vc(a) {
    var b = wc(a.target);
    if (null !== b) {
        var c = Zb(b);
        if (null !== c)
            if (b = c.tag, 13 === b) {
                if (b = $b(c), null !== b) {
                    a.blockedOn = b;
                    hc(a.lanePriority, function() {
                        r.unstable_runWithPriority(a.priority, function() {
                            gc(c)
                        })
                    });
                    return
                }
            } else if (3 === b && c.stateNode.hydrate) {
            a.blockedOn = 3 === c.tag ? c.stateNode.containerInfo : null;
            return
        }
    }
    a.blockedOn = null
}

function xc(a) {
    if (null !== a.blockedOn) return !1;
    for (var b = a.targetContainers; 0 < b.length;) {
        var c = yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
        if (null !== c) return b = Cb(c), null !== b && fc(b), a.blockedOn = c, !1;
        b.shift()
    }
    return !0
}

function zc(a, b, c) {
    xc(a) && c.delete(b)
}

function Ac() {
    for (ic = !1; 0 < jc.length;) {
        var a = jc[0];
        if (null !== a.blockedOn) {
            a = Cb(a.blockedOn);
            null !== a && ec(a);
            break
        }
        for (var b = a.targetContainers; 0 < b.length;) {
            var c = yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent);
            if (null !== c) {
                a.blockedOn = c;
                break
            }
            b.shift()
        }
        null === a.blockedOn && jc.shift()
    }
    null !== kc && xc(kc) && (kc = null);
    null !== lc && xc(lc) && (lc = null);
    null !== mc && xc(mc) && (mc = null);
    nc.forEach(zc);
    oc.forEach(zc)
}

function Bc(a, b) {
    a.blockedOn === b && (a.blockedOn = null, ic || (ic = !0, r.unstable_scheduleCallback(r.unstable_NormalPriority, Ac)))
}

function Cc(a) {
    function b(b) {
        return Bc(b, a)
    }
    if (0 < jc.length) {
        Bc(jc[0], a);
        for (var c = 1; c < jc.length; c++) {
            var d = jc[c];
            d.blockedOn === a && (d.blockedOn = null)
        }
    }
    null !== kc && Bc(kc, a);
    null !== lc && Bc(lc, a);
    null !== mc && Bc(mc, a);
    nc.forEach(b);
    oc.forEach(b);
    for (c = 0; c < pc.length; c++) d = pc[c], d.blockedOn === a && (d.blockedOn = null);
    for (; 0 < pc.length && (c = pc[0], null === c.blockedOn);) vc(c), null === c.blockedOn && pc.shift()
}

function Dc(a, b) {
    var c = {};
    c[a.toLowerCase()] = b.toLowerCase();
    c["Webkit" + a] = "webkit" + b;
    c["Moz" + a] = "moz" + b;
    return c
}
var Ec = {
        animationend: Dc("Animation", "AnimationEnd"),
        animationiteration: Dc("Animation", "AnimationIteration"),
        animationstart: Dc("Animation", "AnimationStart"),
        transitionend: Dc("Transition", "TransitionEnd")
    },
    Fc = {},
    Gc = {};
fa && (Gc = document.createElement("div").style, "AnimationEvent" in window || (delete Ec.animationend.animation, delete Ec.animationiteration.animation, delete Ec.animationstart.animation), "TransitionEvent" in window || delete Ec.transitionend.transition);

function Hc(a) {
    if (Fc[a]) return Fc[a];
    if (!Ec[a]) return a;
    var b = Ec[a],
        c;
    for (c in b)
        if (b.hasOwnProperty(c) && c in Gc) return Fc[a] = b[c];
    return a
}
var Ic = Hc("animationend"),
    Jc = Hc("animationiteration"),
    Kc = Hc("animationstart"),
    Lc = Hc("transitionend"),
    Mc = new Map,
    Nc = new Map,
    Oc = ["abort", "abort", Ic, "animationEnd", Jc, "animationIteration", Kc, "animationStart", "canplay", "canPlay", "canplaythrough", "canPlayThrough", "durationchange", "durationChange", "emptied", "emptied", "encrypted", "encrypted", "ended", "ended", "error", "error", "gotpointercapture", "gotPointerCapture", "load", "load", "loadeddata", "loadedData", "loadedmetadata", "loadedMetadata", "loadstart", "loadStart",
        "lostpointercapture", "lostPointerCapture", "playing", "playing", "progress", "progress", "seeking", "seeking", "stalled", "stalled", "suspend", "suspend", "timeupdate", "timeUpdate", Lc, "transitionEnd", "waiting", "waiting"
    ];

function Pc(a, b) {
    for (var c = 0; c < a.length; c += 2) {
        var d = a[c],
            e = a[c + 1];
        e = "on" + (e[0].toUpperCase() + e.slice(1));
        Nc.set(d, b);
        Mc.set(d, e);
        da(e, [d])
    }
}
var Qc = r.unstable_now;
Qc();
var F = 8;

function Rc(a) {
    if (0 !== (1 & a)) return F = 15, 1;
    if (0 !== (2 & a)) return F = 14, 2;
    if (0 !== (4 & a)) return F = 13, 4;
    var b = 24 & a;
    if (0 !== b) return F = 12, b;
    if (0 !== (a & 32)) return F = 11, 32;
    b = 192 & a;
    if (0 !== b) return F = 10, b;
    if (0 !== (a & 256)) return F = 9, 256;
    b = 3584 & a;
    if (0 !== b) return F = 8, b;
    if (0 !== (a & 4096)) return F = 7, 4096;
    b = 4186112 & a;
    if (0 !== b) return F = 6, b;
    b = 62914560 & a;
    if (0 !== b) return F = 5, b;
    if (a & 67108864) return F = 4, 67108864;
    if (0 !== (a & 134217728)) return F = 3, 134217728;
    b = 805306368 & a;
    if (0 !== b) return F = 2, b;
    if (0 !== (1073741824 & a)) return F = 1, 1073741824;
    F = 8;
    return a
}

function Sc(a) {
    switch (a) {
        case 99:
            return 15;
        case 98:
            return 10;
        case 97:
        case 96:
            return 8;
        case 95:
            return 2;
        default:
            return 0
    }
}

function Tc(a) {
    switch (a) {
        case 15:
        case 14:
            return 99;
        case 13:
        case 12:
        case 11:
        case 10:
            return 98;
        case 9:
        case 8:
        case 7:
        case 6:
        case 4:
        case 5:
            return 97;
        case 3:
        case 2:
        case 1:
            return 95;
        case 0:
            return 90;
        default:
            throw Error(y(358, a));
    }
}

function Uc(a, b) {
    var c = a.pendingLanes;
    if (0 === c) return F = 0;
    var d = 0,
        e = 0,
        f = a.expiredLanes,
        g = a.suspendedLanes,
        h = a.pingedLanes;
    if (0 !== f) d = f, e = F = 15;
    else if (f = c & 134217727, 0 !== f) {
        var k = f & ~g;
        0 !== k ? (d = Rc(k), e = F) : (h &= f, 0 !== h && (d = Rc(h), e = F))
    } else f = c & ~g, 0 !== f ? (d = Rc(f), e = F) : 0 !== h && (d = Rc(h), e = F);
    if (0 === d) return 0;
    d = 31 - Vc(d);
    d = c & ((0 > d ? 0 : 1 << d) << 1) - 1;
    if (0 !== b && b !== d && 0 === (b & g)) {
        Rc(b);
        if (e <= F) return b;
        F = e
    }
    b = a.entangledLanes;
    if (0 !== b)
        for (a = a.entanglements, b &= d; 0 < b;) c = 31 - Vc(b), e = 1 << c, d |= a[c], b &= ~e;
    return d
}

function Wc(a) {
    a = a.pendingLanes & -1073741825;
    return 0 !== a ? a : a & 1073741824 ? 1073741824 : 0
}

function Xc(a, b) {
    switch (a) {
        case 15:
            return 1;
        case 14:
            return 2;
        case 12:
            return a = Yc(24 & ~b), 0 === a ? Xc(10, b) : a;
        case 10:
            return a = Yc(192 & ~b), 0 === a ? Xc(8, b) : a;
        case 8:
            return a = Yc(3584 & ~b), 0 === a && (a = Yc(4186112 & ~b), 0 === a && (a = 512)), a;
        case 2:
            return b = Yc(805306368 & ~b), 0 === b && (b = 268435456), b
    }
    throw Error(y(358, a));
}

function Yc(a) {
    return a & -a
}

function Zc(a) {
    for (var b = [], c = 0; 31 > c; c++) b.push(a);
    return b
}

function $c(a, b, c) {
    a.pendingLanes |= b;
    var d = b - 1;
    a.suspendedLanes &= d;
    a.pingedLanes &= d;
    a = a.eventTimes;
    b = 31 - Vc(b);
    a[b] = c
}
var Vc = Math.clz32 ? Math.clz32 : ad,
    bd = Math.log,
    cd = Math.LN2;

function ad(a) {
    return 0 === a ? 32 : 31 - (bd(a) / cd | 0) | 0
}
var dd = r.unstable_UserBlockingPriority,
    ed = r.unstable_runWithPriority,
    fd = !0;

function gd(a, b, c, d) {
    Kb || Ib();
    var e = hd,
        f = Kb;
    Kb = !0;
    try {
        Hb(e, a, b, c, d)
    } finally {
        (Kb = f) || Mb()
    }
}

function id(a, b, c, d) {
    ed(dd, hd.bind(null, a, b, c, d))
}

function hd(a, b, c, d) {
    if (fd) {
        var e;
        if ((e = 0 === (b & 4)) && 0 < jc.length && -1 < qc.indexOf(a)) a = rc(null, a, b, c, d), jc.push(a);
        else {
            var f = yc(a, b, c, d);
            if (null === f) e && sc(a, d);
            else {
                if (e) {
                    if (-1 < qc.indexOf(a)) {
                        a = rc(f, a, b, c, d);
                        jc.push(a);
                        return
                    }
                    if (uc(f, a, b, c, d)) return;
                    sc(a, d)
                }
                jd(a, b, d, null, c)
            }
        }
    }
}

function yc(a, b, c, d) {
    var e = xb(d);
    e = wc(e);
    if (null !== e) {
        var f = Zb(e);
        if (null === f) e = null;
        else {
            var g = f.tag;
            if (13 === g) {
                e = $b(f);
                if (null !== e) return e;
                e = null
            } else if (3 === g) {
                if (f.stateNode.hydrate) return 3 === f.tag ? f.stateNode.containerInfo : null;
                e = null
            } else f !== e && (e = null)
        }
    }
    jd(a, b, d, e, c);
    return null
}
var kd = null,
    ld = null,
    md = null;

function nd() {
    if (md) return md;
    var a, b = ld,
        c = b.length,
        d, e = "value" in kd ? kd.value : kd.textContent,
        f = e.length;
    for (a = 0; a < c && b[a] === e[a]; a++);
    var g = c - a;
    for (d = 1; d <= g && b[c - d] === e[f - d]; d++);
    return md = e.slice(a, 1 < d ? 1 - d : void 0)
}

function od(a) {
    var b = a.keyCode;
    "charCode" in a ? (a = a.charCode, 0 === a && 13 === b && (a = 13)) : a = b;
    10 === a && (a = 13);
    return 32 <= a || 13 === a ? a : 0
}

function pd() {
    return !0
}

function qd() {
    return !1
}

function rd(a) {
    function b(b, d, e, f, g) {
        this._reactName = b;
        this._targetInst = e;
        this.type = d;
        this.nativeEvent = f;
        this.target = g;
        this.currentTarget = null;
        for (var c in a) a.hasOwnProperty(c) && (b = a[c], this[c] = b ? b(f) : f[c]);
        this.isDefaultPrevented = (null != f.defaultPrevented ? f.defaultPrevented : !1 === f.returnValue) ? pd : qd;
        this.isPropagationStopped = qd;
        return this
    }
    m(b.prototype, {
        preventDefault: function() {
            this.defaultPrevented = !0;
            var a = this.nativeEvent;
            a && (a.preventDefault ? a.preventDefault() : "unknown" !== typeof a.returnValue &&
                (a.returnValue = !1), this.isDefaultPrevented = pd)
        },
        stopPropagation: function() {
            var a = this.nativeEvent;
            a && (a.stopPropagation ? a.stopPropagation() : "unknown" !== typeof a.cancelBubble && (a.cancelBubble = !0), this.isPropagationStopped = pd)
        },
        persist: function() {},
        isPersistent: pd
    });
    return b
}
var sd = {
        eventPhase: 0,
        bubbles: 0,
        cancelable: 0,
        timeStamp: function(a) {
            return a.timeStamp || Date.now()
        },
        defaultPrevented: 0,
        isTrusted: 0
    },
    td = rd(sd),
    ud = m({}, sd, {
        view: 0,
        detail: 0
    }),
    vd = rd(ud),
    wd, xd, yd, Ad = m({}, ud, {
        screenX: 0,
        screenY: 0,
        clientX: 0,
        clientY: 0,
        pageX: 0,
        pageY: 0,
        ctrlKey: 0,
        shiftKey: 0,
        altKey: 0,
        metaKey: 0,
        getModifierState: zd,
        button: 0,
        buttons: 0,
        relatedTarget: function(a) {
            return void 0 === a.relatedTarget ? a.fromElement === a.srcElement ? a.toElement : a.fromElement : a.relatedTarget
        },
        movementX: function(a) {
            if ("movementX" in
                a) return a.movementX;
            a !== yd && (yd && "mousemove" === a.type ? (wd = a.screenX - yd.screenX, xd = a.screenY - yd.screenY) : xd = wd = 0, yd = a);
            return wd
        },
        movementY: function(a) {
            return "movementY" in a ? a.movementY : xd
        }
    }),
    Bd = rd(Ad),
    Cd = m({}, Ad, {
        dataTransfer: 0
    }),
    Dd = rd(Cd),
    Ed = m({}, ud, {
        relatedTarget: 0
    }),
    Fd = rd(Ed),
    Gd = m({}, sd, {
        animationName: 0,
        elapsedTime: 0,
        pseudoElement: 0
    }),
    Hd = rd(Gd),
    Id = m({}, sd, {
        clipboardData: function(a) {
            return "clipboardData" in a ? a.clipboardData : window.clipboardData
        }
    }),
    Jd = rd(Id),
    Kd = m({}, sd, {
        data: 0
    }),
    Ld = rd(Kd),
    Md = {
        Esc: "Escape",
        Spacebar: " ",
        Left: "ArrowLeft",
        Up: "ArrowUp",
        Right: "ArrowRight",
        Down: "ArrowDown",
        Del: "Delete",
        Win: "OS",
        Menu: "ContextMenu",
        Apps: "ContextMenu",
        Scroll: "ScrollLock",
        MozPrintableKey: "Unidentified"
    },
    Nd = {
        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"
    },
    Od = {
        Alt: "altKey",
        Control: "ctrlKey",
        Meta: "metaKey",
        Shift: "shiftKey"
    };

function Pd(a) {
    var b = this.nativeEvent;
    return b.getModifierState ? b.getModifierState(a) : (a = Od[a]) ? !!b[a] : !1
}

function zd() {
    return Pd
}
var Qd = m({}, ud, {
        key: function(a) {
            if (a.key) {
                var b = Md[a.key] || a.key;
                if ("Unidentified" !== b) return b
            }
            return "keypress" === a.type ? (a = od(a), 13 === a ? "Enter" : String.fromCharCode(a)) : "keydown" === a.type || "keyup" === a.type ? Nd[a.keyCode] || "Unidentified" : ""
        },
        code: 0,
        location: 0,
        ctrlKey: 0,
        shiftKey: 0,
        altKey: 0,
        metaKey: 0,
        repeat: 0,
        locale: 0,
        getModifierState: zd,
        charCode: function(a) {
            return "keypress" === a.type ? od(a) : 0
        },
        keyCode: function(a) {
            return "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0
        },
        which: function(a) {
            return "keypress" ===
                a.type ? od(a) : "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0
        }
    }),
    Rd = rd(Qd),
    Sd = m({}, Ad, {
        pointerId: 0,
        width: 0,
        height: 0,
        pressure: 0,
        tangentialPressure: 0,
        tiltX: 0,
        tiltY: 0,
        twist: 0,
        pointerType: 0,
        isPrimary: 0
    }),
    Td = rd(Sd),
    Ud = m({}, ud, {
        touches: 0,
        targetTouches: 0,
        changedTouches: 0,
        altKey: 0,
        metaKey: 0,
        ctrlKey: 0,
        shiftKey: 0,
        getModifierState: zd
    }),
    Vd = rd(Ud),
    Wd = m({}, sd, {
        propertyName: 0,
        elapsedTime: 0,
        pseudoElement: 0
    }),
    Xd = rd(Wd),
    Yd = m({}, Ad, {
        deltaX: function(a) {
            return "deltaX" in a ? a.deltaX : "wheelDeltaX" in a ? -a.wheelDeltaX : 0
        },
        deltaY: function(a) {
            return "deltaY" in a ? a.deltaY : "wheelDeltaY" in a ? -a.wheelDeltaY : "wheelDelta" in a ? -a.wheelDelta : 0
        },
        deltaZ: 0,
        deltaMode: 0
    }),
    Zd = rd(Yd),
    $d = [9, 13, 27, 32],
    ae = fa && "CompositionEvent" in window,
    be = null;
fa && "documentMode" in document && (be = document.documentMode);
var ce = fa && "TextEvent" in window && !be,
    de = fa && (!ae || be && 8 < be && 11 >= be),
    ee = String.fromCharCode(32),
    fe = !1;

function ge(a, b) {
    switch (a) {
        case "keyup":
            return -1 !== $d.indexOf(b.keyCode);
        case "keydown":
            return 229 !== b.keyCode;
        case "keypress":
        case "mousedown":
        case "focusout":
            return !0;
        default:
            return !1
    }
}

function he(a) {
    a = a.detail;
    return "object" === typeof a && "data" in a ? a.data : null
}
var ie = !1;

function je(a, b) {
    switch (a) {
        case "compositionend":
            return he(b);
        case "keypress":
            if (32 !== b.which) return null;
            fe = !0;
            return ee;
        case "textInput":
            return a = b.data, a === ee && fe ? null : a;
        default:
            return null
    }
}

function ke(a, b) {
    if (ie) return "compositionend" === a || !ae && ge(a, b) ? (a = nd(), md = ld = kd = null, ie = !1, a) : null;
    switch (a) {
        case "paste":
            return null;
        case "keypress":
            if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) {
                if (b.char && 1 < b.char.length) return b.char;
                if (b.which) return String.fromCharCode(b.which)
            }
            return null;
        case "compositionend":
            return de && "ko" !== b.locale ? null : b.data;
        default:
            return null
    }
}
var le = {
    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
};

function me(a) {
    var b = a && a.nodeName && a.nodeName.toLowerCase();
    return "input" === b ? !!le[a.type] : "textarea" === b ? !0 : !1
}

function ne(a, b, c, d) {
    Eb(d);
    b = oe(b, "onChange");
    0 < b.length && (c = new td("onChange", "change", null, c, d), a.push({
        event: c,
        listeners: b
    }))
}
var pe = null,
    qe = null;

function re(a) {
    se(a, 0)
}

function te(a) {
    var b = ue(a);
    if (Wa(b)) return a
}

function ve(a, b) {
    if ("change" === a) return b
}
var we = !1;
if (fa) {
    var xe;
    if (fa) {
        var ye = "oninput" in document;
        if (!ye) {
            var ze = document.createElement("div");
            ze.setAttribute("oninput", "return;");
            ye = "function" === typeof ze.oninput
        }
        xe = ye
    } else xe = !1;
    we = xe && (!document.documentMode || 9 < document.documentMode)
}

function Ae() {
    pe && (pe.detachEvent("onpropertychange", Be), qe = pe = null)
}

function Be(a) {
    if ("value" === a.propertyName && te(qe)) {
        var b = [];
        ne(b, qe, a, xb(a));
        a = re;
        if (Kb) a(b);
        else {
            Kb = !0;
            try {
                Gb(a, b)
            } finally {
                Kb = !1, Mb()
            }
        }
    }
}

function Ce(a, b, c) {
    "focusin" === a ? (Ae(), pe = b, qe = c, pe.attachEvent("onpropertychange", Be)) : "focusout" === a && Ae()
}

function De(a) {
    if ("selectionchange" === a || "keyup" === a || "keydown" === a) return te(qe)
}

function Ee(a, b) {
    if ("click" === a) return te(b)
}

function Fe(a, b) {
    if ("input" === a || "change" === a) return te(b)
}

function Ge(a, b) {
    return a === b && (0 !== a || 1 / a === 1 / b) || a !== a && b !== b
}
var He = "function" === typeof Object.is ? Object.is : Ge,
    Ie = Object.prototype.hasOwnProperty;

function Je(a, b) {
    if (He(a, b)) return !0;
    if ("object" !== typeof a || null === a || "object" !== typeof b || null === b) return !1;
    var c = Object.keys(a),
        d = Object.keys(b);
    if (c.length !== d.length) return !1;
    for (d = 0; d < c.length; d++)
        if (!Ie.call(b, c[d]) || !He(a[c[d]], b[c[d]])) return !1;
    return !0
}

function Ke(a) {
    for (; a && a.firstChild;) a = a.firstChild;
    return a
}

function Le(a, b) {
    var c = Ke(a);
    a = 0;
    for (var d; c;) {
        if (3 === c.nodeType) {
            d = a + c.textContent.length;
            if (a <= b && d >= b) return {
                node: c,
                offset: b - a
            };
            a = d
        }
        a: {
            for (; c;) {
                if (c.nextSibling) {
                    c = c.nextSibling;
                    break a
                }
                c = c.parentNode
            }
            c = void 0
        }
        c = Ke(c)
    }
}

function Me(a, b) {
    return a && b ? a === b ? !0 : a && 3 === a.nodeType ? !1 : b && 3 === b.nodeType ? Me(a, b.parentNode) : "contains" in a ? a.contains(b) : a.compareDocumentPosition ? !!(a.compareDocumentPosition(b) & 16) : !1 : !1
}

function Ne() {
    for (var a = window, b = Xa(); b instanceof a.HTMLIFrameElement;) {
        try {
            var c = "string" === typeof b.contentWindow.location.href
        } catch (d) {
            c = !1
        }
        if (c) a = b.contentWindow;
        else break;
        b = Xa(a.document)
    }
    return b
}

function Oe(a) {
    var b = a && a.nodeName && a.nodeName.toLowerCase();
    return b && ("input" === b && ("text" === a.type || "search" === a.type || "tel" === a.type || "url" === a.type || "password" === a.type) || "textarea" === b || "true" === a.contentEditable)
}
var Pe = fa && "documentMode" in document && 11 >= document.documentMode,
    Qe = null,
    Re = null,
    Se = null,
    Te = !1;

function Ue(a, b, c) {
    var d = c.window === c ? c.document : 9 === c.nodeType ? c : c.ownerDocument;
    Te || null == Qe || Qe !== Xa(d) || (d = Qe, "selectionStart" in d && Oe(d) ? d = {
        start: d.selectionStart,
        end: d.selectionEnd
    } : (d = (d.ownerDocument && d.ownerDocument.defaultView || window).getSelection(), d = {
        anchorNode: d.anchorNode,
        anchorOffset: d.anchorOffset,
        focusNode: d.focusNode,
        focusOffset: d.focusOffset
    }), Se && Je(Se, d) || (Se = d, d = oe(Re, "onSelect"), 0 < d.length && (b = new td("onSelect", "select", null, b, c), a.push({
        event: b,
        listeners: d
    }), b.target = Qe)))
}
Pc("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),
    0);
Pc("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "), 1);
Pc(Oc, 2);
for (var Ve = "change selectionchange textInput compositionstart compositionend compositionupdate".split(" "), We = 0; We < Ve.length; We++) Nc.set(Ve[We], 0);
ea("onMouseEnter", ["mouseout", "mouseover"]);
ea("onMouseLeave", ["mouseout", "mouseover"]);
ea("onPointerEnter", ["pointerout", "pointerover"]);
ea("onPointerLeave", ["pointerout", "pointerover"]);
da("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" "));
da("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));
da("onBeforeInput", ["compositionend", "keypress", "textInput", "paste"]);
da("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" "));
da("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" "));
da("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" "));
var Xe = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),
    Ye = new Set("cancel close invalid load scroll toggle".split(" ").concat(Xe));

function Ze(a, b, c) {
    var d = a.type || "unknown-event";
    a.currentTarget = c;
    Yb(d, b, void 0, a);
    a.currentTarget = null
}

function se(a, b) {
    b = 0 !== (b & 4);
    for (var c = 0; c < a.length; c++) {
        var d = a[c],
            e = d.event;
        d = d.listeners;
        a: {
            var f = void 0;
            if (b)
                for (var g = d.length - 1; 0 <= g; g--) {
                    var h = d[g],
                        k = h.instance,
                        l = h.currentTarget;
                    h = h.listener;
                    if (k !== f && e.isPropagationStopped()) break a;
                    Ze(e, h, l);
                    f = k
                } else
                    for (g = 0; g < d.length; g++) {
                        h = d[g];
                        k = h.instance;
                        l = h.currentTarget;
                        h = h.listener;
                        if (k !== f && e.isPropagationStopped()) break a;
                        Ze(e, h, l);
                        f = k
                    }
        }
    }
    if (Ub) throw a = Vb, Ub = !1, Vb = null, a;
}

function G(a, b) {
    var c = $e(b),
        d = a + "__bubble";
    c.has(d) || (af(b, a, 2, !1), c.add(d))
}
var bf = "_reactListening" + Math.random().toString(36).slice(2);

function cf(a) {
    a[bf] || (a[bf] = !0, ba.forEach(function(b) {
        Ye.has(b) || df(b, !1, a, null);
        df(b, !0, a, null)
    }))
}

function df(a, b, c, d) {
    var e = 4 < arguments.length && void 0 !== arguments[4] ? arguments[4] : 0,
        f = c;
    "selectionchange" === a && 9 !== c.nodeType && (f = c.ownerDocument);
    if (null !== d && !b && Ye.has(a)) {
        if ("scroll" !== a) return;
        e |= 2;
        f = d
    }
    var g = $e(f),
        h = a + "__" + (b ? "capture" : "bubble");
    g.has(h) || (b && (e |= 4), af(f, a, e, b), g.add(h))
}

function af(a, b, c, d) {
    var e = Nc.get(b);
    switch (void 0 === e ? 2 : e) {
        case 0:
            e = gd;
            break;
        case 1:
            e = id;
            break;
        default:
            e = hd
    }
    c = e.bind(null, b, c, a);
    e = void 0;
    !Pb || "touchstart" !== b && "touchmove" !== b && "wheel" !== b || (e = !0);
    d ? void 0 !== e ? a.addEventListener(b, c, {
        capture: !0,
        passive: e
    }) : a.addEventListener(b, c, !0) : void 0 !== e ? a.addEventListener(b, c, {
        passive: e
    }) : a.addEventListener(b, c, !1)
}

function jd(a, b, c, d, e) {
    var f = d;
    if (0 === (b & 1) && 0 === (b & 2) && null !== d) a: for (;;) {
        if (null === d) return;
        var g = d.tag;
        if (3 === g || 4 === g) {
            var h = d.stateNode.containerInfo;
            if (h === e || 8 === h.nodeType && h.parentNode === e) break;
            if (4 === g)
                for (g = d.return; null !== g;) {
                    var k = g.tag;
                    if (3 === k || 4 === k)
                        if (k = g.stateNode.containerInfo, k === e || 8 === k.nodeType && k.parentNode === e) return;
                    g = g.return
                }
            for (; null !== h;) {
                g = wc(h);
                if (null === g) return;
                k = g.tag;
                if (5 === k || 6 === k) {
                    d = f = g;
                    continue a
                }
                h = h.parentNode
            }
        }
        d = d.return
    }
    Nb(function() {
        var d = f,
            e = xb(c),
            g = [];
        a: {
            var h = Mc.get(a);
            if (void 0 !== h) {
                var k = td,
                    x = a;
                switch (a) {
                    case "keypress":
                        if (0 === od(c)) break a;
                    case "keydown":
                    case "keyup":
                        k = Rd;
                        break;
                    case "focusin":
                        x = "focus";
                        k = Fd;
                        break;
                    case "focusout":
                        x = "blur";
                        k = Fd;
                        break;
                    case "beforeblur":
                    case "afterblur":
                        k = Fd;
                        break;
                    case "click":
                        if (2 === c.button) break a;
                    case "auxclick":
                    case "dblclick":
                    case "mousedown":
                    case "mousemove":
                    case "mouseup":
                    case "mouseout":
                    case "mouseover":
                    case "contextmenu":
                        k = Bd;
                        break;
                    case "drag":
                    case "dragend":
                    case "dragenter":
                    case "dragexit":
                    case "dragleave":
                    case "dragover":
                    case "dragstart":
                    case "drop":
                        k =
                            Dd;
                        break;
                    case "touchcancel":
                    case "touchend":
                    case "touchmove":
                    case "touchstart":
                        k = Vd;
                        break;
                    case Ic:
                    case Jc:
                    case Kc:
                        k = Hd;
                        break;
                    case Lc:
                        k = Xd;
                        break;
                    case "scroll":
                        k = vd;
                        break;
                    case "wheel":
                        k = Zd;
                        break;
                    case "copy":
                    case "cut":
                    case "paste":
                        k = Jd;
                        break;
                    case "gotpointercapture":
                    case "lostpointercapture":
                    case "pointercancel":
                    case "pointerdown":
                    case "pointermove":
                    case "pointerout":
                    case "pointerover":
                    case "pointerup":
                        k = Td
                }
                var w = 0 !== (b & 4),
                    z = !w && "scroll" === a,
                    u = w ? null !== h ? h + "Capture" : null : h;
                w = [];
                for (var t = d, q; null !==
                    t;) {
                    q = t;
                    var v = q.stateNode;
                    5 === q.tag && null !== v && (q = v, null !== u && (v = Ob(t, u), null != v && w.push(ef(t, v, q))));
                    if (z) break;
                    t = t.return
                }
                0 < w.length && (h = new k(h, x, null, c, e), g.push({
                    event: h,
                    listeners: w
                }))
            }
        }
        if (0 === (b & 7)) {
            a: {
                h = "mouseover" === a || "pointerover" === a;
                k = "mouseout" === a || "pointerout" === a;
                if (h && 0 === (b & 16) && (x = c.relatedTarget || c.fromElement) && (wc(x) || x[ff])) break a;
                if (k || h) {
                    h = e.window === e ? e : (h = e.ownerDocument) ? h.defaultView || h.parentWindow : window;
                    if (k) {
                        if (x = c.relatedTarget || c.toElement, k = d, x = x ? wc(x) : null, null !==
                            x && (z = Zb(x), x !== z || 5 !== x.tag && 6 !== x.tag)) x = null
                    } else k = null, x = d;
                    if (k !== x) {
                        w = Bd;
                        v = "onMouseLeave";
                        u = "onMouseEnter";
                        t = "mouse";
                        if ("pointerout" === a || "pointerover" === a) w = Td, v = "onPointerLeave", u = "onPointerEnter", t = "pointer";
                        z = null == k ? h : ue(k);
                        q = null == x ? h : ue(x);
                        h = new w(v, t + "leave", k, c, e);
                        h.target = z;
                        h.relatedTarget = q;
                        v = null;
                        wc(e) === d && (w = new w(u, t + "enter", x, c, e), w.target = q, w.relatedTarget = z, v = w);
                        z = v;
                        if (k && x) b: {
                            w = k;
                            u = x;
                            t = 0;
                            for (q = w; q; q = gf(q)) t++;
                            q = 0;
                            for (v = u; v; v = gf(v)) q++;
                            for (; 0 < t - q;) w = gf(w), t--;
                            for (; 0 < q - t;) u =
                                gf(u), q--;
                            for (; t--;) {
                                if (w === u || null !== u && w === u.alternate) break b;
                                w = gf(w);
                                u = gf(u)
                            }
                            w = null
                        } else w = null;
                        null !== k && hf(g, h, k, w, !1);
                        null !== x && null !== z && hf(g, z, x, w, !0)
                    }
                }
            }
            a: {
                h = d ? ue(d) : window;
                k = h.nodeName && h.nodeName.toLowerCase();
                if ("select" === k || "input" === k && "file" === h.type) var J = ve;
                else if (me(h))
                    if (we) J = Fe;
                    else {
                        J = De;
                        var K = Ce
                    } else(k = h.nodeName) && "input" === k.toLowerCase() && ("checkbox" === h.type || "radio" === h.type) && (J = Ee);
                if (J && (J = J(a, d))) {
                    ne(g, J, c, e);
                    break a
                }
                K && K(a, h, d);
                "focusout" === a && (K = h._wrapperState) &&
                    K.controlled && "number" === h.type && bb(h, "number", h.value)
            }
            K = d ? ue(d) : window;
            switch (a) {
                case "focusin":
                    if (me(K) || "true" === K.contentEditable) Qe = K, Re = d, Se = null;
                    break;
                case "focusout":
                    Se = Re = Qe = null;
                    break;
                case "mousedown":
                    Te = !0;
                    break;
                case "contextmenu":
                case "mouseup":
                case "dragend":
                    Te = !1;
                    Ue(g, c, e);
                    break;
                case "selectionchange":
                    if (Pe) break;
                case "keydown":
                case "keyup":
                    Ue(g, c, e)
            }
            var Q;
            if (ae) b: {
                switch (a) {
                    case "compositionstart":
                        var L = "onCompositionStart";
                        break b;
                    case "compositionend":
                        L = "onCompositionEnd";
                        break b;
                    case "compositionupdate":
                        L = "onCompositionUpdate";
                        break b
                }
                L = void 0
            } else ie ? ge(a, c) && (L = "onCompositionEnd") : "keydown" === a && 229 === c.keyCode && (L = "onCompositionStart");L && (de && "ko" !== c.locale && (ie || "onCompositionStart" !== L ? "onCompositionEnd" === L && ie && (Q = nd()) : (kd = e, ld = "value" in kd ? kd.value : kd.textContent, ie = !0)), K = oe(d, L), 0 < K.length && (L = new Ld(L, a, null, c, e), g.push({
                event: L,
                listeners: K
            }), Q ? L.data = Q : (Q = he(c), null !== Q && (L.data = Q))));
            if (Q = ce ? je(a, c) : ke(a, c)) d = oe(d, "onBeforeInput"),
            0 < d.length && (e = new Ld("onBeforeInput",
                "beforeinput", null, c, e), g.push({
                event: e,
                listeners: d
            }), e.data = Q)
        }
        se(g, b)
    })
}

function ef(a, b, c) {
    return {
        instance: a,
        listener: b,
        currentTarget: c
    }
}

function oe(a, b) {
    for (var c = b + "Capture", d = []; null !== a;) {
        var e = a,
            f = e.stateNode;
        5 === e.tag && null !== f && (e = f, f = Ob(a, c), null != f && d.unshift(ef(a, f, e)), f = Ob(a, b), null != f && d.push(ef(a, f, e)));
        a = a.return
    }
    return d
}

function gf(a) {
    if (null === a) return null;
    do a = a.return; while (a && 5 !== a.tag);
    return a ? a : null
}

function hf(a, b, c, d, e) {
    for (var f = b._reactName, g = []; null !== c && c !== d;) {
        var h = c,
            k = h.alternate,
            l = h.stateNode;
        if (null !== k && k === d) break;
        5 === h.tag && null !== l && (h = l, e ? (k = Ob(c, f), null != k && g.unshift(ef(c, k, h))) : e || (k = Ob(c, f), null != k && g.push(ef(c, k, h))));
        c = c.return
    }
    0 !== g.length && a.push({
        event: b,
        listeners: g
    })
}

function jf() {}
var kf = null,
    lf = null;

function mf(a, b) {
    switch (a) {
        case "button":
        case "input":
        case "select":
        case "textarea":
            return !!b.autoFocus
    }
    return !1
}

function nf(a, b) {
    return "textarea" === a || "option" === a || "noscript" === a || "string" === typeof b.children || "number" === typeof b.children || "object" === typeof b.dangerouslySetInnerHTML && null !== b.dangerouslySetInnerHTML && null != b.dangerouslySetInnerHTML.__html
}
var of = "function" === typeof setTimeout ? setTimeout : void 0,
    pf = "function" === typeof clearTimeout ? clearTimeout : void 0;

function qf(a) {
    1 === a.nodeType ? a.textContent = "" : 9 === a.nodeType && (a = a.body, null != a && (a.textContent = ""))
}

function rf(a) {
    for (; null != a; a = a.nextSibling) {
        var b = a.nodeType;
        if (1 === b || 3 === b) break
    }
    return a
}

function sf(a) {
    a = a.previousSibling;
    for (var b = 0; a;) {
        if (8 === a.nodeType) {
            var c = a.data;
            if ("$" === c || "$!" === c || "$?" === c) {
                if (0 === b) return a;
                b--
            } else "/$" === c && b++
        }
        a = a.previousSibling
    }
    return null
}
var tf = 0;

function uf(a) {
    return {
        $$typeof: Ga,
        toString: a,
        valueOf: a
    }
}
var vf = Math.random().toString(36).slice(2),
    wf = "__reactFiber$" + vf,
    xf = "__reactProps$" + vf,
    ff = "__reactContainer$" + vf,
    yf = "__reactEvents$" + vf;

function wc(a) {
    var b = a[wf];
    if (b) return b;
    for (var c = a.parentNode; c;) {
        if (b = c[ff] || c[wf]) {
            c = b.alternate;
            if (null !== b.child || null !== c && null !== c.child)
                for (a = sf(a); null !== a;) {
                    if (c = a[wf]) return c;
                    a = sf(a)
                }
            return b
        }
        a = c;
        c = a.parentNode
    }
    return null
}

function Cb(a) {
    a = a[wf] || a[ff];
    return !a || 5 !== a.tag && 6 !== a.tag && 13 !== a.tag && 3 !== a.tag ? null : a
}

function ue(a) {
    if (5 === a.tag || 6 === a.tag) return a.stateNode;
    throw Error(y(33));
}

function Db(a) {
    return a[xf] || null
}

function $e(a) {
    var b = a[yf];
    void 0 === b && (b = a[yf] = new Set);
    return b
}
var zf = [],
    Af = -1;

function Bf(a) {
    return {
        current: a
    }
}

function H(a) {
    0 > Af || (a.current = zf[Af], zf[Af] = null, Af--)
}

function I(a, b) {
    Af++;
    zf[Af] = a.current;
    a.current = b
}
var Cf = {},
    M = Bf(Cf),
    N = Bf(!1),
    Df = Cf;

function Ef(a, b) {
    var c = a.type.contextTypes;
    if (!c) return Cf;
    var d = a.stateNode;
    if (d && d.__reactInternalMemoizedUnmaskedChildContext === b) return d.__reactInternalMemoizedMaskedChildContext;
    var e = {},
        f;
    for (f in c) e[f] = b[f];
    d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b, a.__reactInternalMemoizedMaskedChildContext = e);
    return e
}

function Ff(a) {
    a = a.childContextTypes;
    return null !== a && void 0 !== a
}

function Gf() {
    H(N);
    H(M)
}

function Hf(a, b, c) {
    if (M.current !== Cf) throw Error(y(168));
    I(M, b);
    I(N, c)
}

function If(a, b, c) {
    var d = a.stateNode;
    a = b.childContextTypes;
    if ("function" !== typeof d.getChildContext) return c;
    d = d.getChildContext();
    for (var e in d)
        if (!(e in a)) throw Error(y(108, Ra(b) || "Unknown", e));
    return m({}, c, d)
}

function Jf(a) {
    a = (a = a.stateNode) && a.__reactInternalMemoizedMergedChildContext || Cf;
    Df = M.current;
    I(M, a);
    I(N, N.current);
    return !0
}

function Kf(a, b, c) {
    var d = a.stateNode;
    if (!d) throw Error(y(169));
    c ? (a = If(a, b, Df), d.__reactInternalMemoizedMergedChildContext = a, H(N), H(M), I(M, a)) : H(N);
    I(N, c)
}
var Lf = null,
    Mf = null,
    Nf = r.unstable_runWithPriority,
    Of = r.unstable_scheduleCallback,
    Pf = r.unstable_cancelCallback,
    Qf = r.unstable_shouldYield,
    Rf = r.unstable_requestPaint,
    Sf = r.unstable_now,
    Tf = r.unstable_getCurrentPriorityLevel,
    Uf = r.unstable_ImmediatePriority,
    Vf = r.unstable_UserBlockingPriority,
    Wf = r.unstable_NormalPriority,
    Xf = r.unstable_LowPriority,
    Yf = r.unstable_IdlePriority,
    Zf = {},
    $f = void 0 !== Rf ? Rf : function() {},
    ag = null,
    bg = null,
    cg = !1,
    dg = Sf(),
    O = 1E4 > dg ? Sf : function() {
        return Sf() - dg
    };

function eg() {
    switch (Tf()) {
        case Uf:
            return 99;
        case Vf:
            return 98;
        case Wf:
            return 97;
        case Xf:
            return 96;
        case Yf:
            return 95;
        default:
            throw Error(y(332));
    }
}

function fg(a) {
    switch (a) {
        case 99:
            return Uf;
        case 98:
            return Vf;
        case 97:
            return Wf;
        case 96:
            return Xf;
        case 95:
            return Yf;
        default:
            throw Error(y(332));
    }
}

function gg(a, b) {
    a = fg(a);
    return Nf(a, b)
}

function hg(a, b, c) {
    a = fg(a);
    return Of(a, b, c)
}

function ig() {
    if (null !== bg) {
        var a = bg;
        bg = null;
        Pf(a)
    }
    jg()
}

function jg() {
    if (!cg && null !== ag) {
        cg = !0;
        var a = 0;
        try {
            var b = ag;
            gg(99, function() {
                for (; a < b.length; a++) {
                    var c = b[a];
                    do c = c(!0); while (null !== c)
                }
            });
            ag = null
        } catch (c) {
            throw null !== ag && (ag = ag.slice(a + 1)), Of(Uf, ig), c;
        } finally {
            cg = !1
        }
    }
}
var kg = ra.ReactCurrentBatchConfig;

function lg(a, b) {
    if (a && a.defaultProps) {
        b = m({}, b);
        a = a.defaultProps;
        for (var c in a) void 0 === b[c] && (b[c] = a[c]);
        return b
    }
    return b
}
var mg = Bf(null),
    ng = null,
    og = null,
    pg = null;

function qg() {
    pg = og = ng = null
}

function rg(a) {
    var b = mg.current;
    H(mg);
    a.type._context._currentValue = b
}

function sg(a, b) {
    for (; null !== a;) {
        var c = a.alternate;
        if ((a.childLanes & b) === b)
            if (null === c || (c.childLanes & b) === b) break;
            else c.childLanes |= b;
        else a.childLanes |= b, null !== c && (c.childLanes |= b);
        a = a.return
    }
}

function tg(a, b) {
    ng = a;
    pg = og = null;
    a = a.dependencies;
    null !== a && null !== a.firstContext && (0 !== (a.lanes & b) && (ug = !0), a.firstContext = null)
}

function vg(a, b) {
    if (pg !== a && !1 !== b && 0 !== b) {
        if ("number" !== typeof b || 1073741823 === b) pg = a, b = 1073741823;
        b = {
            context: a,
            observedBits: b,
            next: null
        };
        if (null === og) {
            if (null === ng) throw Error(y(308));
            og = b;
            ng.dependencies = {
                lanes: 0,
                firstContext: b,
                responders: null
            }
        } else og = og.next = b
    }
    return a._currentValue
}
var wg = !1;

function xg(a) {
    a.updateQueue = {
        baseState: a.memoizedState,
        firstBaseUpdate: null,
        lastBaseUpdate: null,
        shared: {
            pending: null
        },
        effects: null
    }
}

function yg(a, b) {
    a = a.updateQueue;
    b.updateQueue === a && (b.updateQueue = {
        baseState: a.baseState,
        firstBaseUpdate: a.firstBaseUpdate,
        lastBaseUpdate: a.lastBaseUpdate,
        shared: a.shared,
        effects: a.effects
    })
}

function zg(a, b) {
    return {
        eventTime: a,
        lane: b,
        tag: 0,
        payload: null,
        callback: null,
        next: null
    }
}

function Ag(a, b) {
    a = a.updateQueue;
    if (null !== a) {
        a = a.shared;
        var c = a.pending;
        null === c ? b.next = b : (b.next = c.next, c.next = b);
        a.pending = b
    }
}

function Bg(a, b) {
    var c = a.updateQueue,
        d = a.alternate;
    if (null !== d && (d = d.updateQueue, c === d)) {
        var e = null,
            f = null;
        c = c.firstBaseUpdate;
        if (null !== c) {
            do {
                var g = {
                    eventTime: c.eventTime,
                    lane: c.lane,
                    tag: c.tag,
                    payload: c.payload,
                    callback: c.callback,
                    next: null
                };
                null === f ? e = f = g : f = f.next = g;
                c = c.next
            } while (null !== c);
            null === f ? e = f = b : f = f.next = b
        } else e = f = b;
        c = {
            baseState: d.baseState,
            firstBaseUpdate: e,
            lastBaseUpdate: f,
            shared: d.shared,
            effects: d.effects
        };
        a.updateQueue = c;
        return
    }
    a = c.lastBaseUpdate;
    null === a ? c.firstBaseUpdate = b : a.next =
        b;
    c.lastBaseUpdate = b
}

function Cg(a, b, c, d) {
    var e = a.updateQueue;
    wg = !1;
    var f = e.firstBaseUpdate,
        g = e.lastBaseUpdate,
        h = e.shared.pending;
    if (null !== h) {
        e.shared.pending = null;
        var k = h,
            l = k.next;
        k.next = null;
        null === g ? f = l : g.next = l;
        g = k;
        var n = a.alternate;
        if (null !== n) {
            n = n.updateQueue;
            var A = n.lastBaseUpdate;
            A !== g && (null === A ? n.firstBaseUpdate = l : A.next = l, n.lastBaseUpdate = k)
        }
    }
    if (null !== f) {
        A = e.baseState;
        g = 0;
        n = l = k = null;
        do {
            h = f.lane;
            var p = f.eventTime;
            if ((d & h) === h) {
                null !== n && (n = n.next = {
                    eventTime: p,
                    lane: 0,
                    tag: f.tag,
                    payload: f.payload,
                    callback: f.callback,
                    next: null
                });
                a: {
                    var C = a,
                        x = f;
                    h = b;
                    p = c;
                    switch (x.tag) {
                        case 1:
                            C = x.payload;
                            if ("function" === typeof C) {
                                A = C.call(p, A, h);
                                break a
                            }
                            A = C;
                            break a;
                        case 3:
                            C.flags = C.flags & -4097 | 64;
                        case 0:
                            C = x.payload;
                            h = "function" === typeof C ? C.call(p, A, h) : C;
                            if (null === h || void 0 === h) break a;
                            A = m({}, A, h);
                            break a;
                        case 2:
                            wg = !0
                    }
                }
                null !== f.callback && (a.flags |= 32, h = e.effects, null === h ? e.effects = [f] : h.push(f))
            } else p = {
                eventTime: p,
                lane: h,
                tag: f.tag,
                payload: f.payload,
                callback: f.callback,
                next: null
            }, null === n ? (l = n = p, k = A) : n = n.next = p, g |= h;
            f = f.next;
            if (null ===
                f)
                if (h = e.shared.pending, null === h) break;
                else f = h.next, h.next = null, e.lastBaseUpdate = h, e.shared.pending = null
        } while (1);
        null === n && (k = A);
        e.baseState = k;
        e.firstBaseUpdate = l;
        e.lastBaseUpdate = n;
        Dg |= g;
        a.lanes = g;
        a.memoizedState = A
    }
}

function Eg(a, b, c) {
    a = b.effects;
    b.effects = null;
    if (null !== a)
        for (b = 0; b < a.length; b++) {
            var d = a[b],
                e = d.callback;
            if (null !== e) {
                d.callback = null;
                d = c;
                if ("function" !== typeof e) throw Error(y(191, e));
                e.call(d)
            }
        }
}
var Fg = (new aa.Component).refs;

function Gg(a, b, c, d) {
    b = a.memoizedState;
    c = c(d, b);
    c = null === c || void 0 === c ? b : m({}, b, c);
    a.memoizedState = c;
    0 === a.lanes && (a.updateQueue.baseState = c)
}
var Kg = {
    isMounted: function(a) {
        return (a = a._reactInternals) ? Zb(a) === a : !1
    },
    enqueueSetState: function(a, b, c) {
        a = a._reactInternals;
        var d = Hg(),
            e = Ig(a),
            f = zg(d, e);
        f.payload = b;
        void 0 !== c && null !== c && (f.callback = c);
        Ag(a, f);
        Jg(a, e, d)
    },
    enqueueReplaceState: function(a, b, c) {
        a = a._reactInternals;
        var d = Hg(),
            e = Ig(a),
            f = zg(d, e);
        f.tag = 1;
        f.payload = b;
        void 0 !== c && null !== c && (f.callback = c);
        Ag(a, f);
        Jg(a, e, d)
    },
    enqueueForceUpdate: function(a, b) {
        a = a._reactInternals;
        var c = Hg(),
            d = Ig(a),
            e = zg(c, d);
        e.tag = 2;
        void 0 !== b && null !== b && (e.callback =
            b);
        Ag(a, e);
        Jg(a, d, c)
    }
};

function Lg(a, b, c, d, e, f, g) {
    a = a.stateNode;
    return "function" === typeof a.shouldComponentUpdate ? a.shouldComponentUpdate(d, f, g) : b.prototype && b.prototype.isPureReactComponent ? !Je(c, d) || !Je(e, f) : !0
}

function Mg(a, b, c) {
    var d = !1,
        e = Cf;
    var f = b.contextType;
    "object" === typeof f && null !== f ? f = vg(f) : (e = Ff(b) ? Df : M.current, d = b.contextTypes, f = (d = null !== d && void 0 !== d) ? Ef(a, e) : Cf);
    b = new b(c, f);
    a.memoizedState = null !== b.state && void 0 !== b.state ? b.state : null;
    b.updater = Kg;
    a.stateNode = b;
    b._reactInternals = a;
    d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = e, a.__reactInternalMemoizedMaskedChildContext = f);
    return b
}

function Ng(a, b, c, d) {
    a = b.state;
    "function" === typeof b.componentWillReceiveProps && b.componentWillReceiveProps(c, d);
    "function" === typeof b.UNSAFE_componentWillReceiveProps && b.UNSAFE_componentWillReceiveProps(c, d);
    b.state !== a && Kg.enqueueReplaceState(b, b.state, null)
}

function Og(a, b, c, d) {
    var e = a.stateNode;
    e.props = c;
    e.state = a.memoizedState;
    e.refs = Fg;
    xg(a);
    var f = b.contextType;
    "object" === typeof f && null !== f ? e.context = vg(f) : (f = Ff(b) ? Df : M.current, e.context = Ef(a, f));
    Cg(a, c, e, d);
    e.state = a.memoizedState;
    f = b.getDerivedStateFromProps;
    "function" === typeof f && (Gg(a, b, f, c), e.state = a.memoizedState);
    "function" === typeof b.getDerivedStateFromProps || "function" === typeof e.getSnapshotBeforeUpdate || "function" !== typeof e.UNSAFE_componentWillMount && "function" !== typeof e.componentWillMount ||
        (b = e.state, "function" === typeof e.componentWillMount && e.componentWillMount(), "function" === typeof e.UNSAFE_componentWillMount && e.UNSAFE_componentWillMount(), b !== e.state && Kg.enqueueReplaceState(e, e.state, null), Cg(a, c, e, d), e.state = a.memoizedState);
    "function" === typeof e.componentDidMount && (a.flags |= 4)
}
var Pg = Array.isArray;

function Qg(a, b, c) {
    a = c.ref;
    if (null !== a && "function" !== typeof a && "object" !== typeof a) {
        if (c._owner) {
            c = c._owner;
            if (c) {
                if (1 !== c.tag) throw Error(y(309));
                var d = c.stateNode
            }
            if (!d) throw Error(y(147, a));
            var e = "" + a;
            if (null !== b && null !== b.ref && "function" === typeof b.ref && b.ref._stringRef === e) return b.ref;
            b = function(a) {
                var b = d.refs;
                b === Fg && (b = d.refs = {});
                null === a ? delete b[e] : b[e] = a
            };
            b._stringRef = e;
            return b
        }
        if ("string" !== typeof a) throw Error(y(284));
        if (!c._owner) throw Error(y(290, a));
    }
    return a
}

function Rg(a, b) {
    if ("textarea" !== a.type) throw Error(y(31, "[object Object]" === Object.prototype.toString.call(b) ? "object with keys {" + Object.keys(b).join(", ") + "}" : b));
}

function Sg(a) {
    function b(b, c) {
        if (a) {
            var d = b.lastEffect;
            null !== d ? (d.nextEffect = c, b.lastEffect = c) : b.firstEffect = b.lastEffect = c;
            c.nextEffect = null;
            c.flags = 8
        }
    }

    function c(c, d) {
        if (!a) return null;
        for (; null !== d;) b(c, d), d = d.sibling;
        return null
    }

    function d(a, b) {
        for (a = new Map; null !== b;) null !== b.key ? a.set(b.key, b) : a.set(b.index, b), b = b.sibling;
        return a
    }

    function e(a, b) {
        a = Tg(a, b);
        a.index = 0;
        a.sibling = null;
        return a
    }

    function f(b, c, d) {
        b.index = d;
        if (!a) return c;
        d = b.alternate;
        if (null !== d) return d = d.index, d < c ? (b.flags = 2,
            c) : d;
        b.flags = 2;
        return c
    }

    function g(b) {
        a && null === b.alternate && (b.flags = 2);
        return b
    }

    function h(a, b, c, d) {
        if (null === b || 6 !== b.tag) return b = Ug(c, a.mode, d), b.return = a, b;
        b = e(b, c);
        b.return = a;
        return b
    }

    function k(a, b, c, d) {
        if (null !== b && b.elementType === c.type) return d = e(b, c.props), d.ref = Qg(a, b, c), d.return = a, d;
        d = Vg(c.type, c.key, c.props, null, a.mode, d);
        d.ref = Qg(a, b, c);
        d.return = a;
        return d
    }

    function l(a, b, c, d) {
        if (null === b || 4 !== b.tag || b.stateNode.containerInfo !== c.containerInfo || b.stateNode.implementation !== c.implementation) return b =
            Wg(c, a.mode, d), b.return = a, b;
        b = e(b, c.children || []);
        b.return = a;
        return b
    }

    function n(a, b, c, d, f) {
        if (null === b || 7 !== b.tag) return b = Xg(c, a.mode, d, f), b.return = a, b;
        b = e(b, c);
        b.return = a;
        return b
    }

    function A(a, b, c) {
        if ("string" === typeof b || "number" === typeof b) return b = Ug("" + b, a.mode, c), b.return = a, b;
        if ("object" === typeof b && null !== b) {
            switch (b.$$typeof) {
                case sa:
                    return c = Vg(b.type, b.key, b.props, null, a.mode, c), c.ref = Qg(a, null, b), c.return = a, c;
                case ta:
                    return b = Wg(b, a.mode, c), b.return = a, b
            }
            if (Pg(b) || La(b)) return b = Xg(b,
                a.mode, c, null), b.return = a, b;
            Rg(a, b)
        }
        return null
    }

    function p(a, b, c, d) {
        var e = null !== b ? b.key : null;
        if ("string" === typeof c || "number" === typeof c) return null !== e ? null : h(a, b, "" + c, d);
        if ("object" === typeof c && null !== c) {
            switch (c.$$typeof) {
                case sa:
                    return c.key === e ? c.type === ua ? n(a, b, c.props.children, d, e) : k(a, b, c, d) : null;
                case ta:
                    return c.key === e ? l(a, b, c, d) : null
            }
            if (Pg(c) || La(c)) return null !== e ? null : n(a, b, c, d, null);
            Rg(a, c)
        }
        return null
    }

    function C(a, b, c, d, e) {
        if ("string" === typeof d || "number" === typeof d) return a = a.get(c) ||
            null, h(b, a, "" + d, e);
        if ("object" === typeof d && null !== d) {
            switch (d.$$typeof) {
                case sa:
                    return a = a.get(null === d.key ? c : d.key) || null, d.type === ua ? n(b, a, d.props.children, e, d.key) : k(b, a, d, e);
                case ta:
                    return a = a.get(null === d.key ? c : d.key) || null, l(b, a, d, e)
            }
            if (Pg(d) || La(d)) return a = a.get(c) || null, n(b, a, d, e, null);
            Rg(b, d)
        }
        return null
    }

    function x(e, g, h, k) {
        for (var l = null, t = null, u = g, z = g = 0, q = null; null !== u && z < h.length; z++) {
            u.index > z ? (q = u, u = null) : q = u.sibling;
            var n = p(e, u, h[z], k);
            if (null === n) {
                null === u && (u = q);
                break
            }
            a && u && null ===
                n.alternate && b(e, u);
            g = f(n, g, z);
            null === t ? l = n : t.sibling = n;
            t = n;
            u = q
        }
        if (z === h.length) return c(e, u), l;
        if (null === u) {
            for (; z < h.length; z++) u = A(e, h[z], k), null !== u && (g = f(u, g, z), null === t ? l = u : t.sibling = u, t = u);
            return l
        }
        for (u = d(e, u); z < h.length; z++) q = C(u, e, z, h[z], k), null !== q && (a && null !== q.alternate && u.delete(null === q.key ? z : q.key), g = f(q, g, z), null === t ? l = q : t.sibling = q, t = q);
        a && u.forEach(function(a) {
            return b(e, a)
        });
        return l
    }

    function w(e, g, h, k) {
        var l = La(h);
        if ("function" !== typeof l) throw Error(y(150));
        h = l.call(h);
        if (null ==
            h) throw Error(y(151));
        for (var t = l = null, u = g, z = g = 0, q = null, n = h.next(); null !== u && !n.done; z++, n = h.next()) {
            u.index > z ? (q = u, u = null) : q = u.sibling;
            var w = p(e, u, n.value, k);
            if (null === w) {
                null === u && (u = q);
                break
            }
            a && u && null === w.alternate && b(e, u);
            g = f(w, g, z);
            null === t ? l = w : t.sibling = w;
            t = w;
            u = q
        }
        if (n.done) return c(e, u), l;
        if (null === u) {
            for (; !n.done; z++, n = h.next()) n = A(e, n.value, k), null !== n && (g = f(n, g, z), null === t ? l = n : t.sibling = n, t = n);
            return l
        }
        for (u = d(e, u); !n.done; z++, n = h.next()) n = C(u, e, z, n.value, k), null !== n && (a && null !== n.alternate &&
            u.delete(null === n.key ? z : n.key), g = f(n, g, z), null === t ? l = n : t.sibling = n, t = n);
        a && u.forEach(function(a) {
            return b(e, a)
        });
        return l
    }
    return function(a, d, f, h) {
        var k = "object" === typeof f && null !== f && f.type === ua && null === f.key;
        k && (f = f.props.children);
        var l = "object" === typeof f && null !== f;
        if (l) switch (f.$$typeof) {
            case sa:
                a: {
                    l = f.key;
                    for (k = d; null !== k;) {
                        if (k.key === l) {
                            switch (k.tag) {
                                case 7:
                                    if (f.type === ua) {
                                        c(a, k.sibling);
                                        d = e(k, f.props.children);
                                        d.return = a;
                                        a = d;
                                        break a
                                    }
                                    break;
                                default:
                                    if (k.elementType === f.type) {
                                        c(a, k.sibling);
                                        d = e(k, f.props);
                                        d.ref = Qg(a, k, f);
                                        d.return = a;
                                        a = d;
                                        break a
                                    }
                            }
                            c(a, k);
                            break
                        } else b(a, k);
                        k = k.sibling
                    }
                    f.type === ua ? (d = Xg(f.props.children, a.mode, h, f.key), d.return = a, a = d) : (h = Vg(f.type, f.key, f.props, null, a.mode, h), h.ref = Qg(a, d, f), h.return = a, a = h)
                }
                return g(a);
            case ta:
                a: {
                    for (k = f.key; null !== d;) {
                        if (d.key === k)
                            if (4 === d.tag && d.stateNode.containerInfo === f.containerInfo && d.stateNode.implementation === f.implementation) {
                                c(a, d.sibling);
                                d = e(d, f.children || []);
                                d.return = a;
                                a = d;
                                break a
                            } else {
                                c(a, d);
                                break
                            } else b(a, d);
                        d = d.sibling
                    }
                    d =
                        Wg(f, a.mode, h);
                    d.return = a;
                    a = d
                }
                return g(a)
        }
        if ("string" === typeof f || "number" === typeof f) return f = "" + f, null !== d && 6 === d.tag ? (c(a, d.sibling), d = e(d, f), d.return = a, a = d) : (c(a, d), d = Ug(f, a.mode, h), d.return = a, a = d), g(a);
        if (Pg(f)) return x(a, d, f, h);
        if (La(f)) return w(a, d, f, h);
        l && Rg(a, f);
        if ("undefined" === typeof f && !k) switch (a.tag) {
            case 1:
            case 22:
            case 0:
            case 11:
            case 15:
                throw Error(y(152, Ra(a.type) || "Component"));
        }
        return c(a, d)
    }
}
var Yg = Sg(!0),
    Zg = Sg(!1),
    $g = {},
    ah = Bf($g),
    bh = Bf($g),
    ch = Bf($g);

function dh(a) {
    if (a === $g) throw Error(y(174));
    return a
}

function eh(a, b) {
    I(ch, b);
    I(bh, a);
    I(ah, $g);
    a = b.nodeType;
    switch (a) {
        case 9:
        case 11:
            b = (b = b.documentElement) ? b.namespaceURI : mb(null, "");
            break;
        default:
            a = 8 === a ? b.parentNode : b, b = a.namespaceURI || null, a = a.tagName, b = mb(b, a)
    }
    H(ah);
    I(ah, b)
}

function fh() {
    H(ah);
    H(bh);
    H(ch)
}

function gh(a) {
    dh(ch.current);
    var b = dh(ah.current);
    var c = mb(b, a.type);
    b !== c && (I(bh, a), I(ah, c))
}

function hh(a) {
    bh.current === a && (H(ah), H(bh))
}
var P = Bf(0);

function ih(a) {
    for (var b = a; null !== b;) {
        if (13 === b.tag) {
            var c = b.memoizedState;
            if (null !== c && (c = c.dehydrated, null === c || "$?" === c.data || "$!" === c.data)) return b
        } else if (19 === b.tag && void 0 !== b.memoizedProps.revealOrder) {
            if (0 !== (b.flags & 64)) return b
        } else if (null !== b.child) {
            b.child.return = b;
            b = b.child;
            continue
        }
        if (b === a) break;
        for (; null === b.sibling;) {
            if (null === b.return || b.return === a) return null;
            b = b.return
        }
        b.sibling.return = b.return;
        b = b.sibling
    }
    return null
}
var jh = null,
    kh = null,
    lh = !1;

function mh(a, b) {
    var c = nh(5, null, null, 0);
    c.elementType = "DELETED";
    c.type = "DELETED";
    c.stateNode = b;
    c.return = a;
    c.flags = 8;
    null !== a.lastEffect ? (a.lastEffect.nextEffect = c, a.lastEffect = c) : a.firstEffect = a.lastEffect = c
}

function oh(a, b) {
    switch (a.tag) {
        case 5:
            var c = a.type;
            b = 1 !== b.nodeType || c.toLowerCase() !== b.nodeName.toLowerCase() ? null : b;
            return null !== b ? (a.stateNode = b, !0) : !1;
        case 6:
            return b = "" === a.pendingProps || 3 !== b.nodeType ? null : b, null !== b ? (a.stateNode = b, !0) : !1;
        case 13:
            return !1;
        default:
            return !1
    }
}

function ph(a) {
    if (lh) {
        var b = kh;
        if (b) {
            var c = b;
            if (!oh(a, b)) {
                b = rf(c.nextSibling);
                if (!b || !oh(a, b)) {
                    a.flags = a.flags & -1025 | 2;
                    lh = !1;
                    jh = a;
                    return
                }
                mh(jh, c)
            }
            jh = a;
            kh = rf(b.firstChild)
        } else a.flags = a.flags & -1025 | 2, lh = !1, jh = a
    }
}

function qh(a) {
    for (a = a.return; null !== a && 5 !== a.tag && 3 !== a.tag && 13 !== a.tag;) a = a.return;
    jh = a
}

function rh(a) {
    if (a !== jh) return !1;
    if (!lh) return qh(a), lh = !0, !1;
    var b = a.type;
    if (5 !== a.tag || "head" !== b && "body" !== b && !nf(b, a.memoizedProps))
        for (b = kh; b;) mh(a, b), b = rf(b.nextSibling);
    qh(a);
    if (13 === a.tag) {
        a = a.memoizedState;
        a = null !== a ? a.dehydrated : null;
        if (!a) throw Error(y(317));
        a: {
            a = a.nextSibling;
            for (b = 0; a;) {
                if (8 === a.nodeType) {
                    var c = a.data;
                    if ("/$" === c) {
                        if (0 === b) {
                            kh = rf(a.nextSibling);
                            break a
                        }
                        b--
                    } else "$" !== c && "$!" !== c && "$?" !== c || b++
                }
                a = a.nextSibling
            }
            kh = null
        }
    } else kh = jh ? rf(a.stateNode.nextSibling) : null;
    return !0
}

function sh() {
    kh = jh = null;
    lh = !1
}
var th = [];

function uh() {
    for (var a = 0; a < th.length; a++) th[a]._workInProgressVersionPrimary = null;
    th.length = 0
}
var vh = ra.ReactCurrentDispatcher,
    wh = ra.ReactCurrentBatchConfig,
    xh = 0,
    R = null,
    S = null,
    T = null,
    yh = !1,
    zh = !1;

function Ah() {
    throw Error(y(321));
}

function Bh(a, b) {
    if (null === b) return !1;
    for (var c = 0; c < b.length && c < a.length; c++)
        if (!He(a[c], b[c])) return !1;
    return !0
}

function Ch(a, b, c, d, e, f) {
    xh = f;
    R = b;
    b.memoizedState = null;
    b.updateQueue = null;
    b.lanes = 0;
    vh.current = null === a || null === a.memoizedState ? Dh : Eh;
    a = c(d, e);
    if (zh) {
        f = 0;
        do {
            zh = !1;
            if (!(25 > f)) throw Error(y(301));
            f += 1;
            T = S = null;
            b.updateQueue = null;
            vh.current = Fh;
            a = c(d, e)
        } while (zh)
    }
    vh.current = Gh;
    b = null !== S && null !== S.next;
    xh = 0;
    T = S = R = null;
    yh = !1;
    if (b) throw Error(y(300));
    return a
}

function Hh() {
    var a = {
        memoizedState: null,
        baseState: null,
        baseQueue: null,
        queue: null,
        next: null
    };
    null === T ? R.memoizedState = T = a : T = T.next = a;
    return T
}

function Ih() {
    if (null === S) {
        var a = R.alternate;
        a = null !== a ? a.memoizedState : null
    } else a = S.next;
    var b = null === T ? R.memoizedState : T.next;
    if (null !== b) T = b, S = a;
    else {
        if (null === a) throw Error(y(310));
        S = a;
        a = {
            memoizedState: S.memoizedState,
            baseState: S.baseState,
            baseQueue: S.baseQueue,
            queue: S.queue,
            next: null
        };
        null === T ? R.memoizedState = T = a : T = T.next = a
    }
    return T
}

function Jh(a, b) {
    return "function" === typeof b ? b(a) : b
}

function Kh(a) {
    var b = Ih(),
        c = b.queue;
    if (null === c) throw Error(y(311));
    c.lastRenderedReducer = a;
    var d = S,
        e = d.baseQueue,
        f = c.pending;
    if (null !== f) {
        if (null !== e) {
            var g = e.next;
            e.next = f.next;
            f.next = g
        }
        d.baseQueue = e = f;
        c.pending = null
    }
    if (null !== e) {
        e = e.next;
        d = d.baseState;
        var h = g = f = null,
            k = e;
        do {
            var l = k.lane;
            if ((xh & l) === l) null !== h && (h = h.next = {
                lane: 0,
                action: k.action,
                eagerReducer: k.eagerReducer,
                eagerState: k.eagerState,
                next: null
            }), d = k.eagerReducer === a ? k.eagerState : a(d, k.action);
            else {
                var n = {
                    lane: l,
                    action: k.action,
                    eagerReducer: k.eagerReducer,
                    eagerState: k.eagerState,
                    next: null
                };
                null === h ? (g = h = n, f = d) : h = h.next = n;
                R.lanes |= l;
                Dg |= l
            }
            k = k.next
        } while (null !== k && k !== e);
        null === h ? f = d : h.next = g;
        He(d, b.memoizedState) || (ug = !0);
        b.memoizedState = d;
        b.baseState = f;
        b.baseQueue = h;
        c.lastRenderedState = d
    }
    return [b.memoizedState, c.dispatch]
}

function Lh(a) {
    var b = Ih(),
        c = b.queue;
    if (null === c) throw Error(y(311));
    c.lastRenderedReducer = a;
    var d = c.dispatch,
        e = c.pending,
        f = b.memoizedState;
    if (null !== e) {
        c.pending = null;
        var g = e = e.next;
        do f = a(f, g.action), g = g.next; while (g !== e);
        He(f, b.memoizedState) || (ug = !0);
        b.memoizedState = f;
        null === b.baseQueue && (b.baseState = f);
        c.lastRenderedState = f
    }
    return [f, d]
}

function Mh(a, b, c) {
    var d = b._getVersion;
    d = d(b._source);
    var e = b._workInProgressVersionPrimary;
    if (null !== e) a = e === d;
    else if (a = a.mutableReadLanes, a = (xh & a) === a) b._workInProgressVersionPrimary = d, th.push(b);
    if (a) return c(b._source);
    th.push(b);
    throw Error(y(350));
}

function Nh(a, b, c, d) {
    var e = U;
    if (null === e) throw Error(y(349));
    var f = b._getVersion,
        g = f(b._source),
        h = vh.current,
        k = h.useState(function() {
            return Mh(e, b, c)
        }),
        l = k[1],
        n = k[0];
    k = T;
    var A = a.memoizedState,
        p = A.refs,
        C = p.getSnapshot,
        x = A.source;
    A = A.subscribe;
    var w = R;
    a.memoizedState = {
        refs: p,
        source: b,
        subscribe: d
    };
    h.useEffect(function() {
        p.getSnapshot = c;
        p.setSnapshot = l;
        var a = f(b._source);
        if (!He(g, a)) {
            a = c(b._source);
            He(n, a) || (l(a), a = Ig(w), e.mutableReadLanes |= a & e.pendingLanes);
            a = e.mutableReadLanes;
            e.entangledLanes |= a;
            for (var d =
                    e.entanglements, h = a; 0 < h;) {
                var k = 31 - Vc(h),
                    v = 1 << k;
                d[k] |= a;
                h &= ~v
            }
        }
    }, [c, b, d]);
    h.useEffect(function() {
        return d(b._source, function() {
            var a = p.getSnapshot,
                c = p.setSnapshot;
            try {
                c(a(b._source));
                var d = Ig(w);
                e.mutableReadLanes |= d & e.pendingLanes
            } catch (q) {
                c(function() {
                    throw q;
                })
            }
        })
    }, [b, d]);
    He(C, c) && He(x, b) && He(A, d) || (a = {
        pending: null,
        dispatch: null,
        lastRenderedReducer: Jh,
        lastRenderedState: n
    }, a.dispatch = l = Oh.bind(null, R, a), k.queue = a, k.baseQueue = null, n = Mh(e, b, c), k.memoizedState = k.baseState = n);
    return n
}

function Ph(a, b, c) {
    var d = Ih();
    return Nh(d, a, b, c)
}

function Qh(a) {
    var b = Hh();
    "function" === typeof a && (a = a());
    b.memoizedState = b.baseState = a;
    a = b.queue = {
        pending: null,
        dispatch: null,
        lastRenderedReducer: Jh,
        lastRenderedState: a
    };
    a = a.dispatch = Oh.bind(null, R, a);
    return [b.memoizedState, a]
}

function Rh(a, b, c, d) {
    a = {
        tag: a,
        create: b,
        destroy: c,
        deps: d,
        next: null
    };
    b = R.updateQueue;
    null === b ? (b = {
        lastEffect: null
    }, R.updateQueue = b, b.lastEffect = a.next = a) : (c = b.lastEffect, null === c ? b.lastEffect = a.next = a : (d = c.next, c.next = a, a.next = d, b.lastEffect = a));
    return a
}

function Sh(a) {
    var b = Hh();
    a = {
        current: a
    };
    return b.memoizedState = a
}

function Th() {
    return Ih().memoizedState
}

function Uh(a, b, c, d) {
    var e = Hh();
    R.flags |= a;
    e.memoizedState = Rh(1 | b, c, void 0, void 0 === d ? null : d)
}

function Vh(a, b, c, d) {
    var e = Ih();
    d = void 0 === d ? null : d;
    var f = void 0;
    if (null !== S) {
        var g = S.memoizedState;
        f = g.destroy;
        if (null !== d && Bh(d, g.deps)) {
            Rh(b, c, f, d);
            return
        }
    }
    R.flags |= a;
    e.memoizedState = Rh(1 | b, c, f, d)
}

function Wh(a, b) {
    return Uh(516, 4, a, b)
}

function Xh(a, b) {
    return Vh(516, 4, a, b)
}

function Yh(a, b) {
    return Vh(4, 2, a, b)
}

function Zh(a, b) {
    if ("function" === typeof b) return a = a(), b(a),
        function() {
            b(null)
        };
    if (null !== b && void 0 !== b) return a = a(), b.current = a,
        function() {
            b.current = null
        }
}

function $h(a, b, c) {
    c = null !== c && void 0 !== c ? c.concat([a]) : null;
    return Vh(4, 2, Zh.bind(null, b, a), c)
}

function ai() {}

function bi(a, b) {
    var c = Ih();
    b = void 0 === b ? null : b;
    var d = c.memoizedState;
    if (null !== d && null !== b && Bh(b, d[1])) return d[0];
    c.memoizedState = [a, b];
    return a
}

function ci(a, b) {
    var c = Ih();
    b = void 0 === b ? null : b;
    var d = c.memoizedState;
    if (null !== d && null !== b && Bh(b, d[1])) return d[0];
    a = a();
    c.memoizedState = [a, b];
    return a
}

function di(a, b) {
    var c = eg();
    gg(98 > c ? 98 : c, function() {
        a(!0)
    });
    gg(97 < c ? 97 : c, function() {
        var c = wh.transition;
        wh.transition = 1;
        try {
            a(!1), b()
        } finally {
            wh.transition = c
        }
    })
}

function Oh(a, b, c) {
    var d = Hg(),
        e = Ig(a),
        f = {
            lane: e,
            action: c,
            eagerReducer: null,
            eagerState: null,
            next: null
        },
        g = b.pending;
    null === g ? f.next = f : (f.next = g.next, g.next = f);
    b.pending = f;
    g = a.alternate;
    if (a === R || null !== g && g === R) zh = yh = !0;
    else {
        if (0 === a.lanes && (null === g || 0 === g.lanes) && (g = b.lastRenderedReducer, null !== g)) try {
            var h = b.lastRenderedState,
                k = g(h, c);
            f.eagerReducer = g;
            f.eagerState = k;
            if (He(k, h)) return
        } catch (l) {} finally {}
        Jg(a, e, d)
    }
}
var Gh = {
        readContext: vg,
        useCallback: Ah,
        useContext: Ah,
        useEffect: Ah,
        useImperativeHandle: Ah,
        useLayoutEffect: Ah,
        useMemo: Ah,
        useReducer: Ah,
        useRef: Ah,
        useState: Ah,
        useDebugValue: Ah,
        useDeferredValue: Ah,
        useTransition: Ah,
        useMutableSource: Ah,
        useOpaqueIdentifier: Ah,
        unstable_isNewReconciler: !1
    },
    Dh = {
        readContext: vg,
        useCallback: function(a, b) {
            Hh().memoizedState = [a, void 0 === b ? null : b];
            return a
        },
        useContext: vg,
        useEffect: Wh,
        useImperativeHandle: function(a, b, c) {
            c = null !== c && void 0 !== c ? c.concat([a]) : null;
            return Uh(4, 2, Zh.bind(null,
                b, a), c)
        },
        useLayoutEffect: function(a, b) {
            return Uh(4, 2, a, b)
        },
        useMemo: function(a, b) {
            var c = Hh();
            b = void 0 === b ? null : b;
            a = a();
            c.memoizedState = [a, b];
            return a
        },
        useReducer: function(a, b, c) {
            var d = Hh();
            b = void 0 !== c ? c(b) : b;
            d.memoizedState = d.baseState = b;
            a = d.queue = {
                pending: null,
                dispatch: null,
                lastRenderedReducer: a,
                lastRenderedState: b
            };
            a = a.dispatch = Oh.bind(null, R, a);
            return [d.memoizedState, a]
        },
        useRef: Sh,
        useState: Qh,
        useDebugValue: ai,
        useDeferredValue: function(a) {
            var b = Qh(a),
                c = b[0],
                d = b[1];
            Wh(function() {
                var b = wh.transition;
                wh.transition = 1;
                try {
                    d(a)
                } finally {
                    wh.transition = b
                }
            }, [a]);
            return c
        },
        useTransition: function() {
            var a = Qh(!1),
                b = a[0];
            a = di.bind(null, a[1]);
            Sh(a);
            return [a, b]
        },
        useMutableSource: function(a, b, c) {
            var d = Hh();
            d.memoizedState = {
                refs: {
                    getSnapshot: b,
                    setSnapshot: null
                },
                source: a,
                subscribe: c
            };
            return Nh(d, a, b, c)
        },
        useOpaqueIdentifier: function() {
            if (lh) {
                var a = !1,
                    b = uf(function() {
                        a || (a = !0, c("r:" + (tf++).toString(36)));
                        throw Error(y(355));
                    }),
                    c = Qh(b)[1];
                0 === (R.mode & 2) && (R.flags |= 516, Rh(5, function() {
                        c("r:" + (tf++).toString(36))
                    },
                    void 0, null));
                return b
            }
            b = "r:" + (tf++).toString(36);
            Qh(b);
            return b
        },
        unstable_isNewReconciler: !1
    },
    Eh = {
        readContext: vg,
        useCallback: bi,
        useContext: vg,
        useEffect: Xh,
        useImperativeHandle: $h,
        useLayoutEffect: Yh,
        useMemo: ci,
        useReducer: Kh,
        useRef: Th,
        useState: function() {
            return Kh(Jh)
        },
        useDebugValue: ai,
        useDeferredValue: function(a) {
            var b = Kh(Jh),
                c = b[0],
                d = b[1];
            Xh(function() {
                var b = wh.transition;
                wh.transition = 1;
                try {
                    d(a)
                } finally {
                    wh.transition = b
                }
            }, [a]);
            return c
        },
        useTransition: function() {
            var a = Kh(Jh)[0];
            return [Th().current,
                a
            ]
        },
        useMutableSource: Ph,
        useOpaqueIdentifier: function() {
            return Kh(Jh)[0]
        },
        unstable_isNewReconciler: !1
    },
    Fh = {
        readContext: vg,
        useCallback: bi,
        useContext: vg,
        useEffect: Xh,
        useImperativeHandle: $h,
        useLayoutEffect: Yh,
        useMemo: ci,
        useReducer: Lh,
        useRef: Th,
        useState: function() {
            return Lh(Jh)
        },
        useDebugValue: ai,
        useDeferredValue: function(a) {
            var b = Lh(Jh),
                c = b[0],
                d = b[1];
            Xh(function() {
                var b = wh.transition;
                wh.transition = 1;
                try {
                    d(a)
                } finally {
                    wh.transition = b
                }
            }, [a]);
            return c
        },
        useTransition: function() {
            var a = Lh(Jh)[0];
            return [Th().current,
                a
            ]
        },
        useMutableSource: Ph,
        useOpaqueIdentifier: function() {
            return Lh(Jh)[0]
        },
        unstable_isNewReconciler: !1
    },
    ei = ra.ReactCurrentOwner,
    ug = !1;

function fi(a, b, c, d) {
    b.child = null === a ? Zg(b, null, c, d) : Yg(b, a.child, c, d)
}

function gi(a, b, c, d, e) {
    c = c.render;
    var f = b.ref;
    tg(b, e);
    d = Ch(a, b, c, d, f, e);
    if (null !== a && !ug) return b.updateQueue = a.updateQueue, b.flags &= -517, a.lanes &= ~e, hi(a, b, e);
    b.flags |= 1;
    fi(a, b, d, e);
    return b.child
}

function ii(a, b, c, d, e, f) {
    if (null === a) {
        var g = c.type;
        if ("function" === typeof g && !ji(g) && void 0 === g.defaultProps && null === c.compare && void 0 === c.defaultProps) return b.tag = 15, b.type = g, ki(a, b, g, d, e, f);
        a = Vg(c.type, null, d, b, b.mode, f);
        a.ref = b.ref;
        a.return = b;
        return b.child = a
    }
    g = a.child;
    if (0 === (e & f) && (e = g.memoizedProps, c = c.compare, c = null !== c ? c : Je, c(e, d) && a.ref === b.ref)) return hi(a, b, f);
    b.flags |= 1;
    a = Tg(g, d);
    a.ref = b.ref;
    a.return = b;
    return b.child = a
}

function ki(a, b, c, d, e, f) {
    if (null !== a && Je(a.memoizedProps, d) && a.ref === b.ref)
        if (ug = !1, 0 !== (f & e)) 0 !== (a.flags & 16384) && (ug = !0);
        else return b.lanes = a.lanes, hi(a, b, f);
    return li(a, b, c, d, f)
}

function mi(a, b, c) {
    var d = b.pendingProps,
        e = d.children,
        f = null !== a ? a.memoizedState : null;
    if ("hidden" === d.mode || "unstable-defer-without-hiding" === d.mode)
        if (0 === (b.mode & 4)) b.memoizedState = {
            baseLanes: 0
        }, ni(b, c);
        else if (0 !== (c & 1073741824)) b.memoizedState = {
        baseLanes: 0
    }, ni(b, null !== f ? f.baseLanes : c);
    else return a = null !== f ? f.baseLanes | c : c, b.lanes = b.childLanes = 1073741824, b.memoizedState = {
        baseLanes: a
    }, ni(b, a), null;
    else null !== f ? (d = f.baseLanes | c, b.memoizedState = null) : d = c, ni(b, d);
    fi(a, b, e, c);
    return b.child
}

function oi(a, b) {
    var c = b.ref;
    if (null === a && null !== c || null !== a && a.ref !== c) b.flags |= 128
}

function li(a, b, c, d, e) {
    var f = Ff(c) ? Df : M.current;
    f = Ef(b, f);
    tg(b, e);
    c = Ch(a, b, c, d, f, e);
    if (null !== a && !ug) return b.updateQueue = a.updateQueue, b.flags &= -517, a.lanes &= ~e, hi(a, b, e);
    b.flags |= 1;
    fi(a, b, c, e);
    return b.child
}

function pi(a, b, c, d, e) {
    if (Ff(c)) {
        var f = !0;
        Jf(b)
    } else f = !1;
    tg(b, e);
    if (null === b.stateNode) null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2), Mg(b, c, d), Og(b, c, d, e), d = !0;
    else if (null === a) {
        var g = b.stateNode,
            h = b.memoizedProps;
        g.props = h;
        var k = g.context,
            l = c.contextType;
        "object" === typeof l && null !== l ? l = vg(l) : (l = Ff(c) ? Df : M.current, l = Ef(b, l));
        var n = c.getDerivedStateFromProps,
            A = "function" === typeof n || "function" === typeof g.getSnapshotBeforeUpdate;
        A || "function" !== typeof g.UNSAFE_componentWillReceiveProps &&
            "function" !== typeof g.componentWillReceiveProps || (h !== d || k !== l) && Ng(b, g, d, l);
        wg = !1;
        var p = b.memoizedState;
        g.state = p;
        Cg(b, d, g, e);
        k = b.memoizedState;
        h !== d || p !== k || N.current || wg ? ("function" === typeof n && (Gg(b, c, n, d), k = b.memoizedState), (h = wg || Lg(b, c, h, d, p, k, l)) ? (A || "function" !== typeof g.UNSAFE_componentWillMount && "function" !== typeof g.componentWillMount || ("function" === typeof g.componentWillMount && g.componentWillMount(), "function" === typeof g.UNSAFE_componentWillMount && g.UNSAFE_componentWillMount()), "function" ===
            typeof g.componentDidMount && (b.flags |= 4)) : ("function" === typeof g.componentDidMount && (b.flags |= 4), b.memoizedProps = d, b.memoizedState = k), g.props = d, g.state = k, g.context = l, d = h) : ("function" === typeof g.componentDidMount && (b.flags |= 4), d = !1)
    } else {
        g = b.stateNode;
        yg(a, b);
        h = b.memoizedProps;
        l = b.type === b.elementType ? h : lg(b.type, h);
        g.props = l;
        A = b.pendingProps;
        p = g.context;
        k = c.contextType;
        "object" === typeof k && null !== k ? k = vg(k) : (k = Ff(c) ? Df : M.current, k = Ef(b, k));
        var C = c.getDerivedStateFromProps;
        (n = "function" === typeof C ||
            "function" === typeof g.getSnapshotBeforeUpdate) || "function" !== typeof g.UNSAFE_componentWillReceiveProps && "function" !== typeof g.componentWillReceiveProps || (h !== A || p !== k) && Ng(b, g, d, k);
        wg = !1;
        p = b.memoizedState;
        g.state = p;
        Cg(b, d, g, e);
        var x = b.memoizedState;
        h !== A || p !== x || N.current || wg ? ("function" === typeof C && (Gg(b, c, C, d), x = b.memoizedState), (l = wg || Lg(b, c, l, d, p, x, k)) ? (n || "function" !== typeof g.UNSAFE_componentWillUpdate && "function" !== typeof g.componentWillUpdate || ("function" === typeof g.componentWillUpdate && g.componentWillUpdate(d,
            x, k), "function" === typeof g.UNSAFE_componentWillUpdate && g.UNSAFE_componentWillUpdate(d, x, k)), "function" === typeof g.componentDidUpdate && (b.flags |= 4), "function" === typeof g.getSnapshotBeforeUpdate && (b.flags |= 256)) : ("function" !== typeof g.componentDidUpdate || h === a.memoizedProps && p === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && p === a.memoizedState || (b.flags |= 256), b.memoizedProps = d, b.memoizedState = x), g.props = d, g.state = x, g.context = k, d = l) : ("function" !== typeof g.componentDidUpdate ||
            h === a.memoizedProps && p === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && p === a.memoizedState || (b.flags |= 256), d = !1)
    }
    return qi(a, b, c, d, f, e)
}

function qi(a, b, c, d, e, f) {
    oi(a, b);
    var g = 0 !== (b.flags & 64);
    if (!d && !g) return e && Kf(b, c, !1), hi(a, b, f);
    d = b.stateNode;
    ei.current = b;
    var h = g && "function" !== typeof c.getDerivedStateFromError ? null : d.render();
    b.flags |= 1;
    null !== a && g ? (b.child = Yg(b, a.child, null, f), b.child = Yg(b, null, h, f)) : fi(a, b, h, f);
    b.memoizedState = d.state;
    e && Kf(b, c, !0);
    return b.child
}

function ri(a) {
    var b = a.stateNode;
    b.pendingContext ? Hf(a, b.pendingContext, b.pendingContext !== b.context) : b.context && Hf(a, b.context, !1);
    eh(a, b.containerInfo)
}
var si = {
    dehydrated: null,
    retryLane: 0
};

function ti(a, b, c) {
    var d = b.pendingProps,
        e = P.current,
        f = !1,
        g;
    (g = 0 !== (b.flags & 64)) || (g = null !== a && null === a.memoizedState ? !1 : 0 !== (e & 2));
    g ? (f = !0, b.flags &= -65) : null !== a && null === a.memoizedState || void 0 === d.fallback || !0 === d.unstable_avoidThisFallback || (e |= 1);
    I(P, e & 1);
    if (null === a) {
        void 0 !== d.fallback && ph(b);
        a = d.children;
        e = d.fallback;
        if (f) return a = ui(b, a, e, c), b.child.memoizedState = {
            baseLanes: c
        }, b.memoizedState = si, a;
        if ("number" === typeof d.unstable_expectedLoadTime) return a = ui(b, a, e, c), b.child.memoizedState = {
                baseLanes: c
            },
            b.memoizedState = si, b.lanes = 33554432, a;
        c = vi({
            mode: "visible",
            children: a
        }, b.mode, c, null);
        c.return = b;
        return b.child = c
    }
    if (null !== a.memoizedState) {
        if (f) return d = wi(a, b, d.children, d.fallback, c), f = b.child, e = a.child.memoizedState, f.memoizedState = null === e ? {
            baseLanes: c
        } : {
            baseLanes: e.baseLanes | c
        }, f.childLanes = a.childLanes & ~c, b.memoizedState = si, d;
        c = xi(a, b, d.children, c);
        b.memoizedState = null;
        return c
    }
    if (f) return d = wi(a, b, d.children, d.fallback, c), f = b.child, e = a.child.memoizedState, f.memoizedState = null === e ? {
        baseLanes: c
    } : {
        baseLanes: e.baseLanes | c
    }, f.childLanes = a.childLanes & ~c, b.memoizedState = si, d;
    c = xi(a, b, d.children, c);
    b.memoizedState = null;
    return c
}

function ui(a, b, c, d) {
    var e = a.mode,
        f = a.child;
    b = {
        mode: "hidden",
        children: b
    };
    0 === (e & 2) && null !== f ? (f.childLanes = 0, f.pendingProps = b) : f = vi(b, e, 0, null);
    c = Xg(c, e, d, null);
    f.return = a;
    c.return = a;
    f.sibling = c;
    a.child = f;
    return c
}

function xi(a, b, c, d) {
    var e = a.child;
    a = e.sibling;
    c = Tg(e, {
        mode: "visible",
        children: c
    });
    0 === (b.mode & 2) && (c.lanes = d);
    c.return = b;
    c.sibling = null;
    null !== a && (a.nextEffect = null, a.flags = 8, b.firstEffect = b.lastEffect = a);
    return b.child = c
}

function wi(a, b, c, d, e) {
    var f = b.mode,
        g = a.child;
    a = g.sibling;
    var h = {
        mode: "hidden",
        children: c
    };
    0 === (f & 2) && b.child !== g ? (c = b.child, c.childLanes = 0, c.pendingProps = h, g = c.lastEffect, null !== g ? (b.firstEffect = c.firstEffect, b.lastEffect = g, g.nextEffect = null) : b.firstEffect = b.lastEffect = null) : c = Tg(g, h);
    null !== a ? d = Tg(a, d) : (d = Xg(d, f, e, null), d.flags |= 2);
    d.return = b;
    c.return = b;
    c.sibling = d;
    b.child = c;
    return d
}

function yi(a, b) {
    a.lanes |= b;
    var c = a.alternate;
    null !== c && (c.lanes |= b);
    sg(a.return, b)
}

function zi(a, b, c, d, e, f) {
    var g = a.memoizedState;
    null === g ? a.memoizedState = {
        isBackwards: b,
        rendering: null,
        renderingStartTime: 0,
        last: d,
        tail: c,
        tailMode: e,
        lastEffect: f
    } : (g.isBackwards = b, g.rendering = null, g.renderingStartTime = 0, g.last = d, g.tail = c, g.tailMode = e, g.lastEffect = f)
}

function Ai(a, b, c) {
    var d = b.pendingProps,
        e = d.revealOrder,
        f = d.tail;
    fi(a, b, d.children, c);
    d = P.current;
    if (0 !== (d & 2)) d = d & 1 | 2, b.flags |= 64;
    else {
        if (null !== a && 0 !== (a.flags & 64)) a: for (a = b.child; null !== a;) {
            if (13 === a.tag) null !== a.memoizedState && yi(a, c);
            else if (19 === a.tag) yi(a, c);
            else if (null !== a.child) {
                a.child.return = a;
                a = a.child;
                continue
            }
            if (a === b) break a;
            for (; null === a.sibling;) {
                if (null === a.return || a.return === b) break a;
                a = a.return
            }
            a.sibling.return = a.return;
            a = a.sibling
        }
        d &= 1
    }
    I(P, d);
    if (0 === (b.mode & 2)) b.memoizedState =
        null;
    else switch (e) {
        case "forwards":
            c = b.child;
            for (e = null; null !== c;) a = c.alternate, null !== a && null === ih(a) && (e = c), c = c.sibling;
            c = e;
            null === c ? (e = b.child, b.child = null) : (e = c.sibling, c.sibling = null);
            zi(b, !1, e, c, f, b.lastEffect);
            break;
        case "backwards":
            c = null;
            e = b.child;
            for (b.child = null; null !== e;) {
                a = e.alternate;
                if (null !== a && null === ih(a)) {
                    b.child = e;
                    break
                }
                a = e.sibling;
                e.sibling = c;
                c = e;
                e = a
            }
            zi(b, !0, c, null, f, b.lastEffect);
            break;
        case "together":
            zi(b, !1, null, null, void 0, b.lastEffect);
            break;
        default:
            b.memoizedState = null
    }
    return b.child
}

function hi(a, b, c) {
    null !== a && (b.dependencies = a.dependencies);
    Dg |= b.lanes;
    if (0 !== (c & b.childLanes)) {
        if (null !== a && b.child !== a.child) throw Error(y(153));
        if (null !== b.child) {
            a = b.child;
            c = Tg(a, a.pendingProps);
            b.child = c;
            for (c.return = b; null !== a.sibling;) a = a.sibling, c = c.sibling = Tg(a, a.pendingProps), c.return = b;
            c.sibling = null
        }
        return b.child
    }
    return null
}
var Bi, Ci, Di, Ei;
Bi = function(a, b) {
    for (var c = b.child; null !== c;) {
        if (5 === c.tag || 6 === c.tag) a.appendChild(c.stateNode);
        else if (4 !== c.tag && null !== c.child) {
            c.child.return = c;
            c = c.child;
            continue
        }
        if (c === b) break;
        for (; null === c.sibling;) {
            if (null === c.return || c.return === b) return;
            c = c.return
        }
        c.sibling.return = c.return;
        c = c.sibling
    }
};
Ci = function() {};
Di = function(a, b, c, d) {
    var e = a.memoizedProps;
    if (e !== d) {
        a = b.stateNode;
        dh(ah.current);
        var f = null;
        switch (c) {
            case "input":
                e = Ya(a, e);
                d = Ya(a, d);
                f = [];
                break;
            case "option":
                e = eb(a, e);
                d = eb(a, d);
                f = [];
                break;
            case "select":
                e = m({}, e, {
                    value: void 0
                });
                d = m({}, d, {
                    value: void 0
                });
                f = [];
                break;
            case "textarea":
                e = gb(a, e);
                d = gb(a, d);
                f = [];
                break;
            default:
                "function" !== typeof e.onClick && "function" === typeof d.onClick && (a.onclick = jf)
        }
        vb(c, d);
        var g;
        c = null;
        for (l in e)
            if (!d.hasOwnProperty(l) && e.hasOwnProperty(l) && null != e[l])
                if ("style" ===
                    l) {
                    var h = e[l];
                    for (g in h) h.hasOwnProperty(g) && (c || (c = {}), c[g] = "")
                } else "dangerouslySetInnerHTML" !== l && "children" !== l && "suppressContentEditableWarning" !== l && "suppressHydrationWarning" !== l && "autoFocus" !== l && (ca.hasOwnProperty(l) ? f || (f = []) : (f = f || []).push(l, null));
        for (l in d) {
            var k = d[l];
            h = null != e ? e[l] : void 0;
            if (d.hasOwnProperty(l) && k !== h && (null != k || null != h))
                if ("style" === l)
                    if (h) {
                        for (g in h) !h.hasOwnProperty(g) || k && k.hasOwnProperty(g) || (c || (c = {}), c[g] = "");
                        for (g in k) k.hasOwnProperty(g) && h[g] !== k[g] && (c ||
                            (c = {}), c[g] = k[g])
                    } else c || (f || (f = []), f.push(l, c)), c = k;
            else "dangerouslySetInnerHTML" === l ? (k = k ? k.__html : void 0, h = h ? h.__html : void 0, null != k && h !== k && (f = f || []).push(l, k)) : "children" === l ? "string" !== typeof k && "number" !== typeof k || (f = f || []).push(l, "" + k) : "suppressContentEditableWarning" !== l && "suppressHydrationWarning" !== l && (ca.hasOwnProperty(l) ? (null != k && "onScroll" === l && G("scroll", a), f || h === k || (f = [])) : "object" === typeof k && null !== k && k.$$typeof === Ga ? k.toString() : (f = f || []).push(l, k))
        }
        c && (f = f || []).push("style",
            c);
        var l = f;
        if (b.updateQueue = l) b.flags |= 4
    }
};
Ei = function(a, b, c, d) {
    c !== d && (b.flags |= 4)
};

function Fi(a, b) {
    if (!lh) switch (a.tailMode) {
        case "hidden":
            b = a.tail;
            for (var c = null; null !== b;) null !== b.alternate && (c = b), b = b.sibling;
            null === c ? a.tail = null : c.sibling = null;
            break;
        case "collapsed":
            c = a.tail;
            for (var d = null; null !== c;) null !== c.alternate && (d = c), c = c.sibling;
            null === d ? b || null === a.tail ? a.tail = null : a.tail.sibling = null : d.sibling = null
    }
}

function Gi(a, b, c) {
    var d = b.pendingProps;
    switch (b.tag) {
        case 2:
        case 16:
        case 15:
        case 0:
        case 11:
        case 7:
        case 8:
        case 12:
        case 9:
        case 14:
            return null;
        case 1:
            return Ff(b.type) && Gf(), null;
        case 3:
            fh();
            H(N);
            H(M);
            uh();
            d = b.stateNode;
            d.pendingContext && (d.context = d.pendingContext, d.pendingContext = null);
            if (null === a || null === a.child) rh(b) ? b.flags |= 4 : d.hydrate || (b.flags |= 256);
            Ci(b);
            return null;
        case 5:
            hh(b);
            var e = dh(ch.current);
            c = b.type;
            if (null !== a && null != b.stateNode) Di(a, b, c, d, e), a.ref !== b.ref && (b.flags |= 128);
            else {
                if (!d) {
                    if (null ===
                        b.stateNode) throw Error(y(166));
                    return null
                }
                a = dh(ah.current);
                if (rh(b)) {
                    d = b.stateNode;
                    c = b.type;
                    var f = b.memoizedProps;
                    d[wf] = b;
                    d[xf] = f;
                    switch (c) {
                        case "dialog":
                            G("cancel", d);
                            G("close", d);
                            break;
                        case "iframe":
                        case "object":
                        case "embed":
                            G("load", d);
                            break;
                        case "video":
                        case "audio":
                            for (a = 0; a < Xe.length; a++) G(Xe[a], d);
                            break;
                        case "source":
                            G("error", d);
                            break;
                        case "img":
                        case "image":
                        case "link":
                            G("error", d);
                            G("load", d);
                            break;
                        case "details":
                            G("toggle", d);
                            break;
                        case "input":
                            Za(d, f);
                            G("invalid", d);
                            break;
                        case "select":
                            d._wrapperState = {
                                wasMultiple: !!f.multiple
                            };
                            G("invalid", d);
                            break;
                        case "textarea":
                            hb(d, f), G("invalid", d)
                    }
                    vb(c, f);
                    a = null;
                    for (var g in f) f.hasOwnProperty(g) && (e = f[g], "children" === g ? "string" === typeof e ? d.textContent !== e && (a = ["children", e]) : "number" === typeof e && d.textContent !== "" + e && (a = ["children", "" + e]) : ca.hasOwnProperty(g) && null != e && "onScroll" === g && G("scroll", d));
                    switch (c) {
                        case "input":
                            Va(d);
                            cb(d, f, !0);
                            break;
                        case "textarea":
                            Va(d);
                            jb(d);
                            break;
                        case "select":
                        case "option":
                            break;
                        default:
                            "function" === typeof f.onClick && (d.onclick =
                                jf)
                    }
                    d = a;
                    b.updateQueue = d;
                    null !== d && (b.flags |= 4)
                } else {
                    g = 9 === e.nodeType ? e : e.ownerDocument;
                    a === kb.html && (a = lb(c));
                    a === kb.html ? "script" === c ? (a = g.createElement("div"), a.innerHTML = "<script>\x3c/script>", a = a.removeChild(a.firstChild)) : "string" === typeof d.is ? a = g.createElement(c, {
                        is: d.is
                    }) : (a = g.createElement(c), "select" === c && (g = a, d.multiple ? g.multiple = !0 : d.size && (g.size = d.size))) : a = g.createElementNS(a, c);
                    a[wf] = b;
                    a[xf] = d;
                    Bi(a, b, !1, !1);
                    b.stateNode = a;
                    g = wb(c, d);
                    switch (c) {
                        case "dialog":
                            G("cancel", a);
                            G("close", a);
                            e = d;
                            break;
                        case "iframe":
                        case "object":
                        case "embed":
                            G("load", a);
                            e = d;
                            break;
                        case "video":
                        case "audio":
                            for (e = 0; e < Xe.length; e++) G(Xe[e], a);
                            e = d;
                            break;
                        case "source":
                            G("error", a);
                            e = d;
                            break;
                        case "img":
                        case "image":
                        case "link":
                            G("error", a);
                            G("load", a);
                            e = d;
                            break;
                        case "details":
                            G("toggle", a);
                            e = d;
                            break;
                        case "input":
                            Za(a, d);
                            e = Ya(a, d);
                            G("invalid", a);
                            break;
                        case "option":
                            e = eb(a, d);
                            break;
                        case "select":
                            a._wrapperState = {
                                wasMultiple: !!d.multiple
                            };
                            e = m({}, d, {
                                value: void 0
                            });
                            G("invalid", a);
                            break;
                        case "textarea":
                            hb(a, d);
                            e =
                                gb(a, d);
                            G("invalid", a);
                            break;
                        default:
                            e = d
                    }
                    vb(c, e);
                    var h = e;
                    for (f in h)
                        if (h.hasOwnProperty(f)) {
                            var k = h[f];
                            "style" === f ? tb(a, k) : "dangerouslySetInnerHTML" === f ? (k = k ? k.__html : void 0, null != k && ob(a, k)) : "children" === f ? "string" === typeof k ? ("textarea" !== c || "" !== k) && pb(a, k) : "number" === typeof k && pb(a, "" + k) : "suppressContentEditableWarning" !== f && "suppressHydrationWarning" !== f && "autoFocus" !== f && (ca.hasOwnProperty(f) ? null != k && "onScroll" === f && G("scroll", a) : null != k && qa(a, f, k, g))
                        }
                    switch (c) {
                        case "input":
                            Va(a);
                            cb(a, d, !1);
                            break;
                        case "textarea":
                            Va(a);
                            jb(a);
                            break;
                        case "option":
                            null != d.value && a.setAttribute("value", "" + Sa(d.value));
                            break;
                        case "select":
                            a.multiple = !!d.multiple;
                            f = d.value;
                            null != f ? fb(a, !!d.multiple, f, !1) : null != d.defaultValue && fb(a, !!d.multiple, d.defaultValue, !0);
                            break;
                        default:
                            "function" === typeof e.onClick && (a.onclick = jf)
                    }
                    mf(c, d) && (b.flags |= 4)
                }
                null !== b.ref && (b.flags |= 128)
            }
            return null;
        case 6:
            if (a && null != b.stateNode) Ei(a, b, a.memoizedProps, d);
            else {
                if ("string" !== typeof d && null === b.stateNode) throw Error(y(166));
                c = dh(ch.current);
                dh(ah.current);
                rh(b) ? (d = b.stateNode, c = b.memoizedProps, d[wf] = b, d.nodeValue !== c && (b.flags |= 4)) : (d = (9 === c.nodeType ? c : c.ownerDocument).createTextNode(d), d[wf] = b, b.stateNode = d)
            }
            return null;
        case 13:
            H(P);
            d = b.memoizedState;
            if (0 !== (b.flags & 64)) return b.lanes = c, b;
            d = null !== d;
            c = !1;
            null === a ? void 0 !== b.memoizedProps.fallback && rh(b) : c = null !== a.memoizedState;
            if (d && !c && 0 !== (b.mode & 2))
                if (null === a && !0 !== b.memoizedProps.unstable_avoidThisFallback || 0 !== (P.current & 1)) 0 === V && (V = 3);
                else {
                    if (0 === V || 3 === V) V =
                        4;
                    null === U || 0 === (Dg & 134217727) && 0 === (Hi & 134217727) || Ii(U, W)
                }
            if (d || c) b.flags |= 4;
            return null;
        case 4:
            return fh(), Ci(b), null === a && cf(b.stateNode.containerInfo), null;
        case 10:
            return rg(b), null;
        case 17:
            return Ff(b.type) && Gf(), null;
        case 19:
            H(P);
            d = b.memoizedState;
            if (null === d) return null;
            f = 0 !== (b.flags & 64);
            g = d.rendering;
            if (null === g)
                if (f) Fi(d, !1);
                else {
                    if (0 !== V || null !== a && 0 !== (a.flags & 64))
                        for (a = b.child; null !== a;) {
                            g = ih(a);
                            if (null !== g) {
                                b.flags |= 64;
                                Fi(d, !1);
                                f = g.updateQueue;
                                null !== f && (b.updateQueue = f, b.flags |= 4);
                                null === d.lastEffect && (b.firstEffect = null);
                                b.lastEffect = d.lastEffect;
                                d = c;
                                for (c = b.child; null !== c;) f = c, a = d, f.flags &= 2, f.nextEffect = null, f.firstEffect = null, f.lastEffect = null, g = f.alternate, null === g ? (f.childLanes = 0, f.lanes = a, f.child = null, f.memoizedProps = null, f.memoizedState = null, f.updateQueue = null, f.dependencies = null, f.stateNode = null) : (f.childLanes = g.childLanes, f.lanes = g.lanes, f.child = g.child, f.memoizedProps = g.memoizedProps, f.memoizedState = g.memoizedState, f.updateQueue = g.updateQueue, f.type = g.type, a = g.dependencies,
                                    f.dependencies = null === a ? null : {
                                        lanes: a.lanes,
                                        firstContext: a.firstContext
                                    }), c = c.sibling;
                                I(P, P.current & 1 | 2);
                                return b.child
                            }
                            a = a.sibling
                        }
                    null !== d.tail && O() > Ji && (b.flags |= 64, f = !0, Fi(d, !1), b.lanes = 33554432)
                } else {
                if (!f)
                    if (a = ih(g), null !== a) {
                        if (b.flags |= 64, f = !0, c = a.updateQueue, null !== c && (b.updateQueue = c, b.flags |= 4), Fi(d, !0), null === d.tail && "hidden" === d.tailMode && !g.alternate && !lh) return b = b.lastEffect = d.lastEffect, null !== b && (b.nextEffect = null), null
                    } else 2 * O() - d.renderingStartTime > Ji && 1073741824 !== c && (b.flags |=
                        64, f = !0, Fi(d, !1), b.lanes = 33554432);
                d.isBackwards ? (g.sibling = b.child, b.child = g) : (c = d.last, null !== c ? c.sibling = g : b.child = g, d.last = g)
            }
            return null !== d.tail ? (c = d.tail, d.rendering = c, d.tail = c.sibling, d.lastEffect = b.lastEffect, d.renderingStartTime = O(), c.sibling = null, b = P.current, I(P, f ? b & 1 | 2 : b & 1), c) : null;
        case 23:
        case 24:
            return Ki(), null !== a && null !== a.memoizedState !== (null !== b.memoizedState) && "unstable-defer-without-hiding" !== d.mode && (b.flags |= 4), null
    }
    throw Error(y(156, b.tag));
}

function Li(a) {
    switch (a.tag) {
        case 1:
            Ff(a.type) && Gf();
            var b = a.flags;
            return b & 4096 ? (a.flags = b & -4097 | 64, a) : null;
        case 3:
            fh();
            H(N);
            H(M);
            uh();
            b = a.flags;
            if (0 !== (b & 64)) throw Error(y(285));
            a.flags = b & -4097 | 64;
            return a;
        case 5:
            return hh(a), null;
        case 13:
            return H(P), b = a.flags, b & 4096 ? (a.flags = b & -4097 | 64, a) : null;
        case 19:
            return H(P), null;
        case 4:
            return fh(), null;
        case 10:
            return rg(a), null;
        case 23:
        case 24:
            return Ki(), null;
        default:
            return null
    }
}

function Mi(a, b) {
    try {
        var c = "",
            d = b;
        do c += Qa(d), d = d.return; while (d);
        var e = c
    } catch (f) {
        e = "\nError generating stack: " + f.message + "\n" + f.stack
    }
    return {
        value: a,
        source: b,
        stack: e
    }
}

function Ni(a, b) {
    try {
        console.error(b.value)
    } catch (c) {
        setTimeout(function() {
            throw c;
        })
    }
}
var Oi = "function" === typeof WeakMap ? WeakMap : Map;

function Pi(a, b, c) {
    c = zg(-1, c);
    c.tag = 3;
    c.payload = {
        element: null
    };
    var d = b.value;
    c.callback = function() {
        Qi || (Qi = !0, Ri = d);
        Ni(a, b)
    };
    return c
}

function Si(a, b, c) {
    c = zg(-1, c);
    c.tag = 3;
    var d = a.type.getDerivedStateFromError;
    if ("function" === typeof d) {
        var e = b.value;
        c.payload = function() {
            Ni(a, b);
            return d(e)
        }
    }
    var f = a.stateNode;
    null !== f && "function" === typeof f.componentDidCatch && (c.callback = function() {
        "function" !== typeof d && (null === Ti ? Ti = new Set([this]) : Ti.add(this), Ni(a, b));
        var c = b.stack;
        this.componentDidCatch(b.value, {
            componentStack: null !== c ? c : ""
        })
    });
    return c
}
var Ui = "function" === typeof WeakSet ? WeakSet : Set;

function Vi(a) {
    var b = a.ref;
    if (null !== b)
        if ("function" === typeof b) try {
            b(null)
        } catch (c) {
            Wi(a, c)
        } else b.current = null
}

function Xi(a, b) {
    switch (b.tag) {
        case 0:
        case 11:
        case 15:
        case 22:
            return;
        case 1:
            if (b.flags & 256 && null !== a) {
                var c = a.memoizedProps,
                    d = a.memoizedState;
                a = b.stateNode;
                b = a.getSnapshotBeforeUpdate(b.elementType === b.type ? c : lg(b.type, c), d);
                a.__reactInternalSnapshotBeforeUpdate = b
            }
            return;
        case 3:
            b.flags & 256 && qf(b.stateNode.containerInfo);
            return;
        case 5:
        case 6:
        case 4:
        case 17:
            return
    }
    throw Error(y(163));
}

function Yi(a, b, c) {
    switch (c.tag) {
        case 0:
        case 11:
        case 15:
        case 22:
            b = c.updateQueue;
            b = null !== b ? b.lastEffect : null;
            if (null !== b) {
                a = b = b.next;
                do {
                    if (3 === (a.tag & 3)) {
                        var d = a.create;
                        a.destroy = d()
                    }
                    a = a.next
                } while (a !== b)
            }
            b = c.updateQueue;
            b = null !== b ? b.lastEffect : null;
            if (null !== b) {
                a = b = b.next;
                do {
                    var e = a;
                    d = e.next;
                    e = e.tag;
                    0 !== (e & 4) && 0 !== (e & 1) && (Zi(c, a), $i(c, a));
                    a = d
                } while (a !== b)
            }
            return;
        case 1:
            a = c.stateNode;
            c.flags & 4 && (null === b ? a.componentDidMount() : (d = c.elementType === c.type ? b.memoizedProps : lg(c.type, b.memoizedProps), a.componentDidUpdate(d,
                b.memoizedState, a.__reactInternalSnapshotBeforeUpdate)));
            b = c.updateQueue;
            null !== b && Eg(c, b, a);
            return;
        case 3:
            b = c.updateQueue;
            if (null !== b) {
                a = null;
                if (null !== c.child) switch (c.child.tag) {
                    case 5:
                        a = c.child.stateNode;
                        break;
                    case 1:
                        a = c.child.stateNode
                }
                Eg(c, b, a)
            }
            return;
        case 5:
            a = c.stateNode;
            null === b && c.flags & 4 && mf(c.type, c.memoizedProps) && a.focus();
            return;
        case 6:
            return;
        case 4:
            return;
        case 12:
            return;
        case 13:
            null === c.memoizedState && (c = c.alternate, null !== c && (c = c.memoizedState, null !== c && (c = c.dehydrated, null !== c && Cc(c))));
            return;
        case 19:
        case 17:
        case 20:
        case 21:
        case 23:
        case 24:
            return
    }
    throw Error(y(163));
}

function aj(a, b) {
    for (var c = a;;) {
        if (5 === c.tag) {
            var d = c.stateNode;
            if (b) d = d.style, "function" === typeof d.setProperty ? d.setProperty("display", "none", "important") : d.display = "none";
            else {
                d = c.stateNode;
                var e = c.memoizedProps.style;
                e = void 0 !== e && null !== e && e.hasOwnProperty("display") ? e.display : null;
                d.style.display = sb("display", e)
            }
        } else if (6 === c.tag) c.stateNode.nodeValue = b ? "" : c.memoizedProps;
        else if ((23 !== c.tag && 24 !== c.tag || null === c.memoizedState || c === a) && null !== c.child) {
            c.child.return = c;
            c = c.child;
            continue
        }
        if (c ===
            a) break;
        for (; null === c.sibling;) {
            if (null === c.return || c.return === a) return;
            c = c.return
        }
        c.sibling.return = c.return;
        c = c.sibling
    }
}

function bj(a, b) {
    if (Mf && "function" === typeof Mf.onCommitFiberUnmount) try {
        Mf.onCommitFiberUnmount(Lf, b)
    } catch (f) {}
    switch (b.tag) {
        case 0:
        case 11:
        case 14:
        case 15:
        case 22:
            a = b.updateQueue;
            if (null !== a && (a = a.lastEffect, null !== a)) {
                var c = a = a.next;
                do {
                    var d = c,
                        e = d.destroy;
                    d = d.tag;
                    if (void 0 !== e)
                        if (0 !== (d & 4)) Zi(b, c);
                        else {
                            d = b;
                            try {
                                e()
                            } catch (f) {
                                Wi(d, f)
                            }
                        }
                    c = c.next
                } while (c !== a)
            }
            break;
        case 1:
            Vi(b);
            a = b.stateNode;
            if ("function" === typeof a.componentWillUnmount) try {
                a.props = b.memoizedProps, a.state = b.memoizedState, a.componentWillUnmount()
            } catch (f) {
                Wi(b,
                    f)
            }
            break;
        case 5:
            Vi(b);
            break;
        case 4:
            cj(a, b)
    }
}

function dj(a) {
    a.alternate = null;
    a.child = null;
    a.dependencies = null;
    a.firstEffect = null;
    a.lastEffect = null;
    a.memoizedProps = null;
    a.memoizedState = null;
    a.pendingProps = null;
    a.return = null;
    a.updateQueue = null
}

function ej(a) {
    return 5 === a.tag || 3 === a.tag || 4 === a.tag
}

function fj(a) {
    a: {
        for (var b = a.return; null !== b;) {
            if (ej(b)) break a;
            b = b.return
        }
        throw Error(y(160));
    }
    var c = b;b = c.stateNode;
    switch (c.tag) {
        case 5:
            var d = !1;
            break;
        case 3:
            b = b.containerInfo;
            d = !0;
            break;
        case 4:
            b = b.containerInfo;
            d = !0;
            break;
        default:
            throw Error(y(161));
    }
    c.flags & 16 && (pb(b, ""), c.flags &= -17);a: b: for (c = a;;) {
        for (; null === c.sibling;) {
            if (null === c.return || ej(c.return)) {
                c = null;
                break a
            }
            c = c.return
        }
        c.sibling.return = c.return;
        for (c = c.sibling; 5 !== c.tag && 6 !== c.tag && 18 !== c.tag;) {
            if (c.flags & 2) continue b;
            if (null ===
                c.child || 4 === c.tag) continue b;
            else c.child.return = c, c = c.child
        }
        if (!(c.flags & 2)) {
            c = c.stateNode;
            break a
        }
    }
    d ? gj(a, c, b) : hj(a, c, b)
}

function gj(a, b, c) {
    var d = a.tag,
        e = 5 === d || 6 === d;
    if (e) a = e ? a.stateNode : a.stateNode.instance, b ? 8 === c.nodeType ? c.parentNode.insertBefore(a, b) : c.insertBefore(a, b) : (8 === c.nodeType ? (b = c.parentNode, b.insertBefore(a, c)) : (b = c, b.appendChild(a)), c = c._reactRootContainer, null !== c && void 0 !== c || null !== b.onclick || (b.onclick = jf));
    else if (4 !== d && (a = a.child, null !== a))
        for (gj(a, b, c), a = a.sibling; null !== a;) gj(a, b, c), a = a.sibling
}

function hj(a, b, c) {
    var d = a.tag,
        e = 5 === d || 6 === d;
    if (e) a = e ? a.stateNode : a.stateNode.instance, b ? c.insertBefore(a, b) : c.appendChild(a);
    else if (4 !== d && (a = a.child, null !== a))
        for (hj(a, b, c), a = a.sibling; null !== a;) hj(a, b, c), a = a.sibling
}

function cj(a, b) {
    for (var c = b, d = !1, e, f;;) {
        if (!d) {
            d = c.return;
            a: for (;;) {
                if (null === d) throw Error(y(160));
                e = d.stateNode;
                switch (d.tag) {
                    case 5:
                        f = !1;
                        break a;
                    case 3:
                        e = e.containerInfo;
                        f = !0;
                        break a;
                    case 4:
                        e = e.containerInfo;
                        f = !0;
                        break a
                }
                d = d.return
            }
            d = !0
        }
        if (5 === c.tag || 6 === c.tag) {
            a: for (var g = a, h = c, k = h;;)
                if (bj(g, k), null !== k.child && 4 !== k.tag) k.child.return = k, k = k.child;
                else {
                    if (k === h) break a;
                    for (; null === k.sibling;) {
                        if (null === k.return || k.return === h) break a;
                        k = k.return
                    }
                    k.sibling.return = k.return;
                    k = k.sibling
                }f ? (g = e, h = c.stateNode,
                8 === g.nodeType ? g.parentNode.removeChild(h) : g.removeChild(h)) : e.removeChild(c.stateNode)
        } else if (4 === c.tag) {
            if (null !== c.child) {
                e = c.stateNode.containerInfo;
                f = !0;
                c.child.return = c;
                c = c.child;
                continue
            }
        } else if (bj(a, c), null !== c.child) {
            c.child.return = c;
            c = c.child;
            continue
        }
        if (c === b) break;
        for (; null === c.sibling;) {
            if (null === c.return || c.return === b) return;
            c = c.return;
            4 === c.tag && (d = !1)
        }
        c.sibling.return = c.return;
        c = c.sibling
    }
}

function ij(a, b) {
    switch (b.tag) {
        case 0:
        case 11:
        case 14:
        case 15:
        case 22:
            var c = b.updateQueue;
            c = null !== c ? c.lastEffect : null;
            if (null !== c) {
                var d = c = c.next;
                do 3 === (d.tag & 3) && (a = d.destroy, d.destroy = void 0, void 0 !== a && a()), d = d.next; while (d !== c)
            }
            return;
        case 1:
            return;
        case 5:
            c = b.stateNode;
            if (null != c) {
                d = b.memoizedProps;
                var e = null !== a ? a.memoizedProps : d;
                a = b.type;
                var f = b.updateQueue;
                b.updateQueue = null;
                if (null !== f) {
                    c[xf] = d;
                    "input" === a && "radio" === d.type && null != d.name && $a(c, d);
                    wb(a, e);
                    b = wb(a, d);
                    for (e = 0; e < f.length; e +=
                        2) {
                        var g = f[e],
                            h = f[e + 1];
                        "style" === g ? tb(c, h) : "dangerouslySetInnerHTML" === g ? ob(c, h) : "children" === g ? pb(c, h) : qa(c, g, h, b)
                    }
                    switch (a) {
                        case "input":
                            ab(c, d);
                            break;
                        case "textarea":
                            ib(c, d);
                            break;
                        case "select":
                            a = c._wrapperState.wasMultiple, c._wrapperState.wasMultiple = !!d.multiple, f = d.value, null != f ? fb(c, !!d.multiple, f, !1) : a !== !!d.multiple && (null != d.defaultValue ? fb(c, !!d.multiple, d.defaultValue, !0) : fb(c, !!d.multiple, d.multiple ? [] : "", !1))
                    }
                }
            }
            return;
        case 6:
            if (null === b.stateNode) throw Error(y(162));
            b.stateNode.nodeValue =
                b.memoizedProps;
            return;
        case 3:
            c = b.stateNode;
            c.hydrate && (c.hydrate = !1, Cc(c.containerInfo));
            return;
        case 12:
            return;
        case 13:
            null !== b.memoizedState && (jj = O(), aj(b.child, !0));
            kj(b);
            return;
        case 19:
            kj(b);
            return;
        case 17:
            return;
        case 23:
        case 24:
            aj(b, null !== b.memoizedState);
            return
    }
    throw Error(y(163));
}

function kj(a) {
    var b = a.updateQueue;
    if (null !== b) {
        a.updateQueue = null;
        var c = a.stateNode;
        null === c && (c = a.stateNode = new Ui);
        b.forEach(function(b) {
            var d = lj.bind(null, a, b);
            c.has(b) || (c.add(b), b.then(d, d))
        })
    }
}

function mj(a, b) {
    return null !== a && (a = a.memoizedState, null === a || null !== a.dehydrated) ? (b = b.memoizedState, null !== b && null === b.dehydrated) : !1
}
var nj = Math.ceil,
    oj = ra.ReactCurrentDispatcher,
    pj = ra.ReactCurrentOwner,
    X = 0,
    U = null,
    Y = null,
    W = 0,
    qj = 0,
    rj = Bf(0),
    V = 0,
    sj = null,
    tj = 0,
    Dg = 0,
    Hi = 0,
    uj = 0,
    vj = null,
    jj = 0,
    Ji = Infinity;

function wj() {
    Ji = O() + 500
}
var Z = null,
    Qi = !1,
    Ri = null,
    Ti = null,
    xj = !1,
    yj = null,
    zj = 90,
    Aj = [],
    Bj = [],
    Cj = null,
    Dj = 0,
    Ej = null,
    Fj = -1,
    Gj = 0,
    Hj = 0,
    Ij = null,
    Jj = !1;

function Hg() {
    return 0 !== (X & 48) ? O() : -1 !== Fj ? Fj : Fj = O()
}

function Ig(a) {
    a = a.mode;
    if (0 === (a & 2)) return 1;
    if (0 === (a & 4)) return 99 === eg() ? 1 : 2;
    0 === Gj && (Gj = tj);
    if (0 !== kg.transition) {
        0 !== Hj && (Hj = null !== vj ? vj.pendingLanes : 0);
        a = Gj;
        var b = 4186112 & ~Hj;
        b &= -b;
        0 === b && (a = 4186112 & ~a, b = a & -a, 0 === b && (b = 8192));
        return b
    }
    a = eg();
    0 !== (X & 4) && 98 === a ? a = Xc(12, Gj) : (a = Sc(a), a = Xc(a, Gj));
    return a
}

function Jg(a, b, c) {
    if (50 < Dj) throw Dj = 0, Ej = null, Error(y(185));
    a = Kj(a, b);
    if (null === a) return null;
    $c(a, b, c);
    a === U && (Hi |= b, 4 === V && Ii(a, W));
    var d = eg();
    1 === b ? 0 !== (X & 8) && 0 === (X & 48) ? Lj(a) : (Mj(a, c), 0 === X && (wj(), ig())) : (0 === (X & 4) || 98 !== d && 99 !== d || (null === Cj ? Cj = new Set([a]) : Cj.add(a)), Mj(a, c));
    vj = a
}

function Kj(a, b) {
    a.lanes |= b;
    var c = a.alternate;
    null !== c && (c.lanes |= b);
    c = a;
    for (a = a.return; null !== a;) a.childLanes |= b, c = a.alternate, null !== c && (c.childLanes |= b), c = a, a = a.return;
    return 3 === c.tag ? c.stateNode : null
}

function Mj(a, b) {
    for (var c = a.callbackNode, d = a.suspendedLanes, e = a.pingedLanes, f = a.expirationTimes, g = a.pendingLanes; 0 < g;) {
        var h = 31 - Vc(g),
            k = 1 << h,
            l = f[h];
        if (-1 === l) {
            if (0 === (k & d) || 0 !== (k & e)) {
                l = b;
                Rc(k);
                var n = F;
                f[h] = 10 <= n ? l + 250 : 6 <= n ? l + 5E3 : -1
            }
        } else l <= b && (a.expiredLanes |= k);
        g &= ~k
    }
    d = Uc(a, a === U ? W : 0);
    b = F;
    if (0 === d) null !== c && (c !== Zf && Pf(c), a.callbackNode = null, a.callbackPriority = 0);
    else {
        if (null !== c) {
            if (a.callbackPriority === b) return;
            c !== Zf && Pf(c)
        }
        15 === b ? (c = Lj.bind(null, a), null === ag ? (ag = [c], bg = Of(Uf, jg)) : ag.push(c),
            c = Zf) : 14 === b ? c = hg(99, Lj.bind(null, a)) : (c = Tc(b), c = hg(c, Nj.bind(null, a)));
        a.callbackPriority = b;
        a.callbackNode = c
    }
}

function Nj(a) {
    Fj = -1;
    Hj = Gj = 0;
    if (0 !== (X & 48)) throw Error(y(327));
    var b = a.callbackNode;
    if (Oj() && a.callbackNode !== b) return null;
    var c = Uc(a, a === U ? W : 0);
    if (0 === c) return null;
    var d = c;
    var e = X;
    X |= 16;
    var f = Pj();
    if (U !== a || W !== d) wj(), Qj(a, d);
    do try {
        Rj();
        break
    } catch (h) {
        Sj(a, h)
    }
    while (1);
    qg();
    oj.current = f;
    X = e;
    null !== Y ? d = 0 : (U = null, W = 0, d = V);
    if (0 !== (tj & Hi)) Qj(a, 0);
    else if (0 !== d) {
        2 === d && (X |= 64, a.hydrate && (a.hydrate = !1, qf(a.containerInfo)), c = Wc(a), 0 !== c && (d = Tj(a, c)));
        if (1 === d) throw b = sj, Qj(a, 0), Ii(a, c), Mj(a, O()), b;
        a.finishedWork =
            a.current.alternate;
        a.finishedLanes = c;
        switch (d) {
            case 0:
            case 1:
                throw Error(y(345));
            case 2:
                Uj(a);
                break;
            case 3:
                Ii(a, c);
                if ((c & 62914560) === c && (d = jj + 500 - O(), 10 < d)) {
                    if (0 !== Uc(a, 0)) break;
                    e = a.suspendedLanes;
                    if ((e & c) !== c) {
                        Hg();
                        a.pingedLanes |= a.suspendedLanes & e;
                        break
                    }
                    a.timeoutHandle = of(Uj.bind(null, a), d);
                    break
                }
                Uj(a);
                break;
            case 4:
                Ii(a, c);
                if ((c & 4186112) === c) break;
                d = a.eventTimes;
                for (e = -1; 0 < c;) {
                    var g = 31 - Vc(c);
                    f = 1 << g;
                    g = d[g];
                    g > e && (e = g);
                    c &= ~f
                }
                c = e;
                c = O() - c;
                c = (120 > c ? 120 : 480 > c ? 480 : 1080 > c ? 1080 : 1920 > c ? 1920 : 3E3 > c ? 3E3 : 4320 >
                    c ? 4320 : 1960 * nj(c / 1960)) - c;
                if (10 < c) {
                    a.timeoutHandle = of(Uj.bind(null, a), c);
                    break
                }
                Uj(a);
                break;
            case 5:
                Uj(a);
                break;
            default:
                throw Error(y(329));
        }
    }
    Mj(a, O());
    return a.callbackNode === b ? Nj.bind(null, a) : null
}

function Ii(a, b) {
    b &= ~uj;
    b &= ~Hi;
    a.suspendedLanes |= b;
    a.pingedLanes &= ~b;
    for (a = a.expirationTimes; 0 < b;) {
        var c = 31 - Vc(b),
            d = 1 << c;
        a[c] = -1;
        b &= ~d
    }
}

function Lj(a) {
    if (0 !== (X & 48)) throw Error(y(327));
    Oj();
    if (a === U && 0 !== (a.expiredLanes & W)) {
        var b = W;
        var c = Tj(a, b);
        0 !== (tj & Hi) && (b = Uc(a, b), c = Tj(a, b))
    } else b = Uc(a, 0), c = Tj(a, b);
    0 !== a.tag && 2 === c && (X |= 64, a.hydrate && (a.hydrate = !1, qf(a.containerInfo)), b = Wc(a), 0 !== b && (c = Tj(a, b)));
    if (1 === c) throw c = sj, Qj(a, 0), Ii(a, b), Mj(a, O()), c;
    a.finishedWork = a.current.alternate;
    a.finishedLanes = b;
    Uj(a);
    Mj(a, O());
    return null
}

function Vj() {
    if (null !== Cj) {
        var a = Cj;
        Cj = null;
        a.forEach(function(a) {
            a.expiredLanes |= 24 & a.pendingLanes;
            Mj(a, O())
        })
    }
    ig()
}

function Wj(a, b) {
    var c = X;
    X |= 1;
    try {
        return a(b)
    } finally {
        X = c, 0 === X && (wj(), ig())
    }
}

function Xj(a, b) {
    var c = X;
    X &= -2;
    X |= 8;
    try {
        return a(b)
    } finally {
        X = c, 0 === X && (wj(), ig())
    }
}

function ni(a, b) {
    I(rj, qj);
    qj |= b;
    tj |= b
}

function Ki() {
    qj = rj.current;
    H(rj)
}

function Qj(a, b) {
    a.finishedWork = null;
    a.finishedLanes = 0;
    var c = a.timeoutHandle; - 1 !== c && (a.timeoutHandle = -1, pf(c));
    if (null !== Y)
        for (c = Y.return; null !== c;) {
            var d = c;
            switch (d.tag) {
                case 1:
                    d = d.type.childContextTypes;
                    null !== d && void 0 !== d && Gf();
                    break;
                case 3:
                    fh();
                    H(N);
                    H(M);
                    uh();
                    break;
                case 5:
                    hh(d);
                    break;
                case 4:
                    fh();
                    break;
                case 13:
                    H(P);
                    break;
                case 19:
                    H(P);
                    break;
                case 10:
                    rg(d);
                    break;
                case 23:
                case 24:
                    Ki()
            }
            c = c.return
        }
    U = a;
    Y = Tg(a.current, null);
    W = qj = tj = b;
    V = 0;
    sj = null;
    uj = Hi = Dg = 0
}

function Sj(a, b) {
    do {
        var c = Y;
        try {
            qg();
            vh.current = Gh;
            if (yh) {
                for (var d = R.memoizedState; null !== d;) {
                    var e = d.queue;
                    null !== e && (e.pending = null);
                    d = d.next
                }
                yh = !1
            }
            xh = 0;
            T = S = R = null;
            zh = !1;
            pj.current = null;
            if (null === c || null === c.return) {
                V = 1;
                sj = b;
                Y = null;
                break
            }
            a: {
                var f = a,
                    g = c.return,
                    h = c,
                    k = b;
                b = W;
                h.flags |= 2048;
                h.firstEffect = h.lastEffect = null;
                if (null !== k && "object" === typeof k && "function" === typeof k.then) {
                    var l = k;
                    if (0 === (h.mode & 2)) {
                        var n = h.alternate;
                        n ? (h.updateQueue = n.updateQueue, h.memoizedState = n.memoizedState, h.lanes = n.lanes) :
                            (h.updateQueue = null, h.memoizedState = null)
                    }
                    var A = 0 !== (P.current & 1),
                        p = g;
                    do {
                        var C;
                        if (C = 13 === p.tag) {
                            var x = p.memoizedState;
                            if (null !== x) C = null !== x.dehydrated ? !0 : !1;
                            else {
                                var w = p.memoizedProps;
                                C = void 0 === w.fallback ? !1 : !0 !== w.unstable_avoidThisFallback ? !0 : A ? !1 : !0
                            }
                        }
                        if (C) {
                            var z = p.updateQueue;
                            if (null === z) {
                                var u = new Set;
                                u.add(l);
                                p.updateQueue = u
                            } else z.add(l);
                            if (0 === (p.mode & 2)) {
                                p.flags |= 64;
                                h.flags |= 16384;
                                h.flags &= -2981;
                                if (1 === h.tag)
                                    if (null === h.alternate) h.tag = 17;
                                    else {
                                        var t = zg(-1, 1);
                                        t.tag = 2;
                                        Ag(h, t)
                                    }
                                h.lanes |= 1;
                                break a
                            }
                            k =
                                void 0;
                            h = b;
                            var q = f.pingCache;
                            null === q ? (q = f.pingCache = new Oi, k = new Set, q.set(l, k)) : (k = q.get(l), void 0 === k && (k = new Set, q.set(l, k)));
                            if (!k.has(h)) {
                                k.add(h);
                                var v = Yj.bind(null, f, l, h);
                                l.then(v, v)
                            }
                            p.flags |= 4096;
                            p.lanes = b;
                            break a
                        }
                        p = p.return
                    } while (null !== p);
                    k = Error((Ra(h.type) || "A React component") + " suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")
                }
                5 !== V && (V = 2);
                k = Mi(k, h);
                p =
                    g;
                do {
                    switch (p.tag) {
                        case 3:
                            f = k;
                            p.flags |= 4096;
                            b &= -b;
                            p.lanes |= b;
                            var J = Pi(p, f, b);
                            Bg(p, J);
                            break a;
                        case 1:
                            f = k;
                            var K = p.type,
                                Q = p.stateNode;
                            if (0 === (p.flags & 64) && ("function" === typeof K.getDerivedStateFromError || null !== Q && "function" === typeof Q.componentDidCatch && (null === Ti || !Ti.has(Q)))) {
                                p.flags |= 4096;
                                b &= -b;
                                p.lanes |= b;
                                var L = Si(p, f, b);
                                Bg(p, L);
                                break a
                            }
                    }
                    p = p.return
                } while (null !== p)
            }
            Zj(c)
        } catch (va) {
            b = va;
            Y === c && null !== c && (Y = c = c.return);
            continue
        }
        break
    } while (1)
}

function Pj() {
    var a = oj.current;
    oj.current = Gh;
    return null === a ? Gh : a
}

function Tj(a, b) {
    var c = X;
    X |= 16;
    var d = Pj();
    U === a && W === b || Qj(a, b);
    do try {
        ak();
        break
    } catch (e) {
        Sj(a, e)
    }
    while (1);
    qg();
    X = c;
    oj.current = d;
    if (null !== Y) throw Error(y(261));
    U = null;
    W = 0;
    return V
}

function ak() {
    for (; null !== Y;) bk(Y)
}

function Rj() {
    for (; null !== Y && !Qf();) bk(Y)
}

function bk(a) {
    var b = ck(a.alternate, a, qj);
    a.memoizedProps = a.pendingProps;
    null === b ? Zj(a) : Y = b;
    pj.current = null
}

function Zj(a) {
    var b = a;
    do {
        var c = b.alternate;
        a = b.return;
        if (0 === (b.flags & 2048)) {
            c = Gi(c, b, qj);
            if (null !== c) {
                Y = c;
                return
            }
            c = b;
            if (24 !== c.tag && 23 !== c.tag || null === c.memoizedState || 0 !== (qj & 1073741824) || 0 === (c.mode & 4)) {
                for (var d = 0, e = c.child; null !== e;) d |= e.lanes | e.childLanes, e = e.sibling;
                c.childLanes = d
            }
            null !== a && 0 === (a.flags & 2048) && (null === a.firstEffect && (a.firstEffect = b.firstEffect), null !== b.lastEffect && (null !== a.lastEffect && (a.lastEffect.nextEffect = b.firstEffect), a.lastEffect = b.lastEffect), 1 < b.flags && (null !==
                a.lastEffect ? a.lastEffect.nextEffect = b : a.firstEffect = b, a.lastEffect = b))
        } else {
            c = Li(b);
            if (null !== c) {
                c.flags &= 2047;
                Y = c;
                return
            }
            null !== a && (a.firstEffect = a.lastEffect = null, a.flags |= 2048)
        }
        b = b.sibling;
        if (null !== b) {
            Y = b;
            return
        }
        Y = b = a
    } while (null !== b);
    0 === V && (V = 5)
}

function Uj(a) {
    var b = eg();
    gg(99, dk.bind(null, a, b));
    return null
}

function dk(a, b) {
    do Oj(); while (null !== yj);
    if (0 !== (X & 48)) throw Error(y(327));
    var c = a.finishedWork;
    if (null === c) return null;
    a.finishedWork = null;
    a.finishedLanes = 0;
    if (c === a.current) throw Error(y(177));
    a.callbackNode = null;
    var d = c.lanes | c.childLanes,
        e = d,
        f = a.pendingLanes & ~e;
    a.pendingLanes = e;
    a.suspendedLanes = 0;
    a.pingedLanes = 0;
    a.expiredLanes &= e;
    a.mutableReadLanes &= e;
    a.entangledLanes &= e;
    e = a.entanglements;
    for (var g = a.eventTimes, h = a.expirationTimes; 0 < f;) {
        var k = 31 - Vc(f),
            l = 1 << k;
        e[k] = 0;
        g[k] = -1;
        h[k] = -1;
        f &= ~l
    }
    null !==
        Cj && 0 === (d & 24) && Cj.has(a) && Cj.delete(a);
    a === U && (Y = U = null, W = 0);
    1 < c.flags ? null !== c.lastEffect ? (c.lastEffect.nextEffect = c, d = c.firstEffect) : d = c : d = c.firstEffect;
    if (null !== d) {
        e = X;
        X |= 32;
        pj.current = null;
        kf = fd;
        g = Ne();
        if (Oe(g)) {
            if ("selectionStart" in g) h = {
                start: g.selectionStart,
                end: g.selectionEnd
            };
            else a: if (h = (h = g.ownerDocument) && h.defaultView || window, (l = h.getSelection && h.getSelection()) && 0 !== l.rangeCount) {
                h = l.anchorNode;
                f = l.anchorOffset;
                k = l.focusNode;
                l = l.focusOffset;
                try {
                    h.nodeType, k.nodeType
                } catch (va) {
                    h = null;
                    break a
                }
                var n = 0,
                    A = -1,
                    p = -1,
                    C = 0,
                    x = 0,
                    w = g,
                    z = null;
                b: for (;;) {
                    for (var u;;) {
                        w !== h || 0 !== f && 3 !== w.nodeType || (A = n + f);
                        w !== k || 0 !== l && 3 !== w.nodeType || (p = n + l);
                        3 === w.nodeType && (n += w.nodeValue.length);
                        if (null === (u = w.firstChild)) break;
                        z = w;
                        w = u
                    }
                    for (;;) {
                        if (w === g) break b;
                        z === h && ++C === f && (A = n);
                        z === k && ++x === l && (p = n);
                        if (null !== (u = w.nextSibling)) break;
                        w = z;
                        z = w.parentNode
                    }
                    w = u
                }
                h = -1 === A || -1 === p ? null : {
                    start: A,
                    end: p
                }
            } else h = null;
            h = h || {
                start: 0,
                end: 0
            }
        } else h = null;
        lf = {
            focusedElem: g,
            selectionRange: h
        };
        fd = !1;
        Ij = null;
        Jj = !1;
        Z = d;
        do try {
            ek()
        } catch (va) {
            if (null ===
                Z) throw Error(y(330));
            Wi(Z, va);
            Z = Z.nextEffect
        }
        while (null !== Z);
        Ij = null;
        Z = d;
        do try {
            for (g = a; null !== Z;) {
                var t = Z.flags;
                t & 16 && pb(Z.stateNode, "");
                if (t & 128) {
                    var q = Z.alternate;
                    if (null !== q) {
                        var v = q.ref;
                        null !== v && ("function" === typeof v ? v(null) : v.current = null)
                    }
                }
                switch (t & 1038) {
                    case 2:
                        fj(Z);
                        Z.flags &= -3;
                        break;
                    case 6:
                        fj(Z);
                        Z.flags &= -3;
                        ij(Z.alternate, Z);
                        break;
                    case 1024:
                        Z.flags &= -1025;
                        break;
                    case 1028:
                        Z.flags &= -1025;
                        ij(Z.alternate, Z);
                        break;
                    case 4:
                        ij(Z.alternate, Z);
                        break;
                    case 8:
                        h = Z;
                        cj(g, h);
                        var J = h.alternate;
                        dj(h);
                        null !==
                            J && dj(J)
                }
                Z = Z.nextEffect
            }
        } catch (va) {
            if (null === Z) throw Error(y(330));
            Wi(Z, va);
            Z = Z.nextEffect
        }
        while (null !== Z);
        v = lf;
        q = Ne();
        t = v.focusedElem;
        g = v.selectionRange;
        if (q !== t && t && t.ownerDocument && Me(t.ownerDocument.documentElement, t)) {
            null !== g && Oe(t) && (q = g.start, v = g.end, void 0 === v && (v = q), "selectionStart" in t ? (t.selectionStart = q, t.selectionEnd = Math.min(v, t.value.length)) : (v = (q = t.ownerDocument || document) && q.defaultView || window, v.getSelection && (v = v.getSelection(), h = t.textContent.length, J = Math.min(g.start, h), g = void 0 ===
                g.end ? J : Math.min(g.end, h), !v.extend && J > g && (h = g, g = J, J = h), h = Le(t, J), f = Le(t, g), h && f && (1 !== v.rangeCount || v.anchorNode !== h.node || v.anchorOffset !== h.offset || v.focusNode !== f.node || v.focusOffset !== f.offset) && (q = q.createRange(), q.setStart(h.node, h.offset), v.removeAllRanges(), J > g ? (v.addRange(q), v.extend(f.node, f.offset)) : (q.setEnd(f.node, f.offset), v.addRange(q))))));
            q = [];
            for (v = t; v = v.parentNode;) 1 === v.nodeType && q.push({
                element: v,
                left: v.scrollLeft,
                top: v.scrollTop
            });
            "function" === typeof t.focus && t.focus();
            for (t =
                0; t < q.length; t++) v = q[t], v.element.scrollLeft = v.left, v.element.scrollTop = v.top
        }
        fd = !!kf;
        lf = kf = null;
        a.current = c;
        Z = d;
        do try {
            for (t = a; null !== Z;) {
                var K = Z.flags;
                K & 36 && Yi(t, Z.alternate, Z);
                if (K & 128) {
                    q = void 0;
                    var Q = Z.ref;
                    if (null !== Q) {
                        var L = Z.stateNode;
                        switch (Z.tag) {
                            case 5:
                                q = L;
                                break;
                            default:
                                q = L
                        }
                        "function" === typeof Q ? Q(q) : Q.current = q
                    }
                }
                Z = Z.nextEffect
            }
        } catch (va) {
            if (null === Z) throw Error(y(330));
            Wi(Z, va);
            Z = Z.nextEffect
        }
        while (null !== Z);
        Z = null;
        $f();
        X = e
    } else a.current = c;
    if (xj) xj = !1, yj = a, zj = b;
    else
        for (Z = d; null !== Z;) b =
            Z.nextEffect, Z.nextEffect = null, Z.flags & 8 && (K = Z, K.sibling = null, K.stateNode = null), Z = b;
    d = a.pendingLanes;
    0 === d && (Ti = null);
    1 === d ? a === Ej ? Dj++ : (Dj = 0, Ej = a) : Dj = 0;
    c = c.stateNode;
    if (Mf && "function" === typeof Mf.onCommitFiberRoot) try {
        Mf.onCommitFiberRoot(Lf, c, void 0, 64 === (c.current.flags & 64))
    } catch (va) {}
    Mj(a, O());
    if (Qi) throw Qi = !1, a = Ri, Ri = null, a;
    if (0 !== (X & 8)) return null;
    ig();
    return null
}

function ek() {
    for (; null !== Z;) {
        var a = Z.alternate;
        Jj || null === Ij || (0 !== (Z.flags & 8) ? dc(Z, Ij) && (Jj = !0) : 13 === Z.tag && mj(a, Z) && dc(Z, Ij) && (Jj = !0));
        var b = Z.flags;
        0 !== (b & 256) && Xi(a, Z);
        0 === (b & 512) || xj || (xj = !0, hg(97, function() {
            Oj();
            return null
        }));
        Z = Z.nextEffect
    }
}

function Oj() {
    if (90 !== zj) {
        var a = 97 < zj ? 97 : zj;
        zj = 90;
        return gg(a, fk)
    }
    return !1
}

function $i(a, b) {
    Aj.push(b, a);
    xj || (xj = !0, hg(97, function() {
        Oj();
        return null
    }))
}

function Zi(a, b) {
    Bj.push(b, a);
    xj || (xj = !0, hg(97, function() {
        Oj();
        return null
    }))
}

function fk() {
    if (null === yj) return !1;
    var a = yj;
    yj = null;
    if (0 !== (X & 48)) throw Error(y(331));
    var b = X;
    X |= 32;
    var c = Bj;
    Bj = [];
    for (var d = 0; d < c.length; d += 2) {
        var e = c[d],
            f = c[d + 1],
            g = e.destroy;
        e.destroy = void 0;
        if ("function" === typeof g) try {
            g()
        } catch (k) {
            if (null === f) throw Error(y(330));
            Wi(f, k)
        }
    }
    c = Aj;
    Aj = [];
    for (d = 0; d < c.length; d += 2) {
        e = c[d];
        f = c[d + 1];
        try {
            var h = e.create;
            e.destroy = h()
        } catch (k) {
            if (null === f) throw Error(y(330));
            Wi(f, k)
        }
    }
    for (h = a.current.firstEffect; null !== h;) a = h.nextEffect, h.nextEffect = null, h.flags & 8 && (h.sibling =
        null, h.stateNode = null), h = a;
    X = b;
    ig();
    return !0
}

function gk(a, b, c) {
    b = Mi(c, b);
    b = Pi(a, b, 1);
    Ag(a, b);
    b = Hg();
    a = Kj(a, 1);
    null !== a && ($c(a, 1, b), Mj(a, b))
}

function Wi(a, b) {
    if (3 === a.tag) gk(a, a, b);
    else
        for (var c = a.return; null !== c;) {
            if (3 === c.tag) {
                gk(c, a, b);
                break
            } else if (1 === c.tag) {
                var d = c.stateNode;
                if ("function" === typeof c.type.getDerivedStateFromError || "function" === typeof d.componentDidCatch && (null === Ti || !Ti.has(d))) {
                    a = Mi(b, a);
                    var e = Si(c, a, 1);
                    Ag(c, e);
                    e = Hg();
                    c = Kj(c, 1);
                    if (null !== c) $c(c, 1, e), Mj(c, e);
                    else if ("function" === typeof d.componentDidCatch && (null === Ti || !Ti.has(d))) try {
                        d.componentDidCatch(b, a)
                    } catch (f) {}
                    break
                }
            }
            c = c.return
        }
}

function Yj(a, b, c) {
    var d = a.pingCache;
    null !== d && d.delete(b);
    b = Hg();
    a.pingedLanes |= a.suspendedLanes & c;
    U === a && (W & c) === c && (4 === V || 3 === V && (W & 62914560) === W && 500 > O() - jj ? Qj(a, 0) : uj |= c);
    Mj(a, b)
}

function lj(a, b) {
    var c = a.stateNode;
    null !== c && c.delete(b);
    b = 0;
    0 === b && (b = a.mode, 0 === (b & 2) ? b = 1 : 0 === (b & 4) ? b = 99 === eg() ? 1 : 2 : (0 === Gj && (Gj = tj), b = Yc(62914560 & ~Gj), 0 === b && (b = 4194304)));
    c = Hg();
    a = Kj(a, b);
    null !== a && ($c(a, b, c), Mj(a, c))
}
var ck;
ck = function(a, b, c) {
    var d = b.lanes;
    if (null !== a)
        if (a.memoizedProps !== b.pendingProps || N.current) ug = !0;
        else if (0 !== (c & d)) ug = 0 !== (a.flags & 16384) ? !0 : !1;
    else {
        ug = !1;
        switch (b.tag) {
            case 3:
                ri(b);
                sh();
                break;
            case 5:
                gh(b);
                break;
            case 1:
                Ff(b.type) && Jf(b);
                break;
            case 4:
                eh(b, b.stateNode.containerInfo);
                break;
            case 10:
                d = b.memoizedProps.value;
                var e = b.type._context;
                I(mg, e._currentValue);
                e._currentValue = d;
                break;
            case 13:
                if (null !== b.memoizedState) {
                    if (0 !== (c & b.child.childLanes)) return ti(a, b, c);
                    I(P, P.current & 1);
                    b = hi(a, b, c);
                    return null !==
                        b ? b.sibling : null
                }
                I(P, P.current & 1);
                break;
            case 19:
                d = 0 !== (c & b.childLanes);
                if (0 !== (a.flags & 64)) {
                    if (d) return Ai(a, b, c);
                    b.flags |= 64
                }
                e = b.memoizedState;
                null !== e && (e.rendering = null, e.tail = null, e.lastEffect = null);
                I(P, P.current);
                if (d) break;
                else return null;
            case 23:
            case 24:
                return b.lanes = 0, mi(a, b, c)
        }
        return hi(a, b, c)
    } else ug = !1;
    b.lanes = 0;
    switch (b.tag) {
        case 2:
            d = b.type;
            null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2);
            a = b.pendingProps;
            e = Ef(b, M.current);
            tg(b, c);
            e = Ch(null, b, d, a, e, c);
            b.flags |= 1;
            if ("object" ===
                typeof e && null !== e && "function" === typeof e.render && void 0 === e.$$typeof) {
                b.tag = 1;
                b.memoizedState = null;
                b.updateQueue = null;
                if (Ff(d)) {
                    var f = !0;
                    Jf(b)
                } else f = !1;
                b.memoizedState = null !== e.state && void 0 !== e.state ? e.state : null;
                xg(b);
                var g = d.getDerivedStateFromProps;
                "function" === typeof g && Gg(b, d, g, a);
                e.updater = Kg;
                b.stateNode = e;
                e._reactInternals = b;
                Og(b, d, a, c);
                b = qi(null, b, d, !0, f, c)
            } else b.tag = 0, fi(null, b, e, c), b = b.child;
            return b;
        case 16:
            e = b.elementType;
            a: {
                null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2);
                a = b.pendingProps;
                f = e._init;
                e = f(e._payload);
                b.type = e;
                f = b.tag = hk(e);
                a = lg(e, a);
                switch (f) {
                    case 0:
                        b = li(null, b, e, a, c);
                        break a;
                    case 1:
                        b = pi(null, b, e, a, c);
                        break a;
                    case 11:
                        b = gi(null, b, e, a, c);
                        break a;
                    case 14:
                        b = ii(null, b, e, lg(e.type, a), d, c);
                        break a
                }
                throw Error(y(306, e, ""));
            }
            return b;
        case 0:
            return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), li(a, b, d, e, c);
        case 1:
            return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), pi(a, b, d, e, c);
        case 3:
            ri(b);
            d = b.updateQueue;
            if (null === a || null === d) throw Error(y(282));
            d = b.pendingProps;
            e = b.memoizedState;
            e = null !== e ? e.element : null;
            yg(a, b);
            Cg(b, d, null, c);
            d = b.memoizedState.element;
            if (d === e) sh(), b = hi(a, b, c);
            else {
                e = b.stateNode;
                if (f = e.hydrate) kh = rf(b.stateNode.containerInfo.firstChild), jh = b, f = lh = !0;
                if (f) {
                    a = e.mutableSourceEagerHydrationData;
                    if (null != a)
                        for (e = 0; e < a.length; e += 2) f = a[e], f._workInProgressVersionPrimary = a[e + 1], th.push(f);
                    c = Zg(b, null, d, c);
                    for (b.child = c; c;) c.flags = c.flags & -3 | 1024, c = c.sibling
                } else fi(a, b, d, c), sh();
                b = b.child
            }
            return b;
        case 5:
            return gh(b), null === a &&
                ph(b), d = b.type, e = b.pendingProps, f = null !== a ? a.memoizedProps : null, g = e.children, nf(d, e) ? g = null : null !== f && nf(d, f) && (b.flags |= 16), oi(a, b), fi(a, b, g, c), b.child;
        case 6:
            return null === a && ph(b), null;
        case 13:
            return ti(a, b, c);
        case 4:
            return eh(b, b.stateNode.containerInfo), d = b.pendingProps, null === a ? b.child = Yg(b, null, d, c) : fi(a, b, d, c), b.child;
        case 11:
            return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), gi(a, b, d, e, c);
        case 7:
            return fi(a, b, b.pendingProps, c), b.child;
        case 8:
            return fi(a, b, b.pendingProps.children,
                c), b.child;
        case 12:
            return fi(a, b, b.pendingProps.children, c), b.child;
        case 10:
            a: {
                d = b.type._context;
                e = b.pendingProps;
                g = b.memoizedProps;
                f = e.value;
                var h = b.type._context;
                I(mg, h._currentValue);
                h._currentValue = f;
                if (null !== g)
                    if (h = g.value, f = He(h, f) ? 0 : ("function" === typeof d._calculateChangedBits ? d._calculateChangedBits(h, f) : 1073741823) | 0, 0 === f) {
                        if (g.children === e.children && !N.current) {
                            b = hi(a, b, c);
                            break a
                        }
                    } else
                        for (h = b.child, null !== h && (h.return = b); null !== h;) {
                            var k = h.dependencies;
                            if (null !== k) {
                                g = h.child;
                                for (var l =
                                        k.firstContext; null !== l;) {
                                    if (l.context === d && 0 !== (l.observedBits & f)) {
                                        1 === h.tag && (l = zg(-1, c & -c), l.tag = 2, Ag(h, l));
                                        h.lanes |= c;
                                        l = h.alternate;
                                        null !== l && (l.lanes |= c);
                                        sg(h.return, c);
                                        k.lanes |= c;
                                        break
                                    }
                                    l = l.next
                                }
                            } else g = 10 === h.tag ? h.type === b.type ? null : h.child : h.child;
                            if (null !== g) g.return = h;
                            else
                                for (g = h; null !== g;) {
                                    if (g === b) {
                                        g = null;
                                        break
                                    }
                                    h = g.sibling;
                                    if (null !== h) {
                                        h.return = g.return;
                                        g = h;
                                        break
                                    }
                                    g = g.return
                                }
                            h = g
                        }
                    fi(a, b, e.children, c);
                b = b.child
            }
            return b;
        case 9:
            return e = b.type, f = b.pendingProps, d = f.children, tg(b, c), e = vg(e,
                f.unstable_observedBits), d = d(e), b.flags |= 1, fi(a, b, d, c), b.child;
        case 14:
            return e = b.type, f = lg(e, b.pendingProps), f = lg(e.type, f), ii(a, b, e, f, d, c);
        case 15:
            return ki(a, b, b.type, b.pendingProps, d, c);
        case 17:
            return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : lg(d, e), null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2), b.tag = 1, Ff(d) ? (a = !0, Jf(b)) : a = !1, tg(b, c), Mg(b, d, e), Og(b, d, e, c), qi(null, b, d, !0, a, c);
        case 19:
            return Ai(a, b, c);
        case 23:
            return mi(a, b, c);
        case 24:
            return mi(a, b, c)
    }
    throw Error(y(156, b.tag));
};

function ik(a, b, c, d) {
    this.tag = a;
    this.key = c;
    this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null;
    this.index = 0;
    this.ref = null;
    this.pendingProps = b;
    this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null;
    this.mode = d;
    this.flags = 0;
    this.lastEffect = this.firstEffect = this.nextEffect = null;
    this.childLanes = this.lanes = 0;
    this.alternate = null
}

function nh(a, b, c, d) {
    return new ik(a, b, c, d)
}

function ji(a) {
    a = a.prototype;
    return !(!a || !a.isReactComponent)
}

function hk(a) {
    if ("function" === typeof a) return ji(a) ? 1 : 0;
    if (void 0 !== a && null !== a) {
        a = a.$$typeof;
        if (a === Aa) return 11;
        if (a === Da) return 14
    }
    return 2
}

function Tg(a, b) {
    var c = a.alternate;
    null === c ? (c = nh(a.tag, b, a.key, a.mode), c.elementType = a.elementType, c.type = a.type, c.stateNode = a.stateNode, c.alternate = a, a.alternate = c) : (c.pendingProps = b, c.type = a.type, c.flags = 0, c.nextEffect = null, c.firstEffect = null, c.lastEffect = null);
    c.childLanes = a.childLanes;
    c.lanes = a.lanes;
    c.child = a.child;
    c.memoizedProps = a.memoizedProps;
    c.memoizedState = a.memoizedState;
    c.updateQueue = a.updateQueue;
    b = a.dependencies;
    c.dependencies = null === b ? null : {
        lanes: b.lanes,
        firstContext: b.firstContext
    };
    c.sibling = a.sibling;
    c.index = a.index;
    c.ref = a.ref;
    return c
}

function Vg(a, b, c, d, e, f) {
    var g = 2;
    d = a;
    if ("function" === typeof a) ji(a) && (g = 1);
    else if ("string" === typeof a) g = 5;
    else a: switch (a) {
        case ua:
            return Xg(c.children, e, f, b);
        case Ha:
            g = 8;
            e |= 16;
            break;
        case wa:
            g = 8;
            e |= 1;
            break;
        case xa:
            return a = nh(12, c, b, e | 8), a.elementType = xa, a.type = xa, a.lanes = f, a;
        case Ba:
            return a = nh(13, c, b, e), a.type = Ba, a.elementType = Ba, a.lanes = f, a;
        case Ca:
            return a = nh(19, c, b, e), a.elementType = Ca, a.lanes = f, a;
        case Ia:
            return vi(c, e, f, b);
        case Ja:
            return a = nh(24, c, b, e), a.elementType = Ja, a.lanes = f, a;
        default:
            if ("object" ===
                typeof a && null !== a) switch (a.$$typeof) {
                case ya:
                    g = 10;
                    break a;
                case za:
                    g = 9;
                    break a;
                case Aa:
                    g = 11;
                    break a;
                case Da:
                    g = 14;
                    break a;
                case Ea:
                    g = 16;
                    d = null;
                    break a;
                case Fa:
                    g = 22;
                    break a
            }
            throw Error(y(130, null == a ? a : typeof a, ""));
    }
    b = nh(g, c, b, e);
    b.elementType = a;
    b.type = d;
    b.lanes = f;
    return b
}

function Xg(a, b, c, d) {
    a = nh(7, a, d, b);
    a.lanes = c;
    return a
}

function vi(a, b, c, d) {
    a = nh(23, a, d, b);
    a.elementType = Ia;
    a.lanes = c;
    return a
}

function Ug(a, b, c) {
    a = nh(6, a, null, b);
    a.lanes = c;
    return a
}

function Wg(a, b, c) {
    b = nh(4, null !== a.children ? a.children : [], a.key, b);
    b.lanes = c;
    b.stateNode = {
        containerInfo: a.containerInfo,
        pendingChildren: null,
        implementation: a.implementation
    };
    return b
}

function jk(a, b, c) {
    this.tag = b;
    this.containerInfo = a;
    this.finishedWork = this.pingCache = this.current = this.pendingChildren = null;
    this.timeoutHandle = -1;
    this.pendingContext = this.context = null;
    this.hydrate = c;
    this.callbackNode = null;
    this.callbackPriority = 0;
    this.eventTimes = Zc(0);
    this.expirationTimes = Zc(-1);
    this.entangledLanes = this.finishedLanes = this.mutableReadLanes = this.expiredLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0;
    this.entanglements = Zc(0);
    this.mutableSourceEagerHydrationData = null
}

function kk(a, b, c) {
    var d = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;
    return {
        $$typeof: ta,
        key: null == d ? null : "" + d,
        children: a,
        containerInfo: b,
        implementation: c
    }
}

function lk(a, b, c, d) {
    var e = b.current,
        f = Hg(),
        g = Ig(e);
    a: if (c) {
        c = c._reactInternals;
        b: {
            if (Zb(c) !== c || 1 !== c.tag) throw Error(y(170));
            var h = c;
            do {
                switch (h.tag) {
                    case 3:
                        h = h.stateNode.context;
                        break b;
                    case 1:
                        if (Ff(h.type)) {
                            h = h.stateNode.__reactInternalMemoizedMergedChildContext;
                            break b
                        }
                }
                h = h.return
            } while (null !== h);
            throw Error(y(171));
        }
        if (1 === c.tag) {
            var k = c.type;
            if (Ff(k)) {
                c = If(c, k, h);
                break a
            }
        }
        c = h
    } else c = Cf;
    null === b.context ? b.context = c : b.pendingContext = c;
    b = zg(f, g);
    b.payload = {
        element: a
    };
    d = void 0 === d ? null : d;
    null !==
        d && (b.callback = d);
    Ag(e, b);
    Jg(e, g, f);
    return g
}

function mk(a) {
    a = a.current;
    if (!a.child) return null;
    switch (a.child.tag) {
        case 5:
            return a.child.stateNode;
        default:
            return a.child.stateNode
    }
}

function nk(a, b) {
    a = a.memoizedState;
    if (null !== a && null !== a.dehydrated) {
        var c = a.retryLane;
        a.retryLane = 0 !== c && c < b ? c : b
    }
}

function ok(a, b) {
    nk(a, b);
    (a = a.alternate) && nk(a, b)
}

function pk() {
    return null
}

function qk(a, b, c) {
    var d = null != c && null != c.hydrationOptions && c.hydrationOptions.mutableSources || null;
    c = new jk(a, b, null != c && !0 === c.hydrate);
    b = nh(3, null, null, 2 === b ? 7 : 1 === b ? 3 : 0);
    c.current = b;
    b.stateNode = c;
    xg(b);
    a[ff] = c.current;
    cf(8 === a.nodeType ? a.parentNode : a);
    if (d)
        for (a = 0; a < d.length; a++) {
            b = d[a];
            var e = b._getVersion;
            e = e(b._source);
            null == c.mutableSourceEagerHydrationData ? c.mutableSourceEagerHydrationData = [b, e] : c.mutableSourceEagerHydrationData.push(b, e)
        }
    this._internalRoot = c
}
qk.prototype.render = function(a) {
    lk(a, this._internalRoot, null, null)
};
qk.prototype.unmount = function() {
    var a = this._internalRoot,
        b = a.containerInfo;
    lk(null, a, null, function() {
        b[ff] = null
    })
};

function rk(a) {
    return !(!a || 1 !== a.nodeType && 9 !== a.nodeType && 11 !== a.nodeType && (8 !== a.nodeType || " react-mount-point-unstable " !== a.nodeValue))
}

function sk(a, b) {
    b || (b = a ? 9 === a.nodeType ? a.documentElement : a.firstChild : null, b = !(!b || 1 !== b.nodeType || !b.hasAttribute("data-reactroot")));
    if (!b)
        for (var c; c = a.lastChild;) a.removeChild(c);
    return new qk(a, 0, b ? {
        hydrate: !0
    } : void 0)
}

function tk(a, b, c, d, e) {
    var f = c._reactRootContainer;
    if (f) {
        var g = f._internalRoot;
        if ("function" === typeof e) {
            var h = e;
            e = function() {
                var a = mk(g);
                h.call(a)
            }
        }
        lk(b, g, a, e)
    } else {
        f = c._reactRootContainer = sk(c, d);
        g = f._internalRoot;
        if ("function" === typeof e) {
            var k = e;
            e = function() {
                var a = mk(g);
                k.call(a)
            }
        }
        Xj(function() {
            lk(b, g, a, e)
        })
    }
    return mk(g)
}
ec = function(a) {
    if (13 === a.tag) {
        var b = Hg();
        Jg(a, 4, b);
        ok(a, 4)
    }
};
fc = function(a) {
    if (13 === a.tag) {
        var b = Hg();
        Jg(a, 67108864, b);
        ok(a, 67108864)
    }
};
gc = function(a) {
    if (13 === a.tag) {
        var b = Hg(),
            c = Ig(a);
        Jg(a, c, b);
        ok(a, c)
    }
};
hc = function(a, b) {
    return b()
};
yb = function(a, b, c) {
    switch (b) {
        case "input":
            ab(a, c);
            b = c.name;
            if ("radio" === c.type && null != b) {
                for (c = a; c.parentNode;) c = c.parentNode;
                c = c.querySelectorAll("input[name=" + JSON.stringify("" + b) + '][type="radio"]');
                for (b = 0; b < c.length; b++) {
                    var d = c[b];
                    if (d !== a && d.form === a.form) {
                        var e = Db(d);
                        if (!e) throw Error(y(90));
                        Wa(d);
                        ab(d, e)
                    }
                }
            }
            break;
        case "textarea":
            ib(a, c);
            break;
        case "select":
            b = c.value, null != b && fb(a, !!c.multiple, b, !1)
    }
};
Gb = Wj;
Hb = function(a, b, c, d, e) {
    var f = X;
    X |= 4;
    try {
        return gg(98, a.bind(null, b, c, d, e))
    } finally {
        X = f, 0 === X && (wj(), ig())
    }
};
Ib = function() {
    0 === (X & 49) && (Vj(), Oj())
};
Jb = function(a, b) {
    var c = X;
    X |= 2;
    try {
        return a(b)
    } finally {
        X = c, 0 === X && (wj(), ig())
    }
};

function uk(a, b) {
    var c = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;
    if (!rk(b)) throw Error(y(200));
    return kk(a, b, null, c)
}
var vk = {
        Events: [Cb, ue, Db, Eb, Fb, Oj, {
            current: !1
        }]
    },
    wk = {
        findFiberByHostInstance: wc,
        bundleType: 0,
        version: "17.0.1",
        rendererPackageName: "react-dom"
    };
var xk = {
    bundleType: wk.bundleType,
    version: wk.version,
    rendererPackageName: wk.rendererPackageName,
    rendererConfig: wk.rendererConfig,
    overrideHookState: null,
    overrideHookStateDeletePath: null,
    overrideHookStateRenamePath: null,
    overrideProps: null,
    overridePropsDeletePath: null,
    overridePropsRenamePath: null,
    setSuspenseHandler: null,
    scheduleUpdate: null,
    currentDispatcherRef: ra.ReactCurrentDispatcher,
    findHostInstanceByFiber: function(a) {
        a = cc(a);
        return null === a ? null : a.stateNode
    },
    findFiberByHostInstance: wk.findFiberByHostInstance ||
        pk,
    findHostInstancesForRefresh: null,
    scheduleRefresh: null,
    scheduleRoot: null,
    setRefreshHandler: null,
    getCurrentFiber: null
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
    var yk = __REACT_DEVTOOLS_GLOBAL_HOOK__;
    if (!yk.isDisabled && yk.supportsFiber) try {
        Lf = yk.inject(xk), Mf = yk
    } catch (a) {}
}
exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = vk;
exports.createPortal = uk;
exports.findDOMNode = function(a) {
    if (null == a) return null;
    if (1 === a.nodeType) return a;
    var b = a._reactInternals;
    if (void 0 === b) {
        if ("function" === typeof a.render) throw Error(y(188));
        throw Error(y(268, Object.keys(a)));
    }
    a = cc(b);
    a = null === a ? null : a.stateNode;
    return a
};
exports.flushSync = function(a, b) {
    var c = X;
    if (0 !== (c & 48)) return a(b);
    X |= 1;
    try {
        if (a) return gg(99, a.bind(null, b))
    } finally {
        X = c, ig()
    }
};
exports.hydrate = function(a, b, c) {
    if (!rk(b)) throw Error(y(200));
    return tk(null, a, b, !0, c)
};
exports.render = function(a, b, c) {
    if (!rk(b)) throw Error(y(200));
    return tk(null, a, b, !1, c)
};
exports.unmountComponentAtNode = function(a) {
    if (!rk(a)) throw Error(y(40));
    return a._reactRootContainer ? (Xj(function() {
        tk(null, null, a, !1, function() {
            a._reactRootContainer = null;
            a[ff] = null
        })
    }), !0) : !1
};
exports.unstable_batchedUpdates = Wj;
exports.unstable_createPortal = function(a, b) {
    return uk(a, b, 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null)
};
exports.unstable_renderSubtreeIntoContainer = function(a, b, c, d) {
    if (!rk(c)) throw Error(y(200));
    if (null == a || void 0 === a._reactInternals) throw Error(y(38));
    return tk(a, b, c, !1, d)
};
exports.version = "17.0.1";
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanM/Y2E1ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2EsT0FBTyxtQkFBTyxDQUFDLElBQU8sSUFBSSxtQkFBTyxDQUFDLElBQWUsSUFBSSxtQkFBTyxDQUFDLElBQVcsRUFBRSxjQUFjLHlFQUF5RSxtQkFBbUIsbURBQW1ELG1DQUFtQyw0SEFBNEgsMkJBQTJCLHFCQUFxQixpQkFBaUIsUUFBUTtBQUM1ZCxpQkFBaUIsUUFBUSxRQUFRLFdBQVc7QUFDNUM7QUFDQSxLQUFLLE9BQU8sZUFBZSwwQkFBMEIsMEJBQTBCLDhCQUE4QixTQUFTLFNBQVMscUJBQXFCLGlDQUFpQyxpQkFBaUIsdUNBQXVDLDZCQUE2QixxQ0FBcUMsNkJBQTZCLCtCQUErQjtBQUMzVyxxQkFBcUIsMERBQTBELGNBQWMsMkJBQTJCLGdCQUFnQixvQkFBb0IsdUJBQXVCLDRCQUE0QixTQUFTLDBCQUEwQix5Q0FBeUMscUJBQXFCLDBCQUEwQix1QkFBdUIsb0JBQW9CLFlBQVksbUJBQW1CLHlCQUF5QjtBQUM3YSxzS0FBc0ssZ0NBQWdDLEVBQUUsNEhBQTRILFdBQVcsbUNBQW1DLEVBQUUseUVBQXlFLDhDQUE4QztBQUMzZSw0RkFBNEYsZ0NBQWdDLEVBQUUsNlFBQTZRLDhDQUE4QztBQUN6Yiw4REFBOEQsZ0NBQWdDLEVBQUUsMkNBQTJDLGdDQUFnQyxFQUFFLGtEQUFrRCxnQ0FBZ0MsRUFBRSx3Q0FBd0MsOENBQThDLEVBQUUsdUJBQXVCLGVBQWU7QUFDL1gseWxDQUF5bEM7QUFDemxDLElBQUksZ0NBQWdDLEVBQUUsMEdBQTBHLHVCQUF1QiwwREFBMEQsRUFBRSx3REFBd0QsdUJBQXVCLGtFQUFrRSxFQUFFLCtDQUErQyw4Q0FBOEM7QUFD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ZTtBQUN6VywyQ0FBMkMsbUJBQW1CLDhCQUE4QiwwREFBMEQsdUJBQXVCLGVBQWUiLCJmaWxlIjoiNDQ0OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4xXG4gKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG4ndXNlIHN0cmljdCc7dmFyIGFhPXJlcXVpcmUoXCJyZWFjdFwiKSxtPXJlcXVpcmUoXCJvYmplY3QtYXNzaWduXCIpLHI9cmVxdWlyZShcInNjaGVkdWxlclwiKTtmdW5jdGlvbiB5KGEpe2Zvcih2YXIgYj1cImh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PVwiK2EsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYis9XCImYXJnc1tdPVwiK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbY10pO3JldHVyblwiTWluaWZpZWQgUmVhY3QgZXJyb3IgI1wiK2ErXCI7IHZpc2l0IFwiK2IrXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlwifWlmKCFhYSl0aHJvdyBFcnJvcih5KDIyNykpO3ZhciBiYT1uZXcgU2V0LGNhPXt9O2Z1bmN0aW9uIGRhKGEsYil7ZWEoYSxiKTtlYShhK1wiQ2FwdHVyZVwiLGIpfVxuZnVuY3Rpb24gZWEoYSxiKXtjYVthXT1iO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYmEuYWRkKGJbYV0pfVxudmFyIGZhPSEoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSxoYT0vXls6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF1bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXC0uMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0qJC8saWE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbmphPXt9LGthPXt9O2Z1bmN0aW9uIGxhKGEpe2lmKGlhLmNhbGwoa2EsYSkpcmV0dXJuITA7aWYoaWEuY2FsbChqYSxhKSlyZXR1cm4hMTtpZihoYS50ZXN0KGEpKXJldHVybiBrYVthXT0hMDtqYVthXT0hMDtyZXR1cm4hMX1mdW5jdGlvbiBtYShhLGIsYyxkKXtpZihudWxsIT09YyYmMD09PWMudHlwZSlyZXR1cm4hMTtzd2l0Y2godHlwZW9mIGIpe2Nhc2UgXCJmdW5jdGlvblwiOmNhc2UgXCJzeW1ib2xcIjpyZXR1cm4hMDtjYXNlIFwiYm9vbGVhblwiOmlmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpcmV0dXJuIWMuYWNjZXB0c0Jvb2xlYW5zO2E9YS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSk7cmV0dXJuXCJkYXRhLVwiIT09YSYmXCJhcmlhLVwiIT09YTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIG5hKGEsYixjLGQpe2lmKG51bGw9PT1ifHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIGJ8fG1hKGEsYixjLGQpKXJldHVybiEwO2lmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpc3dpdGNoKGMudHlwZSl7Y2FzZSAzOnJldHVybiFiO2Nhc2UgNDpyZXR1cm4hMT09PWI7Y2FzZSA1OnJldHVybiBpc05hTihiKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGIpfHwxPmJ9cmV0dXJuITF9ZnVuY3Rpb24gQihhLGIsYyxkLGUsZixnKXt0aGlzLmFjY2VwdHNCb29sZWFucz0yPT09Ynx8Mz09PWJ8fDQ9PT1iO3RoaXMuYXR0cmlidXRlTmFtZT1kO3RoaXMuYXR0cmlidXRlTmFtZXNwYWNlPWU7dGhpcy5tdXN0VXNlUHJvcGVydHk9Yzt0aGlzLnByb3BlcnR5TmFtZT1hO3RoaXMudHlwZT1iO3RoaXMuc2FuaXRpemVVUkw9Zjt0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWd9dmFyIEQ9e307XG5cImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwwLCExLGEsbnVsbCwhMSwhMSl9KTtbW1wiYWNjZXB0Q2hhcnNldFwiLFwiYWNjZXB0LWNoYXJzZXRcIl0sW1wiY2xhc3NOYW1lXCIsXCJjbGFzc1wiXSxbXCJodG1sRm9yXCIsXCJmb3JcIl0sW1wiaHR0cEVxdWl2XCIsXCJodHRwLWVxdWl2XCJdXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07RFtiXT1uZXcgQihiLDEsITEsYVsxXSxudWxsLCExLCExKX0pO1tcImNvbnRlbnRFZGl0YWJsZVwiLFwiZHJhZ2dhYmxlXCIsXCJzcGVsbENoZWNrXCIsXCJ2YWx1ZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwyLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiYXV0b1JldmVyc2VcIixcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIixcImZvY3VzYWJsZVwiLFwicHJlc2VydmVBbHBoYVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwyLCExLGEsbnVsbCwhMSwhMSl9KTtcImFsbG93RnVsbFNjcmVlbiBhc3luYyBhdXRvRm9jdXMgYXV0b1BsYXkgY29udHJvbHMgZGVmYXVsdCBkZWZlciBkaXNhYmxlZCBkaXNhYmxlUGljdHVyZUluUGljdHVyZSBkaXNhYmxlUmVtb3RlUGxheWJhY2sgZm9ybU5vVmFsaWRhdGUgaGlkZGVuIGxvb3Agbm9Nb2R1bGUgbm9WYWxpZGF0ZSBvcGVuIHBsYXlzSW5saW5lIHJlYWRPbmx5IHJlcXVpcmVkIHJldmVyc2VkIHNjb3BlZCBzZWFtbGVzcyBpdGVtU2NvcGVcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsMywhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtcbltcImNoZWNrZWRcIixcIm11bHRpcGxlXCIsXCJtdXRlZFwiLFwic2VsZWN0ZWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsMywhMCxhLG51bGwsITEsITEpfSk7W1wiY2FwdHVyZVwiLFwiZG93bmxvYWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXtEW2FdPW5ldyBCKGEsNCwhMSxhLG51bGwsITEsITEpfSk7W1wiY29sc1wiLFwicm93c1wiLFwic2l6ZVwiLFwic3BhblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSw2LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJyb3dTcGFuXCIsXCJzdGFydFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSw1LCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciBvYT0vW1xcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHBhKGEpe3JldHVybiBhWzFdLnRvVXBwZXJDYXNlKCl9XG5cImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKG9hLFxucGEpO0RbYl09bmV3IEIoYiwxLCExLGEsbnVsbCwhMSwhMSl9KTtcInhsaW5rOmFjdHVhdGUgeGxpbms6YXJjcm9sZSB4bGluazpyb2xlIHhsaW5rOnNob3cgeGxpbms6dGl0bGUgeGxpbms6dHlwZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShvYSxwYSk7RFtiXT1uZXcgQihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiwhMSwhMSl9KTtbXCJ4bWw6YmFzZVwiLFwieG1sOmxhbmdcIixcInhtbDpzcGFjZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShvYSxwYSk7RFtiXT1uZXcgQihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLCExLCExKX0pO1tcInRhYkluZGV4XCIsXCJjcm9zc09yaWdpblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuRC54bGlua0hyZWY9bmV3IEIoXCJ4bGlua0hyZWZcIiwxLCExLFwieGxpbms6aHJlZlwiLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCEwLCExKTtbXCJzcmNcIixcImhyZWZcIixcImFjdGlvblwiLFwiZm9ybUFjdGlvblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO1xuZnVuY3Rpb24gcWEoYSxiLGMsZCl7dmFyIGU9RC5oYXNPd25Qcm9wZXJ0eShiKT9EW2JdOm51bGw7dmFyIGY9bnVsbCE9PWU/MD09PWUudHlwZTpkPyExOiEoMjxiLmxlbmd0aCl8fFwib1wiIT09YlswXSYmXCJPXCIhPT1iWzBdfHxcIm5cIiE9PWJbMV0mJlwiTlwiIT09YlsxXT8hMTohMDtmfHwobmEoYixjLGUsZCkmJihjPW51bGwpLGR8fG51bGw9PT1lP2xhKGIpJiYobnVsbD09PWM/YS5yZW1vdmVBdHRyaWJ1dGUoYik6YS5zZXRBdHRyaWJ1dGUoYixcIlwiK2MpKTplLm11c3RVc2VQcm9wZXJ0eT9hW2UucHJvcGVydHlOYW1lXT1udWxsPT09Yz8zPT09ZS50eXBlPyExOlwiXCI6YzooYj1lLmF0dHJpYnV0ZU5hbWUsZD1lLmF0dHJpYnV0ZU5hbWVzcGFjZSxudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTooZT1lLnR5cGUsYz0zPT09ZXx8ND09PWUmJiEwPT09Yz9cIlwiOlwiXCIrYyxkP2Euc2V0QXR0cmlidXRlTlMoZCxiLGMpOmEuc2V0QXR0cmlidXRlKGIsYykpKSl9XG52YXIgcmE9YWEuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsc2E9NjAxMDMsdGE9NjAxMDYsdWE9NjAxMDcsd2E9NjAxMDgseGE9NjAxMTQseWE9NjAxMDksemE9NjAxMTAsQWE9NjAxMTIsQmE9NjAxMTMsQ2E9NjAxMjAsRGE9NjAxMTUsRWE9NjAxMTYsRmE9NjAxMjEsR2E9NjAxMjgsSGE9NjAxMjksSWE9NjAxMzAsSmE9NjAxMzE7XG5pZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yKXt2YXIgRT1TeW1ib2wuZm9yO3NhPUUoXCJyZWFjdC5lbGVtZW50XCIpO3RhPUUoXCJyZWFjdC5wb3J0YWxcIik7dWE9RShcInJlYWN0LmZyYWdtZW50XCIpO3dhPUUoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTt4YT1FKFwicmVhY3QucHJvZmlsZXJcIik7eWE9RShcInJlYWN0LnByb3ZpZGVyXCIpO3phPUUoXCJyZWFjdC5jb250ZXh0XCIpO0FhPUUoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTtCYT1FKFwicmVhY3Quc3VzcGVuc2VcIik7Q2E9RShcInJlYWN0LnN1c3BlbnNlX2xpc3RcIik7RGE9RShcInJlYWN0Lm1lbW9cIik7RWE9RShcInJlYWN0LmxhenlcIik7RmE9RShcInJlYWN0LmJsb2NrXCIpO0UoXCJyZWFjdC5zY29wZVwiKTtHYT1FKFwicmVhY3Qub3BhcXVlLmlkXCIpO0hhPUUoXCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlXCIpO0lhPUUoXCJyZWFjdC5vZmZzY3JlZW5cIik7SmE9RShcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIil9XG52YXIgS2E9XCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIExhKGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT1LYSYmYVtLYV18fGFbXCJAQGl0ZXJhdG9yXCJdO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhP2E6bnVsbH12YXIgTWE7ZnVuY3Rpb24gTmEoYSl7aWYodm9pZCAwPT09TWEpdHJ5e3Rocm93IEVycm9yKCk7fWNhdGNoKGMpe3ZhciBiPWMuc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7TWE9YiYmYlsxXXx8XCJcIn1yZXR1cm5cIlxcblwiK01hK2F9dmFyIE9hPSExO1xuZnVuY3Rpb24gUGEoYSxiKXtpZighYXx8T2EpcmV0dXJuXCJcIjtPYT0hMDt2YXIgYz1FcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT12b2lkIDA7dHJ5e2lmKGIpaWYoYj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCk7fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5wcm90b3R5cGUsXCJwcm9wc1wiLHtzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpO319KSxcIm9iamVjdFwiPT09dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuY29uc3RydWN0KXt0cnl7UmVmbGVjdC5jb25zdHJ1Y3QoYixbXSl9Y2F0Y2goayl7dmFyIGQ9a31SZWZsZWN0LmNvbnN0cnVjdChhLFtdLGIpfWVsc2V7dHJ5e2IuY2FsbCgpfWNhdGNoKGspe2Q9a31hLmNhbGwoYi5wcm90b3R5cGUpfWVsc2V7dHJ5e3Rocm93IEVycm9yKCk7fWNhdGNoKGspe2Q9a31hKCl9fWNhdGNoKGspe2lmKGsmJmQmJlwic3RyaW5nXCI9PT10eXBlb2Ygay5zdGFjayl7Zm9yKHZhciBlPWsuc3RhY2suc3BsaXQoXCJcXG5cIiksXG5mPWQuc3RhY2suc3BsaXQoXCJcXG5cIiksZz1lLmxlbmd0aC0xLGg9Zi5sZW5ndGgtMTsxPD1nJiYwPD1oJiZlW2ddIT09ZltoXTspaC0tO2Zvcig7MTw9ZyYmMDw9aDtnLS0saC0tKWlmKGVbZ10hPT1mW2hdKXtpZigxIT09Z3x8MSE9PWgpe2RvIGlmKGctLSxoLS0sMD5ofHxlW2ddIT09ZltoXSlyZXR1cm5cIlxcblwiK2VbZ10ucmVwbGFjZShcIiBhdCBuZXcgXCIsXCIgYXQgXCIpO3doaWxlKDE8PWcmJjA8PWgpfWJyZWFrfX19ZmluYWxseXtPYT0hMSxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1jfXJldHVybihhPWE/YS5kaXNwbGF5TmFtZXx8YS5uYW1lOlwiXCIpP05hKGEpOlwiXCJ9XG5mdW5jdGlvbiBRYShhKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTpyZXR1cm4gTmEoYS50eXBlKTtjYXNlIDE2OnJldHVybiBOYShcIkxhenlcIik7Y2FzZSAxMzpyZXR1cm4gTmEoXCJTdXNwZW5zZVwiKTtjYXNlIDE5OnJldHVybiBOYShcIlN1c3BlbnNlTGlzdFwiKTtjYXNlIDA6Y2FzZSAyOmNhc2UgMTU6cmV0dXJuIGE9UGEoYS50eXBlLCExKSxhO2Nhc2UgMTE6cmV0dXJuIGE9UGEoYS50eXBlLnJlbmRlciwhMSksYTtjYXNlIDIyOnJldHVybiBhPVBhKGEudHlwZS5fcmVuZGVyLCExKSxhO2Nhc2UgMTpyZXR1cm4gYT1QYShhLnR5cGUsITApLGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1cbmZ1bmN0aW9uIFJhKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGEuZGlzcGxheU5hbWV8fGEubmFtZXx8bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7c3dpdGNoKGEpe2Nhc2UgdWE6cmV0dXJuXCJGcmFnbWVudFwiO2Nhc2UgdGE6cmV0dXJuXCJQb3J0YWxcIjtjYXNlIHhhOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIHdhOnJldHVyblwiU3RyaWN0TW9kZVwiO2Nhc2UgQmE6cmV0dXJuXCJTdXNwZW5zZVwiO2Nhc2UgQ2E6cmV0dXJuXCJTdXNwZW5zZUxpc3RcIn1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgemE6cmV0dXJuKGEuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgeWE6cmV0dXJuKGEuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgQWE6dmFyIGI9YS5yZW5kZXI7Yj1iLmRpc3BsYXlOYW1lfHxiLm5hbWV8fFwiXCI7XG5yZXR1cm4gYS5kaXNwbGF5TmFtZXx8KFwiXCIhPT1iP1wiRm9yd2FyZFJlZihcIitiK1wiKVwiOlwiRm9yd2FyZFJlZlwiKTtjYXNlIERhOnJldHVybiBSYShhLnR5cGUpO2Nhc2UgRmE6cmV0dXJuIFJhKGEuX3JlbmRlcik7Y2FzZSBFYTpiPWEuX3BheWxvYWQ7YT1hLl9pbml0O3RyeXtyZXR1cm4gUmEoYShiKSl9Y2F0Y2goYyl7fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTYShhKXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgXCJib29sZWFuXCI6Y2FzZSBcIm51bWJlclwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwic3RyaW5nXCI6Y2FzZSBcInVuZGVmaW5lZFwiOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuXCJcIn19ZnVuY3Rpb24gVGEoYSl7dmFyIGI9YS50eXBlO3JldHVybihhPWEubm9kZU5hbWUpJiZcImlucHV0XCI9PT1hLnRvTG93ZXJDYXNlKCkmJihcImNoZWNrYm94XCI9PT1ifHxcInJhZGlvXCI9PT1iKX1cbmZ1bmN0aW9uIFVhKGEpe3ZhciBiPVRhKGEpP1wiY2hlY2tlZFwiOlwidmFsdWVcIixjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsYiksZD1cIlwiK2FbYl07aWYoIWEuaGFzT3duUHJvcGVydHkoYikmJlwidW5kZWZpbmVkXCIhPT10eXBlb2YgYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGMuZ2V0JiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5zZXQpe3ZhciBlPWMuZ2V0LGY9Yy5zZXQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihhKXtkPVwiXCIrYTtmLmNhbGwodGhpcyxhKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtlbnVtZXJhYmxlOmMuZW51bWVyYWJsZX0pO3JldHVybntnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiBkfSxzZXRWYWx1ZTpmdW5jdGlvbihhKXtkPVwiXCIrYX0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7YS5fdmFsdWVUcmFja2VyPVxubnVsbDtkZWxldGUgYVtiXX19fX1mdW5jdGlvbiBWYShhKXthLl92YWx1ZVRyYWNrZXJ8fChhLl92YWx1ZVRyYWNrZXI9VWEoYSkpfWZ1bmN0aW9uIFdhKGEpe2lmKCFhKXJldHVybiExO3ZhciBiPWEuX3ZhbHVlVHJhY2tlcjtpZighYilyZXR1cm4hMDt2YXIgYz1iLmdldFZhbHVlKCk7dmFyIGQ9XCJcIjthJiYoZD1UYShhKT9hLmNoZWNrZWQ/XCJ0cnVlXCI6XCJmYWxzZVwiOmEudmFsdWUpO2E9ZDtyZXR1cm4gYSE9PWM/KGIuc2V0VmFsdWUoYSksITApOiExfWZ1bmN0aW9uIFhhKGEpe2E9YXx8KFwidW5kZWZpbmVkXCIhPT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQ6dm9pZCAwKTtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR8fGEuYm9keX1jYXRjaChiKXtyZXR1cm4gYS5ib2R5fX1cbmZ1bmN0aW9uIFlhKGEsYil7dmFyIGM9Yi5jaGVja2VkO3JldHVybiBtKHt9LGIse2RlZmF1bHRDaGVja2VkOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLHZhbHVlOnZvaWQgMCxjaGVja2VkOm51bGwhPWM/YzphLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWR9KX1mdW5jdGlvbiBaYShhLGIpe3ZhciBjPW51bGw9PWIuZGVmYXVsdFZhbHVlP1wiXCI6Yi5kZWZhdWx0VmFsdWUsZD1udWxsIT1iLmNoZWNrZWQ/Yi5jaGVja2VkOmIuZGVmYXVsdENoZWNrZWQ7Yz1TYShudWxsIT1iLnZhbHVlP2IudmFsdWU6Yyk7YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsQ2hlY2tlZDpkLGluaXRpYWxWYWx1ZTpjLGNvbnRyb2xsZWQ6XCJjaGVja2JveFwiPT09Yi50eXBlfHxcInJhZGlvXCI9PT1iLnR5cGU/bnVsbCE9Yi5jaGVja2VkOm51bGwhPWIudmFsdWV9fWZ1bmN0aW9uICRhKGEsYil7Yj1iLmNoZWNrZWQ7bnVsbCE9YiYmcWEoYSxcImNoZWNrZWRcIixiLCExKX1cbmZ1bmN0aW9uIGFiKGEsYil7JGEoYSxiKTt2YXIgYz1TYShiLnZhbHVlKSxkPWIudHlwZTtpZihudWxsIT1jKWlmKFwibnVtYmVyXCI9PT1kKXtpZigwPT09YyYmXCJcIj09PWEudmFsdWV8fGEudmFsdWUhPWMpYS52YWx1ZT1cIlwiK2N9ZWxzZSBhLnZhbHVlIT09XCJcIitjJiYoYS52YWx1ZT1cIlwiK2MpO2Vsc2UgaWYoXCJzdWJtaXRcIj09PWR8fFwicmVzZXRcIj09PWQpe2EucmVtb3ZlQXR0cmlidXRlKFwidmFsdWVcIik7cmV0dXJufWIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKT9iYihhLGIudHlwZSxjKTpiLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpJiZiYihhLGIudHlwZSxTYShiLmRlZmF1bHRWYWx1ZSkpO251bGw9PWIuY2hlY2tlZCYmbnVsbCE9Yi5kZWZhdWx0Q2hlY2tlZCYmKGEuZGVmYXVsdENoZWNrZWQ9ISFiLmRlZmF1bHRDaGVja2VkKX1cbmZ1bmN0aW9uIGNiKGEsYixjKXtpZihiLmhhc093blByb3BlcnR5KFwidmFsdWVcIil8fGIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpe3ZhciBkPWIudHlwZTtpZighKFwic3VibWl0XCIhPT1kJiZcInJlc2V0XCIhPT1kfHx2b2lkIDAhPT1iLnZhbHVlJiZudWxsIT09Yi52YWx1ZSkpcmV0dXJuO2I9XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlO2N8fGI9PT1hLnZhbHVlfHwoYS52YWx1ZT1iKTthLmRlZmF1bHRWYWx1ZT1ifWM9YS5uYW1lO1wiXCIhPT1jJiYoYS5uYW1lPVwiXCIpO2EuZGVmYXVsdENoZWNrZWQ9ISFhLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XCJcIiE9PWMmJihhLm5hbWU9Yyl9XG5mdW5jdGlvbiBiYihhLGIsYyl7aWYoXCJudW1iZXJcIiE9PWJ8fFhhKGEub3duZXJEb2N1bWVudCkhPT1hKW51bGw9PWM/YS5kZWZhdWx0VmFsdWU9XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlOmEuZGVmYXVsdFZhbHVlIT09XCJcIitjJiYoYS5kZWZhdWx0VmFsdWU9XCJcIitjKX1mdW5jdGlvbiBkYihhKXt2YXIgYj1cIlwiO2FhLkNoaWxkcmVuLmZvckVhY2goYSxmdW5jdGlvbihhKXtudWxsIT1hJiYoYis9YSl9KTtyZXR1cm4gYn1mdW5jdGlvbiBlYihhLGIpe2E9bSh7Y2hpbGRyZW46dm9pZCAwfSxiKTtpZihiPWRiKGIuY2hpbGRyZW4pKWEuY2hpbGRyZW49YjtyZXR1cm4gYX1cbmZ1bmN0aW9uIGZiKGEsYixjLGQpe2E9YS5vcHRpb25zO2lmKGIpe2I9e307Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYltcIiRcIitjW2VdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWU9Yi5oYXNPd25Qcm9wZXJ0eShcIiRcIithW2NdLnZhbHVlKSxhW2NdLnNlbGVjdGVkIT09ZSYmKGFbY10uc2VsZWN0ZWQ9ZSksZSYmZCYmKGFbY10uZGVmYXVsdFNlbGVjdGVkPSEwKX1lbHNle2M9XCJcIitTYShjKTtiPW51bGw7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKyl7aWYoYVtlXS52YWx1ZT09PWMpe2FbZV0uc2VsZWN0ZWQ9ITA7ZCYmKGFbZV0uZGVmYXVsdFNlbGVjdGVkPSEwKTtyZXR1cm59bnVsbCE9PWJ8fGFbZV0uZGlzYWJsZWR8fChiPWFbZV0pfW51bGwhPT1iJiYoYi5zZWxlY3RlZD0hMCl9fVxuZnVuY3Rpb24gZ2IoYSxiKXtpZihudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKXRocm93IEVycm9yKHkoOTEpKTtyZXR1cm4gbSh7fSxiLHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjpcIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9KX1mdW5jdGlvbiBoYihhLGIpe3ZhciBjPWIudmFsdWU7aWYobnVsbD09Yyl7Yz1iLmNoaWxkcmVuO2I9Yi5kZWZhdWx0VmFsdWU7aWYobnVsbCE9Yyl7aWYobnVsbCE9Yil0aHJvdyBFcnJvcih5KDkyKSk7aWYoQXJyYXkuaXNBcnJheShjKSl7aWYoISgxPj1jLmxlbmd0aCkpdGhyb3cgRXJyb3IoeSg5MykpO2M9Y1swXX1iPWN9bnVsbD09YiYmKGI9XCJcIik7Yz1ifWEuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOlNhKGMpfX1cbmZ1bmN0aW9uIGliKGEsYil7dmFyIGM9U2EoYi52YWx1ZSksZD1TYShiLmRlZmF1bHRWYWx1ZSk7bnVsbCE9YyYmKGM9XCJcIitjLGMhPT1hLnZhbHVlJiYoYS52YWx1ZT1jKSxudWxsPT1iLmRlZmF1bHRWYWx1ZSYmYS5kZWZhdWx0VmFsdWUhPT1jJiYoYS5kZWZhdWx0VmFsdWU9YykpO251bGwhPWQmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2QpfWZ1bmN0aW9uIGpiKGEpe3ZhciBiPWEudGV4dENvbnRlbnQ7Yj09PWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJlwiXCIhPT1iJiZudWxsIT09YiYmKGEudmFsdWU9Yil9dmFyIGtiPXtodG1sOlwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiLG1hdGhtbDpcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIixzdmc6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wifTtcbmZ1bmN0aW9uIGxiKGEpe3N3aXRjaChhKXtjYXNlIFwic3ZnXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO2Nhc2UgXCJtYXRoXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI7ZGVmYXVsdDpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIn19ZnVuY3Rpb24gbWIoYSxiKXtyZXR1cm4gbnVsbD09YXx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hP2xiKGIpOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj09PWEmJlwiZm9yZWlnbk9iamVjdFwiPT09Yj9cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjphfVxudmFyIG5iLG9iPWZ1bmN0aW9uKGEpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKGIsYyxkLGUpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGEoYixjLGQsZSl9KX06YX0oZnVuY3Rpb24oYSxiKXtpZihhLm5hbWVzcGFjZVVSSSE9PWtiLnN2Z3x8XCJpbm5lckhUTUxcImluIGEpYS5pbm5lckhUTUw9YjtlbHNle25iPW5ifHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO25iLmlubmVySFRNTD1cIjxzdmc+XCIrYi52YWx1ZU9mKCkudG9TdHJpbmcoKStcIjwvc3ZnPlwiO2ZvcihiPW5iLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQoYi5maXJzdENoaWxkKX19KTtcbmZ1bmN0aW9uIHBiKGEsYil7aWYoYil7dmFyIGM9YS5maXJzdENoaWxkO2lmKGMmJmM9PT1hLmxhc3RDaGlsZCYmMz09PWMubm9kZVR5cGUpe2Mubm9kZVZhbHVlPWI7cmV0dXJufX1hLnRleHRDb250ZW50PWJ9XG52YXIgcWI9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLFxuZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0scmI9W1wiV2Via2l0XCIsXCJtc1wiLFwiTW96XCIsXCJPXCJdO09iamVjdC5rZXlzKHFiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JiLmZvckVhY2goZnVuY3Rpb24oYil7Yj1iK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSk7cWJbYl09cWJbYV19KX0pO2Z1bmN0aW9uIHNiKGEsYixjKXtyZXR1cm4gbnVsbD09Ynx8XCJib29sZWFuXCI9PT10eXBlb2YgYnx8XCJcIj09PWI/XCJcIjpjfHxcIm51bWJlclwiIT09dHlwZW9mIGJ8fDA9PT1ifHxxYi5oYXNPd25Qcm9wZXJ0eShhKSYmcWJbYV0/KFwiXCIrYikudHJpbSgpOmIrXCJweFwifVxuZnVuY3Rpb24gdGIoYSxiKXthPWEuc3R5bGU7Zm9yKHZhciBjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9MD09PWMuaW5kZXhPZihcIi0tXCIpLGU9c2IoYyxiW2NdLGQpO1wiZmxvYXRcIj09PWMmJihjPVwiY3NzRmxvYXRcIik7ZD9hLnNldFByb3BlcnR5KGMsZSk6YVtjXT1lfX12YXIgdWI9bSh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtcbmZ1bmN0aW9uIHZiKGEsYil7aWYoYil7aWYodWJbYV0mJihudWxsIT1iLmNoaWxkcmVufHxudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcih5KDEzNyxhKSk7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl7aWYobnVsbCE9Yi5jaGlsZHJlbil0aHJvdyBFcnJvcih5KDYwKSk7aWYoIShcIm9iamVjdFwiPT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJlwiX19odG1sXCJpbiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcih5KDYxKSk7fWlmKG51bGwhPWIuc3R5bGUmJlwib2JqZWN0XCIhPT10eXBlb2YgYi5zdHlsZSl0aHJvdyBFcnJvcih5KDYyKSk7fX1cbmZ1bmN0aW9uIHdiKGEsYil7aWYoLTE9PT1hLmluZGV4T2YoXCItXCIpKXJldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYi5pcztzd2l0Y2goYSl7Y2FzZSBcImFubm90YXRpb24teG1sXCI6Y2FzZSBcImNvbG9yLXByb2ZpbGVcIjpjYXNlIFwiZm9udC1mYWNlXCI6Y2FzZSBcImZvbnQtZmFjZS1zcmNcIjpjYXNlIFwiZm9udC1mYWNlLXVyaVwiOmNhc2UgXCJmb250LWZhY2UtZm9ybWF0XCI6Y2FzZSBcImZvbnQtZmFjZS1uYW1lXCI6Y2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX1mdW5jdGlvbiB4YihhKXthPWEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fHdpbmRvdzthLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoYT1hLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtyZXR1cm4gMz09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmF9dmFyIHliPW51bGwsemI9bnVsbCxBYj1udWxsO1xuZnVuY3Rpb24gQmIoYSl7aWYoYT1DYihhKSl7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIHliKXRocm93IEVycm9yKHkoMjgwKSk7dmFyIGI9YS5zdGF0ZU5vZGU7YiYmKGI9RGIoYikseWIoYS5zdGF0ZU5vZGUsYS50eXBlLGIpKX19ZnVuY3Rpb24gRWIoYSl7emI/QWI/QWIucHVzaChhKTpBYj1bYV06emI9YX1mdW5jdGlvbiBGYigpe2lmKHpiKXt2YXIgYT16YixiPUFiO0FiPXpiPW51bGw7QmIoYSk7aWYoYilmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKUJiKGJbYV0pfX1mdW5jdGlvbiBHYihhLGIpe3JldHVybiBhKGIpfWZ1bmN0aW9uIEhiKGEsYixjLGQsZSl7cmV0dXJuIGEoYixjLGQsZSl9ZnVuY3Rpb24gSWIoKXt9dmFyIEpiPUdiLEtiPSExLExiPSExO2Z1bmN0aW9uIE1iKCl7aWYobnVsbCE9PXpifHxudWxsIT09QWIpSWIoKSxGYigpfVxuZnVuY3Rpb24gTmIoYSxiLGMpe2lmKExiKXJldHVybiBhKGIsYyk7TGI9ITA7dHJ5e3JldHVybiBKYihhLGIsYyl9ZmluYWxseXtMYj0hMSxNYigpfX1cbmZ1bmN0aW9uIE9iKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7aWYobnVsbD09PWMpcmV0dXJuIG51bGw7dmFyIGQ9RGIoYyk7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7Yz1kW2JdO2E6c3dpdGNoKGIpe2Nhc2UgXCJvbkNsaWNrXCI6Y2FzZSBcIm9uQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tcIjpjYXNlIFwib25Eb3VibGVDbGlja0NhcHR1cmVcIjpjYXNlIFwib25Nb3VzZURvd25cIjpjYXNlIFwib25Nb3VzZURvd25DYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlVXBcIjpjYXNlIFwib25Nb3VzZVVwQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlRW50ZXJcIjooZD0hZC5kaXNhYmxlZCl8fChhPWEudHlwZSxkPSEoXCJidXR0b25cIj09PWF8fFwiaW5wdXRcIj09PWF8fFwic2VsZWN0XCI9PT1hfHxcInRleHRhcmVhXCI9PT1hKSk7YT0hZDticmVhayBhO2RlZmF1bHQ6YT0hMX1pZihhKXJldHVybiBudWxsO2lmKGMmJlwiZnVuY3Rpb25cIiE9PVxudHlwZW9mIGMpdGhyb3cgRXJyb3IoeSgyMzEsYix0eXBlb2YgYykpO3JldHVybiBjfXZhciBQYj0hMTtpZihmYSl0cnl7dmFyIFFiPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShRYixcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7UGI9ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsUWIsUWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFwiLFFiLFFiKX1jYXRjaChhKXtQYj0hMX1mdW5jdGlvbiBSYihhLGIsYyxkLGUsZixnLGgsayl7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXtiLmFwcGx5KGMsbCl9Y2F0Y2gobil7dGhpcy5vbkVycm9yKG4pfX12YXIgU2I9ITEsVGI9bnVsbCxVYj0hMSxWYj1udWxsLFdiPXtvbkVycm9yOmZ1bmN0aW9uKGEpe1NiPSEwO1RiPWF9fTtmdW5jdGlvbiBYYihhLGIsYyxkLGUsZixnLGgsayl7U2I9ITE7VGI9bnVsbDtSYi5hcHBseShXYixhcmd1bWVudHMpfVxuZnVuY3Rpb24gWWIoYSxiLGMsZCxlLGYsZyxoLGspe1hiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihTYil7aWYoU2Ipe3ZhciBsPVRiO1NiPSExO1RiPW51bGx9ZWxzZSB0aHJvdyBFcnJvcih5KDE5OCkpO1VifHwoVWI9ITAsVmI9bCl9fWZ1bmN0aW9uIFpiKGEpe3ZhciBiPWEsYz1hO2lmKGEuYWx0ZXJuYXRlKWZvcig7Yi5yZXR1cm47KWI9Yi5yZXR1cm47ZWxzZXthPWI7ZG8gYj1hLDAhPT0oYi5mbGFncyYxMDI2KSYmKGM9Yi5yZXR1cm4pLGE9Yi5yZXR1cm47d2hpbGUoYSl9cmV0dXJuIDM9PT1iLnRhZz9jOm51bGx9ZnVuY3Rpb24gJGIoYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9YS5tZW1vaXplZFN0YXRlO251bGw9PT1iJiYoYT1hLmFsdGVybmF0ZSxudWxsIT09YSYmKGI9YS5tZW1vaXplZFN0YXRlKSk7aWYobnVsbCE9PWIpcmV0dXJuIGIuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBhYyhhKXtpZihaYihhKSE9PWEpdGhyb3cgRXJyb3IoeSgxODgpKTt9XG5mdW5jdGlvbiBiYyhhKXt2YXIgYj1hLmFsdGVybmF0ZTtpZighYil7Yj1aYihhKTtpZihudWxsPT09Yil0aHJvdyBFcnJvcih5KDE4OCkpO3JldHVybiBiIT09YT9udWxsOmF9Zm9yKHZhciBjPWEsZD1iOzspe3ZhciBlPWMucmV0dXJuO2lmKG51bGw9PT1lKWJyZWFrO3ZhciBmPWUuYWx0ZXJuYXRlO2lmKG51bGw9PT1mKXtkPWUucmV0dXJuO2lmKG51bGwhPT1kKXtjPWQ7Y29udGludWV9YnJlYWt9aWYoZS5jaGlsZD09PWYuY2hpbGQpe2ZvcihmPWUuY2hpbGQ7Zjspe2lmKGY9PT1jKXJldHVybiBhYyhlKSxhO2lmKGY9PT1kKXJldHVybiBhYyhlKSxiO2Y9Zi5zaWJsaW5nfXRocm93IEVycm9yKHkoMTg4KSk7fWlmKGMucmV0dXJuIT09ZC5yZXR1cm4pYz1lLGQ9ZjtlbHNle2Zvcih2YXIgZz0hMSxoPWUuY2hpbGQ7aDspe2lmKGg9PT1jKXtnPSEwO2M9ZTtkPWY7YnJlYWt9aWYoaD09PWQpe2c9ITA7ZD1lO2M9ZjticmVha31oPWguc2libGluZ31pZighZyl7Zm9yKGg9Zi5jaGlsZDtoOyl7aWYoaD09PVxuYyl7Zz0hMDtjPWY7ZD1lO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZjtjPWU7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpdGhyb3cgRXJyb3IoeSgxODkpKTt9fWlmKGMuYWx0ZXJuYXRlIT09ZCl0aHJvdyBFcnJvcih5KDE5MCkpO31pZigzIT09Yy50YWcpdGhyb3cgRXJyb3IoeSgxODgpKTtyZXR1cm4gYy5zdGF0ZU5vZGUuY3VycmVudD09PWM/YTpifWZ1bmN0aW9uIGNjKGEpe2E9YmMoYSk7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKHZhciBiPWE7Oyl7aWYoNT09PWIudGFnfHw2PT09Yi50YWcpcmV0dXJuIGI7aWYoYi5jaGlsZCliLmNoaWxkLnJldHVybj1iLGI9Yi5jaGlsZDtlbHNle2lmKGI9PT1hKWJyZWFrO2Zvcig7IWIuc2libGluZzspe2lmKCFiLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ319cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBkYyhhLGIpe2Zvcih2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09Yjspe2lmKGI9PT1hfHxiPT09YylyZXR1cm4hMDtiPWIucmV0dXJufXJldHVybiExfXZhciBlYyxmYyxnYyxoYyxpYz0hMSxqYz1bXSxrYz1udWxsLGxjPW51bGwsbWM9bnVsbCxuYz1uZXcgTWFwLG9jPW5ldyBNYXAscGM9W10scWM9XCJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0XCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gcmMoYSxiLGMsZCxlKXtyZXR1cm57YmxvY2tlZE9uOmEsZG9tRXZlbnROYW1lOmIsZXZlbnRTeXN0ZW1GbGFnczpjfDE2LG5hdGl2ZUV2ZW50OmUsdGFyZ2V0Q29udGFpbmVyczpbZF19fWZ1bmN0aW9uIHNjKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJmb2N1c2luXCI6Y2FzZSBcImZvY3Vzb3V0XCI6a2M9bnVsbDticmVhaztjYXNlIFwiZHJhZ2VudGVyXCI6Y2FzZSBcImRyYWdsZWF2ZVwiOmxjPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJtb3VzZW91dFwiOm1jPW51bGw7YnJlYWs7Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpuYy5kZWxldGUoYi5wb2ludGVySWQpO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpvYy5kZWxldGUoYi5wb2ludGVySWQpfX1cbmZ1bmN0aW9uIHRjKGEsYixjLGQsZSxmKXtpZihudWxsPT09YXx8YS5uYXRpdmVFdmVudCE9PWYpcmV0dXJuIGE9cmMoYixjLGQsZSxmKSxudWxsIT09YiYmKGI9Q2IoYiksbnVsbCE9PWImJmZjKGIpKSxhO2EuZXZlbnRTeXN0ZW1GbGFnc3w9ZDtiPWEudGFyZ2V0Q29udGFpbmVycztudWxsIT09ZSYmLTE9PT1iLmluZGV4T2YoZSkmJmIucHVzaChlKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHVjKGEsYixjLGQsZSl7c3dpdGNoKGIpe2Nhc2UgXCJmb2N1c2luXCI6cmV0dXJuIGtjPXRjKGtjLGEsYixjLGQsZSksITA7Y2FzZSBcImRyYWdlbnRlclwiOnJldHVybiBsYz10YyhsYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJtb3VzZW92ZXJcIjpyZXR1cm4gbWM9dGMobWMsYSxiLGMsZCxlKSwhMDtjYXNlIFwicG9pbnRlcm92ZXJcIjp2YXIgZj1lLnBvaW50ZXJJZDtuYy5zZXQoZix0YyhuYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSk7cmV0dXJuITA7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6cmV0dXJuIGY9ZS5wb2ludGVySWQsb2Muc2V0KGYsdGMob2MuZ2V0KGYpfHxudWxsLGEsYixjLGQsZSkpLCEwfXJldHVybiExfVxuZnVuY3Rpb24gdmMoYSl7dmFyIGI9d2MoYS50YXJnZXQpO2lmKG51bGwhPT1iKXt2YXIgYz1aYihiKTtpZihudWxsIT09YylpZihiPWMudGFnLDEzPT09Yil7aWYoYj0kYihjKSxudWxsIT09Yil7YS5ibG9ja2VkT249YjtoYyhhLmxhbmVQcmlvcml0eSxmdW5jdGlvbigpe3IudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KGEucHJpb3JpdHksZnVuY3Rpb24oKXtnYyhjKX0pfSk7cmV0dXJufX1lbHNlIGlmKDM9PT1iJiZjLnN0YXRlTm9kZS5oeWRyYXRlKXthLmJsb2NrZWRPbj0zPT09Yy50YWc/Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19YS5ibG9ja2VkT249bnVsbH1cbmZ1bmN0aW9uIHhjKGEpe2lmKG51bGwhPT1hLmJsb2NrZWRPbilyZXR1cm4hMTtmb3IodmFyIGI9YS50YXJnZXRDb250YWluZXJzOzA8Yi5sZW5ndGg7KXt2YXIgYz15YyhhLmRvbUV2ZW50TmFtZSxhLmV2ZW50U3lzdGVtRmxhZ3MsYlswXSxhLm5hdGl2ZUV2ZW50KTtpZihudWxsIT09YylyZXR1cm4gYj1DYihjKSxudWxsIT09YiYmZmMoYiksYS5ibG9ja2VkT249YywhMTtiLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gemMoYSxiLGMpe3hjKGEpJiZjLmRlbGV0ZShiKX1cbmZ1bmN0aW9uIEFjKCl7Zm9yKGljPSExOzA8amMubGVuZ3RoOyl7dmFyIGE9amNbMF07aWYobnVsbCE9PWEuYmxvY2tlZE9uKXthPUNiKGEuYmxvY2tlZE9uKTtudWxsIT09YSYmZWMoYSk7YnJlYWt9Zm9yKHZhciBiPWEudGFyZ2V0Q29udGFpbmVyczswPGIubGVuZ3RoOyl7dmFyIGM9eWMoYS5kb21FdmVudE5hbWUsYS5ldmVudFN5c3RlbUZsYWdzLGJbMF0sYS5uYXRpdmVFdmVudCk7aWYobnVsbCE9PWMpe2EuYmxvY2tlZE9uPWM7YnJlYWt9Yi5zaGlmdCgpfW51bGw9PT1hLmJsb2NrZWRPbiYmamMuc2hpZnQoKX1udWxsIT09a2MmJnhjKGtjKSYmKGtjPW51bGwpO251bGwhPT1sYyYmeGMobGMpJiYobGM9bnVsbCk7bnVsbCE9PW1jJiZ4YyhtYykmJihtYz1udWxsKTtuYy5mb3JFYWNoKHpjKTtvYy5mb3JFYWNoKHpjKX1cbmZ1bmN0aW9uIEJjKGEsYil7YS5ibG9ja2VkT249PT1iJiYoYS5ibG9ja2VkT249bnVsbCxpY3x8KGljPSEwLHIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LEFjKSkpfVxuZnVuY3Rpb24gQ2MoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gQmMoYixhKX1pZigwPGpjLmxlbmd0aCl7QmMoamNbMF0sYSk7Zm9yKHZhciBjPTE7YzxqYy5sZW5ndGg7YysrKXt2YXIgZD1qY1tjXTtkLmJsb2NrZWRPbj09PWEmJihkLmJsb2NrZWRPbj1udWxsKX19bnVsbCE9PWtjJiZCYyhrYyxhKTtudWxsIT09bGMmJkJjKGxjLGEpO251bGwhPT1tYyYmQmMobWMsYSk7bmMuZm9yRWFjaChiKTtvYy5mb3JFYWNoKGIpO2ZvcihjPTA7YzxwYy5sZW5ndGg7YysrKWQ9cGNbY10sZC5ibG9ja2VkT249PT1hJiYoZC5ibG9ja2VkT249bnVsbCk7Zm9yKDswPHBjLmxlbmd0aCYmKGM9cGNbMF0sbnVsbD09PWMuYmxvY2tlZE9uKTspdmMoYyksbnVsbD09PWMuYmxvY2tlZE9uJiZwYy5zaGlmdCgpfVxuZnVuY3Rpb24gRGMoYSxiKXt2YXIgYz17fTtjW2EudG9Mb3dlckNhc2UoKV09Yi50b0xvd2VyQ2FzZSgpO2NbXCJXZWJraXRcIithXT1cIndlYmtpdFwiK2I7Y1tcIk1velwiK2FdPVwibW96XCIrYjtyZXR1cm4gY312YXIgRWM9e2FuaW1hdGlvbmVuZDpEYyhcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uRW5kXCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpEYyhcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uSXRlcmF0aW9uXCIpLGFuaW1hdGlvbnN0YXJ0OkRjKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25TdGFydFwiKSx0cmFuc2l0aW9uZW5kOkRjKFwiVHJhbnNpdGlvblwiLFwiVHJhbnNpdGlvbkVuZFwiKX0sRmM9e30sR2M9e307XG5mYSYmKEdjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGUsXCJBbmltYXRpb25FdmVudFwiaW4gd2luZG93fHwoZGVsZXRlIEVjLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIEVjLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIEVjLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksXCJUcmFuc2l0aW9uRXZlbnRcImluIHdpbmRvd3x8ZGVsZXRlIEVjLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gSGMoYSl7aWYoRmNbYV0pcmV0dXJuIEZjW2FdO2lmKCFFY1thXSlyZXR1cm4gYTt2YXIgYj1FY1thXSxjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSYmYyBpbiBHYylyZXR1cm4gRmNbYV09YltjXTtyZXR1cm4gYX1cbnZhciBJYz1IYyhcImFuaW1hdGlvbmVuZFwiKSxKYz1IYyhcImFuaW1hdGlvbml0ZXJhdGlvblwiKSxLYz1IYyhcImFuaW1hdGlvbnN0YXJ0XCIpLExjPUhjKFwidHJhbnNpdGlvbmVuZFwiKSxNYz1uZXcgTWFwLE5jPW5ldyBNYXAsT2M9W1wiYWJvcnRcIixcImFib3J0XCIsSWMsXCJhbmltYXRpb25FbmRcIixKYyxcImFuaW1hdGlvbkl0ZXJhdGlvblwiLEtjLFwiYW5pbWF0aW9uU3RhcnRcIixcImNhbnBsYXlcIixcImNhblBsYXlcIixcImNhbnBsYXl0aHJvdWdoXCIsXCJjYW5QbGF5VGhyb3VnaFwiLFwiZHVyYXRpb25jaGFuZ2VcIixcImR1cmF0aW9uQ2hhbmdlXCIsXCJlbXB0aWVkXCIsXCJlbXB0aWVkXCIsXCJlbmNyeXB0ZWRcIixcImVuY3J5cHRlZFwiLFwiZW5kZWRcIixcImVuZGVkXCIsXCJlcnJvclwiLFwiZXJyb3JcIixcImdvdHBvaW50ZXJjYXB0dXJlXCIsXCJnb3RQb2ludGVyQ2FwdHVyZVwiLFwibG9hZFwiLFwibG9hZFwiLFwibG9hZGVkZGF0YVwiLFwibG9hZGVkRGF0YVwiLFwibG9hZGVkbWV0YWRhdGFcIixcImxvYWRlZE1ldGFkYXRhXCIsXCJsb2Fkc3RhcnRcIixcImxvYWRTdGFydFwiLFxuXCJsb3N0cG9pbnRlcmNhcHR1cmVcIixcImxvc3RQb2ludGVyQ2FwdHVyZVwiLFwicGxheWluZ1wiLFwicGxheWluZ1wiLFwicHJvZ3Jlc3NcIixcInByb2dyZXNzXCIsXCJzZWVraW5nXCIsXCJzZWVraW5nXCIsXCJzdGFsbGVkXCIsXCJzdGFsbGVkXCIsXCJzdXNwZW5kXCIsXCJzdXNwZW5kXCIsXCJ0aW1ldXBkYXRlXCIsXCJ0aW1lVXBkYXRlXCIsTGMsXCJ0cmFuc2l0aW9uRW5kXCIsXCJ3YWl0aW5nXCIsXCJ3YWl0aW5nXCJdO2Z1bmN0aW9uIFBjKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKz0yKXt2YXIgZD1hW2NdLGU9YVtjKzFdO2U9XCJvblwiKyhlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSk7TmMuc2V0KGQsYik7TWMuc2V0KGQsZSk7ZGEoZSxbZF0pfX12YXIgUWM9ci51bnN0YWJsZV9ub3c7UWMoKTt2YXIgRj04O1xuZnVuY3Rpb24gUmMoYSl7aWYoMCE9PSgxJmEpKXJldHVybiBGPTE1LDE7aWYoMCE9PSgyJmEpKXJldHVybiBGPTE0LDI7aWYoMCE9PSg0JmEpKXJldHVybiBGPTEzLDQ7dmFyIGI9MjQmYTtpZigwIT09YilyZXR1cm4gRj0xMixiO2lmKDAhPT0oYSYzMikpcmV0dXJuIEY9MTEsMzI7Yj0xOTImYTtpZigwIT09YilyZXR1cm4gRj0xMCxiO2lmKDAhPT0oYSYyNTYpKXJldHVybiBGPTksMjU2O2I9MzU4NCZhO2lmKDAhPT1iKXJldHVybiBGPTgsYjtpZigwIT09KGEmNDA5NikpcmV0dXJuIEY9Nyw0MDk2O2I9NDE4NjExMiZhO2lmKDAhPT1iKXJldHVybiBGPTYsYjtiPTYyOTE0NTYwJmE7aWYoMCE9PWIpcmV0dXJuIEY9NSxiO2lmKGEmNjcxMDg4NjQpcmV0dXJuIEY9NCw2NzEwODg2NDtpZigwIT09KGEmMTM0MjE3NzI4KSlyZXR1cm4gRj0zLDEzNDIxNzcyODtiPTgwNTMwNjM2OCZhO2lmKDAhPT1iKXJldHVybiBGPTIsYjtpZigwIT09KDEwNzM3NDE4MjQmYSkpcmV0dXJuIEY9MSwxMDczNzQxODI0O1xuRj04O3JldHVybiBhfWZ1bmN0aW9uIFNjKGEpe3N3aXRjaChhKXtjYXNlIDk5OnJldHVybiAxNTtjYXNlIDk4OnJldHVybiAxMDtjYXNlIDk3OmNhc2UgOTY6cmV0dXJuIDg7Y2FzZSA5NTpyZXR1cm4gMjtkZWZhdWx0OnJldHVybiAwfX1mdW5jdGlvbiBUYyhhKXtzd2l0Y2goYSl7Y2FzZSAxNTpjYXNlIDE0OnJldHVybiA5OTtjYXNlIDEzOmNhc2UgMTI6Y2FzZSAxMTpjYXNlIDEwOnJldHVybiA5ODtjYXNlIDk6Y2FzZSA4OmNhc2UgNzpjYXNlIDY6Y2FzZSA0OmNhc2UgNTpyZXR1cm4gOTc7Y2FzZSAzOmNhc2UgMjpjYXNlIDE6cmV0dXJuIDk1O2Nhc2UgMDpyZXR1cm4gOTA7ZGVmYXVsdDp0aHJvdyBFcnJvcih5KDM1OCxhKSk7fX1cbmZ1bmN0aW9uIFVjKGEsYil7dmFyIGM9YS5wZW5kaW5nTGFuZXM7aWYoMD09PWMpcmV0dXJuIEY9MDt2YXIgZD0wLGU9MCxmPWEuZXhwaXJlZExhbmVzLGc9YS5zdXNwZW5kZWRMYW5lcyxoPWEucGluZ2VkTGFuZXM7aWYoMCE9PWYpZD1mLGU9Rj0xNTtlbHNlIGlmKGY9YyYxMzQyMTc3MjcsMCE9PWYpe3ZhciBrPWYmfmc7MCE9PWs/KGQ9UmMoayksZT1GKTooaCY9ZiwwIT09aCYmKGQ9UmMoaCksZT1GKSl9ZWxzZSBmPWMmfmcsMCE9PWY/KGQ9UmMoZiksZT1GKTowIT09aCYmKGQ9UmMoaCksZT1GKTtpZigwPT09ZClyZXR1cm4gMDtkPTMxLVZjKGQpO2Q9YyYoKDA+ZD8wOjE8PGQpPDwxKS0xO2lmKDAhPT1iJiZiIT09ZCYmMD09PShiJmcpKXtSYyhiKTtpZihlPD1GKXJldHVybiBiO0Y9ZX1iPWEuZW50YW5nbGVkTGFuZXM7aWYoMCE9PWIpZm9yKGE9YS5lbnRhbmdsZW1lbnRzLGImPWQ7MDxiOyljPTMxLVZjKGIpLGU9MTw8YyxkfD1hW2NdLGImPX5lO3JldHVybiBkfVxuZnVuY3Rpb24gV2MoYSl7YT1hLnBlbmRpbmdMYW5lcyYtMTA3Mzc0MTgyNTtyZXR1cm4gMCE9PWE/YTphJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIFhjKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTU6cmV0dXJuIDE7Y2FzZSAxNDpyZXR1cm4gMjtjYXNlIDEyOnJldHVybiBhPVljKDI0Jn5iKSwwPT09YT9YYygxMCxiKTphO2Nhc2UgMTA6cmV0dXJuIGE9WWMoMTkyJn5iKSwwPT09YT9YYyg4LGIpOmE7Y2FzZSA4OnJldHVybiBhPVljKDM1ODQmfmIpLDA9PT1hJiYoYT1ZYyg0MTg2MTEyJn5iKSwwPT09YSYmKGE9NTEyKSksYTtjYXNlIDI6cmV0dXJuIGI9WWMoODA1MzA2MzY4Jn5iKSwwPT09YiYmKGI9MjY4NDM1NDU2KSxifXRocm93IEVycm9yKHkoMzU4LGEpKTt9ZnVuY3Rpb24gWWMoYSl7cmV0dXJuIGEmLWF9ZnVuY3Rpb24gWmMoYSl7Zm9yKHZhciBiPVtdLGM9MDszMT5jO2MrKyliLnB1c2goYSk7cmV0dXJuIGJ9XG5mdW5jdGlvbiAkYyhhLGIsYyl7YS5wZW5kaW5nTGFuZXN8PWI7dmFyIGQ9Yi0xO2Euc3VzcGVuZGVkTGFuZXMmPWQ7YS5waW5nZWRMYW5lcyY9ZDthPWEuZXZlbnRUaW1lcztiPTMxLVZjKGIpO2FbYl09Y312YXIgVmM9TWF0aC5jbHozMj9NYXRoLmNsejMyOmFkLGJkPU1hdGgubG9nLGNkPU1hdGguTE4yO2Z1bmN0aW9uIGFkKGEpe3JldHVybiAwPT09YT8zMjozMS0oYmQoYSkvY2R8MCl8MH12YXIgZGQ9ci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxlZD1yLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxmZD0hMDtmdW5jdGlvbiBnZChhLGIsYyxkKXtLYnx8SWIoKTt2YXIgZT1oZCxmPUtiO0tiPSEwO3RyeXtIYihlLGEsYixjLGQpfWZpbmFsbHl7KEtiPWYpfHxNYigpfX1mdW5jdGlvbiBpZChhLGIsYyxkKXtlZChkZCxoZC5iaW5kKG51bGwsYSxiLGMsZCkpfVxuZnVuY3Rpb24gaGQoYSxiLGMsZCl7aWYoZmQpe3ZhciBlO2lmKChlPTA9PT0oYiY0KSkmJjA8amMubGVuZ3RoJiYtMTxxYy5pbmRleE9mKGEpKWE9cmMobnVsbCxhLGIsYyxkKSxqYy5wdXNoKGEpO2Vsc2V7dmFyIGY9eWMoYSxiLGMsZCk7aWYobnVsbD09PWYpZSYmc2MoYSxkKTtlbHNle2lmKGUpe2lmKC0xPHFjLmluZGV4T2YoYSkpe2E9cmMoZixhLGIsYyxkKTtqYy5wdXNoKGEpO3JldHVybn1pZih1YyhmLGEsYixjLGQpKXJldHVybjtzYyhhLGQpfWpkKGEsYixkLG51bGwsYyl9fX19XG5mdW5jdGlvbiB5YyhhLGIsYyxkKXt2YXIgZT14YihkKTtlPXdjKGUpO2lmKG51bGwhPT1lKXt2YXIgZj1aYihlKTtpZihudWxsPT09ZillPW51bGw7ZWxzZXt2YXIgZz1mLnRhZztpZigxMz09PWcpe2U9JGIoZik7aWYobnVsbCE9PWUpcmV0dXJuIGU7ZT1udWxsfWVsc2UgaWYoMz09PWcpe2lmKGYuc3RhdGVOb2RlLmh5ZHJhdGUpcmV0dXJuIDM9PT1mLnRhZz9mLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7ZT1udWxsfWVsc2UgZiE9PWUmJihlPW51bGwpfX1qZChhLGIsZCxlLGMpO3JldHVybiBudWxsfXZhciBrZD1udWxsLGxkPW51bGwsbWQ9bnVsbDtcbmZ1bmN0aW9uIG5kKCl7aWYobWQpcmV0dXJuIG1kO3ZhciBhLGI9bGQsYz1iLmxlbmd0aCxkLGU9XCJ2YWx1ZVwiaW4ga2Q/a2QudmFsdWU6a2QudGV4dENvbnRlbnQsZj1lLmxlbmd0aDtmb3IoYT0wO2E8YyYmYlthXT09PWVbYV07YSsrKTt2YXIgZz1jLWE7Zm9yKGQ9MTtkPD1nJiZiW2MtZF09PT1lW2YtZF07ZCsrKTtyZXR1cm4gbWQ9ZS5zbGljZShhLDE8ZD8xLWQ6dm9pZCAwKX1mdW5jdGlvbiBvZChhKXt2YXIgYj1hLmtleUNvZGU7XCJjaGFyQ29kZVwiaW4gYT8oYT1hLmNoYXJDb2RlLDA9PT1hJiYxMz09PWImJihhPTEzKSk6YT1iOzEwPT09YSYmKGE9MTMpO3JldHVybiAzMjw9YXx8MTM9PT1hP2E6MH1mdW5jdGlvbiBwZCgpe3JldHVybiEwfWZ1bmN0aW9uIHFkKCl7cmV0dXJuITF9XG5mdW5jdGlvbiByZChhKXtmdW5jdGlvbiBiKGIsZCxlLGYsZyl7dGhpcy5fcmVhY3ROYW1lPWI7dGhpcy5fdGFyZ2V0SW5zdD1lO3RoaXMudHlwZT1kO3RoaXMubmF0aXZlRXZlbnQ9Zjt0aGlzLnRhcmdldD1nO3RoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJihiPWFbY10sdGhpc1tjXT1iP2IoZik6ZltjXSk7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KG51bGwhPWYuZGVmYXVsdFByZXZlbnRlZD9mLmRlZmF1bHRQcmV2ZW50ZWQ6ITE9PT1mLnJldHVyblZhbHVlKT9wZDpxZDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXFkO3JldHVybiB0aGlzfW0oYi5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOlwidW5rbm93blwiIT09dHlwZW9mIGEucmV0dXJuVmFsdWUmJlxuKGEucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPXBkKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5zdG9wUHJvcGFnYXRpb24/YS5zdG9wUHJvcGFnYXRpb24oKTpcInVua25vd25cIiE9PXR5cGVvZiBhLmNhbmNlbEJ1YmJsZSYmKGEuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXBkKX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50OnBkfSk7cmV0dXJuIGJ9XG52YXIgc2Q9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihhKXtyZXR1cm4gYS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0sdGQ9cmQoc2QpLHVkPW0oe30sc2Qse3ZpZXc6MCxkZXRhaWw6MH0pLHZkPXJkKHVkKSx3ZCx4ZCx5ZCxBZD1tKHt9LHVkLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAscGFnZVg6MCxwYWdlWTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxnZXRNb2RpZmllclN0YXRlOnpkLGJ1dHRvbjowLGJ1dHRvbnM6MCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hLnJlbGF0ZWRUYXJnZXQ/YS5mcm9tRWxlbWVudD09PWEuc3JjRWxlbWVudD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50OmEucmVsYXRlZFRhcmdldH0sbW92ZW1lbnRYOmZ1bmN0aW9uKGEpe2lmKFwibW92ZW1lbnRYXCJpblxuYSlyZXR1cm4gYS5tb3ZlbWVudFg7YSE9PXlkJiYoeWQmJlwibW91c2Vtb3ZlXCI9PT1hLnR5cGU/KHdkPWEuc2NyZWVuWC15ZC5zY3JlZW5YLHhkPWEuc2NyZWVuWS15ZC5zY3JlZW5ZKTp4ZD13ZD0wLHlkPWEpO3JldHVybiB3ZH0sbW92ZW1lbnRZOmZ1bmN0aW9uKGEpe3JldHVyblwibW92ZW1lbnRZXCJpbiBhP2EubW92ZW1lbnRZOnhkfX0pLEJkPXJkKEFkKSxDZD1tKHt9LEFkLHtkYXRhVHJhbnNmZXI6MH0pLERkPXJkKENkKSxFZD1tKHt9LHVkLHtyZWxhdGVkVGFyZ2V0OjB9KSxGZD1yZChFZCksR2Q9bSh7fSxzZCx7YW5pbWF0aW9uTmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksSGQ9cmQoR2QpLElkPW0oe30sc2Qse2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuXCJjbGlwYm9hcmREYXRhXCJpbiBhP2EuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSxKZD1yZChJZCksS2Q9bSh7fSxzZCx7ZGF0YTowfSksTGQ9cmQoS2QpLE1kPXtFc2M6XCJFc2NhcGVcIixcblNwYWNlYmFyOlwiIFwiLExlZnQ6XCJBcnJvd0xlZnRcIixVcDpcIkFycm93VXBcIixSaWdodDpcIkFycm93UmlnaHRcIixEb3duOlwiQXJyb3dEb3duXCIsRGVsOlwiRGVsZXRlXCIsV2luOlwiT1NcIixNZW51OlwiQ29udGV4dE1lbnVcIixBcHBzOlwiQ29udGV4dE1lbnVcIixTY3JvbGw6XCJTY3JvbGxMb2NrXCIsTW96UHJpbnRhYmxlS2V5OlwiVW5pZGVudGlmaWVkXCJ9LE5kPXs4OlwiQmFja3NwYWNlXCIsOTpcIlRhYlwiLDEyOlwiQ2xlYXJcIiwxMzpcIkVudGVyXCIsMTY6XCJTaGlmdFwiLDE3OlwiQ29udHJvbFwiLDE4OlwiQWx0XCIsMTk6XCJQYXVzZVwiLDIwOlwiQ2Fwc0xvY2tcIiwyNzpcIkVzY2FwZVwiLDMyOlwiIFwiLDMzOlwiUGFnZVVwXCIsMzQ6XCJQYWdlRG93blwiLDM1OlwiRW5kXCIsMzY6XCJIb21lXCIsMzc6XCJBcnJvd0xlZnRcIiwzODpcIkFycm93VXBcIiwzOTpcIkFycm93UmlnaHRcIiw0MDpcIkFycm93RG93blwiLDQ1OlwiSW5zZXJ0XCIsNDY6XCJEZWxldGVcIiwxMTI6XCJGMVwiLDExMzpcIkYyXCIsMTE0OlwiRjNcIiwxMTU6XCJGNFwiLDExNjpcIkY1XCIsMTE3OlwiRjZcIiwxMTg6XCJGN1wiLFxuMTE5OlwiRjhcIiwxMjA6XCJGOVwiLDEyMTpcIkYxMFwiLDEyMjpcIkYxMVwiLDEyMzpcIkYxMlwiLDE0NDpcIk51bUxvY2tcIiwxNDU6XCJTY3JvbGxMb2NrXCIsMjI0OlwiTWV0YVwifSxPZD17QWx0OlwiYWx0S2V5XCIsQ29udHJvbDpcImN0cmxLZXlcIixNZXRhOlwibWV0YUtleVwiLFNoaWZ0Olwic2hpZnRLZXlcIn07ZnVuY3Rpb24gUGQoYSl7dmFyIGI9dGhpcy5uYXRpdmVFdmVudDtyZXR1cm4gYi5nZXRNb2RpZmllclN0YXRlP2IuZ2V0TW9kaWZpZXJTdGF0ZShhKTooYT1PZFthXSk/ISFiW2FdOiExfWZ1bmN0aW9uIHpkKCl7cmV0dXJuIFBkfVxudmFyIFFkPW0oe30sdWQse2tleTpmdW5jdGlvbihhKXtpZihhLmtleSl7dmFyIGI9TWRbYS5rZXldfHxhLmtleTtpZihcIlVuaWRlbnRpZmllZFwiIT09YilyZXR1cm4gYn1yZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/KGE9b2QoYSksMTM9PT1hP1wiRW50ZXJcIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP05kW2Eua2V5Q29kZV18fFwiVW5pZGVudGlmaWVkXCI6XCJcIn0sY29kZTowLGxvY2F0aW9uOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLHJlcGVhdDowLGxvY2FsZTowLGdldE1vZGlmaWVyU3RhdGU6emQsY2hhckNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlwcmVzc1wiPT09YS50eXBlP29kKGEpOjB9LGtleUNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9hLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlwcmVzc1wiPT09XG5hLnR5cGU/b2QoYSk6XCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9hLmtleUNvZGU6MH19KSxSZD1yZChRZCksU2Q9bSh7fSxBZCx7cG9pbnRlcklkOjAsd2lkdGg6MCxoZWlnaHQ6MCxwcmVzc3VyZTowLHRhbmdlbnRpYWxQcmVzc3VyZTowLHRpbHRYOjAsdGlsdFk6MCx0d2lzdDowLHBvaW50ZXJUeXBlOjAsaXNQcmltYXJ5OjB9KSxUZD1yZChTZCksVWQ9bSh7fSx1ZCx7dG91Y2hlczowLHRhcmdldFRvdWNoZXM6MCxjaGFuZ2VkVG91Y2hlczowLGFsdEtleTowLG1ldGFLZXk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxnZXRNb2RpZmllclN0YXRlOnpkfSksVmQ9cmQoVWQpLFdkPW0oe30sc2Qse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksWGQ9cmQoV2QpLFlkPW0oe30sQWQse2RlbHRhWDpmdW5jdGlvbihhKXtyZXR1cm5cImRlbHRhWFwiaW4gYT9hLmRlbHRhWDpcIndoZWVsRGVsdGFYXCJpbiBhPy1hLndoZWVsRGVsdGFYOjB9LFxuZGVsdGFZOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFZXCJpbiBhP2EuZGVsdGFZOlwid2hlZWxEZWx0YVlcImluIGE/LWEud2hlZWxEZWx0YVk6XCJ3aGVlbERlbHRhXCJpbiBhPy1hLndoZWVsRGVsdGE6MH0sZGVsdGFaOjAsZGVsdGFNb2RlOjB9KSxaZD1yZChZZCksJGQ9WzksMTMsMjcsMzJdLGFlPWZhJiZcIkNvbXBvc2l0aW9uRXZlbnRcImluIHdpbmRvdyxiZT1udWxsO2ZhJiZcImRvY3VtZW50TW9kZVwiaW4gZG9jdW1lbnQmJihiZT1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBjZT1mYSYmXCJUZXh0RXZlbnRcImluIHdpbmRvdyYmIWJlLGRlPWZhJiYoIWFlfHxiZSYmODxiZSYmMTE+PWJlKSxlZT1TdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSxmZT0hMTtcbmZ1bmN0aW9uIGdlKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJrZXl1cFwiOnJldHVybi0xIT09JGQuaW5kZXhPZihiLmtleUNvZGUpO2Nhc2UgXCJrZXlkb3duXCI6cmV0dXJuIDIyOSE9PWIua2V5Q29kZTtjYXNlIFwia2V5cHJlc3NcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcImZvY3Vzb3V0XCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gaGUoYSl7YT1hLmRldGFpbDtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJlwiZGF0YVwiaW4gYT9hLmRhdGE6bnVsbH12YXIgaWU9ITE7ZnVuY3Rpb24gamUoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6cmV0dXJuIGhlKGIpO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKDMyIT09Yi53aGljaClyZXR1cm4gbnVsbDtmZT0hMDtyZXR1cm4gZWU7Y2FzZSBcInRleHRJbnB1dFwiOnJldHVybiBhPWIuZGF0YSxhPT09ZWUmJmZlP251bGw6YTtkZWZhdWx0OnJldHVybiBudWxsfX1cbmZ1bmN0aW9uIGtlKGEsYil7aWYoaWUpcmV0dXJuXCJjb21wb3NpdGlvbmVuZFwiPT09YXx8IWFlJiZnZShhLGIpPyhhPW5kKCksbWQ9bGQ9a2Q9bnVsbCxpZT0hMSxhKTpudWxsO3N3aXRjaChhKXtjYXNlIFwicGFzdGVcIjpyZXR1cm4gbnVsbDtjYXNlIFwia2V5cHJlc3NcIjppZighKGIuY3RybEtleXx8Yi5hbHRLZXl8fGIubWV0YUtleSl8fGIuY3RybEtleSYmYi5hbHRLZXkpe2lmKGIuY2hhciYmMTxiLmNoYXIubGVuZ3RoKXJldHVybiBiLmNoYXI7aWYoYi53aGljaClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShiLndoaWNoKX1yZXR1cm4gbnVsbDtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gZGUmJlwia29cIiE9PWIubG9jYWxlP251bGw6Yi5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxudmFyIGxlPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLFwiZGF0ZXRpbWUtbG9jYWxcIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O2Z1bmN0aW9uIG1lKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm5cImlucHV0XCI9PT1iPyEhbGVbYS50eXBlXTpcInRleHRhcmVhXCI9PT1iPyEwOiExfWZ1bmN0aW9uIG5lKGEsYixjLGQpe0ViKGQpO2I9b2UoYixcIm9uQ2hhbmdlXCIpOzA8Yi5sZW5ndGgmJihjPW5ldyB0ZChcIm9uQ2hhbmdlXCIsXCJjaGFuZ2VcIixudWxsLGMsZCksYS5wdXNoKHtldmVudDpjLGxpc3RlbmVyczpifSkpfXZhciBwZT1udWxsLHFlPW51bGw7ZnVuY3Rpb24gcmUoYSl7c2UoYSwwKX1mdW5jdGlvbiB0ZShhKXt2YXIgYj11ZShhKTtpZihXYShiKSlyZXR1cm4gYX1cbmZ1bmN0aW9uIHZlKGEsYil7aWYoXCJjaGFuZ2VcIj09PWEpcmV0dXJuIGJ9dmFyIHdlPSExO2lmKGZhKXt2YXIgeGU7aWYoZmEpe3ZhciB5ZT1cIm9uaW5wdXRcImluIGRvY3VtZW50O2lmKCF5ZSl7dmFyIHplPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7emUuc2V0QXR0cmlidXRlKFwib25pbnB1dFwiLFwicmV0dXJuO1wiKTt5ZT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgemUub25pbnB1dH14ZT15ZX1lbHNlIHhlPSExO3dlPXhlJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpfWZ1bmN0aW9uIEFlKCl7cGUmJihwZS5kZXRhY2hFdmVudChcIm9ucHJvcGVydHljaGFuZ2VcIixCZSkscWU9cGU9bnVsbCl9ZnVuY3Rpb24gQmUoYSl7aWYoXCJ2YWx1ZVwiPT09YS5wcm9wZXJ0eU5hbWUmJnRlKHFlKSl7dmFyIGI9W107bmUoYixxZSxhLHhiKGEpKTthPXJlO2lmKEtiKWEoYik7ZWxzZXtLYj0hMDt0cnl7R2IoYSxiKX1maW5hbGx5e0tiPSExLE1iKCl9fX19XG5mdW5jdGlvbiBDZShhLGIsYyl7XCJmb2N1c2luXCI9PT1hPyhBZSgpLHBlPWIscWU9YyxwZS5hdHRhY2hFdmVudChcIm9ucHJvcGVydHljaGFuZ2VcIixCZSkpOlwiZm9jdXNvdXRcIj09PWEmJkFlKCl9ZnVuY3Rpb24gRGUoYSl7aWYoXCJzZWxlY3Rpb25jaGFuZ2VcIj09PWF8fFwia2V5dXBcIj09PWF8fFwia2V5ZG93blwiPT09YSlyZXR1cm4gdGUocWUpfWZ1bmN0aW9uIEVlKGEsYil7aWYoXCJjbGlja1wiPT09YSlyZXR1cm4gdGUoYil9ZnVuY3Rpb24gRmUoYSxiKXtpZihcImlucHV0XCI9PT1hfHxcImNoYW5nZVwiPT09YSlyZXR1cm4gdGUoYil9ZnVuY3Rpb24gR2UoYSxiKXtyZXR1cm4gYT09PWImJigwIT09YXx8MS9hPT09MS9iKXx8YSE9PWEmJmIhPT1ifXZhciBIZT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgT2JqZWN0LmlzP09iamVjdC5pczpHZSxJZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gSmUoYSxiKXtpZihIZShhLGIpKXJldHVybiEwO2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYXx8bnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuITE7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZihjLmxlbmd0aCE9PWQubGVuZ3RoKXJldHVybiExO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspaWYoIUllLmNhbGwoYixjW2RdKXx8IUhlKGFbY1tkXV0sYltjW2RdXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gS2UoYSl7Zm9yKDthJiZhLmZpcnN0Q2hpbGQ7KWE9YS5maXJzdENoaWxkO3JldHVybiBhfVxuZnVuY3Rpb24gTGUoYSxiKXt2YXIgYz1LZShhKTthPTA7Zm9yKHZhciBkO2M7KXtpZigzPT09Yy5ub2RlVHlwZSl7ZD1hK2MudGV4dENvbnRlbnQubGVuZ3RoO2lmKGE8PWImJmQ+PWIpcmV0dXJue25vZGU6YyxvZmZzZXQ6Yi1hfTthPWR9YTp7Zm9yKDtjOyl7aWYoYy5uZXh0U2libGluZyl7Yz1jLm5leHRTaWJsaW5nO2JyZWFrIGF9Yz1jLnBhcmVudE5vZGV9Yz12b2lkIDB9Yz1LZShjKX19ZnVuY3Rpb24gTWUoYSxiKXtyZXR1cm4gYSYmYj9hPT09Yj8hMDphJiYzPT09YS5ub2RlVHlwZT8hMTpiJiYzPT09Yi5ub2RlVHlwZT9NZShhLGIucGFyZW50Tm9kZSk6XCJjb250YWluc1wiaW4gYT9hLmNvbnRhaW5zKGIpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik6ITE6ITF9XG5mdW5jdGlvbiBOZSgpe2Zvcih2YXIgYT13aW5kb3csYj1YYSgpO2IgaW5zdGFuY2VvZiBhLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBjPVwic3RyaW5nXCI9PT10eXBlb2YgYi5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWZ9Y2F0Y2goZCl7Yz0hMX1pZihjKWE9Yi5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7Yj1YYShhLmRvY3VtZW50KX1yZXR1cm4gYn1mdW5jdGlvbiBPZShhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGImJihcImlucHV0XCI9PT1iJiYoXCJ0ZXh0XCI9PT1hLnR5cGV8fFwic2VhcmNoXCI9PT1hLnR5cGV8fFwidGVsXCI9PT1hLnR5cGV8fFwidXJsXCI9PT1hLnR5cGV8fFwicGFzc3dvcmRcIj09PWEudHlwZSl8fFwidGV4dGFyZWFcIj09PWJ8fFwidHJ1ZVwiPT09YS5jb250ZW50RWRpdGFibGUpfVxudmFyIFBlPWZhJiZcImRvY3VtZW50TW9kZVwiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsUWU9bnVsbCxSZT1udWxsLFNlPW51bGwsVGU9ITE7XG5mdW5jdGlvbiBVZShhLGIsYyl7dmFyIGQ9Yy53aW5kb3c9PT1jP2MuZG9jdW1lbnQ6OT09PWMubm9kZVR5cGU/YzpjLm93bmVyRG9jdW1lbnQ7VGV8fG51bGw9PVFlfHxRZSE9PVhhKGQpfHwoZD1RZSxcInNlbGVjdGlvblN0YXJ0XCJpbiBkJiZPZShkKT9kPXtzdGFydDpkLnNlbGVjdGlvblN0YXJ0LGVuZDpkLnNlbGVjdGlvbkVuZH06KGQ9KGQub3duZXJEb2N1bWVudCYmZC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpLGQ9e2FuY2hvck5vZGU6ZC5hbmNob3JOb2RlLGFuY2hvck9mZnNldDpkLmFuY2hvck9mZnNldCxmb2N1c05vZGU6ZC5mb2N1c05vZGUsZm9jdXNPZmZzZXQ6ZC5mb2N1c09mZnNldH0pLFNlJiZKZShTZSxkKXx8KFNlPWQsZD1vZShSZSxcIm9uU2VsZWN0XCIpLDA8ZC5sZW5ndGgmJihiPW5ldyB0ZChcIm9uU2VsZWN0XCIsXCJzZWxlY3RcIixudWxsLGIsYyksYS5wdXNoKHtldmVudDpiLGxpc3RlbmVyczpkfSksYi50YXJnZXQ9UWUpKSl9XG5QYyhcImNhbmNlbCBjYW5jZWwgY2xpY2sgY2xpY2sgY2xvc2UgY2xvc2UgY29udGV4dG1lbnUgY29udGV4dE1lbnUgY29weSBjb3B5IGN1dCBjdXQgYXV4Y2xpY2sgYXV4Q2xpY2sgZGJsY2xpY2sgZG91YmxlQ2xpY2sgZHJhZ2VuZCBkcmFnRW5kIGRyYWdzdGFydCBkcmFnU3RhcnQgZHJvcCBkcm9wIGZvY3VzaW4gZm9jdXMgZm9jdXNvdXQgYmx1ciBpbnB1dCBpbnB1dCBpbnZhbGlkIGludmFsaWQga2V5ZG93biBrZXlEb3duIGtleXByZXNzIGtleVByZXNzIGtleXVwIGtleVVwIG1vdXNlZG93biBtb3VzZURvd24gbW91c2V1cCBtb3VzZVVwIHBhc3RlIHBhc3RlIHBhdXNlIHBhdXNlIHBsYXkgcGxheSBwb2ludGVyY2FuY2VsIHBvaW50ZXJDYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlckRvd24gcG9pbnRlcnVwIHBvaW50ZXJVcCByYXRlY2hhbmdlIHJhdGVDaGFuZ2UgcmVzZXQgcmVzZXQgc2Vla2VkIHNlZWtlZCBzdWJtaXQgc3VibWl0IHRvdWNoY2FuY2VsIHRvdWNoQ2FuY2VsIHRvdWNoZW5kIHRvdWNoRW5kIHRvdWNoc3RhcnQgdG91Y2hTdGFydCB2b2x1bWVjaGFuZ2Ugdm9sdW1lQ2hhbmdlXCIuc3BsaXQoXCIgXCIpLFxuMCk7UGMoXCJkcmFnIGRyYWcgZHJhZ2VudGVyIGRyYWdFbnRlciBkcmFnZXhpdCBkcmFnRXhpdCBkcmFnbGVhdmUgZHJhZ0xlYXZlIGRyYWdvdmVyIGRyYWdPdmVyIG1vdXNlbW92ZSBtb3VzZU1vdmUgbW91c2VvdXQgbW91c2VPdXQgbW91c2VvdmVyIG1vdXNlT3ZlciBwb2ludGVybW92ZSBwb2ludGVyTW92ZSBwb2ludGVyb3V0IHBvaW50ZXJPdXQgcG9pbnRlcm92ZXIgcG9pbnRlck92ZXIgc2Nyb2xsIHNjcm9sbCB0b2dnbGUgdG9nZ2xlIHRvdWNobW92ZSB0b3VjaE1vdmUgd2hlZWwgd2hlZWxcIi5zcGxpdChcIiBcIiksMSk7UGMoT2MsMik7Zm9yKHZhciBWZT1cImNoYW5nZSBzZWxlY3Rpb25jaGFuZ2UgdGV4dElucHV0IGNvbXBvc2l0aW9uc3RhcnQgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb251cGRhdGVcIi5zcGxpdChcIiBcIiksV2U9MDtXZTxWZS5sZW5ndGg7V2UrKylOYy5zZXQoVmVbV2VdLDApO2VhKFwib25Nb3VzZUVudGVyXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7XG5lYShcIm9uTW91c2VMZWF2ZVwiLFtcIm1vdXNlb3V0XCIsXCJtb3VzZW92ZXJcIl0pO2VhKFwib25Qb2ludGVyRW50ZXJcIixbXCJwb2ludGVyb3V0XCIsXCJwb2ludGVyb3ZlclwiXSk7ZWEoXCJvblBvaW50ZXJMZWF2ZVwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtkYShcIm9uQ2hhbmdlXCIsXCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKSk7ZGEoXCJvblNlbGVjdFwiLFwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpKTtkYShcIm9uQmVmb3JlSW5wdXRcIixbXCJjb21wb3NpdGlvbmVuZFwiLFwia2V5cHJlc3NcIixcInRleHRJbnB1dFwiLFwicGFzdGVcIl0pO2RhKFwib25Db21wb3NpdGlvbkVuZFwiLFwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO1xuZGEoXCJvbkNvbXBvc2l0aW9uU3RhcnRcIixcImNvbXBvc2l0aW9uc3RhcnQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO2RhKFwib25Db21wb3NpdGlvblVwZGF0ZVwiLFwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO3ZhciBYZT1cImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2Ugc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmdcIi5zcGxpdChcIiBcIiksWWU9bmV3IFNldChcImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZVwiLnNwbGl0KFwiIFwiKS5jb25jYXQoWGUpKTtcbmZ1bmN0aW9uIFplKGEsYixjKXt2YXIgZD1hLnR5cGV8fFwidW5rbm93bi1ldmVudFwiO2EuY3VycmVudFRhcmdldD1jO1liKGQsYix2b2lkIDAsYSk7YS5jdXJyZW50VGFyZ2V0PW51bGx9XG5mdW5jdGlvbiBzZShhLGIpe2I9MCE9PShiJjQpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdLGU9ZC5ldmVudDtkPWQubGlzdGVuZXJzO2E6e3ZhciBmPXZvaWQgMDtpZihiKWZvcih2YXIgZz1kLmxlbmd0aC0xOzA8PWc7Zy0tKXt2YXIgaD1kW2ddLGs9aC5pbnN0YW5jZSxsPWguY3VycmVudFRhcmdldDtoPWgubGlzdGVuZXI7aWYoayE9PWYmJmUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBhO1plKGUsaCxsKTtmPWt9ZWxzZSBmb3IoZz0wO2c8ZC5sZW5ndGg7ZysrKXtoPWRbZ107az1oLmluc3RhbmNlO2w9aC5jdXJyZW50VGFyZ2V0O2g9aC5saXN0ZW5lcjtpZihrIT09ZiYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGE7WmUoZSxoLGwpO2Y9a319fWlmKFViKXRocm93IGE9VmIsVWI9ITEsVmI9bnVsbCxhO31cbmZ1bmN0aW9uIEcoYSxiKXt2YXIgYz0kZShiKSxkPWErXCJfX2J1YmJsZVwiO2MuaGFzKGQpfHwoYWYoYixhLDIsITEpLGMuYWRkKGQpKX12YXIgYmY9XCJfcmVhY3RMaXN0ZW5pbmdcIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiBjZihhKXthW2JmXXx8KGFbYmZdPSEwLGJhLmZvckVhY2goZnVuY3Rpb24oYil7WWUuaGFzKGIpfHxkZihiLCExLGEsbnVsbCk7ZGYoYiwhMCxhLG51bGwpfSkpfVxuZnVuY3Rpb24gZGYoYSxiLGMsZCl7dmFyIGU9NDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOjAsZj1jO1wic2VsZWN0aW9uY2hhbmdlXCI9PT1hJiY5IT09Yy5ub2RlVHlwZSYmKGY9Yy5vd25lckRvY3VtZW50KTtpZihudWxsIT09ZCYmIWImJlllLmhhcyhhKSl7aWYoXCJzY3JvbGxcIiE9PWEpcmV0dXJuO2V8PTI7Zj1kfXZhciBnPSRlKGYpLGg9YStcIl9fXCIrKGI/XCJjYXB0dXJlXCI6XCJidWJibGVcIik7Zy5oYXMoaCl8fChiJiYoZXw9NCksYWYoZixhLGUsYiksZy5hZGQoaCkpfVxuZnVuY3Rpb24gYWYoYSxiLGMsZCl7dmFyIGU9TmMuZ2V0KGIpO3N3aXRjaCh2b2lkIDA9PT1lPzI6ZSl7Y2FzZSAwOmU9Z2Q7YnJlYWs7Y2FzZSAxOmU9aWQ7YnJlYWs7ZGVmYXVsdDplPWhkfWM9ZS5iaW5kKG51bGwsYixjLGEpO2U9dm9pZCAwOyFQYnx8XCJ0b3VjaHN0YXJ0XCIhPT1iJiZcInRvdWNobW92ZVwiIT09YiYmXCJ3aGVlbFwiIT09Ynx8KGU9ITApO2Q/dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtjYXB0dXJlOiEwLHBhc3NpdmU6ZX0pOmEuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITApOnZvaWQgMCE9PWU/YS5hZGRFdmVudExpc3RlbmVyKGIsYyx7cGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSl9XG5mdW5jdGlvbiBqZChhLGIsYyxkLGUpe3ZhciBmPWQ7aWYoMD09PShiJjEpJiYwPT09KGImMikmJm51bGwhPT1kKWE6Zm9yKDs7KXtpZihudWxsPT09ZClyZXR1cm47dmFyIGc9ZC50YWc7aWYoMz09PWd8fDQ9PT1nKXt2YXIgaD1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKGg9PT1lfHw4PT09aC5ub2RlVHlwZSYmaC5wYXJlbnROb2RlPT09ZSlicmVhaztpZig0PT09Zylmb3IoZz1kLnJldHVybjtudWxsIT09Zzspe3ZhciBrPWcudGFnO2lmKDM9PT1rfHw0PT09aylpZihrPWcuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saz09PWV8fDg9PT1rLm5vZGVUeXBlJiZrLnBhcmVudE5vZGU9PT1lKXJldHVybjtnPWcucmV0dXJufWZvcig7bnVsbCE9PWg7KXtnPXdjKGgpO2lmKG51bGw9PT1nKXJldHVybjtrPWcudGFnO2lmKDU9PT1rfHw2PT09ayl7ZD1mPWc7Y29udGludWUgYX1oPWgucGFyZW50Tm9kZX19ZD1kLnJldHVybn1OYihmdW5jdGlvbigpe3ZhciBkPWYsZT14YihjKSxnPVtdO1xuYTp7dmFyIGg9TWMuZ2V0KGEpO2lmKHZvaWQgMCE9PWgpe3ZhciBrPXRkLHg9YTtzd2l0Y2goYSl7Y2FzZSBcImtleXByZXNzXCI6aWYoMD09PW9kKGMpKWJyZWFrIGE7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjprPVJkO2JyZWFrO2Nhc2UgXCJmb2N1c2luXCI6eD1cImZvY3VzXCI7az1GZDticmVhaztjYXNlIFwiZm9jdXNvdXRcIjp4PVwiYmx1clwiO2s9RmQ7YnJlYWs7Y2FzZSBcImJlZm9yZWJsdXJcIjpjYXNlIFwiYWZ0ZXJibHVyXCI6az1GZDticmVhaztjYXNlIFwiY2xpY2tcIjppZigyPT09Yy5idXR0b24pYnJlYWsgYTtjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcIm1vdXNlb3V0XCI6Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJjb250ZXh0bWVudVwiOms9QmQ7YnJlYWs7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VuZFwiOmNhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2V4aXRcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Y2FzZSBcImRyYWdvdmVyXCI6Y2FzZSBcImRyYWdzdGFydFwiOmNhc2UgXCJkcm9wXCI6az1cbkRkO2JyZWFrO2Nhc2UgXCJ0b3VjaGNhbmNlbFwiOmNhc2UgXCJ0b3VjaGVuZFwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwidG91Y2hzdGFydFwiOms9VmQ7YnJlYWs7Y2FzZSBJYzpjYXNlIEpjOmNhc2UgS2M6az1IZDticmVhaztjYXNlIExjOms9WGQ7YnJlYWs7Y2FzZSBcInNjcm9sbFwiOms9dmQ7YnJlYWs7Y2FzZSBcIndoZWVsXCI6az1aZDticmVhaztjYXNlIFwiY29weVwiOmNhc2UgXCJjdXRcIjpjYXNlIFwicGFzdGVcIjprPUpkO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwicG9pbnRlcmNhbmNlbFwiOmNhc2UgXCJwb2ludGVyZG93blwiOmNhc2UgXCJwb2ludGVybW92ZVwiOmNhc2UgXCJwb2ludGVyb3V0XCI6Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOms9VGR9dmFyIHc9MCE9PShiJjQpLHo9IXcmJlwic2Nyb2xsXCI9PT1hLHU9dz9udWxsIT09aD9oK1wiQ2FwdHVyZVwiOm51bGw6aDt3PVtdO2Zvcih2YXIgdD1kLHE7bnVsbCE9PVxudDspe3E9dDt2YXIgdj1xLnN0YXRlTm9kZTs1PT09cS50YWcmJm51bGwhPT12JiYocT12LG51bGwhPT11JiYodj1PYih0LHUpLG51bGwhPXYmJncucHVzaChlZih0LHYscSkpKSk7aWYoeilicmVhazt0PXQucmV0dXJufTA8dy5sZW5ndGgmJihoPW5ldyBrKGgseCxudWxsLGMsZSksZy5wdXNoKHtldmVudDpoLGxpc3RlbmVyczp3fSkpfX1pZigwPT09KGImNykpe2E6e2g9XCJtb3VzZW92ZXJcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWE7az1cIm1vdXNlb3V0XCI9PT1hfHxcInBvaW50ZXJvdXRcIj09PWE7aWYoaCYmMD09PShiJjE2KSYmKHg9Yy5yZWxhdGVkVGFyZ2V0fHxjLmZyb21FbGVtZW50KSYmKHdjKHgpfHx4W2ZmXSkpYnJlYWsgYTtpZihrfHxoKXtoPWUud2luZG93PT09ZT9lOihoPWUub3duZXJEb2N1bWVudCk/aC5kZWZhdWx0Vmlld3x8aC5wYXJlbnRXaW5kb3c6d2luZG93O2lmKGspe2lmKHg9Yy5yZWxhdGVkVGFyZ2V0fHxjLnRvRWxlbWVudCxrPWQseD14P3djKHgpOm51bGwsbnVsbCE9PVxueCYmKHo9WmIoeCkseCE9PXp8fDUhPT14LnRhZyYmNiE9PXgudGFnKSl4PW51bGx9ZWxzZSBrPW51bGwseD1kO2lmKGshPT14KXt3PUJkO3Y9XCJvbk1vdXNlTGVhdmVcIjt1PVwib25Nb3VzZUVudGVyXCI7dD1cIm1vdXNlXCI7aWYoXCJwb2ludGVyb3V0XCI9PT1hfHxcInBvaW50ZXJvdmVyXCI9PT1hKXc9VGQsdj1cIm9uUG9pbnRlckxlYXZlXCIsdT1cIm9uUG9pbnRlckVudGVyXCIsdD1cInBvaW50ZXJcIjt6PW51bGw9PWs/aDp1ZShrKTtxPW51bGw9PXg/aDp1ZSh4KTtoPW5ldyB3KHYsdCtcImxlYXZlXCIsayxjLGUpO2gudGFyZ2V0PXo7aC5yZWxhdGVkVGFyZ2V0PXE7dj1udWxsO3djKGUpPT09ZCYmKHc9bmV3IHcodSx0K1wiZW50ZXJcIix4LGMsZSksdy50YXJnZXQ9cSx3LnJlbGF0ZWRUYXJnZXQ9eix2PXcpO3o9djtpZihrJiZ4KWI6e3c9azt1PXg7dD0wO2ZvcihxPXc7cTtxPWdmKHEpKXQrKztxPTA7Zm9yKHY9dTt2O3Y9Z2YodikpcSsrO2Zvcig7MDx0LXE7KXc9Z2YodyksdC0tO2Zvcig7MDxxLXQ7KXU9XG5nZih1KSxxLS07Zm9yKDt0LS07KXtpZih3PT09dXx8bnVsbCE9PXUmJnc9PT11LmFsdGVybmF0ZSlicmVhayBiO3c9Z2Yodyk7dT1nZih1KX13PW51bGx9ZWxzZSB3PW51bGw7bnVsbCE9PWsmJmhmKGcsaCxrLHcsITEpO251bGwhPT14JiZudWxsIT09eiYmaGYoZyx6LHgsdywhMCl9fX1hOntoPWQ/dWUoZCk6d2luZG93O2s9aC5ub2RlTmFtZSYmaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKFwic2VsZWN0XCI9PT1rfHxcImlucHV0XCI9PT1rJiZcImZpbGVcIj09PWgudHlwZSl2YXIgSj12ZTtlbHNlIGlmKG1lKGgpKWlmKHdlKUo9RmU7ZWxzZXtKPURlO3ZhciBLPUNlfWVsc2Uoaz1oLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09ay50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09aC50eXBlfHxcInJhZGlvXCI9PT1oLnR5cGUpJiYoSj1FZSk7aWYoSiYmKEo9SihhLGQpKSl7bmUoZyxKLGMsZSk7YnJlYWsgYX1LJiZLKGEsaCxkKTtcImZvY3Vzb3V0XCI9PT1hJiYoSz1oLl93cmFwcGVyU3RhdGUpJiZcbksuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWgudHlwZSYmYmIoaCxcIm51bWJlclwiLGgudmFsdWUpfUs9ZD91ZShkKTp3aW5kb3c7c3dpdGNoKGEpe2Nhc2UgXCJmb2N1c2luXCI6aWYobWUoSyl8fFwidHJ1ZVwiPT09Sy5jb250ZW50RWRpdGFibGUpUWU9SyxSZT1kLFNlPW51bGw7YnJlYWs7Y2FzZSBcImZvY3Vzb3V0XCI6U2U9UmU9UWU9bnVsbDticmVhaztjYXNlIFwibW91c2Vkb3duXCI6VGU9ITA7YnJlYWs7Y2FzZSBcImNvbnRleHRtZW51XCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwiZHJhZ2VuZFwiOlRlPSExO1VlKGcsYyxlKTticmVhaztjYXNlIFwic2VsZWN0aW9uY2hhbmdlXCI6aWYoUGUpYnJlYWs7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjpVZShnLGMsZSl9dmFyIFE7aWYoYWUpYjp7c3dpdGNoKGEpe2Nhc2UgXCJjb21wb3NpdGlvbnN0YXJ0XCI6dmFyIEw9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIjticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOkw9XCJvbkNvbXBvc2l0aW9uRW5kXCI7YnJlYWsgYjtcbmNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOkw9XCJvbkNvbXBvc2l0aW9uVXBkYXRlXCI7YnJlYWsgYn1MPXZvaWQgMH1lbHNlIGllP2dlKGEsYykmJihMPVwib25Db21wb3NpdGlvbkVuZFwiKTpcImtleWRvd25cIj09PWEmJjIyOT09PWMua2V5Q29kZSYmKEw9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIik7TCYmKGRlJiZcImtvXCIhPT1jLmxvY2FsZSYmKGllfHxcIm9uQ29tcG9zaXRpb25TdGFydFwiIT09TD9cIm9uQ29tcG9zaXRpb25FbmRcIj09PUwmJmllJiYoUT1uZCgpKTooa2Q9ZSxsZD1cInZhbHVlXCJpbiBrZD9rZC52YWx1ZTprZC50ZXh0Q29udGVudCxpZT0hMCkpLEs9b2UoZCxMKSwwPEsubGVuZ3RoJiYoTD1uZXcgTGQoTCxhLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OkwsbGlzdGVuZXJzOkt9KSxRP0wuZGF0YT1ROihRPWhlKGMpLG51bGwhPT1RJiYoTC5kYXRhPVEpKSkpO2lmKFE9Y2U/amUoYSxjKTprZShhLGMpKWQ9b2UoZCxcIm9uQmVmb3JlSW5wdXRcIiksMDxkLmxlbmd0aCYmKGU9bmV3IExkKFwib25CZWZvcmVJbnB1dFwiLFxuXCJiZWZvcmVpbnB1dFwiLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmUsbGlzdGVuZXJzOmR9KSxlLmRhdGE9USl9c2UoZyxiKX0pfWZ1bmN0aW9uIGVmKGEsYixjKXtyZXR1cm57aW5zdGFuY2U6YSxsaXN0ZW5lcjpiLGN1cnJlbnRUYXJnZXQ6Y319ZnVuY3Rpb24gb2UoYSxiKXtmb3IodmFyIGM9YitcIkNhcHR1cmVcIixkPVtdO251bGwhPT1hOyl7dmFyIGU9YSxmPWUuc3RhdGVOb2RlOzU9PT1lLnRhZyYmbnVsbCE9PWYmJihlPWYsZj1PYihhLGMpLG51bGwhPWYmJmQudW5zaGlmdChlZihhLGYsZSkpLGY9T2IoYSxiKSxudWxsIT1mJiZkLnB1c2goZWYoYSxmLGUpKSk7YT1hLnJldHVybn1yZXR1cm4gZH1mdW5jdGlvbiBnZihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDtkbyBhPWEucmV0dXJuO3doaWxlKGEmJjUhPT1hLnRhZyk7cmV0dXJuIGE/YTpudWxsfVxuZnVuY3Rpb24gaGYoYSxiLGMsZCxlKXtmb3IodmFyIGY9Yi5fcmVhY3ROYW1lLGc9W107bnVsbCE9PWMmJmMhPT1kOyl7dmFyIGg9YyxrPWguYWx0ZXJuYXRlLGw9aC5zdGF0ZU5vZGU7aWYobnVsbCE9PWsmJms9PT1kKWJyZWFrOzU9PT1oLnRhZyYmbnVsbCE9PWwmJihoPWwsZT8oaz1PYihjLGYpLG51bGwhPWsmJmcudW5zaGlmdChlZihjLGssaCkpKTplfHwoaz1PYihjLGYpLG51bGwhPWsmJmcucHVzaChlZihjLGssaCkpKSk7Yz1jLnJldHVybn0wIT09Zy5sZW5ndGgmJmEucHVzaCh7ZXZlbnQ6YixsaXN0ZW5lcnM6Z30pfWZ1bmN0aW9uIGpmKCl7fXZhciBrZj1udWxsLGxmPW51bGw7ZnVuY3Rpb24gbWYoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImJ1dHRvblwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwidGV4dGFyZWFcIjpyZXR1cm4hIWIuYXV0b0ZvY3VzfXJldHVybiExfVxuZnVuY3Rpb24gbmYoYSxiKXtyZXR1cm5cInRleHRhcmVhXCI9PT1hfHxcIm9wdGlvblwiPT09YXx8XCJub3NjcmlwdFwiPT09YXx8XCJzdHJpbmdcIj09PXR5cGVvZiBiLmNoaWxkcmVufHxcIm51bWJlclwiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwib2JqZWN0XCI9PT10eXBlb2YgYi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9PWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJm51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sfXZhciBvZj1cImZ1bmN0aW9uXCI9PT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OnZvaWQgMCxwZj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDp2b2lkIDA7ZnVuY3Rpb24gcWYoYSl7MT09PWEubm9kZVR5cGU/YS50ZXh0Q29udGVudD1cIlwiOjk9PT1hLm5vZGVUeXBlJiYoYT1hLmJvZHksbnVsbCE9YSYmKGEudGV4dENvbnRlbnQ9XCJcIikpfVxuZnVuY3Rpb24gcmYoYSl7Zm9yKDtudWxsIT1hO2E9YS5uZXh0U2libGluZyl7dmFyIGI9YS5ub2RlVHlwZTtpZigxPT09Ynx8Mz09PWIpYnJlYWt9cmV0dXJuIGF9ZnVuY3Rpb24gc2YoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIiRcIj09PWN8fFwiJCFcIj09PWN8fFwiJD9cIj09PWMpe2lmKDA9PT1iKXJldHVybiBhO2ItLX1lbHNlXCIvJFwiPT09YyYmYisrfWE9YS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIHRmPTA7ZnVuY3Rpb24gdWYoYSl7cmV0dXJueyQkdHlwZW9mOkdhLHRvU3RyaW5nOmEsdmFsdWVPZjphfX12YXIgdmY9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksd2Y9XCJfX3JlYWN0RmliZXIkXCIrdmYseGY9XCJfX3JlYWN0UHJvcHMkXCIrdmYsZmY9XCJfX3JlYWN0Q29udGFpbmVyJFwiK3ZmLHlmPVwiX19yZWFjdEV2ZW50cyRcIit2ZjtcbmZ1bmN0aW9uIHdjKGEpe3ZhciBiPWFbd2ZdO2lmKGIpcmV0dXJuIGI7Zm9yKHZhciBjPWEucGFyZW50Tm9kZTtjOyl7aWYoYj1jW2ZmXXx8Y1t3Zl0pe2M9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWIuY2hpbGR8fG51bGwhPT1jJiZudWxsIT09Yy5jaGlsZClmb3IoYT1zZihhKTtudWxsIT09YTspe2lmKGM9YVt3Zl0pcmV0dXJuIGM7YT1zZihhKX1yZXR1cm4gYn1hPWM7Yz1hLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQ2IoYSl7YT1hW3dmXXx8YVtmZl07cmV0dXJuIWF8fDUhPT1hLnRhZyYmNiE9PWEudGFnJiYxMyE9PWEudGFnJiYzIT09YS50YWc/bnVsbDphfWZ1bmN0aW9uIHVlKGEpe2lmKDU9PT1hLnRhZ3x8Nj09PWEudGFnKXJldHVybiBhLnN0YXRlTm9kZTt0aHJvdyBFcnJvcih5KDMzKSk7fWZ1bmN0aW9uIERiKGEpe3JldHVybiBhW3hmXXx8bnVsbH1cbmZ1bmN0aW9uICRlKGEpe3ZhciBiPWFbeWZdO3ZvaWQgMD09PWImJihiPWFbeWZdPW5ldyBTZXQpO3JldHVybiBifXZhciB6Zj1bXSxBZj0tMTtmdW5jdGlvbiBCZihhKXtyZXR1cm57Y3VycmVudDphfX1mdW5jdGlvbiBIKGEpezA+QWZ8fChhLmN1cnJlbnQ9emZbQWZdLHpmW0FmXT1udWxsLEFmLS0pfWZ1bmN0aW9uIEkoYSxiKXtBZisrO3pmW0FmXT1hLmN1cnJlbnQ7YS5jdXJyZW50PWJ9dmFyIENmPXt9LE09QmYoQ2YpLE49QmYoITEpLERmPUNmO1xuZnVuY3Rpb24gRWYoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBDZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1mdW5jdGlvbiBGZihhKXthPWEuY2hpbGRDb250ZXh0VHlwZXM7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hfWZ1bmN0aW9uIEdmKCl7SChOKTtIKE0pfWZ1bmN0aW9uIEhmKGEsYixjKXtpZihNLmN1cnJlbnQhPT1DZil0aHJvdyBFcnJvcih5KDE2OCkpO0koTSxiKTtJKE4sYyl9XG5mdW5jdGlvbiBJZihhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7YT1iLmNoaWxkQ29udGV4dFR5cGVzO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBkLmdldENoaWxkQ29udGV4dClyZXR1cm4gYztkPWQuZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBlIGluIGQpaWYoIShlIGluIGEpKXRocm93IEVycm9yKHkoMTA4LFJhKGIpfHxcIlVua25vd25cIixlKSk7cmV0dXJuIG0oe30sYyxkKX1mdW5jdGlvbiBKZihhKXthPShhPWEuc3RhdGVOb2RlKSYmYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8Q2Y7RGY9TS5jdXJyZW50O0koTSxhKTtJKE4sTi5jdXJyZW50KTtyZXR1cm4hMH1mdW5jdGlvbiBLZihhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoIWQpdGhyb3cgRXJyb3IoeSgxNjkpKTtjPyhhPUlmKGEsYixEZiksZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1hLEgoTiksSChNKSxJKE0sYSkpOkgoTik7SShOLGMpfVxudmFyIExmPW51bGwsTWY9bnVsbCxOZj1yLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxPZj1yLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssUGY9ci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxRZj1yLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFJmPXIudW5zdGFibGVfcmVxdWVzdFBhaW50LFNmPXIudW5zdGFibGVfbm93LFRmPXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsVWY9ci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxWZj1yLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LFdmPXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksWGY9ci51bnN0YWJsZV9Mb3dQcmlvcml0eSxZZj1yLnVuc3RhYmxlX0lkbGVQcmlvcml0eSxaZj17fSwkZj12b2lkIDAhPT1SZj9SZjpmdW5jdGlvbigpe30sYWc9bnVsbCxiZz1udWxsLGNnPSExLGRnPVNmKCksTz0xRTQ+ZGc/U2Y6ZnVuY3Rpb24oKXtyZXR1cm4gU2YoKS1kZ307XG5mdW5jdGlvbiBlZygpe3N3aXRjaChUZigpKXtjYXNlIFVmOnJldHVybiA5OTtjYXNlIFZmOnJldHVybiA5ODtjYXNlIFdmOnJldHVybiA5NztjYXNlIFhmOnJldHVybiA5NjtjYXNlIFlmOnJldHVybiA5NTtkZWZhdWx0OnRocm93IEVycm9yKHkoMzMyKSk7fX1mdW5jdGlvbiBmZyhhKXtzd2l0Y2goYSl7Y2FzZSA5OTpyZXR1cm4gVWY7Y2FzZSA5ODpyZXR1cm4gVmY7Y2FzZSA5NzpyZXR1cm4gV2Y7Y2FzZSA5NjpyZXR1cm4gWGY7Y2FzZSA5NTpyZXR1cm4gWWY7ZGVmYXVsdDp0aHJvdyBFcnJvcih5KDMzMikpO319ZnVuY3Rpb24gZ2coYSxiKXthPWZnKGEpO3JldHVybiBOZihhLGIpfWZ1bmN0aW9uIGhnKGEsYixjKXthPWZnKGEpO3JldHVybiBPZihhLGIsYyl9ZnVuY3Rpb24gaWcoKXtpZihudWxsIT09Ymcpe3ZhciBhPWJnO2JnPW51bGw7UGYoYSl9amcoKX1cbmZ1bmN0aW9uIGpnKCl7aWYoIWNnJiZudWxsIT09YWcpe2NnPSEwO3ZhciBhPTA7dHJ5e3ZhciBiPWFnO2dnKDk5LGZ1bmN0aW9uKCl7Zm9yKDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9YlthXTtkbyBjPWMoITApO3doaWxlKG51bGwhPT1jKX19KTthZz1udWxsfWNhdGNoKGMpe3Rocm93IG51bGwhPT1hZyYmKGFnPWFnLnNsaWNlKGErMSkpLE9mKFVmLGlnKSxjO31maW5hbGx5e2NnPSExfX19dmFyIGtnPXJhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIGxnKGEsYil7aWYoYSYmYS5kZWZhdWx0UHJvcHMpe2I9bSh7fSxiKTthPWEuZGVmYXVsdFByb3BzO2Zvcih2YXIgYyBpbiBhKXZvaWQgMD09PWJbY10mJihiW2NdPWFbY10pO3JldHVybiBifXJldHVybiBifXZhciBtZz1CZihudWxsKSxuZz1udWxsLG9nPW51bGwscGc9bnVsbDtmdW5jdGlvbiBxZygpe3BnPW9nPW5nPW51bGx9XG5mdW5jdGlvbiByZyhhKXt2YXIgYj1tZy5jdXJyZW50O0gobWcpO2EudHlwZS5fY29udGV4dC5fY3VycmVudFZhbHVlPWJ9ZnVuY3Rpb24gc2coYSxiKXtmb3IoO251bGwhPT1hOyl7dmFyIGM9YS5hbHRlcm5hdGU7aWYoKGEuY2hpbGRMYW5lcyZiKT09PWIpaWYobnVsbD09PWN8fChjLmNoaWxkTGFuZXMmYik9PT1iKWJyZWFrO2Vsc2UgYy5jaGlsZExhbmVzfD1iO2Vsc2UgYS5jaGlsZExhbmVzfD1iLG51bGwhPT1jJiYoYy5jaGlsZExhbmVzfD1iKTthPWEucmV0dXJufX1mdW5jdGlvbiB0ZyhhLGIpe25nPWE7cGc9b2c9bnVsbDthPWEuZGVwZW5kZW5jaWVzO251bGwhPT1hJiZudWxsIT09YS5maXJzdENvbnRleHQmJigwIT09KGEubGFuZXMmYikmJih1Zz0hMCksYS5maXJzdENvbnRleHQ9bnVsbCl9XG5mdW5jdGlvbiB2ZyhhLGIpe2lmKHBnIT09YSYmITEhPT1iJiYwIT09Yil7aWYoXCJudW1iZXJcIiE9PXR5cGVvZiBifHwxMDczNzQxODIzPT09YilwZz1hLGI9MTA3Mzc0MTgyMztiPXtjb250ZXh0OmEsb2JzZXJ2ZWRCaXRzOmIsbmV4dDpudWxsfTtpZihudWxsPT09b2cpe2lmKG51bGw9PT1uZyl0aHJvdyBFcnJvcih5KDMwOCkpO29nPWI7bmcuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDpiLHJlc3BvbmRlcnM6bnVsbH19ZWxzZSBvZz1vZy5uZXh0PWJ9cmV0dXJuIGEuX2N1cnJlbnRWYWx1ZX12YXIgd2c9ITE7ZnVuY3Rpb24geGcoYSl7YS51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmEubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsfSxlZmZlY3RzOm51bGx9fVxuZnVuY3Rpb24geWcoYSxiKXthPWEudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT09PWEmJihiLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmEuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmEubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmEuc2hhcmVkLGVmZmVjdHM6YS5lZmZlY3RzfSl9ZnVuY3Rpb24gemcoYSxiKXtyZXR1cm57ZXZlbnRUaW1lOmEsbGFuZTpiLHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24gQWcoYSxiKXthPWEudXBkYXRlUXVldWU7aWYobnVsbCE9PWEpe2E9YS5zaGFyZWQ7dmFyIGM9YS5wZW5kaW5nO251bGw9PT1jP2IubmV4dD1iOihiLm5leHQ9Yy5uZXh0LGMubmV4dD1iKTthLnBlbmRpbmc9Yn19XG5mdW5jdGlvbiBCZyhhLGIpe3ZhciBjPWEudXBkYXRlUXVldWUsZD1hLmFsdGVybmF0ZTtpZihudWxsIT09ZCYmKGQ9ZC51cGRhdGVRdWV1ZSxjPT09ZCkpe3ZhciBlPW51bGwsZj1udWxsO2M9Yy5maXJzdEJhc2VVcGRhdGU7aWYobnVsbCE9PWMpe2Rve3ZhciBnPXtldmVudFRpbWU6Yy5ldmVudFRpbWUsbGFuZTpjLmxhbmUsdGFnOmMudGFnLHBheWxvYWQ6Yy5wYXlsb2FkLGNhbGxiYWNrOmMuY2FsbGJhY2ssbmV4dDpudWxsfTtudWxsPT09Zj9lPWY9ZzpmPWYubmV4dD1nO2M9Yy5uZXh0fXdoaWxlKG51bGwhPT1jKTtudWxsPT09Zj9lPWY9YjpmPWYubmV4dD1ifWVsc2UgZT1mPWI7Yz17YmFzZVN0YXRlOmQuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLGxhc3RCYXNlVXBkYXRlOmYsc2hhcmVkOmQuc2hhcmVkLGVmZmVjdHM6ZC5lZmZlY3RzfTthLnVwZGF0ZVF1ZXVlPWM7cmV0dXJufWE9Yy5sYXN0QmFzZVVwZGF0ZTtudWxsPT09YT9jLmZpcnN0QmFzZVVwZGF0ZT1iOmEubmV4dD1cbmI7Yy5sYXN0QmFzZVVwZGF0ZT1ifVxuZnVuY3Rpb24gQ2coYSxiLGMsZCl7dmFyIGU9YS51cGRhdGVRdWV1ZTt3Zz0hMTt2YXIgZj1lLmZpcnN0QmFzZVVwZGF0ZSxnPWUubGFzdEJhc2VVcGRhdGUsaD1lLnNoYXJlZC5wZW5kaW5nO2lmKG51bGwhPT1oKXtlLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGs9aCxsPWsubmV4dDtrLm5leHQ9bnVsbDtudWxsPT09Zz9mPWw6Zy5uZXh0PWw7Zz1rO3ZhciBuPWEuYWx0ZXJuYXRlO2lmKG51bGwhPT1uKXtuPW4udXBkYXRlUXVldWU7dmFyIEE9bi5sYXN0QmFzZVVwZGF0ZTtBIT09ZyYmKG51bGw9PT1BP24uZmlyc3RCYXNlVXBkYXRlPWw6QS5uZXh0PWwsbi5sYXN0QmFzZVVwZGF0ZT1rKX19aWYobnVsbCE9PWYpe0E9ZS5iYXNlU3RhdGU7Zz0wO249bD1rPW51bGw7ZG97aD1mLmxhbmU7dmFyIHA9Zi5ldmVudFRpbWU7aWYoKGQmaCk9PT1oKXtudWxsIT09biYmKG49bi5uZXh0PXtldmVudFRpbWU6cCxsYW5lOjAsdGFnOmYudGFnLHBheWxvYWQ6Zi5wYXlsb2FkLGNhbGxiYWNrOmYuY2FsbGJhY2ssXG5uZXh0Om51bGx9KTthOnt2YXIgQz1hLHg9ZjtoPWI7cD1jO3N3aXRjaCh4LnRhZyl7Y2FzZSAxOkM9eC5wYXlsb2FkO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBDKXtBPUMuY2FsbChwLEEsaCk7YnJlYWsgYX1BPUM7YnJlYWsgYTtjYXNlIDM6Qy5mbGFncz1DLmZsYWdzJi00MDk3fDY0O2Nhc2UgMDpDPXgucGF5bG9hZDtoPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBDP0MuY2FsbChwLEEsaCk6QztpZihudWxsPT09aHx8dm9pZCAwPT09aClicmVhayBhO0E9bSh7fSxBLGgpO2JyZWFrIGE7Y2FzZSAyOndnPSEwfX1udWxsIT09Zi5jYWxsYmFjayYmKGEuZmxhZ3N8PTMyLGg9ZS5lZmZlY3RzLG51bGw9PT1oP2UuZWZmZWN0cz1bZl06aC5wdXNoKGYpKX1lbHNlIHA9e2V2ZW50VGltZTpwLGxhbmU6aCx0YWc6Zi50YWcscGF5bG9hZDpmLnBheWxvYWQsY2FsbGJhY2s6Zi5jYWxsYmFjayxuZXh0Om51bGx9LG51bGw9PT1uPyhsPW49cCxrPUEpOm49bi5uZXh0PXAsZ3w9aDtmPWYubmV4dDtpZihudWxsPT09XG5mKWlmKGg9ZS5zaGFyZWQucGVuZGluZyxudWxsPT09aClicmVhaztlbHNlIGY9aC5uZXh0LGgubmV4dD1udWxsLGUubGFzdEJhc2VVcGRhdGU9aCxlLnNoYXJlZC5wZW5kaW5nPW51bGx9d2hpbGUoMSk7bnVsbD09PW4mJihrPUEpO2UuYmFzZVN0YXRlPWs7ZS5maXJzdEJhc2VVcGRhdGU9bDtlLmxhc3RCYXNlVXBkYXRlPW47RGd8PWc7YS5sYW5lcz1nO2EubWVtb2l6ZWRTdGF0ZT1BfX1mdW5jdGlvbiBFZyhhLGIsYyl7YT1iLmVmZmVjdHM7Yi5lZmZlY3RzPW51bGw7aWYobnVsbCE9PWEpZm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXSxlPWQuY2FsbGJhY2s7aWYobnVsbCE9PWUpe2QuY2FsbGJhY2s9bnVsbDtkPWM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGUpdGhyb3cgRXJyb3IoeSgxOTEsZSkpO2UuY2FsbChkKX19fXZhciBGZz0obmV3IGFhLkNvbXBvbmVudCkucmVmcztcbmZ1bmN0aW9uIEdnKGEsYixjLGQpe2I9YS5tZW1vaXplZFN0YXRlO2M9YyhkLGIpO2M9bnVsbD09PWN8fHZvaWQgMD09PWM/YjptKHt9LGIsYyk7YS5tZW1vaXplZFN0YXRlPWM7MD09PWEubGFuZXMmJihhLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1jKX1cbnZhciBLZz17aXNNb3VudGVkOmZ1bmN0aW9uKGEpe3JldHVybihhPWEuX3JlYWN0SW50ZXJuYWxzKT9aYihhKT09PWE6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsczt2YXIgZD1IZygpLGU9SWcoYSksZj16ZyhkLGUpO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtBZyhhLGYpO0pnKGEsZSxkKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsczt2YXIgZD1IZygpLGU9SWcoYSksZj16ZyhkLGUpO2YudGFnPTE7Zi5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihmLmNhbGxiYWNrPWMpO0FnKGEsZik7SmcoYSxlLGQpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oYSxiKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBjPUhnKCksZD1JZyhhKSxlPXpnKGMsZCk7ZS50YWc9Mjt2b2lkIDAhPT1iJiZudWxsIT09YiYmKGUuY2FsbGJhY2s9XG5iKTtBZyhhLGUpO0pnKGEsZCxjKX19O2Z1bmN0aW9uIExnKGEsYixjLGQsZSxmLGcpe2E9YS5zdGF0ZU5vZGU7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGEuc2hvdWxkQ29tcG9uZW50VXBkYXRlP2Euc2hvdWxkQ29tcG9uZW50VXBkYXRlKGQsZixnKTpiLnByb3RvdHlwZSYmYi5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IUplKGMsZCl8fCFKZShlLGYpOiEwfVxuZnVuY3Rpb24gTWcoYSxiLGMpe3ZhciBkPSExLGU9Q2Y7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2Y9dmcoZik6KGU9RmYoYik/RGY6TS5jdXJyZW50LGQ9Yi5jb250ZXh0VHlwZXMsZj0oZD1udWxsIT09ZCYmdm9pZCAwIT09ZCk/RWYoYSxlKTpDZik7Yj1uZXcgYihjLGYpO2EubWVtb2l6ZWRTdGF0ZT1udWxsIT09Yi5zdGF0ZSYmdm9pZCAwIT09Yi5zdGF0ZT9iLnN0YXRlOm51bGw7Yi51cGRhdGVyPUtnO2Euc3RhdGVOb2RlPWI7Yi5fcmVhY3RJbnRlcm5hbHM9YTtkJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9ZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWYpO3JldHVybiBifVxuZnVuY3Rpb24gTmcoYSxiLGMsZCl7YT1iLnN0YXRlO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7Yi5zdGF0ZSE9PWEmJktnLmVucXVldWVSZXBsYWNlU3RhdGUoYixiLnN0YXRlLG51bGwpfVxuZnVuY3Rpb24gT2coYSxiLGMsZCl7dmFyIGU9YS5zdGF0ZU5vZGU7ZS5wcm9wcz1jO2Uuc3RhdGU9YS5tZW1vaXplZFN0YXRlO2UucmVmcz1GZzt4ZyhhKTt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/ZS5jb250ZXh0PXZnKGYpOihmPUZmKGIpP0RmOk0uY3VycmVudCxlLmNvbnRleHQ9RWYoYSxmKSk7Q2coYSxjLGUsZCk7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7Zj1iLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZiYmKEdnKGEsYixmLGMpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHN8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnR8fFxuKGI9ZS5zdGF0ZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnQmJmUuY29tcG9uZW50V2lsbE1vdW50KCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksYiE9PWUuc3RhdGUmJktnLmVucXVldWVSZXBsYWNlU3RhdGUoZSxlLnN0YXRlLG51bGwpLENnKGEsYyxlLGQpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnREaWRNb3VudCYmKGEuZmxhZ3N8PTQpfXZhciBQZz1BcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gUWcoYSxiLGMpe2E9Yy5yZWY7aWYobnVsbCE9PWEmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiZcIm9iamVjdFwiIT09dHlwZW9mIGEpe2lmKGMuX293bmVyKXtjPWMuX293bmVyO2lmKGMpe2lmKDEhPT1jLnRhZyl0aHJvdyBFcnJvcih5KDMwOSkpO3ZhciBkPWMuc3RhdGVOb2RlfWlmKCFkKXRocm93IEVycm9yKHkoMTQ3LGEpKTt2YXIgZT1cIlwiK2E7aWYobnVsbCE9PWImJm51bGwhPT1iLnJlZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIucmVmJiZiLnJlZi5fc3RyaW5nUmVmPT09ZSlyZXR1cm4gYi5yZWY7Yj1mdW5jdGlvbihhKXt2YXIgYj1kLnJlZnM7Yj09PUZnJiYoYj1kLnJlZnM9e30pO251bGw9PT1hP2RlbGV0ZSBiW2VdOmJbZV09YX07Yi5fc3RyaW5nUmVmPWU7cmV0dXJuIGJ9aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKXRocm93IEVycm9yKHkoMjg0KSk7aWYoIWMuX293bmVyKXRocm93IEVycm9yKHkoMjkwLGEpKTt9cmV0dXJuIGF9XG5mdW5jdGlvbiBSZyhhLGIpe2lmKFwidGV4dGFyZWFcIiE9PWEudHlwZSl0aHJvdyBFcnJvcih5KDMxLFwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhiKS5qb2luKFwiLCBcIikrXCJ9XCI6YikpO31cbmZ1bmN0aW9uIFNnKGEpe2Z1bmN0aW9uIGIoYixjKXtpZihhKXt2YXIgZD1iLmxhc3RFZmZlY3Q7bnVsbCE9PWQ/KGQubmV4dEVmZmVjdD1jLGIubGFzdEVmZmVjdD1jKTpiLmZpcnN0RWZmZWN0PWIubGFzdEVmZmVjdD1jO2MubmV4dEVmZmVjdD1udWxsO2MuZmxhZ3M9OH19ZnVuY3Rpb24gYyhjLGQpe2lmKCFhKXJldHVybiBudWxsO2Zvcig7bnVsbCE9PWQ7KWIoYyxkKSxkPWQuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiBkKGEsYil7Zm9yKGE9bmV3IE1hcDtudWxsIT09YjspbnVsbCE9PWIua2V5P2Euc2V0KGIua2V5LGIpOmEuc2V0KGIuaW5kZXgsYiksYj1iLnNpYmxpbmc7cmV0dXJuIGF9ZnVuY3Rpb24gZShhLGIpe2E9VGcoYSxiKTthLmluZGV4PTA7YS5zaWJsaW5nPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gZihiLGMsZCl7Yi5pbmRleD1kO2lmKCFhKXJldHVybiBjO2Q9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWQpcmV0dXJuIGQ9ZC5pbmRleCxkPGM/KGIuZmxhZ3M9MixcbmMpOmQ7Yi5mbGFncz0yO3JldHVybiBjfWZ1bmN0aW9uIGcoYil7YSYmbnVsbD09PWIuYWx0ZXJuYXRlJiYoYi5mbGFncz0yKTtyZXR1cm4gYn1mdW5jdGlvbiBoKGEsYixjLGQpe2lmKG51bGw9PT1ifHw2IT09Yi50YWcpcmV0dXJuIGI9VWcoYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhLGIsYyxkKXtpZihudWxsIT09YiYmYi5lbGVtZW50VHlwZT09PWMudHlwZSlyZXR1cm4gZD1lKGIsYy5wcm9wcyksZC5yZWY9UWcoYSxiLGMpLGQucmV0dXJuPWEsZDtkPVZnKGMudHlwZSxjLmtleSxjLnByb3BzLG51bGwsYS5tb2RlLGQpO2QucmVmPVFnKGEsYixjKTtkLnJldHVybj1hO3JldHVybiBkfWZ1bmN0aW9uIGwoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDQhPT1iLnRhZ3x8Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PWMuY29udGFpbmVySW5mb3x8Yi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1jLmltcGxlbWVudGF0aW9uKXJldHVybiBiPVxuV2coYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMuY2hpbGRyZW58fFtdKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIG4oYSxiLGMsZCxmKXtpZihudWxsPT09Ynx8NyE9PWIudGFnKXJldHVybiBiPVhnKGMsYS5tb2RlLGQsZiksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gQShhLGIsYyl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBifHxcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI9VWcoXCJcIitiLGEubW9kZSxjKSxiLnJldHVybj1hLGI7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBiJiZudWxsIT09Yil7c3dpdGNoKGIuJCR0eXBlb2Ype2Nhc2Ugc2E6cmV0dXJuIGM9VmcoYi50eXBlLGIua2V5LGIucHJvcHMsbnVsbCxhLm1vZGUsYyksYy5yZWY9UWcoYSxudWxsLGIpLGMucmV0dXJuPWEsYztjYXNlIHRhOnJldHVybiBiPVdnKGIsYS5tb2RlLGMpLGIucmV0dXJuPWEsYn1pZihQZyhiKXx8TGEoYikpcmV0dXJuIGI9WGcoYixcbmEubW9kZSxjLG51bGwpLGIucmV0dXJuPWEsYjtSZyhhLGIpfXJldHVybiBudWxsfWZ1bmN0aW9uIHAoYSxiLGMsZCl7dmFyIGU9bnVsbCE9PWI/Yi5rZXk6bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGN8fFwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbnVsbCE9PWU/bnVsbDpoKGEsYixcIlwiK2MsZCk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yyl7c3dpdGNoKGMuJCR0eXBlb2Ype2Nhc2Ugc2E6cmV0dXJuIGMua2V5PT09ZT9jLnR5cGU9PT11YT9uKGEsYixjLnByb3BzLmNoaWxkcmVuLGQsZSk6ayhhLGIsYyxkKTpudWxsO2Nhc2UgdGE6cmV0dXJuIGMua2V5PT09ZT9sKGEsYixjLGQpOm51bGx9aWYoUGcoYyl8fExhKGMpKXJldHVybiBudWxsIT09ZT9udWxsOm4oYSxiLGMsZCxudWxsKTtSZyhhLGMpfXJldHVybiBudWxsfWZ1bmN0aW9uIEMoYSxiLGMsZCxlKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGR8fFwibnVtYmVyXCI9PT10eXBlb2YgZClyZXR1cm4gYT1hLmdldChjKXx8XG5udWxsLGgoYixhLFwiXCIrZCxlKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGQmJm51bGwhPT1kKXtzd2l0Y2goZC4kJHR5cGVvZil7Y2FzZSBzYTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsZC50eXBlPT09dWE/bihiLGEsZC5wcm9wcy5jaGlsZHJlbixlLGQua2V5KTprKGIsYSxkLGUpO2Nhc2UgdGE6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGwoYixhLGQsZSl9aWYoUGcoZCl8fExhKGQpKXJldHVybiBhPWEuZ2V0KGMpfHxudWxsLG4oYixhLGQsZSxudWxsKTtSZyhiLGQpfXJldHVybiBudWxsfWZ1bmN0aW9uIHgoZSxnLGgsayl7Zm9yKHZhciBsPW51bGwsdD1udWxsLHU9Zyx6PWc9MCxxPW51bGw7bnVsbCE9PXUmJno8aC5sZW5ndGg7eisrKXt1LmluZGV4Pno/KHE9dSx1PW51bGwpOnE9dS5zaWJsaW5nO3ZhciBuPXAoZSx1LGhbel0sayk7aWYobnVsbD09PW4pe251bGw9PT11JiYodT1xKTticmVha31hJiZ1JiZudWxsPT09XG5uLmFsdGVybmF0ZSYmYihlLHUpO2c9ZihuLGcseik7bnVsbD09PXQ/bD1uOnQuc2libGluZz1uO3Q9bjt1PXF9aWYoej09PWgubGVuZ3RoKXJldHVybiBjKGUsdSksbDtpZihudWxsPT09dSl7Zm9yKDt6PGgubGVuZ3RoO3orKyl1PUEoZSxoW3pdLGspLG51bGwhPT11JiYoZz1mKHUsZyx6KSxudWxsPT09dD9sPXU6dC5zaWJsaW5nPXUsdD11KTtyZXR1cm4gbH1mb3IodT1kKGUsdSk7ejxoLmxlbmd0aDt6KyspcT1DKHUsZSx6LGhbel0sayksbnVsbCE9PXEmJihhJiZudWxsIT09cS5hbHRlcm5hdGUmJnUuZGVsZXRlKG51bGw9PT1xLmtleT96OnEua2V5KSxnPWYocSxnLHopLG51bGw9PT10P2w9cTp0LnNpYmxpbmc9cSx0PXEpO2EmJnUuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7cmV0dXJuIGx9ZnVuY3Rpb24gdyhlLGcsaCxrKXt2YXIgbD1MYShoKTtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgbCl0aHJvdyBFcnJvcih5KDE1MCkpO2g9bC5jYWxsKGgpO2lmKG51bGw9PVxuaCl0aHJvdyBFcnJvcih5KDE1MSkpO2Zvcih2YXIgdD1sPW51bGwsdT1nLHo9Zz0wLHE9bnVsbCxuPWgubmV4dCgpO251bGwhPT11JiYhbi5kb25lO3orKyxuPWgubmV4dCgpKXt1LmluZGV4Pno/KHE9dSx1PW51bGwpOnE9dS5zaWJsaW5nO3ZhciB3PXAoZSx1LG4udmFsdWUsayk7aWYobnVsbD09PXcpe251bGw9PT11JiYodT1xKTticmVha31hJiZ1JiZudWxsPT09dy5hbHRlcm5hdGUmJmIoZSx1KTtnPWYodyxnLHopO251bGw9PT10P2w9dzp0LnNpYmxpbmc9dzt0PXc7dT1xfWlmKG4uZG9uZSlyZXR1cm4gYyhlLHUpLGw7aWYobnVsbD09PXUpe2Zvcig7IW4uZG9uZTt6Kyssbj1oLm5leHQoKSluPUEoZSxuLnZhbHVlLGspLG51bGwhPT1uJiYoZz1mKG4sZyx6KSxudWxsPT09dD9sPW46dC5zaWJsaW5nPW4sdD1uKTtyZXR1cm4gbH1mb3IodT1kKGUsdSk7IW4uZG9uZTt6Kyssbj1oLm5leHQoKSluPUModSxlLHosbi52YWx1ZSxrKSxudWxsIT09biYmKGEmJm51bGwhPT1uLmFsdGVybmF0ZSYmXG51LmRlbGV0ZShudWxsPT09bi5rZXk/ejpuLmtleSksZz1mKG4sZyx6KSxudWxsPT09dD9sPW46dC5zaWJsaW5nPW4sdD1uKTthJiZ1LmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIoZSxhKX0pO3JldHVybiBsfXJldHVybiBmdW5jdGlvbihhLGQsZixoKXt2YXIgaz1cIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mJiZmLnR5cGU9PT11YSYmbnVsbD09PWYua2V5O2smJihmPWYucHJvcHMuY2hpbGRyZW4pO3ZhciBsPVwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY7aWYobClzd2l0Y2goZi4kJHR5cGVvZil7Y2FzZSBzYTphOntsPWYua2V5O2ZvcihrPWQ7bnVsbCE9PWs7KXtpZihrLmtleT09PWwpe3N3aXRjaChrLnRhZyl7Y2FzZSA3OmlmKGYudHlwZT09PXVhKXtjKGEsay5zaWJsaW5nKTtkPWUoayxmLnByb3BzLmNoaWxkcmVuKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWJyZWFrO2RlZmF1bHQ6aWYoay5lbGVtZW50VHlwZT09PWYudHlwZSl7YyhhLGsuc2libGluZyk7XG5kPWUoayxmLnByb3BzKTtkLnJlZj1RZyhhLGssZik7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX19YyhhLGspO2JyZWFrfWVsc2UgYihhLGspO2s9ay5zaWJsaW5nfWYudHlwZT09PXVhPyhkPVhnKGYucHJvcHMuY2hpbGRyZW4sYS5tb2RlLGgsZi5rZXkpLGQucmV0dXJuPWEsYT1kKTooaD1WZyhmLnR5cGUsZi5rZXksZi5wcm9wcyxudWxsLGEubW9kZSxoKSxoLnJlZj1RZyhhLGQsZiksaC5yZXR1cm49YSxhPWgpfXJldHVybiBnKGEpO2Nhc2UgdGE6YTp7Zm9yKGs9Zi5rZXk7bnVsbCE9PWQ7KXtpZihkLmtleT09PWspaWYoND09PWQudGFnJiZkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09Zi5jb250YWluZXJJbmZvJiZkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbj09PWYuaW1wbGVtZW50YXRpb24pe2MoYSxkLnNpYmxpbmcpO2Q9ZShkLGYuY2hpbGRyZW58fFtdKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWVsc2V7YyhhLGQpO2JyZWFrfWVsc2UgYihhLGQpO2Q9ZC5zaWJsaW5nfWQ9XG5XZyhmLGEubW9kZSxoKTtkLnJldHVybj1hO2E9ZH1yZXR1cm4gZyhhKX1pZihcInN0cmluZ1wiPT09dHlwZW9mIGZ8fFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZj1cIlwiK2YsbnVsbCE9PWQmJjY9PT1kLnRhZz8oYyhhLGQuc2libGluZyksZD1lKGQsZiksZC5yZXR1cm49YSxhPWQpOihjKGEsZCksZD1VZyhmLGEubW9kZSxoKSxkLnJldHVybj1hLGE9ZCksZyhhKTtpZihQZyhmKSlyZXR1cm4geChhLGQsZixoKTtpZihMYShmKSlyZXR1cm4gdyhhLGQsZixoKTtsJiZSZyhhLGYpO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgZiYmIWspc3dpdGNoKGEudGFnKXtjYXNlIDE6Y2FzZSAyMjpjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnRocm93IEVycm9yKHkoMTUyLFJhKGEudHlwZSl8fFwiQ29tcG9uZW50XCIpKTt9cmV0dXJuIGMoYSxkKX19dmFyIFlnPVNnKCEwKSxaZz1TZyghMSksJGc9e30sYWg9QmYoJGcpLGJoPUJmKCRnKSxjaD1CZigkZyk7XG5mdW5jdGlvbiBkaChhKXtpZihhPT09JGcpdGhyb3cgRXJyb3IoeSgxNzQpKTtyZXR1cm4gYX1mdW5jdGlvbiBlaChhLGIpe0koY2gsYik7SShiaCxhKTtJKGFoLCRnKTthPWIubm9kZVR5cGU7c3dpdGNoKGEpe2Nhc2UgOTpjYXNlIDExOmI9KGI9Yi5kb2N1bWVudEVsZW1lbnQpP2IubmFtZXNwYWNlVVJJOm1iKG51bGwsXCJcIik7YnJlYWs7ZGVmYXVsdDphPTg9PT1hP2IucGFyZW50Tm9kZTpiLGI9YS5uYW1lc3BhY2VVUkl8fG51bGwsYT1hLnRhZ05hbWUsYj1tYihiLGEpfUgoYWgpO0koYWgsYil9ZnVuY3Rpb24gZmgoKXtIKGFoKTtIKGJoKTtIKGNoKX1mdW5jdGlvbiBnaChhKXtkaChjaC5jdXJyZW50KTt2YXIgYj1kaChhaC5jdXJyZW50KTt2YXIgYz1tYihiLGEudHlwZSk7YiE9PWMmJihJKGJoLGEpLEkoYWgsYykpfWZ1bmN0aW9uIGhoKGEpe2JoLmN1cnJlbnQ9PT1hJiYoSChhaCksSChiaCkpfXZhciBQPUJmKDApO1xuZnVuY3Rpb24gaWgoYSl7Zm9yKHZhciBiPWE7bnVsbCE9PWI7KXtpZigxMz09PWIudGFnKXt2YXIgYz1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWMmJihjPWMuZGVoeWRyYXRlZCxudWxsPT09Y3x8XCIkP1wiPT09Yy5kYXRhfHxcIiQhXCI9PT1jLmRhdGEpKXJldHVybiBifWVsc2UgaWYoMTk9PT1iLnRhZyYmdm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyKXtpZigwIT09KGIuZmxhZ3MmNjQpKXJldHVybiBifWVsc2UgaWYobnVsbCE9PWIuY2hpbGQpe2IuY2hpbGQucmV0dXJuPWI7Yj1iLmNoaWxkO2NvbnRpbnVlfWlmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ31yZXR1cm4gbnVsbH12YXIgamg9bnVsbCxraD1udWxsLGxoPSExO1xuZnVuY3Rpb24gbWgoYSxiKXt2YXIgYz1uaCg1LG51bGwsbnVsbCwwKTtjLmVsZW1lbnRUeXBlPVwiREVMRVRFRFwiO2MudHlwZT1cIkRFTEVURURcIjtjLnN0YXRlTm9kZT1iO2MucmV0dXJuPWE7Yy5mbGFncz04O251bGwhPT1hLmxhc3RFZmZlY3Q/KGEubGFzdEVmZmVjdC5uZXh0RWZmZWN0PWMsYS5sYXN0RWZmZWN0PWMpOmEuZmlyc3RFZmZlY3Q9YS5sYXN0RWZmZWN0PWN9ZnVuY3Rpb24gb2goYSxiKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTp2YXIgYz1hLnR5cGU7Yj0xIT09Yi5ub2RlVHlwZXx8Yy50b0xvd2VyQ2FzZSgpIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6YjtyZXR1cm4gbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsITApOiExO2Nhc2UgNjpyZXR1cm4gYj1cIlwiPT09YS5wZW5kaW5nUHJvcHN8fDMhPT1iLm5vZGVUeXBlP251bGw6YixudWxsIT09Yj8oYS5zdGF0ZU5vZGU9YiwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIHBoKGEpe2lmKGxoKXt2YXIgYj1raDtpZihiKXt2YXIgYz1iO2lmKCFvaChhLGIpKXtiPXJmKGMubmV4dFNpYmxpbmcpO2lmKCFifHwhb2goYSxiKSl7YS5mbGFncz1hLmZsYWdzJi0xMDI1fDI7bGg9ITE7amg9YTtyZXR1cm59bWgoamgsYyl9amg9YTtraD1yZihiLmZpcnN0Q2hpbGQpfWVsc2UgYS5mbGFncz1hLmZsYWdzJi0xMDI1fDIsbGg9ITEsamg9YX19ZnVuY3Rpb24gcWgoYSl7Zm9yKGE9YS5yZXR1cm47bnVsbCE9PWEmJjUhPT1hLnRhZyYmMyE9PWEudGFnJiYxMyE9PWEudGFnOylhPWEucmV0dXJuO2poPWF9XG5mdW5jdGlvbiByaChhKXtpZihhIT09amgpcmV0dXJuITE7aWYoIWxoKXJldHVybiBxaChhKSxsaD0hMCwhMTt2YXIgYj1hLnR5cGU7aWYoNSE9PWEudGFnfHxcImhlYWRcIiE9PWImJlwiYm9keVwiIT09YiYmIW5mKGIsYS5tZW1vaXplZFByb3BzKSlmb3IoYj1raDtiOyltaChhLGIpLGI9cmYoYi5uZXh0U2libGluZyk7cWgoYSk7aWYoMTM9PT1hLnRhZyl7YT1hLm1lbW9pemVkU3RhdGU7YT1udWxsIT09YT9hLmRlaHlkcmF0ZWQ6bnVsbDtpZighYSl0aHJvdyBFcnJvcih5KDMxNykpO2E6e2E9YS5uZXh0U2libGluZztmb3IoYj0wO2E7KXtpZig4PT09YS5ub2RlVHlwZSl7dmFyIGM9YS5kYXRhO2lmKFwiLyRcIj09PWMpe2lmKDA9PT1iKXtraD1yZihhLm5leHRTaWJsaW5nKTticmVhayBhfWItLX1lbHNlXCIkXCIhPT1jJiZcIiQhXCIhPT1jJiZcIiQ/XCIhPT1jfHxiKyt9YT1hLm5leHRTaWJsaW5nfWtoPW51bGx9fWVsc2Uga2g9amg/cmYoYS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9XG5mdW5jdGlvbiBzaCgpe2toPWpoPW51bGw7bGg9ITF9dmFyIHRoPVtdO2Z1bmN0aW9uIHVoKCl7Zm9yKHZhciBhPTA7YTx0aC5sZW5ndGg7YSsrKXRoW2FdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7dGgubGVuZ3RoPTB9dmFyIHZoPXJhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsd2g9cmEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcseGg9MCxSPW51bGwsUz1udWxsLFQ9bnVsbCx5aD0hMSx6aD0hMTtmdW5jdGlvbiBBaCgpe3Rocm93IEVycm9yKHkoMzIxKSk7fWZ1bmN0aW9uIEJoKGEsYil7aWYobnVsbD09PWIpcmV0dXJuITE7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aCYmYzxhLmxlbmd0aDtjKyspaWYoIUhlKGFbY10sYltjXSkpcmV0dXJuITE7cmV0dXJuITB9XG5mdW5jdGlvbiBDaChhLGIsYyxkLGUsZil7eGg9ZjtSPWI7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2IubGFuZXM9MDt2aC5jdXJyZW50PW51bGw9PT1hfHxudWxsPT09YS5tZW1vaXplZFN0YXRlP0RoOkVoO2E9YyhkLGUpO2lmKHpoKXtmPTA7ZG97emg9ITE7aWYoISgyNT5mKSl0aHJvdyBFcnJvcih5KDMwMSkpO2YrPTE7VD1TPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO3ZoLmN1cnJlbnQ9Rmg7YT1jKGQsZSl9d2hpbGUoemgpfXZoLmN1cnJlbnQ9R2g7Yj1udWxsIT09UyYmbnVsbCE9PVMubmV4dDt4aD0wO1Q9Uz1SPW51bGw7eWg9ITE7aWYoYil0aHJvdyBFcnJvcih5KDMwMCkpO3JldHVybiBhfWZ1bmN0aW9uIEhoKCl7dmFyIGE9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07bnVsbD09PVQ/Ui5tZW1vaXplZFN0YXRlPVQ9YTpUPVQubmV4dD1hO3JldHVybiBUfVxuZnVuY3Rpb24gSWgoKXtpZihudWxsPT09Uyl7dmFyIGE9Ui5hbHRlcm5hdGU7YT1udWxsIT09YT9hLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGE9Uy5uZXh0O3ZhciBiPW51bGw9PT1UP1IubWVtb2l6ZWRTdGF0ZTpULm5leHQ7aWYobnVsbCE9PWIpVD1iLFM9YTtlbHNle2lmKG51bGw9PT1hKXRocm93IEVycm9yKHkoMzEwKSk7Uz1hO2E9e21lbW9pemVkU3RhdGU6Uy5tZW1vaXplZFN0YXRlLGJhc2VTdGF0ZTpTLmJhc2VTdGF0ZSxiYXNlUXVldWU6Uy5iYXNlUXVldWUscXVldWU6Uy5xdWV1ZSxuZXh0Om51bGx9O251bGw9PT1UP1IubWVtb2l6ZWRTdGF0ZT1UPWE6VD1ULm5leHQ9YX1yZXR1cm4gVH1mdW5jdGlvbiBKaChhLGIpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBiP2IoYSk6Yn1cbmZ1bmN0aW9uIEtoKGEpe3ZhciBiPUloKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHkoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9UyxlPWQuYmFzZVF1ZXVlLGY9Yy5wZW5kaW5nO2lmKG51bGwhPT1mKXtpZihudWxsIT09ZSl7dmFyIGc9ZS5uZXh0O2UubmV4dD1mLm5leHQ7Zi5uZXh0PWd9ZC5iYXNlUXVldWU9ZT1mO2MucGVuZGluZz1udWxsfWlmKG51bGwhPT1lKXtlPWUubmV4dDtkPWQuYmFzZVN0YXRlO3ZhciBoPWc9Zj1udWxsLGs9ZTtkb3t2YXIgbD1rLmxhbmU7aWYoKHhoJmwpPT09bCludWxsIT09aCYmKGg9aC5uZXh0PXtsYW5lOjAsYWN0aW9uOmsuYWN0aW9uLGVhZ2VyUmVkdWNlcjprLmVhZ2VyUmVkdWNlcixlYWdlclN0YXRlOmsuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxkPWsuZWFnZXJSZWR1Y2VyPT09YT9rLmVhZ2VyU3RhdGU6YShkLGsuYWN0aW9uKTtlbHNle3ZhciBuPXtsYW5lOmwsYWN0aW9uOmsuYWN0aW9uLGVhZ2VyUmVkdWNlcjprLmVhZ2VyUmVkdWNlcixcbmVhZ2VyU3RhdGU6ay5lYWdlclN0YXRlLG5leHQ6bnVsbH07bnVsbD09PWg/KGc9aD1uLGY9ZCk6aD1oLm5leHQ9bjtSLmxhbmVzfD1sO0RnfD1sfWs9ay5uZXh0fXdoaWxlKG51bGwhPT1rJiZrIT09ZSk7bnVsbD09PWg/Zj1kOmgubmV4dD1nO0hlKGQsYi5tZW1vaXplZFN0YXRlKXx8KHVnPSEwKTtiLm1lbW9pemVkU3RhdGU9ZDtiLmJhc2VTdGF0ZT1mO2IuYmFzZVF1ZXVlPWg7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1kfXJldHVybltiLm1lbW9pemVkU3RhdGUsYy5kaXNwYXRjaF19XG5mdW5jdGlvbiBMaChhKXt2YXIgYj1JaCgpLGM9Yi5xdWV1ZTtpZihudWxsPT09Yyl0aHJvdyBFcnJvcih5KDMxMSkpO2MubGFzdFJlbmRlcmVkUmVkdWNlcj1hO3ZhciBkPWMuZGlzcGF0Y2gsZT1jLnBlbmRpbmcsZj1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWUpe2MucGVuZGluZz1udWxsO3ZhciBnPWU9ZS5uZXh0O2RvIGY9YShmLGcuYWN0aW9uKSxnPWcubmV4dDt3aGlsZShnIT09ZSk7SGUoZixiLm1lbW9pemVkU3RhdGUpfHwodWc9ITApO2IubWVtb2l6ZWRTdGF0ZT1mO251bGw9PT1iLmJhc2VRdWV1ZSYmKGIuYmFzZVN0YXRlPWYpO2MubGFzdFJlbmRlcmVkU3RhdGU9Zn1yZXR1cm5bZixkXX1cbmZ1bmN0aW9uIE1oKGEsYixjKXt2YXIgZD1iLl9nZXRWZXJzaW9uO2Q9ZChiLl9zb3VyY2UpO3ZhciBlPWIuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk7aWYobnVsbCE9PWUpYT1lPT09ZDtlbHNlIGlmKGE9YS5tdXRhYmxlUmVhZExhbmVzLGE9KHhoJmEpPT09YSliLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PWQsdGgucHVzaChiKTtpZihhKXJldHVybiBjKGIuX3NvdXJjZSk7dGgucHVzaChiKTt0aHJvdyBFcnJvcih5KDM1MCkpO31cbmZ1bmN0aW9uIE5oKGEsYixjLGQpe3ZhciBlPVU7aWYobnVsbD09PWUpdGhyb3cgRXJyb3IoeSgzNDkpKTt2YXIgZj1iLl9nZXRWZXJzaW9uLGc9ZihiLl9zb3VyY2UpLGg9dmguY3VycmVudCxrPWgudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm4gTWgoZSxiLGMpfSksbD1rWzFdLG49a1swXTtrPVQ7dmFyIEE9YS5tZW1vaXplZFN0YXRlLHA9QS5yZWZzLEM9cC5nZXRTbmFwc2hvdCx4PUEuc291cmNlO0E9QS5zdWJzY3JpYmU7dmFyIHc9UjthLm1lbW9pemVkU3RhdGU9e3JlZnM6cCxzb3VyY2U6YixzdWJzY3JpYmU6ZH07aC51c2VFZmZlY3QoZnVuY3Rpb24oKXtwLmdldFNuYXBzaG90PWM7cC5zZXRTbmFwc2hvdD1sO3ZhciBhPWYoYi5fc291cmNlKTtpZighSGUoZyxhKSl7YT1jKGIuX3NvdXJjZSk7SGUobixhKXx8KGwoYSksYT1JZyh3KSxlLm11dGFibGVSZWFkTGFuZXN8PWEmZS5wZW5kaW5nTGFuZXMpO2E9ZS5tdXRhYmxlUmVhZExhbmVzO2UuZW50YW5nbGVkTGFuZXN8PWE7Zm9yKHZhciBkPVxuZS5lbnRhbmdsZW1lbnRzLGg9YTswPGg7KXt2YXIgaz0zMS1WYyhoKSx2PTE8PGs7ZFtrXXw9YTtoJj1+dn19fSxbYyxiLGRdKTtoLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiBkKGIuX3NvdXJjZSxmdW5jdGlvbigpe3ZhciBhPXAuZ2V0U25hcHNob3QsYz1wLnNldFNuYXBzaG90O3RyeXtjKGEoYi5fc291cmNlKSk7dmFyIGQ9SWcodyk7ZS5tdXRhYmxlUmVhZExhbmVzfD1kJmUucGVuZGluZ0xhbmVzfWNhdGNoKHEpe2MoZnVuY3Rpb24oKXt0aHJvdyBxO30pfX0pfSxbYixkXSk7SGUoQyxjKSYmSGUoeCxiKSYmSGUoQSxkKXx8KGE9e3BlbmRpbmc6bnVsbCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6SmgsbGFzdFJlbmRlcmVkU3RhdGU6bn0sYS5kaXNwYXRjaD1sPU9oLmJpbmQobnVsbCxSLGEpLGsucXVldWU9YSxrLmJhc2VRdWV1ZT1udWxsLG49TWgoZSxiLGMpLGsubWVtb2l6ZWRTdGF0ZT1rLmJhc2VTdGF0ZT1uKTtyZXR1cm4gbn1cbmZ1bmN0aW9uIFBoKGEsYixjKXt2YXIgZD1JaCgpO3JldHVybiBOaChkLGEsYixjKX1mdW5jdGlvbiBRaChhKXt2YXIgYj1IaCgpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiYoYT1hKCkpO2IubWVtb2l6ZWRTdGF0ZT1iLmJhc2VTdGF0ZT1hO2E9Yi5xdWV1ZT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpKaCxsYXN0UmVuZGVyZWRTdGF0ZTphfTthPWEuZGlzcGF0Y2g9T2guYmluZChudWxsLFIsYSk7cmV0dXJuW2IubWVtb2l6ZWRTdGF0ZSxhXX1cbmZ1bmN0aW9uIFJoKGEsYixjLGQpe2E9e3RhZzphLGNyZWF0ZTpiLGRlc3Ryb3k6YyxkZXBzOmQsbmV4dDpudWxsfTtiPVIudXBkYXRlUXVldWU7bnVsbD09PWI/KGI9e2xhc3RFZmZlY3Q6bnVsbH0sUi51cGRhdGVRdWV1ZT1iLGIubGFzdEVmZmVjdD1hLm5leHQ9YSk6KGM9Yi5sYXN0RWZmZWN0LG51bGw9PT1jP2IubGFzdEVmZmVjdD1hLm5leHQ9YTooZD1jLm5leHQsYy5uZXh0PWEsYS5uZXh0PWQsYi5sYXN0RWZmZWN0PWEpKTtyZXR1cm4gYX1mdW5jdGlvbiBTaChhKXt2YXIgYj1IaCgpO2E9e2N1cnJlbnQ6YX07cmV0dXJuIGIubWVtb2l6ZWRTdGF0ZT1hfWZ1bmN0aW9uIFRoKCl7cmV0dXJuIEloKCkubWVtb2l6ZWRTdGF0ZX1mdW5jdGlvbiBVaChhLGIsYyxkKXt2YXIgZT1IaCgpO1IuZmxhZ3N8PWE7ZS5tZW1vaXplZFN0YXRlPVJoKDF8YixjLHZvaWQgMCx2b2lkIDA9PT1kP251bGw6ZCl9XG5mdW5jdGlvbiBWaChhLGIsYyxkKXt2YXIgZT1JaCgpO2Q9dm9pZCAwPT09ZD9udWxsOmQ7dmFyIGY9dm9pZCAwO2lmKG51bGwhPT1TKXt2YXIgZz1TLm1lbW9pemVkU3RhdGU7Zj1nLmRlc3Ryb3k7aWYobnVsbCE9PWQmJkJoKGQsZy5kZXBzKSl7UmgoYixjLGYsZCk7cmV0dXJufX1SLmZsYWdzfD1hO2UubWVtb2l6ZWRTdGF0ZT1SaCgxfGIsYyxmLGQpfWZ1bmN0aW9uIFdoKGEsYil7cmV0dXJuIFVoKDUxNiw0LGEsYil9ZnVuY3Rpb24gWGgoYSxiKXtyZXR1cm4gVmgoNTE2LDQsYSxiKX1mdW5jdGlvbiBZaChhLGIpe3JldHVybiBWaCg0LDIsYSxiKX1mdW5jdGlvbiBaaChhLGIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXJldHVybiBhPWEoKSxiKGEpLGZ1bmN0aW9uKCl7YihudWxsKX07aWYobnVsbCE9PWImJnZvaWQgMCE9PWIpcmV0dXJuIGE9YSgpLGIuY3VycmVudD1hLGZ1bmN0aW9uKCl7Yi5jdXJyZW50PW51bGx9fVxuZnVuY3Rpb24gJGgoYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBWaCg0LDIsWmguYmluZChudWxsLGIsYSksYyl9ZnVuY3Rpb24gYWkoKXt9ZnVuY3Rpb24gYmkoYSxiKXt2YXIgYz1JaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kJiZudWxsIT09YiYmQmgoYixkWzFdKSlyZXR1cm4gZFswXTtjLm1lbW9pemVkU3RhdGU9W2EsYl07cmV0dXJuIGF9ZnVuY3Rpb24gY2koYSxiKXt2YXIgYz1JaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kJiZudWxsIT09YiYmQmgoYixkWzFdKSlyZXR1cm4gZFswXTthPWEoKTtjLm1lbW9pemVkU3RhdGU9W2EsYl07cmV0dXJuIGF9XG5mdW5jdGlvbiBkaShhLGIpe3ZhciBjPWVnKCk7Z2coOTg+Yz85ODpjLGZ1bmN0aW9uKCl7YSghMCl9KTtnZyg5NzxjPzk3OmMsZnVuY3Rpb24oKXt2YXIgYz13aC50cmFuc2l0aW9uO3doLnRyYW5zaXRpb249MTt0cnl7YSghMSksYigpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1jfX0pfVxuZnVuY3Rpb24gT2goYSxiLGMpe3ZhciBkPUhnKCksZT1JZyhhKSxmPXtsYW5lOmUsYWN0aW9uOmMsZWFnZXJSZWR1Y2VyOm51bGwsZWFnZXJTdGF0ZTpudWxsLG5leHQ6bnVsbH0sZz1iLnBlbmRpbmc7bnVsbD09PWc/Zi5uZXh0PWY6KGYubmV4dD1nLm5leHQsZy5uZXh0PWYpO2IucGVuZGluZz1mO2c9YS5hbHRlcm5hdGU7aWYoYT09PVJ8fG51bGwhPT1nJiZnPT09Uil6aD15aD0hMDtlbHNle2lmKDA9PT1hLmxhbmVzJiYobnVsbD09PWd8fDA9PT1nLmxhbmVzKSYmKGc9Yi5sYXN0UmVuZGVyZWRSZWR1Y2VyLG51bGwhPT1nKSl0cnl7dmFyIGg9Yi5sYXN0UmVuZGVyZWRTdGF0ZSxrPWcoaCxjKTtmLmVhZ2VyUmVkdWNlcj1nO2YuZWFnZXJTdGF0ZT1rO2lmKEhlKGssaCkpcmV0dXJufWNhdGNoKGwpe31maW5hbGx5e31KZyhhLGUsZCl9fVxudmFyIEdoPXtyZWFkQ29udGV4dDp2Zyx1c2VDYWxsYmFjazpBaCx1c2VDb250ZXh0OkFoLHVzZUVmZmVjdDpBaCx1c2VJbXBlcmF0aXZlSGFuZGxlOkFoLHVzZUxheW91dEVmZmVjdDpBaCx1c2VNZW1vOkFoLHVzZVJlZHVjZXI6QWgsdXNlUmVmOkFoLHVzZVN0YXRlOkFoLHVzZURlYnVnVmFsdWU6QWgsdXNlRGVmZXJyZWRWYWx1ZTpBaCx1c2VUcmFuc2l0aW9uOkFoLHVzZU11dGFibGVTb3VyY2U6QWgsdXNlT3BhcXVlSWRlbnRpZmllcjpBaCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LERoPXtyZWFkQ29udGV4dDp2Zyx1c2VDYWxsYmFjazpmdW5jdGlvbihhLGIpe0hoKCkubWVtb2l6ZWRTdGF0ZT1bYSx2b2lkIDA9PT1iP251bGw6Yl07cmV0dXJuIGF9LHVzZUNvbnRleHQ6dmcsdXNlRWZmZWN0OldoLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBVaCg0LDIsWmguYmluZChudWxsLFxuYixhKSxjKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFVoKDQsMixhLGIpfSx1c2VNZW1vOmZ1bmN0aW9uKGEsYil7dmFyIGM9SGgoKTtiPXZvaWQgMD09PWI/bnVsbDpiO2E9YSgpO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX0sdXNlUmVkdWNlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9SGgoKTtiPXZvaWQgMCE9PWM/YyhiKTpiO2QubWVtb2l6ZWRTdGF0ZT1kLmJhc2VTdGF0ZT1iO2E9ZC5xdWV1ZT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjphLGxhc3RSZW5kZXJlZFN0YXRlOmJ9O2E9YS5kaXNwYXRjaD1PaC5iaW5kKG51bGwsUixhKTtyZXR1cm5bZC5tZW1vaXplZFN0YXRlLGFdfSx1c2VSZWY6U2gsdXNlU3RhdGU6UWgsdXNlRGVidWdWYWx1ZTphaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPVFoKGEpLGM9YlswXSxkPWJbMV07V2goZnVuY3Rpb24oKXt2YXIgYj13aC50cmFuc2l0aW9uO1xud2gudHJhbnNpdGlvbj0xO3RyeXtkKGEpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1ifX0sW2FdKTtyZXR1cm4gY30sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPVFoKCExKSxiPWFbMF07YT1kaS5iaW5kKG51bGwsYVsxXSk7U2goYSk7cmV0dXJuW2EsYl19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUhoKCk7ZC5tZW1vaXplZFN0YXRlPXtyZWZzOntnZXRTbmFwc2hvdDpiLHNldFNuYXBzaG90Om51bGx9LHNvdXJjZTphLHN1YnNjcmliZTpjfTtyZXR1cm4gTmgoZCxhLGIsYyl9LHVzZU9wYXF1ZUlkZW50aWZpZXI6ZnVuY3Rpb24oKXtpZihsaCl7dmFyIGE9ITEsYj11ZihmdW5jdGlvbigpe2F8fChhPSEwLGMoXCJyOlwiKyh0ZisrKS50b1N0cmluZygzNikpKTt0aHJvdyBFcnJvcih5KDM1NSkpO30pLGM9UWgoYilbMV07MD09PShSLm1vZGUmMikmJihSLmZsYWdzfD01MTYsUmgoNSxmdW5jdGlvbigpe2MoXCJyOlwiKyh0ZisrKS50b1N0cmluZygzNikpfSxcbnZvaWQgMCxudWxsKSk7cmV0dXJuIGJ9Yj1cInI6XCIrKHRmKyspLnRvU3RyaW5nKDM2KTtRaChiKTtyZXR1cm4gYn0sdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxFaD17cmVhZENvbnRleHQ6dmcsdXNlQ2FsbGJhY2s6YmksdXNlQ29udGV4dDp2Zyx1c2VFZmZlY3Q6WGgsdXNlSW1wZXJhdGl2ZUhhbmRsZTokaCx1c2VMYXlvdXRFZmZlY3Q6WWgsdXNlTWVtbzpjaSx1c2VSZWR1Y2VyOktoLHVzZVJlZjpUaCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBLaChKaCl9LHVzZURlYnVnVmFsdWU6YWksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj1LaChKaCksYz1iWzBdLGQ9YlsxXTtYaChmdW5jdGlvbigpe3ZhciBiPXdoLnRyYW5zaXRpb247d2gudHJhbnNpdGlvbj0xO3RyeXtkKGEpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1ifX0sW2FdKTtyZXR1cm4gY30sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPUtoKEpoKVswXTtyZXR1cm5bVGgoKS5jdXJyZW50LFxuYV19LHVzZU11dGFibGVTb3VyY2U6UGgsdXNlT3BhcXVlSWRlbnRpZmllcjpmdW5jdGlvbigpe3JldHVybiBLaChKaClbMF19LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sRmg9e3JlYWRDb250ZXh0OnZnLHVzZUNhbGxiYWNrOmJpLHVzZUNvbnRleHQ6dmcsdXNlRWZmZWN0OlhoLHVzZUltcGVyYXRpdmVIYW5kbGU6JGgsdXNlTGF5b3V0RWZmZWN0OlloLHVzZU1lbW86Y2ksdXNlUmVkdWNlcjpMaCx1c2VSZWY6VGgsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gTGgoSmgpfSx1c2VEZWJ1Z1ZhbHVlOmFpLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9TGgoSmgpLGM9YlswXSxkPWJbMV07WGgoZnVuY3Rpb24oKXt2YXIgYj13aC50cmFuc2l0aW9uO3doLnRyYW5zaXRpb249MTt0cnl7ZChhKX1maW5hbGx5e3doLnRyYW5zaXRpb249Yn19LFthXSk7cmV0dXJuIGN9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1MaChKaClbMF07cmV0dXJuW1RoKCkuY3VycmVudCxcbmFdfSx1c2VNdXRhYmxlU291cmNlOlBoLHVzZU9wYXF1ZUlkZW50aWZpZXI6ZnVuY3Rpb24oKXtyZXR1cm4gTGgoSmgpWzBdfSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGVpPXJhLlJlYWN0Q3VycmVudE93bmVyLHVnPSExO2Z1bmN0aW9uIGZpKGEsYixjLGQpe2IuY2hpbGQ9bnVsbD09PWE/WmcoYixudWxsLGMsZCk6WWcoYixhLmNoaWxkLGMsZCl9ZnVuY3Rpb24gZ2koYSxiLGMsZCxlKXtjPWMucmVuZGVyO3ZhciBmPWIucmVmO3RnKGIsZSk7ZD1DaChhLGIsYyxkLGYsZSk7aWYobnVsbCE9PWEmJiF1ZylyZXR1cm4gYi51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlLGIuZmxhZ3MmPS01MTcsYS5sYW5lcyY9fmUsaGkoYSxiLGUpO2IuZmxhZ3N8PTE7ZmkoYSxiLGQsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBpaShhLGIsYyxkLGUsZil7aWYobnVsbD09PWEpe3ZhciBnPWMudHlwZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyYmIWppKGcpJiZ2b2lkIDA9PT1nLmRlZmF1bHRQcm9wcyYmbnVsbD09PWMuY29tcGFyZSYmdm9pZCAwPT09Yy5kZWZhdWx0UHJvcHMpcmV0dXJuIGIudGFnPTE1LGIudHlwZT1nLGtpKGEsYixnLGQsZSxmKTthPVZnKGMudHlwZSxudWxsLGQsYixiLm1vZGUsZik7YS5yZWY9Yi5yZWY7YS5yZXR1cm49YjtyZXR1cm4gYi5jaGlsZD1hfWc9YS5jaGlsZDtpZigwPT09KGUmZikmJihlPWcubWVtb2l6ZWRQcm9wcyxjPWMuY29tcGFyZSxjPW51bGwhPT1jP2M6SmUsYyhlLGQpJiZhLnJlZj09PWIucmVmKSlyZXR1cm4gaGkoYSxiLGYpO2IuZmxhZ3N8PTE7YT1UZyhnLGQpO2EucmVmPWIucmVmO2EucmV0dXJuPWI7cmV0dXJuIGIuY2hpbGQ9YX1cbmZ1bmN0aW9uIGtpKGEsYixjLGQsZSxmKXtpZihudWxsIT09YSYmSmUoYS5tZW1vaXplZFByb3BzLGQpJiZhLnJlZj09PWIucmVmKWlmKHVnPSExLDAhPT0oZiZlKSkwIT09KGEuZmxhZ3MmMTYzODQpJiYodWc9ITApO2Vsc2UgcmV0dXJuIGIubGFuZXM9YS5sYW5lcyxoaShhLGIsZik7cmV0dXJuIGxpKGEsYixjLGQsZil9XG5mdW5jdGlvbiBtaShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLmNoaWxkcmVuLGY9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGw7aWYoXCJoaWRkZW5cIj09PWQubW9kZXx8XCJ1bnN0YWJsZS1kZWZlci13aXRob3V0LWhpZGluZ1wiPT09ZC5tb2RlKWlmKDA9PT0oYi5tb2RlJjQpKWIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjB9LG5pKGIsYyk7ZWxzZSBpZigwIT09KGMmMTA3Mzc0MTgyNCkpYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MH0sbmkoYixudWxsIT09Zj9mLmJhc2VMYW5lczpjKTtlbHNlIHJldHVybiBhPW51bGwhPT1mP2YuYmFzZUxhbmVzfGM6YyxiLmxhbmVzPWIuY2hpbGRMYW5lcz0xMDczNzQxODI0LGIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmF9LG5pKGIsYSksbnVsbDtlbHNlIG51bGwhPT1mPyhkPWYuYmFzZUxhbmVzfGMsYi5tZW1vaXplZFN0YXRlPW51bGwpOmQ9YyxuaShiLGQpO2ZpKGEsYixlLGMpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gb2koYSxiKXt2YXIgYz1iLnJlZjtpZihudWxsPT09YSYmbnVsbCE9PWN8fG51bGwhPT1hJiZhLnJlZiE9PWMpYi5mbGFnc3w9MTI4fWZ1bmN0aW9uIGxpKGEsYixjLGQsZSl7dmFyIGY9RmYoYyk/RGY6TS5jdXJyZW50O2Y9RWYoYixmKTt0ZyhiLGUpO2M9Q2goYSxiLGMsZCxmLGUpO2lmKG51bGwhPT1hJiYhdWcpcmV0dXJuIGIudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZSxiLmZsYWdzJj0tNTE3LGEubGFuZXMmPX5lLGhpKGEsYixlKTtiLmZsYWdzfD0xO2ZpKGEsYixjLGUpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gcGkoYSxiLGMsZCxlKXtpZihGZihjKSl7dmFyIGY9ITA7SmYoYil9ZWxzZSBmPSExO3RnKGIsZSk7aWYobnVsbD09PWIuc3RhdGVOb2RlKW51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpLE1nKGIsYyxkKSxPZyhiLGMsZCxlKSxkPSEwO2Vsc2UgaWYobnVsbD09PWEpe3ZhciBnPWIuc3RhdGVOb2RlLGg9Yi5tZW1vaXplZFByb3BzO2cucHJvcHM9aDt2YXIgaz1nLmNvbnRleHQsbD1jLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgbCYmbnVsbCE9PWw/bD12ZyhsKToobD1GZihjKT9EZjpNLmN1cnJlbnQsbD1FZihiLGwpKTt2YXIgbj1jLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyxBPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBufHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtBfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmXG5cImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHwoaCE9PWR8fGshPT1sKSYmTmcoYixnLGQsbCk7d2c9ITE7dmFyIHA9Yi5tZW1vaXplZFN0YXRlO2cuc3RhdGU9cDtDZyhiLGQsZyxlKTtrPWIubWVtb2l6ZWRTdGF0ZTtoIT09ZHx8cCE9PWt8fE4uY3VycmVudHx8d2c/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBuJiYoR2coYixjLG4sZCksaz1iLm1lbW9pemVkU3RhdGUpLChoPXdnfHxMZyhiLGMsaCxkLHAsayxsKSk/KEF8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudHx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCYmZy5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXCJmdW5jdGlvblwiPT09XG50eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQpKTooXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9ayksZy5wcm9wcz1kLGcuc3RhdGU9ayxnLmNvbnRleHQ9bCxkPWgpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQpLGQ9ITEpfWVsc2V7Zz1iLnN0YXRlTm9kZTt5ZyhhLGIpO2g9Yi5tZW1vaXplZFByb3BzO2w9Yi50eXBlPT09Yi5lbGVtZW50VHlwZT9oOmxnKGIudHlwZSxoKTtnLnByb3BzPWw7QT1iLnBlbmRpbmdQcm9wcztwPWcuY29udGV4dDtrPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09az9rPXZnKGspOihrPUZmKGMpP0RmOk0uY3VycmVudCxrPUVmKGIsaykpO3ZhciBDPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhuPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBDfHxcblwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09QXx8cCE9PWspJiZOZyhiLGcsZCxrKTt3Zz0hMTtwPWIubWVtb2l6ZWRTdGF0ZTtnLnN0YXRlPXA7Q2coYixkLGcsZSk7dmFyIHg9Yi5tZW1vaXplZFN0YXRlO2ghPT1BfHxwIT09eHx8Ti5jdXJyZW50fHx3Zz8oXCJmdW5jdGlvblwiPT09dHlwZW9mIEMmJihHZyhiLGMsQyxkKSx4PWIubWVtb2l6ZWRTdGF0ZSksKGw9d2d8fExnKGIsYyxsLGQscCx4LGspKT8obnx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGV8fChcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnRXaWxsVXBkYXRlJiZnLmNvbXBvbmVudFdpbGxVcGRhdGUoZCxcbngsayksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJmcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUoZCx4LGspKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGUmJihiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSYmKGIuZmxhZ3N8PTI1NikpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnA9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTI1NiksYi5tZW1vaXplZFByb3BzPWQsYi5tZW1vaXplZFN0YXRlPXgpLGcucHJvcHM9ZCxnLnN0YXRlPXgsZy5jb250ZXh0PWssZD1sKTooXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlfHxcbmg9PT1hLm1lbW9pemVkUHJvcHMmJnA9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTI1NiksZD0hMSl9cmV0dXJuIHFpKGEsYixjLGQsZixlKX1cbmZ1bmN0aW9uIHFpKGEsYixjLGQsZSxmKXtvaShhLGIpO3ZhciBnPTAhPT0oYi5mbGFncyY2NCk7aWYoIWQmJiFnKXJldHVybiBlJiZLZihiLGMsITEpLGhpKGEsYixmKTtkPWIuc3RhdGVOb2RlO2VpLmN1cnJlbnQ9Yjt2YXIgaD1nJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I/bnVsbDpkLnJlbmRlcigpO2IuZmxhZ3N8PTE7bnVsbCE9PWEmJmc/KGIuY2hpbGQ9WWcoYixhLmNoaWxkLG51bGwsZiksYi5jaGlsZD1ZZyhiLG51bGwsaCxmKSk6ZmkoYSxiLGgsZik7Yi5tZW1vaXplZFN0YXRlPWQuc3RhdGU7ZSYmS2YoYixjLCEwKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiByaShhKXt2YXIgYj1hLnN0YXRlTm9kZTtiLnBlbmRpbmdDb250ZXh0P0hmKGEsYi5wZW5kaW5nQ29udGV4dCxiLnBlbmRpbmdDb250ZXh0IT09Yi5jb250ZXh0KTpiLmNvbnRleHQmJkhmKGEsYi5jb250ZXh0LCExKTtlaChhLGIuY29udGFpbmVySW5mbyl9XG52YXIgc2k9e2RlaHlkcmF0ZWQ6bnVsbCxyZXRyeUxhbmU6MH07XG5mdW5jdGlvbiB0aShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1QLmN1cnJlbnQsZj0hMSxnOyhnPTAhPT0oYi5mbGFncyY2NCkpfHwoZz1udWxsIT09YSYmbnVsbD09PWEubWVtb2l6ZWRTdGF0ZT8hMTowIT09KGUmMikpO2c/KGY9ITAsYi5mbGFncyY9LTY1KTpudWxsIT09YSYmbnVsbD09PWEubWVtb2l6ZWRTdGF0ZXx8dm9pZCAwPT09ZC5mYWxsYmFja3x8ITA9PT1kLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrfHwoZXw9MSk7SShQLGUmMSk7aWYobnVsbD09PWEpe3ZvaWQgMCE9PWQuZmFsbGJhY2smJnBoKGIpO2E9ZC5jaGlsZHJlbjtlPWQuZmFsbGJhY2s7aWYoZilyZXR1cm4gYT11aShiLGEsZSxjKSxiLmNoaWxkLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczpjfSxiLm1lbW9pemVkU3RhdGU9c2ksYTtpZihcIm51bWJlclwiPT09dHlwZW9mIGQudW5zdGFibGVfZXhwZWN0ZWRMb2FkVGltZSlyZXR1cm4gYT11aShiLGEsZSxjKSxiLmNoaWxkLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczpjfSxcbmIubWVtb2l6ZWRTdGF0ZT1zaSxiLmxhbmVzPTMzNTU0NDMyLGE7Yz12aSh7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjphfSxiLm1vZGUsYyxudWxsKTtjLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWN9aWYobnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSl7aWYoZilyZXR1cm4gZD13aShhLGIsZC5jaGlsZHJlbixkLmZhbGxiYWNrLGMpLGY9Yi5jaGlsZCxlPWEuY2hpbGQubWVtb2l6ZWRTdGF0ZSxmLm1lbW9pemVkU3RhdGU9bnVsbD09PWU/e2Jhc2VMYW5lczpjfTp7YmFzZUxhbmVzOmUuYmFzZUxhbmVzfGN9LGYuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXMmfmMsYi5tZW1vaXplZFN0YXRlPXNpLGQ7Yz14aShhLGIsZC5jaGlsZHJlbixjKTtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gY31pZihmKXJldHVybiBkPXdpKGEsYixkLmNoaWxkcmVuLGQuZmFsbGJhY2ssYyksZj1iLmNoaWxkLGU9YS5jaGlsZC5tZW1vaXplZFN0YXRlLGYubWVtb2l6ZWRTdGF0ZT1udWxsPT09ZT97YmFzZUxhbmVzOmN9Olxue2Jhc2VMYW5lczplLmJhc2VMYW5lc3xjfSxmLmNoaWxkTGFuZXM9YS5jaGlsZExhbmVzJn5jLGIubWVtb2l6ZWRTdGF0ZT1zaSxkO2M9eGkoYSxiLGQuY2hpbGRyZW4sYyk7Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGN9ZnVuY3Rpb24gdWkoYSxiLGMsZCl7dmFyIGU9YS5tb2RlLGY9YS5jaGlsZDtiPXttb2RlOlwiaGlkZGVuXCIsY2hpbGRyZW46Yn07MD09PShlJjIpJiZudWxsIT09Zj8oZi5jaGlsZExhbmVzPTAsZi5wZW5kaW5nUHJvcHM9Yik6Zj12aShiLGUsMCxudWxsKTtjPVhnKGMsZSxkLG51bGwpO2YucmV0dXJuPWE7Yy5yZXR1cm49YTtmLnNpYmxpbmc9YzthLmNoaWxkPWY7cmV0dXJuIGN9XG5mdW5jdGlvbiB4aShhLGIsYyxkKXt2YXIgZT1hLmNoaWxkO2E9ZS5zaWJsaW5nO2M9VGcoZSx7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpjfSk7MD09PShiLm1vZGUmMikmJihjLmxhbmVzPWQpO2MucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGw7bnVsbCE9PWEmJihhLm5leHRFZmZlY3Q9bnVsbCxhLmZsYWdzPTgsYi5maXJzdEVmZmVjdD1iLmxhc3RFZmZlY3Q9YSk7cmV0dXJuIGIuY2hpbGQ9Y31cbmZ1bmN0aW9uIHdpKGEsYixjLGQsZSl7dmFyIGY9Yi5tb2RlLGc9YS5jaGlsZDthPWcuc2libGluZzt2YXIgaD17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmN9OzA9PT0oZiYyKSYmYi5jaGlsZCE9PWc/KGM9Yi5jaGlsZCxjLmNoaWxkTGFuZXM9MCxjLnBlbmRpbmdQcm9wcz1oLGc9Yy5sYXN0RWZmZWN0LG51bGwhPT1nPyhiLmZpcnN0RWZmZWN0PWMuZmlyc3RFZmZlY3QsYi5sYXN0RWZmZWN0PWcsZy5uZXh0RWZmZWN0PW51bGwpOmIuZmlyc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0PW51bGwpOmM9VGcoZyxoKTtudWxsIT09YT9kPVRnKGEsZCk6KGQ9WGcoZCxmLGUsbnVsbCksZC5mbGFnc3w9Mik7ZC5yZXR1cm49YjtjLnJldHVybj1iO2Muc2libGluZz1kO2IuY2hpbGQ9YztyZXR1cm4gZH1mdW5jdGlvbiB5aShhLGIpe2EubGFuZXN8PWI7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbCE9PWMmJihjLmxhbmVzfD1iKTtzZyhhLnJldHVybixiKX1cbmZ1bmN0aW9uIHppKGEsYixjLGQsZSxmKXt2YXIgZz1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWc/YS5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczpiLHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6ZCx0YWlsOmMsdGFpbE1vZGU6ZSxsYXN0RWZmZWN0OmZ9OihnLmlzQmFja3dhcmRzPWIsZy5yZW5kZXJpbmc9bnVsbCxnLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGcubGFzdD1kLGcudGFpbD1jLGcudGFpbE1vZGU9ZSxnLmxhc3RFZmZlY3Q9Zil9XG5mdW5jdGlvbiBBaShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLnJldmVhbE9yZGVyLGY9ZC50YWlsO2ZpKGEsYixkLmNoaWxkcmVuLGMpO2Q9UC5jdXJyZW50O2lmKDAhPT0oZCYyKSlkPWQmMXwyLGIuZmxhZ3N8PTY0O2Vsc2V7aWYobnVsbCE9PWEmJjAhPT0oYS5mbGFncyY2NCkpYTpmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7aWYoMTM9PT1hLnRhZyludWxsIT09YS5tZW1vaXplZFN0YXRlJiZ5aShhLGMpO2Vsc2UgaWYoMTk9PT1hLnRhZyl5aShhLGMpO2Vsc2UgaWYobnVsbCE9PWEuY2hpbGQpe2EuY2hpbGQucmV0dXJuPWE7YT1hLmNoaWxkO2NvbnRpbnVlfWlmKGE9PT1iKWJyZWFrIGE7Zm9yKDtudWxsPT09YS5zaWJsaW5nOyl7aWYobnVsbD09PWEucmV0dXJufHxhLnJldHVybj09PWIpYnJlYWsgYTthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47YT1hLnNpYmxpbmd9ZCY9MX1JKFAsZCk7aWYoMD09PShiLm1vZGUmMikpYi5tZW1vaXplZFN0YXRlPVxubnVsbDtlbHNlIHN3aXRjaChlKXtjYXNlIFwiZm9yd2FyZHNcIjpjPWIuY2hpbGQ7Zm9yKGU9bnVsbDtudWxsIT09YzspYT1jLmFsdGVybmF0ZSxudWxsIT09YSYmbnVsbD09PWloKGEpJiYoZT1jKSxjPWMuc2libGluZztjPWU7bnVsbD09PWM/KGU9Yi5jaGlsZCxiLmNoaWxkPW51bGwpOihlPWMuc2libGluZyxjLnNpYmxpbmc9bnVsbCk7emkoYiwhMSxlLGMsZixiLmxhc3RFZmZlY3QpO2JyZWFrO2Nhc2UgXCJiYWNrd2FyZHNcIjpjPW51bGw7ZT1iLmNoaWxkO2ZvcihiLmNoaWxkPW51bGw7bnVsbCE9PWU7KXthPWUuYWx0ZXJuYXRlO2lmKG51bGwhPT1hJiZudWxsPT09aWgoYSkpe2IuY2hpbGQ9ZTticmVha31hPWUuc2libGluZztlLnNpYmxpbmc9YztjPWU7ZT1hfXppKGIsITAsYyxudWxsLGYsYi5sYXN0RWZmZWN0KTticmVhaztjYXNlIFwidG9nZXRoZXJcIjp6aShiLCExLG51bGwsbnVsbCx2b2lkIDAsYi5sYXN0RWZmZWN0KTticmVhaztkZWZhdWx0OmIubWVtb2l6ZWRTdGF0ZT1udWxsfXJldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gaGkoYSxiLGMpe251bGwhPT1hJiYoYi5kZXBlbmRlbmNpZXM9YS5kZXBlbmRlbmNpZXMpO0RnfD1iLmxhbmVzO2lmKDAhPT0oYyZiLmNoaWxkTGFuZXMpKXtpZihudWxsIT09YSYmYi5jaGlsZCE9PWEuY2hpbGQpdGhyb3cgRXJyb3IoeSgxNTMpKTtpZihudWxsIT09Yi5jaGlsZCl7YT1iLmNoaWxkO2M9VGcoYSxhLnBlbmRpbmdQcm9wcyk7Yi5jaGlsZD1jO2ZvcihjLnJldHVybj1iO251bGwhPT1hLnNpYmxpbmc7KWE9YS5zaWJsaW5nLGM9Yy5zaWJsaW5nPVRnKGEsYS5wZW5kaW5nUHJvcHMpLGMucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGx9cmV0dXJuIGIuY2hpbGR9cmV0dXJuIG51bGx9dmFyIEJpLENpLERpLEVpO1xuQmk9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yi5jaGlsZDtudWxsIT09Yzspe2lmKDU9PT1jLnRhZ3x8Nj09PWMudGFnKWEuYXBwZW5kQ2hpbGQoYy5zdGF0ZU5vZGUpO2Vsc2UgaWYoNCE9PWMudGFnJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PWIpYnJlYWs7Zm9yKDtudWxsPT09Yy5zaWJsaW5nOyl7aWYobnVsbD09PWMucmV0dXJufHxjLnJldHVybj09PWIpcmV0dXJuO2M9Yy5yZXR1cm59Yy5zaWJsaW5nLnJldHVybj1jLnJldHVybjtjPWMuc2libGluZ319O0NpPWZ1bmN0aW9uKCl7fTtcbkRpPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWEubWVtb2l6ZWRQcm9wcztpZihlIT09ZCl7YT1iLnN0YXRlTm9kZTtkaChhaC5jdXJyZW50KTt2YXIgZj1udWxsO3N3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjplPVlhKGEsZSk7ZD1ZYShhLGQpO2Y9W107YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmU9ZWIoYSxlKTtkPWViKGEsZCk7Zj1bXTticmVhaztjYXNlIFwic2VsZWN0XCI6ZT1tKHt9LGUse3ZhbHVlOnZvaWQgMH0pO2Q9bSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtmPVtdO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmU9Z2IoYSxlKTtkPWdiKGEsZCk7Zj1bXTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLm9uQ2xpY2smJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLm9uQ2xpY2smJihhLm9uY2xpY2s9amYpfXZiKGMsZCk7dmFyIGc7Yz1udWxsO2ZvcihsIGluIGUpaWYoIWQuaGFzT3duUHJvcGVydHkobCkmJmUuaGFzT3duUHJvcGVydHkobCkmJm51bGwhPWVbbF0paWYoXCJzdHlsZVwiPT09XG5sKXt2YXIgaD1lW2xdO2ZvcihnIGluIGgpaC5oYXNPd25Qcm9wZXJ0eShnKSYmKGN8fChjPXt9KSxjW2ddPVwiXCIpfWVsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIhPT1sJiZcImNoaWxkcmVuXCIhPT1sJiZcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09bCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWwmJlwiYXV0b0ZvY3VzXCIhPT1sJiYoY2EuaGFzT3duUHJvcGVydHkobCk/Znx8KGY9W10pOihmPWZ8fFtdKS5wdXNoKGwsbnVsbCkpO2ZvcihsIGluIGQpe3ZhciBrPWRbbF07aD1udWxsIT1lP2VbbF06dm9pZCAwO2lmKGQuaGFzT3duUHJvcGVydHkobCkmJmshPT1oJiYobnVsbCE9a3x8bnVsbCE9aCkpaWYoXCJzdHlsZVwiPT09bClpZihoKXtmb3IoZyBpbiBoKSFoLmhhc093blByb3BlcnR5KGcpfHxrJiZrLmhhc093blByb3BlcnR5KGcpfHwoY3x8KGM9e30pLGNbZ109XCJcIik7Zm9yKGcgaW4gaylrLmhhc093blByb3BlcnR5KGcpJiZoW2ddIT09a1tnXSYmKGN8fFxuKGM9e30pLGNbZ109a1tnXSl9ZWxzZSBjfHwoZnx8KGY9W10pLGYucHVzaChsLGMpKSxjPWs7ZWxzZVwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWw/KGs9az9rLl9faHRtbDp2b2lkIDAsaD1oP2guX19odG1sOnZvaWQgMCxudWxsIT1rJiZoIT09ayYmKGY9Znx8W10pLnB1c2gobCxrKSk6XCJjaGlsZHJlblwiPT09bD9cInN0cmluZ1wiIT09dHlwZW9mIGsmJlwibnVtYmVyXCIhPT10eXBlb2Yga3x8KGY9Znx8W10pLnB1c2gobCxcIlwiK2spOlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1sJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09bCYmKGNhLmhhc093blByb3BlcnR5KGwpPyhudWxsIT1rJiZcIm9uU2Nyb2xsXCI9PT1sJiZHKFwic2Nyb2xsXCIsYSksZnx8aD09PWt8fChmPVtdKSk6XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09ayYmay4kJHR5cGVvZj09PUdhP2sudG9TdHJpbmcoKTooZj1mfHxbXSkucHVzaChsLGspKX1jJiYoZj1mfHxbXSkucHVzaChcInN0eWxlXCIsXG5jKTt2YXIgbD1mO2lmKGIudXBkYXRlUXVldWU9bCliLmZsYWdzfD00fX07RWk9ZnVuY3Rpb24oYSxiLGMsZCl7YyE9PWQmJihiLmZsYWdzfD00KX07ZnVuY3Rpb24gRmkoYSxiKXtpZighbGgpc3dpdGNoKGEudGFpbE1vZGUpe2Nhc2UgXCJoaWRkZW5cIjpiPWEudGFpbDtmb3IodmFyIGM9bnVsbDtudWxsIT09YjspbnVsbCE9PWIuYWx0ZXJuYXRlJiYoYz1iKSxiPWIuc2libGluZztudWxsPT09Yz9hLnRhaWw9bnVsbDpjLnNpYmxpbmc9bnVsbDticmVhaztjYXNlIFwiY29sbGFwc2VkXCI6Yz1hLnRhaWw7Zm9yKHZhciBkPW51bGw7bnVsbCE9PWM7KW51bGwhPT1jLmFsdGVybmF0ZSYmKGQ9YyksYz1jLnNpYmxpbmc7bnVsbD09PWQ/Ynx8bnVsbD09PWEudGFpbD9hLnRhaWw9bnVsbDphLnRhaWwuc2libGluZz1udWxsOmQuc2libGluZz1udWxsfX1cbmZ1bmN0aW9uIEdpKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcztzd2l0Y2goYi50YWcpe2Nhc2UgMjpjYXNlIDE2OmNhc2UgMTU6Y2FzZSAwOmNhc2UgMTE6Y2FzZSA3OmNhc2UgODpjYXNlIDEyOmNhc2UgOTpjYXNlIDE0OnJldHVybiBudWxsO2Nhc2UgMTpyZXR1cm4gRmYoYi50eXBlKSYmR2YoKSxudWxsO2Nhc2UgMzpmaCgpO0goTik7SChNKTt1aCgpO2Q9Yi5zdGF0ZU5vZGU7ZC5wZW5kaW5nQ29udGV4dCYmKGQuY29udGV4dD1kLnBlbmRpbmdDb250ZXh0LGQucGVuZGluZ0NvbnRleHQ9bnVsbCk7aWYobnVsbD09PWF8fG51bGw9PT1hLmNoaWxkKXJoKGIpP2IuZmxhZ3N8PTQ6ZC5oeWRyYXRlfHwoYi5mbGFnc3w9MjU2KTtDaShiKTtyZXR1cm4gbnVsbDtjYXNlIDU6aGgoYik7dmFyIGU9ZGgoY2guY3VycmVudCk7Yz1iLnR5cGU7aWYobnVsbCE9PWEmJm51bGwhPWIuc3RhdGVOb2RlKURpKGEsYixjLGQsZSksYS5yZWYhPT1iLnJlZiYmKGIuZmxhZ3N8PTEyOCk7ZWxzZXtpZighZCl7aWYobnVsbD09PVxuYi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjYpKTtyZXR1cm4gbnVsbH1hPWRoKGFoLmN1cnJlbnQpO2lmKHJoKGIpKXtkPWIuc3RhdGVOb2RlO2M9Yi50eXBlO3ZhciBmPWIubWVtb2l6ZWRQcm9wcztkW3dmXT1iO2RbeGZdPWY7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpHKFwiY2FuY2VsXCIsZCk7RyhcImNsb3NlXCIsZCk7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpHKFwibG9hZFwiLGQpO2JyZWFrO2Nhc2UgXCJ2aWRlb1wiOmNhc2UgXCJhdWRpb1wiOmZvcihhPTA7YTxYZS5sZW5ndGg7YSsrKUcoWGVbYV0sZCk7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkcoXCJlcnJvclwiLGQpO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkcoXCJlcnJvclwiLGQpO0coXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpHKFwidG9nZ2xlXCIsZCk7YnJlYWs7Y2FzZSBcImlucHV0XCI6WmEoZCxmKTtHKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpkLl93cmFwcGVyU3RhdGU9XG57d2FzTXVsdGlwbGU6ISFmLm11bHRpcGxlfTtHKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGQsZiksRyhcImludmFsaWRcIixkKX12YihjLGYpO2E9bnVsbDtmb3IodmFyIGcgaW4gZilmLmhhc093blByb3BlcnR5KGcpJiYoZT1mW2ddLFwiY2hpbGRyZW5cIj09PWc/XCJzdHJpbmdcIj09PXR5cGVvZiBlP2QudGV4dENvbnRlbnQhPT1lJiYoYT1bXCJjaGlsZHJlblwiLGVdKTpcIm51bWJlclwiPT09dHlwZW9mIGUmJmQudGV4dENvbnRlbnQhPT1cIlwiK2UmJihhPVtcImNoaWxkcmVuXCIsXCJcIitlXSk6Y2EuaGFzT3duUHJvcGVydHkoZykmJm51bGwhPWUmJlwib25TY3JvbGxcIj09PWcmJkcoXCJzY3JvbGxcIixkKSk7c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlZhKGQpO2NiKGQsZiwhMCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoZCk7amIoZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJvcHRpb25cIjpicmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLm9uQ2xpY2smJihkLm9uY2xpY2s9XG5qZil9ZD1hO2IudXBkYXRlUXVldWU9ZDtudWxsIT09ZCYmKGIuZmxhZ3N8PTQpfWVsc2V7Zz05PT09ZS5ub2RlVHlwZT9lOmUub3duZXJEb2N1bWVudDthPT09a2IuaHRtbCYmKGE9bGIoYykpO2E9PT1rYi5odG1sP1wic2NyaXB0XCI9PT1jPyhhPWcuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhLmlubmVySFRNTD1cIjxzY3JpcHQ+XFx4M2Mvc2NyaXB0PlwiLGE9YS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpKTpcInN0cmluZ1wiPT09dHlwZW9mIGQuaXM/YT1nLmNyZWF0ZUVsZW1lbnQoYyx7aXM6ZC5pc30pOihhPWcuY3JlYXRlRWxlbWVudChjKSxcInNlbGVjdFwiPT09YyYmKGc9YSxkLm11bHRpcGxlP2cubXVsdGlwbGU9ITA6ZC5zaXplJiYoZy5zaXplPWQuc2l6ZSkpKTphPWcuY3JlYXRlRWxlbWVudE5TKGEsYyk7YVt3Zl09YjthW3hmXT1kO0JpKGEsYiwhMSwhMSk7Yi5zdGF0ZU5vZGU9YTtnPXdiKGMsZCk7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpHKFwiY2FuY2VsXCIsYSk7RyhcImNsb3NlXCIsYSk7XG5lPWQ7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpHKFwibG9hZFwiLGEpO2U9ZDticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoZT0wO2U8WGUubGVuZ3RoO2UrKylHKFhlW2VdLGEpO2U9ZDticmVhaztjYXNlIFwic291cmNlXCI6RyhcImVycm9yXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkcoXCJlcnJvclwiLGEpO0coXCJsb2FkXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJkZXRhaWxzXCI6RyhcInRvZ2dsZVwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW5wdXRcIjpaYShhLGQpO2U9WWEoYSxkKTtHKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJvcHRpb25cIjplPWViKGEsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmEuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFkLm11bHRpcGxlfTtlPW0oe30sZCx7dmFsdWU6dm9pZCAwfSk7RyhcImludmFsaWRcIixhKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpoYihhLGQpO2U9XG5nYihhLGQpO0coXCJpbnZhbGlkXCIsYSk7YnJlYWs7ZGVmYXVsdDplPWR9dmIoYyxlKTt2YXIgaD1lO2ZvcihmIGluIGgpaWYoaC5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGs9aFtmXTtcInN0eWxlXCI9PT1mP3RiKGEsayk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zj8oaz1rP2suX19odG1sOnZvaWQgMCxudWxsIT1rJiZvYihhLGspKTpcImNoaWxkcmVuXCI9PT1mP1wic3RyaW5nXCI9PT10eXBlb2Ygaz8oXCJ0ZXh0YXJlYVwiIT09Y3x8XCJcIiE9PWspJiZwYihhLGspOlwibnVtYmVyXCI9PT10eXBlb2YgayYmcGIoYSxcIlwiK2spOlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1mJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09ZiYmXCJhdXRvRm9jdXNcIiE9PWYmJihjYS5oYXNPd25Qcm9wZXJ0eShmKT9udWxsIT1rJiZcIm9uU2Nyb2xsXCI9PT1mJiZHKFwic2Nyb2xsXCIsYSk6bnVsbCE9ayYmcWEoYSxmLGssZykpfXN3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjpWYShhKTtjYihhLGQsITEpO1xuYnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoYSk7amIoYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOm51bGwhPWQudmFsdWUmJmEuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiK1NhKGQudmFsdWUpKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5tdWx0aXBsZT0hIWQubXVsdGlwbGU7Zj1kLnZhbHVlO251bGwhPWY/ZmIoYSwhIWQubXVsdGlwbGUsZiwhMSk6bnVsbCE9ZC5kZWZhdWx0VmFsdWUmJmZiKGEsISFkLm11bHRpcGxlLGQuZGVmYXVsdFZhbHVlLCEwKTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLm9uQ2xpY2smJihhLm9uY2xpY2s9amYpfW1mKGMsZCkmJihiLmZsYWdzfD00KX1udWxsIT09Yi5yZWYmJihiLmZsYWdzfD0xMjgpfXJldHVybiBudWxsO2Nhc2UgNjppZihhJiZudWxsIT1iLnN0YXRlTm9kZSlFaShhLGIsYS5tZW1vaXplZFByb3BzLGQpO2Vsc2V7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBkJiZudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjYpKTtcbmM9ZGgoY2guY3VycmVudCk7ZGgoYWguY3VycmVudCk7cmgoYik/KGQ9Yi5zdGF0ZU5vZGUsYz1iLm1lbW9pemVkUHJvcHMsZFt3Zl09YixkLm5vZGVWYWx1ZSE9PWMmJihiLmZsYWdzfD00KSk6KGQ9KDk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShkKSxkW3dmXT1iLGIuc3RhdGVOb2RlPWQpfXJldHVybiBudWxsO2Nhc2UgMTM6SChQKTtkPWIubWVtb2l6ZWRTdGF0ZTtpZigwIT09KGIuZmxhZ3MmNjQpKXJldHVybiBiLmxhbmVzPWMsYjtkPW51bGwhPT1kO2M9ITE7bnVsbD09PWE/dm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLmZhbGxiYWNrJiZyaChiKTpjPW51bGwhPT1hLm1lbW9pemVkU3RhdGU7aWYoZCYmIWMmJjAhPT0oYi5tb2RlJjIpKWlmKG51bGw9PT1hJiYhMCE9PWIubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFja3x8MCE9PShQLmN1cnJlbnQmMSkpMD09PVYmJihWPTMpO2Vsc2V7aWYoMD09PVZ8fDM9PT1WKVY9XG40O251bGw9PT1VfHwwPT09KERnJjEzNDIxNzcyNykmJjA9PT0oSGkmMTM0MjE3NzI3KXx8SWkoVSxXKX1pZihkfHxjKWIuZmxhZ3N8PTQ7cmV0dXJuIG51bGw7Y2FzZSA0OnJldHVybiBmaCgpLENpKGIpLG51bGw9PT1hJiZjZihiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxudWxsO2Nhc2UgMTA6cmV0dXJuIHJnKGIpLG51bGw7Y2FzZSAxNzpyZXR1cm4gRmYoYi50eXBlKSYmR2YoKSxudWxsO2Nhc2UgMTk6SChQKTtkPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09ZClyZXR1cm4gbnVsbDtmPTAhPT0oYi5mbGFncyY2NCk7Zz1kLnJlbmRlcmluZztpZihudWxsPT09ZylpZihmKUZpKGQsITEpO2Vsc2V7aWYoMCE9PVZ8fG51bGwhPT1hJiYwIT09KGEuZmxhZ3MmNjQpKWZvcihhPWIuY2hpbGQ7bnVsbCE9PWE7KXtnPWloKGEpO2lmKG51bGwhPT1nKXtiLmZsYWdzfD02NDtGaShkLCExKTtmPWcudXBkYXRlUXVldWU7bnVsbCE9PWYmJihiLnVwZGF0ZVF1ZXVlPWYsYi5mbGFnc3w9NCk7XG5udWxsPT09ZC5sYXN0RWZmZWN0JiYoYi5maXJzdEVmZmVjdD1udWxsKTtiLmxhc3RFZmZlY3Q9ZC5sYXN0RWZmZWN0O2Q9Yztmb3IoYz1iLmNoaWxkO251bGwhPT1jOylmPWMsYT1kLGYuZmxhZ3MmPTIsZi5uZXh0RWZmZWN0PW51bGwsZi5maXJzdEVmZmVjdD1udWxsLGYubGFzdEVmZmVjdD1udWxsLGc9Zi5hbHRlcm5hdGUsbnVsbD09PWc/KGYuY2hpbGRMYW5lcz0wLGYubGFuZXM9YSxmLmNoaWxkPW51bGwsZi5tZW1vaXplZFByb3BzPW51bGwsZi5tZW1vaXplZFN0YXRlPW51bGwsZi51cGRhdGVRdWV1ZT1udWxsLGYuZGVwZW5kZW5jaWVzPW51bGwsZi5zdGF0ZU5vZGU9bnVsbCk6KGYuY2hpbGRMYW5lcz1nLmNoaWxkTGFuZXMsZi5sYW5lcz1nLmxhbmVzLGYuY2hpbGQ9Zy5jaGlsZCxmLm1lbW9pemVkUHJvcHM9Zy5tZW1vaXplZFByb3BzLGYubWVtb2l6ZWRTdGF0ZT1nLm1lbW9pemVkU3RhdGUsZi51cGRhdGVRdWV1ZT1nLnVwZGF0ZVF1ZXVlLGYudHlwZT1nLnR5cGUsYT1nLmRlcGVuZGVuY2llcyxcbmYuZGVwZW5kZW5jaWVzPW51bGw9PT1hP251bGw6e2xhbmVzOmEubGFuZXMsZmlyc3RDb250ZXh0OmEuZmlyc3RDb250ZXh0fSksYz1jLnNpYmxpbmc7SShQLFAuY3VycmVudCYxfDIpO3JldHVybiBiLmNoaWxkfWE9YS5zaWJsaW5nfW51bGwhPT1kLnRhaWwmJk8oKT5KaSYmKGIuZmxhZ3N8PTY0LGY9ITAsRmkoZCwhMSksYi5sYW5lcz0zMzU1NDQzMil9ZWxzZXtpZighZilpZihhPWloKGcpLG51bGwhPT1hKXtpZihiLmZsYWdzfD02NCxmPSEwLGM9YS51cGRhdGVRdWV1ZSxudWxsIT09YyYmKGIudXBkYXRlUXVldWU9YyxiLmZsYWdzfD00KSxGaShkLCEwKSxudWxsPT09ZC50YWlsJiZcImhpZGRlblwiPT09ZC50YWlsTW9kZSYmIWcuYWx0ZXJuYXRlJiYhbGgpcmV0dXJuIGI9Yi5sYXN0RWZmZWN0PWQubGFzdEVmZmVjdCxudWxsIT09YiYmKGIubmV4dEVmZmVjdD1udWxsKSxudWxsfWVsc2UgMipPKCktZC5yZW5kZXJpbmdTdGFydFRpbWU+SmkmJjEwNzM3NDE4MjQhPT1jJiYoYi5mbGFnc3w9XG42NCxmPSEwLEZpKGQsITEpLGIubGFuZXM9MzM1NTQ0MzIpO2QuaXNCYWNrd2FyZHM/KGcuc2libGluZz1iLmNoaWxkLGIuY2hpbGQ9Zyk6KGM9ZC5sYXN0LG51bGwhPT1jP2Muc2libGluZz1nOmIuY2hpbGQ9ZyxkLmxhc3Q9Zyl9cmV0dXJuIG51bGwhPT1kLnRhaWw/KGM9ZC50YWlsLGQucmVuZGVyaW5nPWMsZC50YWlsPWMuc2libGluZyxkLmxhc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0LGQucmVuZGVyaW5nU3RhcnRUaW1lPU8oKSxjLnNpYmxpbmc9bnVsbCxiPVAuY3VycmVudCxJKFAsZj9iJjF8MjpiJjEpLGMpOm51bGw7Y2FzZSAyMzpjYXNlIDI0OnJldHVybiBLaSgpLG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlIT09KG51bGwhPT1iLm1lbW9pemVkU3RhdGUpJiZcInVuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nXCIhPT1kLm1vZGUmJihiLmZsYWdzfD00KSxudWxsfXRocm93IEVycm9yKHkoMTU2LGIudGFnKSk7fVxuZnVuY3Rpb24gTGkoYSl7c3dpdGNoKGEudGFnKXtjYXNlIDE6RmYoYS50eXBlKSYmR2YoKTt2YXIgYj1hLmZsYWdzO3JldHVybiBiJjQwOTY/KGEuZmxhZ3M9YiYtNDA5N3w2NCxhKTpudWxsO2Nhc2UgMzpmaCgpO0goTik7SChNKTt1aCgpO2I9YS5mbGFncztpZigwIT09KGImNjQpKXRocm93IEVycm9yKHkoMjg1KSk7YS5mbGFncz1iJi00MDk3fDY0O3JldHVybiBhO2Nhc2UgNTpyZXR1cm4gaGgoYSksbnVsbDtjYXNlIDEzOnJldHVybiBIKFApLGI9YS5mbGFncyxiJjQwOTY/KGEuZmxhZ3M9YiYtNDA5N3w2NCxhKTpudWxsO2Nhc2UgMTk6cmV0dXJuIEgoUCksbnVsbDtjYXNlIDQ6cmV0dXJuIGZoKCksbnVsbDtjYXNlIDEwOnJldHVybiByZyhhKSxudWxsO2Nhc2UgMjM6Y2FzZSAyNDpyZXR1cm4gS2koKSxudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24gTWkoYSxiKXt0cnl7dmFyIGM9XCJcIixkPWI7ZG8gYys9UWEoZCksZD1kLnJldHVybjt3aGlsZShkKTt2YXIgZT1jfWNhdGNoKGYpe2U9XCJcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBcIitmLm1lc3NhZ2UrXCJcXG5cIitmLnN0YWNrfXJldHVybnt2YWx1ZTphLHNvdXJjZTpiLHN0YWNrOmV9fWZ1bmN0aW9uIE5pKGEsYil7dHJ5e2NvbnNvbGUuZXJyb3IoYi52YWx1ZSl9Y2F0Y2goYyl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGM7fSl9fXZhciBPaT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgV2Vha01hcD9XZWFrTWFwOk1hcDtmdW5jdGlvbiBQaShhLGIsYyl7Yz16ZygtMSxjKTtjLnRhZz0zO2MucGF5bG9hZD17ZWxlbWVudDpudWxsfTt2YXIgZD1iLnZhbHVlO2MuY2FsbGJhY2s9ZnVuY3Rpb24oKXtRaXx8KFFpPSEwLFJpPWQpO05pKGEsYil9O3JldHVybiBjfVxuZnVuY3Rpb24gU2koYSxiLGMpe2M9emcoLTEsYyk7Yy50YWc9Mzt2YXIgZD1hLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgZT1iLnZhbHVlO2MucGF5bG9hZD1mdW5jdGlvbigpe05pKGEsYik7cmV0dXJuIGQoZSl9fXZhciBmPWEuc3RhdGVOb2RlO251bGwhPT1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnREaWRDYXRjaCYmKGMuY2FsbGJhY2s9ZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCIhPT10eXBlb2YgZCYmKG51bGw9PT1UaT9UaT1uZXcgU2V0KFt0aGlzXSk6VGkuYWRkKHRoaXMpLE5pKGEsYikpO3ZhciBjPWIuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChiLnZhbHVlLHtjb21wb25lbnRTdGFjazpudWxsIT09Yz9jOlwiXCJ9KX0pO3JldHVybiBjfXZhciBVaT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgV2Vha1NldD9XZWFrU2V0OlNldDtcbmZ1bmN0aW9uIFZpKGEpe3ZhciBiPWEucmVmO2lmKG51bGwhPT1iKWlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXRyeXtiKG51bGwpfWNhdGNoKGMpe1dpKGEsYyl9ZWxzZSBiLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBYaShhLGIpe3N3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDIyOnJldHVybjtjYXNlIDE6aWYoYi5mbGFncyYyNTYmJm51bGwhPT1hKXt2YXIgYz1hLm1lbW9pemVkUHJvcHMsZD1hLm1lbW9pemVkU3RhdGU7YT1iLnN0YXRlTm9kZTtiPWEuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoYi5lbGVtZW50VHlwZT09PWIudHlwZT9jOmxnKGIudHlwZSxjKSxkKTthLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlPWJ9cmV0dXJuO2Nhc2UgMzpiLmZsYWdzJjI1NiYmcWYoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7cmV0dXJuO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6cmV0dXJufXRocm93IEVycm9yKHkoMTYzKSk7fVxuZnVuY3Rpb24gWWkoYSxiLGMpe3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDIyOmI9Yy51cGRhdGVRdWV1ZTtiPW51bGwhPT1iP2IubGFzdEVmZmVjdDpudWxsO2lmKG51bGwhPT1iKXthPWI9Yi5uZXh0O2Rve2lmKDM9PT0oYS50YWcmMykpe3ZhciBkPWEuY3JlYXRlO2EuZGVzdHJveT1kKCl9YT1hLm5leHR9d2hpbGUoYSE9PWIpfWI9Yy51cGRhdGVRdWV1ZTtiPW51bGwhPT1iP2IubGFzdEVmZmVjdDpudWxsO2lmKG51bGwhPT1iKXthPWI9Yi5uZXh0O2Rve3ZhciBlPWE7ZD1lLm5leHQ7ZT1lLnRhZzswIT09KGUmNCkmJjAhPT0oZSYxKSYmKFppKGMsYSksJGkoYyxhKSk7YT1kfXdoaWxlKGEhPT1iKX1yZXR1cm47Y2FzZSAxOmE9Yy5zdGF0ZU5vZGU7Yy5mbGFncyY0JiYobnVsbD09PWI/YS5jb21wb25lbnREaWRNb3VudCgpOihkPWMuZWxlbWVudFR5cGU9PT1jLnR5cGU/Yi5tZW1vaXplZFByb3BzOmxnKGMudHlwZSxiLm1lbW9pemVkUHJvcHMpLGEuY29tcG9uZW50RGlkVXBkYXRlKGQsXG5iLm1lbW9pemVkU3RhdGUsYS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSkpKTtiPWMudXBkYXRlUXVldWU7bnVsbCE9PWImJkVnKGMsYixhKTtyZXR1cm47Y2FzZSAzOmI9Yy51cGRhdGVRdWV1ZTtpZihudWxsIT09Yil7YT1udWxsO2lmKG51bGwhPT1jLmNoaWxkKXN3aXRjaChjLmNoaWxkLnRhZyl7Y2FzZSA1OmE9Yy5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOmE9Yy5jaGlsZC5zdGF0ZU5vZGV9RWcoYyxiLGEpfXJldHVybjtjYXNlIDU6YT1jLnN0YXRlTm9kZTtudWxsPT09YiYmYy5mbGFncyY0JiZtZihjLnR5cGUsYy5tZW1vaXplZFByb3BzKSYmYS5mb2N1cygpO3JldHVybjtjYXNlIDY6cmV0dXJuO2Nhc2UgNDpyZXR1cm47Y2FzZSAxMjpyZXR1cm47Y2FzZSAxMzpudWxsPT09Yy5tZW1vaXplZFN0YXRlJiYoYz1jLmFsdGVybmF0ZSxudWxsIT09YyYmKGM9Yy5tZW1vaXplZFN0YXRlLG51bGwhPT1jJiYoYz1jLmRlaHlkcmF0ZWQsbnVsbCE9PWMmJkNjKGMpKSkpO1xucmV0dXJuO2Nhc2UgMTk6Y2FzZSAxNzpjYXNlIDIwOmNhc2UgMjE6Y2FzZSAyMzpjYXNlIDI0OnJldHVybn10aHJvdyBFcnJvcih5KDE2MykpO31cbmZ1bmN0aW9uIGFqKGEsYil7Zm9yKHZhciBjPWE7Oyl7aWYoNT09PWMudGFnKXt2YXIgZD1jLnN0YXRlTm9kZTtpZihiKWQ9ZC5zdHlsZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5zZXRQcm9wZXJ0eT9kLnNldFByb3BlcnR5KFwiZGlzcGxheVwiLFwibm9uZVwiLFwiaW1wb3J0YW50XCIpOmQuZGlzcGxheT1cIm5vbmVcIjtlbHNle2Q9Yy5zdGF0ZU5vZGU7dmFyIGU9Yy5tZW1vaXplZFByb3BzLnN0eWxlO2U9dm9pZCAwIT09ZSYmbnVsbCE9PWUmJmUuaGFzT3duUHJvcGVydHkoXCJkaXNwbGF5XCIpP2UuZGlzcGxheTpudWxsO2Quc3R5bGUuZGlzcGxheT1zYihcImRpc3BsYXlcIixlKX19ZWxzZSBpZig2PT09Yy50YWcpYy5zdGF0ZU5vZGUubm9kZVZhbHVlPWI/XCJcIjpjLm1lbW9pemVkUHJvcHM7ZWxzZSBpZigoMjMhPT1jLnRhZyYmMjQhPT1jLnRhZ3x8bnVsbD09PWMubWVtb2l6ZWRTdGF0ZXx8Yz09PWEpJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PVxuYSlicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YSlyZXR1cm47Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX1cbmZ1bmN0aW9uIGJqKGEsYil7aWYoTWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBNZi5vbkNvbW1pdEZpYmVyVW5tb3VudCl0cnl7TWYub25Db21taXRGaWJlclVubW91bnQoTGYsYil9Y2F0Y2goZil7fXN3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmNhc2UgMjI6YT1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1hJiYoYT1hLmxhc3RFZmZlY3QsbnVsbCE9PWEpKXt2YXIgYz1hPWEubmV4dDtkb3t2YXIgZD1jLGU9ZC5kZXN0cm95O2Q9ZC50YWc7aWYodm9pZCAwIT09ZSlpZigwIT09KGQmNCkpWmkoYixjKTtlbHNle2Q9Yjt0cnl7ZSgpfWNhdGNoKGYpe1dpKGQsZil9fWM9Yy5uZXh0fXdoaWxlKGMhPT1hKX1icmVhaztjYXNlIDE6VmkoYik7YT1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYS5jb21wb25lbnRXaWxsVW5tb3VudCl0cnl7YS5wcm9wcz1iLm1lbW9pemVkUHJvcHMsYS5zdGF0ZT1iLm1lbW9pemVkU3RhdGUsYS5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKGYpe1dpKGIsXG5mKX1icmVhaztjYXNlIDU6VmkoYik7YnJlYWs7Y2FzZSA0OmNqKGEsYil9fWZ1bmN0aW9uIGRqKGEpe2EuYWx0ZXJuYXRlPW51bGw7YS5jaGlsZD1udWxsO2EuZGVwZW5kZW5jaWVzPW51bGw7YS5maXJzdEVmZmVjdD1udWxsO2EubGFzdEVmZmVjdD1udWxsO2EubWVtb2l6ZWRQcm9wcz1udWxsO2EubWVtb2l6ZWRTdGF0ZT1udWxsO2EucGVuZGluZ1Byb3BzPW51bGw7YS5yZXR1cm49bnVsbDthLnVwZGF0ZVF1ZXVlPW51bGx9ZnVuY3Rpb24gZWooYSl7cmV0dXJuIDU9PT1hLnRhZ3x8Mz09PWEudGFnfHw0PT09YS50YWd9XG5mdW5jdGlvbiBmaihhKXthOntmb3IodmFyIGI9YS5yZXR1cm47bnVsbCE9PWI7KXtpZihlaihiKSlicmVhayBhO2I9Yi5yZXR1cm59dGhyb3cgRXJyb3IoeSgxNjApKTt9dmFyIGM9YjtiPWMuc3RhdGVOb2RlO3N3aXRjaChjLnRhZyl7Y2FzZSA1OnZhciBkPSExO2JyZWFrO2Nhc2UgMzpiPWIuY29udGFpbmVySW5mbztkPSEwO2JyZWFrO2Nhc2UgNDpiPWIuY29udGFpbmVySW5mbztkPSEwO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoeSgxNjEpKTt9Yy5mbGFncyYxNiYmKHBiKGIsXCJcIiksYy5mbGFncyY9LTE3KTthOmI6Zm9yKGM9YTs7KXtmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGVqKGMucmV0dXJuKSl7Yz1udWxsO2JyZWFrIGF9Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2ZvcihjPWMuc2libGluZzs1IT09Yy50YWcmJjYhPT1jLnRhZyYmMTghPT1jLnRhZzspe2lmKGMuZmxhZ3MmMiljb250aW51ZSBiO2lmKG51bGw9PT1cbmMuY2hpbGR8fDQ9PT1jLnRhZyljb250aW51ZSBiO2Vsc2UgYy5jaGlsZC5yZXR1cm49YyxjPWMuY2hpbGR9aWYoIShjLmZsYWdzJjIpKXtjPWMuc3RhdGVOb2RlO2JyZWFrIGF9fWQ/Z2ooYSxjLGIpOmhqKGEsYyxiKX1cbmZ1bmN0aW9uIGdqKGEsYixjKXt2YXIgZD1hLnRhZyxlPTU9PT1kfHw2PT09ZDtpZihlKWE9ZT9hLnN0YXRlTm9kZTphLnN0YXRlTm9kZS5pbnN0YW5jZSxiPzg9PT1jLm5vZGVUeXBlP2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxiKTpjLmluc2VydEJlZm9yZShhLGIpOig4PT09Yy5ub2RlVHlwZT8oYj1jLnBhcmVudE5vZGUsYi5pbnNlcnRCZWZvcmUoYSxjKSk6KGI9YyxiLmFwcGVuZENoaWxkKGEpKSxjPWMuX3JlYWN0Um9vdENvbnRhaW5lcixudWxsIT09YyYmdm9pZCAwIT09Y3x8bnVsbCE9PWIub25jbGlja3x8KGIub25jbGljaz1qZikpO2Vsc2UgaWYoNCE9PWQmJihhPWEuY2hpbGQsbnVsbCE9PWEpKWZvcihnaihhLGIsYyksYT1hLnNpYmxpbmc7bnVsbCE9PWE7KWdqKGEsYixjKSxhPWEuc2libGluZ31cbmZ1bmN0aW9uIGhqKGEsYixjKXt2YXIgZD1hLnRhZyxlPTU9PT1kfHw2PT09ZDtpZihlKWE9ZT9hLnN0YXRlTm9kZTphLnN0YXRlTm9kZS5pbnN0YW5jZSxiP2MuaW5zZXJ0QmVmb3JlKGEsYik6Yy5hcHBlbmRDaGlsZChhKTtlbHNlIGlmKDQhPT1kJiYoYT1hLmNoaWxkLG51bGwhPT1hKSlmb3IoaGooYSxiLGMpLGE9YS5zaWJsaW5nO251bGwhPT1hOyloaihhLGIsYyksYT1hLnNpYmxpbmd9XG5mdW5jdGlvbiBjaihhLGIpe2Zvcih2YXIgYz1iLGQ9ITEsZSxmOzspe2lmKCFkKXtkPWMucmV0dXJuO2E6Zm9yKDs7KXtpZihudWxsPT09ZCl0aHJvdyBFcnJvcih5KDE2MCkpO2U9ZC5zdGF0ZU5vZGU7c3dpdGNoKGQudGFnKXtjYXNlIDU6Zj0hMTticmVhayBhO2Nhc2UgMzplPWUuY29udGFpbmVySW5mbztmPSEwO2JyZWFrIGE7Y2FzZSA0OmU9ZS5jb250YWluZXJJbmZvO2Y9ITA7YnJlYWsgYX1kPWQucmV0dXJufWQ9ITB9aWYoNT09PWMudGFnfHw2PT09Yy50YWcpe2E6Zm9yKHZhciBnPWEsaD1jLGs9aDs7KWlmKGJqKGcsayksbnVsbCE9PWsuY2hpbGQmJjQhPT1rLnRhZylrLmNoaWxkLnJldHVybj1rLGs9ay5jaGlsZDtlbHNle2lmKGs9PT1oKWJyZWFrIGE7Zm9yKDtudWxsPT09ay5zaWJsaW5nOyl7aWYobnVsbD09PWsucmV0dXJufHxrLnJldHVybj09PWgpYnJlYWsgYTtrPWsucmV0dXJufWsuc2libGluZy5yZXR1cm49ay5yZXR1cm47az1rLnNpYmxpbmd9Zj8oZz1lLGg9Yy5zdGF0ZU5vZGUsXG44PT09Zy5ub2RlVHlwZT9nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCk6Zy5yZW1vdmVDaGlsZChoKSk6ZS5yZW1vdmVDaGlsZChjLnN0YXRlTm9kZSl9ZWxzZSBpZig0PT09Yy50YWcpe2lmKG51bGwhPT1jLmNoaWxkKXtlPWMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87Zj0hMDtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX19ZWxzZSBpZihiaihhLGMpLG51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09YilicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YilyZXR1cm47Yz1jLnJldHVybjs0PT09Yy50YWcmJihkPSExKX1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX1cbmZ1bmN0aW9uIGlqKGEsYil7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6Y2FzZSAyMjp2YXIgYz1iLnVwZGF0ZVF1ZXVlO2M9bnVsbCE9PWM/Yy5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWMpe3ZhciBkPWM9Yy5uZXh0O2RvIDM9PT0oZC50YWcmMykmJihhPWQuZGVzdHJveSxkLmRlc3Ryb3k9dm9pZCAwLHZvaWQgMCE9PWEmJmEoKSksZD1kLm5leHQ7d2hpbGUoZCE9PWMpfXJldHVybjtjYXNlIDE6cmV0dXJuO2Nhc2UgNTpjPWIuc3RhdGVOb2RlO2lmKG51bGwhPWMpe2Q9Yi5tZW1vaXplZFByb3BzO3ZhciBlPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpkO2E9Yi50eXBlO3ZhciBmPWIudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT1udWxsO2lmKG51bGwhPT1mKXtjW3hmXT1kO1wiaW5wdXRcIj09PWEmJlwicmFkaW9cIj09PWQudHlwZSYmbnVsbCE9ZC5uYW1lJiYkYShjLGQpO3diKGEsZSk7Yj13YihhLGQpO2ZvcihlPTA7ZTxmLmxlbmd0aDtlKz1cbjIpe3ZhciBnPWZbZV0saD1mW2UrMV07XCJzdHlsZVwiPT09Zz90YihjLGgpOlwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWc/b2IoYyxoKTpcImNoaWxkcmVuXCI9PT1nP3BiKGMsaCk6cWEoYyxnLGgsYil9c3dpdGNoKGEpe2Nhc2UgXCJpbnB1dFwiOmFiKGMsZCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aWIoYyxkKTticmVhaztjYXNlIFwic2VsZWN0XCI6YT1jLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUsYy5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhZC5tdWx0aXBsZSxmPWQudmFsdWUsbnVsbCE9Zj9mYihjLCEhZC5tdWx0aXBsZSxmLCExKTphIT09ISFkLm11bHRpcGxlJiYobnVsbCE9ZC5kZWZhdWx0VmFsdWU/ZmIoYywhIWQubXVsdGlwbGUsZC5kZWZhdWx0VmFsdWUsITApOmZiKGMsISFkLm11bHRpcGxlLGQubXVsdGlwbGU/W106XCJcIiwhMSkpfX19cmV0dXJuO2Nhc2UgNjppZihudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoeSgxNjIpKTtiLnN0YXRlTm9kZS5ub2RlVmFsdWU9XG5iLm1lbW9pemVkUHJvcHM7cmV0dXJuO2Nhc2UgMzpjPWIuc3RhdGVOb2RlO2MuaHlkcmF0ZSYmKGMuaHlkcmF0ZT0hMSxDYyhjLmNvbnRhaW5lckluZm8pKTtyZXR1cm47Y2FzZSAxMjpyZXR1cm47Y2FzZSAxMzpudWxsIT09Yi5tZW1vaXplZFN0YXRlJiYoamo9TygpLGFqKGIuY2hpbGQsITApKTtraihiKTtyZXR1cm47Y2FzZSAxOTpraihiKTtyZXR1cm47Y2FzZSAxNzpyZXR1cm47Y2FzZSAyMzpjYXNlIDI0OmFqKGIsbnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSk7cmV0dXJufXRocm93IEVycm9yKHkoMTYzKSk7fWZ1bmN0aW9uIGtqKGEpe3ZhciBiPWEudXBkYXRlUXVldWU7aWYobnVsbCE9PWIpe2EudXBkYXRlUXVldWU9bnVsbDt2YXIgYz1hLnN0YXRlTm9kZTtudWxsPT09YyYmKGM9YS5zdGF0ZU5vZGU9bmV3IFVpKTtiLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9bGouYmluZChudWxsLGEsYik7Yy5oYXMoYil8fChjLmFkZChiKSxiLnRoZW4oZCxkKSl9KX19XG5mdW5jdGlvbiBtaihhLGIpe3JldHVybiBudWxsIT09YSYmKGE9YS5tZW1vaXplZFN0YXRlLG51bGw9PT1hfHxudWxsIT09YS5kZWh5ZHJhdGVkKT8oYj1iLm1lbW9pemVkU3RhdGUsbnVsbCE9PWImJm51bGw9PT1iLmRlaHlkcmF0ZWQpOiExfXZhciBuaj1NYXRoLmNlaWwsb2o9cmEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixwaj1yYS5SZWFjdEN1cnJlbnRPd25lcixYPTAsVT1udWxsLFk9bnVsbCxXPTAscWo9MCxyaj1CZigwKSxWPTAsc2o9bnVsbCx0aj0wLERnPTAsSGk9MCx1aj0wLHZqPW51bGwsamo9MCxKaT1JbmZpbml0eTtmdW5jdGlvbiB3aigpe0ppPU8oKSs1MDB9dmFyIFo9bnVsbCxRaT0hMSxSaT1udWxsLFRpPW51bGwseGo9ITEseWo9bnVsbCx6aj05MCxBaj1bXSxCaj1bXSxDaj1udWxsLERqPTAsRWo9bnVsbCxGaj0tMSxHaj0wLEhqPTAsSWo9bnVsbCxKaj0hMTtmdW5jdGlvbiBIZygpe3JldHVybiAwIT09KFgmNDgpP08oKTotMSE9PUZqP0ZqOkZqPU8oKX1cbmZ1bmN0aW9uIElnKGEpe2E9YS5tb2RlO2lmKDA9PT0oYSYyKSlyZXR1cm4gMTtpZigwPT09KGEmNCkpcmV0dXJuIDk5PT09ZWcoKT8xOjI7MD09PUdqJiYoR2o9dGopO2lmKDAhPT1rZy50cmFuc2l0aW9uKXswIT09SGomJihIaj1udWxsIT09dmo/dmoucGVuZGluZ0xhbmVzOjApO2E9R2o7dmFyIGI9NDE4NjExMiZ+SGo7YiY9LWI7MD09PWImJihhPTQxODYxMTImfmEsYj1hJi1hLDA9PT1iJiYoYj04MTkyKSk7cmV0dXJuIGJ9YT1lZygpOzAhPT0oWCY0KSYmOTg9PT1hP2E9WGMoMTIsR2opOihhPVNjKGEpLGE9WGMoYSxHaikpO3JldHVybiBhfVxuZnVuY3Rpb24gSmcoYSxiLGMpe2lmKDUwPERqKXRocm93IERqPTAsRWo9bnVsbCxFcnJvcih5KDE4NSkpO2E9S2ooYSxiKTtpZihudWxsPT09YSlyZXR1cm4gbnVsbDskYyhhLGIsYyk7YT09PVUmJihIaXw9Yiw0PT09ViYmSWkoYSxXKSk7dmFyIGQ9ZWcoKTsxPT09Yj8wIT09KFgmOCkmJjA9PT0oWCY0OCk/TGooYSk6KE1qKGEsYyksMD09PVgmJih3aigpLGlnKCkpKTooMD09PShYJjQpfHw5OCE9PWQmJjk5IT09ZHx8KG51bGw9PT1Daj9Daj1uZXcgU2V0KFthXSk6Q2ouYWRkKGEpKSxNaihhLGMpKTt2aj1hfWZ1bmN0aW9uIEtqKGEsYil7YS5sYW5lc3w9Yjt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmKGMubGFuZXN8PWIpO2M9YTtmb3IoYT1hLnJldHVybjtudWxsIT09YTspYS5jaGlsZExhbmVzfD1iLGM9YS5hbHRlcm5hdGUsbnVsbCE9PWMmJihjLmNoaWxkTGFuZXN8PWIpLGM9YSxhPWEucmV0dXJuO3JldHVybiAzPT09Yy50YWc/Yy5zdGF0ZU5vZGU6bnVsbH1cbmZ1bmN0aW9uIE1qKGEsYil7Zm9yKHZhciBjPWEuY2FsbGJhY2tOb2RlLGQ9YS5zdXNwZW5kZWRMYW5lcyxlPWEucGluZ2VkTGFuZXMsZj1hLmV4cGlyYXRpb25UaW1lcyxnPWEucGVuZGluZ0xhbmVzOzA8Zzspe3ZhciBoPTMxLVZjKGcpLGs9MTw8aCxsPWZbaF07aWYoLTE9PT1sKXtpZigwPT09KGsmZCl8fDAhPT0oayZlKSl7bD1iO1JjKGspO3ZhciBuPUY7ZltoXT0xMDw9bj9sKzI1MDo2PD1uP2wrNUUzOi0xfX1lbHNlIGw8PWImJihhLmV4cGlyZWRMYW5lc3w9ayk7ZyY9fmt9ZD1VYyhhLGE9PT1VP1c6MCk7Yj1GO2lmKDA9PT1kKW51bGwhPT1jJiYoYyE9PVpmJiZQZihjKSxhLmNhbGxiYWNrTm9kZT1udWxsLGEuY2FsbGJhY2tQcmlvcml0eT0wKTtlbHNle2lmKG51bGwhPT1jKXtpZihhLmNhbGxiYWNrUHJpb3JpdHk9PT1iKXJldHVybjtjIT09WmYmJlBmKGMpfTE1PT09Yj8oYz1Mai5iaW5kKG51bGwsYSksbnVsbD09PWFnPyhhZz1bY10sYmc9T2YoVWYsamcpKTphZy5wdXNoKGMpLFxuYz1aZik6MTQ9PT1iP2M9aGcoOTksTGouYmluZChudWxsLGEpKTooYz1UYyhiKSxjPWhnKGMsTmouYmluZChudWxsLGEpKSk7YS5jYWxsYmFja1ByaW9yaXR5PWI7YS5jYWxsYmFja05vZGU9Y319XG5mdW5jdGlvbiBOaihhKXtGaj0tMTtIaj1Haj0wO2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMjcpKTt2YXIgYj1hLmNhbGxiYWNrTm9kZTtpZihPaigpJiZhLmNhbGxiYWNrTm9kZSE9PWIpcmV0dXJuIG51bGw7dmFyIGM9VWMoYSxhPT09VT9XOjApO2lmKDA9PT1jKXJldHVybiBudWxsO3ZhciBkPWM7dmFyIGU9WDtYfD0xNjt2YXIgZj1QaigpO2lmKFUhPT1hfHxXIT09ZCl3aigpLFFqKGEsZCk7ZG8gdHJ5e1JqKCk7YnJlYWt9Y2F0Y2goaCl7U2ooYSxoKX13aGlsZSgxKTtxZygpO29qLmN1cnJlbnQ9ZjtYPWU7bnVsbCE9PVk/ZD0wOihVPW51bGwsVz0wLGQ9Vik7aWYoMCE9PSh0aiZIaSkpUWooYSwwKTtlbHNlIGlmKDAhPT1kKXsyPT09ZCYmKFh8PTY0LGEuaHlkcmF0ZSYmKGEuaHlkcmF0ZT0hMSxxZihhLmNvbnRhaW5lckluZm8pKSxjPVdjKGEpLDAhPT1jJiYoZD1UaihhLGMpKSk7aWYoMT09PWQpdGhyb3cgYj1zaixRaihhLDApLElpKGEsYyksTWooYSxPKCkpLGI7YS5maW5pc2hlZFdvcms9XG5hLmN1cnJlbnQuYWx0ZXJuYXRlO2EuZmluaXNoZWRMYW5lcz1jO3N3aXRjaChkKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKHkoMzQ1KSk7Y2FzZSAyOlVqKGEpO2JyZWFrO2Nhc2UgMzpJaShhLGMpO2lmKChjJjYyOTE0NTYwKT09PWMmJihkPWpqKzUwMC1PKCksMTA8ZCkpe2lmKDAhPT1VYyhhLDApKWJyZWFrO2U9YS5zdXNwZW5kZWRMYW5lcztpZigoZSZjKSE9PWMpe0hnKCk7YS5waW5nZWRMYW5lc3w9YS5zdXNwZW5kZWRMYW5lcyZlO2JyZWFrfWEudGltZW91dEhhbmRsZT1vZihVai5iaW5kKG51bGwsYSksZCk7YnJlYWt9VWooYSk7YnJlYWs7Y2FzZSA0OklpKGEsYyk7aWYoKGMmNDE4NjExMik9PT1jKWJyZWFrO2Q9YS5ldmVudFRpbWVzO2ZvcihlPS0xOzA8Yzspe3ZhciBnPTMxLVZjKGMpO2Y9MTw8ZztnPWRbZ107Zz5lJiYoZT1nKTtjJj1+Zn1jPWU7Yz1PKCktYztjPSgxMjA+Yz8xMjA6NDgwPmM/NDgwOjEwODA+Yz8xMDgwOjE5MjA+Yz8xOTIwOjNFMz5jPzNFMzo0MzIwPlxuYz80MzIwOjE5NjAqbmooYy8xOTYwKSktYztpZigxMDxjKXthLnRpbWVvdXRIYW5kbGU9b2YoVWouYmluZChudWxsLGEpLGMpO2JyZWFrfVVqKGEpO2JyZWFrO2Nhc2UgNTpVaihhKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHkoMzI5KSk7fX1NaihhLE8oKSk7cmV0dXJuIGEuY2FsbGJhY2tOb2RlPT09Yj9Oai5iaW5kKG51bGwsYSk6bnVsbH1mdW5jdGlvbiBJaShhLGIpe2ImPX51ajtiJj1+SGk7YS5zdXNwZW5kZWRMYW5lc3w9YjthLnBpbmdlZExhbmVzJj1+Yjtmb3IoYT1hLmV4cGlyYXRpb25UaW1lczswPGI7KXt2YXIgYz0zMS1WYyhiKSxkPTE8PGM7YVtjXT0tMTtiJj1+ZH19XG5mdW5jdGlvbiBMaihhKXtpZigwIT09KFgmNDgpKXRocm93IEVycm9yKHkoMzI3KSk7T2ooKTtpZihhPT09VSYmMCE9PShhLmV4cGlyZWRMYW5lcyZXKSl7dmFyIGI9Vzt2YXIgYz1UaihhLGIpOzAhPT0odGomSGkpJiYoYj1VYyhhLGIpLGM9VGooYSxiKSl9ZWxzZSBiPVVjKGEsMCksYz1UaihhLGIpOzAhPT1hLnRhZyYmMj09PWMmJihYfD02NCxhLmh5ZHJhdGUmJihhLmh5ZHJhdGU9ITEscWYoYS5jb250YWluZXJJbmZvKSksYj1XYyhhKSwwIT09YiYmKGM9VGooYSxiKSkpO2lmKDE9PT1jKXRocm93IGM9c2osUWooYSwwKSxJaShhLGIpLE1qKGEsTygpKSxjO2EuZmluaXNoZWRXb3JrPWEuY3VycmVudC5hbHRlcm5hdGU7YS5maW5pc2hlZExhbmVzPWI7VWooYSk7TWooYSxPKCkpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gVmooKXtpZihudWxsIT09Q2ope3ZhciBhPUNqO0NqPW51bGw7YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZXhwaXJlZExhbmVzfD0yNCZhLnBlbmRpbmdMYW5lcztNaihhLE8oKSl9KX1pZygpfWZ1bmN0aW9uIFdqKGEsYil7dmFyIGM9WDtYfD0xO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1g9YywwPT09WCYmKHdqKCksaWcoKSl9fWZ1bmN0aW9uIFhqKGEsYil7dmFyIGM9WDtYJj0tMjtYfD04O3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1g9YywwPT09WCYmKHdqKCksaWcoKSl9fWZ1bmN0aW9uIG5pKGEsYil7SShyaixxaik7cWp8PWI7dGp8PWJ9ZnVuY3Rpb24gS2koKXtxaj1yai5jdXJyZW50O0gocmopfVxuZnVuY3Rpb24gUWooYSxiKXthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO3ZhciBjPWEudGltZW91dEhhbmRsZTstMSE9PWMmJihhLnRpbWVvdXRIYW5kbGU9LTEscGYoYykpO2lmKG51bGwhPT1ZKWZvcihjPVkucmV0dXJuO251bGwhPT1jOyl7dmFyIGQ9Yztzd2l0Y2goZC50YWcpe2Nhc2UgMTpkPWQudHlwZS5jaGlsZENvbnRleHRUeXBlcztudWxsIT09ZCYmdm9pZCAwIT09ZCYmR2YoKTticmVhaztjYXNlIDM6ZmgoKTtIKE4pO0goTSk7dWgoKTticmVhaztjYXNlIDU6aGgoZCk7YnJlYWs7Y2FzZSA0OmZoKCk7YnJlYWs7Y2FzZSAxMzpIKFApO2JyZWFrO2Nhc2UgMTk6SChQKTticmVhaztjYXNlIDEwOnJnKGQpO2JyZWFrO2Nhc2UgMjM6Y2FzZSAyNDpLaSgpfWM9Yy5yZXR1cm59VT1hO1k9VGcoYS5jdXJyZW50LG51bGwpO1c9cWo9dGo9YjtWPTA7c2o9bnVsbDt1aj1IaT1EZz0wfVxuZnVuY3Rpb24gU2ooYSxiKXtkb3t2YXIgYz1ZO3RyeXtxZygpO3ZoLmN1cnJlbnQ9R2g7aWYoeWgpe2Zvcih2YXIgZD1SLm1lbW9pemVkU3RhdGU7bnVsbCE9PWQ7KXt2YXIgZT1kLnF1ZXVlO251bGwhPT1lJiYoZS5wZW5kaW5nPW51bGwpO2Q9ZC5uZXh0fXloPSExfXhoPTA7VD1TPVI9bnVsbDt6aD0hMTtwai5jdXJyZW50PW51bGw7aWYobnVsbD09PWN8fG51bGw9PT1jLnJldHVybil7Vj0xO3NqPWI7WT1udWxsO2JyZWFrfWE6e3ZhciBmPWEsZz1jLnJldHVybixoPWMsaz1iO2I9VztoLmZsYWdzfD0yMDQ4O2guZmlyc3RFZmZlY3Q9aC5sYXN0RWZmZWN0PW51bGw7aWYobnVsbCE9PWsmJlwib2JqZWN0XCI9PT10eXBlb2YgayYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGsudGhlbil7dmFyIGw9aztpZigwPT09KGgubW9kZSYyKSl7dmFyIG49aC5hbHRlcm5hdGU7bj8oaC51cGRhdGVRdWV1ZT1uLnVwZGF0ZVF1ZXVlLGgubWVtb2l6ZWRTdGF0ZT1uLm1lbW9pemVkU3RhdGUsaC5sYW5lcz1uLmxhbmVzKTpcbihoLnVwZGF0ZVF1ZXVlPW51bGwsaC5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBBPTAhPT0oUC5jdXJyZW50JjEpLHA9Zztkb3t2YXIgQztpZihDPTEzPT09cC50YWcpe3ZhciB4PXAubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09eClDPW51bGwhPT14LmRlaHlkcmF0ZWQ/ITA6ITE7ZWxzZXt2YXIgdz1wLm1lbW9pemVkUHJvcHM7Qz12b2lkIDA9PT13LmZhbGxiYWNrPyExOiEwIT09dy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjaz8hMDpBPyExOiEwfX1pZihDKXt2YXIgej1wLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT16KXt2YXIgdT1uZXcgU2V0O3UuYWRkKGwpO3AudXBkYXRlUXVldWU9dX1lbHNlIHouYWRkKGwpO2lmKDA9PT0ocC5tb2RlJjIpKXtwLmZsYWdzfD02NDtoLmZsYWdzfD0xNjM4NDtoLmZsYWdzJj0tMjk4MTtpZigxPT09aC50YWcpaWYobnVsbD09PWguYWx0ZXJuYXRlKWgudGFnPTE3O2Vsc2V7dmFyIHQ9emcoLTEsMSk7dC50YWc9MjtBZyhoLHQpfWgubGFuZXN8PTE7YnJlYWsgYX1rPVxudm9pZCAwO2g9Yjt2YXIgcT1mLnBpbmdDYWNoZTtudWxsPT09cT8ocT1mLnBpbmdDYWNoZT1uZXcgT2ksaz1uZXcgU2V0LHEuc2V0KGwsaykpOihrPXEuZ2V0KGwpLHZvaWQgMD09PWsmJihrPW5ldyBTZXQscS5zZXQobCxrKSkpO2lmKCFrLmhhcyhoKSl7ay5hZGQoaCk7dmFyIHY9WWouYmluZChudWxsLGYsbCxoKTtsLnRoZW4odix2KX1wLmZsYWdzfD00MDk2O3AubGFuZXM9YjticmVhayBhfXA9cC5yZXR1cm59d2hpbGUobnVsbCE9PXApO2s9RXJyb3IoKFJhKGgudHlwZSl8fFwiQSBSZWFjdCBjb21wb25lbnRcIikrXCIgc3VzcGVuZGVkIHdoaWxlIHJlbmRlcmluZywgYnV0IG5vIGZhbGxiYWNrIFVJIHdhcyBzcGVjaWZpZWQuXFxuXFxuQWRkIGEgPFN1c3BlbnNlIGZhbGxiYWNrPS4uLj4gY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgdHJlZSB0byBwcm92aWRlIGEgbG9hZGluZyBpbmRpY2F0b3Igb3IgcGxhY2Vob2xkZXIgdG8gZGlzcGxheS5cIil9NSE9PVYmJihWPTIpO2s9TWkoayxoKTtwPVxuZztkb3tzd2l0Y2gocC50YWcpe2Nhc2UgMzpmPWs7cC5mbGFnc3w9NDA5NjtiJj0tYjtwLmxhbmVzfD1iO3ZhciBKPVBpKHAsZixiKTtCZyhwLEopO2JyZWFrIGE7Y2FzZSAxOmY9azt2YXIgSz1wLnR5cGUsUT1wLnN0YXRlTm9kZTtpZigwPT09KHAuZmxhZ3MmNjQpJiYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEsuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yfHxudWxsIT09USYmXCJmdW5jdGlvblwiPT09dHlwZW9mIFEuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09VGl8fCFUaS5oYXMoUSkpKSl7cC5mbGFnc3w9NDA5NjtiJj0tYjtwLmxhbmVzfD1iO3ZhciBMPVNpKHAsZixiKTtCZyhwLEwpO2JyZWFrIGF9fXA9cC5yZXR1cm59d2hpbGUobnVsbCE9PXApfVpqKGMpfWNhdGNoKHZhKXtiPXZhO1k9PT1jJiZudWxsIT09YyYmKFk9Yz1jLnJldHVybik7Y29udGludWV9YnJlYWt9d2hpbGUoMSl9XG5mdW5jdGlvbiBQaigpe3ZhciBhPW9qLmN1cnJlbnQ7b2ouY3VycmVudD1HaDtyZXR1cm4gbnVsbD09PWE/R2g6YX1mdW5jdGlvbiBUaihhLGIpe3ZhciBjPVg7WHw9MTY7dmFyIGQ9UGooKTtVPT09YSYmVz09PWJ8fFFqKGEsYik7ZG8gdHJ5e2FrKCk7YnJlYWt9Y2F0Y2goZSl7U2ooYSxlKX13aGlsZSgxKTtxZygpO1g9Yztvai5jdXJyZW50PWQ7aWYobnVsbCE9PVkpdGhyb3cgRXJyb3IoeSgyNjEpKTtVPW51bGw7Vz0wO3JldHVybiBWfWZ1bmN0aW9uIGFrKCl7Zm9yKDtudWxsIT09WTspYmsoWSl9ZnVuY3Rpb24gUmooKXtmb3IoO251bGwhPT1ZJiYhUWYoKTspYmsoWSl9ZnVuY3Rpb24gYmsoYSl7dmFyIGI9Y2soYS5hbHRlcm5hdGUsYSxxaik7YS5tZW1vaXplZFByb3BzPWEucGVuZGluZ1Byb3BzO251bGw9PT1iP1pqKGEpOlk9Yjtwai5jdXJyZW50PW51bGx9XG5mdW5jdGlvbiBaaihhKXt2YXIgYj1hO2Rve3ZhciBjPWIuYWx0ZXJuYXRlO2E9Yi5yZXR1cm47aWYoMD09PShiLmZsYWdzJjIwNDgpKXtjPUdpKGMsYixxaik7aWYobnVsbCE9PWMpe1k9YztyZXR1cm59Yz1iO2lmKDI0IT09Yy50YWcmJjIzIT09Yy50YWd8fG51bGw9PT1jLm1lbW9pemVkU3RhdGV8fDAhPT0ocWomMTA3Mzc0MTgyNCl8fDA9PT0oYy5tb2RlJjQpKXtmb3IodmFyIGQ9MCxlPWMuY2hpbGQ7bnVsbCE9PWU7KWR8PWUubGFuZXN8ZS5jaGlsZExhbmVzLGU9ZS5zaWJsaW5nO2MuY2hpbGRMYW5lcz1kfW51bGwhPT1hJiYwPT09KGEuZmxhZ3MmMjA0OCkmJihudWxsPT09YS5maXJzdEVmZmVjdCYmKGEuZmlyc3RFZmZlY3Q9Yi5maXJzdEVmZmVjdCksbnVsbCE9PWIubGFzdEVmZmVjdCYmKG51bGwhPT1hLmxhc3RFZmZlY3QmJihhLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1iLmZpcnN0RWZmZWN0KSxhLmxhc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0KSwxPGIuZmxhZ3MmJihudWxsIT09XG5hLmxhc3RFZmZlY3Q/YS5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YjphLmZpcnN0RWZmZWN0PWIsYS5sYXN0RWZmZWN0PWIpKX1lbHNle2M9TGkoYik7aWYobnVsbCE9PWMpe2MuZmxhZ3MmPTIwNDc7WT1jO3JldHVybn1udWxsIT09YSYmKGEuZmlyc3RFZmZlY3Q9YS5sYXN0RWZmZWN0PW51bGwsYS5mbGFnc3w9MjA0OCl9Yj1iLnNpYmxpbmc7aWYobnVsbCE9PWIpe1k9YjtyZXR1cm59WT1iPWF9d2hpbGUobnVsbCE9PWIpOzA9PT1WJiYoVj01KX1mdW5jdGlvbiBVaihhKXt2YXIgYj1lZygpO2dnKDk5LGRrLmJpbmQobnVsbCxhLGIpKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGRrKGEsYil7ZG8gT2ooKTt3aGlsZShudWxsIT09eWopO2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMjcpKTt2YXIgYz1hLmZpbmlzaGVkV29yaztpZihudWxsPT09YylyZXR1cm4gbnVsbDthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO2lmKGM9PT1hLmN1cnJlbnQpdGhyb3cgRXJyb3IoeSgxNzcpKTthLmNhbGxiYWNrTm9kZT1udWxsO3ZhciBkPWMubGFuZXN8Yy5jaGlsZExhbmVzLGU9ZCxmPWEucGVuZGluZ0xhbmVzJn5lO2EucGVuZGluZ0xhbmVzPWU7YS5zdXNwZW5kZWRMYW5lcz0wO2EucGluZ2VkTGFuZXM9MDthLmV4cGlyZWRMYW5lcyY9ZTthLm11dGFibGVSZWFkTGFuZXMmPWU7YS5lbnRhbmdsZWRMYW5lcyY9ZTtlPWEuZW50YW5nbGVtZW50cztmb3IodmFyIGc9YS5ldmVudFRpbWVzLGg9YS5leHBpcmF0aW9uVGltZXM7MDxmOyl7dmFyIGs9MzEtVmMoZiksbD0xPDxrO2Vba109MDtnW2tdPS0xO2hba109LTE7ZiY9fmx9bnVsbCE9PVxuQ2omJjA9PT0oZCYyNCkmJkNqLmhhcyhhKSYmQ2ouZGVsZXRlKGEpO2E9PT1VJiYoWT1VPW51bGwsVz0wKTsxPGMuZmxhZ3M/bnVsbCE9PWMubGFzdEVmZmVjdD8oYy5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YyxkPWMuZmlyc3RFZmZlY3QpOmQ9YzpkPWMuZmlyc3RFZmZlY3Q7aWYobnVsbCE9PWQpe2U9WDtYfD0zMjtwai5jdXJyZW50PW51bGw7a2Y9ZmQ7Zz1OZSgpO2lmKE9lKGcpKXtpZihcInNlbGVjdGlvblN0YXJ0XCJpbiBnKWg9e3N0YXJ0Omcuc2VsZWN0aW9uU3RhcnQsZW5kOmcuc2VsZWN0aW9uRW5kfTtlbHNlIGE6aWYoaD0oaD1nLm93bmVyRG9jdW1lbnQpJiZoLmRlZmF1bHRWaWV3fHx3aW5kb3csKGw9aC5nZXRTZWxlY3Rpb24mJmguZ2V0U2VsZWN0aW9uKCkpJiYwIT09bC5yYW5nZUNvdW50KXtoPWwuYW5jaG9yTm9kZTtmPWwuYW5jaG9yT2Zmc2V0O2s9bC5mb2N1c05vZGU7bD1sLmZvY3VzT2Zmc2V0O3RyeXtoLm5vZGVUeXBlLGsubm9kZVR5cGV9Y2F0Y2godmEpe2g9bnVsbDtcbmJyZWFrIGF9dmFyIG49MCxBPS0xLHA9LTEsQz0wLHg9MCx3PWcsej1udWxsO2I6Zm9yKDs7KXtmb3IodmFyIHU7Oyl7dyE9PWh8fDAhPT1mJiYzIT09dy5ub2RlVHlwZXx8KEE9bitmKTt3IT09a3x8MCE9PWwmJjMhPT13Lm5vZGVUeXBlfHwocD1uK2wpOzM9PT13Lm5vZGVUeXBlJiYobis9dy5ub2RlVmFsdWUubGVuZ3RoKTtpZihudWxsPT09KHU9dy5maXJzdENoaWxkKSlicmVhazt6PXc7dz11fWZvcig7Oyl7aWYodz09PWcpYnJlYWsgYjt6PT09aCYmKytDPT09ZiYmKEE9bik7ej09PWsmJisreD09PWwmJihwPW4pO2lmKG51bGwhPT0odT13Lm5leHRTaWJsaW5nKSlicmVhazt3PXo7ej13LnBhcmVudE5vZGV9dz11fWg9LTE9PT1BfHwtMT09PXA/bnVsbDp7c3RhcnQ6QSxlbmQ6cH19ZWxzZSBoPW51bGw7aD1ofHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBoPW51bGw7bGY9e2ZvY3VzZWRFbGVtOmcsc2VsZWN0aW9uUmFuZ2U6aH07ZmQ9ITE7SWo9bnVsbDtKaj0hMTtaPWQ7ZG8gdHJ5e2VrKCl9Y2F0Y2godmEpe2lmKG51bGw9PT1cblopdGhyb3cgRXJyb3IoeSgzMzApKTtXaShaLHZhKTtaPVoubmV4dEVmZmVjdH13aGlsZShudWxsIT09Wik7SWo9bnVsbDtaPWQ7ZG8gdHJ5e2ZvcihnPWE7bnVsbCE9PVo7KXt2YXIgdD1aLmZsYWdzO3QmMTYmJnBiKFouc3RhdGVOb2RlLFwiXCIpO2lmKHQmMTI4KXt2YXIgcT1aLmFsdGVybmF0ZTtpZihudWxsIT09cSl7dmFyIHY9cS5yZWY7bnVsbCE9PXYmJihcImZ1bmN0aW9uXCI9PT10eXBlb2Ygdj92KG51bGwpOnYuY3VycmVudD1udWxsKX19c3dpdGNoKHQmMTAzOCl7Y2FzZSAyOmZqKFopO1ouZmxhZ3MmPS0zO2JyZWFrO2Nhc2UgNjpmaihaKTtaLmZsYWdzJj0tMztpaihaLmFsdGVybmF0ZSxaKTticmVhaztjYXNlIDEwMjQ6Wi5mbGFncyY9LTEwMjU7YnJlYWs7Y2FzZSAxMDI4OlouZmxhZ3MmPS0xMDI1O2lqKFouYWx0ZXJuYXRlLFopO2JyZWFrO2Nhc2UgNDppaihaLmFsdGVybmF0ZSxaKTticmVhaztjYXNlIDg6aD1aO2NqKGcsaCk7dmFyIEo9aC5hbHRlcm5hdGU7ZGooaCk7bnVsbCE9PVxuSiYmZGooSil9Wj1aLm5leHRFZmZlY3R9fWNhdGNoKHZhKXtpZihudWxsPT09Wil0aHJvdyBFcnJvcih5KDMzMCkpO1dpKFosdmEpO1o9Wi5uZXh0RWZmZWN0fXdoaWxlKG51bGwhPT1aKTt2PWxmO3E9TmUoKTt0PXYuZm9jdXNlZEVsZW07Zz12LnNlbGVjdGlvblJhbmdlO2lmKHEhPT10JiZ0JiZ0Lm93bmVyRG9jdW1lbnQmJk1lKHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdCkpe251bGwhPT1nJiZPZSh0KSYmKHE9Zy5zdGFydCx2PWcuZW5kLHZvaWQgMD09PXYmJih2PXEpLFwic2VsZWN0aW9uU3RhcnRcImluIHQ/KHQuc2VsZWN0aW9uU3RhcnQ9cSx0LnNlbGVjdGlvbkVuZD1NYXRoLm1pbih2LHQudmFsdWUubGVuZ3RoKSk6KHY9KHE9dC5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnEuZGVmYXVsdFZpZXd8fHdpbmRvdyx2LmdldFNlbGVjdGlvbiYmKHY9di5nZXRTZWxlY3Rpb24oKSxoPXQudGV4dENvbnRlbnQubGVuZ3RoLEo9TWF0aC5taW4oZy5zdGFydCxoKSxnPXZvaWQgMD09PVxuZy5lbmQ/SjpNYXRoLm1pbihnLmVuZCxoKSwhdi5leHRlbmQmJko+ZyYmKGg9ZyxnPUosSj1oKSxoPUxlKHQsSiksZj1MZSh0LGcpLGgmJmYmJigxIT09di5yYW5nZUNvdW50fHx2LmFuY2hvck5vZGUhPT1oLm5vZGV8fHYuYW5jaG9yT2Zmc2V0IT09aC5vZmZzZXR8fHYuZm9jdXNOb2RlIT09Zi5ub2RlfHx2LmZvY3VzT2Zmc2V0IT09Zi5vZmZzZXQpJiYocT1xLmNyZWF0ZVJhbmdlKCkscS5zZXRTdGFydChoLm5vZGUsaC5vZmZzZXQpLHYucmVtb3ZlQWxsUmFuZ2VzKCksSj5nPyh2LmFkZFJhbmdlKHEpLHYuZXh0ZW5kKGYubm9kZSxmLm9mZnNldCkpOihxLnNldEVuZChmLm5vZGUsZi5vZmZzZXQpLHYuYWRkUmFuZ2UocSkpKSkpKTtxPVtdO2Zvcih2PXQ7dj12LnBhcmVudE5vZGU7KTE9PT12Lm5vZGVUeXBlJiZxLnB1c2goe2VsZW1lbnQ6dixsZWZ0OnYuc2Nyb2xsTGVmdCx0b3A6di5zY3JvbGxUb3B9KTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgdC5mb2N1cyYmdC5mb2N1cygpO2Zvcih0PVxuMDt0PHEubGVuZ3RoO3QrKyl2PXFbdF0sdi5lbGVtZW50LnNjcm9sbExlZnQ9di5sZWZ0LHYuZWxlbWVudC5zY3JvbGxUb3A9di50b3B9ZmQ9ISFrZjtsZj1rZj1udWxsO2EuY3VycmVudD1jO1o9ZDtkbyB0cnl7Zm9yKHQ9YTtudWxsIT09Wjspe3ZhciBLPVouZmxhZ3M7SyYzNiYmWWkodCxaLmFsdGVybmF0ZSxaKTtpZihLJjEyOCl7cT12b2lkIDA7dmFyIFE9Wi5yZWY7aWYobnVsbCE9PVEpe3ZhciBMPVouc3RhdGVOb2RlO3N3aXRjaChaLnRhZyl7Y2FzZSA1OnE9TDticmVhaztkZWZhdWx0OnE9TH1cImZ1bmN0aW9uXCI9PT10eXBlb2YgUT9RKHEpOlEuY3VycmVudD1xfX1aPVoubmV4dEVmZmVjdH19Y2F0Y2godmEpe2lmKG51bGw9PT1aKXRocm93IEVycm9yKHkoMzMwKSk7V2koWix2YSk7Wj1aLm5leHRFZmZlY3R9d2hpbGUobnVsbCE9PVopO1o9bnVsbDskZigpO1g9ZX1lbHNlIGEuY3VycmVudD1jO2lmKHhqKXhqPSExLHlqPWEsemo9YjtlbHNlIGZvcihaPWQ7bnVsbCE9PVo7KWI9XG5aLm5leHRFZmZlY3QsWi5uZXh0RWZmZWN0PW51bGwsWi5mbGFncyY4JiYoSz1aLEsuc2libGluZz1udWxsLEsuc3RhdGVOb2RlPW51bGwpLFo9YjtkPWEucGVuZGluZ0xhbmVzOzA9PT1kJiYoVGk9bnVsbCk7MT09PWQ/YT09PUVqP0RqKys6KERqPTAsRWo9YSk6RGo9MDtjPWMuc3RhdGVOb2RlO2lmKE1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgTWYub25Db21taXRGaWJlclJvb3QpdHJ5e01mLm9uQ29tbWl0RmliZXJSb290KExmLGMsdm9pZCAwLDY0PT09KGMuY3VycmVudC5mbGFncyY2NCkpfWNhdGNoKHZhKXt9TWooYSxPKCkpO2lmKFFpKXRocm93IFFpPSExLGE9UmksUmk9bnVsbCxhO2lmKDAhPT0oWCY4KSlyZXR1cm4gbnVsbDtpZygpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gZWsoKXtmb3IoO251bGwhPT1aOyl7dmFyIGE9Wi5hbHRlcm5hdGU7Smp8fG51bGw9PT1Janx8KDAhPT0oWi5mbGFncyY4KT9kYyhaLElqKSYmKEpqPSEwKToxMz09PVoudGFnJiZtaihhLFopJiZkYyhaLElqKSYmKEpqPSEwKSk7dmFyIGI9Wi5mbGFnczswIT09KGImMjU2KSYmWGkoYSxaKTswPT09KGImNTEyKXx8eGp8fCh4aj0hMCxoZyg5NyxmdW5jdGlvbigpe09qKCk7cmV0dXJuIG51bGx9KSk7Wj1aLm5leHRFZmZlY3R9fWZ1bmN0aW9uIE9qKCl7aWYoOTAhPT16ail7dmFyIGE9OTc8emo/OTc6emo7emo9OTA7cmV0dXJuIGdnKGEsZmspfXJldHVybiExfWZ1bmN0aW9uICRpKGEsYil7QWoucHVzaChiLGEpO3hqfHwoeGo9ITAsaGcoOTcsZnVuY3Rpb24oKXtPaigpO3JldHVybiBudWxsfSkpfWZ1bmN0aW9uIFppKGEsYil7QmoucHVzaChiLGEpO3hqfHwoeGo9ITAsaGcoOTcsZnVuY3Rpb24oKXtPaigpO3JldHVybiBudWxsfSkpfVxuZnVuY3Rpb24gZmsoKXtpZihudWxsPT09eWopcmV0dXJuITE7dmFyIGE9eWo7eWo9bnVsbDtpZigwIT09KFgmNDgpKXRocm93IEVycm9yKHkoMzMxKSk7dmFyIGI9WDtYfD0zMjt2YXIgYz1CajtCaj1bXTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrPTIpe3ZhciBlPWNbZF0sZj1jW2QrMV0sZz1lLmRlc3Ryb3k7ZS5kZXN0cm95PXZvaWQgMDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyl0cnl7ZygpfWNhdGNoKGspe2lmKG51bGw9PT1mKXRocm93IEVycm9yKHkoMzMwKSk7V2koZixrKX19Yz1BajtBaj1bXTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCs9Mil7ZT1jW2RdO2Y9Y1tkKzFdO3RyeXt2YXIgaD1lLmNyZWF0ZTtlLmRlc3Ryb3k9aCgpfWNhdGNoKGspe2lmKG51bGw9PT1mKXRocm93IEVycm9yKHkoMzMwKSk7V2koZixrKX19Zm9yKGg9YS5jdXJyZW50LmZpcnN0RWZmZWN0O251bGwhPT1oOylhPWgubmV4dEVmZmVjdCxoLm5leHRFZmZlY3Q9bnVsbCxoLmZsYWdzJjgmJihoLnNpYmxpbmc9XG5udWxsLGguc3RhdGVOb2RlPW51bGwpLGg9YTtYPWI7aWcoKTtyZXR1cm4hMH1mdW5jdGlvbiBnayhhLGIsYyl7Yj1NaShjLGIpO2I9UGkoYSxiLDEpO0FnKGEsYik7Yj1IZygpO2E9S2ooYSwxKTtudWxsIT09YSYmKCRjKGEsMSxiKSxNaihhLGIpKX1cbmZ1bmN0aW9uIFdpKGEsYil7aWYoMz09PWEudGFnKWdrKGEsYSxiKTtlbHNlIGZvcih2YXIgYz1hLnJldHVybjtudWxsIT09Yzspe2lmKDM9PT1jLnRhZyl7Z2soYyxhLGIpO2JyZWFrfWVsc2UgaWYoMT09PWMudGFnKXt2YXIgZD1jLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09VGl8fCFUaS5oYXMoZCkpKXthPU1pKGIsYSk7dmFyIGU9U2koYyxhLDEpO0FnKGMsZSk7ZT1IZygpO2M9S2ooYywxKTtpZihudWxsIT09YykkYyhjLDEsZSksTWooYyxlKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PVRpfHwhVGkuaGFzKGQpKSl0cnl7ZC5jb21wb25lbnREaWRDYXRjaChiLGEpfWNhdGNoKGYpe31icmVha319Yz1jLnJldHVybn19XG5mdW5jdGlvbiBZaihhLGIsYyl7dmFyIGQ9YS5waW5nQ2FjaGU7bnVsbCE9PWQmJmQuZGVsZXRlKGIpO2I9SGcoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmM7VT09PWEmJihXJmMpPT09YyYmKDQ9PT1WfHwzPT09ViYmKFcmNjI5MTQ1NjApPT09VyYmNTAwPk8oKS1qaj9RaihhLDApOnVqfD1jKTtNaihhLGIpfWZ1bmN0aW9uIGxqKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7bnVsbCE9PWMmJmMuZGVsZXRlKGIpO2I9MDswPT09YiYmKGI9YS5tb2RlLDA9PT0oYiYyKT9iPTE6MD09PShiJjQpP2I9OTk9PT1lZygpPzE6MjooMD09PUdqJiYoR2o9dGopLGI9WWMoNjI5MTQ1NjAmfkdqKSwwPT09YiYmKGI9NDE5NDMwNCkpKTtjPUhnKCk7YT1LaihhLGIpO251bGwhPT1hJiYoJGMoYSxiLGMpLE1qKGEsYykpfXZhciBjaztcbmNrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iLmxhbmVzO2lmKG51bGwhPT1hKWlmKGEubWVtb2l6ZWRQcm9wcyE9PWIucGVuZGluZ1Byb3BzfHxOLmN1cnJlbnQpdWc9ITA7ZWxzZSBpZigwIT09KGMmZCkpdWc9MCE9PShhLmZsYWdzJjE2Mzg0KT8hMDohMTtlbHNle3VnPSExO3N3aXRjaChiLnRhZyl7Y2FzZSAzOnJpKGIpO3NoKCk7YnJlYWs7Y2FzZSA1OmdoKGIpO2JyZWFrO2Nhc2UgMTpGZihiLnR5cGUpJiZKZihiKTticmVhaztjYXNlIDQ6ZWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOmQ9Yi5tZW1vaXplZFByb3BzLnZhbHVlO3ZhciBlPWIudHlwZS5fY29udGV4dDtJKG1nLGUuX2N1cnJlbnRWYWx1ZSk7ZS5fY3VycmVudFZhbHVlPWQ7YnJlYWs7Y2FzZSAxMzppZihudWxsIT09Yi5tZW1vaXplZFN0YXRlKXtpZigwIT09KGMmYi5jaGlsZC5jaGlsZExhbmVzKSlyZXR1cm4gdGkoYSxiLGMpO0koUCxQLmN1cnJlbnQmMSk7Yj1oaShhLGIsYyk7cmV0dXJuIG51bGwhPT1cbmI/Yi5zaWJsaW5nOm51bGx9SShQLFAuY3VycmVudCYxKTticmVhaztjYXNlIDE5OmQ9MCE9PShjJmIuY2hpbGRMYW5lcyk7aWYoMCE9PShhLmZsYWdzJjY0KSl7aWYoZClyZXR1cm4gQWkoYSxiLGMpO2IuZmxhZ3N8PTY0fWU9Yi5tZW1vaXplZFN0YXRlO251bGwhPT1lJiYoZS5yZW5kZXJpbmc9bnVsbCxlLnRhaWw9bnVsbCxlLmxhc3RFZmZlY3Q9bnVsbCk7SShQLFAuY3VycmVudCk7aWYoZClicmVhaztlbHNlIHJldHVybiBudWxsO2Nhc2UgMjM6Y2FzZSAyNDpyZXR1cm4gYi5sYW5lcz0wLG1pKGEsYixjKX1yZXR1cm4gaGkoYSxiLGMpfWVsc2UgdWc9ITE7Yi5sYW5lcz0wO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmQ9Yi50eXBlO251bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpO2E9Yi5wZW5kaW5nUHJvcHM7ZT1FZihiLE0uY3VycmVudCk7dGcoYixjKTtlPUNoKG51bGwsYixkLGEsZSxjKTtiLmZsYWdzfD0xO2lmKFwib2JqZWN0XCI9PT1cbnR5cGVvZiBlJiZudWxsIT09ZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGUucmVuZGVyJiZ2b2lkIDA9PT1lLiQkdHlwZW9mKXtiLnRhZz0xO2IubWVtb2l6ZWRTdGF0ZT1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtpZihGZihkKSl7dmFyIGY9ITA7SmYoYil9ZWxzZSBmPSExO2IubWVtb2l6ZWRTdGF0ZT1udWxsIT09ZS5zdGF0ZSYmdm9pZCAwIT09ZS5zdGF0ZT9lLnN0YXRlOm51bGw7eGcoYik7dmFyIGc9ZC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XCJmdW5jdGlvblwiPT09dHlwZW9mIGcmJkdnKGIsZCxnLGEpO2UudXBkYXRlcj1LZztiLnN0YXRlTm9kZT1lO2UuX3JlYWN0SW50ZXJuYWxzPWI7T2coYixkLGEsYyk7Yj1xaShudWxsLGIsZCwhMCxmLGMpfWVsc2UgYi50YWc9MCxmaShudWxsLGIsZSxjKSxiPWIuY2hpbGQ7cmV0dXJuIGI7Y2FzZSAxNjplPWIuZWxlbWVudFR5cGU7YTp7bnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9Mik7XG5hPWIucGVuZGluZ1Byb3BzO2Y9ZS5faW5pdDtlPWYoZS5fcGF5bG9hZCk7Yi50eXBlPWU7Zj1iLnRhZz1oayhlKTthPWxnKGUsYSk7c3dpdGNoKGYpe2Nhc2UgMDpiPWxpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDE6Yj1waShudWxsLGIsZSxhLGMpO2JyZWFrIGE7Y2FzZSAxMTpiPWdpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDE0OmI9aWkobnVsbCxiLGUsbGcoZS50eXBlLGEpLGQsYyk7YnJlYWsgYX10aHJvdyBFcnJvcih5KDMwNixlLFwiXCIpKTt9cmV0dXJuIGI7Y2FzZSAwOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLGxpKGEsYixkLGUsYyk7Y2FzZSAxOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLHBpKGEsYixkLGUsYyk7Y2FzZSAzOnJpKGIpO2Q9Yi51cGRhdGVRdWV1ZTtpZihudWxsPT09YXx8bnVsbD09PWQpdGhyb3cgRXJyb3IoeSgyODIpKTtcbmQ9Yi5wZW5kaW5nUHJvcHM7ZT1iLm1lbW9pemVkU3RhdGU7ZT1udWxsIT09ZT9lLmVsZW1lbnQ6bnVsbDt5ZyhhLGIpO0NnKGIsZCxudWxsLGMpO2Q9Yi5tZW1vaXplZFN0YXRlLmVsZW1lbnQ7aWYoZD09PWUpc2goKSxiPWhpKGEsYixjKTtlbHNle2U9Yi5zdGF0ZU5vZGU7aWYoZj1lLmh5ZHJhdGUpa2g9cmYoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxqaD1iLGY9bGg9ITA7aWYoZil7YT1lLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE7aWYobnVsbCE9YSlmb3IoZT0wO2U8YS5sZW5ndGg7ZSs9MilmPWFbZV0sZi5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1hW2UrMV0sdGgucHVzaChmKTtjPVpnKGIsbnVsbCxkLGMpO2ZvcihiLmNoaWxkPWM7YzspYy5mbGFncz1jLmZsYWdzJi0zfDEwMjQsYz1jLnNpYmxpbmd9ZWxzZSBmaShhLGIsZCxjKSxzaCgpO2I9Yi5jaGlsZH1yZXR1cm4gYjtjYXNlIDU6cmV0dXJuIGdoKGIpLG51bGw9PT1hJiZcbnBoKGIpLGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZj1udWxsIT09YT9hLm1lbW9pemVkUHJvcHM6bnVsbCxnPWUuY2hpbGRyZW4sbmYoZCxlKT9nPW51bGw6bnVsbCE9PWYmJm5mKGQsZikmJihiLmZsYWdzfD0xNiksb2koYSxiKSxmaShhLGIsZyxjKSxiLmNoaWxkO2Nhc2UgNjpyZXR1cm4gbnVsbD09PWEmJnBoKGIpLG51bGw7Y2FzZSAxMzpyZXR1cm4gdGkoYSxiLGMpO2Nhc2UgNDpyZXR1cm4gZWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxkPWIucGVuZGluZ1Byb3BzLG51bGw9PT1hP2IuY2hpbGQ9WWcoYixudWxsLGQsYyk6ZmkoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDExOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLGdpKGEsYixkLGUsYyk7Y2FzZSA3OnJldHVybiBmaShhLGIsYi5wZW5kaW5nUHJvcHMsYyksYi5jaGlsZDtjYXNlIDg6cmV0dXJuIGZpKGEsYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixcbmMpLGIuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gZmkoYSxiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGMpLGIuY2hpbGQ7Y2FzZSAxMDphOntkPWIudHlwZS5fY29udGV4dDtlPWIucGVuZGluZ1Byb3BzO2c9Yi5tZW1vaXplZFByb3BzO2Y9ZS52YWx1ZTt2YXIgaD1iLnR5cGUuX2NvbnRleHQ7SShtZyxoLl9jdXJyZW50VmFsdWUpO2guX2N1cnJlbnRWYWx1ZT1mO2lmKG51bGwhPT1nKWlmKGg9Zy52YWx1ZSxmPUhlKGgsZik/MDooXCJmdW5jdGlvblwiPT09dHlwZW9mIGQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzP2QuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzKGgsZik6MTA3Mzc0MTgyMyl8MCwwPT09Zil7aWYoZy5jaGlsZHJlbj09PWUuY2hpbGRyZW4mJiFOLmN1cnJlbnQpe2I9aGkoYSxiLGMpO2JyZWFrIGF9fWVsc2UgZm9yKGg9Yi5jaGlsZCxudWxsIT09aCYmKGgucmV0dXJuPWIpO251bGwhPT1oOyl7dmFyIGs9aC5kZXBlbmRlbmNpZXM7aWYobnVsbCE9PWspe2c9aC5jaGlsZDtmb3IodmFyIGw9XG5rLmZpcnN0Q29udGV4dDtudWxsIT09bDspe2lmKGwuY29udGV4dD09PWQmJjAhPT0obC5vYnNlcnZlZEJpdHMmZikpezE9PT1oLnRhZyYmKGw9emcoLTEsYyYtYyksbC50YWc9MixBZyhoLGwpKTtoLmxhbmVzfD1jO2w9aC5hbHRlcm5hdGU7bnVsbCE9PWwmJihsLmxhbmVzfD1jKTtzZyhoLnJldHVybixjKTtrLmxhbmVzfD1jO2JyZWFrfWw9bC5uZXh0fX1lbHNlIGc9MTA9PT1oLnRhZz9oLnR5cGU9PT1iLnR5cGU/bnVsbDpoLmNoaWxkOmguY2hpbGQ7aWYobnVsbCE9PWcpZy5yZXR1cm49aDtlbHNlIGZvcihnPWg7bnVsbCE9PWc7KXtpZihnPT09Yil7Zz1udWxsO2JyZWFrfWg9Zy5zaWJsaW5nO2lmKG51bGwhPT1oKXtoLnJldHVybj1nLnJldHVybjtnPWg7YnJlYWt9Zz1nLnJldHVybn1oPWd9ZmkoYSxiLGUuY2hpbGRyZW4sYyk7Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgOTpyZXR1cm4gZT1iLnR5cGUsZj1iLnBlbmRpbmdQcm9wcyxkPWYuY2hpbGRyZW4sdGcoYixjKSxlPXZnKGUsXG5mLnVuc3RhYmxlX29ic2VydmVkQml0cyksZD1kKGUpLGIuZmxhZ3N8PTEsZmkoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDE0OnJldHVybiBlPWIudHlwZSxmPWxnKGUsYi5wZW5kaW5nUHJvcHMpLGY9bGcoZS50eXBlLGYpLGlpKGEsYixlLGYsZCxjKTtjYXNlIDE1OnJldHVybiBraShhLGIsYi50eXBlLGIucGVuZGluZ1Byb3BzLGQsYyk7Y2FzZSAxNzpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6bGcoZCxlKSxudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmZsYWdzfD0yKSxiLnRhZz0xLEZmKGQpPyhhPSEwLEpmKGIpKTphPSExLHRnKGIsYyksTWcoYixkLGUpLE9nKGIsZCxlLGMpLHFpKG51bGwsYixkLCEwLGEsYyk7Y2FzZSAxOTpyZXR1cm4gQWkoYSxiLGMpO2Nhc2UgMjM6cmV0dXJuIG1pKGEsYixjKTtjYXNlIDI0OnJldHVybiBtaShhLGIsYyl9dGhyb3cgRXJyb3IoeSgxNTYsYi50YWcpKTtcbn07ZnVuY3Rpb24gaWsoYSxiLGMsZCl7dGhpcy50YWc9YTt0aGlzLmtleT1jO3RoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGw7dGhpcy5pbmRleD0wO3RoaXMucmVmPW51bGw7dGhpcy5wZW5kaW5nUHJvcHM9Yjt0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbDt0aGlzLm1vZGU9ZDt0aGlzLmZsYWdzPTA7dGhpcy5sYXN0RWZmZWN0PXRoaXMuZmlyc3RFZmZlY3Q9dGhpcy5uZXh0RWZmZWN0PW51bGw7dGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MDt0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIG5oKGEsYixjLGQpe3JldHVybiBuZXcgaWsoYSxiLGMsZCl9ZnVuY3Rpb24gamkoYSl7YT1hLnByb3RvdHlwZTtyZXR1cm4hKCFhfHwhYS5pc1JlYWN0Q29tcG9uZW50KX1cbmZ1bmN0aW9uIGhrKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBqaShhKT8xOjA7aWYodm9pZCAwIT09YSYmbnVsbCE9PWEpe2E9YS4kJHR5cGVvZjtpZihhPT09QWEpcmV0dXJuIDExO2lmKGE9PT1EYSlyZXR1cm4gMTR9cmV0dXJuIDJ9XG5mdW5jdGlvbiBUZyhhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGw9PT1jPyhjPW5oKGEudGFnLGIsYS5rZXksYS5tb2RlKSxjLmVsZW1lbnRUeXBlPWEuZWxlbWVudFR5cGUsYy50eXBlPWEudHlwZSxjLnN0YXRlTm9kZT1hLnN0YXRlTm9kZSxjLmFsdGVybmF0ZT1hLGEuYWx0ZXJuYXRlPWMpOihjLnBlbmRpbmdQcm9wcz1iLGMudHlwZT1hLnR5cGUsYy5mbGFncz0wLGMubmV4dEVmZmVjdD1udWxsLGMuZmlyc3RFZmZlY3Q9bnVsbCxjLmxhc3RFZmZlY3Q9bnVsbCk7Yy5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcztjLmxhbmVzPWEubGFuZXM7Yy5jaGlsZD1hLmNoaWxkO2MubWVtb2l6ZWRQcm9wcz1hLm1lbW9pemVkUHJvcHM7Yy5tZW1vaXplZFN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtjLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWU7Yj1hLmRlcGVuZGVuY2llcztjLmRlcGVuZGVuY2llcz1udWxsPT09Yj9udWxsOntsYW5lczpiLmxhbmVzLGZpcnN0Q29udGV4dDpiLmZpcnN0Q29udGV4dH07XG5jLnNpYmxpbmc9YS5zaWJsaW5nO2MuaW5kZXg9YS5pbmRleDtjLnJlZj1hLnJlZjtyZXR1cm4gY31cbmZ1bmN0aW9uIFZnKGEsYixjLGQsZSxmKXt2YXIgZz0yO2Q9YTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlqaShhKSYmKGc9MSk7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpZz01O2Vsc2UgYTpzd2l0Y2goYSl7Y2FzZSB1YTpyZXR1cm4gWGcoYy5jaGlsZHJlbixlLGYsYik7Y2FzZSBIYTpnPTg7ZXw9MTY7YnJlYWs7Y2FzZSB3YTpnPTg7ZXw9MTticmVhaztjYXNlIHhhOnJldHVybiBhPW5oKDEyLGMsYixlfDgpLGEuZWxlbWVudFR5cGU9eGEsYS50eXBlPXhhLGEubGFuZXM9ZixhO2Nhc2UgQmE6cmV0dXJuIGE9bmgoMTMsYyxiLGUpLGEudHlwZT1CYSxhLmVsZW1lbnRUeXBlPUJhLGEubGFuZXM9ZixhO2Nhc2UgQ2E6cmV0dXJuIGE9bmgoMTksYyxiLGUpLGEuZWxlbWVudFR5cGU9Q2EsYS5sYW5lcz1mLGE7Y2FzZSBJYTpyZXR1cm4gdmkoYyxlLGYsYik7Y2FzZSBKYTpyZXR1cm4gYT1uaCgyNCxjLGIsZSksYS5lbGVtZW50VHlwZT1KYSxhLmxhbmVzPWYsYTtkZWZhdWx0OmlmKFwib2JqZWN0XCI9PT1cbnR5cGVvZiBhJiZudWxsIT09YSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSB5YTpnPTEwO2JyZWFrIGE7Y2FzZSB6YTpnPTk7YnJlYWsgYTtjYXNlIEFhOmc9MTE7YnJlYWsgYTtjYXNlIERhOmc9MTQ7YnJlYWsgYTtjYXNlIEVhOmc9MTY7ZD1udWxsO2JyZWFrIGE7Y2FzZSBGYTpnPTIyO2JyZWFrIGF9dGhyb3cgRXJyb3IoeSgxMzAsbnVsbD09YT9hOnR5cGVvZiBhLFwiXCIpKTt9Yj1uaChnLGMsYixlKTtiLmVsZW1lbnRUeXBlPWE7Yi50eXBlPWQ7Yi5sYW5lcz1mO3JldHVybiBifWZ1bmN0aW9uIFhnKGEsYixjLGQpe2E9bmgoNyxhLGQsYik7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIHZpKGEsYixjLGQpe2E9bmgoMjMsYSxkLGIpO2EuZWxlbWVudFR5cGU9SWE7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIFVnKGEsYixjKXthPW5oKDYsYSxudWxsLGIpO2EubGFuZXM9YztyZXR1cm4gYX1cbmZ1bmN0aW9uIFdnKGEsYixjKXtiPW5oKDQsbnVsbCE9PWEuY2hpbGRyZW4/YS5jaGlsZHJlbjpbXSxhLmtleSxiKTtiLmxhbmVzPWM7Yi5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86YS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmEuaW1wbGVtZW50YXRpb259O3JldHVybiBifVxuZnVuY3Rpb24gamsoYSxiLGMpe3RoaXMudGFnPWI7dGhpcy5jb250YWluZXJJbmZvPWE7dGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGw7dGhpcy50aW1lb3V0SGFuZGxlPS0xO3RoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGw7dGhpcy5oeWRyYXRlPWM7dGhpcy5jYWxsYmFja05vZGU9bnVsbDt0aGlzLmNhbGxiYWNrUHJpb3JpdHk9MDt0aGlzLmV2ZW50VGltZXM9WmMoMCk7dGhpcy5leHBpcmF0aW9uVGltZXM9WmMoLTEpO3RoaXMuZW50YW5nbGVkTGFuZXM9dGhpcy5maW5pc2hlZExhbmVzPXRoaXMubXV0YWJsZVJlYWRMYW5lcz10aGlzLmV4cGlyZWRMYW5lcz10aGlzLnBpbmdlZExhbmVzPXRoaXMuc3VzcGVuZGVkTGFuZXM9dGhpcy5wZW5kaW5nTGFuZXM9MDt0aGlzLmVudGFuZ2xlbWVudHM9WmMoMCk7dGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9XG5mdW5jdGlvbiBrayhhLGIsYyl7dmFyIGQ9Mzxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOnRhLGtleTpudWxsPT1kP251bGw6XCJcIitkLGNoaWxkcmVuOmEsY29udGFpbmVySW5mbzpiLGltcGxlbWVudGF0aW9uOmN9fVxuZnVuY3Rpb24gbGsoYSxiLGMsZCl7dmFyIGU9Yi5jdXJyZW50LGY9SGcoKSxnPUlnKGUpO2E6aWYoYyl7Yz1jLl9yZWFjdEludGVybmFscztiOntpZihaYihjKSE9PWN8fDEhPT1jLnRhZyl0aHJvdyBFcnJvcih5KDE3MCkpO3ZhciBoPWM7ZG97c3dpdGNoKGgudGFnKXtjYXNlIDM6aD1oLnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGI7Y2FzZSAxOmlmKEZmKGgudHlwZSkpe2g9aC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgYn19aD1oLnJldHVybn13aGlsZShudWxsIT09aCk7dGhyb3cgRXJyb3IoeSgxNzEpKTt9aWYoMT09PWMudGFnKXt2YXIgaz1jLnR5cGU7aWYoRmYoaykpe2M9SWYoYyxrLGgpO2JyZWFrIGF9fWM9aH1lbHNlIGM9Q2Y7bnVsbD09PWIuY29udGV4dD9iLmNvbnRleHQ9YzpiLnBlbmRpbmdDb250ZXh0PWM7Yj16ZyhmLGcpO2IucGF5bG9hZD17ZWxlbWVudDphfTtkPXZvaWQgMD09PWQ/bnVsbDpkO251bGwhPT1cbmQmJihiLmNhbGxiYWNrPWQpO0FnKGUsYik7SmcoZSxnLGYpO3JldHVybiBnfWZ1bmN0aW9uIG1rKGEpe2E9YS5jdXJyZW50O2lmKCFhLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChhLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gbmsoYSxiKXthPWEubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCl7dmFyIGM9YS5yZXRyeUxhbmU7YS5yZXRyeUxhbmU9MCE9PWMmJmM8Yj9jOmJ9fWZ1bmN0aW9uIG9rKGEsYil7bmsoYSxiKTsoYT1hLmFsdGVybmF0ZSkmJm5rKGEsYil9ZnVuY3Rpb24gcGsoKXtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIHFrKGEsYixjKXt2YXIgZD1udWxsIT1jJiZudWxsIT1jLmh5ZHJhdGlvbk9wdGlvbnMmJmMuaHlkcmF0aW9uT3B0aW9ucy5tdXRhYmxlU291cmNlc3x8bnVsbDtjPW5ldyBqayhhLGIsbnVsbCE9YyYmITA9PT1jLmh5ZHJhdGUpO2I9bmgoMyxudWxsLG51bGwsMj09PWI/NzoxPT09Yj8zOjApO2MuY3VycmVudD1iO2Iuc3RhdGVOb2RlPWM7eGcoYik7YVtmZl09Yy5jdXJyZW50O2NmKDg9PT1hLm5vZGVUeXBlP2EucGFyZW50Tm9kZTphKTtpZihkKWZvcihhPTA7YTxkLmxlbmd0aDthKyspe2I9ZFthXTt2YXIgZT1iLl9nZXRWZXJzaW9uO2U9ZShiLl9zb3VyY2UpO251bGw9PWMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT9jLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9W2IsZV06Yy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2goYixlKX10aGlzLl9pbnRlcm5hbFJvb3Q9Y31cbnFrLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7bGsoYSx0aGlzLl9pbnRlcm5hbFJvb3QsbnVsbCxudWxsKX07cWsucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9pbnRlcm5hbFJvb3QsYj1hLmNvbnRhaW5lckluZm87bGsobnVsbCxhLG51bGwsZnVuY3Rpb24oKXtiW2ZmXT1udWxsfSl9O2Z1bmN0aW9uIHJrKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlJiYoOCE9PWEubm9kZVR5cGV8fFwiIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlIFwiIT09YS5ub2RlVmFsdWUpKX1cbmZ1bmN0aW9uIHNrKGEsYil7Ynx8KGI9YT85PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLmZpcnN0Q2hpbGQ6bnVsbCxiPSEoIWJ8fDEhPT1iLm5vZGVUeXBlfHwhYi5oYXNBdHRyaWJ1dGUoXCJkYXRhLXJlYWN0cm9vdFwiKSkpO2lmKCFiKWZvcih2YXIgYztjPWEubGFzdENoaWxkOylhLnJlbW92ZUNoaWxkKGMpO3JldHVybiBuZXcgcWsoYSwwLGI/e2h5ZHJhdGU6ITB9OnZvaWQgMCl9XG5mdW5jdGlvbiB0ayhhLGIsYyxkLGUpe3ZhciBmPWMuX3JlYWN0Um9vdENvbnRhaW5lcjtpZihmKXt2YXIgZz1mLl9pbnRlcm5hbFJvb3Q7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUpe3ZhciBoPWU7ZT1mdW5jdGlvbigpe3ZhciBhPW1rKGcpO2guY2FsbChhKX19bGsoYixnLGEsZSl9ZWxzZXtmPWMuX3JlYWN0Um9vdENvbnRhaW5lcj1zayhjLGQpO2c9Zi5faW50ZXJuYWxSb290O2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgaz1lO2U9ZnVuY3Rpb24oKXt2YXIgYT1tayhnKTtrLmNhbGwoYSl9fVhqKGZ1bmN0aW9uKCl7bGsoYixnLGEsZSl9KX1yZXR1cm4gbWsoZyl9ZWM9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SGcoKTtKZyhhLDQsYik7b2soYSw0KX19O2ZjPWZ1bmN0aW9uKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPUhnKCk7SmcoYSw2NzEwODg2NCxiKTtvayhhLDY3MTA4ODY0KX19O1xuZ2M9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SGcoKSxjPUlnKGEpO0pnKGEsYyxiKTtvayhhLGMpfX07aGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYigpfTtcbnliPWZ1bmN0aW9uKGEsYixjKXtzd2l0Y2goYil7Y2FzZSBcImlucHV0XCI6YWIoYSxjKTtiPWMubmFtZTtpZihcInJhZGlvXCI9PT1jLnR5cGUmJm51bGwhPWIpe2ZvcihjPWE7Yy5wYXJlbnROb2RlOyljPWMucGFyZW50Tm9kZTtjPWMucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9XCIrSlNPTi5zdHJpbmdpZnkoXCJcIitiKSsnXVt0eXBlPVwicmFkaW9cIl0nKTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdO2lmKGQhPT1hJiZkLmZvcm09PT1hLmZvcm0pe3ZhciBlPURiKGQpO2lmKCFlKXRocm93IEVycm9yKHkoOTApKTtXYShkKTthYihkLGUpfX19YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aWIoYSxjKTticmVhaztjYXNlIFwic2VsZWN0XCI6Yj1jLnZhbHVlLG51bGwhPWImJmZiKGEsISFjLm11bHRpcGxlLGIsITEpfX07R2I9V2o7XG5IYj1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPVg7WHw9NDt0cnl7cmV0dXJuIGdnKDk4LGEuYmluZChudWxsLGIsYyxkLGUpKX1maW5hbGx5e1g9ZiwwPT09WCYmKHdqKCksaWcoKSl9fTtJYj1mdW5jdGlvbigpezA9PT0oWCY0OSkmJihWaigpLE9qKCkpfTtKYj1mdW5jdGlvbihhLGIpe3ZhciBjPVg7WHw9Mjt0cnl7cmV0dXJuIGEoYil9ZmluYWxseXtYPWMsMD09PVgmJih3aigpLGlnKCkpfX07ZnVuY3Rpb24gdWsoYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZighcmsoYikpdGhyb3cgRXJyb3IoeSgyMDApKTtyZXR1cm4ga2soYSxiLG51bGwsYyl9dmFyIHZrPXtFdmVudHM6W0NiLHVlLERiLEViLEZiLE9qLHtjdXJyZW50OiExfV19LHdrPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTp3YyxidW5kbGVUeXBlOjAsdmVyc2lvbjpcIjE3LjAuMVwiLHJlbmRlcmVyUGFja2FnZU5hbWU6XCJyZWFjdC1kb21cIn07XG52YXIgeGs9e2J1bmRsZVR5cGU6d2suYnVuZGxlVHlwZSx2ZXJzaW9uOndrLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTp3ay5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOndrLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOnJhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oYSl7YT1jYyhhKTtyZXR1cm4gbnVsbD09PWE/bnVsbDphLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6d2suZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fFxucGssZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbH07aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pe3ZhciB5az1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIXlrLmlzRGlzYWJsZWQmJnlrLnN1cHBvcnRzRmliZXIpdHJ5e0xmPXlrLmluamVjdCh4ayksTWY9eWt9Y2F0Y2goYSl7fX1leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPXZrO2V4cG9ydHMuY3JlYXRlUG9ydGFsPXVrO1xuZXhwb3J0cy5maW5kRE9NTm9kZT1mdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiBudWxsO2lmKDE9PT1hLm5vZGVUeXBlKXJldHVybiBhO3ZhciBiPWEuX3JlYWN0SW50ZXJuYWxzO2lmKHZvaWQgMD09PWIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnJlbmRlcil0aHJvdyBFcnJvcih5KDE4OCkpO3Rocm93IEVycm9yKHkoMjY4LE9iamVjdC5rZXlzKGEpKSk7fWE9Y2MoYik7YT1udWxsPT09YT9udWxsOmEuc3RhdGVOb2RlO3JldHVybiBhfTtleHBvcnRzLmZsdXNoU3luYz1mdW5jdGlvbihhLGIpe3ZhciBjPVg7aWYoMCE9PShjJjQ4KSlyZXR1cm4gYShiKTtYfD0xO3RyeXtpZihhKXJldHVybiBnZyg5OSxhLmJpbmQobnVsbCxiKSl9ZmluYWxseXtYPWMsaWcoKX19O2V4cG9ydHMuaHlkcmF0ZT1mdW5jdGlvbihhLGIsYyl7aWYoIXJrKGIpKXRocm93IEVycm9yKHkoMjAwKSk7cmV0dXJuIHRrKG51bGwsYSxiLCEwLGMpfTtcbmV4cG9ydHMucmVuZGVyPWZ1bmN0aW9uKGEsYixjKXtpZighcmsoYikpdGhyb3cgRXJyb3IoeSgyMDApKTtyZXR1cm4gdGsobnVsbCxhLGIsITEsYyl9O2V4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZT1mdW5jdGlvbihhKXtpZighcmsoYSkpdGhyb3cgRXJyb3IoeSg0MCkpO3JldHVybiBhLl9yZWFjdFJvb3RDb250YWluZXI/KFhqKGZ1bmN0aW9uKCl7dGsobnVsbCxudWxsLGEsITEsZnVuY3Rpb24oKXthLl9yZWFjdFJvb3RDb250YWluZXI9bnVsbDthW2ZmXT1udWxsfSl9KSwhMCk6ITF9O2V4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM9V2o7ZXhwb3J0cy51bnN0YWJsZV9jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdWsoYSxiLDI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsKX07XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFyayhjKSl0aHJvdyBFcnJvcih5KDIwMCkpO2lmKG51bGw9PWF8fHZvaWQgMD09PWEuX3JlYWN0SW50ZXJuYWxzKXRocm93IEVycm9yKHkoMzgpKTtyZXR1cm4gdGsoYSxiLGMsITEsZCl9O2V4cG9ydHMudmVyc2lvbj1cIjE3LjAuMVwiO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
//# sourceURL=webpack-internal:///4448
#5 JavaScript::Eval (size: 13482) - SHA256: 622a594865f8306093eea09b76dd6771662235a275df683f34d84f1ef807b78c
/** @license React v0.20.1
 * scheduler.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
var f, g, h, k;
if ("object" === typeof performance && "function" === typeof performance.now) {
    var l = performance;
    exports.unstable_now = function() {
        return l.now()
    }
} else {
    var p = Date,
        q = p.now();
    exports.unstable_now = function() {
        return p.now() - q
    }
}
if ("undefined" === typeof window || "function" !== typeof MessageChannel) {
    var t = null,
        u = null,
        w = function() {
            if (null !== t) try {
                var a = exports.unstable_now();
                t(!0, a);
                t = null
            } catch (b) {
                throw setTimeout(w, 0), b;
            }
        };
    f = function(a) {
        null !== t ? setTimeout(f, 0, a) : (t = a, setTimeout(w, 0))
    };
    g = function(a, b) {
        u = setTimeout(a, b)
    };
    h = function() {
        clearTimeout(u)
    };
    exports.unstable_shouldYield = function() {
        return !1
    };
    k = exports.unstable_forceFrameRate = function() {}
} else {
    var x = window.setTimeout,
        y = window.clearTimeout;
    if ("undefined" !== typeof console) {
        var z =
            window.cancelAnimationFrame;
        "function" !== typeof window.requestAnimationFrame && console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");
        "function" !== typeof z && console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")
    }
    var A = !1,
        B = null,
        C = -1,
        D = 5,
        E = 0;
    exports.unstable_shouldYield = function() {
        return exports.unstable_now() >=
            E
    };
    k = function() {};
    exports.unstable_forceFrameRate = function(a) {
        0 > a || 125 < a ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : D = 0 < a ? Math.floor(1E3 / a) : 5
    };
    var F = new MessageChannel,
        G = F.port2;
    F.port1.onmessage = function() {
        if (null !== B) {
            var a = exports.unstable_now();
            E = a + D;
            try {
                B(!0, a) ? G.postMessage(null) : (A = !1, B = null)
            } catch (b) {
                throw G.postMessage(null), b;
            }
        } else A = !1
    };
    f = function(a) {
        B = a;
        A || (A = !0, G.postMessage(null))
    };
    g = function(a, b) {
        C =
            x(function() {
                a(exports.unstable_now())
            }, b)
    };
    h = function() {
        y(C);
        C = -1
    }
}

function H(a, b) {
    var c = a.length;
    a.push(b);
    a: for (;;) {
        var d = c - 1 >>> 1,
            e = a[d];
        if (void 0 !== e && 0 < I(e, b)) a[d] = b, a[c] = e, c = d;
        else break a
    }
}

function J(a) {
    a = a[0];
    return void 0 === a ? null : a
}

function K(a) {
    var b = a[0];
    if (void 0 !== b) {
        var c = a.pop();
        if (c !== b) {
            a[0] = c;
            a: for (var d = 0, e = a.length; d < e;) {
                var m = 2 * (d + 1) - 1,
                    n = a[m],
                    v = m + 1,
                    r = a[v];
                if (void 0 !== n && 0 > I(n, c)) void 0 !== r && 0 > I(r, n) ? (a[d] = r, a[v] = c, d = v) : (a[d] = n, a[m] = c, d = m);
                else if (void 0 !== r && 0 > I(r, c)) a[d] = r, a[v] = c, d = v;
                else break a
            }
        }
        return b
    }
    return null
}

function I(a, b) {
    var c = a.sortIndex - b.sortIndex;
    return 0 !== c ? c : a.id - b.id
}
var L = [],
    M = [],
    N = 1,
    O = null,
    P = 3,
    Q = !1,
    R = !1,
    S = !1;

function T(a) {
    for (var b = J(M); null !== b;) {
        if (null === b.callback) K(M);
        else if (b.startTime <= a) K(M), b.sortIndex = b.expirationTime, H(L, b);
        else break;
        b = J(M)
    }
}

function U(a) {
    S = !1;
    T(a);
    if (!R)
        if (null !== J(L)) R = !0, f(V);
        else {
            var b = J(M);
            null !== b && g(U, b.startTime - a)
        }
}

function V(a, b) {
    R = !1;
    S && (S = !1, h());
    Q = !0;
    var c = P;
    try {
        T(b);
        for (O = J(L); null !== O && (!(O.expirationTime > b) || a && !exports.unstable_shouldYield());) {
            var d = O.callback;
            if ("function" === typeof d) {
                O.callback = null;
                P = O.priorityLevel;
                var e = d(O.expirationTime <= b);
                b = exports.unstable_now();
                "function" === typeof e ? O.callback = e : O === J(L) && K(L);
                T(b)
            } else K(L);
            O = J(L)
        }
        if (null !== O) var m = !0;
        else {
            var n = J(M);
            null !== n && g(U, n.startTime - b);
            m = !1
        }
        return m
    } finally {
        O = null, P = c, Q = !1
    }
}
var W = k;
exports.unstable_IdlePriority = 5;
exports.unstable_ImmediatePriority = 1;
exports.unstable_LowPriority = 4;
exports.unstable_NormalPriority = 3;
exports.unstable_Profiling = null;
exports.unstable_UserBlockingPriority = 2;
exports.unstable_cancelCallback = function(a) {
    a.callback = null
};
exports.unstable_continueExecution = function() {
    R || Q || (R = !0, f(V))
};
exports.unstable_getCurrentPriorityLevel = function() {
    return P
};
exports.unstable_getFirstCallbackNode = function() {
    return J(L)
};
exports.unstable_next = function(a) {
    switch (P) {
        case 1:
        case 2:
        case 3:
            var b = 3;
            break;
        default:
            b = P
    }
    var c = P;
    P = b;
    try {
        return a()
    } finally {
        P = c
    }
};
exports.unstable_pauseExecution = function() {};
exports.unstable_requestPaint = W;
exports.unstable_runWithPriority = function(a, b) {
    switch (a) {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            break;
        default:
            a = 3
    }
    var c = P;
    P = a;
    try {
        return b()
    } finally {
        P = c
    }
};
exports.unstable_scheduleCallback = function(a, b, c) {
    var d = exports.unstable_now();
    "object" === typeof c && null !== c ? (c = c.delay, c = "number" === typeof c && 0 < c ? d + c : d) : c = d;
    switch (a) {
        case 1:
            var e = -1;
            break;
        case 2:
            e = 250;
            break;
        case 5:
            e = 1073741823;
            break;
        case 4:
            e = 1E4;
            break;
        default:
            e = 5E3
    }
    e = c + e;
    a = {
        id: N++,
        callback: b,
        priorityLevel: a,
        startTime: c,
        expirationTime: e,
        sortIndex: -1
    };
    c > d ? (a.sortIndex = c, H(M, a), null === J(L) && a === J(M) && (S ? h() : S = !0, g(U, c - d))) : (a.sortIndex = e, H(L, a), R || Q || (R = !0, f(V)));
    return a
};
exports.unstable_wrapCallback = function(a) {
    var b = P;
    return function() {
        var c = P;
        P = b;
        try {
            return a.apply(this, arguments)
        } finally {
            P = c
        }
    }
};
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanM/ZmIwNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2EsWUFBWSx1RUFBdUUsa0JBQWtCLG9CQUFvQixZQUFZLGdCQUFnQixLQUFLLHFCQUFxQixvQkFBb0IsWUFBWTtBQUM1TixvRUFBb0UsK0JBQStCLGdCQUFnQiw2QkFBNkIsUUFBUSxPQUFPLFNBQVMsMkJBQTJCLGNBQWMsa0RBQWtELGdCQUFnQixtQkFBbUIsYUFBYSxpQkFBaUIsNEJBQTRCLFlBQVksVUFBVSxFQUFFLCtCQUErQixjQUFjLEtBQUssOENBQThDLGlDQUFpQztBQUN6Ziw0QkFBNEIsc05BQXNOLDBMQUEwTCw2QkFBNkIsNEJBQTRCLFlBQVk7QUFDamYsR0FBRyxlQUFlLCtCQUErQixhQUFhLHVLQUF1SyxtQ0FBbUMsNkJBQTZCLGFBQWEsNkJBQTZCLE1BQU0sSUFBSSwwQ0FBMEMsU0FBUyw4QkFBOEIsV0FBVyxjQUFjLElBQUksK0JBQStCLGdCQUFnQjtBQUN0ZixhQUFhLDBCQUEwQixLQUFLLGFBQWEsS0FBSyxNQUFNLGdCQUFnQixlQUFlLFVBQVUsUUFBUSxFQUFFLHFCQUFxQiwwQ0FBMEMsY0FBYyxjQUFjLE9BQU87QUFDek4sY0FBYyxXQUFXLGVBQWUsY0FBYyxVQUFVLE9BQU8seUJBQXlCLElBQUksRUFBRSxvQ0FBb0MscUZBQXFGLCtDQUErQyxjQUFjLFNBQVMsWUFBWSxnQkFBZ0IsOEJBQThCLHlCQUF5QjtBQUN4WCxjQUFjLGVBQWUsU0FBUyxFQUFFLDBCQUEwQixnRUFBZ0UsV0FBVyxRQUFRLGNBQWMsS0FBSyxLQUFLLCtCQUErQixLQUFLLFdBQVc7QUFDNU4sZ0JBQWdCLEtBQUssY0FBYyxLQUFLLFFBQVEsSUFBSSxLQUFLLFdBQVcsc0VBQXNFLEVBQUUsaUJBQWlCLDBCQUEwQixnQkFBZ0Isa0JBQWtCLDZCQUE2Qix5QkFBeUIsa0RBQWtELEtBQUssVUFBVSxPQUFPLHFCQUFxQixLQUFLLFdBQVcsNkJBQTZCLEtBQUssU0FBUyxRQUFRLGlCQUFpQixRQUFRLDZCQUE2QjtBQUNyZSxrQ0FBa0MsR0FBRyw0QkFBNEIsR0FBRywrQkFBK0IsR0FBRywwQkFBMEIsTUFBTSxxQ0FBcUMsR0FBRywrQkFBK0IsYUFBYSxpQkFBaUIsa0NBQWtDLFlBQVksbUJBQW1CLHdDQUF3QyxZQUFZLFVBQVUscUNBQXFDLFlBQVk7QUFDM1oscUJBQXFCLGFBQWEsVUFBVSw2QkFBNkIsTUFBTSxZQUFZLFFBQVEsSUFBSSxJQUFJLFdBQVcsUUFBUSxNQUFNLCtCQUErQixjQUFjLDZCQUE2QixHQUFHLGdDQUFnQyxlQUFlLFVBQVUseUNBQXlDLFlBQVksUUFBUSxJQUFJLElBQUksV0FBVyxRQUFRO0FBQ2xXLGlDQUFpQyxpQkFBaUIsNkJBQTZCLCtFQUErRSxVQUFVLGdCQUFnQixNQUFNLGFBQWEsTUFBTSxvQkFBb0IsTUFBTSxhQUFhLE1BQU0sY0FBYyxNQUFNLEdBQUcsNkVBQTZFLGlIQUFpSDtBQUNuZCw2QkFBNkIsYUFBYSxRQUFRLGtCQUFrQixRQUFRLElBQUksSUFBSSwrQkFBK0IsUUFBUSIsImZpbGUiOiI1My5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBSZWFjdCB2MC4yMC4xXG4gKiBzY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBmLGcsaCxrO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgcGVyZm9ybWFuY2UmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3cpe3ZhciBsPXBlcmZvcm1hbmNlO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIGwubm93KCl9fWVsc2V7dmFyIHA9RGF0ZSxxPXAubm93KCk7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gcC5ub3coKS1xfX1cbmlmKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93fHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgTWVzc2FnZUNoYW5uZWwpe3ZhciB0PW51bGwsdT1udWxsLHc9ZnVuY3Rpb24oKXtpZihudWxsIT09dCl0cnl7dmFyIGE9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTt0KCEwLGEpO3Q9bnVsbH1jYXRjaChiKXt0aHJvdyBzZXRUaW1lb3V0KHcsMCksYjt9fTtmPWZ1bmN0aW9uKGEpe251bGwhPT10P3NldFRpbWVvdXQoZiwwLGEpOih0PWEsc2V0VGltZW91dCh3LDApKX07Zz1mdW5jdGlvbihhLGIpe3U9c2V0VGltZW91dChhLGIpfTtoPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHUpfTtleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2s9ZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZT1mdW5jdGlvbigpe319ZWxzZXt2YXIgeD13aW5kb3cuc2V0VGltZW91dCx5PXdpbmRvdy5jbGVhclRpbWVvdXQ7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjb25zb2xlKXt2YXIgej1cbndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZTtcImZ1bmN0aW9uXCIhPT10eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhIHBvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzXCIpO1wiZnVuY3Rpb25cIiE9PXR5cGVvZiB6JiZjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjYW5jZWxBbmltYXRpb25GcmFtZS4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSBwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxsc1wiKX12YXIgQT0hMSxCPW51bGwsQz0tMSxEPTUsRT0wO2V4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gZXhwb3J0cy51bnN0YWJsZV9ub3coKT49XG5FfTtrPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGEpezA+YXx8MTI1PGE/Y29uc29sZS5lcnJvcihcImZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCBmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZFwiKTpEPTA8YT9NYXRoLmZsb29yKDFFMy9hKTo1fTt2YXIgRj1uZXcgTWVzc2FnZUNoYW5uZWwsRz1GLnBvcnQyO0YucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKCl7aWYobnVsbCE9PUIpe3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7RT1hK0Q7dHJ5e0IoITAsYSk/Ry5wb3N0TWVzc2FnZShudWxsKTooQT0hMSxCPW51bGwpfWNhdGNoKGIpe3Rocm93IEcucG9zdE1lc3NhZ2UobnVsbCksYjt9fWVsc2UgQT0hMX07Zj1mdW5jdGlvbihhKXtCPWE7QXx8KEE9ITAsRy5wb3N0TWVzc2FnZShudWxsKSl9O2c9ZnVuY3Rpb24oYSxiKXtDPVxueChmdW5jdGlvbigpe2EoZXhwb3J0cy51bnN0YWJsZV9ub3coKSl9LGIpfTtoPWZ1bmN0aW9uKCl7eShDKTtDPS0xfX1mdW5jdGlvbiBIKGEsYil7dmFyIGM9YS5sZW5ndGg7YS5wdXNoKGIpO2E6Zm9yKDs7KXt2YXIgZD1jLTE+Pj4xLGU9YVtkXTtpZih2b2lkIDAhPT1lJiYwPEkoZSxiKSlhW2RdPWIsYVtjXT1lLGM9ZDtlbHNlIGJyZWFrIGF9fWZ1bmN0aW9uIEooYSl7YT1hWzBdO3JldHVybiB2b2lkIDA9PT1hP251bGw6YX1cbmZ1bmN0aW9uIEsoYSl7dmFyIGI9YVswXTtpZih2b2lkIDAhPT1iKXt2YXIgYz1hLnBvcCgpO2lmKGMhPT1iKXthWzBdPWM7YTpmb3IodmFyIGQ9MCxlPWEubGVuZ3RoO2Q8ZTspe3ZhciBtPTIqKGQrMSktMSxuPWFbbV0sdj1tKzEscj1hW3ZdO2lmKHZvaWQgMCE9PW4mJjA+SShuLGMpKXZvaWQgMCE9PXImJjA+SShyLG4pPyhhW2RdPXIsYVt2XT1jLGQ9dik6KGFbZF09bixhW21dPWMsZD1tKTtlbHNlIGlmKHZvaWQgMCE9PXImJjA+SShyLGMpKWFbZF09cixhW3ZdPWMsZD12O2Vsc2UgYnJlYWsgYX19cmV0dXJuIGJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSShhLGIpe3ZhciBjPWEuc29ydEluZGV4LWIuc29ydEluZGV4O3JldHVybiAwIT09Yz9jOmEuaWQtYi5pZH12YXIgTD1bXSxNPVtdLE49MSxPPW51bGwsUD0zLFE9ITEsUj0hMSxTPSExO1xuZnVuY3Rpb24gVChhKXtmb3IodmFyIGI9SihNKTtudWxsIT09Yjspe2lmKG51bGw9PT1iLmNhbGxiYWNrKUsoTSk7ZWxzZSBpZihiLnN0YXJ0VGltZTw9YSlLKE0pLGIuc29ydEluZGV4PWIuZXhwaXJhdGlvblRpbWUsSChMLGIpO2Vsc2UgYnJlYWs7Yj1KKE0pfX1mdW5jdGlvbiBVKGEpe1M9ITE7VChhKTtpZighUilpZihudWxsIT09SihMKSlSPSEwLGYoVik7ZWxzZXt2YXIgYj1KKE0pO251bGwhPT1iJiZnKFUsYi5zdGFydFRpbWUtYSl9fVxuZnVuY3Rpb24gVihhLGIpe1I9ITE7UyYmKFM9ITEsaCgpKTtRPSEwO3ZhciBjPVA7dHJ5e1QoYik7Zm9yKE89SihMKTtudWxsIT09TyYmKCEoTy5leHBpcmF0aW9uVGltZT5iKXx8YSYmIWV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQoKSk7KXt2YXIgZD1PLmNhbGxiYWNrO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXtPLmNhbGxiYWNrPW51bGw7UD1PLnByaW9yaXR5TGV2ZWw7dmFyIGU9ZChPLmV4cGlyYXRpb25UaW1lPD1iKTtiPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGU/Ty5jYWxsYmFjaz1lOk89PT1KKEwpJiZLKEwpO1QoYil9ZWxzZSBLKEwpO089SihMKX1pZihudWxsIT09Tyl2YXIgbT0hMDtlbHNle3ZhciBuPUooTSk7bnVsbCE9PW4mJmcoVSxuLnN0YXJ0VGltZS1iKTttPSExfXJldHVybiBtfWZpbmFsbHl7Tz1udWxsLFA9YyxRPSExfX12YXIgVz1rO2V4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5PTU7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7ZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eT00O2V4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MztleHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO2V4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MjtleHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKGEpe2EuY2FsbGJhY2s9bnVsbH07ZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe1J8fFF8fChSPSEwLGYoVikpfTtleHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIFB9O2V4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gSihMKX07XG5leHBvcnRzLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oYSl7c3dpdGNoKFApe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciBiPTM7YnJlYWs7ZGVmYXVsdDpiPVB9dmFyIGM9UDtQPWI7dHJ5e3JldHVybiBhKCl9ZmluYWxseXtQPWN9fTtleHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludD1XO2V4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5PWZ1bmN0aW9uKGEsYil7c3dpdGNoKGEpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6YnJlYWs7ZGVmYXVsdDphPTN9dmFyIGM9UDtQPWE7dHJ5e3JldHVybiBiKCl9ZmluYWxseXtQPWN9fTtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcIm9iamVjdFwiPT09dHlwZW9mIGMmJm51bGwhPT1jPyhjPWMuZGVsYXksYz1cIm51bWJlclwiPT09dHlwZW9mIGMmJjA8Yz9kK2M6ZCk6Yz1kO3N3aXRjaChhKXtjYXNlIDE6dmFyIGU9LTE7YnJlYWs7Y2FzZSAyOmU9MjUwO2JyZWFrO2Nhc2UgNTplPTEwNzM3NDE4MjM7YnJlYWs7Y2FzZSA0OmU9MUU0O2JyZWFrO2RlZmF1bHQ6ZT01RTN9ZT1jK2U7YT17aWQ6TisrLGNhbGxiYWNrOmIscHJpb3JpdHlMZXZlbDphLHN0YXJ0VGltZTpjLGV4cGlyYXRpb25UaW1lOmUsc29ydEluZGV4Oi0xfTtjPmQ/KGEuc29ydEluZGV4PWMsSChNLGEpLG51bGw9PT1KKEwpJiZhPT09SihNKSYmKFM/aCgpOlM9ITAsZyhVLGMtZCkpKTooYS5zb3J0SW5kZXg9ZSxIKEwsYSksUnx8UXx8KFI9ITAsZihWKSkpO3JldHVybiBhfTtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPVA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9UDtQPWI7dHJ5e3JldHVybiBhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e1A9Y319fTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceURL=webpack-internal:///53
#6 JavaScript::Eval (size: 69669) - SHA256: 38a1938ff8ff35843651bfebe0ec28de4ce11e74e333396946f02adf95cca2dc
; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/variables/constants.js
var CONSTANTS = {
    HASH_CHAR_LIMIT: 50,
    CLASSES: {
        HIDDEN: 'is-hidden',
        ACTIVE: 'is-active',
        CURRENT: 'is-current',
        FOCUSED: 'is-focused',
        ERROR: 'is-error',
        OPEN: 'is-open',
        DISABLED: 'is-disabled',
        HAS_ERROR: 'has-error'
    },
    KEYBOARD: {
        BACKSPACE: 8,
        TAB: 9,
        ENTER: 13,
        ESCAPE: 27,
        LEFT: 37,
        UP: 38,
        RIGHT: 39,
        DOWN: 40,
        DELETE: 46,
        FORWARD_SLASH: 191
    },
    ATTRIBUTES: {
        DISABLED: 'disabled',
        READONLY: 'readonly',
        REQUIRED: 'required',
        MAX: 'max',
        MIN: 'min'
    },
    BREAKPOINTS: {
        XSM: 0,
        SM: 480,
        MD: 680,
        LG: 970,
        XL: 1170,
        XXL: 1600
    }
};; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/debounce.js
/**
 * debounce - Debounce helper method
 * Based on https://github.com/rhysbrettbowen/debounce/blob/master/debounce.js
 *
 * @param  {Function} func  target function to be called
 * @param  {string} wait    wait time after the last call of target function before it is called
 * @return {Function}
 */
function debounce(func, wait) {
    // we need to save these in the closure
    var timeout, args, context, timestamp;
    return function() {
        var _debouncedFunc, last; // save details of latest call


        context = this;
        args = [].slice.call(arguments, 0);
        timestamp = new Date(); // this is where the magic happens

        _debouncedFunc = function debouncedFunc() {
            // how long ago was the last call
            last = new Date() - timestamp; // if the latest call was less that the wait period ago
            // then we reset the timeout to wait for the difference

            if (last < wait) {
                timeout = setTimeout(_debouncedFunc, wait - last);
            } else {
                // or if not we can null out the timer and run the latest
                timeout = null;
                func.apply(context, args);
            }
        }; // we only need to set the timer now if one isn't already running


        if (!timeout) {
            timeout = setTimeout(_debouncedFunc, wait);
        }
    };
}; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/restrictFocus.js
function set(namespace, $container) {
    var eventType = 'focusin.' + namespace;
    $container.attr('tabindex', '0');
    $(document).on(eventType, function(event) {
        if (!$container[0].contains(event.target)) {
            event.stopPropagation();
            $container.focus();
        }
    });
}

function unset(namespace, $container) {
    var eventType = 'focusin.' + namespace;
    $container.attr('tabindex', '-1');
    $(document).off(eventType);
}; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/corp-site/search/search-form-component/clientlib/src/js/search-form-component.js


// type ahead keys

var KEYCODE_TAB = CONSTANTS.KEYBOARD.TAB;
var KEYCODE_ENTER = CONSTANTS.KEYBOARD.ENTER;
var KEYCODE_ESCAPE = CONSTANTS.KEYBOARD.ESCAPE;
var KEYCODE_UP = CONSTANTS.KEYBOARD.UP;
var KEYCODE_DOWN = CONSTANTS.KEYBOARD.DOWN; // type ahead classes and states

var CLASS_WRAPPER = '.js-search-form-input-wrap';
var CLASS_INPUT = '.js-search-form-input';
var CLASS_TYPEAHEAD = '.search-typeahead';
var IS_RESULTS_PAGE = $('.wrapper-body').hasClass('has-search-results');
var CHAR_THRESHOLD = 3;
var AUTO_SUGGEST_DEBOUNCE_WAIT = 200; // search drawer classes

var CLASS_DRAWER_OPEN = 'is-open';
var CLASS_NO_SCROLL = 'no-scroll'; // search drawer view elements

var CLASS_CTA_SEARCH_OPEN = 'cta-search-form-open';
var CLASS_CTA_SEARCH_CLOSE = 'cta-search-form-close';
var CLASS_CTA_SEARCH_OVERLAYS = 'search-overlay';
var $body = $('body'); // List holding instance level global data for all instances

var _instancesData = [];
/**
 * _updateTypeahead - takes data from the suggestions api and updates the dom with results as
 *                    well as making the typeahead visible.
 *
 * @param  {object} data   object containing raw results from the api
 * @param  {object} $input jQuery object representing the current input in use.
 */

function _updateTypeahead(data, $input) {
        if (data && data.results && data.results.length) {
            var resultsList = data.results;
            var $typeahead = $input.siblings(CLASS_TYPEAHEAD);
            var formAction = $input.parents('form').attr('action');
            var listHtml = '';

            for (var i = 0; i < resultsList.length; i++) {
                // build the html to add to the dom.
                var suggestion = resultsList[i];
                var encodedSuggestion = encodeURI(suggestion);
                var link = "".concat(formAction, "?q=").concat(encodedSuggestion, "&ref=auto");
                listHtml += "<li role=\"option\" aria-selected=\"false\"><a href=\"".concat(link, "\" data-query=\"").concat(suggestion, "\" title=\"Search for ").concat(suggestion, "\">").concat(suggestion, "</a></li>\n");
            }

            $typeahead.removeClass('is-hidden').attr('aria-expanded', true).find('ul').html(listHtml);
        } else {
            // if there are no suggestions clear the typeahead ui.
            _clearTypeahead($input);
        }
    }
    /**
     * _clearTypeahead - clears the typeahead results and hides it.
     *
     * @param  {object} $input jQuery object representing the current input in use.
     * @return {Boolean}       allow event to propagate.
     */


function _clearTypeahead($input) {
        var $typeahead = $input.siblings(CLASS_TYPEAHEAD);
        $typeahead.addClass('is-hidden').attr('aria-expanded', false).find('ul').empty();
        return true;
    }
    /**
     * _getMatchingSuggestionsList - creates a list of matching suggestions from the data pool
     *
     * @param {String} inputValue  the value of the input as a trimmed string
     * @param {Object} $input  the $input element jQuery object
     * @returns {Array}  list of matching suggestions from input query against auto suggest result data pool
     */


function _getMatchingSuggestionsList(inputValue, $input) {
        var maxSuggestCount = $input.attr('data-max-suggestions');
        var instanceId = parseInt($input.attr('data-instance-id'), 10);
        var instanceData = _instancesData[instanceId - 1] || {};
        var autoSuggestPoolData = instanceData.autoSuggestData || [];
        var matchingSuggestions = [];

        for (var i = 0; i < autoSuggestPoolData.length; i++) {
            var suggestion = autoSuggestPoolData[i];

            if (suggestion.toLowerCase().indexOf(inputValue.trim().toLowerCase()) === 0) {
                matchingSuggestions.push(suggestion);

                if (matchingSuggestions.length >= maxSuggestCount) {
                    break;
                }
            }
        }

        return matchingSuggestions;
    }
    /**
     * _findSuggestions - makes the request to the suggestions api and acts accordingly through
     *                    callback functions.
     *
     * @param  {String} inputValue the value of the input as a trimmed string.
     * @param  {object} $input jQuery object representing the current input in use.
     */


function _findSuggestions(inputValue, $input) {
        // TODO: update to get suggestion results list from S&P endpoint once the JSON feed is ready
        // prep suggestion data for view updates
        var suggestionsData = {
            results: _getMatchingSuggestionsList(inputValue, $input)
        }; // this function cleans up the typeahead if no results are returned or if an error has
        // occurred, so no error callback is required.

        _updateTypeahead(suggestionsData, $input);
    }
    /**
     * _keyboardNavigation - allows keyboard navigation through and out of the typeahead. this is
     *                       used by functions bound to both the input and the typeahead.
     *
     * @param  {object} $input     jQuery object representing the current input in use.
     * @param  {object} $typeahead jQuery object representing the current typeahead displayed.
     * @param  {object} event      the keydown event
     * @return {boolean}           prevent default event behaviour
     */


function _keyboardNavigation($input, $typeahead, event) {
        var inputIsFocussed = $input.is(':focus');
        var $suggestions = $typeahead.find('a');
        var numSuggestions = $suggestions.length; // if the input focussed jump to either end of the typeahead suggestions.

        if (inputIsFocussed && $.inArray(event.keyCode, [KEYCODE_UP, KEYCODE_DOWN]) > -1) {
            var selectIndex = event.keyCode === KEYCODE_DOWN ? 0 : numSuggestions - 1;

            _updateSelectedSuggestion($suggestions, selectIndex);

            return false; // if the user hits enter on a typeahead suggestion, redirect them to the search results, as
            // long as they aren't currently on the results page.
        }

        if (event.keyCode === KEYCODE_ENTER && !IS_RESULTS_PAGE && !inputIsFocussed) {
            window.location = event.currentTarget.href;
            return false; // if they are using arrow or tab navigation move them to the next appropriate result.
        }

        if ($.inArray(event.keyCode, [KEYCODE_TAB, KEYCODE_UP, KEYCODE_DOWN]) > -1) {
            var currentIndex = $suggestions.index(event.currentTarget); // go down an index for up arrow or shift-tab, otherwise up.

            var indexOffset = event.keyCode === KEYCODE_UP || event.shiftKey && event.keyCode === KEYCODE_TAB ? -1 : 1;

            var _selectIndex = currentIndex + indexOffset;

            if (_selectIndex === -1 || _selectIndex === numSuggestions) {
                // if not an index within the range focus the input
                $input.focus();

                _updateSelectedSuggestion($suggestions);
            } else {
                // otherwise navigate the typeahead.
                _updateSelectedSuggestion($suggestions, _selectIndex);
            }

            return false;
        }

        if (!inputIsFocussed && event.keyCode === KEYCODE_ESCAPE) {
            $input.focus();
            return _clearTypeahead($input);
        }
    }
    /**
     * _updateSelectedSuggestion - update auto suggestion item selected states on view
     *
     * @param  {object} $suggestions  jquery collection of all suggestion anchor items
     * @param  {object} selectIndex  current selected item index
     * @return {void}
     */


function _updateSelectedSuggestion($suggestions) {
        var selectIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
        $suggestions.each(function(idx, ele) {
            var $suggestion = $(ele);
            var $suggestionWrapper = $suggestion.parent('li');

            if (idx === selectIndex) {
                $suggestion.focus();
                $suggestionWrapper.attr('aria-selected', 'true');
            } else {
                $suggestionWrapper.attr('aria-selected', 'false');
            }
        });
    }
    /**
     * _inputKeyBindings - monitor keyboard events on the search input and trigger appropriate behaviour.
     *
     * @param  {object} event   the keyup event.
     */


function _inputKeyBindings(event) {
        var $input = $(event.currentTarget);
        var inputValue = event.currentTarget.value.trim(); // prevent arrow keys from keyboard nav from re-rendering the suggestions.

        if ($.inArray(event.keyCode, [KEYCODE_ENTER, KEYCODE_TAB, KEYCODE_UP, KEYCODE_DOWN]) > -1) {
            return;
        }

        if (inputValue.length >= CHAR_THRESHOLD) {
            // try to provide suggestions in the typeahead dropdown
            _findSuggestions(inputValue, $input);
        } else {
            // clean up and close the typeahead.
            return _clearTypeahead($input);
        }
    }
    /**
     * _inputNavBindings - allow the user to enter the typeahead using arrow keys.
     *
     * @param  {object} event   the keydown event.
     * @return {boolean}        prevent default behaviour.
     */


function _inputNavBindings(event) {
        var $input = $(event.currentTarget);
        var $typeahead = $input.siblings(CLASS_TYPEAHEAD); // up and down arrows will enter the typeahead.

        if ($.inArray(event.keyCode, [KEYCODE_ESCAPE, KEYCODE_ENTER, KEYCODE_UP, KEYCODE_DOWN]) > -1) {
            // if the typeahead isn't visible, don't hijack the keyboard.
            if (!$typeahead.is(':visible')) {
                return;
            } // keyboard navigation into and out of typeahead from input.


            return _keyboardNavigation($input, $typeahead, event);
        }
    }
    /**
     * _typeaheadKeyBindings - setting up handling of keyboard navigation within the typeahead.
     *
     * @param  {object} event   the keydown event.
     */


function _typeaheadKeyBindings(event) {
        var $typeahead = $(event.currentTarget).closest(CLASS_TYPEAHEAD);
        var $input = $typeahead.siblings(CLASS_INPUT);
        return _keyboardNavigation($input, $typeahead, event);
    }
    /**
     * _handleFormSubmission - hijacks the form submission so the query string can be uri encoded
     *                         before being manually redirected to the results page.
     *
     * @param  {object} event  the submit event
     * @return {boolean}  prevent default form submission.
     */


function _handleFormSubmission(event) {
        var $form = $(event.target);
        var $input = $form.find(CLASS_INPUT);
        var query = $input.val().trim();
        window.location = "".concat($form.attr('action'), "?q=").concat(encodeURIComponent(query));
        return false;
    }
    /**
     * _handleSearchFieldFocusChange - update presentational focus state when search field focus state changes
     *
     * @param  {object} event  the focus change events
     * @return {void}
     */


function _handleSearchFieldFocusChange(event) {
        var $inputWrapper = $(event.target).closest(CLASS_WRAPPER);

        if (event.type === 'focus') {
            $inputWrapper.addClass(CONSTANTS.CLASSES.FOCUSED);
        } else if (event.type === 'blur') {
            $inputWrapper.removeClass(CONSTANTS.CLASSES.FOCUSED);
        }
    }
    /**
     * _closeTypeaheadOnBlur - dismiss all typeaheads when click out of the search input
     *
     * @return {boolean}  do not prevent propagation.
     */


function _closeTypeaheadOnBlur(event) {
        var clickedOutsideSearchForm = !$(event.target).closest(CLASS_WRAPPER).length;

        if (clickedOutsideSearchForm) {
            $("".concat(CLASS_INPUT, "[data-typeahead=true]")).each(function($element) {
                _clearTypeahead($($element));
            });
        }

        return true;
    }
    /**
     * _initTypeahead - set up various event bindings to control the typeahead.
     */


function _initTypeahead() {
        $(document) // bind to key events on the inputs.
            .on('input', "".concat(CLASS_INPUT, "[data-typeahead=true]"), debounce(_inputKeyBindings, AUTO_SUGGEST_DEBOUNCE_WAIT)).on('keydown', "".concat(CLASS_INPUT, "[data-typeahead=true]"), _inputNavBindings).on('internal-search', "".concat(CLASS_INPUT, "[data-typeahead=true]"), function(e) {
                _clearTypeahead($(e.target));
            }) // bind key events to the typeahead anchors.
            .on('keydown', "".concat(CLASS_TYPEAHEAD, " a"), _typeaheadKeyBindings).on('click', _closeTypeaheadOnBlur);
    }
    /**
     * _bindEvents - bind search form events
     *
     * Note: this method supports handling per individual search form component instances
     */


function _bindEvents() {
        $(CLASS_INPUT).on('blur focus', _handleSearchFieldFocusChange); // TODO: probably need to move 'IS_RESULTS_PAGE' flag into AEM as component config

        if (!IS_RESULTS_PAGE) {
            // submit search form only if not already on search results page
            $(document).on('submit', '.search-form', _handleFormSubmission);
        }
    }
    /**
     * _openDrawer - opens up the search drawer.
     */


function _openDrawer(e) {
        var $searchWrapper = $(e.target).closest('.header-wrap');
        var $searchOverlay = $searchWrapper.find(".".concat(CLASS_CTA_SEARCH_OVERLAYS));
        var $searchContainer = $searchOverlay.siblings('.search-form-container');
        var $searchinput = $searchContainer.find(CLASS_INPUT);
        $searchContainer.addClass(CLASS_DRAWER_OPEN);
        $searchinput.focus();
        $searchOverlay.addClass(CLASS_DRAWER_OPEN);
        $body.addClass(CLASS_NO_SCROLL);
        $(".".concat(CLASS_CTA_SEARCH_OPEN)).attr('aria-expanded', true);
        set('searchbar', $searchContainer);
    }
    /**
     * _closeDrawer - close the search drawer
     */


function _closeDrawer(e) {
        var $searchWrapper = $(e.target).closest('.header-wrap');
        var $searchOverlay = $searchWrapper.find(".".concat(CLASS_CTA_SEARCH_OVERLAYS));
        var $searchContainer = $searchOverlay.siblings('.search-form-container');
        var $searchOpenButton = $searchWrapper.find('.cta-search-form-open');
        $searchContainer.removeClass(CLASS_DRAWER_OPEN);
        $searchOpenButton.focus();
        $searchOverlay.removeClass(CLASS_DRAWER_OPEN);
        $body.removeClass(CLASS_NO_SCROLL);
        $(".".concat(CLASS_CTA_SEARCH_OPEN)).attr('aria-expanded', false);
        unset('searchbar', $searchContainer);
        return false;
    }
    /**
     * _initDrawer - set up various bindings to control the search drawer.
     *
     * Note: this method assumes there's only one instance of search form component that's coupled with top nav
     */


function _initDrawer() {
    // if you click on the search button, open the search modal.
    $(".".concat(CLASS_CTA_SEARCH_OPEN)).on('click', function(e) {
        return _openDrawer(e);
    });
    $(".".concat(CLASS_CTA_SEARCH_CLOSE)).on('click', function(e) {
        return _closeDrawer(e);
    });
    $(".".concat(CLASS_CTA_SEARCH_OVERLAYS)).on('click', function(e) {
        return _closeDrawer(e);
    });
}

function _prepInstancesAndData() {
    var $allSearchInputs = $(CLASS_INPUT); // Populate instance level global data array for all instances

    $allSearchInputs.each(function(idx, ele) {
        var $input = $(ele);
        var instanceId = idx + 1;
        var autoSuggestEndpoint = $input.attr('data-api-base') || '';
        var instanceData = {
            id: instanceId,
            autoSuggestEndpoint: autoSuggestEndpoint,
            autoSuggestPromise: null,
            autoSuggestData: null
        }; // update global instances data list

        _instancesData.push(instanceData); // update instance id to view


        var autoSuggestListId = "search-form-auto-suggestions-".concat(instanceId);
        var $autoSuggestList = $input.closest(CLASS_WRAPPER).find("".concat(CLASS_TYPEAHEAD, " > ul"));
        $input.attr({
            'data-instance-id': instanceId,
            'aria-owns': autoSuggestListId
        });
        $autoSuggestList.attr('id', autoSuggestListId); // check auto suggest pool endpoint

        if (!autoSuggestEndpoint.length) {
            console.warn('[SF]', 'Invalid auto suggest data endpoint for instance:', instanceId, autoSuggestEndpoint);
            return;
        } // check if current instance's endpoint is the same as previous one to save unnecessary remote calls


        for (var i = idx; i > 0; i--) {
            var previousInstanceIndex = idx - 1;
            var previousInstanceData = _instancesData[previousInstanceIndex] || {};
            var previousInstanceAutoSuggestEndpoint = previousInstanceData.autoSuggestEndpoint;

            if (autoSuggestEndpoint.length && autoSuggestEndpoint === previousInstanceAutoSuggestEndpoint) {
                // reference to previous auto suggest request promise if endpoint matches
                instanceData.autoSuggestPromise = previousInstanceData.autoSuggestPromise;
            }
        } // if no same endpoint request found from other instances, create new


        if (instanceData.autoSuggestPromise === null) {
            instanceData.autoSuggestPromise = $.get(autoSuggestEndpoint);
        } // retrieve basic auto suggest results pool data


        instanceData.autoSuggestPromise.done(function(dataString) {
            if (typeof dataString !== 'string') {
                console.warn('[SF]', 'Invalid auto suggest data string:', instanceId, dataString);
                return;
            } // Note: S&P auto complete data source returns in deprecated JSONP string format,
            // need clean-up before parse it


            var jsonString = dataString.trim().slice(1, -1);

            try {
                instanceData.autoSuggestData = JSON.parse(jsonString.trim());
            } catch (e) {
                instanceData.autoSuggestData = null;
                console.warn('[SF]', 'Invalid auto suggest JSON string:', instanceId, jsonString, e);
            }
        }).fail(function() {
            console.warn('[SF]', 'Error getting auto suggest results pool data', instanceId);
        });
    });
}

function init() {
    var _$;

    _bindEvents();

    _initDrawer(); // update individual instance element DOM and prep instance data
    // this will get '_instancesData' list ready


    _prepInstancesAndData(); // only init type ahead when all instances have resolve their remote requests


    var allInstancesPromises = [];

    _instancesData.forEach(function(instanceData) {
        if (instanceData.autoSuggestPromise !== null) {
            allInstancesPromises.push(instanceData.autoSuggestPromise);
        }
    });

    (_$ = $).when.apply(_$, allInstancesPromises).then(function() {
        _initTypeahead();
    });
}

$(document).ready(function() {
    init();
}); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvdmFyaWFibGVzL2NvbnN0YW50cy5qcz9hZTFjIiwid2VicGFjazovL2FlbS1jbXMtY29kZS8uL3VpLmZyb250ZW5kL3NyYy9tYWluL2dsb2JhbC9qcy9oZWxwZXJzL2RlYm91bmNlLmpzP2QwMTciLCJ3ZWJwYWNrOi8vYWVtLWNtcy1jb2RlLy4vdWkuZnJvbnRlbmQvc3JjL21haW4vZ2xvYmFsL2pzL2hlbHBlcnMvcmVzdHJpY3RGb2N1cy5qcz83M2Q2Iiwid2VicGFjazovL2FlbS1jbXMtY29kZS8uL3VpLmFwcHMvc3JjL21haW4vY29udGVudC9qY3Jfcm9vdC9hcHBzL2dsb2JhbC9jb21wb25lbnRzL2NvcnAtc2l0ZS9zZWFyY2gvc2VhcmNoLWZvcm0tY29tcG9uZW50L2NsaWVudGxpYi9zcmMvanMvc2VhcmNoLWZvcm0tY29tcG9uZW50LmpzPzE5YjYiXSwibmFtZXMiOlsiQ09OU1RBTlRTIiwiSEFTSF9DSEFSX0xJTUlUIiwiQ0xBU1NFUyIsIkhJRERFTiIsIkFDVElWRSIsIkNVUlJFTlQiLCJGT0NVU0VEIiwiRVJST1IiLCJPUEVOIiwiRElTQUJMRUQiLCJIQVNfRVJST1IiLCJLRVlCT0FSRCIsIkJBQ0tTUEFDRSIsIlRBQiIsIkVOVEVSIiwiRVNDQVBFIiwiTEVGVCIsIlVQIiwiUklHSFQiLCJET1dOIiwiREVMRVRFIiwiRk9SV0FSRF9TTEFTSCIsIkFUVFJJQlVURVMiLCJSRUFET05MWSIsIlJFUVVJUkVEIiwiTUFYIiwiTUlOIiwiQlJFQUtQT0lOVFMiLCJYU00iLCJTTSIsIk1EIiwiTEciLCJYTCIsIlhYTCIsImRlYm91bmNlIiwiZnVuYyIsIndhaXQiLCJ0aW1lb3V0IiwiYXJncyIsImNvbnRleHQiLCJ0aW1lc3RhbXAiLCJkZWJvdW5jZWRGdW5jIiwibGFzdCIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsIkRhdGUiLCJzZXRUaW1lb3V0IiwiYXBwbHkiLCJzZXQiLCJuYW1lc3BhY2UiLCIkY29udGFpbmVyIiwiZXZlbnRUeXBlIiwiYXR0ciIsIiQiLCJkb2N1bWVudCIsIm9uIiwiZXZlbnQiLCJjb250YWlucyIsInRhcmdldCIsInN0b3BQcm9wYWdhdGlvbiIsImZvY3VzIiwidW5zZXQiLCJvZmYiLCJLRVlDT0RFX1RBQiIsIktFWUNPREVfRU5URVIiLCJLRVlDT0RFX0VTQ0FQRSIsIktFWUNPREVfVVAiLCJLRVlDT0RFX0RPV04iLCJDTEFTU19XUkFQUEVSIiwiQ0xBU1NfSU5QVVQiLCJDTEFTU19UWVBFQUhFQUQiLCJJU19SRVNVTFRTX1BBR0UiLCJoYXNDbGFzcyIsIkNIQVJfVEhSRVNIT0xEIiwiQVVUT19TVUdHRVNUX0RFQk9VTkNFX1dBSVQiLCJDTEFTU19EUkFXRVJfT1BFTiIsIkNMQVNTX05PX1NDUk9MTCIsIkNMQVNTX0NUQV9TRUFSQ0hfT1BFTiIsIkNMQVNTX0NUQV9TRUFSQ0hfQ0xPU0UiLCJDTEFTU19DVEFfU0VBUkNIX09WRVJMQVlTIiwiJGJvZHkiLCJfaW5zdGFuY2VzRGF0YSIsIl91cGRhdGVUeXBlYWhlYWQiLCJkYXRhIiwiJGlucHV0IiwicmVzdWx0cyIsImxlbmd0aCIsInJlc3VsdHNMaXN0IiwiJHR5cGVhaGVhZCIsInNpYmxpbmdzIiwiZm9ybUFjdGlvbiIsInBhcmVudHMiLCJsaXN0SHRtbCIsImkiLCJzdWdnZXN0aW9uIiwiZW5jb2RlZFN1Z2dlc3Rpb24iLCJlbmNvZGVVUkkiLCJsaW5rIiwicmVtb3ZlQ2xhc3MiLCJmaW5kIiwiaHRtbCIsIl9jbGVhclR5cGVhaGVhZCIsImFkZENsYXNzIiwiZW1wdHkiLCJfZ2V0TWF0Y2hpbmdTdWdnZXN0aW9uc0xpc3QiLCJpbnB1dFZhbHVlIiwibWF4U3VnZ2VzdENvdW50IiwiaW5zdGFuY2VJZCIsInBhcnNlSW50IiwiaW5zdGFuY2VEYXRhIiwiYXV0b1N1Z2dlc3RQb29sRGF0YSIsImF1dG9TdWdnZXN0RGF0YSIsIm1hdGNoaW5nU3VnZ2VzdGlvbnMiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJ0cmltIiwicHVzaCIsIl9maW5kU3VnZ2VzdGlvbnMiLCJzdWdnZXN0aW9uc0RhdGEiLCJfa2V5Ym9hcmROYXZpZ2F0aW9uIiwiaW5wdXRJc0ZvY3Vzc2VkIiwiaXMiLCIkc3VnZ2VzdGlvbnMiLCJudW1TdWdnZXN0aW9ucyIsImluQXJyYXkiLCJrZXlDb2RlIiwic2VsZWN0SW5kZXgiLCJfdXBkYXRlU2VsZWN0ZWRTdWdnZXN0aW9uIiwid2luZG93IiwibG9jYXRpb24iLCJjdXJyZW50VGFyZ2V0IiwiaHJlZiIsImN1cnJlbnRJbmRleCIsImluZGV4IiwiaW5kZXhPZmZzZXQiLCJzaGlmdEtleSIsImVhY2giLCJpZHgiLCJlbGUiLCIkc3VnZ2VzdGlvbiIsIiRzdWdnZXN0aW9uV3JhcHBlciIsInBhcmVudCIsIl9pbnB1dEtleUJpbmRpbmdzIiwidmFsdWUiLCJfaW5wdXROYXZCaW5kaW5ncyIsIl90eXBlYWhlYWRLZXlCaW5kaW5ncyIsImNsb3Nlc3QiLCJfaGFuZGxlRm9ybVN1Ym1pc3Npb24iLCIkZm9ybSIsInF1ZXJ5IiwidmFsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiX2hhbmRsZVNlYXJjaEZpZWxkRm9jdXNDaGFuZ2UiLCIkaW5wdXRXcmFwcGVyIiwidHlwZSIsIl9jbG9zZVR5cGVhaGVhZE9uQmx1ciIsImNsaWNrZWRPdXRzaWRlU2VhcmNoRm9ybSIsIiRlbGVtZW50IiwiX2luaXRUeXBlYWhlYWQiLCJlIiwiX2JpbmRFdmVudHMiLCJfb3BlbkRyYXdlciIsIiRzZWFyY2hXcmFwcGVyIiwiJHNlYXJjaE92ZXJsYXkiLCIkc2VhcmNoQ29udGFpbmVyIiwiJHNlYXJjaGlucHV0Iiwic2V0UmVzdHJpY3RGb2N1cyIsIl9jbG9zZURyYXdlciIsIiRzZWFyY2hPcGVuQnV0dG9uIiwidW5zZXRSZXN0cmljdEZvY3VzIiwiX2luaXREcmF3ZXIiLCJfcHJlcEluc3RhbmNlc0FuZERhdGEiLCIkYWxsU2VhcmNoSW5wdXRzIiwiYXV0b1N1Z2dlc3RFbmRwb2ludCIsImlkIiwiYXV0b1N1Z2dlc3RQcm9taXNlIiwiYXV0b1N1Z2dlc3RMaXN0SWQiLCIkYXV0b1N1Z2dlc3RMaXN0IiwiY29uc29sZSIsIndhcm4iLCJwcmV2aW91c0luc3RhbmNlSW5kZXgiLCJwcmV2aW91c0luc3RhbmNlRGF0YSIsInByZXZpb3VzSW5zdGFuY2VBdXRvU3VnZ2VzdEVuZHBvaW50IiwiZ2V0IiwiZG9uZSIsImRhdGFTdHJpbmciLCJqc29uU3RyaW5nIiwiSlNPTiIsInBhcnNlIiwiZmFpbCIsImluaXQiLCJhbGxJbnN0YW5jZXNQcm9taXNlcyIsImZvckVhY2giLCJ3aGVuIiwidGhlbiIsInJlYWR5Il0sIm1hcHBpbmdzIjoiOztBQUFPLElBQU1BLFNBQVMsR0FBRztFQUN2QkMsZUFBZSxFQUFFLEVBRE07RUFHdkJDLE9BQU8sRUFBRTtJQUNQQyxNQUFNLEVBQUUsV0FERDtJQUVQQyxNQUFNLEVBQUUsV0FGRDtJQUdQQyxPQUFPLEVBQUUsWUFIRjtJQUlQQyxPQUFPLEVBQUUsWUFKRjtJQUtQQyxLQUFLLEVBQUUsVUFMQTtJQU1QQyxJQUFJLEVBQUUsU0FOQztJQU9QQyxRQUFRLEVBQUUsYUFQSDtJQVFQQyxTQUFTLEVBQUU7RUFSSixDQUhjO0VBY3ZCQyxRQUFRLEVBQUU7SUFDUkMsU0FBUyxFQUFFLENBREg7SUFFUkMsR0FBRyxFQUFFLENBRkc7SUFHUkMsS0FBSyxFQUFFLEVBSEM7SUFJUkMsTUFBTSxFQUFFLEVBSkE7SUFLUkMsSUFBSSxFQUFFLEVBTEU7SUFNUkMsRUFBRSxFQUFFLEVBTkk7SUFPUkMsS0FBSyxFQUFFLEVBUEM7SUFRUkMsSUFBSSxFQUFFLEVBUkU7SUFTUkMsTUFBTSxFQUFFLEVBVEE7SUFVUkMsYUFBYSxFQUFFO0VBVlAsQ0FkYTtFQTJCdkJDLFVBQVUsRUFBRTtJQUNWYixRQUFRLEVBQUUsVUFEQTtJQUVWYyxRQUFRLEVBQUUsVUFGQTtJQUdWQyxRQUFRLEVBQUUsVUFIQTtJQUlWQyxHQUFHLEVBQUUsS0FKSztJQUtWQyxHQUFHLEVBQUU7RUFMSyxDQTNCVztF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TUFDRCxDQUZELENBRUUsT0FBTzRDLENBQVAsRUFBVTtRQUNWbEQsWUFBWSxDQUFDRSxlQUFiLEdBQStCLElBQS9CO1FBQ0FtRSxPQUFPLENBQUNDLElBQVIsQ0FBYSxNQUFiLEVBQXFCLG1DQUFyQixFQUEwRHhFLFVBQTFELEVBQXNFK0UsVUFBdEUsRUFBa0YzQixDQUFsRjtNQUNEO0lBQ0YsQ0FoQkgsRUFpQkc4QixJQWpCSCxDQWlCUSxZQUFNO01BQ1ZYLE9BQU8sQ0FBQ0MsSUFBUixDQUFhLE1BQWIsRUFBcUIsOENBQXJCLEVBQXFFeEUsVUFBckU7SUFDRCxDQW5CSDtFQW9CRCxDQW5FRDtBQW9FRDs7QUFFRCxTQUFTbUYsSUFBVCxHQUFnQjtFQUFBOztFQUNkOUIsV0FBVzs7RUFDWFUsV0FBVyxHQUZHLENBSWQ7RUFDQTs7O0VBQ0FDLHFCQUFxQixHQU5QLENBUWQ7OztFQUNBLElBQU1vQixvQkFBb0IsR0FBRyxFQUE3Qjs7RUFDQTlHLGNBQWMsQ0FBQytHLE9BQWYsQ0FBdUIsVUFBQ25GLFlBQUQsRUFBa0I7SUFDdkMsSUFBSUEsWUFBWSxDQUFDa0Usa0JBQWIsS0FBb0MsSUFBeEMsRUFBOEM7TUFDNUNnQixvQkFBb0IsQ0FBQzNFLElBQXJCLENBQTBCUCxZQUFZLENBQUNrRSxrQkFBdkM7SUFDRDtFQUNGLENBSkQ7O0VBS0EsTUFBQTFILENBQUMsRUFBQzRJLElBQUYsV0FBVUYsb0JBQVYsRUFBZ0NHLElBQWhDLENBQXFDLFlBQU07SUFDekNwQyxjQUFjO0VBQ2YsQ0FGRDtBQUdEOztBQUVEekcsQ0FBQyxDQUFDQyxRQUFELENBQUQsQ0FBWTZJLEtBQVosQ0FBa0IsWUFBTTtFQUN0QkwsSUFBSTtBQUNMLENBRkQiLCJmaWxlIjoiNzg3Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBDT05TVEFOVFMgPSB7XG4gIEhBU0hfQ0hBUl9MSU1JVDogNTAsXG5cbiAgQ0xBU1NFUzoge1xuICAgIEhJRERFTjogJ2lzLWhpZGRlbicsXG4gICAgQUNUSVZFOiAnaXMtYWN0aXZlJyxcbiAgICBDVVJSRU5UOiAnaXMtY3VycmVudCcsXG4gICAgRk9DVVNFRDogJ2lzLWZvY3VzZWQnLFxuICAgIEVSUk9SOiAnaXMtZXJyb3InLFxuICAgIE9QRU46ICdpcy1vcGVuJyxcbiAgICBESVNBQkxFRDogJ2lzLWRpc2FibGVkJyxcbiAgICBIQVNfRVJST1I6ICdoYXMtZXJyb3InXG4gIH0sXG5cbiAgS0VZQk9BUkQ6IHtcbiAgICBCQUNLU1BBQ0U6IDgsXG4gICAgVEFCOiA5LFxuICAgIEVOVEVSOiAxMyxcbiAgICBFU0NBUEU6IDI3LFxuICAgIExFRlQ6IDM3LFxuICAgIFVQOiAzOCxcbiAgICBSSUdIVDogMzksXG4gICAgRE9XTjogNDAsXG4gICAgREVMRVRFOiA0NixcbiAgICBGT1JXQVJEX1NMQVNIOiAxOTFcbiAgfSxcblxuICBBVFRSSUJVVEVTOiB7XG4gICAgRElTQUJMRUQ6ICdkaXNhYmxlZCcsXG4gICAgUkVBRE9OTFk6ICdyZWFkb25seScsXG4gICAgUkVRVUlSRUQ6ICdyZXF1aXJlZCcsXG4gICAgTUFYOiAnbWF4JyxcbiAgICBNSU46ICdtaW4nXG4gIH0sXG5cbiAgQlJFQUtQT0lOVFM6IHtcbiAgICBYU006IDAsXG4gICAgU006IDQ4MCxcbiAgICBNRDogNjgwLFxuICAgIExHOiA5NzAsXG4gICAgWEw6IDExNzAsXG4gICAgWFhMOiAxNjAwXG4gIH1cbn07XG4iLCIvKipcbiAqIGRlYm91bmNlIC0gRGVib3VuY2UgaGVscGVyIG1ldGhvZFxuICogQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3JoeXNicmV0dGJvd2VuL2RlYm91bmNlL2Jsb2IvbWFzdGVyL2RlYm91bmNlLmpzXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZ1bmMgIHRhcmdldCBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSAge3N0cmluZ30gd2FpdCAgICB3YWl0IHRpbWUgYWZ0ZXIgdGhlIGxhc3QgY2FsbCBvZiB0YXJnZXQgZnVuY3Rpb24gYmVmb3JlIGl0IGlzIGNhbGxlZFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0KSB7XG4gIC8vIHdlIG5lZWQgdG8gc2F2ZSB0aGVzZSBpbiB0aGUgY2xvc3VyZVxuICB2YXIgdGltZW91dCwgYXJncywgY29udGV4dCwgdGltZXN0YW1wO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGVib3VuY2VkRnVuYywgbGFzdDtcblxuICAgIC8vIHNhdmUgZGV0YWlscyBvZiBsYXRlc3QgY2FsbFxuICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgdGltZXN0YW1wID0gbmV3IERhdGUoKTtcblxuICAgIC8vIHRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnNcbiAgICBkZWJvdW5jZWRGdW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyBob3cgbG9uZyBhZ28gd2FzIHRoZSBsYXN0IGNhbGxcbiAgICAgIGxhc3QgPSAobmV3IERhdGUoKSkgLSB0aW1lc3RhbXA7XG5cbiAgICAgIC8vIGlmIHRoZSBsYXRlc3QgY2FsbCB3YXMgbGVzcyB0aGF0IHRoZSB3YWl0IHBlcmlvZCBhZ29cbiAgICAgIC8vIHRoZW4gd2UgcmVzZXQgdGhlIHRpbWVvdXQgdG8gd2FpdCBmb3IgdGhlIGRpZmZlcmVuY2VcbiAgICAgIGlmIChsYXN0IDwgd2FpdCkge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChkZWJvdW5jZWRGdW5jLCB3YWl0IC0gbGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvciBpZiBub3Qgd2UgY2FuIG51bGwgb3V0IHRoZSB0aW1lciBhbmQgcnVuIHRoZSBsYXRlc3RcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIHdlIG9ubHkgbmVlZCB0byBzZXQgdGhlIHRpbWVyIG5vdyBpZiBvbmUgaXNuJ3QgYWxyZWFkeSBydW5uaW5nXG4gICAgaWYgKCF0aW1lb3V0KSB7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChkZWJvdW5jZWRGdW5jLCB3YWl0KTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBzZXQobmFtZXNwYWNlLCAkY29udGFpbmVyKSB7XG4gIHZhciBldmVudFR5cGUgPSAnZm9jdXNpbi4nICsgbmFtZXNwYWNlO1xuXG4gICRjb250YWluZXIuYXR0cigndGFiaW5kZXgnLCAnMCcpO1xuXG4gICQoZG9jdW1lbnQpLm9uKGV2ZW50VHlwZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAoISRjb250YWluZXJbMF0uY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAkY29udGFpbmVyLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc2V0KG5hbWVzcGFjZSwgJGNvbnRhaW5lcikge1xuICB2YXIgZXZlbnRUeXBlID0gJ2ZvY3VzaW4uJyArIG5hbWVzcGFjZTtcblxuICAkY29udGFpbmVyLmF0dHIoJ3RhYmluZGV4JywgJy0xJyk7XG5cbiAgJChkb2N1bWVudCkub2ZmKGV2ZW50VHlwZSk7XG59XG4iLCJpbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tICdDb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnSGVscGVycy9kZWJvdW5jZSc7XG5pbXBvcnQgeyBzZXQgYXMgc2V0UmVzdHJpY3RGb2N1cywgdW5zZXQgYXMgdW5zZXRSZXN0cmljdEZvY3VzIH0gZnJvbSAnSGVscGVycy9yZXN0cmljdEZvY3VzJztcblxuLy8gdHlwZSBhaGVhZCBrZXlzXG5jb25zdCBLRVlDT0RFX1RBQiA9IENPTlNUQU5UUy5LRVlCT0FSRC5UQUI7XG5jb25zdCBLRVlDT0RFX0VOVEVSID0gQ09OU1RBTlRTLktFWUJPQVJELkVOVEVSO1xuY29uc3QgS0VZQ09ERV9FU0NBUEUgPSBDT05TVEFOVFMuS0VZQk9BUkQuRVNDQVBFO1xuY29uc3QgS0VZQ09ERV9VUCA9IENPTlNUQU5UUy5LRVlCT0FSRC5VUDtcbmNvbnN0IEtFWUNPREVfRE9XTiA9IENPTlNUQU5UUy5LRVlCT0FSRC5ET1dOO1xuXG4vLyB0eXBlIGFoZWFkIGNsYXNzZXMgYW5kIHN0YXRlc1xuY29uc3QgQ0xBU1NfV1JBUFBFUiA9ICcuanMtc2VhcmNoLWZvcm0taW5wdXQtd3JhcCc7XG5jb25zdCBDTEFTU19JTlBVVCA9ICcuanMtc2VhcmNoLWZvcm0taW5wdXQnO1xuY29uc3QgQ0xBU1NfVFlQRUFIRUFEID0gJy5zZWFyY2gtdHlwZWFoZWFkJztcbmNvbnN0IElTX1JFU1VMVFNfUEFHRSA9ICQoJy53cmFwcGVyLWJvZHknKS5oYXNDbGFzcygnaGFzLXNlYXJjaC1yZXN1bHRzJyk7XG5jb25zdCBDSEFSX1RIUkVTSE9MRCA9IDM7XG5jb25zdCBBVVRPX1NVR0dFU1RfREVCT1VOQ0VfV0FJVCA9IDIwMDtcblxuLy8gc2VhcmNoIGRyYXdlciBjbGFzc2VzXG5jb25zdCBDTEFTU19EUkFXRVJfT1BFTiA9ICdpcy1vcGVuJztcbmNvbnN0IENMQVNTX05PX1NDUk9MTCA9ICduby1zY3JvbGwnO1xuXG4vLyBzZWFyY2ggZHJhd2VyIHZpZXcgZWxlbWVudHNcbmNvbnN0IENMQVNTX0NUQV9TRUFSQ0hfT1BFTiA9ICdjdGEtc2VhcmNoLWZvcm0tb3Blbic7XG5jb25zdCBDTEFTU19DVEFfU0VBUkNIX0NMT1NFID0gJ2N0YS1zZWFyY2gtZm9ybS1jbG9zZSc7XG5jb25zdCBDTEFTU19DVEFfU0VBUkNIX09WRVJMQVlTID0gJ3NlYXJjaC1vdmVybGF5JztcbmNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXG4vLyBMaXN0IGhvbGRpbmcgaW5zdGFuY2UgbGV2ZWwgZ2xvYmFsIGRhdGEgZm9yIGFsbCBpbnN0YW5jZXNcbmNvbnN0IF9pbnN0YW5jZXNEYXRhID0gW107XG5cbi8qKlxuICogX3VwZGF0ZVR5cGVhaGVhZCAtIHRha2VzIGRhdGEgZnJvbSB0aGUgc3VnZ2VzdGlvbnMgYXBpIGFuZCB1cGRhdGVzIHRoZSBkb20gd2l0aCByZXN1bHRzIGFzXG4gKiAgICAgICAgICAgICAgICAgICAgd2VsbCBhcyBtYWtpbmcgdGhlIHR5cGVhaGVhZCB2aXNpYmxlLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZGF0YSAgIG9iamVjdCBjb250YWluaW5nIHJhdyByZXN1bHRzIGZyb20gdGhlIGFwaVxuICogQHBhcmFtICB7b2JqZWN0fSAkaW5wdXQgalF1ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgaW5wdXQgaW4gdXNlLlxuICovXG5mdW5jdGlvbiBfdXBkYXRlVHlwZWFoZWFkKGRhdGEsICRpbnB1dCkge1xuICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdHMgJiYgZGF0YS5yZXN1bHRzLmxlbmd0aCkge1xuICAgIGNvbnN0IHJlc3VsdHNMaXN0ID0gZGF0YS5yZXN1bHRzO1xuICAgIGNvbnN0ICR0eXBlYWhlYWQgPSAkaW5wdXQuc2libGluZ3MoQ0xBU1NfVFlQRUFIRUFEKTtcbiAgICBjb25zdCBmb3JtQWN0aW9uID0gJGlucHV0LnBhcmVudHMoJ2Zvcm0nKS5hdHRyKCdhY3Rpb24nKTtcbiAgICBsZXQgbGlzdEh0bWwgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0c0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIGJ1aWxkIHRoZSBodG1sIHRvIGFkZCB0byB0aGUgZG9tLlxuICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IHJlc3VsdHNMaXN0W2ldO1xuICAgICAgY29uc3QgZW5jb2RlZFN1Z2dlc3Rpb24gPSBlbmNvZGVVUkkoc3VnZ2VzdGlvbik7XG4gICAgICBjb25zdCBsaW5rID0gYCR7Zm9ybUFjdGlvbn0/cT0ke2VuY29kZWRTdWdnZXN0aW9ufSZyZWY9YXV0b2A7XG5cbiAgICAgIGxpc3RIdG1sICs9IGA8bGkgcm9sZT1cIm9wdGlvblwiIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiPjxhIGhyZWY9XCIke2xpbmt9XCIgZGF0YS1xdWVyeT1cIiR7c3VnZ2VzdGlvbn1cIiB0aXRsZT1cIlNlYXJjaCBmb3IgJHtzdWdnZXN0aW9ufVwiPiR7c3VnZ2VzdGlvbn08L2E+PC9saT5cXG5gO1xuICAgIH1cblxuICAgICR0eXBlYWhlYWRcbiAgICAgIC5yZW1vdmVDbGFzcygnaXMtaGlkZGVuJylcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSlcbiAgICAgIC5maW5kKCd1bCcpXG4gICAgICAuaHRtbChsaXN0SHRtbCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHN1Z2dlc3Rpb25zIGNsZWFyIHRoZSB0eXBlYWhlYWQgdWkuXG4gICAgX2NsZWFyVHlwZWFoZWFkKCRpbnB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBfY2xlYXJUeXBlYWhlYWQgLSBjbGVhcnMgdGhlIHR5cGVhaGVhZCByZXN1bHRzIGFuZCBoaWRlcyBpdC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICRpbnB1dCBqUXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpbnB1dCBpbiB1c2UuXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICBhbGxvdyBldmVudCB0byBwcm9wYWdhdGUuXG4gKi9cbmZ1bmN0aW9uIF9jbGVhclR5cGVhaGVhZCgkaW5wdXQpIHtcbiAgY29uc3QgJHR5cGVhaGVhZCA9ICRpbnB1dC5zaWJsaW5ncyhDTEFTU19UWVBFQUhFQUQpO1xuXG4gICR0eXBlYWhlYWRcbiAgICAuYWRkQ2xhc3MoJ2lzLWhpZGRlbicpXG4gICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSlcbiAgICAuZmluZCgndWwnKVxuICAgIC5lbXB0eSgpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIF9nZXRNYXRjaGluZ1N1Z2dlc3Rpb25zTGlzdCAtIGNyZWF0ZXMgYSBsaXN0IG9mIG1hdGNoaW5nIHN1Z2dlc3Rpb25zIGZyb20gdGhlIGRhdGEgcG9vbFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dFZhbHVlICB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IGFzIGEgdHJpbW1lZCBzdHJpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSAkaW5wdXQgIHRoZSAkaW5wdXQgZWxlbWVudCBqUXVlcnkgb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9ICBsaXN0IG9mIG1hdGNoaW5nIHN1Z2dlc3Rpb25zIGZyb20gaW5wdXQgcXVlcnkgYWdhaW5zdCBhdXRvIHN1Z2dlc3QgcmVzdWx0IGRhdGEgcG9vbFxuICovXG5mdW5jdGlvbiBfZ2V0TWF0Y2hpbmdTdWdnZXN0aW9uc0xpc3QoaW5wdXRWYWx1ZSwgJGlucHV0KSB7XG4gIGNvbnN0IG1heFN1Z2dlc3RDb3VudCA9ICRpbnB1dC5hdHRyKCdkYXRhLW1heC1zdWdnZXN0aW9ucycpO1xuICBjb25zdCBpbnN0YW5jZUlkID0gcGFyc2VJbnQoJGlucHV0LmF0dHIoJ2RhdGEtaW5zdGFuY2UtaWQnKSwgMTApO1xuICBjb25zdCBpbnN0YW5jZURhdGEgPSBfaW5zdGFuY2VzRGF0YVtpbnN0YW5jZUlkIC0gMV0gfHwge307XG4gIGNvbnN0IGF1dG9TdWdnZXN0UG9vbERhdGEgPSBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3REYXRhIHx8IFtdO1xuICBjb25zdCBtYXRjaGluZ1N1Z2dlc3Rpb25zID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdXRvU3VnZ2VzdFBvb2xEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGF1dG9TdWdnZXN0UG9vbERhdGFbaV07XG4gICAgaWYgKHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKGlucHV0VmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpID09PSAwKSB7XG4gICAgICBtYXRjaGluZ1N1Z2dlc3Rpb25zLnB1c2goc3VnZ2VzdGlvbik7XG4gICAgICBpZiAobWF0Y2hpbmdTdWdnZXN0aW9ucy5sZW5ndGggPj0gbWF4U3VnZ2VzdENvdW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaGluZ1N1Z2dlc3Rpb25zO1xufVxuXG4vKipcbiAqIF9maW5kU3VnZ2VzdGlvbnMgLSBtYWtlcyB0aGUgcmVxdWVzdCB0byB0aGUgc3VnZ2VzdGlvbnMgYXBpIGFuZCBhY3RzIGFjY29yZGluZ2x5IHRocm91Z2hcbiAqICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBpbnB1dFZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgYXMgYSB0cmltbWVkIHN0cmluZy5cbiAqIEBwYXJhbSAge29iamVjdH0gJGlucHV0IGpRdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGlucHV0IGluIHVzZS5cbiAqL1xuZnVuY3Rpb24gX2ZpbmRTdWdnZXN0aW9ucyhpbnB1dFZhbHVlLCAkaW5wdXQpIHtcbiAgLy8gVE9ETzogdXBkYXRlIHRvIGdldCBzdWdnZXN0aW9uIHJlc3VsdHMgbGlzdCBmcm9tIFMmUCBlbmRwb2ludCBvbmNlIHRoZSBKU09OIGZlZWQgaXMgcmVhZHlcblxuICAvLyBwcmVwIHN1Z2dlc3Rpb24gZGF0YSBmb3IgdmlldyB1cGRhdGVzXG4gIGNvbnN0IHN1Z2dlc3Rpb25zRGF0YSA9IHtcbiAgICByZXN1bHRzOiBfZ2V0TWF0Y2hpbmdTdWdnZXN0aW9uc0xpc3QoaW5wdXRWYWx1ZSwgJGlucHV0KSxcbiAgfTtcblxuICAvLyB0aGlzIGZ1bmN0aW9uIGNsZWFucyB1cCB0aGUgdHlwZWFoZWFkIGlmIG5vIHJlc3VsdHMgYXJlIHJldHVybmVkIG9yIGlmIGFuIGVycm9yIGhhc1xuICAvLyBvY2N1cnJlZCwgc28gbm8gZXJyb3IgY2FsbGJhY2sgaXMgcmVxdWlyZWQuXG4gIF91cGRhdGVUeXBlYWhlYWQoc3VnZ2VzdGlvbnNEYXRhLCAkaW5wdXQpO1xufVxuXG4vKipcbiAqIF9rZXlib2FyZE5hdmlnYXRpb24gLSBhbGxvd3Mga2V5Ym9hcmQgbmF2aWdhdGlvbiB0aHJvdWdoIGFuZCBvdXQgb2YgdGhlIHR5cGVhaGVhZC4gdGhpcyBpc1xuICogICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgZnVuY3Rpb25zIGJvdW5kIHRvIGJvdGggdGhlIGlucHV0IGFuZCB0aGUgdHlwZWFoZWFkLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gJGlucHV0ICAgICBqUXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpbnB1dCBpbiB1c2UuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICR0eXBlYWhlYWQgalF1ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdHlwZWFoZWFkIGRpc3BsYXllZC5cbiAqIEBwYXJhbSAge29iamVjdH0gZXZlbnQgICAgICB0aGUga2V5ZG93biBldmVudFxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgIHByZXZlbnQgZGVmYXVsdCBldmVudCBiZWhhdmlvdXJcbiAqL1xuZnVuY3Rpb24gX2tleWJvYXJkTmF2aWdhdGlvbigkaW5wdXQsICR0eXBlYWhlYWQsIGV2ZW50KSB7XG4gIGNvbnN0IGlucHV0SXNGb2N1c3NlZCA9ICRpbnB1dC5pcygnOmZvY3VzJyk7XG4gIGNvbnN0ICRzdWdnZXN0aW9ucyA9ICR0eXBlYWhlYWQuZmluZCgnYScpO1xuICBjb25zdCBudW1TdWdnZXN0aW9ucyA9ICRzdWdnZXN0aW9ucy5sZW5ndGg7XG5cbiAgLy8gaWYgdGhlIGlucHV0IGZvY3Vzc2VkIGp1bXAgdG8gZWl0aGVyIGVuZCBvZiB0aGUgdHlwZWFoZWFkIHN1Z2dlc3Rpb25zLlxuICBpZiAoaW5wdXRJc0ZvY3Vzc2VkICYmICQuaW5BcnJheShldmVudC5rZXlDb2RlLCBbS0VZQ09ERV9VUCxcbiAgICBLRVlDT0RFX0RPV05dKSA+IC0xKSB7XG4gICAgY29uc3Qgc2VsZWN0SW5kZXggPSAoZXZlbnQua2V5Q29kZSA9PT0gS0VZQ09ERV9ET1dOKSA/IDAgOiBudW1TdWdnZXN0aW9ucyAtIDE7XG4gICAgX3VwZGF0ZVNlbGVjdGVkU3VnZ2VzdGlvbigkc3VnZ2VzdGlvbnMsIHNlbGVjdEluZGV4KTtcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gaWYgdGhlIHVzZXIgaGl0cyBlbnRlciBvbiBhIHR5cGVhaGVhZCBzdWdnZXN0aW9uLCByZWRpcmVjdCB0aGVtIHRvIHRoZSBzZWFyY2ggcmVzdWx0cywgYXNcbiAgLy8gbG9uZyBhcyB0aGV5IGFyZW4ndCBjdXJyZW50bHkgb24gdGhlIHJlc3VsdHMgcGFnZS5cbiAgfSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZQ09ERV9FTlRFUiAmJiAhSVNfUkVTVUxUU19QQUdFICYmICFpbnB1dElzRm9jdXNzZWQpIHtcbiAgICB3aW5kb3cubG9jYXRpb24gPSBldmVudC5jdXJyZW50VGFyZ2V0LmhyZWY7XG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIGlmIHRoZXkgYXJlIHVzaW5nIGFycm93IG9yIHRhYiBuYXZpZ2F0aW9uIG1vdmUgdGhlbSB0byB0aGUgbmV4dCBhcHByb3ByaWF0ZSByZXN1bHQuXG4gIH0gaWYgKCQuaW5BcnJheShldmVudC5rZXlDb2RlLCBbS0VZQ09ERV9UQUIsXG4gICAgS0VZQ09ERV9VUCxcbiAgICBLRVlDT0RFX0RPV05dKSA+IC0xKSB7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gJHN1Z2dlc3Rpb25zLmluZGV4KGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIC8vIGdvIGRvd24gYW4gaW5kZXggZm9yIHVwIGFycm93IG9yIHNoaWZ0LXRhYiwgb3RoZXJ3aXNlIHVwLlxuICAgIGNvbnN0IGluZGV4T2Zmc2V0ID0gKGV2ZW50LmtleUNvZGUgPT09IEtFWUNPREVfVVBcbiAgICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gS0VZQ09ERV9UQUIpKSA/IC0xIDogMTtcbiAgICBjb25zdCBzZWxlY3RJbmRleCA9IGN1cnJlbnRJbmRleCArIGluZGV4T2Zmc2V0O1xuXG4gICAgaWYgKHNlbGVjdEluZGV4ID09PSAtMSB8fCBzZWxlY3RJbmRleCA9PT0gbnVtU3VnZ2VzdGlvbnMpIHtcbiAgICAgIC8vIGlmIG5vdCBhbiBpbmRleCB3aXRoaW4gdGhlIHJhbmdlIGZvY3VzIHRoZSBpbnB1dFxuICAgICAgJGlucHV0LmZvY3VzKCk7XG4gICAgICBfdXBkYXRlU2VsZWN0ZWRTdWdnZXN0aW9uKCRzdWdnZXN0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSBuYXZpZ2F0ZSB0aGUgdHlwZWFoZWFkLlxuICAgICAgX3VwZGF0ZVNlbGVjdGVkU3VnZ2VzdGlvbigkc3VnZ2VzdGlvbnMsIHNlbGVjdEluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gaWYgKCFpbnB1dElzRm9jdXNzZWQgJiYgZXZlbnQua2V5Q29kZSA9PT0gS0VZQ09ERV9FU0NBUEUpIHtcbiAgICAkaW5wdXQuZm9jdXMoKTtcbiAgICByZXR1cm4gX2NsZWFyVHlwZWFoZWFkKCRpbnB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBfdXBkYXRlU2VsZWN0ZWRTdWdnZXN0aW9uIC0gdXBkYXRlIGF1dG8gc3VnZ2VzdGlvbiBpdGVtIHNlbGVjdGVkIHN0YXRlcyBvbiB2aWV3XG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAkc3VnZ2VzdGlvbnMgIGpxdWVyeSBjb2xsZWN0aW9uIG9mIGFsbCBzdWdnZXN0aW9uIGFuY2hvciBpdGVtc1xuICogQHBhcmFtICB7b2JqZWN0fSBzZWxlY3RJbmRleCAgY3VycmVudCBzZWxlY3RlZCBpdGVtIGluZGV4XG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBfdXBkYXRlU2VsZWN0ZWRTdWdnZXN0aW9uKCRzdWdnZXN0aW9ucywgc2VsZWN0SW5kZXggPSAtMSkge1xuICAkc3VnZ2VzdGlvbnMuZWFjaCgoaWR4LCBlbGUpID0+IHtcbiAgICBjb25zdCAkc3VnZ2VzdGlvbiA9ICQoZWxlKTtcbiAgICBjb25zdCAkc3VnZ2VzdGlvbldyYXBwZXIgPSAkc3VnZ2VzdGlvbi5wYXJlbnQoJ2xpJyk7XG4gICAgaWYgKGlkeCA9PT0gc2VsZWN0SW5kZXgpIHtcbiAgICAgICRzdWdnZXN0aW9uLmZvY3VzKCk7XG4gICAgICAkc3VnZ2VzdGlvbldyYXBwZXIuYXR0cignYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRzdWdnZXN0aW9uV3JhcHBlci5hdHRyKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBfaW5wdXRLZXlCaW5kaW5ncyAtIG1vbml0b3Iga2V5Ym9hcmQgZXZlbnRzIG9uIHRoZSBzZWFyY2ggaW5wdXQgYW5kIHRyaWdnZXIgYXBwcm9wcmlhdGUgYmVoYXZpb3VyLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZXZlbnQgICB0aGUga2V5dXAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIF9pbnB1dEtleUJpbmRpbmdzKGV2ZW50KSB7XG4gIGNvbnN0ICRpbnB1dCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gIGNvbnN0IGlucHV0VmFsdWUgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlLnRyaW0oKTtcblxuICAvLyBwcmV2ZW50IGFycm93IGtleXMgZnJvbSBrZXlib2FyZCBuYXYgZnJvbSByZS1yZW5kZXJpbmcgdGhlIHN1Z2dlc3Rpb25zLlxuICBpZiAoJC5pbkFycmF5KGV2ZW50LmtleUNvZGUsIFtLRVlDT0RFX0VOVEVSLFxuICAgIEtFWUNPREVfVEFCLFxuICAgIEtFWUNPREVfVVAsXG4gICAgS0VZQ09ERV9ET1dOXSkgPiAtMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbnB1dFZhbHVlLmxlbmd0aCA+PSBDSEFSX1RIUkVTSE9MRCkge1xuICAgIC8vIHRyeSB0byBwcm92aWRlIHN1Z2dlc3Rpb25zIGluIHRoZSB0eXBlYWhlYWQgZHJvcGRvd25cbiAgICBfZmluZFN1Z2dlc3Rpb25zKGlucHV0VmFsdWUsICRpbnB1dCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gY2xlYW4gdXAgYW5kIGNsb3NlIHRoZSB0eXBlYWhlYWQuXG4gICAgcmV0dXJuIF9jbGVhclR5cGVhaGVhZCgkaW5wdXQpO1xuICB9XG59XG5cbi8qKlxuICogX2lucHV0TmF2QmluZGluZ3MgLSBhbGxvdyB0aGUgdXNlciB0byBlbnRlciB0aGUgdHlwZWFoZWFkIHVzaW5nIGFycm93IGtleXMuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBldmVudCAgIHRoZSBrZXlkb3duIGV2ZW50LlxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvdXIuXG4gKi9cbmZ1bmN0aW9uIF9pbnB1dE5hdkJpbmRpbmdzKGV2ZW50KSB7XG4gIGNvbnN0ICRpbnB1dCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gIGNvbnN0ICR0eXBlYWhlYWQgPSAkaW5wdXQuc2libGluZ3MoQ0xBU1NfVFlQRUFIRUFEKTtcblxuICAvLyB1cCBhbmQgZG93biBhcnJvd3Mgd2lsbCBlbnRlciB0aGUgdHlwZWFoZWFkLlxuICBpZiAoJC5pbkFycmF5KGV2ZW50LmtleUNvZGUsIFtLRVlDT0RFX0VTQ0FQRSxcbiAgICBLRVlDT0RFX0VOVEVSLFxuICAgIEtFWUNPREVfVVAsXG4gICAgS0VZQ09ERV9ET1dOXSkgPiAtMSkge1xuICAgIC8vIGlmIHRoZSB0eXBlYWhlYWQgaXNuJ3QgdmlzaWJsZSwgZG9uJ3QgaGlqYWNrIHRoZSBrZXlib2FyZC5cbiAgICBpZiAoISR0eXBlYWhlYWQuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBrZXlib2FyZCBuYXZpZ2F0aW9uIGludG8gYW5kIG91dCBvZiB0eXBlYWhlYWQgZnJvbSBpbnB1dC5cbiAgICByZXR1cm4gX2tleWJvYXJkTmF2aWdhdGlvbigkaW5wdXQsICR0eXBlYWhlYWQsIGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIF90eXBlYWhlYWRLZXlCaW5kaW5ncyAtIHNldHRpbmcgdXAgaGFuZGxpbmcgb2Yga2V5Ym9hcmQgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIHR5cGVhaGVhZC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IGV2ZW50ICAgdGhlIGtleWRvd24gZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIF90eXBlYWhlYWRLZXlCaW5kaW5ncyhldmVudCkge1xuICBjb25zdCAkdHlwZWFoZWFkID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KENMQVNTX1RZUEVBSEVBRCk7XG4gIGNvbnN0ICRpbnB1dCA9ICR0eXBlYWhlYWQuc2libGluZ3MoQ0xBU1NfSU5QVVQpO1xuXG4gIHJldHVybiBfa2V5Ym9hcmROYXZpZ2F0aW9uKCRpbnB1dCwgJHR5cGVhaGVhZCwgZXZlbnQpO1xufVxuXG4vKipcbiAqIF9oYW5kbGVGb3JtU3VibWlzc2lvbiAtIGhpamFja3MgdGhlIGZvcm0gc3VibWlzc2lvbiBzbyB0aGUgcXVlcnkgc3RyaW5nIGNhbiBiZSB1cmkgZW5jb2RlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGJlaW5nIG1hbnVhbGx5IHJlZGlyZWN0ZWQgdG8gdGhlIHJlc3VsdHMgcGFnZS5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IGV2ZW50ICB0aGUgc3VibWl0IGV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufSAgcHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbi5cbiAqL1xuZnVuY3Rpb24gX2hhbmRsZUZvcm1TdWJtaXNzaW9uKGV2ZW50KSB7XG4gIGNvbnN0ICRmb3JtID0gJChldmVudC50YXJnZXQpO1xuICBjb25zdCAkaW5wdXQgPSAkZm9ybS5maW5kKENMQVNTX0lOUFVUKTtcbiAgY29uc3QgcXVlcnkgPSAkaW5wdXQudmFsKCkudHJpbSgpO1xuICB3aW5kb3cubG9jYXRpb24gPSBgJHskZm9ybS5hdHRyKCdhY3Rpb24nKX0/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YDtcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogX2hhbmRsZVNlYXJjaEZpZWxkRm9jdXNDaGFuZ2UgLSB1cGRhdGUgcHJlc2VudGF0aW9uYWwgZm9jdXMgc3RhdGUgd2hlbiBzZWFyY2ggZmllbGQgZm9jdXMgc3RhdGUgY2hhbmdlc1xuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZXZlbnQgIHRoZSBmb2N1cyBjaGFuZ2UgZXZlbnRzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBfaGFuZGxlU2VhcmNoRmllbGRGb2N1c0NoYW5nZShldmVudCkge1xuICBjb25zdCAkaW5wdXRXcmFwcGVyID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QoQ0xBU1NfV1JBUFBFUik7XG4gIGlmIChldmVudC50eXBlID09PSAnZm9jdXMnKSB7XG4gICAgJGlucHV0V3JhcHBlci5hZGRDbGFzcyhDT05TVEFOVFMuQ0xBU1NFUy5GT0NVU0VEKTtcbiAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAnYmx1cicpIHtcbiAgICAkaW5wdXRXcmFwcGVyLnJlbW92ZUNsYXNzKENPTlNUQU5UUy5DTEFTU0VTLkZPQ1VTRUQpO1xuICB9XG59XG5cbi8qKlxuICogX2Nsb3NlVHlwZWFoZWFkT25CbHVyIC0gZGlzbWlzcyBhbGwgdHlwZWFoZWFkcyB3aGVuIGNsaWNrIG91dCBvZiB0aGUgc2VhcmNoIGlucHV0XG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gIGRvIG5vdCBwcmV2ZW50IHByb3BhZ2F0aW9uLlxuICovXG5mdW5jdGlvbiBfY2xvc2VUeXBlYWhlYWRPbkJsdXIoZXZlbnQpIHtcbiAgY29uc3QgY2xpY2tlZE91dHNpZGVTZWFyY2hGb3JtID0gISQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KENMQVNTX1dSQVBQRVIpLmxlbmd0aDtcblxuICBpZiAoY2xpY2tlZE91dHNpZGVTZWFyY2hGb3JtKSB7XG4gICAgJChgJHtDTEFTU19JTlBVVH1bZGF0YS10eXBlYWhlYWQ9dHJ1ZV1gKS5lYWNoKCgkZWxlbWVudCkgPT4ge1xuICAgICAgX2NsZWFyVHlwZWFoZWFkKCQoJGVsZW1lbnQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIF9pbml0VHlwZWFoZWFkIC0gc2V0IHVwIHZhcmlvdXMgZXZlbnQgYmluZGluZ3MgdG8gY29udHJvbCB0aGUgdHlwZWFoZWFkLlxuICovXG5mdW5jdGlvbiBfaW5pdFR5cGVhaGVhZCgpIHtcbiAgJChkb2N1bWVudClcbiAgICAvLyBiaW5kIHRvIGtleSBldmVudHMgb24gdGhlIGlucHV0cy5cbiAgICAub24oJ2lucHV0JywgYCR7Q0xBU1NfSU5QVVR9W2RhdGEtdHlwZWFoZWFkPXRydWVdYCwgZGVib3VuY2UoX2lucHV0S2V5QmluZGluZ3MsIEFVVE9fU1VHR0VTVF9ERUJPVU5DRV9XQUlUKSlcbiAgICAub24oJ2tleWRvd24nLCBgJHtDTEFTU19JTlBVVH1bZGF0YS10eXBlYWhlYWQ9dHJ1ZV1gLCBfaW5wdXROYXZCaW5kaW5ncylcbiAgICAub24oJ2ludGVybmFsLXNlYXJjaCcsIGAke0NMQVNTX0lOUFVUfVtkYXRhLXR5cGVhaGVhZD10cnVlXWAsIChlKSA9PiB7XG4gICAgICBfY2xlYXJUeXBlYWhlYWQoJChlLnRhcmdldCkpO1xuICAgIH0pXG5cbiAgICAvLyBiaW5kIGtleSBldmVudHMgdG8gdGhlIHR5cGVhaGVhZCBhbmNob3JzLlxuICAgIC5vbigna2V5ZG93bicsIGAke0NMQVNTX1RZUEVBSEVBRH0gYWAsIF90eXBlYWhlYWRLZXlCaW5kaW5ncylcbiAgICAub24oJ2NsaWNrJywgX2Nsb3NlVHlwZWFoZWFkT25CbHVyKTtcbn1cblxuLyoqXG4gKiBfYmluZEV2ZW50cyAtIGJpbmQgc2VhcmNoIGZvcm0gZXZlbnRzXG4gKlxuICogTm90ZTogdGhpcyBtZXRob2Qgc3VwcG9ydHMgaGFuZGxpbmcgcGVyIGluZGl2aWR1YWwgc2VhcmNoIGZvcm0gY29tcG9uZW50IGluc3RhbmNlc1xuICovXG5mdW5jdGlvbiBfYmluZEV2ZW50cygpIHtcbiAgJChDTEFTU19JTlBVVCkub24oJ2JsdXIgZm9jdXMnLCBfaGFuZGxlU2VhcmNoRmllbGRGb2N1c0NoYW5nZSk7XG5cbiAgLy8gVE9ETzogcHJvYmFibHkgbmVlZCB0byBtb3ZlICdJU19SRVNVTFRTX1BBR0UnIGZsYWcgaW50byBBRU0gYXMgY29tcG9uZW50IGNvbmZpZ1xuICBpZiAoIUlTX1JFU1VMVFNfUEFHRSkge1xuICAgIC8vIHN1Ym1pdCBzZWFyY2ggZm9ybSBvbmx5IGlmIG5vdCBhbHJlYWR5IG9uIHNlYXJjaCByZXN1bHRzIHBhZ2VcbiAgICAkKGRvY3VtZW50KS5vbignc3VibWl0JywgJy5zZWFyY2gtZm9ybScsIF9oYW5kbGVGb3JtU3VibWlzc2lvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBfb3BlbkRyYXdlciAtIG9wZW5zIHVwIHRoZSBzZWFyY2ggZHJhd2VyLlxuICovXG5mdW5jdGlvbiBfb3BlbkRyYXdlcihlKSB7XG4gIGNvbnN0ICRzZWFyY2hXcmFwcGVyID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLmhlYWRlci13cmFwJyk7XG4gIGNvbnN0ICRzZWFyY2hPdmVybGF5ID0gJHNlYXJjaFdyYXBwZXIuZmluZChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9PVkVSTEFZU31gKTtcbiAgY29uc3QgJHNlYXJjaENvbnRhaW5lciA9ICRzZWFyY2hPdmVybGF5LnNpYmxpbmdzKCcuc2VhcmNoLWZvcm0tY29udGFpbmVyJyk7XG4gIGNvbnN0ICRzZWFyY2hpbnB1dCA9ICRzZWFyY2hDb250YWluZXIuZmluZChDTEFTU19JTlBVVCk7XG5cbiAgJHNlYXJjaENvbnRhaW5lci5hZGRDbGFzcyhDTEFTU19EUkFXRVJfT1BFTik7XG4gICRzZWFyY2hpbnB1dC5mb2N1cygpO1xuICAkc2VhcmNoT3ZlcmxheS5hZGRDbGFzcyhDTEFTU19EUkFXRVJfT1BFTik7XG4gICRib2R5LmFkZENsYXNzKENMQVNTX05PX1NDUk9MTCk7XG4gICQoYC4ke0NMQVNTX0NUQV9TRUFSQ0hfT1BFTn1gKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gIHNldFJlc3RyaWN0Rm9jdXMoJ3NlYXJjaGJhcicsICRzZWFyY2hDb250YWluZXIpO1xufVxuXG4vKipcbiAqIF9jbG9zZURyYXdlciAtIGNsb3NlIHRoZSBzZWFyY2ggZHJhd2VyXG4gKi9cbmZ1bmN0aW9uIF9jbG9zZURyYXdlcihlKSB7XG4gIGNvbnN0ICRzZWFyY2hXcmFwcGVyID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLmhlYWRlci13cmFwJyk7XG4gIGNvbnN0ICRzZWFyY2hPdmVybGF5ID0gJHNlYXJjaFdyYXBwZXIuZmluZChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9PVkVSTEFZU31gKTtcbiAgY29uc3QgJHNlYXJjaENvbnRhaW5lciA9ICRzZWFyY2hPdmVybGF5LnNpYmxpbmdzKCcuc2VhcmNoLWZvcm0tY29udGFpbmVyJyk7XG4gIGNvbnN0ICRzZWFyY2hPcGVuQnV0dG9uID0gJHNlYXJjaFdyYXBwZXIuZmluZCgnLmN0YS1zZWFyY2gtZm9ybS1vcGVuJyk7XG5cbiAgJHNlYXJjaENvbnRhaW5lci5yZW1vdmVDbGFzcyhDTEFTU19EUkFXRVJfT1BFTik7XG4gICRzZWFyY2hPcGVuQnV0dG9uLmZvY3VzKCk7XG4gICRzZWFyY2hPdmVybGF5LnJlbW92ZUNsYXNzKENMQVNTX0RSQVdFUl9PUEVOKTtcbiAgJGJvZHkucmVtb3ZlQ2xhc3MoQ0xBU1NfTk9fU0NST0xMKTtcbiAgJChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9PUEVOfWApLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSk7XG4gIHVuc2V0UmVzdHJpY3RGb2N1cygnc2VhcmNoYmFyJywgJHNlYXJjaENvbnRhaW5lcik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBfaW5pdERyYXdlciAtIHNldCB1cCB2YXJpb3VzIGJpbmRpbmdzIHRvIGNvbnRyb2wgdGhlIHNlYXJjaCBkcmF3ZXIuXG4gKlxuICogTm90ZTogdGhpcyBtZXRob2QgYXNzdW1lcyB0aGVyZSdzIG9ubHkgb25lIGluc3RhbmNlIG9mIHNlYXJjaCBmb3JtIGNvbXBvbmVudCB0aGF0J3MgY291cGxlZCB3aXRoIHRvcCBuYXZcbiAqL1xuZnVuY3Rpb24gX2luaXREcmF3ZXIoKSB7XG4gIC8vIGlmIHlvdSBjbGljayBvbiB0aGUgc2VhcmNoIGJ1dHRvbiwgb3BlbiB0aGUgc2VhcmNoIG1vZGFsLlxuICAkKGAuJHtDTEFTU19DVEFfU0VBUkNIX09QRU59YCkub24oJ2NsaWNrJywgKGUpID0+IF9vcGVuRHJhd2VyKGUpKTtcbiAgJChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9DTE9TRX1gKS5vbignY2xpY2snLCAoZSkgPT4gX2Nsb3NlRHJhd2VyKGUpKTtcbiAgJChgLiR7Q0xBU1NfQ1RBX1NFQVJDSF9PVkVSTEFZU31gKS5vbignY2xpY2snLCAoZSkgPT4gX2Nsb3NlRHJhd2VyKGUpKTtcbn1cblxuZnVuY3Rpb24gX3ByZXBJbnN0YW5jZXNBbmREYXRhKCkge1xuICBjb25zdCAkYWxsU2VhcmNoSW5wdXRzID0gJChDTEFTU19JTlBVVCk7XG5cbiAgLy8gUG9wdWxhdGUgaW5zdGFuY2UgbGV2ZWwgZ2xvYmFsIGRhdGEgYXJyYXkgZm9yIGFsbCBpbnN0YW5jZXNcbiAgJGFsbFNlYXJjaElucHV0cy5lYWNoKChpZHgsIGVsZSkgPT4ge1xuICAgIGNvbnN0ICRpbnB1dCA9ICQoZWxlKTtcbiAgICBjb25zdCBpbnN0YW5jZUlkID0gaWR4ICsgMTtcbiAgICBjb25zdCBhdXRvU3VnZ2VzdEVuZHBvaW50ID0gJGlucHV0LmF0dHIoJ2RhdGEtYXBpLWJhc2UnKSB8fCAnJztcbiAgICBjb25zdCBpbnN0YW5jZURhdGEgPSB7XG4gICAgICBpZDogaW5zdGFuY2VJZCxcbiAgICAgIGF1dG9TdWdnZXN0RW5kcG9pbnQsXG4gICAgICBhdXRvU3VnZ2VzdFByb21pc2U6IG51bGwsXG4gICAgICBhdXRvU3VnZ2VzdERhdGE6IG51bGwsXG4gICAgfTtcblxuICAgIC8vIHVwZGF0ZSBnbG9iYWwgaW5zdGFuY2VzIGRhdGEgbGlzdFxuICAgIF9pbnN0YW5jZXNEYXRhLnB1c2goaW5zdGFuY2VEYXRhKTtcblxuICAgIC8vIHVwZGF0ZSBpbnN0YW5jZSBpZCB0byB2aWV3XG4gICAgY29uc3QgYXV0b1N1Z2dlc3RMaXN0SWQgPSBgc2VhcmNoLWZvcm0tYXV0by1zdWdnZXN0aW9ucy0ke2luc3RhbmNlSWR9YDtcbiAgICBjb25zdCAkYXV0b1N1Z2dlc3RMaXN0ID0gJGlucHV0LmNsb3Nlc3QoQ0xBU1NfV1JBUFBFUikuZmluZChgJHtDTEFTU19UWVBFQUhFQUR9ID4gdWxgKTtcbiAgICAkaW5wdXRcbiAgICAgIC5hdHRyKHtcbiAgICAgICAgJ2RhdGEtaW5zdGFuY2UtaWQnOiBpbnN0YW5jZUlkLFxuICAgICAgICAnYXJpYS1vd25zJzogYXV0b1N1Z2dlc3RMaXN0SWQsXG4gICAgICB9KTtcbiAgICAkYXV0b1N1Z2dlc3RMaXN0LmF0dHIoJ2lkJywgYXV0b1N1Z2dlc3RMaXN0SWQpO1xuXG4gICAgLy8gY2hlY2sgYXV0byBzdWdnZXN0IHBvb2wgZW5kcG9pbnRcbiAgICBpZiAoIWF1dG9TdWdnZXN0RW5kcG9pbnQubGVuZ3RoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTRl0nLCAnSW52YWxpZCBhdXRvIHN1Z2dlc3QgZGF0YSBlbmRwb2ludCBmb3IgaW5zdGFuY2U6JywgaW5zdGFuY2VJZCwgYXV0b1N1Z2dlc3RFbmRwb2ludCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgY3VycmVudCBpbnN0YW5jZSdzIGVuZHBvaW50IGlzIHRoZSBzYW1lIGFzIHByZXZpb3VzIG9uZSB0byBzYXZlIHVubmVjZXNzYXJ5IHJlbW90ZSBjYWxsc1xuICAgIGZvciAobGV0IGkgPSBpZHg7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzSW5zdGFuY2VJbmRleCA9IGlkeCAtIDE7XG4gICAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlRGF0YSA9IF9pbnN0YW5jZXNEYXRhW3ByZXZpb3VzSW5zdGFuY2VJbmRleF0gfHwge307XG4gICAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlQXV0b1N1Z2dlc3RFbmRwb2ludCA9IHByZXZpb3VzSW5zdGFuY2VEYXRhLmF1dG9TdWdnZXN0RW5kcG9pbnQ7XG4gICAgICBpZiAoYXV0b1N1Z2dlc3RFbmRwb2ludC5sZW5ndGggJiYgYXV0b1N1Z2dlc3RFbmRwb2ludCA9PT0gcHJldmlvdXNJbnN0YW5jZUF1dG9TdWdnZXN0RW5kcG9pbnQpIHtcbiAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHByZXZpb3VzIGF1dG8gc3VnZ2VzdCByZXF1ZXN0IHByb21pc2UgaWYgZW5kcG9pbnQgbWF0Y2hlc1xuICAgICAgICBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3RQcm9taXNlID0gcHJldmlvdXNJbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3RQcm9taXNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIG5vIHNhbWUgZW5kcG9pbnQgcmVxdWVzdCBmb3VuZCBmcm9tIG90aGVyIGluc3RhbmNlcywgY3JlYXRlIG5ld1xuICAgIGlmIChpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3RQcm9taXNlID09PSBudWxsKSB7XG4gICAgICBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3RQcm9taXNlID0gJC5nZXQoYXV0b1N1Z2dlc3RFbmRwb2ludCk7XG4gICAgfVxuXG4gICAgLy8gcmV0cmlldmUgYmFzaWMgYXV0byBzdWdnZXN0IHJlc3VsdHMgcG9vbCBkYXRhXG4gICAgaW5zdGFuY2VEYXRhLmF1dG9TdWdnZXN0UHJvbWlzZVxuICAgICAgLmRvbmUoKGRhdGFTdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1NGXScsICdJbnZhbGlkIGF1dG8gc3VnZ2VzdCBkYXRhIHN0cmluZzonLCBpbnN0YW5jZUlkLCBkYXRhU3RyaW5nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RlOiBTJlAgYXV0byBjb21wbGV0ZSBkYXRhIHNvdXJjZSByZXR1cm5zIGluIGRlcHJlY2F0ZWQgSlNPTlAgc3RyaW5nIGZvcm1hdCxcbiAgICAgICAgLy8gbmVlZCBjbGVhbi11cCBiZWZvcmUgcGFyc2UgaXRcbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IGRhdGFTdHJpbmcudHJpbSgpLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3REYXRhID0gSlNPTi5wYXJzZShqc29uU3RyaW5nLnRyaW0oKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpbnN0YW5jZURhdGEuYXV0b1N1Z2dlc3REYXRhID0gbnVsbDtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tTRl0nLCAnSW52YWxpZCBhdXRvIHN1Z2dlc3QgSlNPTiBzdHJpbmc6JywgaW5zdGFuY2VJZCwganNvblN0cmluZywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmFpbCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NGXScsICdFcnJvciBnZXR0aW5nIGF1dG8gc3VnZ2VzdCByZXN1bHRzIHBvb2wgZGF0YScsIGluc3RhbmNlSWQpO1xuICAgICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbml0KCkge1xuICBfYmluZEV2ZW50cygpO1xuICBfaW5pdERyYXdlcigpO1xuXG4gIC8vIHVwZGF0ZSBpbmRpdmlkdWFsIGluc3RhbmNlIGVsZW1lbnQgRE9NIGFuZCBwcmVwIGluc3RhbmNlIGRhdGFcbiAgLy8gdGhpcyB3aWxsIGdldCAnX2luc3RhbmNlc0RhdGEnIGxpc3QgcmVhZHlcbiAgX3ByZXBJbnN0YW5jZXNBbmREYXRhKCk7XG5cbiAgLy8gb25seSBpbml0IHR5cGUgYWhlYWQgd2hlbiBhbGwgaW5zdGFuY2VzIGhhdmUgcmVzb2x2ZSB0aGVpciByZW1vdGUgcmVxdWVzdHNcbiAgY29uc3QgYWxsSW5zdGFuY2VzUHJvbWlzZXMgPSBbXTtcbiAgX2luc3RhbmNlc0RhdGEuZm9yRWFjaCgoaW5zdGFuY2VEYXRhKSA9PiB7XG4gICAgaWYgKGluc3RhbmNlRGF0YS5hdXRvU3VnZ2VzdFByb21pc2UgIT09IG51bGwpIHtcbiAgICAgIGFsbEluc3RhbmNlc1Byb21pc2VzLnB1c2goaW5zdGFuY2VEYXRhLmF1dG9TdWdnZXN0UHJvbWlzZSk7XG4gICAgfVxuICB9KTtcbiAgJC53aGVuKC4uLmFsbEluc3RhbmNlc1Byb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICBfaW5pdFR5cGVhaGVhZCgpO1xuICB9KTtcbn1cblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBpbml0KCk7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceURL=webpack-internal:///7876
#7 JavaScript::Eval (size: 12886) - SHA256: 3e5508554bd1bac40a9b62f5196a655a8f8e665f9c99833f4da6820749fa0351
// EXTERNAL MODULE: ./node_modules/picturefill/dist/picturefill.js
var picturefill = __webpack_require__(7229);; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/polyfills/objectFit.js
/* eslint-disable no-undef */
function objectFit() {
    // Constants
    var CLASS_OBJECT_FIT = 'js-object-fit';
    /**
     * _parseSourceset($context)
     *
     * @param {jQuery} $source   - source item as jquery object
     * @return {string} source - best path available in the srcset for the current source item
     */

    function _parseSourceset($source) {
            var source = false;

            if (window.matchMedia($source.attr('media')).matches) {
                var srcset = $source.attr('srcset');
                var regEx = new RegExp(' [0-9]+w$');
                source = srcset.replace(regEx, '');
            }

            return source;
        }
        /**
         * retrieveSource($img, isPicture)
         *
         * @param {jQuery} $img       - current image with the class js-object-it
         * @param {boolean} isPicture  - if the image is inside a picture tag or not
         * @return {String}            - the best available source for the current image
         */


    function _retrieveSource($img, isPicture) {
            // if srcset feature is available
            // just return the current source used
            if (Modernizr.srcset) {
                return $img[0].currentSrc;
            } // if it's a picture tag and the srcset feature does not work
            // parse the source nodes to find the best value possible


            if (isPicture) {
                var $sources = $img.parent().find('source');
                var source = false;
                $sources.each(function() {
                    source = source || _parseSourceset($(this));
                });

                if (source) {
                    return source;
                }
            } // or just return the src attribute from the image tag


            return $img.prop('src');
        }
        /**
         * _init()
         *
         * if you place the class .js-object-fit on an <img> element which uses the object-fit css
         * property, this polyfill will replace the element with a div and use background styles to
         * emulate the appearance. this works within a <picture> element too, as long as the classes are
         * placed on the <img> within it.
         */


    function init() {
        if (Modernizr && Modernizr.objectfit) {
            return;
        }

        $(".".concat(CLASS_OBJECT_FIT)).each(function() {
            var $node = $(this);
            var $img;
            var $picture;
            var isAdaptiveImg = $node.hasClass('adpimg__container');

            if (isAdaptiveImg) {
                // Adaptive image
                $img = $node.find('img');
                $picture = $node.find('picture');
            } else {
                // img tag with js-object-fit
                $img = $node;
                $picture = $node.parent('picture');
            }

            var isPicture = $picture.length;

            var imgCurrentSrc = _retrieveSource($img, isPicture);

            var imgClasses = $img.attr('class');
            var $nodeToReplace = isPicture ? $picture : $img; // create the new dom node.

            var $newNode = $('<div>').css({
                backgroundImage: "url(".concat(imgCurrentSrc, ")")
            }).addClass("".concat(imgClasses, " polyfill-object-fit")).removeClass(CLASS_OBJECT_FIT); // Remove class from adaptive image container

            if (isAdaptiveImg) {
                $node.removeClass(CLASS_OBJECT_FIT);
            } // setup a min-height in case the image is providing the height for it's parent.


            if (isPicture) {
                $newNode.css({
                    minHeight: $img.height(),
                    minWidth: $img.width()
                });
            } // replace the img element.


            $nodeToReplace.replaceWith($newNode);
        });
    }

    return init();
}; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/picture/clientlib/src/js/picture.js
// NOTE: Consider whether this should be integrated with Modernizr


window.addEventListener('load', function() {
    objectFit();
}); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvcG9seWZpbGxzL29iamVjdEZpdC5qcz80NDI1Iiwid2VicGFjazovL2FlbS1jbXMtY29kZS8uL3VpLmFwcHMvc3JjL21haW4vY29udGVudC9qY3Jfcm9vdC9hcHBzL2dsb2JhbC9jb21wb25lbnRzL3BpY3R1cmUvY2xpZW50bGliL3NyYy9qcy9waWN0dXJlLmpzP2M0MmMiXSwibmFtZXMiOlsib2JqZWN0Rml0IiwiQ0xBU1NfT0JKRUNUX0ZJVCIsIl9wYXJzZVNvdXJjZXNldCIsIiRzb3VyY2UiLCJzb3VyY2UiLCJ3aW5kb3ciLCJtYXRjaE1lZGlhIiwiYXR0ciIsIm1hdGNoZXMiLCJzcmNzZXQiLCJyZWdFeCIsIlJlZ0V4cCIsInJlcGxhY2UiLCJfcmV0cmlldmVTb3VyY2UiLCIkaW1nIiwiaXNQaWN0dXJlIiwiTW9kZXJuaXpyIiwiY3VycmVudFNyYyIsIiRzb3VyY2VzIiwicGFyZW50IiwiZmluZCIsImVhY2giLCIkIiwicHJvcCIsImluaXQiLCJvYmplY3RmaXQiLCIkbm9kZSIsIiRwaWN0dXJlIiwiaXNBZGFwdGl2ZUltZyIsImhhc0NsYXNzIiwibGVuZ3RoIiwiaW1nQ3VycmVudFNyYyIsImltZ0NsYXNzZXMiLCIkbm9kZVRvUmVwbGFjZSIsIiRuZXdOb2RlIiwiY3NzIiwiYmFja2dyb3VuZEltYWdlIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsIm1pbkhlaWdodCIsImhlaWdodCIsIm1pbldpZHRoIiwid2lkdGgiLCJyZXBsYWNlV2l0aCIsImFkZEV2ZW50TGlzdGVuZXIiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNPLFNBQVNBLFNBQVQsR0FBcUI7RUFDMUI7RUFDQSxJQUFNQyxnQkFBZ0IsR0FBRyxlQUF6QjtFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFDRSxTQUFTQyxlQUFULENBQXlCQyxPQUF6QixFQUFrQztJQUNoQyxJQUFJQyxNQUFNLEdBQUcsS0FBYjs7SUFFQSxJQUFJQyxNQUFNLENBQUNDLFVBQVAsQ0FBa0JILE9BQU8sQ0FBQ0ksSUFBUixDQUFhLE9BQWIsQ0FBbEIsRUFBeUNDLE9BQTdDLEVBQXNEO01BQ3BELElBQU1DLE1BQU0sR0FBR04sT0FBTyxDQUFDSSxJQUFSLENBQWEsUUFBYixDQUFmO01BQ0EsSUFBTUcsS0FBSyxHQUFHLElBQUlDLE1BQUosQ0FBVyxXQUFYLENBQWQ7TUFDQVAsTUFBTSxHQUFHSyxNQUFNLENBQUNHLE9BQVAsQ0FBZUYsS0FBZixFQUFzQixFQUF0QixDQUFUO0lBQ0Q7O0lBRUQsT0FBT04sTUFBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztFQUNFLFNBQVNTLGVBQVQsQ0FBeUJDLElBQXpCLEVBQStCQyxTQUEvQixFQUEwQztJQUN4QztJQUNBO0lBQ0EsSUFBSUMsU0FBUyxDQUFDUCxNQUFkLEVBQXNCO01BQ3BCLE9BQU9LLElBQUksQ0FBQyxDQUFELENBQUosQ0FBUUcsVUFBZjtJQUNELENBTHVDLENBT3hDO0lBQ0E7OztJQUNBLElBQUlGLFNBQUosRUFBZTtNQUNiLElBQU1HLFFBQVEsR0FBR0osSUFBSSxDQUFDSyxNQUFMLEdBQWNDLElBQWQsQ0FBbUIsUUFBbkIsQ0FBakI7TUFDQSxJQUFJaEIsTUFBTSxHQUFHLEtBQWI7TUFDQWMsUUFBUSxDQUFDRyxJQUFULENBQWMsWUFBWTtRQUN4QmpCLE1BQU0sR0FBR0EsTUFBTSxJQUFJRixlQUFlLENBQUNvQixDQUFDLENBQUMsSUFBRCxDQUFGLENBQWxDO01BQ0QsQ0FGRDs7TUFJQSxJQUFJbEIsTUFBSixFQUFZO1FBQ1YsT0FBT0EsTUFBUDtNQUNEO0lBQ0YsQ0FuQnVDLENBcUJ4Qzs7O0lBQ0EsT0FBT1UsSUFBSSxDQUFDUyxJQUFMLENBQVUsS0FBVixDQUFQO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRSxTQUFTQyxJQUFULEdBQWdCO0lBQ2QsSUFBSVIsU0FBUyxJQUFJQSxTQUFTLENBQUNTLFNBQTNCLEVBQXNDO01BQ3BDO0lBQ0Q7O0lBRURILENBQUMsWUFBS3JCLGdCQUFMLEVBQUQsQ0FBMEJvQixJQUExQixDQUErQixZQUFZO01BQ3pDLElBQU1LLEtBQUssR0FBR0osQ0FBQyxDQUFDLElBQUQsQ0FBZjtNQUNBLElBQUlSLElBQUo7TUFDQSxJQUFJYSxRQUFKO01BRUEsSUFBTUMsYUFBYSxHQUFHRixLQUFLLENBQUNHLFFBQU4sQ0FBZSxtQkFBZixDQUF0Qjs7TUFDQSxJQUFJRCxhQUFKLEVBQW1CO1FBQ2pCO1FBQ0FkLElBQUksR0FBR1ksS0FBSyxDQUFDTixJQUFOLENBQVcsS0FBWCxDQUFQO1FBQ0FPLFFBQVEsR0FBR0QsS0FBSyxDQUFDTixJQUFOLENBQVcsU0FBWCxDQUFYO01BQ0QsQ0FKRCxNQUlPO1FBQ0w7UUFDQU4sSUFBSSxHQUFHWSxLQUFQO1FBQ0FDLFFBQVEsR0FBR0QsS0FBSyxDQUFDUCxNQUFOLENBQWEsU0FBYixDQUFYO01BQ0Q7O01BRUQsSUFBTUosU0FBUyxHQUFHWSxRQUFRLENBQUNHLE1BQTNCOztNQUNBLElBQU1DLGFBQWEsR0FBR2xCLGVBQWUsQ0FBQ0MsSUFBRCxFQUFPQyxTQUFQLENBQXJDOztNQUNBLElBQU1pQixVQUFVLEdBQUdsQixJQUFJLENBQUNQLElBQUwsQ0FBVSxPQUFWLENBQW5CO01BQ0EsSUFBTTBCLGNBQWMsR0FBSWxCLFNBQUQsR0FBY1ksUUFBZCxHQUF5QmIsSUFBaEQsQ0FuQnlDLENBcUJ6Qzs7TUFDQSxJQUFNb0IsUUFBUSxHQUFHWixDQUFDLENBQUMsT0FBRCxDQUFELENBQVdhLEdBQVgsQ0FBZTtRQUFFQyxlQUFlLGdCQUFTTCxhQUFUO01BQWpCLENBQWYsRUFDZE0sUUFEYyxXQUNGTCxVQURFLDJCQUVkTSxXQUZjLENBRUZyQyxnQkFGRSxDQUFqQixDQXRCeUMsQ0EwQnpDOztNQUNBLElBQUkyQixhQUFKLEVBQW1CO1FBQ2pCRixLQUFLLENBQUNZLFdBQU4sQ0FBa0JyQyxnQkFBbEI7TUFDRCxDQTdCd0MsQ0ErQnpDOzs7TUFDQSxJQUFJYyxTQUFKLEVBQWU7UUFDYm1CLFFBQVEsQ0FBQ0MsR0FBVCxDQUFhO1VBQ1hJLFNBQVMsRUFBRXpCLElBQUksQ0FBQzBCLE1BQUwsRUFEQTtVQUVYQyxRQUFRLEVBQUUzQixJQUFJLENBQUM0QixLQUFMO1FBRkMsQ0FBYjtNQUlELENBckN3QyxDQXVDekM7OztNQUNBVCxjQUFjLENBQUNVLFdBQWYsQ0FBMkJULFFBQTNCO0lBQ0QsQ0F6Q0Q7RUEwQ0Q7O0VBRUQsT0FBT1YsSUFBSSxFQUFYO0FBQ0QsQzs7Q0NqSHFCOztBQUN0QjtBQUVBbkIsTUFBTSxDQUFDdUMsZ0JBQVAsQ0FBd0IsTUFBeEIsRUFBZ0MsWUFBTTtFQUNwQzVDLFNBQVM7QUFDVixDQUZEIiwiZmlsZSI6IjU3MDIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdEZpdCgpIHtcbiAgLy8gQ29uc3RhbnRzXG4gIGNvbnN0IENMQVNTX09CSkVDVF9GSVQgPSAnanMtb2JqZWN0LWZpdCc7XG5cbiAgLyoqXG4gICAqIF9wYXJzZVNvdXJjZXNldCgkY29udGV4dClcbiAgICpcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRzb3VyY2UgICAtIHNvdXJjZSBpdGVtIGFzIGpxdWVyeSBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfSBzb3VyY2UgLSBiZXN0IHBhdGggYXZhaWxhYmxlIGluIHRoZSBzcmNzZXQgZm9yIHRoZSBjdXJyZW50IHNvdXJjZSBpdGVtXG4gICAqL1xuICBmdW5jdGlvbiBfcGFyc2VTb3VyY2VzZXQoJHNvdXJjZSkge1xuICAgIGxldCBzb3VyY2UgPSBmYWxzZTtcblxuICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSgkc291cmNlLmF0dHIoJ21lZGlhJykpLm1hdGNoZXMpIHtcbiAgICAgIGNvbnN0IHNyY3NldCA9ICRzb3VyY2UuYXR0cignc3Jjc2V0Jyk7XG4gICAgICBjb25zdCByZWdFeCA9IG5ldyBSZWdFeHAoJyBbMC05XSt3JCcpO1xuICAgICAgc291cmNlID0gc3Jjc2V0LnJlcGxhY2UocmVnRXgsICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHJpZXZlU291cmNlKCRpbWcsIGlzUGljdHVyZSlcbiAgICpcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRpbWcgICAgICAgLSBjdXJyZW50IGltYWdlIHdpdGggdGhlIGNsYXNzIGpzLW9iamVjdC1pdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzUGljdHVyZSAgLSBpZiB0aGUgaW1hZ2UgaXMgaW5zaWRlIGEgcGljdHVyZSB0YWcgb3Igbm90XG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICAgICAtIHRoZSBiZXN0IGF2YWlsYWJsZSBzb3VyY2UgZm9yIHRoZSBjdXJyZW50IGltYWdlXG4gICAqL1xuICBmdW5jdGlvbiBfcmV0cmlldmVTb3VyY2UoJGltZywgaXNQaWN0dXJlKSB7XG4gICAgLy8gaWYgc3Jjc2V0IGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gICAgLy8ganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc291cmNlIHVzZWRcbiAgICBpZiAoTW9kZXJuaXpyLnNyY3NldCkge1xuICAgICAgcmV0dXJuICRpbWdbMF0uY3VycmVudFNyYztcbiAgICB9XG5cbiAgICAvLyBpZiBpdCdzIGEgcGljdHVyZSB0YWcgYW5kIHRoZSBzcmNzZXQgZmVhdHVyZSBkb2VzIG5vdCB3b3JrXG4gICAgLy8gcGFyc2UgdGhlIHNvdXJjZSBub2RlcyB0byBmaW5kIHRoZSBiZXN0IHZhbHVlIHBvc3NpYmxlXG4gICAgaWYgKGlzUGljdHVyZSkge1xuICAgICAgY29uc3QgJHNvdXJjZXMgPSAkaW1nLnBhcmVudCgpLmZpbmQoJ3NvdXJjZScpO1xuICAgICAgbGV0IHNvdXJjZSA9IGZhbHNlO1xuICAgICAgJHNvdXJjZXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNvdXJjZSA9IHNvdXJjZSB8fCBfcGFyc2VTb3VyY2VzZXQoJCh0aGlzKSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG9yIGp1c3QgcmV0dXJuIHRoZSBzcmMgYXR0cmlidXRlIGZyb20gdGhlIGltYWdlIHRhZ1xuICAgIHJldHVybiAkaW1nLnByb3AoJ3NyYycpO1xuICB9XG5cbiAgLyoqXG4gICAqIF9pbml0KClcbiAgICpcbiAgICogaWYgeW91IHBsYWNlIHRoZSBjbGFzcyAuanMtb2JqZWN0LWZpdCBvbiBhbiA8aW1nPiBlbGVtZW50IHdoaWNoIHVzZXMgdGhlIG9iamVjdC1maXQgY3NzXG4gICAqIHByb3BlcnR5LCB0aGlzIHBvbHlmaWxsIHdpbGwgcmVwbGFjZSB0aGUgZWxlbWVudCB3aXRoIGEgZGl2IGFuZCB1c2UgYmFja2dyb3VuZCBzdHlsZXMgdG9cbiAgICogZW11bGF0ZSB0aGUgYXBwZWFyYW5jZS4gdGhpcyB3b3JrcyB3aXRoaW4gYSA8cGljdHVyZT4gZWxlbWVudCB0b28sIGFzIGxvbmcgYXMgdGhlIGNsYXNzZXMgYXJlXG4gICAqIHBsYWNlZCBvbiB0aGUgPGltZz4gd2l0aGluIGl0LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBpZiAoTW9kZXJuaXpyICYmIE1vZGVybml6ci5vYmplY3RmaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAkKGAuJHtDTEFTU19PQkpFQ1RfRklUfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgJG5vZGUgPSAkKHRoaXMpO1xuICAgICAgbGV0ICRpbWc7XG4gICAgICBsZXQgJHBpY3R1cmU7XG5cbiAgICAgIGNvbnN0IGlzQWRhcHRpdmVJbWcgPSAkbm9kZS5oYXNDbGFzcygnYWRwaW1nX19jb250YWluZXInKTtcbiAgICAgIGlmIChpc0FkYXB0aXZlSW1nKSB7XG4gICAgICAgIC8vIEFkYXB0aXZlIGltYWdlXG4gICAgICAgICRpbWcgPSAkbm9kZS5maW5kKCdpbWcnKTtcbiAgICAgICAgJHBpY3R1cmUgPSAkbm9kZS5maW5kKCdwaWN0dXJlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbWcgdGFnIHdpdGgganMtb2JqZWN0LWZpdFxuICAgICAgICAkaW1nID0gJG5vZGU7XG4gICAgICAgICRwaWN0dXJlID0gJG5vZGUucGFyZW50KCdwaWN0dXJlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzUGljdHVyZSA9ICRwaWN0dXJlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGltZ0N1cnJlbnRTcmMgPSBfcmV0cmlldmVTb3VyY2UoJGltZywgaXNQaWN0dXJlKTtcbiAgICAgIGNvbnN0IGltZ0NsYXNzZXMgPSAkaW1nLmF0dHIoJ2NsYXNzJyk7XG4gICAgICBjb25zdCAkbm9kZVRvUmVwbGFjZSA9IChpc1BpY3R1cmUpID8gJHBpY3R1cmUgOiAkaW1nO1xuXG4gICAgICAvLyBjcmVhdGUgdGhlIG5ldyBkb20gbm9kZS5cbiAgICAgIGNvbnN0ICRuZXdOb2RlID0gJCgnPGRpdj4nKS5jc3MoeyBiYWNrZ3JvdW5kSW1hZ2U6IGB1cmwoJHtpbWdDdXJyZW50U3JjfSlgIH0pXG4gICAgICAgIC5hZGRDbGFzcyhgJHtpbWdDbGFzc2VzfSBwb2x5ZmlsbC1vYmplY3QtZml0YClcbiAgICAgICAgLnJlbW92ZUNsYXNzKENMQVNTX09CSkVDVF9GSVQpO1xuXG4gICAgICAvLyBSZW1vdmUgY2xhc3MgZnJvbSBhZGFwdGl2ZSBpbWFnZSBjb250YWluZXJcbiAgICAgIGlmIChpc0FkYXB0aXZlSW1nKSB7XG4gICAgICAgICRub2RlLnJlbW92ZUNsYXNzKENMQVNTX09CSkVDVF9GSVQpO1xuICAgICAgfVxuXG4gICAgICAvLyBzZXR1cCBhIG1pbi1oZWlnaHQgaW4gY2FzZSB0aGUgaW1hZ2UgaXMgcHJvdmlkaW5nIHRoZSBoZWlnaHQgZm9yIGl0J3MgcGFyZW50LlxuICAgICAgaWYgKGlzUGljdHVyZSkge1xuICAgICAgICAkbmV3Tm9kZS5jc3Moe1xuICAgICAgICAgIG1pbkhlaWdodDogJGltZy5oZWlnaHQoKSxcbiAgICAgICAgICBtaW5XaWR0aDogJGltZy53aWR0aCgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVwbGFjZSB0aGUgaW1nIGVsZW1lbnQuXG4gICAgICAkbm9kZVRvUmVwbGFjZS5yZXBsYWNlV2l0aCgkbmV3Tm9kZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gaW5pdCgpO1xufVxuIiwiaW1wb3J0ICdwaWN0dXJlZmlsbCc7IC8vIE5PVEU6IENvbnNpZGVyIHdoZXRoZXIgdGhpcyBzaG91bGQgYmUgaW50ZWdyYXRlZCB3aXRoIE1vZGVybml6clxuaW1wb3J0IHsgb2JqZWN0Rml0IH0gZnJvbSAnUG9seWZpbGxzL29iamVjdEZpdCc7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICBvYmplY3RGaXQoKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
//# sourceURL=webpack-internal:///5702
#8 JavaScript::Eval (size: 44) - SHA256: 0d708b038e7d2060f7a04801b1e7b4c4d6b6a7114a0ffcec2e821088a5048d18
_satellite.setCookie("sat_track", "true");
#9 JavaScript::Eval (size: 775) - SHA256: f8f2cda796a4a03274cd5dd930e6384ee7d1b379aea44bc84d458ccc70b38b93
if (true) {
    module.exports = __webpack_require__(53);
} else {}
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzPzQwMjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsSUFBSSxJQUFxQztBQUN6QyxFQUFFLHdDQUE2RDtBQUMvRCxDQUFDLE1BQU0sRUFFTiIsImZpbGUiOiIzODQwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceURL=webpack-internal:///3840
#10 JavaScript::Eval (size: 106970) - SHA256: 52a0f65b575e97733cf1c7ce4daa2f31d11c0bf95b28be068a4dbfb37ba72575
; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/restrictFocus.js
function set(namespace, $container) {
    var eventType = 'focusin.' + namespace;
    $container.attr('tabindex', '0');
    $(document).on(eventType, function(event) {
        if (!$container[0].contains(event.target)) {
            event.stopPropagation();
            $container.focus();
        }
    });
}

function unset(namespace, $container) {
    var eventType = 'focusin.' + namespace;
    $container.attr('tabindex', '-1');
    $(document).off(eventType);
}; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/variables/constants.js
var CONSTANTS = {
    HASH_CHAR_LIMIT: 50,
    CLASSES: {
        HIDDEN: 'is-hidden',
        ACTIVE: 'is-active',
        CURRENT: 'is-current',
        FOCUSED: 'is-focused',
        ERROR: 'is-error',
        OPEN: 'is-open',
        DISABLED: 'is-disabled',
        HAS_ERROR: 'has-error'
    },
    KEYBOARD: {
        BACKSPACE: 8,
        TAB: 9,
        ENTER: 13,
        ESCAPE: 27,
        LEFT: 37,
        UP: 38,
        RIGHT: 39,
        DOWN: 40,
        DELETE: 46,
        FORWARD_SLASH: 191
    },
    ATTRIBUTES: {
        DISABLED: 'disabled',
        READONLY: 'readonly',
        REQUIRED: 'required',
        MAX: 'max',
        MIN: 'min'
    },
    BREAKPOINTS: {
        XSM: 0,
        SM: 480,
        MD: 680,
        LG: 970,
        XL: 1170,
        XXL: 1600
    }
};; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/isMq.js


var mq = {
    xsm: 0,
    sm: 480,
    md: 680,
    lg: 970,
    xl: 1170,
    xxl: 1600
};

function isMq(min) {
    return window.matchMedia("(min-width: ".concat(mq[min], "px)"));
}

function isBetween(min, max) {
        return window.matchMedia("(min-width: ".concat(mq[min], "px) and (max-width: ").concat(mq[max] - 1, "px)"));
    } // example of how to use above
    // Ref: https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Testing_media_queries
    // apAEM.HELPERS.isMq('lg').addListener(function(){
    //     if (apAEM.HELPERS.isMq('lg').matches) {
    //         console.log('matches');
    //     } else {
    //         console.log('does not match');
    //     }
    // });
    // apAEM.HELPERS.isBetween('lg', 'xl').addListener(function(){
    //     if (apAEM.HELPERS.isBetween('lg', 'xl').matches) {
    //         console.log('matches');
    //     } else {
    //         console.log('does not match');
    //     }
    // });
; // CONCATENATED MODULE: ./ui.frontend/src/main/global/js/helpers/scrollTo.js

/**
 * scrollToTarget - scroll page to a position or a target element
 *
 * @param  {Object|Number} target        target to scroll page to, either be a scroll position or an jQuery object
 * @param  {Object} shouldScrollFromTop  whether should start scrolling from page top
 * @return {void}
 */

var scrollToTarget = function scrollToTarget(target) {
    var shouldScrollFromTop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
    var speed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
    var offset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
    var ATTR_SCROLLING = 'data-is-scrolling';
    var $body = $('body');
    var isScrolling = $body.attr(ATTR_SCROLLING) === 'true';

    if (isScrolling) {
        return false;
    } // check target type and determine target scroll position


    var targetPosition;
    var $target = $(target[0]);

    if (typeof $target === 'number') {
        targetPosition = Math.round(Math.abs($target));
    } else {
        var targetPositionNum = _getTargetScrollPosition($target);

        if (targetPositionNum) {
            targetPosition = targetPositionNum;
        } else {
            targetPosition = 0;
        }
    } // set page scroll to top


    var $page = $('html, body');

    if (shouldScrollFromTop) {
        $page.scrollTop(0);

        if (targetPosition === 0) {
            return false;
        }
    } // animate page scroll position


    $body.attr(ATTR_SCROLLING, 'true');
    $page.animate({
        scrollTop: targetPosition + offset
    }, speed, function() {
        $body.removeAttr(ATTR_SCROLLING);
    });
};
/**
 * _getTargetScrollPosition - returns target element's scroll position
 *
 * @param  {Object} $target  jQuery object of target to scroll page to
 * @return {number}
 */

var _getTargetScrollPosition = function _getTargetScrollPosition($target) {
    if (!$target || !$target.length) {
        return null;
    }

    var $subnav = $('.subnav[data-sticky-subnav="true"]');
    var $globalHeader = $('.global-header#header');
    var isMqLG = isMq('lg').matches;
    var adjustment = 0;

    if (isMqLG && $subnav.length) {
        adjustment = $subnav.height();
    } else if (!isMqLG && $globalHeader.length) {
        adjustment = $globalHeader.height();
    }

    return $($target[0]).offset().top - adjustment;
};; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/auspost/header-corporate/clientlib/src/js/import/nav.js


// analytics and satellite should be defined globally

analytics = analytics || {};
_satellite = _satellite || {};
analytics.component = analytics.component || {};
analytics.component.link = analytics.component.link || {};

_satellite.track = _satellite.track || function() {
    console.warn('_satellite.track is not defined');
};

var UUID_PREFIX = 'MM';
var CLASS_HEADER = '.global-header, .global-header-old';
var CLASS_PRIMARY_NAV = 'primary-nav';
var CLASS_MICROSITE_NAV = 'main-nav';
var CLASS_MICROSITE_NAV_LOGO_LINK = 'main-nav-logo-link';
var CLASS_PRIMARY_CONTAINER = 'pn-container';
var CLASS_PRIMARY_LIST = 'pn-list';
var CLASS_PRIMARY_ITEM = 'pn-item';
var CLASS_PRIMARY_LINK = 'pn-link';
var CLASS_PRIMARY_LOGIN_ITEM = 'pn-login';
var CLASS_PRIMARY_LINK_EXPANDABLE = 'pn-link--expandable';
var CLASS_PRIMARY_LINK_EXPANDABLE_LOCKED = 'pn-link--expandable-locked';
var CLASS_PRIMARY_TOOLS_LIST_CONTAINER = 'pn-tools-list-container';
var CLASS_PRIMARY_TOOLS_LIST = 'pn-link--tools';
var CLASS_PRIMARY_UTILITY_LIST_CONTAINER = 'pn-utility-list-container';
var CLASS_PRIMARY_UTILITY_LIST = 'pn-link--utility';
var CLASS_PRIMARY_TOGGLE = 'js-pn-toggle';
var CLASS_PRIMARY_TRIGGER_OPEN = 'pn-trigger-open';
var CLASS_PRIMARY_TRIGGER_CLOSE = 'js-pn-trigger-close-mobile';
var CLASS_SUBNAV_CONTAINER = 'sub-pn';
var CLASS_SUBNAV_EXPANDABLE = 'sub-pn--expandable';
var CLASS_SUBNAV_LIST = 'sub-pn-list';
var CLASS_SUBNAV_LINK = 'sub-pn-link';
var CLASS_OPEN = 'is-open';
var CLASS_ACTIVE = 'is-active';
var CLASS_TRANSITIONING = 'is-transitioning';
var CLASS_CLOSING = 'is-closing';
var CLASS_HOVER = 'is-hover';
var CLASS_FOCUS = 'is-focused';
var CLASS_NO_SCROLL = 'no-scroll';
var CLASS_HAS_CHILDREN = 'has-children';
var CLASS_BACK_TO_PARENT = 'cta-back-to-parent';
var TIME_SLIDE = 500;
var TIME_EXPANDABLE = 300;
var $body = $('body');
var $header = $(CLASS_HEADER);
var $primaryNav = $(".".concat(CLASS_PRIMARY_NAV));
var $nav = $(".".concat(CLASS_PRIMARY_CONTAINER));
var $micrositeNav = $(".".concat(CLASS_MICROSITE_NAV));
var $micrositeNavLogoLink = $(".".concat(CLASS_MICROSITE_NAV_LOGO_LINK));
var $toolsList = $(".".concat(CLASS_PRIMARY_TOOLS_LIST_CONTAINER));
var $toolsListItem = $(".".concat(CLASS_PRIMARY_TOOLS_LIST));
var $utilityList = $(".".concat(CLASS_PRIMARY_UTILITY_LIST_CONTAINER));
var $trigger = $(".".concat(CLASS_PRIMARY_TOGGLE));
var $triggerOpen = $(".".concat(CLASS_PRIMARY_TRIGGER_OPEN));
var $hasChildren = $(".".concat(CLASS_HAS_CHILDREN));
var $backToParent = $(".".concat(CLASS_BACK_TO_PARENT));
var $childlessLinks = $(".".concat(CLASS_PRIMARY_LINK)).not(".".concat(CLASS_HAS_CHILDREN));
var $expandables = $("\n    .".concat(CLASS_SUBNAV_CONTAINER, ",\n    .").concat(CLASS_SUBNAV_EXPANDABLE, ",\n    .").concat(CLASS_PRIMARY_LINK_EXPANDABLE, ",\n    .").concat(CLASS_SUBNAV_LINK, ".").concat(CLASS_HAS_CHILDREN, "\n  "));
var isMobile;
/**
 * track - analytics for mobile and desktop navs
 *
 * @param   {HTMLElement} el   the trackable element.
 * @returns {void}
 */

function _track(el) {
        analytics.component.link.type = isMobile ? 'mobile nav' : 'desktop nav';
        analytics.component.link.category = el.dataset.category;
        analytics.component.link.description = el.dataset.description;

        _satellite.track('main-navigation');
    }
    /**
     * unHideMobileNavFromSC - un-hides the mobile nav from screen readers
     *
     * @returns {void}
     */


function _unHideMobileNavFromSC() {
        $nav.find(':focusable').removeAttr('tabindex aria-hidden');
    }
    /**
     * hideMobileNavFromSC - hides the mobile nav from screen readers
     *
     * @returns {void}
     */


function _hideMobileNavFromSC() {
        $nav.find(':focusable').attr({
            tabindex: '-1',
            'aria-hidden': 'true'
        });
    }
    /**
     * _unHideMicrositeMobileNavFromSC - un-hides the microsite
     * mobile nav from screen readers
     *
     * @returns {void}
     */


function _unHideMicrositeMobileNavFromSC() {
        $micrositeNavLogoLink.removeAttr('tabindex aria-hidden');
        $micrositeNav.find(':focusable').removeAttr('tabindex aria-hidden');
    }
    /**
     * _hideMicrositeMobileNavFromSC - hides the microsite
     * mobile nav from screen readers
     *
     * @returns {void}
     */


function _hideMicrositeMobileNavFromSC() {
        $micrositeNavLogoLink.attr({
            tabindex: '-1',
            'aria-hidden': 'true'
        });
        $micrositeNav.find(':focusable').attr({
            tabindex: '-1',
            'aria-hidden': 'true'
        });
    }
    /**
     * _toolsAndUtilityMenuHide - Hide Tools list and Utility list sub menus
     *
     * @returns {void}
     */


function _toolsAndUtilityMenuHide() {
        // For mobile menu Tools list and Utility list are always expanded
        $toolsList.attr({
            'aria-hidden': 'true',
            'aria-expanded': 'false'
        });
        $utilityList.attr({
            'aria-hidden': 'true',
            'aria-expanded': 'false'
        });
    }
    /**
     * _toolsAndUtilityMenuShow - Show Tools list and Utility list sub menus
     *
     * @returns {void}
     */


function _toolsAndUtilityMenuShow() {
        // For mobile menu Tools list and Utility list are always expanded
        $toolsList.attr({
            'aria-hidden': 'false'
        }); // On desktop aria-expanded is set by a trigger on mouse over

        $toolsList.removeAttr('aria-expanded');
        $utilityList.attr({
            'aria-hidden': 'false'
        }); // On desktop aria-expanded is not required for utility list

        $utilityList.removeAttr('aria-expanded');
    }
    /**
     * _subNavControlOff - removes the event handler for subnav menus
     *
     * @returns {void}
     */


function _subNavControlOff() {
        $hasChildren.off('click.subNavTrigger');

        _unHideMicrositeMobileNavFromSC(); // The tools menu is shared by both desktop and mobile unlike
        // other menu items. In desktop view, the links in tools
        // should not have tabindex=-1


        $toolsListItem.each(function(i, toolsListItem) {
            $(toolsListItem).removeAttr('tabindex');
        });

        _unHideMobileNavFromSC();

        _toolsAndUtilityMenuHide();
    }
    /**
     * _subNavControlOn - adds the event handler for subnav menus
     *
     * @returns {void}
     */


function _subNavControlOn() {
        // Megamenu adds a sub-pn class when breakpoint > 970px
        // Remove this when the mobile nav is enabled
        $childlessLinks.removeClass(CLASS_SUBNAV_CONTAINER);

        _hideMicrositeMobileNavFromSC();

        _toolsAndUtilityMenuShow();

        _hideMobileNavFromSC(); // Event listener for elements with the class name 'has-children'


        $hasChildren.on('click.subNavTrigger', function(e) {
            // Prevent accordion behaviour on platform variants so accordion trigger acts like an anchor link.
            if ($(e.currentTarget).hasClass(CLASS_PRIMARY_LINK_EXPANDABLE_LOCKED)) {
                return;
            }

            e.preventDefault();
            var $this = $(this);
            var $subNav = $this.next(".".concat(CLASS_SUBNAV_CONTAINER));
            var $parent = $this.parents(".".concat(CLASS_SUBNAV_CONTAINER)); // These menus are positioned inside divs that have to be relative
            // positioned to the accordion to work, so we need to set the top property on the
            // first level subnav to be the distance to the top of the viewport.
            // Each child will inherit the relative position, so we don't want to update those

            if ($parent.length === 1) {
                var rect = $parent[0].getBoundingClientRect();
                var posTop = rect.top + $primaryNav.scrollTop();
                $subNav.css({
                    top: "-".concat(posTop, "px")
                });
            }

            if ($parent.length > 0) {
                // Set the submenu to be the height of the container
                var scrollHeight = $primaryNav.prop('scrollHeight');
                $subNav.css({
                    height: "".concat(scrollHeight, "px")
                });
            } // Add the 'is-transitioning' class


            _addTransitioningState($subNav); // If the nav is currently open, close it


            if ($this.hasClass(CLASS_OPEN)) {
                _toggleOpeningState($this, $subNav); // Timer to remove the 'is-closing' class


                setTimeout(function() {
                    // DTN-1565: Don't set aria-expanded for tools and utility menu in mobile view
                    // since they have no collapse and expand
                    if (!($this.hasClass(CLASS_PRIMARY_TOOLS_LIST) || $this.hasClass(CLASS_PRIMARY_UTILITY_LIST))) {
                        $this.removeClass(CLASS_CLOSING);

                        if (!$this.hasClass(CLASS_SUBNAV_LINK)) {
                            $this.attr('aria-expanded', 'false');
                        }
                    }

                    if (!($subNav.hasClass(CLASS_PRIMARY_TOOLS_LIST) || $subNav.hasClass(CLASS_PRIMARY_UTILITY_LIST))) {
                        $subNav.attr('aria-hidden', 'true').removeClass(CLASS_CLOSING);
                    }
                }, TIME_EXPANDABLE);
            } else {
                // If it's an expandable link, collapse all the rest
                if ($this.hasClass(CLASS_PRIMARY_LINK_EXPANDABLE)) {
                    _collapseExpandables($this);
                } // Add the opening class and set aria attributes


                $this.addClass(CLASS_OPEN);

                if (!$this.hasClass(CLASS_SUBNAV_LINK)) {
                    $this.attr('aria-expanded', 'true');
                }

                $subNav.attr('aria-hidden', 'false').addClass(CLASS_OPEN);
            } // Set the timer to remove the 'is-transitioning' class


            _removeTransitioningStateTimer($subNav);
        });
    }
    /**
     * _collapseExpandables - collapse every expandable sub navigation
     *
     * @param   {HTMLElement} el   the collapsable link element.
     * @returns {void}
     */


function _collapseExpandables(el) {
        // Prevent login expandable from closing other expandables on platform variant
        if ($(el).closest('.header-wrap').attr('data-nav-type') === 'platform') {
            return;
        }

        var $elements = $expandables.not(el); // Note: filter out login nav panel item and its children due to
        // UX treat login as separate entity, not part of the nav panels expandables group

        $elements.filter(function(index, elem) {
            var $elem = $(elem);
            var isLoginItem = $elem.hasClass(CLASS_PRIMARY_LOGIN_ITEM);
            var isChildOfLoginItem = !!$elem.closest(".".concat(CLASS_PRIMARY_LOGIN_ITEM)).length;
            return !isLoginItem && !isChildOfLoginItem;
        });
        $elements.removeClass(CLASS_OPEN);
        $elements.filter(function(index, elem) {
            var $elem = $(elem);
            return !$elem.hasClass(CLASS_SUBNAV_LINK);
        }).attr({
            'aria-expanded': 'false'
        });

        _addTransitioningState($elements);

        _removeTransitioningStateTimer($elements);
    }
    /**
     * _addTransitioningState - adds .is-transitioning class on click
     *
     * @param   {HTMLElement} el   the transitioning element.
     * @returns {void}
     */


function _addTransitioningState(el) {
        el.addClass(CLASS_TRANSITIONING);
    }
    /**
     * _removeTransitioningStateTimer - sets the timer to remove the
     *                                 .is-transitioning class
     *
     * @param   {HTMLElement} el   the transitioning element.
     * @returns {void}
     */


function _removeTransitioningStateTimer(el) {
        setTimeout(function() {
            el.removeClass(CLASS_TRANSITIONING);
        }, TIME_EXPANDABLE);
    }
    /**
     * _removeClosingStateTimer - sets the timer to remove the
     *                           .is-closing class
     *
     * @param   {...HTMLElement} params   elements to remove the class from.
     * @returns {void}
     */


function _removeClosingStateTimer() {
        for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
            params[_key] = arguments[_key];
        }

        params.forEach(function(el) {
            setTimeout(function() {
                el.removeClass(CLASS_CLOSING);
            }, TIME_SLIDE);
        });
    }
    /**
     * _toggleOpeningState - toggle opening/closing states
     *
     * @param   {...HTMLElement} params   elements to toggle
     * @returns {void}
     */


function _toggleOpeningState() {
        for (var _len2 = arguments.length, params = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
            params[_key2] = arguments[_key2];
        }

        params.forEach(function(el) {
            el.removeClass(CLASS_OPEN).addClass(CLASS_CLOSING);
        });
    }
    /**
     * _removeSubNavEventHandler - remove the subnavtrigger click event
     *
     * @returns {void}
     */


function _removeSubNavEventHandler() {
        $hasChildren.off('click.subNavTrigger');
    }
    /**
     * _callbackTrigger - event callback for trigger element
     *
     * @param   {Event} e   the event.
     * @returns {void}
     */


function _callbackTrigger(e) {
        e.preventDefault();

        if ($(this).hasClass(CLASS_PRIMARY_TRIGGER_OPEN)) {
            openNavigation();
        } else {
            closeNavigation();
        }
    }
    /**
     * _callbackBackToParent - event callback for trigger element
     *
     * @returns {void}
     */


function _callbackBackToParent() {
        var $subNav = $(this).closest(".".concat(CLASS_SUBNAV_CONTAINER));
        var $anchor = $subNav.siblings(".".concat(CLASS_OPEN));

        _toggleOpeningState($anchor, $subNav);

        _removeClosingStateTimer($anchor, $subNav);
    }
    /**
     * _callbackTrack - event callback for trackable links
     *
     * @returns {void}
     */


function _callbackTrack() {
        _track(this);
    }
    /**
     * _handleResizeChange - event callback for page resizing
     *
     * @returns {void}
     */


function _handleResizeChange() {
        // Multiple orientation changes/resizes cause the event handler to fire multiple times
        _removeSubNavEventHandler();

        if (isMq('lg').matches) {
            _subNavControlOff();

            isMobile = false;
        } else {
            _subNavControlOn();

            isMobile = true;
        }
    }
    /**
     * _toggleMobileNavTabLoop - toggle tabbing behaviour within the mobile nav side overlay
     *
     * @param   {boolean} toEnable  if to enable the accessibility enhancement
     * @returns {void}
     */


function _toggleMobileNavTabLoop(toEnable) {
        var blurEventString = 'blur.mobile-nav-tab-loop';
        var keydownEventString = 'keydown.mobile-nav-tab-loop';
        var $mobileNavCloseTrigger = $nav.find(".".concat(CLASS_PRIMARY_TRIGGER_CLOSE));
        var $firstFocusItemInMobileNav = $($nav.find(".".concat(CLASS_PRIMARY_LINK, ":focusable"))[0]); // clean up residue event handlers regardless

        $mobileNavCloseTrigger.off(blurEventString);
        $firstFocusItemInMobileNav.off(keydownEventString); // enable enahncements

        if (toEnable) {
            // enable forward tab loop so after close trigger, focus go back to first nav item
            $mobileNavCloseTrigger.on(blurEventString, function() {
                $firstFocusItemInMobileNav.focus();
            }); // cancel backward tab on first nav item so cannot exit nav overlay from the top

            $firstFocusItemInMobileNav.on(keydownEventString, function(e) {
                if (e.keyCode === CONSTANTS.KEYBOARD.TAB && e.shiftKey) {
                    e.preventDefault();
                    return false;
                }
            });
        }
    }
    /**
     * _triggerHashAnchorScroll - trigger scroll on hash links
     *
     * @returns {void}
     */


function _triggerHashAnchorScroll(e) {
        var href = $(e.currentTarget).attr('href'); // Only scroll if href starts with a hash

        if (href.substr(0, 1) !== '#') {
            return;
        }

        e.preventDefault(); // Scroll to anchor point

        if (isMobile) {
            $nav.find(".".concat(CLASS_PRIMARY_TRIGGER_CLOSE)).click(); // Give mobile navigation time to close before scrolling

            setTimeout(function() {
                var offset = $(href).data('scroll-offset-y-mobile') || 0;
                scrollToTarget($(href), true, 500, offset);
            }, 300);
        } else {
            var offset = $(href).data('scroll-offset-y') || 0;
            scrollToTarget($(href), true, 500, offset);
        } // Update url


        window.history.pushState(null, '', href);
    }
    /**
     * init - init nav
     *
     * @returns {void}
     */


function navInit() {
        // Mega menu setup
        $primaryNav.megaMenu({
            /* prefix for generated unique id attributes, which are required
                to indicate aria-owns, aria-controls and aria-labelledby */
            uuidPrefix: UUID_PREFIX,

            /* css class used to define the megamenu styling */
            menuClass: CLASS_PRIMARY_LIST,

            /* css class for a top-level navigation item in the megamenu */
            topNavItemClass: CLASS_PRIMARY_ITEM,

            /* css class for a megamenu panel */
            panelClass: CLASS_SUBNAV_CONTAINER,

            /* css class for a group of items within a megamenu panel */
            panelGroupClass: CLASS_SUBNAV_LIST,

            /* css class for the hover state */
            hoverClass: CLASS_HOVER,

            /* css class for the focus state */
            focusClass: CLASS_FOCUS,

            /* css class for the open state */
            openClass: CLASS_OPEN
        });
        isMq('lg').addListener(function() {
            // run function on resize
            _handleResizeChange();
        }); // open/close

        $trigger.on('click', _callbackTrigger); // return to parent

        $backToParent.on('click', _callbackBackToParent); // track click on links in the navigation

        $header.on('click', '[data-navigation][data-category][data-description]', _callbackTrack); // Override scroll behaviour of hash links in primary nav

        $header.on('click', '.pn-link', _triggerHashAnchorScroll); // handle resize on orientation changed

        $(window).on('orientationchangeend', _handleResizeChange); // run function on load

        _handleResizeChange();
    }
    /**
     * openNavigation - opens the mobile navigation
     *
     * @returns {void}
     */

function openNavigation() {
        var currentBodyPosition = "-".concat($body.scrollTop(), "px");
        $nav.addClass(CLASS_ACTIVE);

        _toolsAndUtilityMenuShow();

        _unHideMicrositeMobileNavFromSC();

        _unHideMobileNavFromSC();

        $body.addClass(CLASS_NO_SCROLL).css('top', currentBodyPosition);
        $triggerOpen.attr('aria-expanded', 'true'); // DTN-1562 - enable better accessibility when mobile nav side overlay is active

        _toggleMobileNavTabLoop(true);
    }
    /**
     * closeNavigation - closes the mobile navigation
     *
     * @returns {void}
     */

function closeNavigation() {
        collapseLoginItem();
        var currentBodyPosition = parseInt($body.css('top'), 10) * -1;
        $nav.removeClass(CLASS_ACTIVE);

        _hideMicrositeMobileNavFromSC();

        _hideMobileNavFromSC();

        _toolsAndUtilityMenuHide();

        $triggerOpen.attr('aria-expanded', 'false');
        setTimeout(function() {
            $body.removeClass(CLASS_NO_SCROLL).removeAttr('style').scrollTop(currentBodyPosition);
        }, 200); // DTN-1562 - remove tabbing accessibility enhancement when mobile nav side overlay is inactive

        _toggleMobileNavTabLoop(false);
    }
    /**
     * expandLoginItem - expand login item in mobile navigation
     *
     * @returns {void}
     */

function expandLoginItem() {
        var $loginItemAnchor = $(".".concat(CLASS_PRIMARY_LOGIN_ITEM)).children(".".concat(CLASS_HAS_CHILDREN));
        var $loginItemSubNav = $loginItemAnchor.next(".".concat(CLASS_SUBNAV_CONTAINER)); // ignore if already open

        if ($loginItemAnchor.hasClass(CLASS_OPEN) && $loginItemSubNav.hasClass(CLASS_OPEN)) {
            return false;
        }

        $loginItemSubNav.attr({
            'aria-hidden': 'false',
            'aria-expanded': 'true'
        }).addClass(CLASS_OPEN);
        $loginItemAnchor.attr('aria-expanded', 'true').addClass(CLASS_OPEN).focus();
    }
    /**
     * collapseLoginItem - collapse login item in mobile navigation
     *
     * @returns {void}
     */

function collapseLoginItem() {
    var $loginItemAnchor = $('.pn-login').children(".".concat(CLASS_HAS_CHILDREN));
    var $loginItemSubNav = $loginItemAnchor.next(".".concat(CLASS_SUBNAV_CONTAINER)); // ignore if already closed

    if (!$loginItemAnchor.hasClass(CLASS_OPEN) && !$loginItemSubNav.hasClass(CLASS_OPEN)) {
        return false;
    }

    $loginItemAnchor.attr('aria-expanded', 'false').removeClass(CLASS_OPEN);
    $loginItemSubNav.attr({
        'aria-hidden': 'true',
        'aria-expanded': 'false'
    }).removeClass(CLASS_OPEN);
}; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/auspost/header-corporate/clientlib/src/js/import/nav-login.js


// mobile view elements

var $mobileHeader = $('#header');
var $mobileContainer = $mobileHeader.find('.login-options-container--mobile'); // mobile login container in old IA

var $mobileNavPanel = $mobileHeader.find('.pn-container'); // mobile nav panel from left

var $mobileLoginButton = $mobileHeader.find('.btn-login-trigger--mobile'); // login button from mobile header
// desktop view elements

var $topNav = $('.top-nav');
var $topNavLoginItem = $topNav.find('.top-nav-list-item--login');
var $desktopLoginButton = $topNav.find('.btn-login-trigger--desktop');
var loginNamespace = 'global-header-login';
var timeout;
/**
 *
 * Mobile functions
 */

function _openMobileContainer() {
    // for old IA mobile container
    set(loginNamespace, $mobileContainer);
    $mobileLoginButton.attr('aria-expanded', 'true');
    $mobileContainer.addClass('is-open');
    $mobileContainer.attr('aria-hidden', 'false');
}

function _closeMobileContainer() {
    // for old IA mobile container
    unset(loginNamespace, $mobileContainer);
    $mobileLoginButton.attr('aria-expanded', 'false');
    $mobileContainer.removeClass('is-open');
    $mobileContainer.attr('aria-hidden', 'true');
}

function _openMobileNavPanel() {
    // opens mobile nav panel on left and expand login item
    openNavigation();
    expandLoginItem();
}

function _closeMobileNavPanel() {
    // opens mobile nav panel on left
    closeNavigation();
}

function _mobileEvents() {
        $mobileLoginButton.on('click', function() {
            // old IA: popup login container
            if ($mobileContainer.length) {
                if ($mobileContainer.hasClass(CONSTANTS.CLASSES.OPEN)) {
                    _closeMobileContainer();
                } else {
                    _openMobileContainer();
                }

                return;
            } // new left panel IA


            if ($mobileNavPanel.hasClass(CONSTANTS.CLASSES.ACTIVE)) {
                _closeMobileNavPanel();
            } else {
                _openMobileNavPanel();
            }
        });
    }
    /**
     *
     * Desktop functions
     *
     */
    // TODO: update desktop code to suit new IA design, code below still applies to old IA design


function _openDesktopContainer() {
    $topNavLoginItem.addClass('is-expanded');
    $desktopLoginButton.attr('aria-expanded', true);
    set(loginNamespace, $topNavLoginItem);
}

function _closeDesktopContainer() {
    $topNavLoginItem.removeClass('is-expanded');
    $desktopLoginButton.attr('aria-expanded', false);
    unset(loginNamespace, $topNavLoginItem);
}

function _desktopContainerIn() {
    clearInterval(timeout);
}

function _desktopContainerOut() {
    // setTimeout is required to get the current active element
    setTimeout(function() {
        var $focus = $(document.activeElement);
        var isButton = $focus.is('.btn-login-trigger--desktop');
        var isLink = $focus.is('.login-option-link');

        if (!isButton && !isLink) {
            timeout = setTimeout(_closeDesktopContainer, 250);
        }
    }, 0);
}

function _desktopEvents() {
    $desktopLoginButton.on('click', function() {
        if ($topNavLoginItem.hasClass('is-expanded')) {
            _closeDesktopContainer();
        } else {
            _openDesktopContainer();
        }
    });
    $topNavLoginItem.on('mouseenter', function() {
        if (!$topNavLoginItem.hasClass('is-expanded')) {
            _openDesktopContainer();
        }

        _desktopContainerIn();
    });
    $topNavLoginItem.on('focusin', _desktopContainerIn);
    $topNavLoginItem.on('focusout', _desktopContainerOut);
    $topNavLoginItem.on('mouseleave', _desktopContainerOut);
}

function navLoginInit() {
    _mobileEvents();

    _desktopEvents();

    $desktopLoginButton.attr('aria-expanded', false);
}; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/auspost/header-corporate/clientlib/src/js/import/stickyNav.js

var stickyNav_$header = $('#header');
var isGlobalHeader = $('.global-header, .global-header-old').length;
var isPolWrapperBody;
var headerOffset;
/**
 * _areAlertsPresent()
 */

function _areAlertsPresent() {
        return !!$('.js-global-notification-dismiss').length;
    }
    /**
     * _setRelative()
     *
     * if alert components are present, add is-relative to $header
     *
     * when alert is dismissed, redefine the headerOffset and check
     * again if some other alert is still present
     *
     * if alert components are not present, kill alert.dismissed event
     * remove is-relative from $header
     *
     * if alert components are not present and is not tier one or post
     * office locator, stickyNav is not required, just kill all eventListenner
     */


function _setRelative() {
        if (_areAlertsPresent()) {
            stickyNav_$header.addClass('is-relative');
            $(window).on('alert.dismissed', function() {
                _defineHeaderOffset();

                _setRelative();
            });
        } else {
            $(window).off('alert.dismissed');
            stickyNav_$header.removeClass('is-relative');

            if (isPolWrapperBody) {
                stop();
            }
        }
    }
    /**
     * _defineHeaderOffset()
     */


function _defineHeaderOffset() {
        headerOffset = stickyNav_$header.offset().top;
    }
    /**
     * _stopScrollEvent()
     */


function _stopScrollEvent() {
        $(window).off('scroll.stickynav');
    }
    /**
     * _startScrollEvent()
     *
     * if alert components are present, redefine the header offset
     * if it's not the case, header offset has to be 0
     *
     * on scroll, add or remove the is-sticky class
     */


function _startScrollEvent() {
        if (_areAlertsPresent()) {
            _defineHeaderOffset();
        } else {
            headerOffset = 0;
        }

        $(window).on('scroll.stickynav', function() {
            if ($(window).scrollTop() > headerOffset) {
                stickyNav_$header.addClass('is-sticky');
            } else {
                stickyNav_$header.removeClass('is-sticky');
            }
        });
    }
    /**
     * _handleResizeChange()
     *
     * start or stop the scroll event depending of the current mq matches
     */


function stickyNav_handleResizeChange() {
        if (isMq('lg').matches) {
            _stopScrollEvent();
        } else {
            _startScrollEvent();
        }
    }
    /**
     * stop()
     *
     * kill all eventListeners and remove global-header modifier classes
     */


function stop() {
        stickyNav_$header.removeClass('is-sticky');
        stickyNav_$header.removeClass('is-relative');

        _stopScrollEvent();

        window.removeEventListener('orientationchange.stickynav', stickyNav_handleResizeChange);
        isMq('lg').removeListener(stickyNav_handleResizeChange);
    }
    /**
     * init()
     *
     * stickyNav is required if
     * - global header is present on the page
     * - the page is a post office locator page OR an alert component is present
     */


function stickyNavInit() {
        isPolWrapperBody = $('.pol-wrapper-body').length;

        if (isGlobalHeader || isGlobalHeader && isPolWrapperBody || _areAlertsPresent()) {
            stickyNav_handleResizeChange();

            window.addEventListener('orientationchange.stickynav', stickyNav_handleResizeChange);
            isMq('lg').addListener(stickyNav_handleResizeChange);

            _setRelative();
        }
    }
    // EXTERNAL MODULE: ./ui.frontend/src/main/global/js/vendors/megamenu.js
var megamenu = __webpack_require__(115);; // CONCATENATED MODULE: ./ui.apps/src/main/content/jcr_root/apps/global/components/auspost/header-corporate/clientlib/src/js/header-corporate.js




$(document).ready(function() {
    navLoginInit();
    navInit();
    stickyNavInit();
}); //# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvaGVscGVycy9yZXN0cmljdEZvY3VzLmpzPzczZDYiLCJ3ZWJwYWNrOi8vYWVtLWNtcy1jb2RlLy4vdWkuZnJvbnRlbmQvc3JjL21haW4vZ2xvYmFsL2pzL3ZhcmlhYmxlcy9jb25zdGFudHMuanM/YWUxYyIsIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5mcm9udGVuZC9zcmMvbWFpbi9nbG9iYWwvanMvaGVscGVycy9pc01xLmpzPzA2YmMiLCJ3ZWJwYWNrOi8vYWVtLWNtcy1jb2RlLy4vdWkuZnJvbnRlbmQvc3JjL21haW4vZ2xvYmFsL2pzL2hlbHBlcnMvc2Nyb2xsVG8uanM/ZWY4YiIsIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5hcHBzL3NyYy9tYWluL2NvbnRlbnQvamNyX3Jvb3QvYXBwcy9nbG9iYWwvY29tcG9uZW50cy9hdXNwb3N0L2hlYWRlci1jb3Jwb3JhdGUvY2xpZW50bGliL3NyYy9qcy9pbXBvcnQvbmF2LmpzP2ZkYTQiLCJ3ZWJwYWNrOi8vYWVtLWNtcy1jb2RlLy4vdWkuYXBwcy9zcmMvbWFpbi9jb250ZW50L2pjcl9yb290L2FwcHMvZ2xvYmFsL2NvbXBvbmVudHMvYXVzcG9zdC9oZWFkZXItY29ycG9yYXRlL2NsaWVudGxpYi9zcmMvanMvaW1wb3J0L25hdi1sb2dpbi5qcz8wODkxIiwid2VicGFjazovL2FlbS1jbXMtY29kZS8uL3VpLmFwcHMvc3JjL21haW4vY29udGVudC9qY3Jfcm9vdC9hcHBzL2dsb2JhbC9jb21wb25lbnRzL2F1c3Bvc3QvaGVhZGVyLWNvcnBvcmF0ZS9jbGllbnRsaWIvc3JjL2pzL2ltcG9ydC9zdGlja3lOYXYuanM/YWY3NCIsIndlYnBhY2s6Ly9hZW0tY21zLWNvZGUvLi91aS5hcHBzL3NyYy9tYWluL2NvbnRlbnQvamNyX3Jvb3QvYXBwcy9nbG9iYWwvY29tcG9uZW50cy9hdXNwb3N0L2hlYWRlci1jb3Jwb3JhdGUvY2xpZW50bGliL3NyYy9qcy9oZWFkZXItY29ycG9yYXRlLmpzP2EzNzEiXSwibmFtZXMiOlsic2V0IiwibmFtZXNwYWNlIiwiJGNvbnRhaW5lciIsImV2ZW50VHlwZSIsImF0dHIiLCIkIiwiZG9jdW1lbnQiLCJvbiIsImV2ZW50IiwiY29udGFpbnMiLCJ0YXJnZXQiLCJzdG9wUHJvcGFnYXRpb24iLCJmb2N1cyIsInVuc2V0Iiwib2ZmIiwiQ09OU1RBTlRTIiwiSEFTSF9DSEFSX0xJTUlUIiwiQ0xBU1NFUyIsIkhJRERFTiIsIkFDVElWRSIsIkNVUlJFTlQiLCJGT0NVU0VEIiwiRVJST1IiLCJPUEVOIiwiRElTQUJMRUQiLCJIQVNfRVJST1IiLCJLRVlCT0FSRCIsIkJBQ0tTUEFDRSIsIlRBQiIsIkVOVEVSIiwiRVNDQVBFIiwiTEVGVCIsIlVQIiwiUklHSFQiLCJET1dOIiwiREVMRVRFIiwiRk9SV0FSRF9TTEFTSCIsIkFUVFJJQlVURVMiLCJSRUFET05MWSIsIlJFUVVJUkVEIiwiTUFYIiwiTUlOIiwiQlJFQUtQT0lOVFMiLCJYU00iLCJTTSIsIk1EIiwiTEciLCJYTCIsIlhYTCIsIm1xIiwieHNtIiwic20iLCJtZCIsImxnIiwieGwiLCJ4eGwiLCJpc01xIiwibWluIiwid2luZG93IiwibWF0Y2hNZWRpYSIsImlzQmV0d2VlbiIsIm1heCIsInNjcm9sbFRvVGFyZ2V0Iiwic2hvdWxkU2Nyb2xsRnJvbVRvcCIsInNwZWVkIiwib2Zmc2V0IiwiQVRUUl9TQ1JPTExJTkciLCIkYm9keSIsImlzU2Nyb2xsaW5nIiwidGFyZ2V0UG9zaXRpb24iLCIkdGFyZ2V0IiwiTWF0aCIsInJvdW5kIiwiYWJzIiwidGFyZ2V0UG9zaXRpb25OdW0iLCJfZ2V0VGFyZ2V0U2Nyb2xsUG9zaXRpb24iLCIkcGFnZSIsInNjcm9sbFRvcCIsImFuaW1hdGUiLCJyZW1vdmVBdHRyIiwibGVuZ3RoIiwiJHN1Ym5hdiIsIiRnbG9iYWxIZWFkZXIiLCJpc01xTEciLCJtYXRjaGVzIiwiYWRqdXN0bWVudCIsImhlaWdodCIsInRvcCIsImFuYWx5dGljcyIsIl9zYXRlbGxpdGUiLCJjb21wb25lbnQiLCJsaW5rIiwidHJhY2siLCJjb25zb2xlIiwid2FybiIsIlVVSURfUFJFRklYIiwiQ0xBU1NfSEVBREVSIiwiQ0xBU1NfUFJJTUFSWV9OQVYiLCJDTEFTU19NSUNST1NJVEVfTkFWIiwiQ0xBU1NfTUlDUk9TSVRFX05BVl9MT0dPX0xJTksiLCJDTEFTU19QUklNQVJZX0NPTlRBSU5FUiIsIkNMQVNTX1BSSU1BUllfTElTVCIsIkNMQVNTX1BSSU1BUllfSVRFTSIsIkNMQVNTX1BSSU1BUllfTElOSyIsIkNMQVNTX1BSSU1BUllfTE9HSU5fSVRFTSIsIkNMQVNTX1BSSU1BUllfTElOS19FWFBBTkRBQkxFIiwiQ0xBU1NfUFJJTUFSWV9MSU5LX0VYUEFOREFCTEVfTE9DS0VEIiwiQ0xBU1NfUFJJTUFSWV9UT09MU19MSVNUX0NPTlRBSU5FUiIsIkNMQVNTX1BSSU1BUllfVE9PTFNfTElTVCIsIkNMQVNTX1BSSU1BUllfVVRJTElUWV9MSVNUX0NPTlRBSU5FUiIsIkNMQVNTX1BSSU1BUllfVVRJTElUWV9MSVNUIiwiQ0xBU1NfUFJJTUFSWV9UT0dHTEUiLCJDTEFTU19QUklNQVJZX1RSSUdHRVJfT1BFTiIsIkNMQVNTX1BSSU1BUllfVFJJR0dFUl9DTE9TRSIsIkNMQVNTX1NVQk5BVl9DT05UQUlORVIiLCJDTEFTU19TVUJOQVZfRVhQQU5EQUJMRSIsIkNMQVNTX1NVQk5BVl9MSVNUIiwiQ0xBU1NfU1VCTkFWX0xJTksiLCJDTEFTU19PUEVOIiwiQ0xBU1NfQUNUSVZFIiwiQ0xBU1NfVFJBTlNJVElPTklORyIsIkNMQVNTX0NMT1NJTkciLCJDTEFTU19IT1ZFUiIsIkNMQVNTX0ZPQ1VTIiwiQ0xBU1NfTk9fU0NST0xMIiwiQ0xBU1NfSEFTX0NISUxEUkVOIiwiQ0xBU1NfQkFDS19UT19QQVJFTlQiLCJUSU1FX1NMSURFIiwiVElNRV9FWFBBTkRBQkxFIiwiJGhlYWRlciIsIiRwcmltYXJ5TmF2IiwiJG5hdiIsIiRtaWNyb3NpdGVOYXYiLCIkbWljcm9zaXRlTmF2TG9nb0xpbmsiLCIkdG9vbHNMaXN0IiwiJHRvb2xzTGlzdEl0ZW0iLCIkdXRpbGl0eUxpc3QiLCIkdHJpZ2dlciIsIiR0cmlnZ2VyT3BlbiIsIiRoYXNDaGlsZHJ