{"version":3,"file":"main.js","sources":["main.js"],"sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n// Vendor dependencies\nvar $ = require('jquery'),\n\n    // project dependencies\n    resizeEvent = require('./events/resize'),\n    matchMedia = require('./events/matchMedia'),\n\tscrollEvent = require('./events/scroll'),\n\n    // constants\n\tCONTENT_PROGRESS = 'CONTENT_PROGRESS',\n\n\tFILTER_CLEAR_FIELD = 'FILTER_CLEAR_FIELD',\n\tFILTER_REQUEST = 'FILTER_REQUEST',\n\tFILTER_READY = 'FILTER_READY',\n\n\tLOAD_MORE_REQUEST = 'LOAD_MORE_REQUEST',\n\tLOAD_MORE_READY = 'LOAD_MORE_READY',\n\n    RESIZE = 'RESIZE',\n    MATCH_MEDIA = 'MATCHMEDIA',\n    SCROLL = 'SCROLL',\n    COMMENTS = 'COMMENTS',\n\n    // global vars\n    _$eventBus = $({});\n\n\n\n/* ==========================================================================\n\tInitialization\n ========================================================================== */\n\nfunction init() {\n\n\tresizeEvent.init();\n\tmatchMedia.init();\n\tscrollEvent.init();\n\n\ttriggerInitialEvents();\n}\n\nfunction triggerInitialEvents() {\n\n\tresizeEvent.triggerResize();\n\tscrollEvent.triggerScroll();\n}\n\n\n/* ==========================================================================\n \tExports\n ========================================================================== */\n\n\n// constants\nexports.RESIZE = RESIZE;\nexports.MATCH_MEDIA = MATCH_MEDIA;\nexports.SCROLL = SCROLL;\nexports.CONTENT_PROGRESS = CONTENT_PROGRESS;\nexports.COMMENTS = COMMENTS;\n\nexports.FILTER_CLEAR_FIELD = FILTER_CLEAR_FIELD;\nexports.FILTER_REQUEST = FILTER_REQUEST;\nexports.FILTER_READY = FILTER_READY;\n\nexports.LOAD_MORE_REQUEST = LOAD_MORE_REQUEST;\nexports.LOAD_MORE_READY = LOAD_MORE_READY;\n\n\n// methods\nexports.init = init;\n\nexports.on = function(event, handler)\t{ _$eventBus.on(event, handler); };\nexports.trigger = function(event, args)\t{ _$eventBus.trigger(event, args); };\nexports.off = function(event, handler)\t{ _$eventBus.off(event, handler); };\n\n\n},{\"./events/matchMedia\":2,\"./events/resize\":3,\"./events/scroll\":4,\"jquery\":\"jquery\"}],2:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../eventBus'),\n\n// global vars\n\t_currentSize,\n\n// constants\n\tSMALL_WINDOW = 0,\n\tMEDIUM_WINDOW = 768,\n\tLARGE_WINDOW = 1024,\n\tXLARGE_WINDOW = 1280,\n\tMEDIA_SIZES = [SMALL_WINDOW, MEDIUM_WINDOW, LARGE_WINDOW, XLARGE_WINDOW];\n\n\n/* ==========================================================================\n Initialize\n ========================================================================== */\n\nfunction init() {\n\n\t// bind events\n\teventBus.on(eventBus.RESIZE, onResize);\n\n}\n\n\n\n/* ==========================================================================\n Event Handling\n ========================================================================== */\n\n\nfunction onResize(e, resize) {\n\n\tvar i;\n\n\tfor(i = MEDIA_SIZES.length; i >= 0; i--) {\n\n\t\tif(resize >= MEDIA_SIZES[i]) {\n\n\t\t\ttriggerMatchMedia(MEDIA_SIZES[i]);\n\n\t\t\tbreak;\n\n\t\t}\n\t}\n}\n\n/* ==========================================================================\n Utils\n ========================================================================== */\n\nfunction triggerMatchMedia(size) {\n\n\tif(size !== _currentSize) {\n\n\t\t_currentSize = size;\n\t\teventBus.trigger(eventBus.MATCH_MEDIA, size);\n\n\t}\n\n}\n\n/* ==========================================================================\n Exports\n ========================================================================== */\n\n\nexports.init = init;\nexports.triggerMatchMedia = triggerMatchMedia;\nexports.SMALL_WINDOW = SMALL_WINDOW;\nexports.MEDIUM_WINDOW = MEDIUM_WINDOW;\nexports.LARGE_WINDOW = LARGE_WINDOW;\nexports.XLARGE_WINDOW = XLARGE_WINDOW;\n\n\n},{\"../eventBus\":1}],3:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../eventBus'),\n    globalSelectors = require('../globalSelectors'),\n\n\t// selectors\n    _win = window,\n    _$window = globalSelectors.$window,\n\n\t// global vars\n    _windowWidth,\n    _windowHeight;\n\n\n/* ==========================================================================\n\tInitialize\n ========================================================================== */\n\n\nfunction init() {\n\n    _windowWidth = _win.innerWidth;\n    _windowHeight = _win.innerHeight;\n\n    _$window.resize(onResize);\n}\n\n\n\n/* ==========================================================================\n\tEvent Handling\n ========================================================================== */\n\n\nfunction onResize() {\n\n    var newWindowWidth = _win.innerWidth,\n        newWindowHeight = _win.innerHeight;\n\n\n    if (newWindowWidth !== _windowWidth || newWindowHeight !== _windowHeight) {\n\n        _windowWidth = newWindowWidth;\n        _windowHeight = newWindowHeight;\n\n\t\ttriggerResize();\n    }\n}\n\n\n\n/* ==========================================================================\n\tUtils\n ========================================================================== */\n\n\nfunction triggerResize() {\n\n    eventBus.trigger(eventBus.RESIZE, [_windowWidth, _windowHeight]);\n\n\n}\n\n\n\n/* ==========================================================================\n\tExports\n ========================================================================== */\n\n\nexports.init = init;\nexports.triggerResize = triggerResize;\n\n},{\"../eventBus\":1,\"../globalSelectors\":6}],4:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../eventBus'),\n\tglobalSelectors = require('../globalSelectors'),\n\n// constants\n\tVELOCITY_CLAMP = 200,\n\n// selectors\n\t_window = window,\n\t_doc = document,\n\t_$window = globalSelectors.$window,\n\t_$document = globalSelectors.$document,\n\n// global vars\n\t_previousScrollPosition = 0,\n\t_fraction,\n\t_velocity,\n\t_currentScrollPosition,\n\t_scrollMax;\n\n\n\n/* ==========================================================================\n\tInitialize\n ========================================================================== */\n\n\nfunction init() {\n\n\t// initial values\n\t_$window.on('scroll', onScroll);\n\n\teventBus.on(eventBus.RESIZE, onResize);\n}\n\n\n\n/* ==========================================================================\n\tEvent Handling\n ========================================================================== */\n\n\nfunction onResize() {\n\n\tvar newScrollMax = _$document.height() - _$window.height();\n\n\tif(newScrollMax !== _scrollMax) {\n\n\t\t_scrollMax = newScrollMax;\n\n\t\tcalculateScrollOffset(true);\n\t}\n}\n\nfunction onScroll() {\n\n\tcalculateScrollOffset();\n}\n\n\n\n/* ==========================================================================\n Utils\n ========================================================================== */\n\nfunction calculateScrollOffset(isForced) {\n\n\tvar isUpdated = false,\n\t\tnewScrollPosition = getScrollPosition(),\n\t\tprepVelocity = Math.min(VELOCITY_CLAMP, Math.max(-VELOCITY_CLAMP,newScrollPosition - _previousScrollPosition)),\n\t\tnewVelocity = prepVelocity / (VELOCITY_CLAMP/2),\n\t\tnewFraction = newScrollPosition / _scrollMax;\n\n\n\t_velocity = updateValue(_velocity, newVelocity);\n\t_fraction = updateValue(_fraction, newFraction);\n\t_currentScrollPosition = updateValue(_currentScrollPosition, newScrollPosition);\n\t_previousScrollPosition = _currentScrollPosition;\n\n\tif(isUpdated || isForced) {\n\n\t\ttriggerScroll();\n\t}\n\n\tfunction updateValue(original, newValue) {\n\n\t\tif(original !== newValue) {\n\n\t\t\tisUpdated = true;\n\t\t}\n\n\t\treturn newValue;\n\t}\n}\n\nfunction getScrollPosition() {\n\n\treturn _window.pageYOffset || _doc.documentElement.scrollTop || _doc.body.scrollTop;\n}\n\nfunction triggerScroll() {\n\n\teventBus.trigger(eventBus.SCROLL, [{\n\t\tfraction: _fraction,\n\t\tscrollTop: _currentScrollPosition,\n\t\tvelocity: _velocity,\n\t\tscrollMax: _scrollMax\n\t}]);\n}\n\n\n\n\n/* ==========================================================================\n\tExports\n ========================================================================== */\n\n\nexports.init = init;\nexports.triggerScroll = triggerScroll;\n\n},{\"../eventBus\":1,\"../globalSelectors\":6}],5:[function(require,module,exports){\n// project dependencies\nvar deferredAjax = require('../utils/deferredAjax'),\n\teventBus = require('./eventBus'),\n\n\t// global vars\n\t_win = window,\n\t_baseUrl,\n\t_storedFilterQuery = false,\n\t_isLoading = false;\n\nfunction init() {\n\n\t_baseUrl = location.origin + location.pathname;\n\t_win.addEventListener('popstate', onPopState);\n}\n\nfunction load(filterQuery) {\n\n\tvar url;\n\n\tif(!_isLoading) {\n\n\t\t_isLoading = true;\n\t\turl =_baseUrl + '?' + filterQuery;\n\n\t\teventBus.trigger(eventBus.FILTER_REQUEST);\n\n\t\tdeferredAjax(url)\n\t\t\t.then(function(response){\n\n\t\t\t\teventBus.trigger(eventBus.FILTER_READY, [response]);\n\n\t\t\t\t_isLoading = false;\n\n\t\t\t\tif(_storedFilterQuery !== false) {\n\n\t\t\t\t\tload(_storedFilterQuery);\n\t\t\t\t\t_storedFilterQuery = false;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.fail(function(e) {\n\n\t\t\t\tconsole.error(e);\n\t\t\t});\n\n\t} else {\n\n\t\t_storedFilterQuery = filterQuery;\n\t}\n}\n\nfunction onPopState() {\n\n\tload(_win.location.search.replace('?', ''));\n}\n\nfunction pushState(filter) {\n\n\tvar url;\n\n\tif(_win.history) {\n\n\t\turl = _baseUrl + '?' + filter;\n\n\t\t_win.history.pushState(\n\t\t\t{ url: url },\n\t\t\t'',\n\t\t\turl\n\t\t);\n\t}\n\n\tload(filter);\n}\n\nexports.init = init;\nexports.load = pushState;\n\n},{\"../utils/deferredAjax\":57,\"./eventBus\":1}],6:[function(require,module,exports){\n// Vendor dependencies\nvar $ = require('jquery');\n\n\n\n/* ==========================================================================\n\tExports\n   ========================================================================== */\n\n\nexports.$window = $(window);\nexports.$document = $(document);\nexports.$body = $('body');\n\n},{\"jquery\":\"jquery\"}],7:[function(require,module,exports){\n// vendor dependencies\nvar $ = require('jquery'),\n\n\t// project dependencies\n\tglobalSelectors = require('./globalSelectors'),\n\n\t// selectors\n\t_$body = globalSelectors.$body,\n\t_$menuToggle,\n\t_$mobileMenu,\n\t_$subNav,\n\n\t// constants\n\tDELAYED_TIME = 500,\n\tCLASS_IS_OPEN = 'is-open',\n\tCLASS_IS_HIDDEN = 'is-hidden',\n\tCLASS_NO_SCROLL = 'no-scroll',\n\n\t// vars\n\t_delayedCall,\n\t_isOpen = false;\n\n\n\n/* ==========================================================================\n    Initialization\n ========================================================================== */\n\n\n/**\n * Initialize\n */\nfunction init() {\n\n\t_$menuToggle = $('.js-menuToggle');\n\t_$mobileMenu = $('.js-menuMobile');\n\t_$subNav = $('.js-subNav');\n\n\t_$menuToggle.click(onMenuToggleClick);\n}\n\n\n\n/* ==========================================================================\n    Event handling\n ========================================================================== */\n\n\n/**\n * Handle _$menuToggle click\n * @param e\n */\nfunction onMenuToggleClick(e) {\n\n\te.preventDefault();\n\n\tif(_isOpen) {\n\n\t\tcloseMenu();\n\n\t} else {\n\n\t\topenMenu();\n\t}\n}\n\n\n\n/* ==========================================================================\n    Helper Functions\n ========================================================================== */\n\n\n/**\n * Open mobile menu\n */\nfunction openMenu() {\n\n\t_$body.addClass(CLASS_NO_SCROLL);\n\t_$menuToggle.addClass(CLASS_IS_OPEN);\n\t_$mobileMenu.addClass(CLASS_IS_OPEN);\n\n\t_$subNav.addClass(CLASS_IS_HIDDEN);\n\t_$subNav.removeClass(CLASS_IS_OPEN);\n\n\t_isOpen = true;\n\n\tclearTimeout(_delayedCall);\n}\n\n/**\n * Close mobile menu\n */\nfunction closeMenu() {\n\n\t_$body.removeClass(CLASS_NO_SCROLL);\n\t_$menuToggle.removeClass(CLASS_IS_OPEN);\n\t_$mobileMenu.removeClass(CLASS_IS_OPEN);\n\n\t_$subNav.removeClass(CLASS_IS_HIDDEN);\n\n\t_isOpen = false;\n\n\t_delayedCall = setTimeout(function() {\n\n\t\t_$mobileMenu[0].scrollTop = 0;\n\n\t}, DELAYED_TIME);\n}\n\n\n\n/* ==========================================================================\n    Exports\n ========================================================================== */\n\n\nexports.init = init;\n\n},{\"./globalSelectors\":6,\"jquery\":\"jquery\"}],8:[function(require,module,exports){\nvar $ = require('jquery'),\n\n\tmoduleConfigs = [\n\n\t\t// about modules\n\t\trequire('../modules/about-location'),\n\t\trequire('../modules/aboutTimeline'),\n\n\t\t// event module\n\t\trequire('../modules/events-featured'),\n\t\trequire('../modules/top-events'),\n\t\trequire('../modules/heroes'),\n\t\trequire('../modules/ideas-issues'),\n\n\t\t// filter modules\n\t\trequire('../modules/filtering/clearFilter'),\n\t\trequire('../modules/filtering/filterAnchor'),\n\t\trequire('../modules/filtering/filterContent'),\n\t\trequire('../modules/filtering/filterEventDropdowns'),\n\t\trequire('../modules/filtering/filterMultiSelect'),\n\t\trequire('../modules/filtering/filterRadioCheckbox'),\n\t\trequire('../modules/filtering/filterPositioning'),\n\t\trequire('../modules/filtering/filterToggle'),\n\t\t// `filterForm` should be last of the filters since it's pre-filling all the inputs on init.\n\t\t// These inputs need their listeners and values set for it to work.\n\t\trequire('../modules/filtering/filterForm'),\n\t\trequire('../modules/filtering/filterEvents'),\n\n\t\t// header module\n\t\trequire('../modules/header'),\n\n\t\t// generic modules\n\t\trequire('../modules/carousel'),\n\t\trequire('../modules/contentProgressBar'),\n\t\trequire('../modules/contentProgressEvent'),\n\t\trequire('../modules/disqusToggle'),\n\t\trequire('../modules/gtmClick'),\n\t\trequire('../modules/gtmSubmit'),\n\t\trequire('../modules/subNav'),\n\t\trequire('../modules/loadMore'),\n\t\trequire('../modules/overlay'),\n\t\trequire('../modules/overlayFlickr'),\n\t\trequire('../modules/shareBar'),\n\t\trequire('../modules/svgIconLoader'),\n\t\trequire('../modules/fadingText'),\n\t\trequire('../modules/joinAutofill'),\n\t\trequire('../modules/socialShare'),\n\t\trequire('../modules/accordion'),\n\n\t\trequire('../modules/search'),\n\t\trequire('../modules/animateIn')\n\n\n\t];\n\n\nfunction run($parent) {\n\tif(!$parent) {\n\n\t\t$parent = $('html');\n\t}\n\n\tmoduleConfigs.forEach(function(config){\n\n\t\tvar $selector = $parent.find(config.selector);\n\n\t\t$selector.each(function(index, el){\n\n\t\t\tvar module = new config.constructor(),\n\t\t\t\t$el = $(el);\n\n\t\t\tmodule.init($el);\n\t\t});\n\n\t\t// remove selectors to make sure we don't initialize the same module twice\n\t\t$selector.removeClass(config.selector.substr(1));\n\t});\n}\n\nexports.run = run;\n\n},{\"../modules/about-location\":12,\"../modules/aboutTimeline\":15,\"../modules/accordion\":16,\"../modules/animateIn\":17,\"../modules/carousel\":20,\"../modules/contentProgressBar\":22,\"../modules/contentProgressEvent\":23,\"../modules/disqusToggle\":24,\"../modules/events-featured\":25,\"../modules/fadingText\":26,\"../modules/filtering/clearFilter\":27,\"../modules/filtering/filterAnchor\":28,\"../modules/filtering/filterContent\":29,\"../modules/filtering/filterEventDropdowns\":30,\"../modules/filtering/filterEvents\":31,\"../modules/filtering/filterForm\":32,\"../modules/filtering/filterMultiSelect\":33,\"../modules/filtering/filterPositioning\":34,\"../modules/filtering/filterRadioCheckbox\":35,\"../modules/filtering/filterToggle\":36,\"../modules/gtmClick\":37,\"../modules/gtmSubmit\":38,\"../modules/header\":40,\"../modules/heroes\":41,\"../modules/ideas-issues\":42,\"../modules/joinAutofill\":43,\"../modules/loadMore\":44,\"../modules/overlay\":45,\"../modules/overlayFlickr\":46,\"../modules/search\":47,\"../modules/shareBar\":48,\"../modules/socialShare\":49,\"../modules/subNav\":50,\"../modules/svgIconLoader\":51,\"../modules/top-events\":52,\"jquery\":\"jquery\"}],9:[function(require,module,exports){\n// vendor dependencies\nvar $ = require('jquery'),\n\n\t// project dependencies\n\tfilter = require('./core/filter'),\n\teventBus = require('./core/eventBus'),\n\tmenuToggle = require('./core/menuToggle'),\n\tmoduleFactory = require('./core/moduleFactory');\n\n\n/* ==========================================================================\n\tLibraries\n ========================================================================== */\n\n\nrequire('hammerjs');\nrequire('jquery-hammerjs');\n\n\n\n/* ==========================================================================\n\tInitialize\n ========================================================================== */\n\n\n$(function() {\n\n\tfilter.init();\n\tmenuToggle.init();\n\tmoduleFactory.run();\n\n\teventBus.init();\n});\n\n},{\"./core/eventBus\":1,\"./core/filter\":5,\"./core/menuToggle\":7,\"./core/moduleFactory\":8,\"hammerjs\":61,\"jquery\":\"jquery\",\"jquery-hammerjs\":62}],10:[function(require,module,exports){\n'use strict';\n\n// constants\n\tvar OPACITY = 0.3;\n\nvar Arrow = function ( element, direction, parentAction ) {\n\n\tvar\t_$el = element,\n\t\t_direction = direction;\n\n\n\tfunction bind () {\n\n\t\tparentAction(_direction);\n\t}\n\n\tfunction _animateIn () {\n\n\t\t_$el.css('opacity', 1);\n\n\t}\n\n\tfunction _animateOut () {\n\n\t\t_$el.css('opacity', OPACITY);\n\n\t}\n\n\tfunction _activate () {\n\n\n\t\t_$el.click(bind);\n\n\t}\n\n\tfunction _deactivate () {\n\n\t\t_$el.off();\n\t}\n\n\treturn {\n\n\t\tanimateIn: _animateIn,\n\t\tanimateOut: _animateOut,\n\t\tactivate: _activate,\n\t\tdeactivate: _deactivate\n\n\t}\n\n}\n\nmodule.exports = Arrow;\n\n\n},{}],11:[function(require,module,exports){\n\nvar EachNavigation = function (element, toggleStatus) {\n\n\tvar\t_$el = element,\n\t\t_isActive = false;\n\n\n\tfunction _activate () {\n\n\t\t_$el.mouseenter( bind );\n\t\t_$el.mouseleave( bind );\n\n\t}\n\n\tfunction _deactivate () {\n\n\t\t_$el.off();\n\n\t}\n\n\n\n\tfunction bind () {\n\n\t\ttoggleStatus()\n\t\t_toggleClass();\n\t}\n\n\tfunction _toggleClass () {\n\n\t\t_$el.toggleClass('active');\n\n\t\tif(_isActive) {\n\n\t\t\t_isActive = false;\n\n\t\t} else {\n\n\t\t\t_isActive = true;\n\t\t}\n\t}\n\n\treturn {\n\n\t\tactivate: _activate,\n\t\tdeactivate: _deactivate,\n\t\ttoggleClass: _toggleClass\n\n\t}\n\n}\n\nmodule.exports = EachNavigation;\n\n\n\n\n},{}],12:[function(require,module,exports){\n// Project dependencies\n\nvar $ = require('jquery'),\n\teventBus = require('../../core/eventBus'),\n\tmatchMedia = require('../../core/events/matchMedia'),\n\tPin = require('./pin'),\n\tEachNavigation = require('./eachNavigation'),\n\tNavigation = require('./navigation');\n\nexports.selector = '.js-location';\n\nexports.constructor = function() {\n\n\tvar _$el,\n\t\t_$pinWrap,\n\t\t_$basePin,\n\n\t\t_$allNavigation,\n\n\t\teachPin,\n\n\t\tallNav =[],\n\t\tallPins = [],\n\t\tisActive = false,\n\n\t\t_pinsCreated = false,\n\t\tnavigation;\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_$pinWrap = _$el.find('.about-locations__map__pin__container');\n\t\t_$basePin = _$pinWrap.find('.about-locations__map__pin');\n\n\t\t_$allNavigation = _$el.find('.about-locations__location');\n\n\t\teventBus.on(eventBus.MATCH_MEDIA, _resize);\n\n\t\t_$basePin.remove();\n\n\t}\n\n\tfunction updateNavigation ( index ) {\n\n\t\tnavigation.goToIndex( index );\n\t\tallNav[index].toggleClass();\n\n\t}\n\n\tfunction _resize (e, resize) {\n\n\t\tif(resize >= matchMedia.MEDIUM_WINDOW) {\n\n\t\t\tif (!_pinsCreated) {\n\n\t\t\t\tnavigation = new Navigation(_$el, _$allNavigation);\n\n\t\t\t\t_$allNavigation.each(function( index ) {\n\n\t\t\t\t\tallPins.push(eachPin = new Pin(_$pinWrap, _$basePin, index, $(this).data('location-point-x'), $(this).data('location-point-y'), updateNavigation));\n\t\t\t\t\tallNav.push(new EachNavigation($(this), eachPin.toggleStatus ));\n\n\t\t\t\t\teachPin.create();\n\n\t\t\t\t});\n\n\t\t\t\t_pinsCreated = true;\n\n\t\t\t}\n\n\t\t\tcheckStatus(true);\n\n\t\t} else if (_pinsCreated) {\n\n\t\t\tcheckStatus(false);\n\t\t}\n\t}\n\n\tfunction checkStatus( status ) {\n\n\t\tif(isActive !== status) {\n\n\t\t\tisActive = status;\n\n\t\t\tisActive ? activate() : deactivate();\n\t\t}\n\t}\n\n\tfunction activate () {\n\n\t\tnavigation.activate();\n\n\t\t$.each(allPins, function( index ) {\n\n\t\t\tallPins[index].activate();\n\t\t\tallNav[index].activate();\n\n\t\t});\n\t}\n\n\tfunction deactivate () {\n\n\t\tnavigation.deactivate();\n\n\t\t$.each(allPins, function( index ) {\n\n\t\t\tallPins[index].deactivate();\n\t\t\tallNav[index].deactivate();\n\n\t\t});\n\t}\n\n\tthis.init = init;\n\n};\n\n},{\"../../core/eventBus\":1,\"../../core/events/matchMedia\":2,\"./eachNavigation\":11,\"./navigation\":13,\"./pin\":14,\"jquery\":\"jquery\"}],13:[function(require,module,exports){\n'use strict';\n\n\nvar Arrow = require('./arrow'),\n\n// constants\n\tANIMATE_DURATION = 0.5;\n\nvar Navigation = function ( element, children ) {\n\n\tvar\t_$el = element,\n\t\t_$allChildren = children,\n\t\t_$childrenWrapper = _$el.find('.about-locations__list__wrapper'),\n\t\t_$children = _$el.find('.about-locations__list'),\n\t\t_$arrowTop = _$el.find('.locations__arrow--top'),\n\t\t_$arrowBottom = _$el.find('.locations__arrow--bottom'),\n\n\t\t_arrowTop,\n\t\t_arrowBottom,\n\n\t\tchildrenCount,\n\n\t\telementPerView,\n\n\t\teachChildrenSize,\n\t\telementHeight,\n\n\t\ttotalMoves,\n\t\ttotalMovesBottom,\n\t\ttotalMovesTop;\n\n\t\telementHeight = parseFloat(_$childrenWrapper.css('height'));\n\n\t\teachChildrenSize = parseFloat(_$allChildren.css('height'));\n\n\t\telementPerView = elementHeight / eachChildrenSize;\n\n\t\tchildrenCount = _$allChildren.length;\n\n\n\t\tif (childrenCount > elementPerView) {\n\n\t\t\t_arrowTop = new Arrow(_$arrowTop, 'top', _bindSteps);\n\t\t\t_arrowBottom = new Arrow(_$arrowBottom, 'bottom', _bindSteps);\n\n\t\t}\n\n\tfunction reset () {\n\n\t\ttotalMoves = childrenCount / elementPerView - 1;\n\t\ttotalMovesBottom = totalMoves;\n\t\ttotalMovesTop = totalMoves - totalMovesBottom;\n\n\t\tupdateArrows(_arrowTop, totalMovesTop);\n\t\tupdateArrows(_arrowBottom, totalMovesBottom);\n\n\t\tanimate(totalMovesTop);\n\n\t}\n\n\tfunction _activate () {\n\n\t\treset();\n\n\t\t_arrowTop.activate();\n\t\t_arrowBottom.activate();\n\n\t}\n\n\tfunction _deactivate () {\n\n\t\t_arrowTop.deactivate();\n\t\t_arrowBottom.deactivate();\n\n\t\treset();\n\t}\n\n\tfunction _bindSteps ( direction ) {\n\n\t\tif (totalMovesBottom >= 0) {\n\n\t\t\tif (direction === 'bottom') {\n\n\t\t\t\ttotalMovesBottom = totalMovesBottom >= 1 ? totalMovesBottom - 1 : totalMovesBottom - totalMovesBottom;\n\n\t\t\t} else {\n\n\t\t\t\ttotalMovesBottom = totalMovesTop >= 1 ? totalMovesBottom + 1 : totalMovesBottom + totalMovesTop;\n\t\t\t}\n\n\t\t\ttotalMovesTop = totalMoves - totalMovesBottom;\n\n\t\t\tanimate(totalMovesTop);\n\n\t\t\tupdateArrows(_arrowTop, totalMovesTop);\n\t\t\tupdateArrows(_arrowBottom, totalMovesBottom);\n\n\t\t}\n\t}\n\n\tfunction _goToIndex ( index ) {\n\n\t\tif ( (childrenCount - index ) < elementPerView ) {\n\n\t\t\ttotalMovesTop = totalMoves;\n\n\t\t}else {\n\n\t\t\ttotalMovesTop = (index) / elementPerView;\n\n\t\t}\n\n\t\ttotalMovesBottom = totalMoves - totalMovesTop;\n\n\t\tanimate(totalMovesTop);\n\n\t\tupdateArrows(_arrowTop, totalMovesTop);\n\t\tupdateArrows(_arrowBottom, totalMovesBottom);\n\t}\n\n\tfunction updateArrows (arrow, count) {\n\n\t\tif (count > 0) {\n\n\t\t\tarrow.animateIn();\n\n\t\t}else {\n\n\t\t\tarrow.animateOut();\n\t\t}\n\n\t}\n\n\tfunction animate ( totalMovesTop ) {\n\n\t\tTweenLite.to(_$children , ANIMATE_DURATION, {\n\t\t\ty: -(totalMovesTop * (elementPerView * eachChildrenSize)),\n\t\t\tease: Cubic.easeOut\n\t\t});\n\n\t}\n\n\treturn {\n\n\t\tgoToIndex: _goToIndex,\n\t\tactivate: _activate,\n\t\tdeactivate: _deactivate,\n\t\tbindSteps: _bindSteps\n\n\t}\n\n}\n\nmodule.exports = Navigation;\n\n\n\n\n},{\"./arrow\":10}],14:[function(require,module,exports){\n\nvar Pin = function ( parent, base, index, x, y, updateNavigation ) {\n\n\tvar\t_$parent = parent,\n\t\t_$base = base,\n\t\t_$el = _$base.clone(),\n\n\t\t_$innerText,\n\n\t\t_isActive = false;\n\n\n\tfunction _create () {\n\n\t\t_$parent.append( _$el );\n\t\t_$innerText = _$el.find('.about-locations__map__pin__number');\n\t\t_$innerText.text( index + 1 );\n\n\t\t_$el.css({\n\n\t\t\tleft: x + '%',\n\t\t\ttop: y + '%'\n\n\t\t})\n\t}\n\n\tfunction _activate () {\n\n\t\t_$el.mouseenter(updateNav);\n\t\t_$el.mouseleave(updateNav);\n\n\t}\n\n\tfunction _deactivate () {\n\n\t\t_$el.off();\n\n\t}\n\n\tfunction updateNav () {\n\n\t\tupdateNavigation(index);\n\t\t_toggleStatus();\n\t}\n\n\tfunction _toggleStatus () {\n\n\t\t_$el.toggleClass('about-locations__map-icon__active');\n\n\t\tif(_isActive) {\n\n\t\t\t_isActive = false;\n\n\t\t} else {\n\n\t\t\t_isActive = true;\n\t\t}\n\t}\n\n\treturn {\n\n\t\tcreate: _create,\n\t\tactivate: _activate,\n\t\tdeactivate: _deactivate,\n\t\ttoggleStatus: _toggleStatus\n\n\t}\n}\n\nmodule.exports = Pin;\n\n\n\n\n},{}],15:[function(require,module,exports){\nvar $ = require('jquery'),\n\teventBus = require('../core/eventBus'),\n\tmatchMedia = require('../core/events/matchMedia'),\n\tCLASS_IS_ACTIVE = 'is-active',\n\tCLASS_CONTROL_ACTIVE = 'control--active';\n\n\nexports.selector = '.js-aboutTimeline';\n\nexports.constructor = function() {\n\n\tvar _$cards,\n\t\t_$arrowLeft,\n\t\t_$arrowRight,\n\t\t_$dots,\n\t\t_cardsInView,\n\t\t_currentIndex,\n\t\t_totalIndex,\n\t\t_maxIndex;\n\n\tfunction init($el) {\n\n\t\t_$arrowLeft = $el.find('.js-aboutTimeline__previous'),\n\t\t_$arrowRight = $el.find('.js-aboutTimeline__next');\n\n\t\t_$dots = $el.find('.js-aboutTimeline__dot');\n\t\t_$cards = $el.find('.js-aboutTimeline__card');\n\n\t\t$el.hammer().on('swiperight', onLeftArrowClick);\n\t\t$el.hammer().on('swipeleft', onRightArrowClick);\n\n\t\t_currentIndex = 0;\n\t\t_totalIndex = _$dots.length - 1;\n\n\t\tupdateArrows();\n\n\t\t_$arrowLeft.click(onLeftArrowClick);\n\t\t_$arrowRight.click(onRightArrowClick);\n\n\t\t_$dots.click(onElClick);\n\t\t_$cards.click(onElClick);\n\n\t\teventBus.on(eventBus.RESIZE, onResize);\n\t}\n\n\tfunction onElClick() {\n\n\t\tvar $el = $(this);\n\n\t\tupdateIndex($el.index());\n\t}\n\n\tfunction onResize(e, newWidth) {\n\n\t\tif(newWidth >= matchMedia.LARGE_WINDOW) {\n\n\t\t\t_cardsInView = 4;\n\n\t\t} else if(newWidth >= matchMedia.MEDIUM_WINDOW) {\n\n\t\t\t_cardsInView = 2;\n\n\t\t} else {\n\n\t\t\t_cardsInView = 1;\n\t\t}\n\n\t\t_maxIndex = _totalIndex - _cardsInView + 1;\n\n\t\tredraw(true);\n\t}\n\n\tfunction onLeftArrowClick() {\n\n\t\tupdateIndex(_currentIndex - 1);\n\t}\n\n\tfunction onRightArrowClick() {\n\n\t\tupdateIndex(_currentIndex + 1);\n\t}\n\n\tfunction updateIndex(newIndex) {\n\n\t\tnewIndex = Math.max(0, Math.min(newIndex, _totalIndex));\n\n\t\tif(newIndex !== _currentIndex) {\n\n\t\t\t_currentIndex = newIndex;\n\n\t\t\tupdateEls(_$cards);\n\t\t\tupdateEls(_$dots);\n\t\t\tupdateArrows();\n\n\t\t\tredraw();\n\t\t}\n\t}\n\n\tfunction updateArrows() {\n\n\t\tif(_currentIndex === 0) {\n\n\t\t\t_$arrowLeft.hide()\n\t\t\t\t.removeClass(CLASS_CONTROL_ACTIVE);\n\n\t\t} else {\n\n\t\t\t_$arrowLeft.show()\n\t\t\t\t.addClass(CLASS_CONTROL_ACTIVE);\n\t\t}\n\n\t\tif(_currentIndex === _totalIndex) {\n\n\t\t\t_$arrowRight.hide()\n\t\t\t\t.removeClass(CLASS_CONTROL_ACTIVE);\n\n\t\t} else {\n\n\t\t\t_$arrowRight.show()\n\t\t\t\t.addClass(CLASS_CONTROL_ACTIVE);\n\t\t}\n\t}\n\n\tfunction redraw(noAnimation) {\n\n\t\tvar focusedIndex = Math.min(_currentIndex, _maxIndex),\n\t\t\tcardWidth = _$cards.width(),\n\t\t\ttime;\n\n\t\tif(noAnimation) {\n\n\t\t\ttime = 0;\n\n\t\t} else {\n\n\t\t\ttime = 0.5;\n\t\t}\n\n\t\tTweenLite.to(_$cards, time, {\n\t\t\tx: -(focusedIndex * cardWidth),\n\t\t\tease: Cubic.easeOut\n\t\t});\n\t}\n\n\tfunction updateEls($els) {\n\n\t\tvar $el,\n\t\t\ti;\n\n\t\tfor(i = 0; i < $els.length; i++) {\n\n\t\t\t$el = $($els[i]);\n\n\t\t\tif(_currentIndex === i) {\n\n\t\t\t\t$el.addClass(CLASS_IS_ACTIVE);\n\n\t\t\t} else {\n\n\t\t\t\t$el.removeClass(CLASS_IS_ACTIVE);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.init = init;\n};\n\n},{\"../core/eventBus\":1,\"../core/events/matchMedia\":2,\"jquery\":\"jquery\"}],16:[function(require,module,exports){\n// constants\nvar\n  $ = require('jquery'),\n  CLASS_IS_OPEN = 'is-open';\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.accordion__item';\n\nexports.constructor = function() {\n\n  var _$el,\n    _$toggleEl;\n\n\n\n  /* ==========================================================================\n    Initialization\n   ========================================================================== */\n\n\n  function init($el) {\n\n    _$el = $el;\n\n    _$toggleEl = _$el.find('.accordion__title').click(function() {\n      _$this = $(this);\n\n      if (_$this.next().hasClass('show')) {\n        _$this.removeClass('show');\n        _$this.next().removeClass('show');\n        _$this.next().slideUp(350);\n      } else {\n        _$this.parent().parent().find('.accordion__content').removeClass('show');\n        _$this.parent().parent().find('.accordion__title').removeClass('show');\n        _$this.parent().parent().find('.accordion__content').slideUp(350);\n        _$this.next().toggleClass('show');\n        _$this.next().slideToggle(350);\n        _$this.toggleClass('show');\n      }\n      return false;\n    });\n\n  }\n\n\n\n  /* ==========================================================================\n    Public Methods\n   =========================================================================== */\n\n\n  this.init = init;\n};\n\n},{\"jquery\":\"jquery\"}],17:[function(require,module,exports){\nvar eventBus = require('../core/eventBus'),\n\tcheckInView = require('../utils/checkInView');\n\nexports.selector = '.js-animateIn';\n\nexports.constructor = function() {\n\n\tvar _$el;\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\n\t\tvar isInView = checkInView(_$el);\n\n\t\tif(!isInView) {\n\n\t\t\t_$el.addClass('animateIn__pending');\n\t\t\teventBus.on(eventBus.SCROLL, onScroll);\n\t\t}\n\t}\n\n\tfunction onScroll() {\n\n\t\tvar isInView = checkInView(_$el);\n\n\t\tif(isInView) {\n\n\t\t\tshow();\n\n\t\t\teventBus.off(eventBus.SCROLL, onScroll);\n\t\t}\n\t}\n\n\tfunction show() {\n\n\t\t_$el.addClass('is-in-view');\n\t}\n\n\tthis.init = init;\n};\n\n},{\"../core/eventBus\":1,\"../utils/checkInView\":55}],18:[function(require,module,exports){\n\nvar Arrow = function( element, direction, _parentBind ) {\n\n\tvar _element = element,\n\t\tisActive = false;\n\n\tfunction _activate () {\n\n\t\t_element.css('display', 'block');\n\t\t_element.click( bind );\n\n\t}\n\n\tfunction _deactivate () {\n\n\t\t_element.css('display', 'none');\n\t\t_element.off();\n\n\t}\n\n\tfunction _status ( isActivated ) {\n\n\t\tif(isActive !== isActivated) {\n\n\t\t\tisActive = isActivated;\n\n\t\t\ttoggleStatus();\n\t\t}\n\t}\n\n\tfunction bind () {\n\n\t\t_parentBind(direction);\n\n\t}\n\n\n\tfunction toggleStatus() {\n\n\t\t_element.toggleClass('control--active');\n\t}\n\n\n\treturn {\n\n\t\tstatus : _status,\n\t\tactivate: _activate,\n\t\tdeactivate: _deactivate\n\n\t}\n};\n\nmodule.exports = Arrow;\n\n\n\n\n},{}],19:[function(require,module,exports){\n\nvar Arrow = function( element, direction, _parentBind ) {\n\n\tvar _element = element,\n\t\tisActive = false;\n\n\tfunction _activate () {\n\n\t\t_element.click( bind );\n\n\t}\n\n\tfunction _deactivate () {\n\t\t\n\t\t_element.off();\n\n\t}\n\n\tfunction _status ( isActivated ) {\n\n\t\tif(isActive !== isActivated) {\n\n\t\t\tisActive = isActivated;\n\n\t\t\ttoggleStatus();\n\t\t}\n\t}\n\n\tfunction bind () {\n\n\t\t_parentBind(direction);\n\n\t}\n\n\n\tfunction toggleStatus() {\n\n\t\t_element.toggleClass('control--active');\n\t}\n\n\n\treturn {\n\n\t\tstatus : _status,\n\t\tactivate: _activate,\n\t\tdeactivate: _deactivate\n\n\t}\n};\n\nmodule.exports = Arrow;\n\n\n\n\n},{}],20:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../../core/eventBus'),\n\tmatchMedia = require('../../core/events/matchMedia'),\n\tgtmDataPusher = require('../../utils/gtmDataPusher'),\n\tArrow = require('./arrow'),\n\tNavigation = require('./navigation'),\n\tjq = require('jquery'),\n\n\t// constants\n\tACTION_SWIPE = 'swipe',\n\tANIMATE_DURATION = 0.4;\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\nexports.selector = '.js-carousel';\n\nexports.constructor = function() {\n\n\t/* ==========================================================================\n\t Initialize\n\t ========================================================================== */\n\n\t// NOTE: Sizes are separted by px(pixels) and pct (percentage)\n\n\tvar fullPct = 100,\n\t\t_$el,\n\t\t_$container,\n\t\t_$allChildren,\n\t\t_$navigation,\n\t\t_$previous,\n\t\t_$next,\n\n\t\tchildrenCount,\n\t\tparentPx,\n\n\t\tchildrenMarginPx,\n\n\t\tchildrenPct,\n\t\tchildrenMarginPct,\n\n\t\t// Final Element Ptc\n\n\t\tnewParentPct,\n\t\tnewChildrenPct,\n\t\tnewMarginPtc,\n\n\t\t// Options\n\n\t\t_navigation,\n\t\t_arrowRight,\n\t\t_arrowLeft,\n\n\n\t\tdataCols,\n\t\tcarouselIsActive = false,\n\t\tcolumsPerSize,\n\n\t\t// Carousel Data\n\n\t\ttotalMoves,\n\t\ttotalMovesRight,\n\t\ttotalMovesLeft,\n\t\tresizeMoves,\n\n\t\tmovesPerSize,\n\n\t\tcurrentElementIndex = 1;\n\n\n\tfunction init($el) {\n\n\t\tvar DEFAULT_CARD_SIZE = 3;\n\n\t\t_$el = $el;\n\t\t_$container = _$el.find('.js-carousel__container');\n\t\tif (!_$container.length) {\n\n\t\t\tconsole.error('`.js-carousel` module needs a `.js-carousel__container` child.');\n\t\t\treturn\n\t\t}\n\n\t\t_$allChildren = _$container.children();\n\n\n\t\tif (!_$allChildren.length) {\n\n\t\t\tconsole.error('`.js-carousel` module requires that the `.js-carousel__container` has at least one child.');\n\t\t\treturn\n\t\t}\n\n\t\t_$navigation = _$el.find('.js-carousel__navigation');\n\n\t\t_$previous = _$el.find('.js-carousel__previous');\n\t\t_$next = _$el.find('.js-carousel__next');\n\n\t\t// Parent Values\n\n\t\tparentPx = _$container.width();\n\n\t\t// Children Values\n\t\tdataCols = _$container.data('carousel-cardsize') ? _$container.data('carousel-cardsize') : DEFAULT_CARD_SIZE;\n\t\tchildrenCount = _$allChildren.length;\n\n\t\tchildrenMarginPx = (parseFloat(_$allChildren.css('margin-right').replace('px', '')) +\n\n\t\t\tparseFloat(_$allChildren.css('margin-left').replace('px', '')));\n\n\t\teventBus.on(eventBus.MATCH_MEDIA, _resize);\n\n\t\t//\t\tInit Arrows\n\n\t\t_navigation = new Navigation(_$navigation);\n\t\t_arrowRight = new Arrow(_$next, 'right', bindSteps);\n\t\t_arrowLeft = new Arrow(_$previous, 'left', bindSteps);\n\n\t\tnavigationStyle();\n\n\n\t\t_$container.hammer().on('swiperight', function() {\n\t\t\tgtmDataPusher(_$previous.data('category'), ACTION_SWIPE, _$previous.data('label'));\n\t\t\tbindSteps('left');\n\t\t});\n\n\t\t_$container.hammer().on('swipeleft', function() {\n\t\t\tgtmDataPusher(_$next.data('category'), ACTION_SWIPE, _$next.data('label'));\n\t\t\tbindSteps('right');\n\t\t});\n\n\t\t_$el.find('.js-carousel__dot').on('click', function() {\n\t\t\tvar i = jq(this).index();\n\t\t\tbindSteps(null, i);\n\t\t});\n\n\t}\n\n\tfunction navigationStyle() {\n\n\t\tvar i;\n\n\t\tfor (i = 0; i < _$allChildren.length; i++) {\n\n\t\t\t_navigation.createDots();\n\n\t\t}\n\n\t\t_navigation.activateDot(1);\n\t}\n\n\tfunction _resize(e, resize) {\n\n\t\tif (resize >= matchMedia.LARGE_WINDOW) {\n\n\t\t\tmovesPerSize = dataCols;\n\t\t\tcolumsPerSize = dataCols;\n\n\t\t} else if (resize === matchMedia.MEDIUM_WINDOW) {\n\n\t\t\tmovesPerSize = 2;\n\t\t\tcolumsPerSize = 2;\n\n\t\t} else {\n\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1.02;\n\t\t}\n\n\t\tstyleColumns();\n\t\tstyleArrows(columsPerSize);\n\n\t\tif (childrenCount > columsPerSize) {\n\n\t\t\tresetSteps();\n\t\t\tevaluateControls();\n\t\t\tanimate(totalMovesLeft);\n\t\t\tcheckStatus(true);\n\n\t\t} else {\n\n\t\t\tcheckStatus(false);\n\t\t}\n\n\t}\n\n\tfunction styleArrows(cols) {\n\n\n\t\tif (_$allChildren.length <= cols || cols < 2) {\n\n\t\t\t_$previous.css('display', 'none');\n\t\t\t_$next.css('display', 'none');\n\n\t\t} else {\n\n\t\t\t_$previous.css('display', 'block');\n\t\t\t_$next.css('display', 'block');\n\n\t\t}\n\t}\n\n\tfunction resetSteps() {\n\n\t\ttotalMoves = ((childrenCount / movesPerSize) - 1) - ((columsPerSize / movesPerSize) - 1);\n\n\t\tresizeMoves = (currentElementIndex - 1) / movesPerSize;\n\n\t\ttotalMovesLeft = resizeMoves > totalMoves ? totalMoves : resizeMoves;\n\n\t\ttotalMovesRight = totalMoves - totalMovesLeft;\n\t}\n\n\tfunction styleColumns() {\n\n\t\tchildrenMarginPct = getPercentage(childrenMarginPx);\n\t\tchildrenPct = (fullPct / columsPerSize) - (childrenMarginPct);\n\n\t\tnewParentPct = childrenCount * (childrenPct + (childrenMarginPct * 2));\n\t\tnewMarginPtc = fullPct * childrenMarginPct / (childrenCount * childrenPct);\n\t\tnewChildrenPct = fullPct / childrenCount - (newMarginPtc * 2);\n\n\t\t_$container.css('width', newParentPct + '%');\n\t\t_$allChildren.css({\n\t\t\t'width': newChildrenPct + '%',\n\t\t\t'margin-left': newMarginPtc / 2 + '%',\n\t\t\t'margin-right': newMarginPtc / 2 + '%'\n\t\t});\n\n\t}\n\n\tfunction checkStatus(isActive) {\n\n\t\tif (carouselIsActive !== isActive) {\n\n\t\t\tcarouselIsActive = isActive;\n\n\t\t\tcarouselIsActive ? activate() : deactivate();\n\t\t}\n\t}\n\n\t/* ==========================================================================\n\n\t Calculating elements\n\n\t ========================================================================== */\n\n\tfunction getPercentage(elementSize) {\n\n\t\treturn elementSize / parentPx * fullPct;\n\n\t}\n\n\t/* ==========================================================================\n\n\t Carousel Utils\n\n\t ========================================================================== */\n\tfunction bindSteps(direction, jump) {\n\t\tif (totalMovesRight >= 0) {\n\n\t\t\ttotalMovesRight = calculateTotalMovesRight(direction === 'right', jump);\n\n\t\t\ttotalMovesLeft = totalMoves - totalMovesRight;\n\n\t\t\tcurrentElementIndex = totalMovesLeft * movesPerSize + 1;\n\n\t\t\tevaluateControls();\n\n\t\t\tanimate(totalMovesLeft);\n\n\t\t\t_navigation.activateDot(Math.round(currentElementIndex));\n\t\t}\n\n\t}\n\n\tfunction calculateTotalMovesRight(t, j) {\n\t\tvar tr;\n\t\tif (t && j===undefined) {\n\t\t\ttr = totalMovesRight >= 1 ? totalMovesRight - 1 : totalMovesRight - totalMovesRight;\n\t\t} else if (!t && j===undefined) {\n\t\t\ttr = totalMovesLeft >= 1 ? totalMovesRight + 1 : totalMovesRight + totalMovesLeft;\n\t\t} else {\n\t\t\ttr = (totalMoves - j >= 0) ? totalMoves - j : 0;\n\t\t}\n\t\treturn tr;\n\t}\n\n\tfunction evaluateControls() {\n\n\t\t_arrowRight.status(totalMovesRight > 0);\n\t\t_arrowLeft.status(totalMovesLeft > 0);\n\n\t}\n\n\tfunction animate(distance) {\n\n\t\tTweenLite.to(_$container, ANIMATE_DURATION, {\n\t\t\tx: -(distance * ((newChildrenPct + newMarginPtc) * movesPerSize)) + '%',\n\t\t\tease: Sine.easeOut\n\t\t});\n\n\t}\n\n\tfunction activate() {\n\n\t\t_arrowRight.activate();\n\t\t_arrowLeft.activate();\n\n\t}\n\n\tfunction deactivate() {\n\n\t\tresetSteps();\n\t\tanimate(0);\n\n\t\t_arrowRight.deactivate();\n\t\t_arrowLeft.deactivate();\n\n\t}\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/events/matchMedia\":2,\"../../utils/gtmDataPusher\":59,\"./arrow\":19,\"./navigation\":21,\"jquery\":\"jquery\"}],21:[function(require,module,exports){\n\nvar Navigation = function( element ) {\n\n\tvar activeNum = 0;\n\n\tfunction _createDots (e) {\n\t\tif (e) {\n\t\t\telement.append(\"<li class='carousel__navigation__dot js-carousel__dot u-issue__navigation__border u-issue--\"+e+\"'></li>\");\n\t\t} else {\n\t\t\telement.append(\"<li class='carousel__navigation__dot js-carousel__dot'></li>\");\n\t\t}\n\t}\n\n\tfunction _activateDot ( activeIndex ){\n\n\t\telement.find('.js-carousel__dot').eq(activeNum - 1).removeClass('is-active');\n\t\telement.find('.js-carousel__dot').eq(activeIndex - 1).addClass('is-active');\n\n\t\tactiveNum = activeIndex;\n\t}\n\n\treturn {\n\n\t\tcreateDots: _createDots,\n\t\tactivateDot: _activateDot\n\n\t}\n};\n\nmodule.exports = Navigation;\n\n\n\n},{}],22:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../core/eventBus');\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-contentProgressBar';\n\nexports.constructor = function() {\n\n\tvar _$el;\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init( $el ) {\n\n\t\t_$el = $el;\n\n\t\teventBus.on(eventBus.CONTENT_PROGRESS, onContentProgress);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent Handling\n\t ========================================================================== */\n\n\n\tfunction onContentProgress(e, progress) {\n\n\t\t_$el.css('transform', 'scaleX(' + progress + ')');\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n\n\n},{\"../core/eventBus\":1}],23:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../core/eventBus'),\n\n\tglobalSelectors = require('../core/globalSelectors'),\n\t_$window = globalSelectors.$window,\n\n\t// constants\n\tHEADER_OFFSET = 120,\n\tDECIMAL_ROUNDING = 100; // to round to 2 decimals\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-contentProgress';\n\nexports.constructor = function() {\n\n\tvar _contentScrollTop = 0,\n\t\t_contentHeight = 0,\n\t\t_pageScrollTop = 0,\n\t\t_currentOffset = 0,\n\t\t_currentProgress = 0,\n\t\t_$el;\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init( $el ) {\n\n\t\t_$el = $el;\n\n\t\teventBus.on(eventBus.SCROLL, onScroll);\n\t}\n\n\tfunction onScroll(e, scroll) {\n\n\t\t_contentScrollTop = _$el.offset().top - HEADER_OFFSET;\n\t\t_contentHeight = _$el[0].offsetHeight - _$window.height() + HEADER_OFFSET;\n\n\t\t_pageScrollTop = scroll.scrollTop;\n\n\t\tcalculateScroll();\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Utils\n\t =========================================================================== */\n\n\n\tfunction calculateScroll() {\n\n\t\tvar newOffset = Math.round(Math.min(_contentHeight, Math.max(0, _pageScrollTop - _contentScrollTop))),\n\t\t\tnewProgress = newOffset / _contentHeight,\n\t\t\troundedProgress = Math.round(newProgress * DECIMAL_ROUNDING) / DECIMAL_ROUNDING;\n\n\t\tif(roundedProgress !== _currentProgress || newOffset !== _currentOffset) {\n\n\t\t\t_currentProgress = roundedProgress;\n\t\t\t_currentOffset = newOffset;\n\n\t\t\teventBus.trigger(eventBus.CONTENT_PROGRESS, [_currentProgress, _currentOffset]);\n\t\t}\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Public Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n\n};\n\n\n\n},{\"../core/eventBus\":1,\"../core/globalSelectors\":6}],24:[function(require,module,exports){\nvar DISQUS_SHORTNAME = 'theaspeninstitute',\n\tCLASS_IS_ACTIVE = 'is-active';\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-disqusToggle';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$cta,\n\t\t_discusConfig;\n\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\tvar url,\n\t\t\tidentifier,\n\t\t\ttitle;\n\n\t\t_$el = $el;\n\t\t_$cta = _$el.find('.js-disqusToggle__cta');\n\n\t\turl = _$el.data('url');\n\t\tidentifier = _$el.data('identifier');\n\t\ttitle = _$el.data('title');\n\n\t\t_discusConfig = function() {\n\n\t\t\tthis.page.url = url;\n\t\t\tthis.page.identifier = identifier;\n\t\t\tthis.page.title = title;\n\t\t};\n\n\t\t_$cta.click(onCtaClick);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent Handling\n\t =========================================================================== */\n\n\n\tfunction onCtaClick() {\n\n\t\t_$cta.off();\n\t\t_$el.addClass(CLASS_IS_ACTIVE);\n\n\t\tinjectScript();\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tHelpers\n\t =========================================================================== */\n\n\n\tfunction injectScript() {\n\n\t\tvar scriptFrame = document.createElement('script'),\n\t\t\tdate = new Date();\n\n\t\tscriptFrame.src = '//'+ DISQUS_SHORTNAME +'.disqus.com/embed.js';\n\n\t\t// needs to be globally accessible so Disqus can do its magic\n\t\twindow.disqus_config = _discusConfig;//eslint-disable-line camelcase\n\n\t\tscriptFrame.setAttribute('data-timestamp', date.getTime());\n\t\t(document.head || document.body).appendChild(scriptFrame);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{}],25:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../../core/eventBus'),\n\tmatchMedia = require('../../core/events/matchMedia'),\n\tgtmDataPusher = require('../../utils/gtmDataPusher'),\n\tArrow = require('../arrow'),\n\tNavigation = require('../carousel/navigation'),\n\tjq = require('jquery'),\n\n\t// constants\n\n\tACTION_SWIPE = 'swipe',\n\tANIMATE_DURATION = 0.5;\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\nexports.selector = '.js-featured-events';\n\nexports.constructor = function() {\n\n\t/* ==========================================================================\n\t Initialize\n\t ========================================================================== */\n\n\t// NOTE: Sizes are separted by px(pixels) and pct (percentage)\n\n\tvar fullPct = 100,\n\n\t\t_$el,\n\t\t_$container,\n\t\t_$allChildren,\n\t\t_$previous,\n\t\t_$next,\n\t\t_$navigation,\n\n\t\tchildrenCount,\n\t\tparentPx,\n\n\t\tchildrenMarginPx,\n\n\t\tchildrenPct,\n\t\tchildrenMarginPct,\n\n\t\t// Final Element Ptc\n\n\t\tnewParentPct,\n\t\tnewChildrenPct,\n\t\tnewMarginPtc,\n\n\t\t// Options\n\n\t\t_arrowRight,\n\t\t_arrowLeft,\n\t\t_navigation,\n\n\n\t\tcarouselIsActive = false,\n\t\tcolumsPerSize,\n\n\t\t// Carousel Data\n\n\t\ttotalMoves,\n\t\ttotalMovesRight,\n\t\ttotalMovesLeft,\n\t\tresizeMoves,\n\n\t\tmovesPerSize,\n\n\t\tcurrentElementIndex = 1;\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\n\t\t_$container = _$el.find('.js-featured-events__container');\n\t\t_$allChildren = _$container.children();\n\n\t\t_$previous = _$el.find('.featured-events__arrow--left');\n\t\t_$next = _$el.find('.featured-events__arrow--right');\n\t\t_$navigation = _$el.find('.js-carousel__navigation');\n\n\t\t// Parent Values\n\n\t\tparentPx = _$container.width();\n\n\t\t// Children Values\n\n\t\tchildrenCount = _$allChildren.length;\n\n\t\tchildrenMarginPx = (parseFloat(_$allChildren.css('margin-right').replace('px', '')) +\n\n\t\t\tparseFloat(_$allChildren.css('margin-left').replace('px', '')));\n\n\t\teventBus.on(eventBus.MATCH_MEDIA, _resize);\n\n\t\t//\t\tInit Arrows\n\n\t\t_navigation = new Navigation(_$navigation);\n\t\t_arrowRight = new Arrow(_$next, 'right', bindSteps);\n\t\t_arrowLeft = new Arrow(_$previous, 'left', bindSteps);\n\n\t\tnavigationStyle();\n\n\t\t_$el.hammer().on('swiperight', function() {\n\n\t\t\tgtmDataPusher(_$previous.data('category'), ACTION_SWIPE, _$previous.data('label'));\n\t\t\tbindSteps('left');\n\t\t});\n\n\t\t_$el.hammer().on('swipeleft', function() {\n\n\t\t\tgtmDataPusher(_$next.data('category'), ACTION_SWIPE, _$next.data('label'));\n\t\t\tbindSteps('right');\n\t\t});\n\n\t\t_$el.find('.js-carousel__dot').on('click', function() {\n\t\t\tvar i = jq(this).index();\n\t\t\tbindSteps(null, i);\n\t\t});\n\n\n\t}\n\n\tfunction navigationStyle() {\n\n\t\tif (_$allChildren.length === 1) {\n\t\t\treturn;\n\t\t}\n\t\tvar i;\n\n\t\tfor (i = 0; i < _$allChildren.length; i++) {\n\t\t\t_navigation.createDots(_$allChildren.eq(i).data('navigation-dot-color'));\n\t\t}\n\n\t\t_navigation.activateDot(1);\n\t}\n\n\n\tfunction _resize(e, resize) {\n\n\t\tif (resize >= matchMedia.LARGE_WINDOW) {\n\n\t\t\tmovesPerSize = 2;\n\t\t\tcolumsPerSize = 3;\n\n\t\t} else if (resize === matchMedia.MEDIUM_WINDOW) {\n\n\t\t\tmovesPerSize = 2;\n\t\t\tcolumsPerSize = 2;\n\n\t\t} else {\n\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1.1;\n\t\t}\n\n\t\tstyleColumns();\n\n\t\tif (childrenCount > columsPerSize) {\n\n\t\t\tresetSteps();\n\t\t\tcheckStatus(true);\n\n\n\t\t} else {\n\n\t\t\tcheckStatus(false);\n\n\t\t}\n\t}\n\n\tfunction resetSteps() {\n\n\t\ttotalMoves = ((childrenCount / movesPerSize) - 1) - ((columsPerSize / movesPerSize) - 1);\n\n\t\tresizeMoves = (currentElementIndex - 1) / movesPerSize;\n\n\t\ttotalMovesLeft = resizeMoves > totalMoves ? totalMoves : resizeMoves;\n\n\t\ttotalMovesRight = totalMoves - totalMovesLeft;\n\n\t\tevaluateControls();\n\t\tanimate(totalMovesLeft);\n\n\t}\n\n\tfunction styleColumns() {\n\n\t\tchildrenMarginPct = getPercentage(childrenMarginPx);\n\t\tchildrenPct = (fullPct / columsPerSize) - (childrenMarginPct);\n\n\t\tnewParentPct = childrenCount * (childrenPct + (childrenMarginPct * 2));\n\t\tnewMarginPtc = fullPct * childrenMarginPct / (childrenCount * childrenPct);\n\t\tnewChildrenPct = fullPct / childrenCount - (newMarginPtc * 2);\n\n\t\t_$container.css('width', newParentPct + '%');\n\t\t_$allChildren.css({\n\t\t\t'width': newChildrenPct + '%',\n\t\t\t'margin': newMarginPtc / 2 + '%'\n\t\t});\n\n\t}\n\n\tfunction checkStatus(isActive) {\n\n\t\tif (carouselIsActive !== isActive) {\n\n\t\t\tcarouselIsActive = isActive;\n\n\t\t\tcarouselIsActive ? activate() : deactivate();\n\t\t}\n\t}\n\n\t/* ==========================================================================\n\n\t Calculating elements\n\n\t ========================================================================== */\n\n\tfunction getPercentage(elementSize) {\n\n\t\treturn elementSize / parentPx * fullPct;\n\n\t}\n\n\t/* ==========================================================================\n\n\t Carousel Utils\n\n\t ========================================================================== */\n\n\tfunction bindSteps(direction, jump) {\n\t\tif (totalMovesRight >= 0) {\n\n\t\t\ttotalMovesRight = calculateTotalMovesRight(direction === 'right', jump);\n\n\t\t\ttotalMovesLeft = totalMoves - totalMovesRight;\n\n\t\t\tcurrentElementIndex = totalMovesLeft * movesPerSize + 1;\n\n\t\t\tevaluateControls();\n\n\t\t\tanimate(totalMovesLeft);\n\n\t\t\t_navigation.activateDot(Math.round(currentElementIndex));\n\t\t}\n\n\t}\n\n\tfunction calculateTotalMovesRight(t, j) {\n\t\tvar tr;\n\t\tif (t && j===undefined) {\n\t\t\ttr = totalMovesRight >= 1 ? totalMovesRight - 1 : totalMovesRight - totalMovesRight;\n\t\t} else if (!t && j===undefined) {\n\t\t\ttr = totalMovesLeft >= 1 ? totalMovesRight + 1 : totalMovesRight + totalMovesLeft;\n\t\t} else {\n\t\t\ttr = (totalMoves - j >= 0) ? totalMoves - j : 0;\n\t\t}\n\t\treturn tr;\n\t}\n\n\tfunction evaluateControls() {\n\n\t\t_arrowRight.status(totalMovesRight > 0);\n\t\t_arrowLeft.status(totalMovesLeft > 0);\n\n\t}\n\n\tfunction animate(distance) {\n\n\t\tTweenLite.to(_$container, ANIMATE_DURATION, {\n\t\t\tx: -(distance * ((newChildrenPct + newMarginPtc) * movesPerSize)) + '%',\n\t\t\tease: Cubic.easeOut\n\t\t});\n\n\t}\n\n\tfunction activate() {\n\n\t\t_arrowRight.activate();\n\t\t_arrowLeft.activate();\n\n\t}\n\n\tfunction deactivate() {\n\n\t\tresetSteps();\n\t\t_arrowRight.deactivate();\n\t\t_arrowLeft.deactivate();\n\n\t}\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/events/matchMedia\":2,\"../../utils/gtmDataPusher\":59,\"../arrow\":18,\"../carousel/navigation\":21,\"jquery\":\"jquery\"}],26:[function(require,module,exports){\nvar MAX_HEIGHT = 500,\n\tCLASS_IS_FADED = 'is-faded';\n\nexports.selector = '.js-fadingText';\n\nexports.constructor = function() {\n\n\tvar _$el,\n\t\t_$wrapper,\n\t\t_$button;\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_$wrapper = _$el.find('.js-fadingText__wrapper');\n\t\t_$button = _$el.find('.js-fadingText__button');\n\n\t\tif(_$wrapper.height() >= MAX_HEIGHT) {\n\n\t\t\t_$el.addClass(CLASS_IS_FADED);\n\t\t\t_$button.click(expandBlock);\n\t\t}\n\t}\n\n\tfunction expandBlock() {\n\n\t\t_$el.removeClass(CLASS_IS_FADED);\n\t}\n\n\tthis.init = init;\n\n};\n\n\n\n\n},{}],27:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../../core/eventBus');\n\n\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-clearFilter';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_filterType,\n\t\t_filterId;\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_filterType = _$el.data('filter-type');\n\t\t_filterId = _$el.data('filter-id');\n\n\t\t_$el.click(onClick);\n\n\t\teventBus.on(eventBus.FILTER_REQUEST, onFilterRequest);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent handling\n\t ========================================================================== */\n\n\n\tfunction onFilterRequest() {\n\n\t\teventBus.off(eventBus.FILTER_REQUEST, onFilterRequest);\n\t\t_$el.off();\n\n\t\t_filterType = null;\n\t\t_$el = null;\n\t}\n\n\tfunction onClick(e) {\n\n\t\te.preventDefault();\n\n\t\t_$el.parent().remove();\n\n\t\teventBus.trigger(eventBus.FILTER_CLEAR_FIELD, [_filterType, _filterId]);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1}],28:[function(require,module,exports){\n// Project dependencies\nvar filter = require('../../core/filter');\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-filterAnchor';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_filterUrl;\n\n\n\n\t/* ==========================================================================\n\t    Initialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_filterUrl = _$el.attr('href');\n\n\t\t_$el.click(onClick);\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Event handling\n\t ========================================================================== */\n\n\n\tfunction onClick(e) {\n\n\t\te.preventDefault();\n\n\t\tfilter.load(_filterUrl);\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Public Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/filter\":5}],29:[function(require,module,exports){\n// Project dependencies\nvar $ = require('jquery'),\n\tmoduleFactory = require('../../core/moduleFactory'),\n\tLoader = require('../../utils/Loader'),\n\tparseLoadedResponse = require('../../utils/parseLoadedResponse'),\n\teventBus = require('../../core/eventBus'),\n\n\t// constants\n\tSELECTOR_CONTENT = '.js-filterContent',\n\tSELECTOR_LOADER = '.js-filterContent__loader',\n\tCLASS_IS_FILTERING = 'is-filtering';\n\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\n\nexports.selector = SELECTOR_CONTENT;\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_loader;\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\tvar $loader = $(SELECTOR_LOADER);\n\n\t\tif(!$loader.length) {\n\t\t\tconsole.error('`' + SELECTOR_CONTENT + '` module needs a `' + SELECTOR_LOADER + '` to show a loading animation.');\n\t\t\treturn\n\t\t}\n\n\n\t\t_$el = $el;\n\t\t_loader = new Loader();\n\t\t_loader.init($loader);\n\n\t\teventBus.on(eventBus.FILTER_REQUEST, onFilterRequest);\n\t\teventBus.on(eventBus.FILTER_READY, onFilterReady);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent handling\n\t ========================================================================== */\n\n\tfunction onFilterRequest() {\n\n\t\t_$el.addClass(CLASS_IS_FILTERING);\n\t\tTweenLite.delayedCall(0.1, _loader.show, undefined, _loader);//eslint-disable-line no-magic-numbers\n\t}\n\n\tfunction onFilterReady(e, response) {\n\n\t\tvar parsedResponse = parseLoadedResponse(response, SELECTOR_CONTENT);\n\n\t\t_loader.hide()\n\t\t\t.then(_loader.dispose)\n\t\t\t.then(function(){\n\n\t\t\t\t_$el.html(parsedResponse);\n\n\t\t\t\t_loader.init($(SELECTOR_LOADER));\n\n\t\t\t\t_$el.removeClass(CLASS_IS_FILTERING);\n\n\t\t\t\tmoduleFactory.run(_$el);\n\t\t\t});\n\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/moduleFactory\":8,\"../../utils/Loader\":54,\"../../utils/parseLoadedResponse\":60,\"jquery\":\"jquery\"}],30:[function(require,module,exports){\n// Project dependencies\nvar getUrlParameter = require('../../utils/getUrlParameter'),\n\n// constants\n\tCLASS_IS_DISABLED = 'is-disabled',\n\n\tSELECTOR_SELECT_CONTAINER = '.js-filterEventDropdowns__container',\n\tSELECTOR_COUNTRIES = '.js-filterEventDropdowns__countries',\n\t// SELECTOR_LOCATIONS = '.js-filterEventDropdowns__locations',\n\tSELECTOR_CITY_DATA = '.js-filterEventDropdowns__citiesData',\n\tSELECTOR_CITIES = '.js-filterEventDropdowns__cities';\n\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-filterEventDropdowns';\n\nexports.constructor = function() {\n\n\n\tvar _$parent,\n\t\t_$countries,\n\t\t_$cities,\n\t\t_cityData;\n\t\t// _$locations;\n\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\tvar $cityData;\n\n\t\t_$parent = $el;\n\n\t\t_$countries = _$parent.find(SELECTOR_COUNTRIES);\n\t\t_$cities = _$parent.find(SELECTOR_CITIES);\n\t\t// _$locations = _$parent.find(SELECTOR_LOCATIONS);\n\t\t_$countries.change(onCountryChange);\n\n\t\t$cityData = _$parent.find(SELECTOR_CITY_DATA);\n\t\t_cityData = JSON.parse($cityData.html());\n\n\t\tupdateCities(getUrlParameter('city'));\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent handling\n\t ========================================================================== */\n\n\n\tfunction onCountryChange() {\n\n\t\tupdateCities();\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tHelpers\n\t ========================================================================== */\n\n\n\tfunction createOptionsInSelect(options, initialValue, $select) {\n\n\t\tvar $selectContainer = $select.closest(SELECTOR_SELECT_CONTAINER),\n\t\t\tinitialOption = composeOptionEl('', $select.data('initial-label')),\n\t\t\tisDisabled = options.length === 0,\n\t\t\toptionsMarkup = initialOption,\n\t\t\ti = 0,\n\t\t\tisSelected,\n\t\t\toptionData;\n\n\t\tfor(i; i < options.length; i++) {\n\n\t\t\toptionData = options[i];\n\t\t\tisSelected = initialValue === optionData.id;\n\t\t\toptionsMarkup += composeOptionEl(optionData.id, optionData.label, isSelected);\n\t\t}\n\n\n\t\tif(isDisabled) {\n\n\t\t\t$selectContainer.addClass(CLASS_IS_DISABLED);\n\t\t\t$select.attr('disabled', '');\n\n\t\t} else {\n\n\t\t\t$selectContainer.removeClass(CLASS_IS_DISABLED);\n\t\t\t$select.removeAttr('disabled');\n\t\t}\n\t\t$select.html(optionsMarkup);\n\t}\n\n\tfunction updateCities(initialValue) {\n\n\t\tvar countryValue = _$countries.val(),\n\t\t\tcities;\n\n\t\tif(countryValue === '') {\n\n\t\t\tcities = [];\n\n\t\t} else {\n\n\t\t\tcities = _cityData[countryValue];\n\t\t}\n\n\t\tcreateOptionsInSelect(cities, initialValue, _$cities);\n\t}\n\n\tfunction composeOptionEl(value, label, isSelected) {\n\n\t\tvar selected = isSelected ? 'selected' : '';\n\n\t\treturn '<option value=\"' + value + '\" ' + selected + '>' + label + '</option>';\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../utils/getUrlParameter\":58}],31:[function(require,module,exports){\n// Project dependencies\nvar $ = require('jquery'),\n\tfilterRadioCheckbox = require('./filterRadioCheckbox'),\n\teventBus = require('../../core/eventBus'),\n\tfilter = require('../../core/filter'),\n\tgetURLParameter = require('../../utils/getUrlParameter'),\n\tgtmDataPusher = require('../../utils/gtmDataPusher'),\n\n\t// constants\n\tSELECTOR_INPUT = '.js-filterForm__input',\n\n\tTYPE_SELECT = 'select',\n\tTYPE_DATE = 'date',\n\tTYPE_RADIOCHECK = 'radiocheck';\n\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-filterEventsForm';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$inputs,\n\t\t_lastSelect;\n\n\n\n\t/* ==========================================================================\n\t    Initialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_$inputs = _$el.find(SELECTOR_INPUT);\n\t\t_$inputs.each(preFillInputs);\n\n\t\t_$el.submit(onSubmit);\n\t\teventBus.on(eventBus.FILTER_CLEAR_FIELD, onClearField);\n\t\t/* eslint-disable */\n\n\t\tif (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) {\n\t\t} else {\n\t\t\t//jQuery here is the older version of jQuery shipped with wordpress that contains jQuery UI\n\t\t\tjQuery('.filter__input--date').each(function() {\n\t\t\t\tthis.type = 'text';\n\t\t\t\tif (jQuery(this).val() !== '') {\n\t\t\t\t\tvar d = new Date(jQuery(this).val())\n\t\t\t\t\td = jQuery.datepicker.formatDate(jQuery(this).data('format'), new Date(d.getTime() + new Date(d).getTimezoneOffset() * 60000)); //eslint-disable-line\n\t\t\t\t\tthis.value = d;\n\t\t\t\t}\n\t\t\t});\n\t\t\tjQuery('.filter__input--select').selectmenu();\n\t\t\t_$datePicker = jQuery('.datepicker-container');\n\t\t\t_$startDate = jQuery('input[name=startdate]');\n\t\t\t_$endDate = jQuery('input[name=enddate]');\n\t\t\t_clearDates = _$el.find('.js-clearDates');\n\t\t\t_$datePicker.datepicker({\n\t\t\t\tdateFormat: 'mm/dd/y',\n\t\t\t\tdayNamesMin: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n\t\t\t\tappendText: '(mm/dd/yyyy)',\n\t\t\t\tshowOtherMonths: true,\n\t\t\t\tselectOtherMonths: true,\n\t\t\t\tfirstDay: 0,\n\t\t\t\tdefaultDate: '0',\n\t\t\t\tbeforeShowDay: function(date) {\n\t\t\t\t\tvar date1 = jQuery.datepicker.parseDate(_$datePicker.datepicker('option', 'dateFormat'), _$startDate.val());\n\t\t\t\t\tvar date2 = jQuery.datepicker.parseDate(_$datePicker.datepicker('option', 'dateFormat'), _$endDate.val());\n\n\t\t\t\t\tvar isHighlight =\n\t\t\t\t\t\tdate1 && ((date2 && date > date1 && date < date2));\n\t\t\t\t\tvar isSelect = date1 && ((date.getTime() == date1.getTime()) || (date2 && date >= date1 && date <= date2));\n\t\t\t\t\treturn [true, isHighlight ? 'dp-highlight' : (isSelect ? 'dp-select' : '')];\n\t\t\t\t},\n\t\t\t\tonSelect: function(dateText, inst) {\n\t\t\t\t\tvar date1 = jQuery.datepicker.parseDate(_$datePicker.datepicker('option', 'dateFormat'), _$startDate.val());\n\t\t\t\t\tvar date2 = jQuery.datepicker.parseDate(_$datePicker.datepicker('option', 'dateFormat'), _$endDate.val());\n\t\t\t\t\tvar selectedDate = jQuery.datepicker.parseDate(_$datePicker.datepicker('option', 'dateFormat'), dateText);\n\n\t\t\t\t\tif (_lastSelect && _lastSelect.hasClass('js-start__date')) {\n\t\t\t\t\t\t_$startDate.val(dateText);\n\t\t\t\t\t\tjQuery(this).datepicker();\n\t\t\t\t\t\t_$datePicker.hide();\n\t\t\t\t\t} else if (selectedDate < date1) {\n\t\t\t\t\t\t_$endDate.val(_$startDate.val());\n\t\t\t\t\t\t_$startDate.val(dateText);\n\t\t\t\t\t\tjQuery(this).datepicker();\n\t\t\t\t\t\t_$datePicker.hide();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_$endDate.val(dateText);\n\t\t\t\t\t\tjQuery(this).datepicker();\n\t\t\t\t\t\t_$datePicker.hide();\n\t\t\t\t\t}\n\n\t\t\t\t\t_lastSelect.addClass('date-set')\n\n\t\t\t\t\t// _$datePicker.addClass('date-set')\n\n\t\t\t\t}\n\t\t\t});\n\t\t\t_$datePicker.hide();\n\t\t\t_$startDate.on('focus', function() {\n\t\t\t\t_lastSelect = jQuery(this);\n\t\t\t\tif (_$datePicker.is(':hidden')) {\n\t\t\t\t\t_$datePicker.show();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_$endDate.on('focus', function() {\n\t\t\t\t_lastSelect = jQuery(this);\n\t\t\t\tif (_$datePicker.is(':hidden')) {\n\t\t\t\t\t_$datePicker.show();\n\t\t\t\t}\n\t\t\t});\n\t\t\t_clearDates.on('click', function() {\n\t\t\t\t_lastSelect = null;\n\t\t\t\tjQuery(this).siblings('input').removeClass(\"date-set\").val('')\n\t\t\t\t_$datePicker.datepicker(\"refresh\");\n\n\t\t\t});\n\n\t\t\tjQuery('.filter__input--select').selectmenu('refresh')\n\t\t\t\t/* eslint-enable */\n\t\t}\n\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Event handling\n\t ========================================================================== */\n\n\n\tfunction onSubmit(e) {\n\n\t\te.preventDefault();\n\t\tfilterContent();\n\t}\n\n\n\tfunction onClearField(e, filterName, filterId) {\n\n\n\t\tvar $input,\n\t\t\tname,\n\t\t\ttype,\n\t\t\tmultiFilter = filterName.split(','),\n\t\t\tisMultiFilter = multiFilter.length > 1,\n\t\t\ti = 0,\n\t\t\tisCleared = false,\n\t\t\tj;\n\n\t\tfor (i; i < _$inputs.length; i++) {\n\n\t\t\t$input = $(_$inputs[i]);\n\t\t\tname = $input.attr('name');\n\n\t\t\tif (isMultiFilter) {\n\n\t\t\t\tfor (j = 0; j < multiFilter.length; j++) {\n\n\t\t\t\t\tclearFilterName(multiFilter[j], name);\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tclearFilterName(filterName, name);\n\t\t\t}\n\t\t}\n\n\t\tif (isCleared) {\n\n\t\t\tfilterContent();\n\t\t}\n\n\t\tfunction clearFilterName(filterName, name) {\n\n\t\t\tif (filterName === '*' || name === filterName) {\n\n\t\t\t\tisCleared = true;\n\t\t\t\ttype = $input.attr('type');\n\n\t\t\t\tif (type === TYPE_RADIOCHECK) {\n\n\t\t\t\t\tclearMultiCheck($input, filterId);\n\n\t\t\t\t} else if ($input.data('type') === TYPE_DATE) {\n\n\t\t\t\t\tclearInput($input);\n\t\t\t\t\t$input[0].dispatchEvent(new Event('change'));\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearInput($input);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Helpers\n\t ========================================================================== */\n\n\n\tfunction clearInput($input) {\n\n\t\t$input.val('');\n\t}\n\n\tfunction clearMultiCheck($input, filterId) {\n\n\t\t$input.trigger(filterRadioCheckbox.EVENT_CLEAR, filterId);\n\t}\n\n\tfunction filterContent() {\n\n\t\tfilter.load(composeFilterQuery());\n\t}\n\n\tfunction composeFilterQuery() {\n\n\t\tvar query = '',\n\t\ti = 0,\n\t\tanalyticsArray = [],\n\t\tdateString = \"\";\n\n\t\t_$inputs.each(function(index, inputEl) {\n\n\t\t\t\tvar $input = $(inputEl),\n\t\t\t\t\ttype = $input.attr('type'),\n\t\t\t\t\tname = $input.attr('name'),\n\t\t\t\t\tvalue = getValueByType($input, type);\n\n\t\t\t\tif (value !== '' && value !== 0) {\n\t\t\t\t\tappendToQuery(name, value);\n\t\t\t\t\tif (name === \"issue\") {\n\t\t\t\t\t\tanalyticsArray.push({\n\t\t\t\t\t\t\t\"action\": \"Issues\",\n\t\t\t\t\t\t\t\"label\": $input.find(\":checked\").data(\"pretty-label\")\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if (name === \"startdate\" || name === \"enddate\") {\n\t\t\t\t\t\tif (dateString === \"\") {\n\t\t\t\t\t\t\tdateString += $input.val()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdateString += \" - \" + $input.val()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (name === \"country\") {\n\t\t\t\t\tanalyticsArray.push({\n\t\t\t\t\t\t\"action\": \"Location\",\n\t\t\t\t\t\t\"label\": $input.find(\"option:selected\").text()\n\t\t\t\t\t});\n\t\t\t\t} else if (name === \"host\") {\n\t\t\t\t\tanalyticsArray.push({\n\t\t\t\t\t\t\"action\": \"Host\",\n\t\t\t\t\t\t\"label\": $input.find(\"option:selected\").text()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t});\n\t\tif (dateString !== \"\") {\n\t\t\tanalyticsArray.push({\n\t\t\t\t\"action\": \"Date\",\n\t\t\t\t\"label\": dateString\n\t\t\t})\n\t\t}\n\n\t\tfor (i = 0; i < analyticsArray.length; i++) {\n\t\t\tgtmDataPusher(\"Filter\", analyticsArray[i].action, analyticsArray[i].label);\n\t\t}\n\n\t\treturn query;\n\n\n\t\tfunction appendToQuery(name, value) {\n\n\t\t\tvar prefix = query.length === 0 ? '' : '&';\n\n\t\t\tquery += prefix + name + '=' + value;\n\t\t}\n\n\t\tfunction getValueByType($input, type) {\n\n\t\t\tvar value;\n\n\t\t\tswitch (type) {\n\n\t\t\t\tcase 'text':\n\t\t\t\t\tvalue = getDateValue($input);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date':\n\t\t\t\t\tvalue = getDateValue($input);\n\t\t\t\t\tbreak;\n\t\t\t\tcase TYPE_SELECT:\n\t\t\t\t\tvalue = $input.val();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TYPE_RADIOCHECK:\n\t\t\t\t\tvalue = $input.data('value');\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error('Type `' + type + '` is not supported in events filter.');\n\t\t\t}\n\n\t\t\treturn value\n\t\t}\n\t}\n\n\tfunction getDateValue($input) {\n\n\t\tvar value = $input.val(),\n\t\t\tdate,\n\t\t\tday,\n\t\t\tmonth,\n\t\t\tyear;\n\n\t\tif (value !== '') {\n\t\t\tdate = new Date(value);\n\t\t\tday = doubleDigitString(date.getDate());\n\t\t\tmonth = doubleDigitString(date.getMonth() + 1);\n\t\t\tyear = String(date.getFullYear()); //eslint-disable-line no-magic-numbers\n\t\t\tvalue = [year, month, day].join('-');\n\t\t}\n\n\n\n\t\treturn value;\n\t}\n\n\t// function getTextValue($input) {\n\t//\n\t// \treturn encodeURIComponent($input.val());\n\t// }\n\n\tfunction preFillInputs(index, inputEl) {\n\n\t\tvar $input = $(inputEl),\n\t\t\tparamKey = $input.attr('name'),\n\t\t\tinitialValue = getURLParameter(paramKey);\n\t\tif (initialValue !== undefined) {\n\n\t\t\t// Drop downs do their own pre-filling in filterEventDropdown.js.\n\t\t\t// They're JSON based so we're not sure if and when their data is available\n\t\t\tif ($input.attr('type') === TYPE_RADIOCHECK) {\n\n\t\t\t\t$input.trigger(filterRadioCheckbox.EVENT_UPDATE, initialValue);\n\n\t\t\t} else if ($input.data('type') !== TYPE_DATE) {\n\t\t\t\t$input.val(initialValue);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction doubleDigitString(number) {\n\n\t\tvar prepend = '';\n\n\t\tif (number < 10) { //eslint-disable-line no-magic-numbers\n\n\t\t\tprepend = '0';\n\t\t}\n\n\t\treturn prepend + number;\n\t}\n\n\n\n\n\t/* ==========================================================================\n\t    Public Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/filter\":5,\"../../utils/getUrlParameter\":58,\"../../utils/gtmDataPusher\":59,\"./filterRadioCheckbox\":35,\"jquery\":\"jquery\"}],32:[function(require,module,exports){\n// Project dependencies\nvar $ = require('jquery'),\n\tfilterMultiSelect = require('./filterMultiSelect'),\n\teventBus = require('../../core/eventBus'),\n\tfilter = require('../../core/filter'),\n\tgetURLParameter = require('../../utils/getUrlParameter'),\n\n\t// constants\n\tSELECTOR_INPUT = '.js-filterForm__input',\n\n\tTYPE_SELECT = 'select',\n\tTYPE_DATE = 'date',\n\tTYPE_MULTICHECK = 'multicheck';\n\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-filterForm';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$inputs;\n\n\n\n\t/* ==========================================================================\n\t    Initialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\n\t\t_$el = $el;\n\t\t_$inputs = _$el.find(SELECTOR_INPUT);\n\n\t\t_$inputs.each(preFillInputs);\n\n\t\t_$el.submit(onSubmit);\n\t\teventBus.on(eventBus.FILTER_CLEAR_FIELD, onClearField);\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Event handling\n\t ========================================================================== */\n\n\n\tfunction onSubmit(e) {\n\n\t\te.preventDefault();\n\n\t\tfilterContent();\n\t}\n\n\tfunction onClearField(e, filterName, filterId) {\n\n\n\t\tvar $input,\n\t\t\tname,\n\t\t\ttype,\n\t\t\tmultiFilter = filterName.split(','),\n\t\t\tisMultiFilter = multiFilter.length > 1,\n\t\t\ti = 0,\n\t\t\tisCleared = false,\n\t\t\tj;\n\n\t\tfor(i; i < _$inputs.length; i++) {\n\n\t\t\t$input = $(_$inputs[i]);\n\t\t\tname = $input.attr('name');\n\n\t\t\tif(isMultiFilter) {\n\n\t\t\t\tfor(j = 0; j < multiFilter.length; j++) {\n\n\t\t\t\t\tclearFilterName(multiFilter[j], name);\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tclearFilterName(filterName, name);\n\t\t\t}\n\t\t}\n\n\t\tif(isCleared) {\n\n\t\t\tfilterContent();\n\t\t}\n\n\t\tfunction clearFilterName(filterName, name) {\n\n\t\t\tif(filterName === '*' || name === filterName) {\n\n\t\t\t\tisCleared = true;\n\t\t\t\ttype = $input.attr('type');\n\n\t\t\t\tif(type === TYPE_MULTICHECK) {\n\n\t\t\t\t\tclearMultiCheck($input, filterId);\n\n\t\t\t\t} else if($input.data('type') === TYPE_DATE) {\n\n\t\t\t\t\tclearInput($input);\n\t\t\t\t\t$input[0].dispatchEvent(new Event('change'));\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearInput($input);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Helpers\n\t ========================================================================== */\n\n\n\tfunction clearInput($input) {\n\n\t\t$input.val('');\n\t}\n\n\tfunction clearMultiCheck($input, filterId) {\n\n\t\t$input.trigger(filterMultiSelect.EVENT_CLEAR, filterId);\n\t}\n\n\tfunction filterContent() {\n\n\t\tfilter.load(composeFilterQuery());\n\t}\n\n\tfunction composeFilterQuery() {\n\n\t\tvar query = '';\n\n\t\t_$inputs.each(function(index, inputEl) {\n\n\t\t\tvar $input = $(inputEl),\n\t\t\t\ttype = $input.attr('type'),\n\t\t\t\tname = $input.attr('name'),\n\t\t\t\tvalue = getValueByType($input, type);\n\n\t\t\tif(value !== '') {\n\n\t\t\t\tappendToQuery(name, value);\n\t\t\t}\n\t\t});\n\n\t\treturn query;\n\n\n\t\tfunction appendToQuery(name, value) {\n\n\t\t\tvar prefix = query.length === 0 ? '' : '&';\n\n\t\t\tquery += prefix + name + '=' + value;\n\t\t}\n\n\t\tfunction getValueByType($input, type) {\n\n\t\t\tvar value;\n\n\t\t\tswitch(type) {\n\n\t\t\t\tcase 'text': value = getTextValue($input); break;\n\t\t\t\tcase 'date': value = getDateValue($input); break;\n\t\t\t\tcase TYPE_SELECT: value = $input.val(); break;\n\t\t\t\tcase TYPE_MULTICHECK: value = $input.data('value'); break;\n\t\t\t\tdefault: console.error('Type `' + type + '` is not supported in filter.');\n\t\t\t}\n\n\t\t\treturn value\n\t\t}\n\t}\n\n\tfunction getDateValue($input) {\n\n\t\tvar value = $input.val(),\n\t\t\tdate,\n\t\t\tday,\n\t\t\tmonth,\n\t\t\tyear;\n\n\t\tif(value !== '') {\n\n\t\t\tdate = new Date(value);\n\t\t\tday = doubleDigitString(date.getDate());\n\t\t\tmonth = doubleDigitString(date.getMonth() + 1);\n\t\t\tyear = String(date.getFullYear()).substr(-2);//eslint-disable-line no-magic-numbers\n\n\t\t\tvalue = day+month+year;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tfunction getTextValue($input) {\n\n\t\treturn encodeURIComponent($input.val());\n\t}\n\n\tfunction preFillInputs(index, inputEl) {\n\n\t\tvar $input = $(inputEl),\n\t\t\tparamKey = $input.attr('name'),\n\t\t\tinitialValue = getURLParameter(paramKey);\n\n\t\tif(initialValue !== undefined) {\n\n\t\t\t// Drop downs do their own pre-filling in filterEventDropdown.js.\n\t\t\t// They're JSON based so we're not sure if and when their data is available\n\t\t\tif($input.attr('type') === TYPE_MULTICHECK) {\n\n\t\t\t\t$input.trigger(filterMultiSelect.EVENT_UPDATE, initialValue);\n\n\t\t\t} else if($input.attr('type') !== TYPE_SELECT && $input.data('type') !== TYPE_DATE) {\n\n\t\t\t\t$input.val(initialValue);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction doubleDigitString(number) {\n\n\t\tvar prepend = '';\n\n\t\tif(number < 10) { //eslint-disable-line no-magic-numbers\n\n\t\t\tprepend = '0';\n\t\t}\n\n\t\treturn prepend + number;\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Public Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/filter\":5,\"../../utils/getUrlParameter\":58,\"./filterMultiSelect\":33,\"jquery\":\"jquery\"}],33:[function(require,module,exports){\n// Vendor dependencies\nvar $ = require('jquery'),\n\n// Constants\n\tSELECTOR_VALUE = '.js-filterMultiSelect__value',\n\tSELECTOR_ALL = '.js-filterMultiSelect__all',\n\tEVENT_UPDATE = 'EVENT_UPDATE',\n\tEVENT_CLEAR = 'EVENT_CLEAR';\n\n\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\n\n// expose events so filterForm can dispatch accordingly\nexports.EVENT_UPDATE = EVENT_UPDATE;\nexports.EVENT_CLEAR = EVENT_CLEAR;\n\nexports.selector = '.js-filterMultiSelect';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$values,\n\t\t_$all;\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\n\t\t_$values = _$el.find(SELECTOR_VALUE);\n\t\t_$all = _$el.find(SELECTOR_ALL);\n\n\t\tupdateValue([]);\n\n\t\t_$el.on(EVENT_CLEAR, onClear);\n\t\t_$el.on(EVENT_UPDATE, onUpdate);\n\n\t\t_$all.change(onAllChange);\n\t\t_$values.change(onValueChange);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent handling\n\t ========================================================================== */\n\n\n\tfunction onClear(e, clearId) {\n\n\t\tvar i = 0,\n\t\t\t$value,\n\t\t\tvalueId;\n\n\t\tfor(i; i < _$values.length; i++) {\n\n\t\t\t$value = $(_$values[i]);\n\t\t\tvalueId = Number($value.val());\n\n\t\t\tif(clearId === '*' || valueId === clearId) {\n\n\t\t\t\t$value.prop('checked', false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tevaluateValues();\n\t}\n\n\tfunction onUpdate(e, newValues) {\n\n\t\tvar newValuesArr,\n\t\t\tvalue,\n\t\t\ti;\n\n\t\tif(typeof newValues !== 'string') {\n\n\t\t\tconsole.error('filterMultiSelect EVENT_UPDATE needs a string to parse. You\\'re passing a ' + typeof newValue + ' instead.');\n\n\t\t} else {\n\n\t\t\tnewValuesArr = newValues.split(',');\n\n\t\t\tfor(i = 0; i < newValuesArr.length; i++) {\n\n\t\t\t\tvalue = newValuesArr[i];\n\t\t\t\t_$values.each(updateValueEach);\n\t\t\t}\n\n\t\t\tevaluateValues();\n\t\t}\n\n\t\tfunction updateValueEach(index, el) {\n\n\t\t\tvar $el = $(el),\n\t\t\t\tisChecked = value === $el.val();\n\n\t\t\tif(isChecked) {\n\n\t\t\t\t$el.prop('checked', isChecked);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onAllChange() {\n\n\t\tupdateAll(this.checked);\n\t\tevaluateValues();\n\t}\n\n\tfunction onValueChange() {\n\n\t\tevaluateValues();\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tHelpers\n\t =========================================================================== */\n\n\n\tfunction evaluateValues() {\n\n\t\tvar newValue = composeMultiSelectValue(),\n\t\t\tallValuesAreChecked = newValue.length === _$values.length;\n\n\t\t_$all.prop('checked', allValuesAreChecked);\n\n\t\tupdateValue(newValue);\n\t}\n\n\tfunction updateAll(newValue) {\n\n\t\t_$values.each(function(index, el) {\n\n\t\t\t$(el).prop('checked', newValue);\n\t\t});\n\t}\n\n\tfunction composeMultiSelectValue() {\n\n\t\tvar value = [];\n\n\t\t_$values.each(function(index, el){\n\n\t\t\tvar $el = $(el);\n\n\t\t\tif($el.prop('checked')) {\n\n\t\t\t\tvalue.push($el.val());\n\t\t\t}\n\t\t});\n\n\t\treturn value;\n\t}\n\n\tfunction updateValue(arr) {\n\n\t\tvar value = arr.join(',');\n\n\t\t_$el.data('value', value);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"jquery\":\"jquery\"}],34:[function(require,module,exports){\n// Project dependencies\nvar $ = require('jquery'),\n\tmatchMedia = require('../../core/events/matchMedia'),\n\teventBus = require('../../core/eventBus'),\n\tcssPrefix = require('../../utils/cssPrefix'),\n\n\t// constants\n\tOFFSET_FACTOR = 0.3,// based on the `top:30%` in the `.is-fixed` classes\n\tTRANSFORM_PREFIX = cssPrefix.js + 'Transform',\n\tCLASS_IS_FIXED = 'is-fixed',\n\tSELECTOR_PARENT = '.js-filterPositioning__parent';\n\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-filterPositioning';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$parent,\n\t\t_dontSnap,\n\t\t_onlyOnWide = false,\n\t\t_isFixed = false,\n\t\t_offset = 0,\n\t\t_positioningOffset = 0,\n\t\t_scrollTop = 0;\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_$parent = $(SELECTOR_PARENT);\n\t\t_onlyOnWide = Boolean(_$el.data('only-on-wide'));\n\n\t\tif(_$parent.length !== 1) {\n\n\t\t\tconsole.log('`js-filterPositioning` needs one `' + SELECTOR_PARENT + '` on the page ' +\n\t\t\t\t'to base its position on. At this point you have ' + _$parent.length + '.');\n\n\n\t\t} else {\n\n\t\t\teventBus.on(eventBus.SCROLL, onScroll);\n\t\t\teventBus.on(eventBus.RESIZE, onResize);\n\t\t}\n\t}\n\n\n\t/* ==========================================================================\n\t\tEvent handling\n\t ========================================================================== */\n\n\n\tfunction onScroll(e, scrollValue) {\n\n\t\t_scrollTop = scrollValue.scrollTop;\n\n\t\tredraw();\n\t}\n\n\tfunction onResize(e, width, height) {\n\n\t\t_positioningOffset = height * OFFSET_FACTOR;\n\n\t\tif(_onlyOnWide) {\n\n\t\t\t_dontSnap = width < matchMedia.LARGE_WINDOW;\n\t\t}\n\n\t\tredraw();\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tHelpers\n\t ========================================================================== */\n\n\n\tfunction redraw() {\n\n\t\tvar parentOffsetTop = _$parent.offset().top,\n\t\t\tparentPositioningOffset = _$parent.height() - _positioningOffset;\n\n\t\t// snap to top\n\t\tif(_dontSnap || parentOffsetTop >= _scrollTop + _positioningOffset) {\n\n\t\t\tupdateIsFixed(false);\n\t\t\tupdateOffset(0);\n\n\t\t// snap to bottom\n\t\t} else if(parentOffsetTop + parentPositioningOffset <= _scrollTop + _positioningOffset) {\n\n\t\t\tupdateIsFixed(false);\n\t\t\tupdateOffset(Math.round(parentPositioningOffset));\n\n\t\t// snap to middle\n\t\t} else {\n\n\t\t\tupdateIsFixed(true);\n\t\t\tupdateOffset(0);\n\t\t}\n\t}\n\n\tfunction updateIsFixed(newIsFixed) {\n\n\t\tif(_isFixed !== newIsFixed) {\n\n\t\t\t_isFixed = newIsFixed;\n\n\t\t\tif(_isFixed) {\n\n\t\t\t\t_$el.addClass(CLASS_IS_FIXED);\n\n\t\t\t} else {\n\n\t\t\t\t_$el.removeClass(CLASS_IS_FIXED);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction updateOffset(newOffset) {\n\n\t\tif(_offset !== newOffset) {\n\n\t\t\t_offset = newOffset;\n\n\t\t\tif(_offset > 0) {\n\n\t\t\t\t_$el.css(TRANSFORM_PREFIX, 'translateY(' + _offset + 'px)');\n\t\t\t\t_$el.css(TRANSFORM_PREFIX, 'translate3d(0, ' + _offset + 'px, 0)');\n\n\t\t\t} else {\n\n\t\t\t\t_$el.css(TRANSFORM_PREFIX, '');\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/events/matchMedia\":2,\"../../utils/cssPrefix\":56,\"jquery\":\"jquery\"}],35:[function(require,module,exports){\n// Vendor dependencies\nvar $ = require('jquery'),\n\n\t// Constants\n\tSELECTOR_VALUE = '.js-filterRadioCheckbox__value',\n\tEVENT_UPDATE = 'EVENT_UPDATE',\n\tEVENT_CLEAR = 'EVENT_CLEAR';\n\n\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\n\n// expose events so filterForm can dispatch accordingly\nexports.EVENT_UPDATE = EVENT_UPDATE;\nexports.EVENT_CLEAR = EVENT_CLEAR;\n\nexports.selector = '.js-filterIssues__container';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$values;\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\t\t_$el = $el;\n\n\t\t_$values = _$el.find(SELECTOR_VALUE);\n\n\t\t_$el.on(EVENT_UPDATE, onUpdate);\n\t\t_$values.change(onValueChange);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent handling\n\t ========================================================================== */\n\n\n\tfunction onValueChange(e) {\n\n\t\tvar i = 0,\n\t\t\t$value,\n\t\t\tvalueId,\n\t\t\tselected;\n\n\t\tselected = Number($(e.target).val());\n\t\tif (selected && $(e.target).is(':checked')) {\n\t\t\t_$el.data('value', selected);\n\t\t} else {\n\t\t\t_$el.data('value', 0);\n\t\t}\n\t\tfor (i; i < _$values.length; i++) {\n\n\t\t\t$value = $(_$values[i]);\n\t\t\tvalueId = Number($value.val());\n\n\t\t\tif (selected !== valueId) {\n\t\t\t\t$value.prop('checked', false);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfunction onUpdate(e) {//eslint-disable-line no-unused-vars\n\t\t//console.log(e, newValues);\n\n\n\t}\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"jquery\":\"jquery\"}],36:[function(require,module,exports){\n// vendor dependencies\nvar $ = require('jquery'),\n\n\t// project dependencies\n\tglobalSelectors = require('../../core/globalSelectors'),\n\n\t// selectors\n\t_$body = globalSelectors.$body,\n\n\t// constants\n\tSELECTOR_TOGGLE_TARGET = '.js-filterToggle__target',\n\tCLASS_IS_OPEN = 'is-open',\n\tCLASS_NO_SCROLL_FILTER = 'no-scroll--filter';\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-filterToggle';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$target;\n\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_$target = $(SELECTOR_TOGGLE_TARGET);\n\t\t_$el.click(onClick);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent handling\n\t ========================================================================== */\n\n\n\tfunction onClick() {\n\n\t\tif(_$target.hasClass(CLASS_IS_OPEN)) {\n\n\t\t\tclose();\n\n\t\t} else {\n\n\t\t\topen();\n\t\t}\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tState Handling\n\t =========================================================================== */\n\n\n\tfunction open() {\n\n\t\t_$el.addClass(CLASS_IS_OPEN);\n\t\t_$target.addClass(CLASS_IS_OPEN);\n\t\t_$body.addClass(CLASS_NO_SCROLL_FILTER);\n\t}\n\n\tfunction close() {\n\n\t\t_$el.removeClass(CLASS_IS_OPEN);\n\t\t_$target.removeClass(CLASS_IS_OPEN);\n\t\t_$body.removeClass(CLASS_NO_SCROLL_FILTER);\n\t}\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/globalSelectors\":6,\"jquery\":\"jquery\"}],37:[function(require,module,exports){\nvar gtmDataPusher = require('../utils/gtmDataPusher'),\n\n\tACTION_CLICK = 'click';\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-gtmClick';\n\nexports.constructor = function() {\n\n\tvar _$el,\n\t\t_category,\n\t\t_label,\n\t\t_action;\n\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_category = _$el.data('category');\n\t\t_label = _$el.data('label');\n\t\t_action = _$el.data('action') || ACTION_CLICK;\n\n\n\t\t_$el.click(onClick);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent Handling\n\t ========================================================================== */\n\n\n\tfunction onClick() {\n\t\tgtmDataPusher(_category, _action, _label);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../utils/gtmDataPusher\":59}],38:[function(require,module,exports){\nvar gtmDataPusher = require('../utils/gtmDataPusher'),\n\n\tACTION_SUBMIT = 'click';\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-gtmSubmit';\n\nexports.constructor = function() {\n\n\tvar _$el,\n\t\t_category,\n\t\t_label;\n\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_category = _$el.data('category');\n\t\t_label = _$el.data('label');\n\n\t\t_$el.submit(onSubmit);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent Handling\n\t ========================================================================== */\n\n\n\tfunction onSubmit() {\n\n\t\tgtmDataPusher(_category, ACTION_SUBMIT, _label);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../utils/gtmDataPusher\":59}],39:[function(require,module,exports){\nvar CLASS_IS_BLURRED = 'is-blurred',\n\tCLASS_IS_FOCUSED = 'is-focused',\n\tCLASS_IS_HIDDEN = 'is-hidden',\n\tCLASS_IS_SHOWN = 'is-shown';\n\nmodule.exports = function($el) {\n\n\tvar _$el = $el,\n\t\t_isBlurred = false,\n\t\t_isHidden = false;\n\n\tfunction blur() {\n\n\t\tif(!_isBlurred) {\n\n\t\t\t_isBlurred = true;\n\t\t\t_$el.removeClass(CLASS_IS_FOCUSED);\n\t\t\t_$el.addClass(CLASS_IS_BLURRED);\n\t\t}\n\n\t}\n\n\tfunction focus(isForced) {\n\n\t\tif(_isBlurred) {\n\n\t\t\t_isBlurred = false;\n\t\t\t_$el.removeClass(CLASS_IS_BLURRED);\n\n\t\t\tif(isForced) {\n\n\t\t\t\t_$el.addClass(CLASS_IS_FOCUSED);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction hide() {\n\n\t\tif(!_isHidden) {\n\n\t\t\t_isHidden = true;\n\n\t\t\t_$el.addClass(CLASS_IS_HIDDEN);\n\t\t\t_$el.removeClass(CLASS_IS_SHOWN);\n\t\t}\n\t}\n\n\tfunction show() {\n\n\t\tif(_isHidden) {\n\n\t\t\t_isHidden = false;\n\t\t\t_$el.removeClass(CLASS_IS_HIDDEN);\n\t\t\t_$el.addClass(CLASS_IS_SHOWN);\n\t\t}\n\t}\n\n\tthis.blur = blur;\n\tthis.focus = focus;\n\tthis.hide = hide;\n\tthis.show = show;\n};\n\n},{}],40:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../../core/eventBus'),\n\n\tHeaderElement = require('./HeaderElement'),\n\n// Constants\n\tHEADER_SCROLL_OFFSET = 140,\n\tVELOCITY_OFFSET = -0.75,\n\n\tSELECTOR_HEADER = '.js-header',\n\tSELECTOR_HEADER_BAR = '.js-header__bar',\n\tSELECTOR_ISSUES_NAV = '.js-header__issues',\n\tSELECTOR_PAGES_NAV = '.js-header__pages',\n\tSELECTOR_HEADER_ON_PROGRESS = '.js-header__on-progress',\n\tSELECTOR_CURRENT_COPY = '.js-header__current';\n\n\n\n/* ==========================================================================\n    Module Configuration\n ========================================================================== */\n\nexports.selector = SELECTOR_HEADER;\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_hasSubnav,\n\t\t_headerBar,\n\t\t_headerOnProgress,\n\t\t_navIssues,\n\t\t_currentlyReadingCopy,\n\t\t_navPages,\n\t\t_isReadingContent,\n\t\t_currentScrollValues;\n\n\n\t/* ==========================================================================\n\t    Initialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\n\t\t_hasSubnav = _$el.data('has-subnav');\n\n\t\t_headerBar = new HeaderElement(_$el.find(SELECTOR_HEADER_BAR));\n\t\t_navIssues = new HeaderElement(_$el.find(SELECTOR_ISSUES_NAV));\n\t\t_navPages = new HeaderElement(_$el.find(SELECTOR_PAGES_NAV));\n\t\t_headerOnProgress = new HeaderElement(_$el.find(SELECTOR_HEADER_ON_PROGRESS));\n\t\t_currentlyReadingCopy = new HeaderElement(_$el.find(SELECTOR_CURRENT_COPY));\n\n\t\teventBus.on(eventBus.SCROLL, onScroll);\n\t\teventBus.on(eventBus.CONTENT_PROGRESS, onContentProgress);\n\n\t\t_$el.hover(onHeaderIn, onHeaderOut);\n\t}\n\n\n\n\t/* ==========================================================================\n\t    Event Handling\n\t =========================================================================== */\n\n\n\tfunction onHeaderIn() {\n\n\t\t// don't expand the issue-nav when we have a sub-navigation\n\t\tif(_hasSubnav && _isReadingContent) {\n\n\t\t\treturn;\n\t\t}\n\n\t\thandleNavIssues(true);\n\t}\n\n\tfunction onHeaderOut() {\n\n\t\thandleNavIssues(false);\n\t}\n\n\tfunction onScroll(e, newScrollValues) {\n\n\t\t_currentScrollValues = newScrollValues;\n\n\t\thandleHeaderBar();\n\t\thandleNavIssues(false);\n\t}\n\n\tfunction onContentProgress(e, progress) {\n\n\t\tvar newIsReadingContent = progress > 0 && progress < 1;\n\n\t\tif(newIsReadingContent !== _isReadingContent) {\n\n\t\t\t_isReadingContent = newIsReadingContent;\n\n\t\t\tif(_isReadingContent) {\n\n\t\t\t\t_headerOnProgress.show();\n\t\t\t\t_navIssues.hide();\n\t\t\t\t_navPages.hide();\n\t\t\t\t_currentlyReadingCopy.show();\n\n\t\t\t} else {\n\n\t\t\t\t_navPages.show();\n\t\t\t\t_navIssues.show();\n\t\t\t\t_headerOnProgress.hide();\n\t\t\t\t_currentlyReadingCopy.hide();\n\t\t\t}\n\t\t}\n\t}\n\n\t/* ==========================================================================\n\t    State Handling\n\t =========================================================================== */\n\n\tfunction handleHeaderBar() {\n\n\t\tvar isBlurred = _currentScrollValues.scrollTop >= HEADER_SCROLL_OFFSET;\n\n\t\tif(isBlurred) {\n\n\t\t\t_headerBar.blur();\n\n\t\t} else {\n\n\t\t\t_headerBar.focus();\n\t\t}\n\t}\n\n\tfunction handleNavIssues(isForcedFocus) {\n\n\t\tif(isForcedFocus ||\n\t\t\t_currentScrollValues.velocity < VELOCITY_OFFSET ||\n\t\t\t_currentScrollValues.scrollTop < HEADER_SCROLL_OFFSET) {\n\n\t\t\t_navIssues.focus(isForcedFocus);\n\n\t\t} else if(_currentScrollValues.velocity > 0 &&\n\t\t\t_currentScrollValues.scrollTop >= HEADER_SCROLL_OFFSET) {\n\n\t\t\t_navIssues.blur();\n\t\t}\n\t}\n\n\n\t/* ==========================================================================\n\t    Public Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"./HeaderElement\":39}],41:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../../core/eventBus'),\n\tmatchMedia = require('../../core/events/matchMedia'),\n\tgtmDataPusher = require('../../utils/gtmDataPusher'),\n\tArrow = require('../arrow'),\n\tNavigation = require('../carousel/navigation'),\n\tjq = require('jquery'),\n\n\t// constants\n\n\tACTION_SWIPE = 'swipe',\n\tANIMATE_DURATION = 0.5;\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\nexports.selector = '.js-heroes';\n\nexports.constructor = function() {\n\n\t/* ==========================================================================\n\t Initialize\n\t ========================================================================== */\n\n\t// NOTE: Sizes are separted by px(pixels) and pct (percentage)\n\n\tvar fullPct = 100,\n\n\t\t_$el,\n\t\t_$slides,\n\t\t_$allSlides,\n\t\t_$previous,\n\t\t_$next,\n\t\t_$allImages,\n\t\t_$images,\n\t\t_$navigation,\n\t\t_$allVignettes,\n\n\t\tchildrenCount,\n\t\tparentPx,\n\n\t\tchildrenMarginPx,\n\n\t\tchildrenPct,\n\t\tchildrenMarginPct,\n\n\t\t// Final Element Ptc\n\n\t\tnewParentPct,\n\t\tnewChildrenPct,\n\t\tnewMarginPtc,\n\n\t\t// Options\n\n\t\t_arrowRight,\n\t\t_arrowLeft,\n\t\t_navigation,\n\n\n\t\tcarouselIsActive = false,\n\t\tcolumsPerSize,\n\n\t\t// Carousel Data\n\n\t\ttotalMoves,\n\t\ttotalMovesRight,\n\t\ttotalMovesLeft,\n\t\tresizeMoves,\n\n\t\tmovesPerSize,\n\t\tswipeSet,\n\n\t\t_heroImageAnimationDelay,\n\t\t_heroImageAnimationOn,\n\t\t_animationTimer,\n\n\n\t\tcurrentElementIndex = 1;\n\n\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t/* eslint-disable  */\n\t\t_heroImageAnimationDelay = window.aspen_global.heroImageAnimationDelay || 5000;\n\t\t_heroImageAnimationOn = window.aspen_global.heroImageAnimationOn;\n\t\t/* eslint-enable */\n\n\t\t_$slides = _$el.find('.js-heroes__container .home-heroes__container');\n\t\t_$allSlides = _$slides.children();\n\n\t\t_$images = _$el.find('.js-heroes__container .home-heroes__images');\n\t\t_$allImages = _$images.children('.home-heroes__image');\n\t\t_$allVignettes = _$images.children('.home-heroes__vignette');\n\n\t\t_$previous = _$el.find('.home-heroes__arrow--up');\n\t\t_$next = _$el.find('.home-heroes__arrow--down');\n\t\t// Parent Values\n\n\t\tparentPx = _$slides.width();\n\n\t\t// Children Values\n\n\t\tchildrenCount = _$allSlides.length;\n\n\t\tchildrenMarginPx = (parseFloat(_$allSlides.css('margin-right').replace('px', '')) +\n\n\t\t\tparseFloat(_$allSlides.css('margin-left').replace('px', '')));\n\n\t\teventBus.on(eventBus.MATCH_MEDIA, _resize);\n\n\t\t_$navigation = _$el.find('.js-carousel__navigation');\n\n\t\t//\t\tInit Arrows\n\n\t\t_navigation = new Navigation(_$navigation);\n\t\t_arrowRight = new Arrow(_$next, 'right', bindSteps);\n\t\t_arrowLeft = new Arrow(_$previous, 'left', bindSteps);\n\n\t\tnavigationStyle();\n\n\t\t_$el.hammer().on('swiperight', function() {\n\n\t\t\tgtmDataPusher(_$previous.data('category'), ACTION_SWIPE, _$previous.data('label'));\n\t\t\tbindSteps('left');\n\t\t});\n\n\t\t_$el.hammer().on('swipeleft', function() {\n\n\t\t\tgtmDataPusher(_$next.data('category'), ACTION_SWIPE, _$next.data('label'));\n\t\t\tbindSteps('right');\n\t\t});\n\n\t\t_$el.find('.js-carousel__dot').on('click', function() {\n\t\t\tvar i = jq(this).index();\n\t\t\tbindSteps(null, i);\n\t\t});\n\n\t\tstartAnimation();\n\n\t}\n\n\tfunction navigationStyle() {\n\n\t\tif (_$allSlides.length === 1) {\n\t\t\treturn;\n\t\t}\n\t\tvar i;\n\n\t\tfor (i = 0; i < _$allSlides.length; i++) {\n\n\t\t\t_navigation.createDots();\n\n\t\t}\n\n\t\t_navigation.activateDot(1);\n\t}\n\n\tfunction _resize(e, resize) {\n\n\t\tif (resize > matchMedia.MEDIUM_WINDOW) {\n\n\t\t\tswipeSet = false;\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1;\n\n\t\t} else if (resize === matchMedia.MEDIUM_WINDOW) {\n\n\t\t\tswipeSet = false;\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1;\n\n\t\t} else {\n\n\t\t\tswipeSet = true;\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1;\n\t\t}\n\n\t\tstyleColumns();\n\n\t\tif (childrenCount > columsPerSize) {\n\n\t\t\tresetSteps();\n\t\t\tcheckStatus(true);\n\n\n\t\t} else {\n\n\t\t\tcheckStatus(false);\n\n\t\t}\n\t}\n\n\tfunction resetSteps() {\n\n\t\ttotalMoves = ((childrenCount / movesPerSize) - 1) - ((columsPerSize / movesPerSize) - 1);\n\n\t\tresizeMoves = (currentElementIndex - 1) / movesPerSize;\n\n\t\ttotalMovesLeft = resizeMoves > totalMoves ? totalMoves : resizeMoves;\n\n\t\ttotalMovesRight = totalMoves - totalMovesLeft;\n\n\t\tevaluateControls();\n\n\t\tanimate(totalMovesLeft);\n\n\t\t_navigation.activateDot(currentElementIndex);\n\n\t}\n\n\tfunction styleColumns() {\n\n\t\tchildrenMarginPct = getPercentage(childrenMarginPx);\n\t\tchildrenPct = (fullPct / columsPerSize) - (childrenMarginPct);\n\n\t\tnewParentPct = childrenCount * (childrenPct + (childrenMarginPct * 2));\n\t\tnewMarginPtc = fullPct * childrenMarginPct / (childrenCount * childrenPct);\n\t\tnewChildrenPct = fullPct / childrenCount - (newMarginPtc * 2);\n\n\t\tif (swipeSet) {\n\t\t\t_$slides.css('width', newParentPct + '%');\n\t\t\t_$allSlides.css({\n\t\t\t\t'width': newChildrenPct + '%',\n\t\t\t\t'margin-left': newMarginPtc / 2 + '%'\n\t\t\t});\n\t\t} else {\n\t\t\t_$slides.css('width', '100%');\n\t\t\t_$allSlides.css({\n\t\t\t\t'width': '100%'\n\t\t\t});\n\n\t\t}\n\n\n\t}\n\n\tfunction checkStatus(isActive) {\n\n\t\tif (carouselIsActive !== isActive) {\n\n\t\t\tcarouselIsActive = isActive;\n\n\t\t\tcarouselIsActive ? activate() : deactivate();\n\t\t}\n\t}\n\n\t/* ==========================================================================\n\n\t Calculating elements\n\n\t ========================================================================== */\n\n\tfunction getPercentage(elementSize) {\n\n\t\treturn elementSize / parentPx * fullPct;\n\n\t}\n\n\t/* ==========================================================================\n\n\t Carousel Utils\n\n\t ========================================================================== */\n\n\tfunction bindSteps(direction, jump) {\n\t\tif (totalMovesRight >= 0) {\n\n\t\t\ttotalMovesRight = calculateTotalMovesRight(direction === 'right', jump);\n\n\t\t\ttotalMovesLeft = totalMoves - totalMovesRight;\n\n\t\t\tcurrentElementIndex = totalMovesLeft * movesPerSize + 1;\n\n\t\t\tevaluateControls();\n\n\t\t\tanimate(totalMovesLeft);\n\n\t\t\t_navigation.activateDot(Math.round(currentElementIndex));\n\t\t}\n\n\t}\n\n\tfunction calculateTotalMovesRight(t, j) {\n\t\tvar tr;\n\t\tif (t && j===undefined) {\n\t\t\ttr = totalMovesRight >= 1 ? totalMovesRight - 1 : totalMovesRight - totalMovesRight;\n\t\t} else if (!t && j===undefined) {\n\t\t\ttr = totalMovesLeft >= 1 ? totalMovesRight + 1 : totalMovesRight + totalMovesLeft;\n\t\t} else {\n\t\t\ttr = (totalMoves - j >= 0) ? totalMoves - j : 0;\n\t\t}\n\t\treturn tr;\n\t}\n\n\tfunction evaluateControls() {\n\n\t\t_arrowRight.status(totalMovesRight > 0);\n\t\t_arrowLeft.status(totalMovesLeft > 0);\n\n\t}\n\n\tfunction animate(distance) {\n\t\tclearAnimation();\n\t\t_$allSlides.removeClass(\"active\");\n\n\t\tif (swipeSet) {\n\t\t\tTweenLite.to(_$slides, ANIMATE_DURATION, {\n\t\t\t\tx: -(distance * ((newChildrenPct + newMarginPtc) * movesPerSize)) + '%',\n\t\t\t\tease: Cubic.easeOut\n\t\t\t});\n\t\t\t_$allSlides[currentElementIndex - 1].className += \" active\";\n\n\t\t} else {\n\t\t\t_$allSlides[currentElementIndex - 1].className += \" active\";\n\t\t}\n\n\t\t_$allImages.removeClass(\"active\");\n\t\t_$allVignettes.removeClass(\"active\");\n\n\t\t_$allVignettes[currentElementIndex - 1].className += \" active\";\n\t\t_$allImages[currentElementIndex - 1].className += \" active\";\n\n\t\tstartAnimation();\n\n\t}\n\n\tfunction activate() {\n\n\t\t_arrowRight.activate();\n\t\t_arrowLeft.activate();\n\n\t}\n\n\tfunction deactivate() {\n\n\t\tresetSteps();\n\t\t_arrowRight.deactivate();\n\t\t_arrowLeft.deactivate();\n\n\t}\n\n\t// Animation Controls\n\n\tfunction startAnimation() {\n\t\tif (_heroImageAnimationOn) {\n\t\t\t_animationTimer = setInterval(stepAnimation, _heroImageAnimationDelay);\n\t\t}\n\t}\n\n\tfunction clearAnimation() {\n\t\tclearInterval(_animationTimer);\n\t}\n\n\tfunction stepAnimation() {\n\t\tif (totalMovesRight !== 0) {\n\t\t\tbindSteps('right');\n\t\t} else {\n\t\t\tcurrentElementIndex = 1;\n\t\t\tresetSteps();\n\t\t}\n\t}\n\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/events/matchMedia\":2,\"../../utils/gtmDataPusher\":59,\"../arrow\":18,\"../carousel/navigation\":21,\"jquery\":\"jquery\"}],42:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../../core/eventBus'),\n\tmatchMedia = require('../../core/events/matchMedia'),\n\tgtmDataPusher = require('../../utils/gtmDataPusher'),\n\tArrow = require('../arrow'),\n\tNavigation = require('../carousel/navigation'),\n\tjq = require('jquery'),\n\n\t// constants\n\n\tACTION_SWIPE = 'swipe',\n\tANIMATE_DURATION = 0.5;\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\nexports.selector = '.js-ideas-issues';\n\nexports.constructor = function() {\n\n\t/* ==========================================================================\n\t Initialize\n\t ========================================================================== */\n\n\t// NOTE: Sizes are separted by px(pixels) and pct (percentage)\n\n\tvar fullPct = 100,\n\n\t\t_$el,\n\t\t_$container,\n\t\t_$allChildren,\n\t\t_$previous,\n\t\t_$next,\n\t\t_$navigation,\n\n\t\tchildrenCount,\n\t\tparentPx,\n\n\t\tchildrenMarginPx,\n\n\t\tchildrenPct,\n\t\tchildrenMarginPct,\n\n\t\t// Final Element Ptc\n\n\t\tnewParentPct,\n\t\tnewChildrenPct,\n\t\tnewMarginPtc,\n\n\t\t// Options\n\n\t\t_arrowRight,\n\t\t_arrowLeft,\n\t\t_navigation,\n\n\n\t\tcarouselIsActive = false,\n\t\tcolumsPerSize,\n\n\t\t// Carousel Data\n\n\t\ttotalMoves,\n\t\ttotalMovesRight,\n\t\ttotalMovesLeft,\n\t\tresizeMoves,\n\n\t\tmovesPerSize,\n\n\t\tcurrentElementIndex = 1;\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_$container = _$el.find('.js-magazine-carousel__container');\n\t\t_$allChildren = _$container.children();\n\n\t\t_$previous = _$el.find('.js-carousel__previous');\n\t\t_$next = _$el.find('.js-carousel__next');\n\n\t\t// Parent Values\n\n\t\tparentPx = _$container.width();\n\n\t\t// Children Values\n\n\t\tchildrenCount = _$allChildren.length;\n\n\t\tchildrenMarginPx = (parseFloat(_$allChildren.css('margin-right').replace('px', '')) +\n\n\t\t\tparseFloat(_$allChildren.css('margin-left').replace('px', '')));\n\n\t\teventBus.on(eventBus.MATCH_MEDIA, _resize);\n\n\t\t_$navigation = _$el.find('.js-carousel__navigation');\n\n\t\t//\t\tInit Arrows\n\n\t\t_navigation = new Navigation(_$navigation);\n\t\t_arrowRight = new Arrow(_$next, 'right', bindSteps);\n\t\t_arrowLeft = new Arrow(_$previous, 'left', bindSteps);\n\n\t\tnavigationStyle();\n\n\t\t_$el.hammer().on('swiperight', function() {\n\n\t\t\tgtmDataPusher(_$previous.data('category'), ACTION_SWIPE, _$previous.data('label'));\n\t\t\tbindSteps('left');\n\t\t});\n\n\t\t_$el.hammer().on('swipeleft', function() {\n\n\t\t\tgtmDataPusher(_$next.data('category'), ACTION_SWIPE, _$next.data('label'));\n\t\t\tbindSteps('right');\n\t\t});\n\n\t\t_$el.find('.js-carousel__dot').on('click', function() {\n\t\t\tvar i = jq(this).index();\n\t\t\tbindSteps(null, i);\n\t\t});\n\n\t}\n\n\tfunction navigationStyle() {\n\n\t\tvar i;\n\n\t\tfor (i = 0; i < _$allChildren.length; i++) {\n\n\t\t\t_navigation.createDots();\n\n\t\t}\n\n\t\t_navigation.activateDot(1);\n\t}\n\n\tfunction _resize(e, resize) {\n\n\t\tif (resize >= matchMedia.LARGE_WINDOW) {\n\n\t\t\tfullPct = 75;\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1;\n\n\t\t} else if (resize === matchMedia.MEDIUM_WINDOW) {\n\n\t\t\tfullPct = 80;\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1;\n\n\t\t} else {\n\n\t\t\tfullPct = 100;\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1;\n\t\t}\n\n\t\tstyleColumns();\n\n\t\tif (childrenCount > columsPerSize) {\n\n\t\t\tresetSteps();\n\t\t\tcheckStatus(true);\n\n\n\t\t} else {\n\n\t\t\tcheckStatus(false);\n\n\t\t}\n\t}\n\n\tfunction resetSteps() {\n\n\t\ttotalMoves = ((childrenCount / movesPerSize) - 1) - ((columsPerSize / movesPerSize) - 1);\n\n\t\tresizeMoves = (currentElementIndex - 1) / movesPerSize;\n\n\t\ttotalMovesLeft = resizeMoves > totalMoves ? totalMoves : resizeMoves;\n\n\t\ttotalMovesRight = totalMoves - totalMovesLeft;\n\n\t\tevaluateControls();\n\t\tanimate(totalMovesLeft);\n\n\t}\n\n\tfunction styleColumns() {\n\n\t\tchildrenMarginPct = getPercentage(childrenMarginPx);\n\t\tchildrenPct = (fullPct / columsPerSize) - (childrenMarginPct);\n\n\t\tnewParentPct = childrenCount * (childrenPct + (childrenMarginPct * 2));\n\t\tnewMarginPtc = fullPct * childrenMarginPct / (childrenCount * childrenPct);\n\t\tnewChildrenPct = fullPct / childrenCount - (newMarginPtc * 2);\n\n\t\t_$container.css('width', newParentPct + '%');\n\t\t_$allChildren.css({\n\t\t\t'width': newChildrenPct + '%',\n\t\t\t'margin': newMarginPtc / 2 + '%'\n\t\t});\n\n\t}\n\n\tfunction checkStatus(isActive) {\n\n\t\tif (carouselIsActive !== isActive) {\n\n\t\t\tcarouselIsActive = isActive;\n\n\t\t\tcarouselIsActive ? activate() : deactivate();\n\t\t}\n\t}\n\n\t/* ==========================================================================\n\n\t Calculating elements\n\n\t ========================================================================== */\n\n\tfunction getPercentage(elementSize) {\n\n\t\treturn elementSize / parentPx * fullPct;\n\n\t}\n\n\t/* ==========================================================================\n\n\t Carousel Utils\n\n\t ========================================================================== */\n\n\tfunction bindSteps(direction, jump) {\n\t\tif (totalMovesRight >= 0) {\n\n\t\t\ttotalMovesRight = calculateTotalMovesRight(direction === 'right', jump);\n\n\t\t\ttotalMovesLeft = totalMoves - totalMovesRight;\n\n\t\t\tcurrentElementIndex = totalMovesLeft * movesPerSize + 1;\n\n\t\t\tevaluateControls();\n\n\t\t\tanimate(totalMovesLeft);\n\n\t\t\t_navigation.activateDot(Math.round(currentElementIndex));\n\t\t}\n\n\t}\n\n\tfunction calculateTotalMovesRight(t, j) {\n\t\tvar tr;\n\t\tif (t && j===undefined) {\n\t\t\ttr = totalMovesRight >= 1 ? totalMovesRight - 1 : totalMovesRight - totalMovesRight;\n\t\t} else if (!t && j===undefined) {\n\t\t\ttr = totalMovesLeft >= 1 ? totalMovesRight + 1 : totalMovesRight + totalMovesLeft;\n\t\t} else {\n\t\t\ttr = (totalMoves - j >= 0) ? totalMoves - j : 0;\n\t\t}\n\t\treturn tr;\n\t}\n\n\tfunction evaluateControls() {\n\n\t\t_arrowRight.status(totalMovesRight > 0);\n\t\t_arrowLeft.status(totalMovesLeft > 0);\n\n\t}\n\n\tfunction animate(distance) {\n\n\t\tTweenLite.to(_$container, ANIMATE_DURATION, {\n\t\t\tx: -(distance * ((newChildrenPct + newMarginPtc) * movesPerSize)) + '%',\n\t\t\tease: Cubic.easeOut\n\t\t}).eventCallback(\"onStart\", function() {\n\t\t\t_$allChildren.removeClass(\"active\");\n\t\t\t_$allChildren[currentElementIndex - 1].className += \" active\";\n\t\t}).eventCallback(\"onComplete\", function() {\n\t\t\t// _$allChildren.removeClass(\"active\");\n\t\t\t// _$allChildren[currentElementIndex-1].className += \" active\";\n\t\t});\n\n\t}\n\n\tfunction activate() {\n\n\t\t_arrowRight.activate();\n\t\t_arrowLeft.activate();\n\n\t}\n\n\tfunction deactivate() {\n\n\t\tresetSteps();\n\t\t_arrowRight.deactivate();\n\t\t_arrowLeft.deactivate();\n\n\t}\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/events/matchMedia\":2,\"../../utils/gtmDataPusher\":59,\"../arrow\":18,\"../carousel/navigation\":21,\"jquery\":\"jquery\"}],43:[function(require,module,exports){\n// project dependencies\nvar getUrlParameter = require('../utils/getUrlParameter'),\n\n// constants\n\tINTERVAL_DELAY = 300,\n\tMAX_INTERVAL_TICKS = 10;\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-joinAutofill';\n\nexports.constructor = function() {\n\n\tvar _$el, \t\n\t\t_$form;\n\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\n\t\t_$form = _$el.find('form');\n\n\t\tformCheck();\n\n\t}\n\n\tfunction formCheck() {\n\n\t\tvar i = 0,\n\t\t\tinterval = setInterval(checkForm, INTERVAL_DELAY);\n\n\t\tfunction checkForm() {\n\n\t\t\ti++;\n\n\t\t\tif (_$form[0]) {\n\n\t\t\t\tclearInterval(interval);\n\t\t\t\tgetUrl();\n\n\t\t\t} else if (i >= MAX_INTERVAL_TICKS) {\n\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getUrl() {\n\n\t\tvar email = getUrlParameter('email');\n\n\t\tif(email) {\n\n\t\t\t_$form.find('input[name*=\"fields_email\"]' ).val(email);\n\t\t}\n\t}\n\n\tthis.init = init;\n};\n\n},{\"../utils/getUrlParameter\":58}],44:[function(require,module,exports){\n// Vendor dependencies\nvar $ = require('jquery'),\n\n// Project dependencies\n\tLoader = require('../utils/Loader'),\n\tmoduleFactory = require('../core/moduleFactory'),\n\tBasicView = require('../utils/BasicView'),\n\tparseLoadedResponse = require('../utils/parseLoadedResponse'),\n\tdeferredAjax = require('../utils/deferredAjax'),\n\n// Constants\n\tSELECTOR_CONTENT = '.js-loadMore-content',\n\tSELECTOR_LOADER = '.js-loadMore__loader',\n\tSELECTOR_CTA = '.js-loadMore__cta';\n\n\n\n/* ==========================================================================\n \tModule Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-loadMore';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$ctaEl,\n\t\t_loader,\n\t\t_cta,\n\t\t_paginationUrl,\n\t\t_isLoading;\n\n\n\n\t/* ==========================================================================\n\t \tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_isLoading = false;\n\n\t\t_loader = new Loader();\n\t\t_cta = new BasicView();\n\n\t\tsetupViews();\n\n\n\t}\n\n\n\t/* ==========================================================================\n\t \tView Handling\n\t =========================================================================== */\n\n\n\tfunction setupViews() {\n\n\t\tvar $loader = _$el.find(SELECTOR_LOADER),\n\t\t\t$content = $(SELECTOR_CONTENT);\n\n\t\t_$ctaEl = _$el.find(SELECTOR_CTA);\n\n\n\t\tif(!$content.length) {\n\n\t\t\tconsole.error('`.js-loadMore` module needs a `' + SELECTOR_CONTENT + '` to parse the loaded content.');\n\t\t\treturn;\n\t\t}\n\n\t\tif(!$loader.length) {\n\n\t\t\tconsole.error('`.js-loadMore` module needs a `' + SELECTOR_LOADER + '` to show the loading animation.');\n\t\t\treturn;\n\t\t}\n\n\t\tif(!_$ctaEl.length) {\n\n\t\t\tconsole.error('`.js-loadMore` module needs a `' + SELECTOR_CTA + '` to fetch the URL and actually trigger the content load.');\n\t\t\treturn;\n\t\t}\n\n\n\t\t_paginationUrl = _$ctaEl.attr('href');\n\n\t\t_cta.init(_$ctaEl);\n\t\t_loader.init($loader);\n\n\t\t_cta.show();\n\n\t\t_$ctaEl.click(onCtaClick);\n\t}\n\n\tfunction destroy() {\n\n\t\t_paginationUrl = null;\n\n\t\t_$ctaEl.off();\n\t\t_$ctaEl = null;\n\n\t\t_loader.destroy();\n\t\t_loader = null;\n\n\t\t_cta.destroy();\n\t\t_cta = null;\n\n\t\t_$el.off();\n\t\t_$el.remove();\n\t\t_$el = null;\n\t}\n\n\n\n\t/* ==========================================================================\n\t \tEvent Handling\n\t =========================================================================== */\n\n\n\tfunction onCtaClick(e) {\n\t\tvar bypass = _$el.data('bypass');\n\n\t\tif (bypass === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tloadContent();\n\t}\n\n\n\t/* ==========================================================================\n\t \tLoad Handling\n\t =========================================================================== */\n\n\n\tfunction loadContent() {\n\n\t\tvar storedResponse;\n\n\t\tif(_isLoading !== false) {\n\n\t\t\treturn\n\t\t}\n\n\t\t_isLoading = true;\n\n\t\t// We're handling the animation before actually loading to make it feel like it's actually loading.\n\t\treturn _cta.hide()\n\t\t\t.then(_loader.show)\n\n\t\t\t// Not sure how to pass responses to a deeper promise, so storing it in between.\n\t\t\t.then(function() {\n\t\t\t\treturn deferredAjax(_paginationUrl);\n\t\t\t})\n\t\t\t.then(function(response) { storedResponse = parseLoadedResponse(response, SELECTOR_CONTENT, '.js-loadMore-content__remove'); })\n\t\t\t.then(_loader.hide)\n\t\t\t.then(function() {\n\t\t\t\t_$el.after(storedResponse);\n\t\t\t})\n\n\t\t\t// Destroys itself so the moduleFactory can re-instantiate the newly injected loadMore module.\n\t\t\t.then(destroy)\n\t\t\t.then(moduleFactory.run)\n\n\t\t\t.fail(function(e) {\n\n\t\t\t\t_isLoading = false;\n\n\t\t\t\tconsole.error('Encountered issues during Load More', e);\n\t\t\t})\n\t}\n\n\n\n\t/* ==========================================================================\n\t \tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../core/moduleFactory\":8,\"../utils/BasicView\":53,\"../utils/Loader\":54,\"../utils/deferredAjax\":57,\"../utils/parseLoadedResponse\":60,\"jquery\":\"jquery\"}],45:[function(require,module,exports){\n\n// Project dependencies\nvar $ = require('jquery'),\n\n// constants\n\n\tCONTENT_ANIMATE_IN_DURATION = 0.26,\n\n\tCONTENT_ANIMATE_OUT_DURATION = 0.23,\n\tWRAPPER_ANIMATE_IN_DURATION = 0.35,\n\tWRAPPER_ANIMATE_OUT_DURATION = 0.25,\n\tCONTENT_OFFSET = 20;\n\n\n\n\n/* ==========================================================================\n\t Module Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-overlay';\n\nexports.constructor = function() {\n\n\n/* ==========================================================================\n\t\tInitialization\n========================================================================== */\n\n\tvar _$el,\n\t\t_$content,\n\t\t_$videoWrapper,\n\t\t_$toggle,\n\t\t_isShown = false,\n\t\t_youtubeId;\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\n\t\t_$content = _$el.find('.js-overlay__content');\n\t\t_$videoWrapper = _$el.find('.js-overlay__video-wrapper');\n\t\t_$toggle = $('.js-overlay-toggle');\n\t\t_youtubeId = _$el.data('youtube-id');\n\n\t\t_$toggle.click(onToggleClick);\n\t}\n\n\tfunction onToggleClick(e) {\n\n\t\te.preventDefault();\n\n\t\tif(_isShown) {\n\n\t\t\thide();\n\n\t\t} else {\n\n\t\t\tshow();\n\t\t}\n\t}\n\n\tfunction show() {\n\n\t\t_isShown = true;\n\n\t\t$('body').css('overflow-y', 'hidden');\n\t\t_$el.css('display', 'flex');\n\n\t\tTweenLite.to(_$content, WRAPPER_ANIMATE_IN_DURATION, {y: '0%', ease:Expo.easeOut});\n\t\tTweenLite.to(_$el, CONTENT_ANIMATE_IN_DURATION, {opacity: 1, ease:Expo.easeOut});\n\n\t\tif (_youtubeId) {\n\n\t\t\t_$videoWrapper.append('<iframe class=\"overlay__video\" src=\"https://www.youtube-nocookie.com/embed/' + _youtubeId + '?autoplay=0\" frameborder=\"0\" allowfullscreen></iframe>');\n\t\t}\n\n\t}\n\n\tfunction hide() {\n\n\t\t_isShown = false;\n\n\t\t$('body').css('overflow-y', 'auto');\n\n\t\tTweenLite.to(_$content, WRAPPER_ANIMATE_OUT_DURATION, {y: CONTENT_OFFSET + '%', ease:Expo.easeOut});\n\n\t\tTweenLite.to(_$el, CONTENT_ANIMATE_OUT_DURATION, {opacity: 0, ease:Quint.easeOut, onComplete: function() {\n\n\t\t\t_$el.css('display', 'none');\n\n\t\t\tif(_youtubeId) {\n\n\t\t\t\t_$videoWrapper.find('iframe').remove();\n\t\t\t}\n\n\t\t}});\n\t}\n\n\tthis.init = init;\n};\n\n},{\"jquery\":\"jquery\"}],46:[function(require,module,exports){\nvar $ = require('jquery'),\n\n\tSCRIPT_TAG = '',//<script async src=\"//embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>',\n\n// constants\n\tCONTENT_ANIMATE_IN_DURATION = 0.26,\n\n\tCONTENT_ANIMATE_OUT_DURATION = 0.23,\n\tWRAPPER_ANIMATE_IN_DURATION = 0.35,\n\tWRAPPER_ANIMATE_OUT_DURATION = 0.25,\n\tCONTENT_OFFSET = 20;\n\n\n\n\n/* ==========================================================================\n\t Module Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-overlayFlickr';\n\nexports.constructor = function() {\n\n\n/* ==========================================================================\n\t\tInitialization\n========================================================================== */\n\n\tvar _$el,\n\t\t_hasEmbedCode,\n\t\t_htmlData,\n\t\t_$body,\n\t\t_$content,\n\t\t_$container,\n\t\t_$toggle,\n\t\t_isShown = false;\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_hasEmbedCode = false;\n\n\t\t_htmlData = _$el.data('flickr-embed');\n\n\t\t_$body = $('body');\n\t\t_$container = _$el.find('.js-overlayFlickr__container');\n\t\t_$content = _$el.find('.js-overlayFlickr__content');\n\t\t_$toggle = _$el.find('.js-overlayFlickr__toggle');\n\n\t\t_$el.click(onToggleClick);\n\t\t_$toggle.click(onToggleClick);\n\n\t\tTweenLite.to(_$content, 0, {y: CONTENT_OFFSET + '%', ease:Expo.easeOut});\n\t}\n\n\tfunction onToggleClick(e) {\n\n\t\te.preventDefault();\n\n\t\tif(_isShown) {\n\n\t\t\thide();\n\n\t\t} else {\n\n\t\t\tshow();\n\t\t}\n\t}\n\n\tfunction show() {\n\n\t\t_isShown = true;\n\n\t\t_$body.css('overflow-y', 'hidden');\n\t\t_$container.css('display', 'flex');\n\n\t\tTweenLite.to(_$content, WRAPPER_ANIMATE_IN_DURATION, {y: '0%', ease:Expo.easeOut});\n\t\tTweenLite.to(_$container, CONTENT_ANIMATE_IN_DURATION, {opacity: 1, ease:Expo.easeOut});\n\n\t\tif(!_hasEmbedCode) {\n\n\t\t\taddEmbedCode();\n\t\t}\n\t}\n\n\tfunction hide() {\n\n\t\t_isShown = false;\n\n\t\t_$body.css('overflow-y', 'auto');\n\n\t\tTweenLite.to(_$content, WRAPPER_ANIMATE_OUT_DURATION, {y: CONTENT_OFFSET + '%', ease:Expo.easeOut});\n\n\t\tTweenLite.to(_$container, CONTENT_ANIMATE_OUT_DURATION, {opacity: 0, ease:Quint.easeOut, onComplete: function() {\n\n\t\t\t_$container.css('display', 'none');\n\n\t\t}});\n\t}\n\n\tfunction addEmbedCode() {\n\n\t\t_hasEmbedCode = true;\n\t\t_$content.html(_htmlData + SCRIPT_TAG);\n\t}\n\n\tthis.init = init;\n};\n\n},{\"jquery\":\"jquery\"}],47:[function(require,module,exports){\n// Vendor dependencies\nvar $ = require('jquery'),\n\n// Project dependencies\n\tparseLoadedResponse = require('../utils/parseLoadedResponse'),\n\tmoduleFactory = require('../core/moduleFactory'),\n\tdeferredAjax = require('../utils/deferredAjax'),\n\tLoader = require('../utils/Loader'),\n\n// Constants\n\tPAGE_PATH = '/search/',\n\tCLASS_IS_FILTERING = 'is-filtering',\n\tSELECTOR_LOADER = '.js-search__loader',\n\tSELECTOR_FORM = '.search__bar',\n\tSELECTOR_INPUT = '.search__bar__input',\n\tSELECTOR_CONTENT = '.js-loadMore-content';\n\n\n/* ==========================================================================\n \tModule Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-search';\n\nexports.constructor = function() {\n\n\tvar _win = window,\n\t\t_baseUrl,\n\t\t_$el,\n\t\t_$input,\n\t\t_$form,\n\t\t_$content,\n\t\t_loader;\n\n\n\t/* ==========================================================================\n\t \tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_baseUrl = location.origin;\n\t\t_$el = $el;\n\t\t_$form = _$el.find(SELECTOR_FORM);\n\t\t_$input = _$el.find(SELECTOR_INPUT);\n\t\t_$content = _$el.find(SELECTOR_CONTENT);\n\n\t\t_win.addEventListener('popstate', onPopState);\n\n\t\t_loader = new Loader();\n\t\t_loader.init(_$el.find(SELECTOR_LOADER));\n\n\t\t_$input.focus(function() {\n\n\t\t\tif(_$input.val() === 'search') {\n\n\t\t\t\t_$input.val('');\n\t\t\t}\n\t\t});\n\n\t\t_$form.submit(onFormSubmit);\n\n\t}\n\n\tfunction onFormSubmit(e) {\n\n\t\te.preventDefault();\n\n\t\t_$input.blur();\n\n\n\t\tpushState(encodeURIComponent(_$input.val()));\n\t}\n\n\tfunction setupLoad(query) {\n\n\t\tif(query === '') {\n\n\t\t\t// ignoring loading empty search, just remove the current results\n\t\t\t_$content.find('.card-search, .card-grid__load-more').remove();\n\n\t\t} else {\n\n\t\t\t_$content.addClass(CLASS_IS_FILTERING);\n\t\t\t_$input.val(decodeURIComponent(query));\n\n\n\t\t\tTweenLite.killDelayedCallsTo(startLoading);\n\t\t\tTweenLite.delayedCall(0.1, startLoading, [query]);//eslint-disable-line no-magic-numbers\n\t\t}\n\t}\n\n\tfunction startLoading(query){\n\n\t\t_loader.show();\n\n\t\tdeferredAjax(_baseUrl + PAGE_PATH + query)\n\t\t\t.then(showNewContent);\n\t}\n\n\n\t/* ==========================================================================\n\t \tLoad Handling\n\t =========================================================================== */\n\n\n\tfunction showNewContent(response) {\n\n\t\tvar parsedResponse = parseLoadedResponse(response, SELECTOR_CONTENT);\n\n\t\t_loader.hide()\n\t\t\t.then(_loader.dispose)\n\t\t\t.then(function(){\n\n\t\t\t\t_$content.html(parsedResponse);\n\n\t\t\t\t_loader.init($(SELECTOR_LOADER));\n\n\t\t\t\t_$content.removeClass(CLASS_IS_FILTERING);\n\n\t\t\t\tmoduleFactory.run(_$el);\n\t\t\t})\n\t\t\t.fail(function(e) {\n\n\t\t\t\tconsole.error('Encountered issues during Search', e);\n\t\t\t});\n\t}\n\n\tfunction onPopState() {\n\n\t\tsetupLoad(_win.location.pathname.replace(PAGE_PATH, ''));\n\t}\n\n\tfunction pushState(query) {\n\n\t\tvar url;\n\n\t\tif(_win.history) {\n\n\t\t\turl = _baseUrl + PAGE_PATH + query;\n\n\t\t\t_win.history.pushState(\n\t\t\t\t{ url: url },\n\t\t\t\t'',\n\t\t\t\turl\n\t\t\t);\n\t\t}\n\n\t\tsetupLoad(query);\n\t}\n\n\n\n\t/* ==========================================================================\n\t \tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../core/moduleFactory\":8,\"../utils/Loader\":54,\"../utils/deferredAjax\":57,\"../utils/parseLoadedResponse\":60,\"jquery\":\"jquery\"}],48:[function(require,module,exports){\n// Project dependencies\nvar matchMedia = require('../core/events/matchMedia'),\n\teventBus = require('../core/eventBus'),\n\tcssPrefix = require('../utils/cssPrefix'),\n\n// constants\n\tOFFSET_FACTOR = 0.125,// based on the `top:12.5%` in the `.is-fixed` classes\n\tTRANSFORM_PREFIX = cssPrefix.js + 'Transform',\n\tCLASS_IS_FIXED = 'is-fixed';\n\n\n\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-shareBar';\n\nexports.constructor = function() {\n\n\n\tvar _$el,\n\t\t_$container,\n\t\t_windowHeight,\n\t\t_containerHeight,\n\t\t_$parent,\n\t\t_dontSnap,\n\t\t_isFixed = false,\n\t\t_offset = 0,\n\t\t_positioningOffset = 0,\n\t\t_scrollTop = 0;\n\n\n\t/* ==========================================================================\n\t Initialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_$container = _$el.find('.share__container');\n\t\t_$parent = _$el.parent();\n\n\t\teventBus.on(eventBus.SCROLL, onScroll);\n\t\teventBus.on(eventBus.RESIZE, onResize);\n\t}\n\n\n\t/* ==========================================================================\n\t Event handling\n\t ========================================================================== */\n\n\tfunction onScroll(e, scrollValue) {\n\n\t\t_scrollTop = scrollValue.scrollTop;\n\n\t\tredraw();\n\t}\n\n\tfunction onResize(e, width, height) {\n\n\t\tvar newWidth = Math.round(_$el.width() / 2);\n\n\t\t_windowHeight = height;\n\t\t_containerHeight = _$container.height();\n\t\t_positioningOffset = height * OFFSET_FACTOR;\n\n\t\t_dontSnap = width < matchMedia.LARGE_WINDOW;\n\n\t\tif(!_dontSnap) {\n\n\t\t\t_$container.width(newWidth);\n\t\t\t_$container.css('margin-left', Math.round(newWidth / 2));\n\n\t\t} else {\n\n\t\t\t_$container.css('width', '');\n\t\t\t_$container.css('margin-left', '');\n\t\t}\n\n\t\tredraw();\n\t}\n\n\n\n\t/* ==========================================================================\n\t Helpers\n\t ========================================================================== */\n\n\n\tfunction redraw() {\n\n\t\tvar parentOffsetTop = _$parent.offset().top,\n\t\t\tparentPositioningOffset,\n\t\t\tsnapToTop,\n\t\t\tsnapToBottom;\n\n\t\tif(_dontSnap) {\n\n\t\t\tupdateIsFixed(false);\n\t\t\tupdateOffset(0);\n\n\t\t\tif(_$parent.height() - _windowHeight + parentOffsetTop <= _scrollTop) {\n\n\t\t\t\thide();\n\n\t\t\t} else {\n\n\t\t\t\tshow();\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tparentPositioningOffset = _$parent.height() - _positioningOffset - _containerHeight;\n\t\t\tsnapToTop = parentOffsetTop >= _scrollTop + _positioningOffset;\n\t\t\tsnapToBottom = parentOffsetTop + parentPositioningOffset <= _scrollTop + _positioningOffset;\n\t\t}\n\n\n\t\tif(snapToTop) {\n\n\t\t\tupdateIsFixed(false);\n\t\t\tupdateOffset(0);\n\n\t\t} else if(snapToBottom) {\n\n\t\t\tupdateIsFixed(false);\n\t\t\tupdateOffset(Math.round(parentPositioningOffset));\n\n\t\t} else {\n\n\t\t\tupdateIsFixed(true);\n\t\t\tupdateOffset(0);\n\t\t}\n\t}\n\n\tfunction hide() {\n\n\t\t_$el.addClass('is-hidden');\n\t}\n\n\tfunction show() {\n\n\t\t_$el.removeClass('is-hidden');\n\t}\n\n\tfunction updateIsFixed(newIsFixed) {\n\n\t\tif(_isFixed !== newIsFixed) {\n\n\t\t\t_isFixed = newIsFixed;\n\n\t\t\tif(_isFixed) {\n\n\t\t\t\t_$el.addClass(CLASS_IS_FIXED);\n\n\t\t\t} else {\n\n\t\t\t\t_$el.removeClass(CLASS_IS_FIXED);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction updateOffset(newOffset) {\n\n\t\tif(_offset !== newOffset) {\n\n\t\t\t_offset = newOffset;\n\n\t\t\tif(_offset > 0) {\n\n\t\t\t\t_$el.css(TRANSFORM_PREFIX, 'translateY(' + _offset + 'px)');\n\t\t\t\t_$el.css(TRANSFORM_PREFIX, 'translate3d(0, ' + _offset + 'px, 0)');\n\n\t\t\t} else {\n\n\t\t\t\t_$el.css(TRANSFORM_PREFIX, '');\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"../core/eventBus\":1,\"../core/events/matchMedia\":2,\"../utils/cssPrefix\":56}],49:[function(require,module,exports){\nvar $ = require('jquery'),\n\n\tNETWORK_FACEBOOK = 'facebook',\n\tNETWORK_TWITTER = 'twitter';\n\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-socialShare';\n\nexports.constructor = function() {\n\n\tvar _$el,\n\t\t_network;\n\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_network = _$el.data('network');\n\n\t\t_$el.click(onClick);\n\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent Handling\n\t ========================================================================== */\n\n\n\tfunction onClick() {\n\n\t\tvar title = encodeURIComponent($('title').html()),\n\t\t\turl = encodeURIComponent(window.location.href);\n\n\t\tswitch(_network) {\n\n\t\t\tcase NETWORK_FACEBOOK:\n\n\t\t\t\topenLink('https://www.facebook.com/sharer/sharer.php?u=' + url);\n\n\t\t\t\tbreak;\n\n\t\t\tcase NETWORK_TWITTER:\n\n\t\t\t\topenLink('https://twitter.com/intent/tweet?' + 'text=' + title + '&url=' + url + '&via=aspeninstitute');\n\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\n\t/* ==========================================================================\n\t\tHelpers\n\t =========================================================================== */\n\n\n\tfunction openLink(url) {\n\n\t\tvar anchorEl = document.createElement('a');\n\n\t\tanchorEl.target = '_blank';\n\t\tanchorEl.href = url;\n\n\t\tconsole.log(anchorEl);\n\n\t\tanchorEl.dispatchEvent(new MouseEvent('click'));\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"jquery\":\"jquery\"}],50:[function(require,module,exports){\n// constants\nvar CLASS_IS_OPEN = 'is-open';\n\n\n/* ==========================================================================\n\tModule Configuration\n ========================================================================== */\n\nexports.selector = '.js-subNav';\n\nexports.constructor = function() {\n\n\tvar _$el,\n\t\t_$toggleEl;\n\n\n\n\t/* ==========================================================================\n\t\tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_$toggleEl = _$el.find('.js-subNav__toggle');\n\n\t\t_$toggleEl.click(onToggleClick);\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tEvent Handling\n\t ========================================================================== */\n\n\n\tfunction onToggleClick(e) {\n\n\t\te.preventDefault();\n\n\t\tif(_$el.hasClass(CLASS_IS_OPEN)) {\n\n\t\t\t_$el.removeClass(CLASS_IS_OPEN)\n\n\t\t} else {\n\n\t\t\t_$el.addClass(CLASS_IS_OPEN)\n\t\t}\n\t}\n\n\n\n\t/* ==========================================================================\n\t\tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{}],51:[function(require,module,exports){\n/*==========================================================================\n Idea taken from http://osvaldas.info/caching-svg-sprite-in-localstorage\n ===========================================================================*/\n\n\n// Project dependencies\nvar $ = require('jquery'),\n\n// constants\n\tLOCAL_STORAGE_KEY_INLINE_SVG = 'inlineSVGdata',\n\tLOCAL_STORAGE_KEY_REVISION = 'inlineSVGrev',\n\n// selectors\n\t_win = window,\n\t_doc = document,\n\n// global vars\n\t_hasLocalStorage = 'localStorage' in _win && _win['localStorage'] !== null;\n\n\n\n/* ==========================================================================\n\t Module Configuration\n ========================================================================== */\n\n\nexports.selector = '.js-svgIconLoader';\n\nexports.constructor = function() {\n\n\n\tvar _svgPath,\n\t\t_$el,\n\t\tREVISION = 2,\n\t\t_data;\n\n\n\n\t/* ==========================================================================\n\t \tInitialization\n\t ========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\t\t_svgPath = _$el.data('svg-path');\n\n\t\t// if SVG is not supported, abort\n\t\tif(!_doc.createElementNS || !_doc.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect) {\n\n\t\t\treturn true;\n\t\t}\n\n\t\t// if local storage is available and the revision is current, fetch the data from local storage\n\t\tif(_hasLocalStorage && localStorage.getItem(LOCAL_STORAGE_KEY_REVISION) === REVISION) {\n\n\t\t\t_data = localStorage.getItem(LOCAL_STORAGE_KEY_INLINE_SVG);\n\n\t\t\t// if we actually have data, we can return and go on with our lives\n\t\t\tif(_data) {\n\n\t\t\t\tprependSvg();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t$.ajax(_svgPath,{dataType:'text'})\n\t\t\t.done(onSvgPathLoaded)\n\t}\n\n\n\n\t/* ==========================================================================\n\t \tPrivate Methods\n\t =========================================================================== */\n\n\n\tfunction onSvgPathLoaded(data) {\n\n\t\t_data = data;\n\n\t\tprependSvg();\n\t\tstoreLocally();\n\t}\n\n\tfunction storeLocally() {\n\n\t\tif (_hasLocalStorage) {\n\n\t\t\tlocalStorage.setItem(LOCAL_STORAGE_KEY_INLINE_SVG, _data);\n\t\t\tlocalStorage.setItem(LOCAL_STORAGE_KEY_REVISION, false);\n\t\t}\n\t}\n\n\tfunction prependSvg() {\n\n\t\t_$el.prepend(_data);\n\t}\n\n\n\n\t/* ==========================================================================\n\t \tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n};\n\n},{\"jquery\":\"jquery\"}],52:[function(require,module,exports){\n// Project dependencies\nvar eventBus = require('../../core/eventBus'),\n\tmatchMedia = require('../../core/events/matchMedia'),\n\tgtmDataPusher = require('../../utils/gtmDataPusher'),\n\tNavigation = require('../carousel/navigation'),\n\tjq = require('jquery'),\n\n\t// constants\n\n\tACTION_SWIPE = 'swipe',\n\tANIMATE_DURATION = 0.5;\n\n/* ==========================================================================\n Module Configuration\n ========================================================================== */\n\nexports.selector = '.js-top-event-locations';\n\nexports.constructor = function() {\n\n\t/* ==========================================================================\n\t Initialize\n\t ========================================================================== */\n\n\t// NOTE: Sizes are separted by px(pixels) and pct (percentage)\n\n\tvar fullPct = 100,\n\n\t\t_$el,\n\t\t_$container,\n\t\t_$allChildren,\n\t\t_$navigation,\n\n\t\tchildrenCount,\n\t\tparentPx,\n\n\t\tchildrenMarginPx,\n\n\t\tchildrenPct,\n\t\tchildrenMarginPct,\n\n\t\t// Final Element Ptc\n\n\t\tnewParentPct,\n\t\tnewChildrenPct,\n\t\tnewMarginPtc,\n\n\t\t_navigation,\n\n\t\tcarouselIsActive = false,\n\t\tcolumsPerSize,\n\n\t\t// Carousel Data\n\n\t\ttotalMoves,\n\t\ttotalMovesRight,\n\t\ttotalMovesLeft,\n\t\tresizeMoves,\n\n\t\tmovesPerSize,\n\n\t\tcurrentElementIndex = 1;\n\n\n\tfunction init($el) {\n\n\t\t_$el = $el;\n\n\n\t\t_$container = _$el.find('.js-top-event-locations__container');\n\t\t_$allChildren = _$container.children();\n\n\t\t// Parent Values\n\n\t\tparentPx = _$container.width();\n\n\t\t// Children Values\n\n\t\tchildrenCount = _$allChildren.length;\n\n\t\tchildrenMarginPx = (parseFloat(_$allChildren.css('margin-right').replace('px', '')) +\n\n\t\t\tparseFloat(_$allChildren.css('margin-left').replace('px', '')));\n\n\t\teventBus.on(eventBus.MATCH_MEDIA, _resize);\n\n\t\t_$navigation = _$el.find('.js-carousel__navigation');\n\n\t\t//\t\tInit Arrows\n\n\t\t_navigation = new Navigation(_$navigation);\n\n\t\tnavigationStyle();\n\n\n\t\t_$el.hammer().on('swiperight', function() {\n\n\t\t\tgtmDataPusher(\"Events_Upcoming Events\", ACTION_SWIPE, \"Left Nav\");\n\t\t\tbindSteps('left');\n\t\t});\n\n\t\t_$el.hammer().on('swipeleft', function() {\n\n\t\t\tgtmDataPusher(\"Events_Upcoming Events\", ACTION_SWIPE, \"Right Nav\");\n\t\t\tbindSteps('right');\n\t\t});\n\n\t\t_$el.find('.js-carousel__dot').on('click', function() {\n\t\t\tvar i = jq(this).index();\n\t\t\tbindSteps(null, i);\n\t\t});\n\n\t}\n\n\tfunction navigationStyle() {\n\n\t\tif (_$allChildren.length === 1) {\n\t\t\treturn;\n\t\t}\n\t\tvar i;\n\n\t\tfor (i = 0; i < _$allChildren.length; i++) {\n\n\t\t\t_navigation.createDots();\n\n\t\t}\n\n\t\t_navigation.activateDot(1);\n\t}\n\n\tfunction _resize(e, resize) {\n\n\t\tif (resize >= matchMedia.LARGE_WINDOW) {\n\n\t\t\tmovesPerSize = 2;\n\t\t\tcolumsPerSize = 5;\n\n\t\t} else if (resize === matchMedia.MEDIUM_WINDOW) {\n\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1;\n\n\t\t} else {\n\n\t\t\tmovesPerSize = 1;\n\t\t\tcolumsPerSize = 1.1;\n\t\t}\n\n\n\t\tif (childrenCount > columsPerSize) {\n\n\t\t\tstyleColumns(true);\n\t\t\tcheckStatus(true);\n\n\n\t\t} else {\n\n\t\t\tstyleColumns(false);\n\t\t\tcheckStatus(false);\n\n\t\t}\n\t\tresetSteps();\n\n\t}\n\n\tfunction resetSteps() {\n\n\t\ttotalMoves = ((childrenCount / movesPerSize) - 1) - ((columsPerSize / movesPerSize) - 1);\n\n\t\tresizeMoves = (currentElementIndex - 1) / movesPerSize;\n\n\t\ttotalMovesLeft = resizeMoves > totalMoves ? totalMoves : resizeMoves;\n\n\t\ttotalMovesRight = totalMoves - totalMovesLeft;\n\n\t\tanimate(totalMovesLeft);\n\n\t}\n\n\tfunction styleColumns(t) {\n\n\t\tchildrenMarginPct = getPercentage(childrenMarginPx);\n\t\tchildrenPct = (fullPct / columsPerSize) - (childrenMarginPct);\n\n\t\tnewParentPct = childrenCount * (childrenPct + (childrenMarginPct * 2));\n\t\tnewMarginPtc = fullPct * childrenMarginPct / (childrenCount * childrenPct);\n\t\tnewChildrenPct = fullPct / childrenCount - (newMarginPtc * 2);\n\n\n\t\tif (t) {\n\t\t\t_$container.css('width', newParentPct + '%');\n\t\t\t_$allChildren.css({\n\t\t\t\t'width': newChildrenPct + '%',\n\t\t\t\t'margin': newMarginPtc / 2 + '%'\n\t\t\t});\n\t\t} else {\n\t\t\t_$container.css('width', '');\n\t\t\t_$allChildren.css({\n\t\t\t\t'width': '',\n\t\t\t\t'margin': ''\n\t\t\t});\n\t\t}\n\t\t// _$elOffset = _$el.position().left;\n\n\t}\n\n\tfunction checkStatus(isActive) {\n\n\t\tif (carouselIsActive !== isActive) {\n\n\t\t\tcarouselIsActive = isActive;\n\n\t\t\tcarouselIsActive ? activate() : deactivate();\n\t\t}\n\t}\n\n\t/* ==========================================================================\n\n\t Calculating elements\n\n\t ========================================================================== */\n\n\tfunction getPercentage(elementSize) {\n\n\t\treturn elementSize / parentPx * fullPct;\n\n\t}\n\n\t/* ==========================================================================\n\n\t Carousel Utils\n\n\t ========================================================================== */\n\n\tfunction bindSteps(direction, jump) {\n\t\tif (totalMovesRight >= 0) {\n\n\t\t\ttotalMovesRight = calculateTotalMovesRight(direction === 'right', jump);\n\n\t\t\ttotalMovesLeft = totalMoves - totalMovesRight;\n\n\t\t\tcurrentElementIndex = totalMovesLeft * movesPerSize + 1;\n\n\t\t\tanimate(totalMovesLeft);\n\n\t\t\t_navigation.activateDot(Math.round(currentElementIndex));\n\t\t}\n\n\t}\n\n\tfunction calculateTotalMovesRight(t, j) {\n\t\tvar tr;\n\t\tif (t && j===undefined) {\n\t\t\ttr = totalMovesRight >= 1 ? totalMovesRight - 1 : totalMovesRight - totalMovesRight;\n\t\t} else if (!t && j===undefined) {\n\t\t\ttr = totalMovesLeft >= 1 ? totalMovesRight + 1 : totalMovesRight + totalMovesLeft;\n\t\t} else {\n\t\t\ttr = (totalMoves - j >= 0) ? totalMoves - j : 0;\n\t\t}\n\t\treturn tr;\n\t}\n\n\n\tfunction animate(distance) {\n\n\t\tTweenLite.to(_$container, ANIMATE_DURATION, {\n\t\t\tx: -(distance * ((newChildrenPct + newMarginPtc) * movesPerSize)) + '%',\n\t\t\tease: Cubic.easeOut\n\t\t});\n\n\t}\n\n\n\n\n\tfunction activate() {\n\n\t\tresetSteps();\n\t}\n\n\tfunction deactivate() {\n\n\t\tresetSteps();\n\n\t}\n\n\tthis.init = init;\n};\n\n},{\"../../core/eventBus\":1,\"../../core/events/matchMedia\":2,\"../../utils/gtmDataPusher\":59,\"../carousel/navigation\":21,\"jquery\":\"jquery\"}],53:[function(require,module,exports){\n// project dependencies\nvar Q = require('kew'),\n\n// constants\n\tDEFAULT_DELAY = 350,\n\tCLASS_SHOWN = 'is-shown';\n\n\n\nmodule.exports = function(){\n\n\tvar _$el,\n\t\t_showDelay,\n\t\t_hideDelay;\n\n\n\n\t/* ==========================================================================\n\t \tState handling\n\t =========================================================================== */\n\n\n\tfunction init($el) {\n\n\t\tvar defaultDelay;\n\n\t\t_$el = $el;\n\n\t\tdefaultDelay = _$el.data('delay') || DEFAULT_DELAY;\n\n\t\t_showDelay = _$el.data('show-delay') || defaultDelay;\n\t\t_hideDelay = _$el.data('hide-delay') || defaultDelay;\n\t}\n\n\tfunction show() {\n\n\t\t_$el.addClass(CLASS_SHOWN);\n\n\t\treturn Q.delay(_showDelay);\n\t}\n\n\tfunction hide() {\n\n\t\t_$el.removeClass(CLASS_SHOWN);\n\n\t\treturn Q.delay(_hideDelay);\n\t}\n\n\tfunction destroy() {\n\n\t\t_$el = null;\n\t}\n\n\n\n\t/* ==========================================================================\n\t \tPublic Methods\n\t =========================================================================== */\n\n\n\tthis.init = init;\n\tthis.show = show;\n\tthis.hide = hide;\n\tthis.destroy = destroy;\n};\n\n},{\"kew\":\"kew\"}],54:[function(require,module,exports){\nvar Q = require('kew');\n\nmodule.exports = function() {\n\n\tvar _$loader,\n\t\t_$loaderSquares,\n\t\t_showTween,\n\t\t_rotationTween,\n\t\t_shouldHide,\n\t\t_hideDefer;\n\n\n\n\t/* ==========================================================================\n\t State handling\n\t =========================================================================== */\n\n\tfunction init($el) {\n\n\t\tvar TIME_ROTATION_TWEEN = 0.8,\n\t\t\tTIME_SHOW_TWEEN = 1;\n\n\t\t_$loader = $el;\n\t\t_$loaderSquares =_$loader.find('.js-loaderSquare');\n\n\t\t_shouldHide = false;\n\n\t\tTweenLite.set(_$loaderSquares, {autoAlpha: 0, scale: 0});\n\n\t\t_rotationTween = TweenLite.to(_$loader, TIME_ROTATION_TWEEN, {\n\t\t\t\trotation: \"-=360\",\n\t\t\t\tease:Linear.easeNone,\n\t\t\t\tpaused:true\n\t\t\t}\n\t\t);\n\n\t\t_rotationTween.vars.onComplete = _rotationTween.restart;\n\t\t_rotationTween.vars.onCompleteScope = _rotationTween;\n\n\t\t_showTween = TweenLite.to(_$loaderSquares, TIME_SHOW_TWEEN, {\n\t\t\t\tautoAlpha: 1,\n\t\t\t\tscale: 1,\n\t\t\t\tease:Back.easeOut,\n\t\t\t\tforce3D:true,\n\t\t\t\ttransformOrigin:\"center center\",\n\t\t\t\tsmoothOrigin:false,\n\t\t\t\tpaused:true,\n\t\t\t\tonComplete: outAnim\n\t\t\t}\n\t\t);\n\t}\n\n\n\t/* ==========================================================================\n\t Animation Functions\n\t ========================================================================== */\n\n\tfunction outAnim () {\n\n\t\tvar TIME_SQUARE_TWEEN = 0.55,\n\t\t\tDELAY_FACTOR_SQUARE_TWEEN = TIME_SQUARE_TWEEN / 10,//eslint-disable-line no-magic-numbers\n\t\t\tSCALE_TO_SQUARE = 0.3,\n\t\t\tonComplete,\n\t\t\ttotalElements = _$loaderSquares.length,\n\t\t\ti;\n\n\t\tfor(i = totalElements - 1; i >= 0; i--) {\n\n\t\t\tif(i === 0) {\n\n\t\t\t\tonComplete = evaluateOnComplete;\n\t\t\t}\n\n\t\t\tTweenLite.fromTo(_$loaderSquares[i], TIME_SQUARE_TWEEN,\n\t\t\t\t{\n\t\t\t\t\tautoAlpha: 1,\n\t\t\t\t\tscale: 1\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tautoAlpha: 0,\n\t\t\t\t\tscale: SCALE_TO_SQUARE,\n\t\t\t\t\tease: Quart.easeOut,\n\t\t\t\t\ttransformOrigin: \"center center\",\n\t\t\t\t\tsmoothOrigin: false,\n\t\t\t\t\tdelay: i * DELAY_FACTOR_SQUARE_TWEEN,\n\t\t\t\t\tonComplete: onComplete\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction evaluateOnComplete() {\n\n\t\tif(_shouldHide) {\n\n\t\t\tstopOutAnim();\n\n\t\t} else {\n\n\t\t\trestartShow();\n\t\t}\n\t}\n\n\tfunction restartShow() {\n\n\t\tTweenLite.delayedCall(0.25, _showTween.restart, undefined, _showTween);//eslint-disable-line no-magic-numbers\n\t}\n\n\n\tfunction stopOutAnim () {\n\n\t\t// added a little delay to make it feel less abrupt when hide is finished\n\t\tTweenLite.delayedCall(0.6, _hideDefer.resolve, undefined, _hideDefer);//eslint-disable-line no-magic-numbers\n\t}\n\n\tfunction show() {\n\n\t\tvar defer = Q.defer();\n\n\t\t_showTween.play();\n\t\t_rotationTween.play();\n\n\t\tdefer.resolve();\n\n\t\treturn defer.promise;\n\t}\n\n\tfunction hide() {\n\n\t\t_hideDefer = Q.defer();\n\t\t_shouldHide = true;\n\n\t\treturn _hideDefer.promise;\n\t}\n\n\tfunction destroy() {\n\n\t\t_rotationTween.pause();\n\t\t_showTween.pause();\n\n\t\t_showTween.kill();\n\t\t_rotationTween.kill();\n\t}\n\n\t/* ==========================================================================\n\t Public Methods\n\t =========================================================================== */\n\n\tthis.init = init;\n\tthis.show = show;\n\tthis.hide = hide;\n\tthis.destroy = destroy;\n};\n\n\n},{\"kew\":\"kew\"}],55:[function(require,module,exports){\n// project dependencies\nvar eventBus = require('../core/eventBus'),\n\n\t_windowHeight,\n\t_scrollTop;\n\neventBus.on(eventBus.RESIZE, onResize);\neventBus.on(eventBus.SCROLL, onScroll);\n\nfunction onResize(e, newWidth, newHeight) {\n\n\t_windowHeight = newHeight;\n}\n\nfunction onScroll(e, newScrollValue) {\n\n\t_scrollTop = newScrollValue.scrollTop;\n}\n\n\nfunction checkInView($el) {\n\n\tvar elementHeight = $el.height(),\n\t\toffset = $el.offset().top,\n\t\tisInView = _windowHeight + _scrollTop > offset && _scrollTop < offset + elementHeight;\n\n\treturn isInView;\n}\n\nmodule.exports = checkInView;\n\n},{\"../core/eventBus\":1}],56:[function(require,module,exports){\n// borrowed from : https://davidwalsh.name/vendor-prefix\nvar prefix = (function () {\n\tvar styles = window.getComputedStyle(document.documentElement, ''),\n\t\tpre = (Array.prototype.slice\n\t\t\t\t.call(styles)\n\t\t\t\t.join('')\n\t\t\t\t.match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o'])\n\t\t)[1],\n\t\tdom = ('WebKit|Moz|MS|O').match(new RegExp('(' + pre + ')', 'i'))[1];\n\treturn {\n\t\tdom: dom,\n\t\tlowercase: pre,\n\t\tcss: '-' + pre + '-',\n\t\tjs: pre[0].toUpperCase() + pre.substr(1)\n\t};\n})();\n\n\nmodule.exports = prefix;\n\n},{}],57:[function(require,module,exports){\n// Vendor dependencies\nvar $ = require('jquery'),\n\tQ = require('kew');\n\nmodule.exports = function(url, options) {\n\n\tvar defer = Q.defer();\n\n\t$.ajax(url, options)\n\t\t.done(function(data) { defer.resolve(data); })\n\t\t.fail(function(jqXHR, textStatus, errorThrown){\n\n\t\t\tdefer.reject(new Error(textStatus + ' - ' + errorThrown));\n\t\t});\n\n\treturn defer.promise;\n};\n\n},{\"jquery\":\"jquery\",\"kew\":\"kew\"}],58:[function(require,module,exports){\n// taken from http://stackoverflow.com/a/21903119/921964\nmodule.exports = function(requestedKey) {\n\n\tvar pageURL = decodeURIComponent(window.location.search.substring(1)),\n\t\tURLVariables = pageURL.split('&'),\n\t\tparameter,\n\t\tparameterKey,\n\t\tparameterValue,\n\t\ti;\n\n\tfor (i = 0; i < URLVariables.length; i++) {\n\n\t\tparameter = URLVariables[i].split('=');\n\t\tparameterKey = parameter[0];\n\n\t\tif(parameterKey === requestedKey) {\n\n\t\t\tparameterValue = parameter[1];\n\n\t\t\treturn parameterValue === undefined ? true : parameterValue;\n\t\t}\n\t}\n};\n\n},{}],59:[function(require,module,exports){\nvar GTM_CLICK_EVENT = 'gtm.event';\n\nmodule.exports = function(category, action, label) {\n\n\tgtmDataLayer.push({\n\t\t'event': GTM_CLICK_EVENT,\n\t\t'category': category,\n\t\t'action' : action,\n\t\t'label': label\n\t});\n};\n\n},{}],60:[function(require,module,exports){\nvar $ = require('jquery');\n\nmodule.exports = function(response, contentSelector, removeSelector) {\n\n\tvar $parsedResponse = $(response).find(contentSelector),\n\t\t$remove;\n\n\t// removeSelector can be used to remove certain elements from the loaded content\n\t// (for example the filter loader at the top of the grid)\n\tif(removeSelector) {\n\n\t\t$remove = $parsedResponse.find(removeSelector);\n\t\t$remove.remove();\n\t}\n\n\treturn $parsedResponse.html();\n};\n\n},{\"jquery\":\"jquery\"}],61:[function(require,module,exports){\n/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n  'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n    return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n    if (Array.isArray(arg)) {\n        each(arg, context[fn], context);\n        return true;\n    }\n    return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n    var i;\n\n    if (!obj) {\n        return;\n    }\n\n    if (obj.forEach) {\n        obj.forEach(iterator, context);\n    } else if (obj.length !== undefined) {\n        i = 0;\n        while (i < obj.length) {\n            iterator.call(context, obj[i], i, obj);\n            i++;\n        }\n    } else {\n        for (i in obj) {\n            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n        }\n    }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n    return function() {\n        var e = new Error('get-stack-trace');\n        var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n            .replace(/^\\s+at\\s+/gm, '')\n            .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n        var log = window.console && (window.console.warn || window.console.log);\n        if (log) {\n            log.call(window.console, deprecationMessage, stack);\n        }\n        return method.apply(this, arguments);\n    };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n    assign = function assign(target) {\n        if (target === undefined || target === null) {\n            throw new TypeError('Cannot convert undefined or null to object');\n        }\n\n        var output = Object(target);\n        for (var index = 1; index < arguments.length; index++) {\n            var source = arguments[index];\n            if (source !== undefined && source !== null) {\n                for (var nextKey in source) {\n                    if (source.hasOwnProperty(nextKey)) {\n                        output[nextKey] = source[nextKey];\n                    }\n                }\n            }\n        }\n        return output;\n    };\n} else {\n    assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n    var keys = Object.keys(src);\n    var i = 0;\n    while (i < keys.length) {\n        if (!merge || (merge && dest[keys[i]] === undefined)) {\n            dest[keys[i]] = src[keys[i]];\n        }\n        i++;\n    }\n    return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n    return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n    var baseP = base.prototype,\n        childP;\n\n    childP = child.prototype = Object.create(baseP);\n    childP.constructor = child;\n    childP._super = baseP;\n\n    if (properties) {\n        assign(childP, properties);\n    }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n    return function boundFn() {\n        return fn.apply(context, arguments);\n    };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n    if (typeof val == TYPE_FUNCTION) {\n        return val.apply(args ? args[0] || undefined : undefined, args);\n    }\n    return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n    return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.addEventListener(type, handler, false);\n    });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.removeEventListener(type, handler, false);\n    });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n    while (node) {\n        if (node == parent) {\n            return true;\n        }\n        node = node.parentNode;\n    }\n    return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n    return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n    return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n    if (src.indexOf && !findByKey) {\n        return src.indexOf(find);\n    } else {\n        var i = 0;\n        while (i < src.length) {\n            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n                return i;\n            }\n            i++;\n        }\n        return -1;\n    }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n    return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n    var results = [];\n    var values = [];\n    var i = 0;\n\n    while (i < src.length) {\n        var val = key ? src[i][key] : src[i];\n        if (inArray(values, val) < 0) {\n            results.push(src[i]);\n        }\n        values[i] = val;\n        i++;\n    }\n\n    if (sort) {\n        if (!key) {\n            results = results.sort();\n        } else {\n            results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n    }\n\n    return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n    var prefix, prop;\n    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n    var i = 0;\n    while (i < VENDOR_PREFIXES.length) {\n        prefix = VENDOR_PREFIXES[i];\n        prop = (prefix) ? prefix + camelProp : property;\n\n        if (prop in obj) {\n            return prop;\n        }\n        i++;\n    }\n    return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n    return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n    var doc = element.ownerDocument || element;\n    return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n    var self = this;\n    this.manager = manager;\n    this.callback = callback;\n    this.element = manager.element;\n    this.target = manager.options.inputTarget;\n\n    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n    // so when disabled the input events are completely bypassed.\n    this.domHandler = function(ev) {\n        if (boolOrFn(manager.options.enable, [manager])) {\n            self.handler(ev);\n        }\n    };\n\n    this.init();\n\n}\n\nInput.prototype = {\n    /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */\n    handler: function() { },\n\n    /**\n     * bind the events\n     */\n    init: function() {\n        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    },\n\n    /**\n     * unbind the events\n     */\n    destroy: function() {\n        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n    var Type;\n    var inputClass = manager.options.inputClass;\n\n    if (inputClass) {\n        Type = inputClass;\n    } else if (SUPPORT_POINTER_EVENTS) {\n        Type = PointerEventInput;\n    } else if (SUPPORT_ONLY_TOUCH) {\n        Type = TouchInput;\n    } else if (!SUPPORT_TOUCH) {\n        Type = MouseInput;\n    } else {\n        Type = TouchMouseInput;\n    }\n    return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n    var pointersLen = input.pointers.length;\n    var changedPointersLen = input.changedPointers.length;\n    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n    input.isFirst = !!isFirst;\n    input.isFinal = !!isFinal;\n\n    if (isFirst) {\n        manager.session = {};\n    }\n\n    // source event is the normalized value of the domEvents\n    // like 'touchstart, mouseup, pointerdown'\n    input.eventType = eventType;\n\n    // compute scale, rotation etc\n    computeInputData(manager, input);\n\n    // emit secret event\n    manager.emit('hammer.input', input);\n\n    manager.recognize(input);\n    manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n    var session = manager.session;\n    var pointers = input.pointers;\n    var pointersLength = pointers.length;\n\n    // store the first input to calculate the distance and direction\n    if (!session.firstInput) {\n        session.firstInput = simpleCloneInputData(input);\n    }\n\n    // to compute scale and rotation we need to store the multiple touches\n    if (pointersLength > 1 && !session.firstMultiple) {\n        session.firstMultiple = simpleCloneInputData(input);\n    } else if (pointersLength === 1) {\n        session.firstMultiple = false;\n    }\n\n    var firstInput = session.firstInput;\n    var firstMultiple = session.firstMultiple;\n    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n    var center = input.center = getCenter(pointers);\n    input.timeStamp = now();\n    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n    input.angle = getAngle(offsetCenter, center);\n    input.distance = getDistance(offsetCenter, center);\n\n    computeDeltaXY(session, input);\n    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n    input.overallVelocityX = overallVelocity.x;\n    input.overallVelocityY = overallVelocity.y;\n    input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n    input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n        session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n    computeIntervalInputData(session, input);\n\n    // find the correct target\n    var target = manager.element;\n    if (hasParent(input.srcEvent.target, target)) {\n        target = input.srcEvent.target;\n    }\n    input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n    var center = input.center;\n    var offset = session.offsetDelta || {};\n    var prevDelta = session.prevDelta || {};\n    var prevInput = session.prevInput || {};\n\n    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n        prevDelta = session.prevDelta = {\n            x: prevInput.deltaX || 0,\n            y: prevInput.deltaY || 0\n        };\n\n        offset = session.offsetDelta = {\n            x: center.x,\n            y: center.y\n        };\n    }\n\n    input.deltaX = prevDelta.x + (center.x - offset.x);\n    input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n    var last = session.lastInterval || input,\n        deltaTime = input.timeStamp - last.timeStamp,\n        velocity, velocityX, velocityY, direction;\n\n    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n        var deltaX = input.deltaX - last.deltaX;\n        var deltaY = input.deltaY - last.deltaY;\n\n        var v = getVelocity(deltaTime, deltaX, deltaY);\n        velocityX = v.x;\n        velocityY = v.y;\n        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n        direction = getDirection(deltaX, deltaY);\n\n        session.lastInterval = input;\n    } else {\n        // use latest velocity info if it doesn't overtake a minimum period\n        velocity = last.velocity;\n        velocityX = last.velocityX;\n        velocityY = last.velocityY;\n        direction = last.direction;\n    }\n\n    input.velocity = velocity;\n    input.velocityX = velocityX;\n    input.velocityY = velocityY;\n    input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n    // make a simple copy of the pointers because we will get a reference if we don't\n    // we only need clientXY for the calculations\n    var pointers = [];\n    var i = 0;\n    while (i < input.pointers.length) {\n        pointers[i] = {\n            clientX: round(input.pointers[i].clientX),\n            clientY: round(input.pointers[i].clientY)\n        };\n        i++;\n    }\n\n    return {\n        timeStamp: now(),\n        pointers: pointers,\n        center: getCenter(pointers),\n        deltaX: input.deltaX,\n        deltaY: input.deltaY\n    };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n    var pointersLength = pointers.length;\n\n    // no need to loop when only one touch\n    if (pointersLength === 1) {\n        return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n    }\n\n    var x = 0, y = 0, i = 0;\n    while (i < pointersLength) {\n        x += pointers[i].clientX;\n        y += pointers[i].clientY;\n        i++;\n    }\n\n    return {\n        x: round(x / pointersLength),\n        y: round(y / pointersLength)\n    };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n    return {\n        x: x / deltaTime || 0,\n        y: y / deltaTime || 0\n    };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n    if (x === y) {\n        return DIRECTION_NONE;\n    }\n\n    if (abs(x) >= abs(y)) {\n        return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n\n    return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n    this.evEl = MOUSE_ELEMENT_EVENTS;\n    this.evWin = MOUSE_WINDOW_EVENTS;\n\n    this.pressed = false; // mousedown state\n\n    Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function MEhandler(ev) {\n        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n        // on start we want to have the left mouse button down\n        if (eventType & INPUT_START && ev.button === 0) {\n            this.pressed = true;\n        }\n\n        if (eventType & INPUT_MOVE && ev.which !== 1) {\n            eventType = INPUT_END;\n        }\n\n        // mouse must be down\n        if (!this.pressed) {\n            return;\n        }\n\n        if (eventType & INPUT_END) {\n            this.pressed = false;\n        }\n\n        this.callback(this.manager, eventType, {\n            pointers: [ev],\n            changedPointers: [ev],\n            pointerType: INPUT_TYPE_MOUSE,\n            srcEvent: ev\n        });\n    }\n});\n\nvar POINTER_INPUT_MAP = {\n    pointerdown: INPUT_START,\n    pointermove: INPUT_MOVE,\n    pointerup: INPUT_END,\n    pointercancel: INPUT_CANCEL,\n    pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n    2: INPUT_TYPE_TOUCH,\n    3: INPUT_TYPE_PEN,\n    4: INPUT_TYPE_MOUSE,\n    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n    this.evEl = POINTER_ELEMENT_EVENTS;\n    this.evWin = POINTER_WINDOW_EVENTS;\n\n    Input.apply(this, arguments);\n\n    this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function PEhandler(ev) {\n        var store = this.store;\n        var removePointer = false;\n\n        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n        // get index of the event in the store\n        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n        // start and mouse must be down\n        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n            if (storeIndex < 0) {\n                store.push(ev);\n                storeIndex = store.length - 1;\n            }\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n            removePointer = true;\n        }\n\n        // it not found, so the pointer hasn't been down (so it's probably a hover)\n        if (storeIndex < 0) {\n            return;\n        }\n\n        // update the event in the store\n        store[storeIndex] = ev;\n\n        this.callback(this.manager, eventType, {\n            pointers: store,\n            changedPointers: [ev],\n            pointerType: pointerType,\n            srcEvent: ev\n        });\n\n        if (removePointer) {\n            // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n    this.started = false;\n\n    Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n    handler: function TEhandler(ev) {\n        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n        // should we handle the touch events?\n        if (type === INPUT_START) {\n            this.started = true;\n        }\n\n        if (!this.started) {\n            return;\n        }\n\n        var touches = normalizeSingleTouches.call(this, ev, type);\n\n        // when done, reset the started state\n        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n            this.started = false;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n    var all = toArray(ev.touches);\n    var changed = toArray(ev.changedTouches);\n\n    if (type & (INPUT_END | INPUT_CANCEL)) {\n        all = uniqueArray(all.concat(changed), 'identifier', true);\n    }\n\n    return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n    this.evTarget = TOUCH_TARGET_EVENTS;\n    this.targetIds = {};\n\n    Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n    handler: function MTEhandler(ev) {\n        var type = TOUCH_INPUT_MAP[ev.type];\n        var touches = getTouches.call(this, ev, type);\n        if (!touches) {\n            return;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n    var allTouches = toArray(ev.touches);\n    var targetIds = this.targetIds;\n\n    // when there is only one touch, the process can be simplified\n    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n        targetIds[allTouches[0].identifier] = true;\n        return [allTouches, allTouches];\n    }\n\n    var i,\n        targetTouches,\n        changedTouches = toArray(ev.changedTouches),\n        changedTargetTouches = [],\n        target = this.target;\n\n    // get target touches from touches\n    targetTouches = allTouches.filter(function(touch) {\n        return hasParent(touch.target, target);\n    });\n\n    // collect touches\n    if (type === INPUT_START) {\n        i = 0;\n        while (i < targetTouches.length) {\n            targetIds[targetTouches[i].identifier] = true;\n            i++;\n        }\n    }\n\n    // filter changed touches to only contain touches that exist in the collected target ids\n    i = 0;\n    while (i < changedTouches.length) {\n        if (targetIds[changedTouches[i].identifier]) {\n            changedTargetTouches.push(changedTouches[i]);\n        }\n\n        // cleanup removed touches\n        if (type & (INPUT_END | INPUT_CANCEL)) {\n            delete targetIds[changedTouches[i].identifier];\n        }\n        i++;\n    }\n\n    if (!changedTargetTouches.length) {\n        return;\n    }\n\n    return [\n        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n        changedTargetTouches\n    ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n    Input.apply(this, arguments);\n\n    var handler = bindFn(this.handler, this);\n    this.touch = new TouchInput(this.manager, handler);\n    this.mouse = new MouseInput(this.manager, handler);\n\n    this.primaryTouch = null;\n    this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n    /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */\n    handler: function TMEhandler(manager, inputEvent, inputData) {\n        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n        if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n            return;\n        }\n\n        // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n        if (isTouch) {\n            recordTouches.call(this, inputEvent, inputData);\n        } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n            return;\n        }\n\n        this.callback(manager, inputEvent, inputData);\n    },\n\n    /**\n     * remove the event listeners\n     */\n    destroy: function destroy() {\n        this.touch.destroy();\n        this.mouse.destroy();\n    }\n});\n\nfunction recordTouches(eventType, eventData) {\n    if (eventType & INPUT_START) {\n        this.primaryTouch = eventData.changedPointers[0].identifier;\n        setLastTouch.call(this, eventData);\n    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n        setLastTouch.call(this, eventData);\n    }\n}\n\nfunction setLastTouch(eventData) {\n    var touch = eventData.changedPointers[0];\n\n    if (touch.identifier === this.primaryTouch) {\n        var lastTouch = {x: touch.clientX, y: touch.clientY};\n        this.lastTouches.push(lastTouch);\n        var lts = this.lastTouches;\n        var removeLastTouch = function() {\n            var i = lts.indexOf(lastTouch);\n            if (i > -1) {\n                lts.splice(i, 1);\n            }\n        };\n        setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n    }\n}\n\nfunction isSyntheticEvent(eventData) {\n    var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n    for (var i = 0; i < this.lastTouches.length; i++) {\n        var t = this.lastTouches[i];\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n            return true;\n        }\n    }\n    return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n    this.manager = manager;\n    this.set(value);\n}\n\nTouchAction.prototype = {\n    /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */\n    set: function(value) {\n        // find out the touch-action by the event handlers\n        if (value == TOUCH_ACTION_COMPUTE) {\n            value = this.compute();\n        }\n\n        if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n        }\n        this.actions = value.toLowerCase().trim();\n    },\n\n    /**\n     * just re-set the touchAction value\n     */\n    update: function() {\n        this.set(this.manager.options.touchAction);\n    },\n\n    /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */\n    compute: function() {\n        var actions = [];\n        each(this.manager.recognizers, function(recognizer) {\n            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n                actions = actions.concat(recognizer.getTouchAction());\n            }\n        });\n        return cleanTouchActions(actions.join(' '));\n    },\n\n    /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */\n    preventDefaults: function(input) {\n        var srcEvent = input.srcEvent;\n        var direction = input.offsetDirection;\n\n        // if the touch action did prevented once this session\n        if (this.manager.session.prevented) {\n            srcEvent.preventDefault();\n            return;\n        }\n\n        var actions = this.actions;\n        var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n        if (hasNone) {\n            //do not prevent defaults if this is a tap gesture\n\n            var isTapPointer = input.pointers.length === 1;\n            var isTapMovement = input.distance < 2;\n            var isTapTouchTime = input.deltaTime < 250;\n\n            if (isTapPointer && isTapMovement && isTapTouchTime) {\n                return;\n            }\n        }\n\n        if (hasPanX && hasPanY) {\n            // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n            return;\n        }\n\n        if (hasNone ||\n            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n            (hasPanX && direction & DIRECTION_VERTICAL)) {\n            return this.preventSrc(srcEvent);\n        }\n    },\n\n    /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */\n    preventSrc: function(srcEvent) {\n        this.manager.session.prevented = true;\n        srcEvent.preventDefault();\n    }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n    // none\n    if (inStr(actions, TOUCH_ACTION_NONE)) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n    // if both pan-x and pan-y are set (different recognizers\n    // for different directions, e.g. horizontal pan but vertical swipe?)\n    // we need none (as otherwise with pan-x pan-y combined none of these\n    // recognizers will work, since the browser would handle all panning\n    if (hasPanX && hasPanY) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    // pan-x OR pan-y\n    if (hasPanX || hasPanY) {\n        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n    }\n\n    // manipulation\n    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n        return TOUCH_ACTION_MANIPULATION;\n    }\n\n    return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n    if (!NATIVE_TOUCH_ACTION) {\n        return false;\n    }\n    var touchMap = {};\n    var cssSupports = window.CSS && window.CSS.supports;\n    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n        // If css.supports is not supported but there is native touch-action assume it supports\n        // all values. This is the case for IE 10 and 11.\n        touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n    });\n    return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n    this.options = assign({}, this.defaults, options || {});\n\n    this.id = uniqueId();\n\n    this.manager = null;\n\n    // default is enable true\n    this.options.enable = ifUndefined(this.options.enable, true);\n\n    this.state = STATE_POSSIBLE;\n\n    this.simultaneous = {};\n    this.requireFail = [];\n}\n\nRecognizer.prototype = {\n    /**\n     * @virtual\n     * @type {Object}\n     */\n    defaults: {},\n\n    /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // also update the touchAction, in case something changed about the directions/enabled state\n        this.manager && this.manager.touchAction.update();\n        return this;\n    },\n\n    /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    recognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n            return this;\n        }\n\n        var simultaneous = this.simultaneous;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (!simultaneous[otherRecognizer.id]) {\n            simultaneous[otherRecognizer.id] = otherRecognizer;\n            otherRecognizer.recognizeWith(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRecognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        delete this.simultaneous[otherRecognizer.id];\n        return this;\n    },\n\n    /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    requireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n            return this;\n        }\n\n        var requireFail = this.requireFail;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (inArray(requireFail, otherRecognizer) === -1) {\n            requireFail.push(otherRecognizer);\n            otherRecognizer.requireFailure(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRequireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        var index = inArray(this.requireFail, otherRecognizer);\n        if (index > -1) {\n            this.requireFail.splice(index, 1);\n        }\n        return this;\n    },\n\n    /**\n     * has require failures boolean\n     * @returns {boolean}\n     */\n    hasRequireFailures: function() {\n        return this.requireFail.length > 0;\n    },\n\n    /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */\n    canRecognizeWith: function(otherRecognizer) {\n        return !!this.simultaneous[otherRecognizer.id];\n    },\n\n    /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */\n    emit: function(input) {\n        var self = this;\n        var state = this.state;\n\n        function emit(event) {\n            self.manager.emit(event, input);\n        }\n\n        // 'panstart' and 'panmove'\n        if (state < STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n\n        emit(self.options.event); // simple 'eventName' events\n\n        if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n            emit(input.additionalEvent);\n        }\n\n        // panend and pancancel\n        if (state >= STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n    },\n\n    /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */\n    tryEmit: function(input) {\n        if (this.canEmit()) {\n            return this.emit(input);\n        }\n        // it's failing anyway\n        this.state = STATE_FAILED;\n    },\n\n    /**\n     * can we emit?\n     * @returns {boolean}\n     */\n    canEmit: function() {\n        var i = 0;\n        while (i < this.requireFail.length) {\n            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n                return false;\n            }\n            i++;\n        }\n        return true;\n    },\n\n    /**\n     * update the recognizer\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        // make a new copy of the inputData\n        // so we can change the inputData without messing up the other recognizers\n        var inputDataClone = assign({}, inputData);\n\n        // is is enabled and allow recognizing?\n        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n            this.reset();\n            this.state = STATE_FAILED;\n            return;\n        }\n\n        // reset when we've reached the end\n        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n            this.state = STATE_POSSIBLE;\n        }\n\n        this.state = this.process(inputDataClone);\n\n        // the recognizer has recognized a gesture\n        // so trigger an event\n        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n            this.tryEmit(inputDataClone);\n        }\n    },\n\n    /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */\n    process: function(inputData) { }, // jshint ignore:line\n\n    /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */\n    getTouchAction: function() { },\n\n    /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */\n    reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n    if (state & STATE_CANCELLED) {\n        return 'cancel';\n    } else if (state & STATE_ENDED) {\n        return 'end';\n    } else if (state & STATE_CHANGED) {\n        return 'move';\n    } else if (state & STATE_BEGAN) {\n        return 'start';\n    }\n    return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n    if (direction == DIRECTION_DOWN) {\n        return 'down';\n    } else if (direction == DIRECTION_UP) {\n        return 'up';\n    } else if (direction == DIRECTION_LEFT) {\n        return 'left';\n    } else if (direction == DIRECTION_RIGHT) {\n        return 'right';\n    }\n    return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n    var manager = recognizer.manager;\n    if (manager) {\n        return manager.get(otherRecognizer);\n    }\n    return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n    Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */\n    defaults: {\n        /**\n         * @type {Number}\n         * @default 1\n         */\n        pointers: 1\n    },\n\n    /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */\n    attrTest: function(input) {\n        var optionPointers = this.options.pointers;\n        return optionPointers === 0 || input.pointers.length === optionPointers;\n    },\n\n    /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */\n    process: function(input) {\n        var state = this.state;\n        var eventType = input.eventType;\n\n        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n        var isValid = this.attrTest(input);\n\n        // on cancel input and we've recognized before, return STATE_CANCELLED\n        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n            return state | STATE_CANCELLED;\n        } else if (isRecognized || isValid) {\n            if (eventType & INPUT_END) {\n                return state | STATE_ENDED;\n            } else if (!(state & STATE_BEGAN)) {\n                return STATE_BEGAN;\n            }\n            return state | STATE_CHANGED;\n        }\n        return STATE_FAILED;\n    }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n\n    this.pX = null;\n    this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PanRecognizer\n     */\n    defaults: {\n        event: 'pan',\n        threshold: 10,\n        pointers: 1,\n        direction: DIRECTION_ALL\n    },\n\n    getTouchAction: function() {\n        var direction = this.options.direction;\n        var actions = [];\n        if (direction & DIRECTION_HORIZONTAL) {\n            actions.push(TOUCH_ACTION_PAN_Y);\n        }\n        if (direction & DIRECTION_VERTICAL) {\n            actions.push(TOUCH_ACTION_PAN_X);\n        }\n        return actions;\n    },\n\n    directionTest: function(input) {\n        var options = this.options;\n        var hasMoved = true;\n        var distance = input.distance;\n        var direction = input.direction;\n        var x = input.deltaX;\n        var y = input.deltaY;\n\n        // lock to axis?\n        if (!(direction & options.direction)) {\n            if (options.direction & DIRECTION_HORIZONTAL) {\n                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                hasMoved = x != this.pX;\n                distance = Math.abs(input.deltaX);\n            } else {\n                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n                hasMoved = y != this.pY;\n                distance = Math.abs(input.deltaY);\n            }\n        }\n        input.direction = direction;\n        return hasMoved && distance > options.threshold && direction & options.direction;\n    },\n\n    attrTest: function(input) {\n        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n    },\n\n    emit: function(input) {\n\n        this.pX = input.deltaX;\n        this.pY = input.deltaY;\n\n        var direction = directionStr(input.direction);\n\n        if (direction) {\n            input.additionalEvent = this.options.event + direction;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'pinch',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n    },\n\n    emit: function(input) {\n        if (input.scale !== 1) {\n            var inOut = input.scale < 1 ? 'in' : 'out';\n            input.additionalEvent = this.options.event + inOut;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    this._timer = null;\n    this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PressRecognizer\n     */\n    defaults: {\n        event: 'press',\n        pointers: 1,\n        time: 251, // minimal time of the pointer to be pressed\n        threshold: 9 // a minimal movement is ok, but keep it low\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_AUTO];\n    },\n\n    process: function(input) {\n        var options = this.options;\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTime = input.deltaTime > options.time;\n\n        this._input = input;\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n            this.reset();\n        } else if (input.eventType & INPUT_START) {\n            this.reset();\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_RECOGNIZED;\n                this.tryEmit();\n            }, options.time, this);\n        } else if (input.eventType & INPUT_END) {\n            return STATE_RECOGNIZED;\n        }\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function(input) {\n        if (this.state !== STATE_RECOGNIZED) {\n            return;\n        }\n\n        if (input && (input.eventType & INPUT_END)) {\n            this.manager.emit(this.options.event + 'up', input);\n        } else {\n            this._input.timeStamp = now();\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */\n    defaults: {\n        event: 'rotate',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n    }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */\n    defaults: {\n        event: 'swipe',\n        threshold: 10,\n        velocity: 0.3,\n        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n        pointers: 1\n    },\n\n    getTouchAction: function() {\n        return PanRecognizer.prototype.getTouchAction.call(this);\n    },\n\n    attrTest: function(input) {\n        var direction = this.options.direction;\n        var velocity;\n\n        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n            velocity = input.overallVelocity;\n        } else if (direction & DIRECTION_HORIZONTAL) {\n            velocity = input.overallVelocityX;\n        } else if (direction & DIRECTION_VERTICAL) {\n            velocity = input.overallVelocityY;\n        }\n\n        return this._super.attrTest.call(this, input) &&\n            direction & input.offsetDirection &&\n            input.distance > this.options.threshold &&\n            input.maxPointers == this.options.pointers &&\n            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n    },\n\n    emit: function(input) {\n        var direction = directionStr(input.offsetDirection);\n        if (direction) {\n            this.manager.emit(this.options.event + direction, input);\n        }\n\n        this.manager.emit(this.options.event, input);\n    }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    // previous time and center,\n    // used for tap counting\n    this.pTime = false;\n    this.pCenter = false;\n\n    this._timer = null;\n    this._input = null;\n    this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'tap',\n        pointers: 1,\n        taps: 1,\n        interval: 300, // max time between the multi-tap taps\n        time: 250, // max time of the pointer to be down (like finger on the screen)\n        threshold: 9, // a minimal movement is ok, but keep it low\n        posThreshold: 10 // a multi-tap can be a bit off the initial position\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_MANIPULATION];\n    },\n\n    process: function(input) {\n        var options = this.options;\n\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTouchTime = input.deltaTime < options.time;\n\n        this.reset();\n\n        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n            return this.failTimeout();\n        }\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (validMovement && validTouchTime && validPointers) {\n            if (input.eventType != INPUT_END) {\n                return this.failTimeout();\n            }\n\n            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n            this.pTime = input.timeStamp;\n            this.pCenter = input.center;\n\n            if (!validMultiTap || !validInterval) {\n                this.count = 1;\n            } else {\n                this.count += 1;\n            }\n\n            this._input = input;\n\n            // if tap count matches we have recognized it,\n            // else it has began recognizing...\n            var tapCount = this.count % options.taps;\n            if (tapCount === 0) {\n                // no failing requirements, immediately trigger the tap event\n                // or wait as long as the multitap interval to trigger\n                if (!this.hasRequireFailures()) {\n                    return STATE_RECOGNIZED;\n                } else {\n                    this._timer = setTimeoutContext(function() {\n                        this.state = STATE_RECOGNIZED;\n                        this.tryEmit();\n                    }, options.interval, this);\n                    return STATE_BEGAN;\n                }\n            }\n        }\n        return STATE_FAILED;\n    },\n\n    failTimeout: function() {\n        this._timer = setTimeoutContext(function() {\n            this.state = STATE_FAILED;\n        }, this.options.interval, this);\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function() {\n        if (this.state == STATE_RECOGNIZED) {\n            this._input.tapCount = this.count;\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n    options = options || {};\n    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n    return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n    /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */\n    domEvents: false,\n\n    /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */\n    touchAction: TOUCH_ACTION_COMPUTE,\n\n    /**\n     * @type {Boolean}\n     * @default true\n     */\n    enable: true,\n\n    /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */\n    inputTarget: null,\n\n    /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */\n    inputClass: null,\n\n    /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */\n    preset: [\n        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n        [RotateRecognizer, {enable: false}],\n        [PinchRecognizer, {enable: false}, ['rotate']],\n        [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n        [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n        [TapRecognizer],\n        [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n        [PressRecognizer]\n    ],\n\n    /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */\n    cssProps: {\n        /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userSelect: 'none',\n\n        /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */\n        touchSelect: 'none',\n\n        /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */\n        touchCallout: 'none',\n\n        /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */\n        contentZooming: 'none',\n\n        /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userDrag: 'none',\n\n        /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */\n        tapHighlightColor: 'rgba(0,0,0,0)'\n    }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n    this.options = assign({}, Hammer.defaults, options || {});\n\n    this.options.inputTarget = this.options.inputTarget || element;\n\n    this.handlers = {};\n    this.session = {};\n    this.recognizers = [];\n    this.oldCssProps = {};\n\n    this.element = element;\n    this.input = createInputInstance(this);\n    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n    toggleCssProps(this, true);\n\n    each(this.options.recognizers, function(item) {\n        var recognizer = this.add(new (item[0])(item[1]));\n        item[2] && recognizer.recognizeWith(item[2]);\n        item[3] && recognizer.requireFailure(item[3]);\n    }, this);\n}\n\nManager.prototype = {\n    /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // Options that need a little more setup\n        if (options.touchAction) {\n            this.touchAction.update();\n        }\n        if (options.inputTarget) {\n            // Clean up existing event listeners and reinitialize\n            this.input.destroy();\n            this.input.target = options.inputTarget;\n            this.input.init();\n        }\n        return this;\n    },\n\n    /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */\n    stop: function(force) {\n        this.session.stopped = force ? FORCED_STOP : STOP;\n    },\n\n    /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        var session = this.session;\n        if (session.stopped) {\n            return;\n        }\n\n        // run the touch-action polyfill\n        this.touchAction.preventDefaults(inputData);\n\n        var recognizer;\n        var recognizers = this.recognizers;\n\n        // this holds the recognizer that is being recognized.\n        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n        // if no recognizer is detecting a thing, it is set to `null`\n        var curRecognizer = session.curRecognizer;\n\n        // reset when the last recognizer is recognized\n        // or when we're in a new session\n        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n            curRecognizer = session.curRecognizer = null;\n        }\n\n        var i = 0;\n        while (i < recognizers.length) {\n            recognizer = recognizers[i];\n\n            // find out if we are allowed try to recognize the input for this one.\n            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n            //      that is being recognized.\n            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n            //      this can be setup with the `recognizeWith()` method on the recognizer.\n            if (session.stopped !== FORCED_STOP && ( // 1\n                    !curRecognizer || recognizer == curRecognizer || // 2\n                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n                recognizer.recognize(inputData);\n            } else {\n                recognizer.reset();\n            }\n\n            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n            // current active recognizer. but only if we don't already have an active recognizer\n            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n                curRecognizer = session.curRecognizer = recognizer;\n            }\n            i++;\n        }\n    },\n\n    /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */\n    get: function(recognizer) {\n        if (recognizer instanceof Recognizer) {\n            return recognizer;\n        }\n\n        var recognizers = this.recognizers;\n        for (var i = 0; i < recognizers.length; i++) {\n            if (recognizers[i].options.event == recognizer) {\n                return recognizers[i];\n            }\n        }\n        return null;\n    },\n\n    /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */\n    add: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'add', this)) {\n            return this;\n        }\n\n        // remove existing\n        var existing = this.get(recognizer.options.event);\n        if (existing) {\n            this.remove(existing);\n        }\n\n        this.recognizers.push(recognizer);\n        recognizer.manager = this;\n\n        this.touchAction.update();\n        return recognizer;\n    },\n\n    /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */\n    remove: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'remove', this)) {\n            return this;\n        }\n\n        recognizer = this.get(recognizer);\n\n        // let's make sure this recognizer exists\n        if (recognizer) {\n            var recognizers = this.recognizers;\n            var index = inArray(recognizers, recognizer);\n\n            if (index !== -1) {\n                recognizers.splice(index, 1);\n                this.touchAction.update();\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */\n    on: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n        if (handler === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            handlers[event] = handlers[event] || [];\n            handlers[event].push(handler);\n        });\n        return this;\n    },\n\n    /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */\n    off: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            if (!handler) {\n                delete handlers[event];\n            } else {\n                handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n            }\n        });\n        return this;\n    },\n\n    /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */\n    emit: function(event, data) {\n        // we also want to trigger dom events\n        if (this.options.domEvents) {\n            triggerDomEvent(event, data);\n        }\n\n        // no handlers, so skip it all\n        var handlers = this.handlers[event] && this.handlers[event].slice();\n        if (!handlers || !handlers.length) {\n            return;\n        }\n\n        data.type = event;\n        data.preventDefault = function() {\n            data.srcEvent.preventDefault();\n        };\n\n        var i = 0;\n        while (i < handlers.length) {\n            handlers[i](data);\n            i++;\n        }\n    },\n\n    /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */\n    destroy: function() {\n        this.element && toggleCssProps(this, false);\n\n        this.handlers = {};\n        this.session = {};\n        this.input.destroy();\n        this.element = null;\n    }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n    var element = manager.element;\n    if (!element.style) {\n        return;\n    }\n    var prop;\n    each(manager.options.cssProps, function(value, name) {\n        prop = prefixed(element.style, name);\n        if (add) {\n            manager.oldCssProps[prop] = element.style[prop];\n            element.style[prop] = value;\n        } else {\n            element.style[prop] = manager.oldCssProps[prop] || '';\n        }\n    });\n    if (!add) {\n        manager.oldCssProps = {};\n    }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n    var gestureEvent = document.createEvent('Event');\n    gestureEvent.initEvent(event, true, true);\n    gestureEvent.gesture = data;\n    data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n    INPUT_START: INPUT_START,\n    INPUT_MOVE: INPUT_MOVE,\n    INPUT_END: INPUT_END,\n    INPUT_CANCEL: INPUT_CANCEL,\n\n    STATE_POSSIBLE: STATE_POSSIBLE,\n    STATE_BEGAN: STATE_BEGAN,\n    STATE_CHANGED: STATE_CHANGED,\n    STATE_ENDED: STATE_ENDED,\n    STATE_RECOGNIZED: STATE_RECOGNIZED,\n    STATE_CANCELLED: STATE_CANCELLED,\n    STATE_FAILED: STATE_FAILED,\n\n    DIRECTION_NONE: DIRECTION_NONE,\n    DIRECTION_LEFT: DIRECTION_LEFT,\n    DIRECTION_RIGHT: DIRECTION_RIGHT,\n    DIRECTION_UP: DIRECTION_UP,\n    DIRECTION_DOWN: DIRECTION_DOWN,\n    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n    DIRECTION_ALL: DIRECTION_ALL,\n\n    Manager: Manager,\n    Input: Input,\n    TouchAction: TouchAction,\n\n    TouchInput: TouchInput,\n    MouseInput: MouseInput,\n    PointerEventInput: PointerEventInput,\n    TouchMouseInput: TouchMouseInput,\n    SingleTouchInput: SingleTouchInput,\n\n    Recognizer: Recognizer,\n    AttrRecognizer: AttrRecognizer,\n    Tap: TapRecognizer,\n    Pan: PanRecognizer,\n    Swipe: SwipeRecognizer,\n    Pinch: PinchRecognizer,\n    Rotate: RotateRecognizer,\n    Press: PressRecognizer,\n\n    on: addEventListeners,\n    off: removeEventListeners,\n    each: each,\n    merge: merge,\n    extend: extend,\n    assign: assign,\n    inherit: inherit,\n    bindFn: bindFn,\n    prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n//  style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n    define(function() {\n        return Hammer;\n    });\n} else if (typeof module != 'undefined' && module.exports) {\n    module.exports = Hammer;\n} else {\n    window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n},{}],62:[function(require,module,exports){\n(function(factory) {\r\n    if (typeof define === 'function' && define.amd) {\r\n        define(['jquery', 'hammerjs'], factory);\r\n    } else if (typeof exports === 'object') {\r\n        factory(require('jquery'), require('hammerjs'));\r\n    } else {\r\n        factory(jQuery, Hammer);\r\n    }\r\n}(function($, Hammer) {\r\n    function hammerify(el, options) {\r\n        var $el = $(el);\r\n        if(!$el.data(\"hammer\")) {\r\n            $el.data(\"hammer\", new Hammer($el[0], options));\r\n        }\r\n    }\r\n\r\n    $.fn.hammer = function(options) {\r\n        return this.each(function() {\r\n            hammerify(this, options);\r\n        });\r\n    };\r\n\r\n    // extend the emit method to also trigger jQuery events\r\n    Hammer.Manager.prototype.emit = (function(originalEmit) {\r\n        return function(type, data) {\r\n            originalEmit.call(this, type, data);\r\n            $(this.element).trigger({\r\n                type: type,\r\n                gesture: data\r\n            });\r\n        };\r\n    })(Hammer.Manager.prototype.emit);\r\n}));\r\n\n},{\"hammerjs\":61,\"jquery\":\"jquery\"}]},{},[9])\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvY29yZS9ldmVudEJ1cy5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9jb3JlL2V2ZW50cy9tYXRjaE1lZGlhLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL2NvcmUvZXZlbnRzL3Jlc2l6ZS5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9jb3JlL2V2ZW50cy9zY3JvbGwuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvY29yZS9maWx0ZXIuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvY29yZS9nbG9iYWxTZWxlY3RvcnMuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvY29yZS9tZW51VG9nZ2xlLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL2NvcmUvbW9kdWxlRmFjdG9yeS5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9pbmRleC5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2Fib3V0LWxvY2F0aW9uL2Fycm93LmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvYWJvdXQtbG9jYXRpb24vZWFjaE5hdmlnYXRpb24uanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9hYm91dC1sb2NhdGlvbi9pbmRleC5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2Fib3V0LWxvY2F0aW9uL25hdmlnYXRpb24uanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9hYm91dC1sb2NhdGlvbi9waW4uanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9hYm91dFRpbWVsaW5lLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvYWNjb3JkaW9uLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvYW5pbWF0ZUluLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvYXJyb3cuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9jYXJvdXNlbC9hcnJvdy5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2Nhcm91c2VsL2luZGV4LmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvY2Fyb3VzZWwvbmF2aWdhdGlvbi5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2NvbnRlbnRQcm9ncmVzc0Jhci5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2NvbnRlbnRQcm9ncmVzc0V2ZW50LmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvZGlzcXVzVG9nZ2xlLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvZXZlbnRzLWZlYXR1cmVkL2luZGV4LmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvZmFkaW5nVGV4dC5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2ZpbHRlcmluZy9jbGVhckZpbHRlci5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJBbmNob3IuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9maWx0ZXJpbmcvZmlsdGVyQ29udGVudC5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJFdmVudERyb3Bkb3ducy5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJFdmVudHMuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9maWx0ZXJpbmcvZmlsdGVyRm9ybS5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJNdWx0aVNlbGVjdC5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJQb3NpdGlvbmluZy5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJSYWRpb0NoZWNrYm94LmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvZmlsdGVyaW5nL2ZpbHRlclRvZ2dsZS5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL2d0bUNsaWNrLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvZ3RtU3VibWl0LmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvaGVhZGVyL0hlYWRlckVsZW1lbnQuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9oZWFkZXIvaW5kZXguanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9oZXJvZXMvaW5kZXguanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9pZGVhcy1pc3N1ZXMvaW5kZXguanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9qb2luQXV0b2ZpbGwuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9sb2FkTW9yZS5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL292ZXJsYXkuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9vdmVybGF5RmxpY2tyLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvc2VhcmNoLmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL21vZHVsZXMvc2hhcmVCYXIuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy9zb2NpYWxTaGFyZS5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL3N1Yk5hdi5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy9tb2R1bGVzL3N2Z0ljb25Mb2FkZXIuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvbW9kdWxlcy90b3AtZXZlbnRzL2luZGV4LmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL3V0aWxzL0Jhc2ljVmlldy5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy91dGlscy9Mb2FkZXIuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvdXRpbHMvY2hlY2tJblZpZXcuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvdXRpbHMvY3NzUHJlZml4LmpzIiwiYXNzZXRzL3NjcmlwdHMvc3JjL3V0aWxzL2RlZmVycmVkQWpheC5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy91dGlscy9nZXRVcmxQYXJhbWV0ZXIuanMiLCJhc3NldHMvc2NyaXB0cy9zcmMvdXRpbHMvZ3RtRGF0YVB1c2hlci5qcyIsImFzc2V0cy9zY3JpcHRzL3NyYy91dGlscy9wYXJzZUxvYWRlZFJlc3BvbnNlLmpzIiwibm9kZV9tb2R1bGVzL2hhbW1lcmpzL2hhbW1lci5qcyIsIm5vZGVfbW9kdWxlcy9qcXVlcnktaGFtbWVyanMvanF1ZXJ5LmhhbW1lci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNubEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiLy8gVmVuZG9yIGRlcGVuZGVuY2llc1xudmFyICQgPSByZXF1aXJlKCdqcXVlcnknKSxcblxuICAgIC8vIHByb2plY3QgZGVwZW5kZW5jaWVzXG4gICAgcmVzaXplRXZlbnQgPSByZXF1aXJlKCcuL2V2ZW50cy9yZXNpemUnKSxcbiAgICBtYXRjaE1lZGlhID0gcmVxdWlyZSgnLi9ldmVudHMvbWF0Y2hNZWRpYScpLFxuXHRzY3JvbGxFdmVudCA9IHJlcXVpcmUoJy4vZXZlbnRzL3Njcm9sbCcpLFxuXG4gICAgLy8gY29uc3RhbnRzXG5cdENPTlRFTlRfUFJPR1JFU1MgPSAnQ09OVEVOVF9QUk9HUkVTUycsXG5cblx0RklMVEVSX0NMRUFSX0ZJRUxEID0gJ0ZJTFRFUl9DTEVBUl9GSUVMRCcsXG5cdEZJTFRFUl9SRVFVRVNUID0gJ0ZJTFRFUl9SRVFVRVNUJyxcblx0RklMVEVSX1JFQURZID0gJ0ZJTFRFUl9SRUFEWScsXG5cblx0TE9BRF9NT1JFX1JFUVVFU1QgPSAnTE9BRF9NT1JFX1JFUVVFU1QnLFxuXHRMT0FEX01PUkVfUkVBRFkgPSAnTE9BRF9NT1JFX1JFQURZJyxcblxuICAgIFJFU0laRSA9ICdSRVNJWkUnLFxuICAgIE1BVENIX01FRElBID0gJ01BVENITUVESUEnLFxuICAgIFNDUk9MTCA9ICdTQ1JPTEwnLFxuICAgIENPTU1FTlRTID0gJ0NPTU1FTlRTJyxcblxuICAgIC8vIGdsb2JhbCB2YXJzXG4gICAgXyRldmVudEJ1cyA9ICQoe30pO1xuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0SW5pdGlhbGl6YXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5mdW5jdGlvbiBpbml0KCkge1xuXG5cdHJlc2l6ZUV2ZW50LmluaXQoKTtcblx0bWF0Y2hNZWRpYS5pbml0KCk7XG5cdHNjcm9sbEV2ZW50LmluaXQoKTtcblxuXHR0cmlnZ2VySW5pdGlhbEV2ZW50cygpO1xufVxuXG5mdW5jdGlvbiB0cmlnZ2VySW5pdGlhbEV2ZW50cygpIHtcblxuXHRyZXNpemVFdmVudC50cmlnZ2VyUmVzaXplKCk7XG5cdHNjcm9sbEV2ZW50LnRyaWdnZXJTY3JvbGwoKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFx0RXhwb3J0c1xuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuLy8gY29uc3RhbnRzXG5leHBvcnRzLlJFU0laRSA9IFJFU0laRTtcbmV4cG9ydHMuTUFUQ0hfTUVESUEgPSBNQVRDSF9NRURJQTtcbmV4cG9ydHMuU0NST0xMID0gU0NST0xMO1xuZXhwb3J0cy5DT05URU5UX1BST0dSRVNTID0gQ09OVEVOVF9QUk9HUkVTUztcbmV4cG9ydHMuQ09NTUVOVFMgPSBDT01NRU5UUztcblxuZXhwb3J0cy5GSUxURVJfQ0xFQVJfRklFTEQgPSBGSUxURVJfQ0xFQVJfRklFTEQ7XG5leHBvcnRzLkZJTFRFUl9SRVFVRVNUID0gRklMVEVSX1JFUVVFU1Q7XG5leHBvcnRzLkZJTFRFUl9SRUFEWSA9IEZJTFRFUl9SRUFEWTtcblxuZXhwb3J0cy5MT0FEX01PUkVfUkVRVUVTVCA9IExPQURfTU9SRV9SRVFVRVNUO1xuZXhwb3J0cy5MT0FEX01PUkVfUkVBRFkgPSBMT0FEX01PUkVfUkVBRFk7XG5cblxuLy8gbWV0aG9kc1xuZXhwb3J0cy5pbml0ID0gaW5pdDtcblxuZXhwb3J0cy5vbiA9IGZ1bmN0aW9uKGV2ZW50LCBoYW5kbGVyKVx0eyBfJGV2ZW50QnVzLm9uKGV2ZW50LCBoYW5kbGVyKTsgfTtcbmV4cG9ydHMudHJpZ2dlciA9IGZ1bmN0aW9uKGV2ZW50LCBhcmdzKVx0eyBfJGV2ZW50QnVzLnRyaWdnZXIoZXZlbnQsIGFyZ3MpOyB9O1xuZXhwb3J0cy5vZmYgPSBmdW5jdGlvbihldmVudCwgaGFuZGxlcilcdHsgXyRldmVudEJ1cy5vZmYoZXZlbnQsIGhhbmRsZXIpOyB9O1xuXG4iLCIvLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xudmFyIGV2ZW50QnVzID0gcmVxdWlyZSgnLi4vZXZlbnRCdXMnKSxcblxuLy8gZ2xvYmFsIHZhcnNcblx0X2N1cnJlbnRTaXplLFxuXG4vLyBjb25zdGFudHNcblx0U01BTExfV0lORE9XID0gMCxcblx0TUVESVVNX1dJTkRPVyA9IDc2OCxcblx0TEFSR0VfV0lORE9XID0gMTAyNCxcblx0WExBUkdFX1dJTkRPVyA9IDEyODAsXG5cdE1FRElBX1NJWkVTID0gW1NNQUxMX1dJTkRPVywgTUVESVVNX1dJTkRPVywgTEFSR0VfV0lORE9XLCBYTEFSR0VfV0lORE9XXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIEluaXRpYWxpemVcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5mdW5jdGlvbiBpbml0KCkge1xuXG5cdC8vIGJpbmQgZXZlbnRzXG5cdGV2ZW50QnVzLm9uKGV2ZW50QnVzLlJFU0laRSwgb25SZXNpemUpO1xuXG59XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIEV2ZW50IEhhbmRsaW5nXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5mdW5jdGlvbiBvblJlc2l6ZShlLCByZXNpemUpIHtcblxuXHR2YXIgaTtcblxuXHRmb3IoaSA9IE1FRElBX1NJWkVTLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcblxuXHRcdGlmKHJlc2l6ZSA+PSBNRURJQV9TSVpFU1tpXSkge1xuXG5cdFx0XHR0cmlnZ2VyTWF0Y2hNZWRpYShNRURJQV9TSVpFU1tpXSk7XG5cblx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXHR9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gVXRpbHNcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5mdW5jdGlvbiB0cmlnZ2VyTWF0Y2hNZWRpYShzaXplKSB7XG5cblx0aWYoc2l6ZSAhPT0gX2N1cnJlbnRTaXplKSB7XG5cblx0XHRfY3VycmVudFNpemUgPSBzaXplO1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuTUFUQ0hfTUVESUEsIHNpemUpO1xuXG5cdH1cblxufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIEV4cG9ydHNcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLnRyaWdnZXJNYXRjaE1lZGlhID0gdHJpZ2dlck1hdGNoTWVkaWE7XG5leHBvcnRzLlNNQUxMX1dJTkRPVyA9IFNNQUxMX1dJTkRPVztcbmV4cG9ydHMuTUVESVVNX1dJTkRPVyA9IE1FRElVTV9XSU5ET1c7XG5leHBvcnRzLkxBUkdFX1dJTkRPVyA9IExBUkdFX1dJTkRPVztcbmV4cG9ydHMuWExBUkdFX1dJTkRPVyA9IFhMQVJHRV9XSU5ET1c7XG5cbiIsIi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgZXZlbnRCdXMgPSByZXF1aXJlKCcuLi9ldmVudEJ1cycpLFxuICAgIGdsb2JhbFNlbGVjdG9ycyA9IHJlcXVpcmUoJy4uL2dsb2JhbFNlbGVjdG9ycycpLFxuXG5cdC8vIHNlbGVjdG9yc1xuICAgIF93aW4gPSB3aW5kb3csXG4gICAgXyR3aW5kb3cgPSBnbG9iYWxTZWxlY3RvcnMuJHdpbmRvdyxcblxuXHQvLyBnbG9iYWwgdmFyc1xuICAgIF93aW5kb3dXaWR0aCxcbiAgICBfd2luZG93SGVpZ2h0O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdEluaXRpYWxpemVcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbmZ1bmN0aW9uIGluaXQoKSB7XG5cbiAgICBfd2luZG93V2lkdGggPSBfd2luLmlubmVyV2lkdGg7XG4gICAgX3dpbmRvd0hlaWdodCA9IF93aW4uaW5uZXJIZWlnaHQ7XG5cbiAgICBfJHdpbmRvdy5yZXNpemUob25SZXNpemUpO1xufVxuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0RXZlbnQgSGFuZGxpbmdcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbmZ1bmN0aW9uIG9uUmVzaXplKCkge1xuXG4gICAgdmFyIG5ld1dpbmRvd1dpZHRoID0gX3dpbi5pbm5lcldpZHRoLFxuICAgICAgICBuZXdXaW5kb3dIZWlnaHQgPSBfd2luLmlubmVySGVpZ2h0O1xuXG5cbiAgICBpZiAobmV3V2luZG93V2lkdGggIT09IF93aW5kb3dXaWR0aCB8fCBuZXdXaW5kb3dIZWlnaHQgIT09IF93aW5kb3dIZWlnaHQpIHtcblxuICAgICAgICBfd2luZG93V2lkdGggPSBuZXdXaW5kb3dXaWR0aDtcbiAgICAgICAgX3dpbmRvd0hlaWdodCA9IG5ld1dpbmRvd0hlaWdodDtcblxuXHRcdHRyaWdnZXJSZXNpemUoKTtcbiAgICB9XG59XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRVdGlsc1xuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZnVuY3Rpb24gdHJpZ2dlclJlc2l6ZSgpIHtcblxuICAgIGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuUkVTSVpFLCBbX3dpbmRvd1dpZHRoLCBfd2luZG93SGVpZ2h0XSk7XG5cblxufVxuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0RXhwb3J0c1xuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMudHJpZ2dlclJlc2l6ZSA9IHRyaWdnZXJSZXNpemU7XG4iLCIvLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xudmFyIGV2ZW50QnVzID0gcmVxdWlyZSgnLi4vZXZlbnRCdXMnKSxcblx0Z2xvYmFsU2VsZWN0b3JzID0gcmVxdWlyZSgnLi4vZ2xvYmFsU2VsZWN0b3JzJyksXG5cbi8vIGNvbnN0YW50c1xuXHRWRUxPQ0lUWV9DTEFNUCA9IDIwMCxcblxuLy8gc2VsZWN0b3JzXG5cdF93aW5kb3cgPSB3aW5kb3csXG5cdF9kb2MgPSBkb2N1bWVudCxcblx0XyR3aW5kb3cgPSBnbG9iYWxTZWxlY3RvcnMuJHdpbmRvdyxcblx0XyRkb2N1bWVudCA9IGdsb2JhbFNlbGVjdG9ycy4kZG9jdW1lbnQsXG5cbi8vIGdsb2JhbCB2YXJzXG5cdF9wcmV2aW91c1Njcm9sbFBvc2l0aW9uID0gMCxcblx0X2ZyYWN0aW9uLFxuXHRfdmVsb2NpdHksXG5cdF9jdXJyZW50U2Nyb2xsUG9zaXRpb24sXG5cdF9zY3JvbGxNYXg7XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRJbml0aWFsaXplXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5mdW5jdGlvbiBpbml0KCkge1xuXG5cdC8vIGluaXRpYWwgdmFsdWVzXG5cdF8kd2luZG93Lm9uKCdzY3JvbGwnLCBvblNjcm9sbCk7XG5cblx0ZXZlbnRCdXMub24oZXZlbnRCdXMuUkVTSVpFLCBvblJlc2l6ZSk7XG59XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRFdmVudCBIYW5kbGluZ1xuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZnVuY3Rpb24gb25SZXNpemUoKSB7XG5cblx0dmFyIG5ld1Njcm9sbE1heCA9IF8kZG9jdW1lbnQuaGVpZ2h0KCkgLSBfJHdpbmRvdy5oZWlnaHQoKTtcblxuXHRpZihuZXdTY3JvbGxNYXggIT09IF9zY3JvbGxNYXgpIHtcblxuXHRcdF9zY3JvbGxNYXggPSBuZXdTY3JvbGxNYXg7XG5cblx0XHRjYWxjdWxhdGVTY3JvbGxPZmZzZXQodHJ1ZSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gb25TY3JvbGwoKSB7XG5cblx0Y2FsY3VsYXRlU2Nyb2xsT2Zmc2V0KCk7XG59XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFV0aWxzXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZnVuY3Rpb24gY2FsY3VsYXRlU2Nyb2xsT2Zmc2V0KGlzRm9yY2VkKSB7XG5cblx0dmFyIGlzVXBkYXRlZCA9IGZhbHNlLFxuXHRcdG5ld1Njcm9sbFBvc2l0aW9uID0gZ2V0U2Nyb2xsUG9zaXRpb24oKSxcblx0XHRwcmVwVmVsb2NpdHkgPSBNYXRoLm1pbihWRUxPQ0lUWV9DTEFNUCwgTWF0aC5tYXgoLVZFTE9DSVRZX0NMQU1QLG5ld1Njcm9sbFBvc2l0aW9uIC0gX3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24pKSxcblx0XHRuZXdWZWxvY2l0eSA9IHByZXBWZWxvY2l0eSAvIChWRUxPQ0lUWV9DTEFNUC8yKSxcblx0XHRuZXdGcmFjdGlvbiA9IG5ld1Njcm9sbFBvc2l0aW9uIC8gX3Njcm9sbE1heDtcblxuXG5cdF92ZWxvY2l0eSA9IHVwZGF0ZVZhbHVlKF92ZWxvY2l0eSwgbmV3VmVsb2NpdHkpO1xuXHRfZnJhY3Rpb24gPSB1cGRhdGVWYWx1ZShfZnJhY3Rpb24sIG5ld0ZyYWN0aW9uKTtcblx0X2N1cnJlbnRTY3JvbGxQb3NpdGlvbiA9IHVwZGF0ZVZhbHVlKF9jdXJyZW50U2Nyb2xsUG9zaXRpb24sIG5ld1Njcm9sbFBvc2l0aW9uKTtcblx0X3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24gPSBfY3VycmVudFNjcm9sbFBvc2l0aW9uO1xuXG5cdGlmKGlzVXBkYXRlZCB8fCBpc0ZvcmNlZCkge1xuXG5cdFx0dHJpZ2dlclNjcm9sbCgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlVmFsdWUob3JpZ2luYWwsIG5ld1ZhbHVlKSB7XG5cblx0XHRpZihvcmlnaW5hbCAhPT0gbmV3VmFsdWUpIHtcblxuXHRcdFx0aXNVcGRhdGVkID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsUG9zaXRpb24oKSB7XG5cblx0cmV0dXJuIF93aW5kb3cucGFnZVlPZmZzZXQgfHwgX2RvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IF9kb2MuYm9keS5zY3JvbGxUb3A7XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJTY3JvbGwoKSB7XG5cblx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5TQ1JPTEwsIFt7XG5cdFx0ZnJhY3Rpb246IF9mcmFjdGlvbixcblx0XHRzY3JvbGxUb3A6IF9jdXJyZW50U2Nyb2xsUG9zaXRpb24sXG5cdFx0dmVsb2NpdHk6IF92ZWxvY2l0eSxcblx0XHRzY3JvbGxNYXg6IF9zY3JvbGxNYXhcblx0fV0pO1xufVxuXG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRFeHBvcnRzXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy50cmlnZ2VyU2Nyb2xsID0gdHJpZ2dlclNjcm9sbDtcbiIsIi8vIHByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgZGVmZXJyZWRBamF4ID0gcmVxdWlyZSgnLi4vdXRpbHMvZGVmZXJyZWRBamF4JyksXG5cdGV2ZW50QnVzID0gcmVxdWlyZSgnLi9ldmVudEJ1cycpLFxuXG5cdC8vIGdsb2JhbCB2YXJzXG5cdF93aW4gPSB3aW5kb3csXG5cdF9iYXNlVXJsLFxuXHRfc3RvcmVkRmlsdGVyUXVlcnkgPSBmYWxzZSxcblx0X2lzTG9hZGluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpbml0KCkge1xuXG5cdF9iYXNlVXJsID0gbG9jYXRpb24ub3JpZ2luICsgbG9jYXRpb24ucGF0aG5hbWU7XG5cdF93aW4uYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBvblBvcFN0YXRlKTtcbn1cblxuZnVuY3Rpb24gbG9hZChmaWx0ZXJRdWVyeSkge1xuXG5cdHZhciB1cmw7XG5cblx0aWYoIV9pc0xvYWRpbmcpIHtcblxuXHRcdF9pc0xvYWRpbmcgPSB0cnVlO1xuXHRcdHVybCA9X2Jhc2VVcmwgKyAnPycgKyBmaWx0ZXJRdWVyeTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRklMVEVSX1JFUVVFU1QpO1xuXG5cdFx0ZGVmZXJyZWRBamF4KHVybClcblx0XHRcdC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXtcblxuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkZJTFRFUl9SRUFEWSwgW3Jlc3BvbnNlXSk7XG5cblx0XHRcdFx0X2lzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmKF9zdG9yZWRGaWx0ZXJRdWVyeSAhPT0gZmFsc2UpIHtcblxuXHRcdFx0XHRcdGxvYWQoX3N0b3JlZEZpbHRlclF1ZXJ5KTtcblx0XHRcdFx0XHRfc3RvcmVkRmlsdGVyUXVlcnkgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5mYWlsKGZ1bmN0aW9uKGUpIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHRcdFx0fSk7XG5cblx0fSBlbHNlIHtcblxuXHRcdF9zdG9yZWRGaWx0ZXJRdWVyeSA9IGZpbHRlclF1ZXJ5O1xuXHR9XG59XG5cbmZ1bmN0aW9uIG9uUG9wU3RhdGUoKSB7XG5cblx0bG9hZChfd2luLmxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKCc/JywgJycpKTtcbn1cblxuZnVuY3Rpb24gcHVzaFN0YXRlKGZpbHRlcikge1xuXG5cdHZhciB1cmw7XG5cblx0aWYoX3dpbi5oaXN0b3J5KSB7XG5cblx0XHR1cmwgPSBfYmFzZVVybCArICc/JyArIGZpbHRlcjtcblxuXHRcdF93aW4uaGlzdG9yeS5wdXNoU3RhdGUoXG5cdFx0XHR7IHVybDogdXJsIH0sXG5cdFx0XHQnJyxcblx0XHRcdHVybFxuXHRcdCk7XG5cdH1cblxuXHRsb2FkKGZpbHRlcik7XG59XG5cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvYWQgPSBwdXNoU3RhdGU7XG4iLCIvLyBWZW5kb3IgZGVwZW5kZW5jaWVzXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0RXhwb3J0c1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5leHBvcnRzLiR3aW5kb3cgPSAkKHdpbmRvdyk7XG5leHBvcnRzLiRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuZXhwb3J0cy4kYm9keSA9ICQoJ2JvZHknKTtcbiIsIi8vIHZlbmRvciBkZXBlbmRlbmNpZXNcbnZhciAkID0gcmVxdWlyZSgnanF1ZXJ5JyksXG5cblx0Ly8gcHJvamVjdCBkZXBlbmRlbmNpZXNcblx0Z2xvYmFsU2VsZWN0b3JzID0gcmVxdWlyZSgnLi9nbG9iYWxTZWxlY3RvcnMnKSxcblxuXHQvLyBzZWxlY3RvcnNcblx0XyRib2R5ID0gZ2xvYmFsU2VsZWN0b3JzLiRib2R5LFxuXHRfJG1lbnVUb2dnbGUsXG5cdF8kbW9iaWxlTWVudSxcblx0XyRzdWJOYXYsXG5cblx0Ly8gY29uc3RhbnRzXG5cdERFTEFZRURfVElNRSA9IDUwMCxcblx0Q0xBU1NfSVNfT1BFTiA9ICdpcy1vcGVuJyxcblx0Q0xBU1NfSVNfSElEREVOID0gJ2lzLWhpZGRlbicsXG5cdENMQVNTX05PX1NDUk9MTCA9ICduby1zY3JvbGwnLFxuXG5cdC8vIHZhcnNcblx0X2RlbGF5ZWRDYWxsLFxuXHRfaXNPcGVuID0gZmFsc2U7XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIEluaXRpYWxpemF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4vKipcbiAqIEluaXRpYWxpemVcbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRfJG1lbnVUb2dnbGUgPSAkKCcuanMtbWVudVRvZ2dsZScpO1xuXHRfJG1vYmlsZU1lbnUgPSAkKCcuanMtbWVudU1vYmlsZScpO1xuXHRfJHN1Yk5hdiA9ICQoJy5qcy1zdWJOYXYnKTtcblxuXHRfJG1lbnVUb2dnbGUuY2xpY2sob25NZW51VG9nZ2xlQ2xpY2spO1xufVxuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBFdmVudCBoYW5kbGluZ1xuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuLyoqXG4gKiBIYW5kbGUgXyRtZW51VG9nZ2xlIGNsaWNrXG4gKiBAcGFyYW0gZVxuICovXG5mdW5jdGlvbiBvbk1lbnVUb2dnbGVDbGljayhlKSB7XG5cblx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdGlmKF9pc09wZW4pIHtcblxuXHRcdGNsb3NlTWVudSgpO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRvcGVuTWVudSgpO1xuXHR9XG59XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIEhlbHBlciBGdW5jdGlvbnNcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbi8qKlxuICogT3BlbiBtb2JpbGUgbWVudVxuICovXG5mdW5jdGlvbiBvcGVuTWVudSgpIHtcblxuXHRfJGJvZHkuYWRkQ2xhc3MoQ0xBU1NfTk9fU0NST0xMKTtcblx0XyRtZW51VG9nZ2xlLmFkZENsYXNzKENMQVNTX0lTX09QRU4pO1xuXHRfJG1vYmlsZU1lbnUuYWRkQ2xhc3MoQ0xBU1NfSVNfT1BFTik7XG5cblx0XyRzdWJOYXYuYWRkQ2xhc3MoQ0xBU1NfSVNfSElEREVOKTtcblx0XyRzdWJOYXYucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfT1BFTik7XG5cblx0X2lzT3BlbiA9IHRydWU7XG5cblx0Y2xlYXJUaW1lb3V0KF9kZWxheWVkQ2FsbCk7XG59XG5cbi8qKlxuICogQ2xvc2UgbW9iaWxlIG1lbnVcbiAqL1xuZnVuY3Rpb24gY2xvc2VNZW51KCkge1xuXG5cdF8kYm9keS5yZW1vdmVDbGFzcyhDTEFTU19OT19TQ1JPTEwpO1xuXHRfJG1lbnVUb2dnbGUucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfT1BFTik7XG5cdF8kbW9iaWxlTWVudS5yZW1vdmVDbGFzcyhDTEFTU19JU19PUEVOKTtcblxuXHRfJHN1Yk5hdi5yZW1vdmVDbGFzcyhDTEFTU19JU19ISURERU4pO1xuXG5cdF9pc09wZW4gPSBmYWxzZTtcblxuXHRfZGVsYXllZENhbGwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXG5cdFx0XyRtb2JpbGVNZW51WzBdLnNjcm9sbFRvcCA9IDA7XG5cblx0fSwgREVMQVlFRF9USU1FKTtcbn1cblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgRXhwb3J0c1xuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbiIsInZhciAkID0gcmVxdWlyZSgnanF1ZXJ5JyksXG5cblx0bW9kdWxlQ29uZmlncyA9IFtcblxuXHRcdC8vIGFib3V0IG1vZHVsZXNcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2Fib3V0LWxvY2F0aW9uJyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9hYm91dFRpbWVsaW5lJyksXG5cblx0XHQvLyBldmVudCBtb2R1bGVcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2V2ZW50cy1mZWF0dXJlZCcpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvdG9wLWV2ZW50cycpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvaGVyb2VzJyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9pZGVhcy1pc3N1ZXMnKSxcblxuXHRcdC8vIGZpbHRlciBtb2R1bGVzXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9maWx0ZXJpbmcvY2xlYXJGaWx0ZXInKSxcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJBbmNob3InKSxcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJDb250ZW50JyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9maWx0ZXJpbmcvZmlsdGVyRXZlbnREcm9wZG93bnMnKSxcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJNdWx0aVNlbGVjdCcpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvZmlsdGVyaW5nL2ZpbHRlclJhZGlvQ2hlY2tib3gnKSxcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJQb3NpdGlvbmluZycpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvZmlsdGVyaW5nL2ZpbHRlclRvZ2dsZScpLFxuXHRcdC8vIGBmaWx0ZXJGb3JtYCBzaG91bGQgYmUgbGFzdCBvZiB0aGUgZmlsdGVycyBzaW5jZSBpdCdzIHByZS1maWxsaW5nIGFsbCB0aGUgaW5wdXRzIG9uIGluaXQuXG5cdFx0Ly8gVGhlc2UgaW5wdXRzIG5lZWQgdGhlaXIgbGlzdGVuZXJzIGFuZCB2YWx1ZXMgc2V0IGZvciBpdCB0byB3b3JrLlxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvZmlsdGVyaW5nL2ZpbHRlckZvcm0nKSxcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2ZpbHRlcmluZy9maWx0ZXJFdmVudHMnKSxcblxuXHRcdC8vIGhlYWRlciBtb2R1bGVcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2hlYWRlcicpLFxuXG5cdFx0Ly8gZ2VuZXJpYyBtb2R1bGVzXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9jYXJvdXNlbCcpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvY29udGVudFByb2dyZXNzQmFyJyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9jb250ZW50UHJvZ3Jlc3NFdmVudCcpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvZGlzcXVzVG9nZ2xlJyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9ndG1DbGljaycpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvZ3RtU3VibWl0JyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9zdWJOYXYnKSxcblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL2xvYWRNb3JlJyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9vdmVybGF5JyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9vdmVybGF5RmxpY2tyJyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9zaGFyZUJhcicpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvc3ZnSWNvbkxvYWRlcicpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvZmFkaW5nVGV4dCcpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvam9pbkF1dG9maWxsJyksXG5cdFx0cmVxdWlyZSgnLi4vbW9kdWxlcy9zb2NpYWxTaGFyZScpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvYWNjb3JkaW9uJyksXG5cblx0XHRyZXF1aXJlKCcuLi9tb2R1bGVzL3NlYXJjaCcpLFxuXHRcdHJlcXVpcmUoJy4uL21vZHVsZXMvYW5pbWF0ZUluJylcblxuXG5cdF07XG5cblxuZnVuY3Rpb24gcnVuKCRwYXJlbnQpIHtcblx0aWYoISRwYXJlbnQpIHtcblxuXHRcdCRwYXJlbnQgPSAkKCdodG1sJyk7XG5cdH1cblxuXHRtb2R1bGVDb25maWdzLmZvckVhY2goZnVuY3Rpb24oY29uZmlnKXtcblxuXHRcdHZhciAkc2VsZWN0b3IgPSAkcGFyZW50LmZpbmQoY29uZmlnLnNlbGVjdG9yKTtcblxuXHRcdCRzZWxlY3Rvci5lYWNoKGZ1bmN0aW9uKGluZGV4LCBlbCl7XG5cblx0XHRcdHZhciBtb2R1bGUgPSBuZXcgY29uZmlnLmNvbnN0cnVjdG9yKCksXG5cdFx0XHRcdCRlbCA9ICQoZWwpO1xuXG5cdFx0XHRtb2R1bGUuaW5pdCgkZWwpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gcmVtb3ZlIHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBtb2R1bGUgdHdpY2Vcblx0XHQkc2VsZWN0b3IucmVtb3ZlQ2xhc3MoY29uZmlnLnNlbGVjdG9yLnN1YnN0cigxKSk7XG5cdH0pO1xufVxuXG5leHBvcnRzLnJ1biA9IHJ1bjtcbiIsIi8vIHZlbmRvciBkZXBlbmRlbmNpZXNcbnZhciAkID0gcmVxdWlyZSgnanF1ZXJ5JyksXG5cblx0Ly8gcHJvamVjdCBkZXBlbmRlbmNpZXNcblx0ZmlsdGVyID0gcmVxdWlyZSgnLi9jb3JlL2ZpbHRlcicpLFxuXHRldmVudEJ1cyA9IHJlcXVpcmUoJy4vY29yZS9ldmVudEJ1cycpLFxuXHRtZW51VG9nZ2xlID0gcmVxdWlyZSgnLi9jb3JlL21lbnVUb2dnbGUnKSxcblx0bW9kdWxlRmFjdG9yeSA9IHJlcXVpcmUoJy4vY29yZS9tb2R1bGVGYWN0b3J5Jyk7XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0TGlicmFyaWVzXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5yZXF1aXJlKCdoYW1tZXJqcycpO1xucmVxdWlyZSgnanF1ZXJ5LWhhbW1lcmpzJyk7XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRJbml0aWFsaXplXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4kKGZ1bmN0aW9uKCkge1xuXG5cdGZpbHRlci5pbml0KCk7XG5cdG1lbnVUb2dnbGUuaW5pdCgpO1xuXHRtb2R1bGVGYWN0b3J5LnJ1bigpO1xuXG5cdGV2ZW50QnVzLmluaXQoKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBjb25zdGFudHNcblx0dmFyIE9QQUNJVFkgPSAwLjM7XG5cbnZhciBBcnJvdyA9IGZ1bmN0aW9uICggZWxlbWVudCwgZGlyZWN0aW9uLCBwYXJlbnRBY3Rpb24gKSB7XG5cblx0dmFyXHRfJGVsID0gZWxlbWVudCxcblx0XHRfZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuXG5cblx0ZnVuY3Rpb24gYmluZCAoKSB7XG5cblx0XHRwYXJlbnRBY3Rpb24oX2RpcmVjdGlvbik7XG5cdH1cblxuXHRmdW5jdGlvbiBfYW5pbWF0ZUluICgpIHtcblxuXHRcdF8kZWwuY3NzKCdvcGFjaXR5JywgMSk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIF9hbmltYXRlT3V0ICgpIHtcblxuXHRcdF8kZWwuY3NzKCdvcGFjaXR5JywgT1BBQ0lUWSk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIF9hY3RpdmF0ZSAoKSB7XG5cblxuXHRcdF8kZWwuY2xpY2soYmluZCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIF9kZWFjdGl2YXRlICgpIHtcblxuXHRcdF8kZWwub2ZmKCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0YW5pbWF0ZUluOiBfYW5pbWF0ZUluLFxuXHRcdGFuaW1hdGVPdXQ6IF9hbmltYXRlT3V0LFxuXHRcdGFjdGl2YXRlOiBfYWN0aXZhdGUsXG5cdFx0ZGVhY3RpdmF0ZTogX2RlYWN0aXZhdGVcblxuXHR9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBcnJvdztcblxuIiwiXG52YXIgRWFjaE5hdmlnYXRpb24gPSBmdW5jdGlvbiAoZWxlbWVudCwgdG9nZ2xlU3RhdHVzKSB7XG5cblx0dmFyXHRfJGVsID0gZWxlbWVudCxcblx0XHRfaXNBY3RpdmUgPSBmYWxzZTtcblxuXG5cdGZ1bmN0aW9uIF9hY3RpdmF0ZSAoKSB7XG5cblx0XHRfJGVsLm1vdXNlZW50ZXIoIGJpbmQgKTtcblx0XHRfJGVsLm1vdXNlbGVhdmUoIGJpbmQgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gX2RlYWN0aXZhdGUgKCkge1xuXG5cdFx0XyRlbC5vZmYoKTtcblxuXHR9XG5cblxuXG5cdGZ1bmN0aW9uIGJpbmQgKCkge1xuXG5cdFx0dG9nZ2xlU3RhdHVzKClcblx0XHRfdG9nZ2xlQ2xhc3MoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIF90b2dnbGVDbGFzcyAoKSB7XG5cblx0XHRfJGVsLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTtcblxuXHRcdGlmKF9pc0FjdGl2ZSkge1xuXG5cdFx0XHRfaXNBY3RpdmUgPSBmYWxzZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9pc0FjdGl2ZSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGFjdGl2YXRlOiBfYWN0aXZhdGUsXG5cdFx0ZGVhY3RpdmF0ZTogX2RlYWN0aXZhdGUsXG5cdFx0dG9nZ2xlQ2xhc3M6IF90b2dnbGVDbGFzc1xuXG5cdH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVhY2hOYXZpZ2F0aW9uO1xuXG5cblxuIiwiLy8gUHJvamVjdCBkZXBlbmRlbmNpZXNcblxudmFyICQgPSByZXF1aXJlKCdqcXVlcnknKSxcblx0ZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cdG1hdGNoTWVkaWEgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cy9tYXRjaE1lZGlhJyksXG5cdFBpbiA9IHJlcXVpcmUoJy4vcGluJyksXG5cdEVhY2hOYXZpZ2F0aW9uID0gcmVxdWlyZSgnLi9lYWNoTmF2aWdhdGlvbicpLFxuXHROYXZpZ2F0aW9uID0gcmVxdWlyZSgnLi9uYXZpZ2F0aW9uJyk7XG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLWxvY2F0aW9uJztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cdHZhciBfJGVsLFxuXHRcdF8kcGluV3JhcCxcblx0XHRfJGJhc2VQaW4sXG5cblx0XHRfJGFsbE5hdmlnYXRpb24sXG5cblx0XHRlYWNoUGluLFxuXG5cdFx0YWxsTmF2ID1bXSxcblx0XHRhbGxQaW5zID0gW10sXG5cdFx0aXNBY3RpdmUgPSBmYWxzZSxcblxuXHRcdF9waW5zQ3JlYXRlZCA9IGZhbHNlLFxuXHRcdG5hdmlnYXRpb247XG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0XyRwaW5XcmFwID0gXyRlbC5maW5kKCcuYWJvdXQtbG9jYXRpb25zX19tYXBfX3Bpbl9fY29udGFpbmVyJyk7XG5cdFx0XyRiYXNlUGluID0gXyRwaW5XcmFwLmZpbmQoJy5hYm91dC1sb2NhdGlvbnNfX21hcF9fcGluJyk7XG5cblx0XHRfJGFsbE5hdmlnYXRpb24gPSBfJGVsLmZpbmQoJy5hYm91dC1sb2NhdGlvbnNfX2xvY2F0aW9uJyk7XG5cblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5NQVRDSF9NRURJQSwgX3Jlc2l6ZSk7XG5cblx0XHRfJGJhc2VQaW4ucmVtb3ZlKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZU5hdmlnYXRpb24gKCBpbmRleCApIHtcblxuXHRcdG5hdmlnYXRpb24uZ29Ub0luZGV4KCBpbmRleCApO1xuXHRcdGFsbE5hdltpbmRleF0udG9nZ2xlQ2xhc3MoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gX3Jlc2l6ZSAoZSwgcmVzaXplKSB7XG5cblx0XHRpZihyZXNpemUgPj0gbWF0Y2hNZWRpYS5NRURJVU1fV0lORE9XKSB7XG5cblx0XHRcdGlmICghX3BpbnNDcmVhdGVkKSB7XG5cblx0XHRcdFx0bmF2aWdhdGlvbiA9IG5ldyBOYXZpZ2F0aW9uKF8kZWwsIF8kYWxsTmF2aWdhdGlvbik7XG5cblx0XHRcdFx0XyRhbGxOYXZpZ2F0aW9uLmVhY2goZnVuY3Rpb24oIGluZGV4ICkge1xuXG5cdFx0XHRcdFx0YWxsUGlucy5wdXNoKGVhY2hQaW4gPSBuZXcgUGluKF8kcGluV3JhcCwgXyRiYXNlUGluLCBpbmRleCwgJCh0aGlzKS5kYXRhKCdsb2NhdGlvbi1wb2ludC14JyksICQodGhpcykuZGF0YSgnbG9jYXRpb24tcG9pbnQteScpLCB1cGRhdGVOYXZpZ2F0aW9uKSk7XG5cdFx0XHRcdFx0YWxsTmF2LnB1c2gobmV3IEVhY2hOYXZpZ2F0aW9uKCQodGhpcyksIGVhY2hQaW4udG9nZ2xlU3RhdHVzICkpO1xuXG5cdFx0XHRcdFx0ZWFjaFBpbi5jcmVhdGUoKTtcblxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRfcGluc0NyZWF0ZWQgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNoZWNrU3RhdHVzKHRydWUpO1xuXG5cdFx0fSBlbHNlIGlmIChfcGluc0NyZWF0ZWQpIHtcblxuXHRcdFx0Y2hlY2tTdGF0dXMoZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGNoZWNrU3RhdHVzKCBzdGF0dXMgKSB7XG5cblx0XHRpZihpc0FjdGl2ZSAhPT0gc3RhdHVzKSB7XG5cblx0XHRcdGlzQWN0aXZlID0gc3RhdHVzO1xuXG5cdFx0XHRpc0FjdGl2ZSA/IGFjdGl2YXRlKCkgOiBkZWFjdGl2YXRlKCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gYWN0aXZhdGUgKCkge1xuXG5cdFx0bmF2aWdhdGlvbi5hY3RpdmF0ZSgpO1xuXG5cdFx0JC5lYWNoKGFsbFBpbnMsIGZ1bmN0aW9uKCBpbmRleCApIHtcblxuXHRcdFx0YWxsUGluc1tpbmRleF0uYWN0aXZhdGUoKTtcblx0XHRcdGFsbE5hdltpbmRleF0uYWN0aXZhdGUoKTtcblxuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGVhY3RpdmF0ZSAoKSB7XG5cblx0XHRuYXZpZ2F0aW9uLmRlYWN0aXZhdGUoKTtcblxuXHRcdCQuZWFjaChhbGxQaW5zLCBmdW5jdGlvbiggaW5kZXggKSB7XG5cblx0XHRcdGFsbFBpbnNbaW5kZXhdLmRlYWN0aXZhdGUoKTtcblx0XHRcdGFsbE5hdltpbmRleF0uZGVhY3RpdmF0ZSgpO1xuXG5cdFx0fSk7XG5cdH1cblxuXHR0aGlzLmluaXQgPSBpbml0O1xuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBBcnJvdyA9IHJlcXVpcmUoJy4vYXJyb3cnKSxcblxuLy8gY29uc3RhbnRzXG5cdEFOSU1BVEVfRFVSQVRJT04gPSAwLjU7XG5cbnZhciBOYXZpZ2F0aW9uID0gZnVuY3Rpb24gKCBlbGVtZW50LCBjaGlsZHJlbiApIHtcblxuXHR2YXJcdF8kZWwgPSBlbGVtZW50LFxuXHRcdF8kYWxsQ2hpbGRyZW4gPSBjaGlsZHJlbixcblx0XHRfJGNoaWxkcmVuV3JhcHBlciA9IF8kZWwuZmluZCgnLmFib3V0LWxvY2F0aW9uc19fbGlzdF9fd3JhcHBlcicpLFxuXHRcdF8kY2hpbGRyZW4gPSBfJGVsLmZpbmQoJy5hYm91dC1sb2NhdGlvbnNfX2xpc3QnKSxcblx0XHRfJGFycm93VG9wID0gXyRlbC5maW5kKCcubG9jYXRpb25zX19hcnJvdy0tdG9wJyksXG5cdFx0XyRhcnJvd0JvdHRvbSA9IF8kZWwuZmluZCgnLmxvY2F0aW9uc19fYXJyb3ctLWJvdHRvbScpLFxuXG5cdFx0X2Fycm93VG9wLFxuXHRcdF9hcnJvd0JvdHRvbSxcblxuXHRcdGNoaWxkcmVuQ291bnQsXG5cblx0XHRlbGVtZW50UGVyVmlldyxcblxuXHRcdGVhY2hDaGlsZHJlblNpemUsXG5cdFx0ZWxlbWVudEhlaWdodCxcblxuXHRcdHRvdGFsTW92ZXMsXG5cdFx0dG90YWxNb3Zlc0JvdHRvbSxcblx0XHR0b3RhbE1vdmVzVG9wO1xuXG5cdFx0ZWxlbWVudEhlaWdodCA9IHBhcnNlRmxvYXQoXyRjaGlsZHJlbldyYXBwZXIuY3NzKCdoZWlnaHQnKSk7XG5cblx0XHRlYWNoQ2hpbGRyZW5TaXplID0gcGFyc2VGbG9hdChfJGFsbENoaWxkcmVuLmNzcygnaGVpZ2h0JykpO1xuXG5cdFx0ZWxlbWVudFBlclZpZXcgPSBlbGVtZW50SGVpZ2h0IC8gZWFjaENoaWxkcmVuU2l6ZTtcblxuXHRcdGNoaWxkcmVuQ291bnQgPSBfJGFsbENoaWxkcmVuLmxlbmd0aDtcblxuXG5cdFx0aWYgKGNoaWxkcmVuQ291bnQgPiBlbGVtZW50UGVyVmlldykge1xuXG5cdFx0XHRfYXJyb3dUb3AgPSBuZXcgQXJyb3coXyRhcnJvd1RvcCwgJ3RvcCcsIF9iaW5kU3RlcHMpO1xuXHRcdFx0X2Fycm93Qm90dG9tID0gbmV3IEFycm93KF8kYXJyb3dCb3R0b20sICdib3R0b20nLCBfYmluZFN0ZXBzKTtcblxuXHRcdH1cblxuXHRmdW5jdGlvbiByZXNldCAoKSB7XG5cblx0XHR0b3RhbE1vdmVzID0gY2hpbGRyZW5Db3VudCAvIGVsZW1lbnRQZXJWaWV3IC0gMTtcblx0XHR0b3RhbE1vdmVzQm90dG9tID0gdG90YWxNb3Zlcztcblx0XHR0b3RhbE1vdmVzVG9wID0gdG90YWxNb3ZlcyAtIHRvdGFsTW92ZXNCb3R0b207XG5cblx0XHR1cGRhdGVBcnJvd3MoX2Fycm93VG9wLCB0b3RhbE1vdmVzVG9wKTtcblx0XHR1cGRhdGVBcnJvd3MoX2Fycm93Qm90dG9tLCB0b3RhbE1vdmVzQm90dG9tKTtcblxuXHRcdGFuaW1hdGUodG90YWxNb3Zlc1RvcCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIF9hY3RpdmF0ZSAoKSB7XG5cblx0XHRyZXNldCgpO1xuXG5cdFx0X2Fycm93VG9wLmFjdGl2YXRlKCk7XG5cdFx0X2Fycm93Qm90dG9tLmFjdGl2YXRlKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIF9kZWFjdGl2YXRlICgpIHtcblxuXHRcdF9hcnJvd1RvcC5kZWFjdGl2YXRlKCk7XG5cdFx0X2Fycm93Qm90dG9tLmRlYWN0aXZhdGUoKTtcblxuXHRcdHJlc2V0KCk7XG5cdH1cblxuXHRmdW5jdGlvbiBfYmluZFN0ZXBzICggZGlyZWN0aW9uICkge1xuXG5cdFx0aWYgKHRvdGFsTW92ZXNCb3R0b20gPj0gMCkge1xuXG5cdFx0XHRpZiAoZGlyZWN0aW9uID09PSAnYm90dG9tJykge1xuXG5cdFx0XHRcdHRvdGFsTW92ZXNCb3R0b20gPSB0b3RhbE1vdmVzQm90dG9tID49IDEgPyB0b3RhbE1vdmVzQm90dG9tIC0gMSA6IHRvdGFsTW92ZXNCb3R0b20gLSB0b3RhbE1vdmVzQm90dG9tO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRvdGFsTW92ZXNCb3R0b20gPSB0b3RhbE1vdmVzVG9wID49IDEgPyB0b3RhbE1vdmVzQm90dG9tICsgMSA6IHRvdGFsTW92ZXNCb3R0b20gKyB0b3RhbE1vdmVzVG9wO1xuXHRcdFx0fVxuXG5cdFx0XHR0b3RhbE1vdmVzVG9wID0gdG90YWxNb3ZlcyAtIHRvdGFsTW92ZXNCb3R0b207XG5cblx0XHRcdGFuaW1hdGUodG90YWxNb3Zlc1RvcCk7XG5cblx0XHRcdHVwZGF0ZUFycm93cyhfYXJyb3dUb3AsIHRvdGFsTW92ZXNUb3ApO1xuXHRcdFx0dXBkYXRlQXJyb3dzKF9hcnJvd0JvdHRvbSwgdG90YWxNb3Zlc0JvdHRvbSk7XG5cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBfZ29Ub0luZGV4ICggaW5kZXggKSB7XG5cblx0XHRpZiAoIChjaGlsZHJlbkNvdW50IC0gaW5kZXggKSA8IGVsZW1lbnRQZXJWaWV3ICkge1xuXG5cdFx0XHR0b3RhbE1vdmVzVG9wID0gdG90YWxNb3ZlcztcblxuXHRcdH1lbHNlIHtcblxuXHRcdFx0dG90YWxNb3Zlc1RvcCA9IChpbmRleCkgLyBlbGVtZW50UGVyVmlldztcblxuXHRcdH1cblxuXHRcdHRvdGFsTW92ZXNCb3R0b20gPSB0b3RhbE1vdmVzIC0gdG90YWxNb3Zlc1RvcDtcblxuXHRcdGFuaW1hdGUodG90YWxNb3Zlc1RvcCk7XG5cblx0XHR1cGRhdGVBcnJvd3MoX2Fycm93VG9wLCB0b3RhbE1vdmVzVG9wKTtcblx0XHR1cGRhdGVBcnJvd3MoX2Fycm93Qm90dG9tLCB0b3RhbE1vdmVzQm90dG9tKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUFycm93cyAoYXJyb3csIGNvdW50KSB7XG5cblx0XHRpZiAoY291bnQgPiAwKSB7XG5cblx0XHRcdGFycm93LmFuaW1hdGVJbigpO1xuXG5cdFx0fWVsc2Uge1xuXG5cdFx0XHRhcnJvdy5hbmltYXRlT3V0KCk7XG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBhbmltYXRlICggdG90YWxNb3Zlc1RvcCApIHtcblxuXHRcdFR3ZWVuTGl0ZS50byhfJGNoaWxkcmVuICwgQU5JTUFURV9EVVJBVElPTiwge1xuXHRcdFx0eTogLSh0b3RhbE1vdmVzVG9wICogKGVsZW1lbnRQZXJWaWV3ICogZWFjaENoaWxkcmVuU2l6ZSkpLFxuXHRcdFx0ZWFzZTogQ3ViaWMuZWFzZU91dFxuXHRcdH0pO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z29Ub0luZGV4OiBfZ29Ub0luZGV4LFxuXHRcdGFjdGl2YXRlOiBfYWN0aXZhdGUsXG5cdFx0ZGVhY3RpdmF0ZTogX2RlYWN0aXZhdGUsXG5cdFx0YmluZFN0ZXBzOiBfYmluZFN0ZXBzXG5cblx0fVxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gTmF2aWdhdGlvbjtcblxuXG5cbiIsIlxudmFyIFBpbiA9IGZ1bmN0aW9uICggcGFyZW50LCBiYXNlLCBpbmRleCwgeCwgeSwgdXBkYXRlTmF2aWdhdGlvbiApIHtcblxuXHR2YXJcdF8kcGFyZW50ID0gcGFyZW50LFxuXHRcdF8kYmFzZSA9IGJhc2UsXG5cdFx0XyRlbCA9IF8kYmFzZS5jbG9uZSgpLFxuXG5cdFx0XyRpbm5lclRleHQsXG5cblx0XHRfaXNBY3RpdmUgPSBmYWxzZTtcblxuXG5cdGZ1bmN0aW9uIF9jcmVhdGUgKCkge1xuXG5cdFx0XyRwYXJlbnQuYXBwZW5kKCBfJGVsICk7XG5cdFx0XyRpbm5lclRleHQgPSBfJGVsLmZpbmQoJy5hYm91dC1sb2NhdGlvbnNfX21hcF9fcGluX19udW1iZXInKTtcblx0XHRfJGlubmVyVGV4dC50ZXh0KCBpbmRleCArIDEgKTtcblxuXHRcdF8kZWwuY3NzKHtcblxuXHRcdFx0bGVmdDogeCArICclJyxcblx0XHRcdHRvcDogeSArICclJ1xuXG5cdFx0fSlcblx0fVxuXG5cdGZ1bmN0aW9uIF9hY3RpdmF0ZSAoKSB7XG5cblx0XHRfJGVsLm1vdXNlZW50ZXIodXBkYXRlTmF2KTtcblx0XHRfJGVsLm1vdXNlbGVhdmUodXBkYXRlTmF2KTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gX2RlYWN0aXZhdGUgKCkge1xuXG5cdFx0XyRlbC5vZmYoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlTmF2ICgpIHtcblxuXHRcdHVwZGF0ZU5hdmlnYXRpb24oaW5kZXgpO1xuXHRcdF90b2dnbGVTdGF0dXMoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIF90b2dnbGVTdGF0dXMgKCkge1xuXG5cdFx0XyRlbC50b2dnbGVDbGFzcygnYWJvdXQtbG9jYXRpb25zX19tYXAtaWNvbl9fYWN0aXZlJyk7XG5cblx0XHRpZihfaXNBY3RpdmUpIHtcblxuXHRcdFx0X2lzQWN0aXZlID0gZmFsc2U7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfaXNBY3RpdmUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRjcmVhdGU6IF9jcmVhdGUsXG5cdFx0YWN0aXZhdGU6IF9hY3RpdmF0ZSxcblx0XHRkZWFjdGl2YXRlOiBfZGVhY3RpdmF0ZSxcblx0XHR0b2dnbGVTdGF0dXM6IF90b2dnbGVTdGF0dXNcblxuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUGluO1xuXG5cblxuIiwidmFyICQgPSByZXF1aXJlKCdqcXVlcnknKSxcblx0ZXZlbnRCdXMgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50QnVzJyksXG5cdG1hdGNoTWVkaWEgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50cy9tYXRjaE1lZGlhJyksXG5cdENMQVNTX0lTX0FDVElWRSA9ICdpcy1hY3RpdmUnLFxuXHRDTEFTU19DT05UUk9MX0FDVElWRSA9ICdjb250cm9sLS1hY3RpdmUnO1xuXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLWFib3V0VGltZWxpbmUnO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblx0dmFyIF8kY2FyZHMsXG5cdFx0XyRhcnJvd0xlZnQsXG5cdFx0XyRhcnJvd1JpZ2h0LFxuXHRcdF8kZG90cyxcblx0XHRfY2FyZHNJblZpZXcsXG5cdFx0X2N1cnJlbnRJbmRleCxcblx0XHRfdG90YWxJbmRleCxcblx0XHRfbWF4SW5kZXg7XG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kYXJyb3dMZWZ0ID0gJGVsLmZpbmQoJy5qcy1hYm91dFRpbWVsaW5lX19wcmV2aW91cycpLFxuXHRcdF8kYXJyb3dSaWdodCA9ICRlbC5maW5kKCcuanMtYWJvdXRUaW1lbGluZV9fbmV4dCcpO1xuXG5cdFx0XyRkb3RzID0gJGVsLmZpbmQoJy5qcy1hYm91dFRpbWVsaW5lX19kb3QnKTtcblx0XHRfJGNhcmRzID0gJGVsLmZpbmQoJy5qcy1hYm91dFRpbWVsaW5lX19jYXJkJyk7XG5cblx0XHQkZWwuaGFtbWVyKCkub24oJ3N3aXBlcmlnaHQnLCBvbkxlZnRBcnJvd0NsaWNrKTtcblx0XHQkZWwuaGFtbWVyKCkub24oJ3N3aXBlbGVmdCcsIG9uUmlnaHRBcnJvd0NsaWNrKTtcblxuXHRcdF9jdXJyZW50SW5kZXggPSAwO1xuXHRcdF90b3RhbEluZGV4ID0gXyRkb3RzLmxlbmd0aCAtIDE7XG5cblx0XHR1cGRhdGVBcnJvd3MoKTtcblxuXHRcdF8kYXJyb3dMZWZ0LmNsaWNrKG9uTGVmdEFycm93Q2xpY2spO1xuXHRcdF8kYXJyb3dSaWdodC5jbGljayhvblJpZ2h0QXJyb3dDbGljayk7XG5cblx0XHRfJGRvdHMuY2xpY2sob25FbENsaWNrKTtcblx0XHRfJGNhcmRzLmNsaWNrKG9uRWxDbGljayk7XG5cblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5SRVNJWkUsIG9uUmVzaXplKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uRWxDbGljaygpIHtcblxuXHRcdHZhciAkZWwgPSAkKHRoaXMpO1xuXG5cdFx0dXBkYXRlSW5kZXgoJGVsLmluZGV4KCkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gb25SZXNpemUoZSwgbmV3V2lkdGgpIHtcblxuXHRcdGlmKG5ld1dpZHRoID49IG1hdGNoTWVkaWEuTEFSR0VfV0lORE9XKSB7XG5cblx0XHRcdF9jYXJkc0luVmlldyA9IDQ7XG5cblx0XHR9IGVsc2UgaWYobmV3V2lkdGggPj0gbWF0Y2hNZWRpYS5NRURJVU1fV0lORE9XKSB7XG5cblx0XHRcdF9jYXJkc0luVmlldyA9IDI7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfY2FyZHNJblZpZXcgPSAxO1xuXHRcdH1cblxuXHRcdF9tYXhJbmRleCA9IF90b3RhbEluZGV4IC0gX2NhcmRzSW5WaWV3ICsgMTtcblxuXHRcdHJlZHJhdyh0cnVlKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uTGVmdEFycm93Q2xpY2soKSB7XG5cblx0XHR1cGRhdGVJbmRleChfY3VycmVudEluZGV4IC0gMSk7XG5cdH1cblxuXHRmdW5jdGlvbiBvblJpZ2h0QXJyb3dDbGljaygpIHtcblxuXHRcdHVwZGF0ZUluZGV4KF9jdXJyZW50SW5kZXggKyAxKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUluZGV4KG5ld0luZGV4KSB7XG5cblx0XHRuZXdJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld0luZGV4LCBfdG90YWxJbmRleCkpO1xuXG5cdFx0aWYobmV3SW5kZXggIT09IF9jdXJyZW50SW5kZXgpIHtcblxuXHRcdFx0X2N1cnJlbnRJbmRleCA9IG5ld0luZGV4O1xuXG5cdFx0XHR1cGRhdGVFbHMoXyRjYXJkcyk7XG5cdFx0XHR1cGRhdGVFbHMoXyRkb3RzKTtcblx0XHRcdHVwZGF0ZUFycm93cygpO1xuXG5cdFx0XHRyZWRyYXcoKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVBcnJvd3MoKSB7XG5cblx0XHRpZihfY3VycmVudEluZGV4ID09PSAwKSB7XG5cblx0XHRcdF8kYXJyb3dMZWZ0LmhpZGUoKVxuXHRcdFx0XHQucmVtb3ZlQ2xhc3MoQ0xBU1NfQ09OVFJPTF9BQ1RJVkUpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0XyRhcnJvd0xlZnQuc2hvdygpXG5cdFx0XHRcdC5hZGRDbGFzcyhDTEFTU19DT05UUk9MX0FDVElWRSk7XG5cdFx0fVxuXG5cdFx0aWYoX2N1cnJlbnRJbmRleCA9PT0gX3RvdGFsSW5kZXgpIHtcblxuXHRcdFx0XyRhcnJvd1JpZ2h0LmhpZGUoKVxuXHRcdFx0XHQucmVtb3ZlQ2xhc3MoQ0xBU1NfQ09OVFJPTF9BQ1RJVkUpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0XyRhcnJvd1JpZ2h0LnNob3coKVxuXHRcdFx0XHQuYWRkQ2xhc3MoQ0xBU1NfQ09OVFJPTF9BQ1RJVkUpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZHJhdyhub0FuaW1hdGlvbikge1xuXG5cdFx0dmFyIGZvY3VzZWRJbmRleCA9IE1hdGgubWluKF9jdXJyZW50SW5kZXgsIF9tYXhJbmRleCksXG5cdFx0XHRjYXJkV2lkdGggPSBfJGNhcmRzLndpZHRoKCksXG5cdFx0XHR0aW1lO1xuXG5cdFx0aWYobm9BbmltYXRpb24pIHtcblxuXHRcdFx0dGltZSA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aW1lID0gMC41O1xuXHRcdH1cblxuXHRcdFR3ZWVuTGl0ZS50byhfJGNhcmRzLCB0aW1lLCB7XG5cdFx0XHR4OiAtKGZvY3VzZWRJbmRleCAqIGNhcmRXaWR0aCksXG5cdFx0XHRlYXNlOiBDdWJpYy5lYXNlT3V0XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVFbHMoJGVscykge1xuXG5cdFx0dmFyICRlbCxcblx0XHRcdGk7XG5cblx0XHRmb3IoaSA9IDA7IGkgPCAkZWxzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdCRlbCA9ICQoJGVsc1tpXSk7XG5cblx0XHRcdGlmKF9jdXJyZW50SW5kZXggPT09IGkpIHtcblxuXHRcdFx0XHQkZWwuYWRkQ2xhc3MoQ0xBU1NfSVNfQUNUSVZFKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQkZWwucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfQUNUSVZFKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsIi8vIGNvbnN0YW50c1xudmFyXG4gICQgPSByZXF1aXJlKCdqcXVlcnknKSxcbiAgQ0xBU1NfSVNfT1BFTiA9ICdpcy1vcGVuJztcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmFjY29yZGlvbl9faXRlbSc7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuICB2YXIgXyRlbCxcbiAgICBfJHRvZ2dsZUVsO1xuXG5cblxuICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIEluaXRpYWxpemF0aW9uXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbiAgZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuICAgIF8kZWwgPSAkZWw7XG5cbiAgICBfJHRvZ2dsZUVsID0gXyRlbC5maW5kKCcuYWNjb3JkaW9uX190aXRsZScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgXyR0aGlzID0gJCh0aGlzKTtcblxuICAgICAgaWYgKF8kdGhpcy5uZXh0KCkuaGFzQ2xhc3MoJ3Nob3cnKSkge1xuICAgICAgICBfJHRoaXMucmVtb3ZlQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICAgXyR0aGlzLm5leHQoKS5yZW1vdmVDbGFzcygnc2hvdycpO1xuICAgICAgICBfJHRoaXMubmV4dCgpLnNsaWRlVXAoMzUwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF8kdGhpcy5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcuYWNjb3JkaW9uX19jb250ZW50JykucmVtb3ZlQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICAgXyR0aGlzLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5hY2NvcmRpb25fX3RpdGxlJykucmVtb3ZlQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICAgXyR0aGlzLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5hY2NvcmRpb25fX2NvbnRlbnQnKS5zbGlkZVVwKDM1MCk7XG4gICAgICAgIF8kdGhpcy5uZXh0KCkudG9nZ2xlQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICAgXyR0aGlzLm5leHQoKS5zbGlkZVRvZ2dsZSgzNTApO1xuICAgICAgICBfJHRoaXMudG9nZ2xlQ2xhc3MoJ3Nob3cnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICB9XG5cblxuXG4gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgUHVibGljIE1ldGhvZHNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbiAgdGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCJ2YXIgZXZlbnRCdXMgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50QnVzJyksXG5cdGNoZWNrSW5WaWV3ID0gcmVxdWlyZSgnLi4vdXRpbHMvY2hlY2tJblZpZXcnKTtcblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtYW5pbWF0ZUluJztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cdHZhciBfJGVsO1xuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXG5cdFx0dmFyIGlzSW5WaWV3ID0gY2hlY2tJblZpZXcoXyRlbCk7XG5cblx0XHRpZighaXNJblZpZXcpIHtcblxuXHRcdFx0XyRlbC5hZGRDbGFzcygnYW5pbWF0ZUluX19wZW5kaW5nJyk7XG5cdFx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5TQ1JPTEwsIG9uU2Nyb2xsKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBvblNjcm9sbCgpIHtcblxuXHRcdHZhciBpc0luVmlldyA9IGNoZWNrSW5WaWV3KF8kZWwpO1xuXG5cdFx0aWYoaXNJblZpZXcpIHtcblxuXHRcdFx0c2hvdygpO1xuXG5cdFx0XHRldmVudEJ1cy5vZmYoZXZlbnRCdXMuU0NST0xMLCBvblNjcm9sbCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gc2hvdygpIHtcblxuXHRcdF8kZWwuYWRkQ2xhc3MoJ2lzLWluLXZpZXcnKTtcblx0fVxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwiXG52YXIgQXJyb3cgPSBmdW5jdGlvbiggZWxlbWVudCwgZGlyZWN0aW9uLCBfcGFyZW50QmluZCApIHtcblxuXHR2YXIgX2VsZW1lbnQgPSBlbGVtZW50LFxuXHRcdGlzQWN0aXZlID0gZmFsc2U7XG5cblx0ZnVuY3Rpb24gX2FjdGl2YXRlICgpIHtcblxuXHRcdF9lbGVtZW50LmNzcygnZGlzcGxheScsICdibG9jaycpO1xuXHRcdF9lbGVtZW50LmNsaWNrKCBiaW5kICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIF9kZWFjdGl2YXRlICgpIHtcblxuXHRcdF9lbGVtZW50LmNzcygnZGlzcGxheScsICdub25lJyk7XG5cdFx0X2VsZW1lbnQub2ZmKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIF9zdGF0dXMgKCBpc0FjdGl2YXRlZCApIHtcblxuXHRcdGlmKGlzQWN0aXZlICE9PSBpc0FjdGl2YXRlZCkge1xuXG5cdFx0XHRpc0FjdGl2ZSA9IGlzQWN0aXZhdGVkO1xuXG5cdFx0XHR0b2dnbGVTdGF0dXMoKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBiaW5kICgpIHtcblxuXHRcdF9wYXJlbnRCaW5kKGRpcmVjdGlvbik7XG5cblx0fVxuXG5cblx0ZnVuY3Rpb24gdG9nZ2xlU3RhdHVzKCkge1xuXG5cdFx0X2VsZW1lbnQudG9nZ2xlQ2xhc3MoJ2NvbnRyb2wtLWFjdGl2ZScpO1xuXHR9XG5cblxuXHRyZXR1cm4ge1xuXG5cdFx0c3RhdHVzIDogX3N0YXR1cyxcblx0XHRhY3RpdmF0ZTogX2FjdGl2YXRlLFxuXHRcdGRlYWN0aXZhdGU6IF9kZWFjdGl2YXRlXG5cblx0fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJvdztcblxuXG5cbiIsIlxudmFyIEFycm93ID0gZnVuY3Rpb24oIGVsZW1lbnQsIGRpcmVjdGlvbiwgX3BhcmVudEJpbmQgKSB7XG5cblx0dmFyIF9lbGVtZW50ID0gZWxlbWVudCxcblx0XHRpc0FjdGl2ZSA9IGZhbHNlO1xuXG5cdGZ1bmN0aW9uIF9hY3RpdmF0ZSAoKSB7XG5cblx0XHRfZWxlbWVudC5jbGljayggYmluZCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBfZGVhY3RpdmF0ZSAoKSB7XG5cdFx0XG5cdFx0X2VsZW1lbnQub2ZmKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIF9zdGF0dXMgKCBpc0FjdGl2YXRlZCApIHtcblxuXHRcdGlmKGlzQWN0aXZlICE9PSBpc0FjdGl2YXRlZCkge1xuXG5cdFx0XHRpc0FjdGl2ZSA9IGlzQWN0aXZhdGVkO1xuXG5cdFx0XHR0b2dnbGVTdGF0dXMoKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBiaW5kICgpIHtcblxuXHRcdF9wYXJlbnRCaW5kKGRpcmVjdGlvbik7XG5cblx0fVxuXG5cblx0ZnVuY3Rpb24gdG9nZ2xlU3RhdHVzKCkge1xuXG5cdFx0X2VsZW1lbnQudG9nZ2xlQ2xhc3MoJ2NvbnRyb2wtLWFjdGl2ZScpO1xuXHR9XG5cblxuXHRyZXR1cm4ge1xuXG5cdFx0c3RhdHVzIDogX3N0YXR1cyxcblx0XHRhY3RpdmF0ZTogX2FjdGl2YXRlLFxuXHRcdGRlYWN0aXZhdGU6IF9kZWFjdGl2YXRlXG5cblx0fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJvdztcblxuXG5cbiIsIi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cdG1hdGNoTWVkaWEgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cy9tYXRjaE1lZGlhJyksXG5cdGd0bURhdGFQdXNoZXIgPSByZXF1aXJlKCcuLi8uLi91dGlscy9ndG1EYXRhUHVzaGVyJyksXG5cdEFycm93ID0gcmVxdWlyZSgnLi9hcnJvdycpLFxuXHROYXZpZ2F0aW9uID0gcmVxdWlyZSgnLi9uYXZpZ2F0aW9uJyksXG5cdGpxID0gcmVxdWlyZSgnanF1ZXJ5JyksXG5cblx0Ly8gY29uc3RhbnRzXG5cdEFDVElPTl9TV0lQRSA9ICdzd2lwZScsXG5cdEFOSU1BVEVfRFVSQVRJT04gPSAwLjQ7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gTW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1jYXJvdXNlbCc7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgSW5pdGlhbGl6ZVxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXHQvLyBOT1RFOiBTaXplcyBhcmUgc2VwYXJ0ZWQgYnkgcHgocGl4ZWxzKSBhbmQgcGN0IChwZXJjZW50YWdlKVxuXG5cdHZhciBmdWxsUGN0ID0gMTAwLFxuXHRcdF8kZWwsXG5cdFx0XyRjb250YWluZXIsXG5cdFx0XyRhbGxDaGlsZHJlbixcblx0XHRfJG5hdmlnYXRpb24sXG5cdFx0XyRwcmV2aW91cyxcblx0XHRfJG5leHQsXG5cblx0XHRjaGlsZHJlbkNvdW50LFxuXHRcdHBhcmVudFB4LFxuXG5cdFx0Y2hpbGRyZW5NYXJnaW5QeCxcblxuXHRcdGNoaWxkcmVuUGN0LFxuXHRcdGNoaWxkcmVuTWFyZ2luUGN0LFxuXG5cdFx0Ly8gRmluYWwgRWxlbWVudCBQdGNcblxuXHRcdG5ld1BhcmVudFBjdCxcblx0XHRuZXdDaGlsZHJlblBjdCxcblx0XHRuZXdNYXJnaW5QdGMsXG5cblx0XHQvLyBPcHRpb25zXG5cblx0XHRfbmF2aWdhdGlvbixcblx0XHRfYXJyb3dSaWdodCxcblx0XHRfYXJyb3dMZWZ0LFxuXG5cblx0XHRkYXRhQ29scyxcblx0XHRjYXJvdXNlbElzQWN0aXZlID0gZmFsc2UsXG5cdFx0Y29sdW1zUGVyU2l6ZSxcblxuXHRcdC8vIENhcm91c2VsIERhdGFcblxuXHRcdHRvdGFsTW92ZXMsXG5cdFx0dG90YWxNb3Zlc1JpZ2h0LFxuXHRcdHRvdGFsTW92ZXNMZWZ0LFxuXHRcdHJlc2l6ZU1vdmVzLFxuXG5cdFx0bW92ZXNQZXJTaXplLFxuXG5cdFx0Y3VycmVudEVsZW1lbnRJbmRleCA9IDE7XG5cblxuXHRmdW5jdGlvbiBpbml0KCRlbCkge1xuXG5cdFx0dmFyIERFRkFVTFRfQ0FSRF9TSVpFID0gMztcblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0XyRjb250YWluZXIgPSBfJGVsLmZpbmQoJy5qcy1jYXJvdXNlbF9fY29udGFpbmVyJyk7XG5cdFx0aWYgKCFfJGNvbnRhaW5lci5sZW5ndGgpIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvcignYC5qcy1jYXJvdXNlbGAgbW9kdWxlIG5lZWRzIGEgYC5qcy1jYXJvdXNlbF9fY29udGFpbmVyYCBjaGlsZC4nKTtcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdF8kYWxsQ2hpbGRyZW4gPSBfJGNvbnRhaW5lci5jaGlsZHJlbigpO1xuXG5cblx0XHRpZiAoIV8kYWxsQ2hpbGRyZW4ubGVuZ3RoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoJ2AuanMtY2Fyb3VzZWxgIG1vZHVsZSByZXF1aXJlcyB0aGF0IHRoZSBgLmpzLWNhcm91c2VsX19jb250YWluZXJgIGhhcyBhdCBsZWFzdCBvbmUgY2hpbGQuJyk7XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHRfJG5hdmlnYXRpb24gPSBfJGVsLmZpbmQoJy5qcy1jYXJvdXNlbF9fbmF2aWdhdGlvbicpO1xuXG5cdFx0XyRwcmV2aW91cyA9IF8kZWwuZmluZCgnLmpzLWNhcm91c2VsX19wcmV2aW91cycpO1xuXHRcdF8kbmV4dCA9IF8kZWwuZmluZCgnLmpzLWNhcm91c2VsX19uZXh0Jyk7XG5cblx0XHQvLyBQYXJlbnQgVmFsdWVzXG5cblx0XHRwYXJlbnRQeCA9IF8kY29udGFpbmVyLndpZHRoKCk7XG5cblx0XHQvLyBDaGlsZHJlbiBWYWx1ZXNcblx0XHRkYXRhQ29scyA9IF8kY29udGFpbmVyLmRhdGEoJ2Nhcm91c2VsLWNhcmRzaXplJykgPyBfJGNvbnRhaW5lci5kYXRhKCdjYXJvdXNlbC1jYXJkc2l6ZScpIDogREVGQVVMVF9DQVJEX1NJWkU7XG5cdFx0Y2hpbGRyZW5Db3VudCA9IF8kYWxsQ2hpbGRyZW4ubGVuZ3RoO1xuXG5cdFx0Y2hpbGRyZW5NYXJnaW5QeCA9IChwYXJzZUZsb2F0KF8kYWxsQ2hpbGRyZW4uY3NzKCdtYXJnaW4tcmlnaHQnKS5yZXBsYWNlKCdweCcsICcnKSkgK1xuXG5cdFx0XHRwYXJzZUZsb2F0KF8kYWxsQ2hpbGRyZW4uY3NzKCdtYXJnaW4tbGVmdCcpLnJlcGxhY2UoJ3B4JywgJycpKSk7XG5cblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5NQVRDSF9NRURJQSwgX3Jlc2l6ZSk7XG5cblx0XHQvL1x0XHRJbml0IEFycm93c1xuXG5cdFx0X25hdmlnYXRpb24gPSBuZXcgTmF2aWdhdGlvbihfJG5hdmlnYXRpb24pO1xuXHRcdF9hcnJvd1JpZ2h0ID0gbmV3IEFycm93KF8kbmV4dCwgJ3JpZ2h0JywgYmluZFN0ZXBzKTtcblx0XHRfYXJyb3dMZWZ0ID0gbmV3IEFycm93KF8kcHJldmlvdXMsICdsZWZ0JywgYmluZFN0ZXBzKTtcblxuXHRcdG5hdmlnYXRpb25TdHlsZSgpO1xuXG5cblx0XHRfJGNvbnRhaW5lci5oYW1tZXIoKS5vbignc3dpcGVyaWdodCcsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Z3RtRGF0YVB1c2hlcihfJHByZXZpb3VzLmRhdGEoJ2NhdGVnb3J5JyksIEFDVElPTl9TV0lQRSwgXyRwcmV2aW91cy5kYXRhKCdsYWJlbCcpKTtcblx0XHRcdGJpbmRTdGVwcygnbGVmdCcpO1xuXHRcdH0pO1xuXG5cdFx0XyRjb250YWluZXIuaGFtbWVyKCkub24oJ3N3aXBlbGVmdCcsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Z3RtRGF0YVB1c2hlcihfJG5leHQuZGF0YSgnY2F0ZWdvcnknKSwgQUNUSU9OX1NXSVBFLCBfJG5leHQuZGF0YSgnbGFiZWwnKSk7XG5cdFx0XHRiaW5kU3RlcHMoJ3JpZ2h0Jyk7XG5cdFx0fSk7XG5cblx0XHRfJGVsLmZpbmQoJy5qcy1jYXJvdXNlbF9fZG90Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IGpxKHRoaXMpLmluZGV4KCk7XG5cdFx0XHRiaW5kU3RlcHMobnVsbCwgaSk7XG5cdFx0fSk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG5hdmlnYXRpb25TdHlsZSgpIHtcblxuXHRcdHZhciBpO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IF8kYWxsQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0X25hdmlnYXRpb24uY3JlYXRlRG90cygpO1xuXG5cdFx0fVxuXG5cdFx0X25hdmlnYXRpb24uYWN0aXZhdGVEb3QoMSk7XG5cdH1cblxuXHRmdW5jdGlvbiBfcmVzaXplKGUsIHJlc2l6ZSkge1xuXG5cdFx0aWYgKHJlc2l6ZSA+PSBtYXRjaE1lZGlhLkxBUkdFX1dJTkRPVykge1xuXG5cdFx0XHRtb3Zlc1BlclNpemUgPSBkYXRhQ29scztcblx0XHRcdGNvbHVtc1BlclNpemUgPSBkYXRhQ29scztcblxuXHRcdH0gZWxzZSBpZiAocmVzaXplID09PSBtYXRjaE1lZGlhLk1FRElVTV9XSU5ET1cpIHtcblxuXHRcdFx0bW92ZXNQZXJTaXplID0gMjtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAyO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxLjAyO1xuXHRcdH1cblxuXHRcdHN0eWxlQ29sdW1ucygpO1xuXHRcdHN0eWxlQXJyb3dzKGNvbHVtc1BlclNpemUpO1xuXG5cdFx0aWYgKGNoaWxkcmVuQ291bnQgPiBjb2x1bXNQZXJTaXplKSB7XG5cblx0XHRcdHJlc2V0U3RlcHMoKTtcblx0XHRcdGV2YWx1YXRlQ29udHJvbHMoKTtcblx0XHRcdGFuaW1hdGUodG90YWxNb3Zlc0xlZnQpO1xuXHRcdFx0Y2hlY2tTdGF0dXModHJ1ZSk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjaGVja1N0YXR1cyhmYWxzZSk7XG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzdHlsZUFycm93cyhjb2xzKSB7XG5cblxuXHRcdGlmIChfJGFsbENoaWxkcmVuLmxlbmd0aCA8PSBjb2xzIHx8IGNvbHMgPCAyKSB7XG5cblx0XHRcdF8kcHJldmlvdXMuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblx0XHRcdF8kbmV4dC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0XyRwcmV2aW91cy5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblx0XHRcdF8kbmV4dC5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc2V0U3RlcHMoKSB7XG5cblx0XHR0b3RhbE1vdmVzID0gKChjaGlsZHJlbkNvdW50IC8gbW92ZXNQZXJTaXplKSAtIDEpIC0gKChjb2x1bXNQZXJTaXplIC8gbW92ZXNQZXJTaXplKSAtIDEpO1xuXG5cdFx0cmVzaXplTW92ZXMgPSAoY3VycmVudEVsZW1lbnRJbmRleCAtIDEpIC8gbW92ZXNQZXJTaXplO1xuXG5cdFx0dG90YWxNb3Zlc0xlZnQgPSByZXNpemVNb3ZlcyA+IHRvdGFsTW92ZXMgPyB0b3RhbE1vdmVzIDogcmVzaXplTW92ZXM7XG5cblx0XHR0b3RhbE1vdmVzUmlnaHQgPSB0b3RhbE1vdmVzIC0gdG90YWxNb3Zlc0xlZnQ7XG5cdH1cblxuXHRmdW5jdGlvbiBzdHlsZUNvbHVtbnMoKSB7XG5cblx0XHRjaGlsZHJlbk1hcmdpblBjdCA9IGdldFBlcmNlbnRhZ2UoY2hpbGRyZW5NYXJnaW5QeCk7XG5cdFx0Y2hpbGRyZW5QY3QgPSAoZnVsbFBjdCAvIGNvbHVtc1BlclNpemUpIC0gKGNoaWxkcmVuTWFyZ2luUGN0KTtcblxuXHRcdG5ld1BhcmVudFBjdCA9IGNoaWxkcmVuQ291bnQgKiAoY2hpbGRyZW5QY3QgKyAoY2hpbGRyZW5NYXJnaW5QY3QgKiAyKSk7XG5cdFx0bmV3TWFyZ2luUHRjID0gZnVsbFBjdCAqIGNoaWxkcmVuTWFyZ2luUGN0IC8gKGNoaWxkcmVuQ291bnQgKiBjaGlsZHJlblBjdCk7XG5cdFx0bmV3Q2hpbGRyZW5QY3QgPSBmdWxsUGN0IC8gY2hpbGRyZW5Db3VudCAtIChuZXdNYXJnaW5QdGMgKiAyKTtcblxuXHRcdF8kY29udGFpbmVyLmNzcygnd2lkdGgnLCBuZXdQYXJlbnRQY3QgKyAnJScpO1xuXHRcdF8kYWxsQ2hpbGRyZW4uY3NzKHtcblx0XHRcdCd3aWR0aCc6IG5ld0NoaWxkcmVuUGN0ICsgJyUnLFxuXHRcdFx0J21hcmdpbi1sZWZ0JzogbmV3TWFyZ2luUHRjIC8gMiArICclJyxcblx0XHRcdCdtYXJnaW4tcmlnaHQnOiBuZXdNYXJnaW5QdGMgLyAyICsgJyUnXG5cdFx0fSk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNoZWNrU3RhdHVzKGlzQWN0aXZlKSB7XG5cblx0XHRpZiAoY2Fyb3VzZWxJc0FjdGl2ZSAhPT0gaXNBY3RpdmUpIHtcblxuXHRcdFx0Y2Fyb3VzZWxJc0FjdGl2ZSA9IGlzQWN0aXZlO1xuXG5cdFx0XHRjYXJvdXNlbElzQWN0aXZlID8gYWN0aXZhdGUoKSA6IGRlYWN0aXZhdGUoKTtcblx0XHR9XG5cdH1cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCBDYWxjdWxhdGluZyBlbGVtZW50c1xuXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdGZ1bmN0aW9uIGdldFBlcmNlbnRhZ2UoZWxlbWVudFNpemUpIHtcblxuXHRcdHJldHVybiBlbGVtZW50U2l6ZSAvIHBhcmVudFB4ICogZnVsbFBjdDtcblxuXHR9XG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQgQ2Fyb3VzZWwgVXRpbHNcblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblx0ZnVuY3Rpb24gYmluZFN0ZXBzKGRpcmVjdGlvbiwganVtcCkge1xuXHRcdGlmICh0b3RhbE1vdmVzUmlnaHQgPj0gMCkge1xuXG5cdFx0XHR0b3RhbE1vdmVzUmlnaHQgPSBjYWxjdWxhdGVUb3RhbE1vdmVzUmlnaHQoZGlyZWN0aW9uID09PSAncmlnaHQnLCBqdW1wKTtcblxuXHRcdFx0dG90YWxNb3Zlc0xlZnQgPSB0b3RhbE1vdmVzIC0gdG90YWxNb3Zlc1JpZ2h0O1xuXG5cdFx0XHRjdXJyZW50RWxlbWVudEluZGV4ID0gdG90YWxNb3Zlc0xlZnQgKiBtb3Zlc1BlclNpemUgKyAxO1xuXG5cdFx0XHRldmFsdWF0ZUNvbnRyb2xzKCk7XG5cblx0XHRcdGFuaW1hdGUodG90YWxNb3Zlc0xlZnQpO1xuXG5cdFx0XHRfbmF2aWdhdGlvbi5hY3RpdmF0ZURvdChNYXRoLnJvdW5kKGN1cnJlbnRFbGVtZW50SW5kZXgpKTtcblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsTW92ZXNSaWdodCh0LCBqKSB7XG5cdFx0dmFyIHRyO1xuXHRcdGlmICh0ICYmIGo9PT11bmRlZmluZWQpIHtcblx0XHRcdHRyID0gdG90YWxNb3Zlc1JpZ2h0ID49IDEgPyB0b3RhbE1vdmVzUmlnaHQgLSAxIDogdG90YWxNb3Zlc1JpZ2h0IC0gdG90YWxNb3Zlc1JpZ2h0O1xuXHRcdH0gZWxzZSBpZiAoIXQgJiYgaj09PXVuZGVmaW5lZCkge1xuXHRcdFx0dHIgPSB0b3RhbE1vdmVzTGVmdCA+PSAxID8gdG90YWxNb3Zlc1JpZ2h0ICsgMSA6IHRvdGFsTW92ZXNSaWdodCArIHRvdGFsTW92ZXNMZWZ0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0ciA9ICh0b3RhbE1vdmVzIC0gaiA+PSAwKSA/IHRvdGFsTW92ZXMgLSBqIDogMDtcblx0XHR9XG5cdFx0cmV0dXJuIHRyO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXZhbHVhdGVDb250cm9scygpIHtcblxuXHRcdF9hcnJvd1JpZ2h0LnN0YXR1cyh0b3RhbE1vdmVzUmlnaHQgPiAwKTtcblx0XHRfYXJyb3dMZWZ0LnN0YXR1cyh0b3RhbE1vdmVzTGVmdCA+IDApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhbmltYXRlKGRpc3RhbmNlKSB7XG5cblx0XHRUd2VlbkxpdGUudG8oXyRjb250YWluZXIsIEFOSU1BVEVfRFVSQVRJT04sIHtcblx0XHRcdHg6IC0oZGlzdGFuY2UgKiAoKG5ld0NoaWxkcmVuUGN0ICsgbmV3TWFyZ2luUHRjKSAqIG1vdmVzUGVyU2l6ZSkpICsgJyUnLFxuXHRcdFx0ZWFzZTogU2luZS5lYXNlT3V0XG5cdFx0fSk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFjdGl2YXRlKCkge1xuXG5cdFx0X2Fycm93UmlnaHQuYWN0aXZhdGUoKTtcblx0XHRfYXJyb3dMZWZ0LmFjdGl2YXRlKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRlYWN0aXZhdGUoKSB7XG5cblx0XHRyZXNldFN0ZXBzKCk7XG5cdFx0YW5pbWF0ZSgwKTtcblxuXHRcdF9hcnJvd1JpZ2h0LmRlYWN0aXZhdGUoKTtcblx0XHRfYXJyb3dMZWZ0LmRlYWN0aXZhdGUoKTtcblxuXHR9XG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCJcbnZhciBOYXZpZ2F0aW9uID0gZnVuY3Rpb24oIGVsZW1lbnQgKSB7XG5cblx0dmFyIGFjdGl2ZU51bSA9IDA7XG5cblx0ZnVuY3Rpb24gX2NyZWF0ZURvdHMgKGUpIHtcblx0XHRpZiAoZSkge1xuXHRcdFx0ZWxlbWVudC5hcHBlbmQoXCI8bGkgY2xhc3M9J2Nhcm91c2VsX19uYXZpZ2F0aW9uX19kb3QganMtY2Fyb3VzZWxfX2RvdCB1LWlzc3VlX19uYXZpZ2F0aW9uX19ib3JkZXIgdS1pc3N1ZS0tXCIrZStcIic+PC9saT5cIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsZW1lbnQuYXBwZW5kKFwiPGxpIGNsYXNzPSdjYXJvdXNlbF9fbmF2aWdhdGlvbl9fZG90IGpzLWNhcm91c2VsX19kb3QnPjwvbGk+XCIpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIF9hY3RpdmF0ZURvdCAoIGFjdGl2ZUluZGV4ICl7XG5cblx0XHRlbGVtZW50LmZpbmQoJy5qcy1jYXJvdXNlbF9fZG90JykuZXEoYWN0aXZlTnVtIC0gMSkucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXHRcdGVsZW1lbnQuZmluZCgnLmpzLWNhcm91c2VsX19kb3QnKS5lcShhY3RpdmVJbmRleCAtIDEpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcblxuXHRcdGFjdGl2ZU51bSA9IGFjdGl2ZUluZGV4O1xuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGNyZWF0ZURvdHM6IF9jcmVhdGVEb3RzLFxuXHRcdGFjdGl2YXRlRG90OiBfYWN0aXZhdGVEb3RcblxuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5hdmlnYXRpb247XG5cblxuIiwiLy8gUHJvamVjdCBkZXBlbmRlbmNpZXNcbnZhciBldmVudEJ1cyA9IHJlcXVpcmUoJy4uL2NvcmUvZXZlbnRCdXMnKTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLWNvbnRlbnRQcm9ncmVzc0Jhcic7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXHR2YXIgXyRlbDtcblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0SW5pdGlhbGl6YXRpb25cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBpbml0KCAkZWwgKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuQ09OVEVOVF9QUk9HUkVTUywgb25Db250ZW50UHJvZ3Jlc3MpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0RXZlbnQgSGFuZGxpbmdcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBvbkNvbnRlbnRQcm9ncmVzcyhlLCBwcm9ncmVzcykge1xuXG5cdFx0XyRlbC5jc3MoJ3RyYW5zZm9ybScsICdzY2FsZVgoJyArIHByb2dyZXNzICsgJyknKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuXG5cbiIsIi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgZXZlbnRCdXMgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50QnVzJyksXG5cblx0Z2xvYmFsU2VsZWN0b3JzID0gcmVxdWlyZSgnLi4vY29yZS9nbG9iYWxTZWxlY3RvcnMnKSxcblx0XyR3aW5kb3cgPSBnbG9iYWxTZWxlY3RvcnMuJHdpbmRvdyxcblxuXHQvLyBjb25zdGFudHNcblx0SEVBREVSX09GRlNFVCA9IDEyMCxcblx0REVDSU1BTF9ST1VORElORyA9IDEwMDsgLy8gdG8gcm91bmQgdG8gMiBkZWNpbWFsc1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtY29udGVudFByb2dyZXNzJztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cdHZhciBfY29udGVudFNjcm9sbFRvcCA9IDAsXG5cdFx0X2NvbnRlbnRIZWlnaHQgPSAwLFxuXHRcdF9wYWdlU2Nyb2xsVG9wID0gMCxcblx0XHRfY3VycmVudE9mZnNldCA9IDAsXG5cdFx0X2N1cnJlbnRQcm9ncmVzcyA9IDAsXG5cdFx0XyRlbDtcblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0SW5pdGlhbGl6YXRpb25cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBpbml0KCAkZWwgKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuU0NST0xMLCBvblNjcm9sbCk7XG5cdH1cblxuXHRmdW5jdGlvbiBvblNjcm9sbChlLCBzY3JvbGwpIHtcblxuXHRcdF9jb250ZW50U2Nyb2xsVG9wID0gXyRlbC5vZmZzZXQoKS50b3AgLSBIRUFERVJfT0ZGU0VUO1xuXHRcdF9jb250ZW50SGVpZ2h0ID0gXyRlbFswXS5vZmZzZXRIZWlnaHQgLSBfJHdpbmRvdy5oZWlnaHQoKSArIEhFQURFUl9PRkZTRVQ7XG5cblx0XHRfcGFnZVNjcm9sbFRvcCA9IHNjcm9sbC5zY3JvbGxUb3A7XG5cblx0XHRjYWxjdWxhdGVTY3JvbGwoKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgICAgVXRpbHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gY2FsY3VsYXRlU2Nyb2xsKCkge1xuXG5cdFx0dmFyIG5ld09mZnNldCA9IE1hdGgucm91bmQoTWF0aC5taW4oX2NvbnRlbnRIZWlnaHQsIE1hdGgubWF4KDAsIF9wYWdlU2Nyb2xsVG9wIC0gX2NvbnRlbnRTY3JvbGxUb3ApKSksXG5cdFx0XHRuZXdQcm9ncmVzcyA9IG5ld09mZnNldCAvIF9jb250ZW50SGVpZ2h0LFxuXHRcdFx0cm91bmRlZFByb2dyZXNzID0gTWF0aC5yb3VuZChuZXdQcm9ncmVzcyAqIERFQ0lNQUxfUk9VTkRJTkcpIC8gREVDSU1BTF9ST1VORElORztcblxuXHRcdGlmKHJvdW5kZWRQcm9ncmVzcyAhPT0gX2N1cnJlbnRQcm9ncmVzcyB8fCBuZXdPZmZzZXQgIT09IF9jdXJyZW50T2Zmc2V0KSB7XG5cblx0XHRcdF9jdXJyZW50UHJvZ3Jlc3MgPSByb3VuZGVkUHJvZ3Jlc3M7XG5cdFx0XHRfY3VycmVudE9mZnNldCA9IG5ld09mZnNldDtcblxuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5DT05URU5UX1BST0dSRVNTLCBbX2N1cnJlbnRQcm9ncmVzcywgX2N1cnJlbnRPZmZzZXRdKTtcblx0XHR9XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG5cbn07XG5cblxuIiwidmFyIERJU1FVU19TSE9SVE5BTUUgPSAndGhlYXNwZW5pbnN0aXR1dGUnLFxuXHRDTEFTU19JU19BQ1RJVkUgPSAnaXMtYWN0aXZlJztcblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtZGlzcXVzVG9nZ2xlJztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cblx0dmFyIF8kZWwsXG5cdFx0XyRjdGEsXG5cdFx0X2Rpc2N1c0NvbmZpZztcblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRJbml0aWFsaXphdGlvblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHR2YXIgdXJsLFxuXHRcdFx0aWRlbnRpZmllcixcblx0XHRcdHRpdGxlO1xuXG5cdFx0XyRlbCA9ICRlbDtcblx0XHRfJGN0YSA9IF8kZWwuZmluZCgnLmpzLWRpc3F1c1RvZ2dsZV9fY3RhJyk7XG5cblx0XHR1cmwgPSBfJGVsLmRhdGEoJ3VybCcpO1xuXHRcdGlkZW50aWZpZXIgPSBfJGVsLmRhdGEoJ2lkZW50aWZpZXInKTtcblx0XHR0aXRsZSA9IF8kZWwuZGF0YSgndGl0bGUnKTtcblxuXHRcdF9kaXNjdXNDb25maWcgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0dGhpcy5wYWdlLnVybCA9IHVybDtcblx0XHRcdHRoaXMucGFnZS5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcblx0XHRcdHRoaXMucGFnZS50aXRsZSA9IHRpdGxlO1xuXHRcdH07XG5cblx0XHRfJGN0YS5jbGljayhvbkN0YUNsaWNrKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEV2ZW50IEhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uQ3RhQ2xpY2soKSB7XG5cblx0XHRfJGN0YS5vZmYoKTtcblx0XHRfJGVsLmFkZENsYXNzKENMQVNTX0lTX0FDVElWRSk7XG5cblx0XHRpbmplY3RTY3JpcHQoKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEhlbHBlcnNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5qZWN0U2NyaXB0KCkge1xuXG5cdFx0dmFyIHNjcmlwdEZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksXG5cdFx0XHRkYXRlID0gbmV3IERhdGUoKTtcblxuXHRcdHNjcmlwdEZyYW1lLnNyYyA9ICcvLycrIERJU1FVU19TSE9SVE5BTUUgKycuZGlzcXVzLmNvbS9lbWJlZC5qcyc7XG5cblx0XHQvLyBuZWVkcyB0byBiZSBnbG9iYWxseSBhY2Nlc3NpYmxlIHNvIERpc3F1cyBjYW4gZG8gaXRzIG1hZ2ljXG5cdFx0d2luZG93LmRpc3F1c19jb25maWcgPSBfZGlzY3VzQ29uZmlnOy8vZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcblxuXHRcdHNjcmlwdEZyYW1lLnNldEF0dHJpYnV0ZSgnZGF0YS10aW1lc3RhbXAnLCBkYXRlLmdldFRpbWUoKSk7XG5cdFx0KGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQoc2NyaXB0RnJhbWUpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0UHVibGljIE1ldGhvZHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCIvLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xudmFyIGV2ZW50QnVzID0gcmVxdWlyZSgnLi4vLi4vY29yZS9ldmVudEJ1cycpLFxuXHRtYXRjaE1lZGlhID0gcmVxdWlyZSgnLi4vLi4vY29yZS9ldmVudHMvbWF0Y2hNZWRpYScpLFxuXHRndG1EYXRhUHVzaGVyID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvZ3RtRGF0YVB1c2hlcicpLFxuXHRBcnJvdyA9IHJlcXVpcmUoJy4uL2Fycm93JyksXG5cdE5hdmlnYXRpb24gPSByZXF1aXJlKCcuLi9jYXJvdXNlbC9uYXZpZ2F0aW9uJyksXG5cdGpxID0gcmVxdWlyZSgnanF1ZXJ5JyksXG5cblx0Ly8gY29uc3RhbnRzXG5cblx0QUNUSU9OX1NXSVBFID0gJ3N3aXBlJyxcblx0QU5JTUFURV9EVVJBVElPTiA9IDAuNTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiBNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLWZlYXR1cmVkLWV2ZW50cyc7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgSW5pdGlhbGl6ZVxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXHQvLyBOT1RFOiBTaXplcyBhcmUgc2VwYXJ0ZWQgYnkgcHgocGl4ZWxzKSBhbmQgcGN0IChwZXJjZW50YWdlKVxuXG5cdHZhciBmdWxsUGN0ID0gMTAwLFxuXG5cdFx0XyRlbCxcblx0XHRfJGNvbnRhaW5lcixcblx0XHRfJGFsbENoaWxkcmVuLFxuXHRcdF8kcHJldmlvdXMsXG5cdFx0XyRuZXh0LFxuXHRcdF8kbmF2aWdhdGlvbixcblxuXHRcdGNoaWxkcmVuQ291bnQsXG5cdFx0cGFyZW50UHgsXG5cblx0XHRjaGlsZHJlbk1hcmdpblB4LFxuXG5cdFx0Y2hpbGRyZW5QY3QsXG5cdFx0Y2hpbGRyZW5NYXJnaW5QY3QsXG5cblx0XHQvLyBGaW5hbCBFbGVtZW50IFB0Y1xuXG5cdFx0bmV3UGFyZW50UGN0LFxuXHRcdG5ld0NoaWxkcmVuUGN0LFxuXHRcdG5ld01hcmdpblB0YyxcblxuXHRcdC8vIE9wdGlvbnNcblxuXHRcdF9hcnJvd1JpZ2h0LFxuXHRcdF9hcnJvd0xlZnQsXG5cdFx0X25hdmlnYXRpb24sXG5cblxuXHRcdGNhcm91c2VsSXNBY3RpdmUgPSBmYWxzZSxcblx0XHRjb2x1bXNQZXJTaXplLFxuXG5cdFx0Ly8gQ2Fyb3VzZWwgRGF0YVxuXG5cdFx0dG90YWxNb3Zlcyxcblx0XHR0b3RhbE1vdmVzUmlnaHQsXG5cdFx0dG90YWxNb3Zlc0xlZnQsXG5cdFx0cmVzaXplTW92ZXMsXG5cblx0XHRtb3Zlc1BlclNpemUsXG5cblx0XHRjdXJyZW50RWxlbWVudEluZGV4ID0gMTtcblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXG5cdFx0XyRjb250YWluZXIgPSBfJGVsLmZpbmQoJy5qcy1mZWF0dXJlZC1ldmVudHNfX2NvbnRhaW5lcicpO1xuXHRcdF8kYWxsQ2hpbGRyZW4gPSBfJGNvbnRhaW5lci5jaGlsZHJlbigpO1xuXG5cdFx0XyRwcmV2aW91cyA9IF8kZWwuZmluZCgnLmZlYXR1cmVkLWV2ZW50c19fYXJyb3ctLWxlZnQnKTtcblx0XHRfJG5leHQgPSBfJGVsLmZpbmQoJy5mZWF0dXJlZC1ldmVudHNfX2Fycm93LS1yaWdodCcpO1xuXHRcdF8kbmF2aWdhdGlvbiA9IF8kZWwuZmluZCgnLmpzLWNhcm91c2VsX19uYXZpZ2F0aW9uJyk7XG5cblx0XHQvLyBQYXJlbnQgVmFsdWVzXG5cblx0XHRwYXJlbnRQeCA9IF8kY29udGFpbmVyLndpZHRoKCk7XG5cblx0XHQvLyBDaGlsZHJlbiBWYWx1ZXNcblxuXHRcdGNoaWxkcmVuQ291bnQgPSBfJGFsbENoaWxkcmVuLmxlbmd0aDtcblxuXHRcdGNoaWxkcmVuTWFyZ2luUHggPSAocGFyc2VGbG9hdChfJGFsbENoaWxkcmVuLmNzcygnbWFyZ2luLXJpZ2h0JykucmVwbGFjZSgncHgnLCAnJykpICtcblxuXHRcdFx0cGFyc2VGbG9hdChfJGFsbENoaWxkcmVuLmNzcygnbWFyZ2luLWxlZnQnKS5yZXBsYWNlKCdweCcsICcnKSkpO1xuXG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuTUFUQ0hfTUVESUEsIF9yZXNpemUpO1xuXG5cdFx0Ly9cdFx0SW5pdCBBcnJvd3NcblxuXHRcdF9uYXZpZ2F0aW9uID0gbmV3IE5hdmlnYXRpb24oXyRuYXZpZ2F0aW9uKTtcblx0XHRfYXJyb3dSaWdodCA9IG5ldyBBcnJvdyhfJG5leHQsICdyaWdodCcsIGJpbmRTdGVwcyk7XG5cdFx0X2Fycm93TGVmdCA9IG5ldyBBcnJvdyhfJHByZXZpb3VzLCAnbGVmdCcsIGJpbmRTdGVwcyk7XG5cblx0XHRuYXZpZ2F0aW9uU3R5bGUoKTtcblxuXHRcdF8kZWwuaGFtbWVyKCkub24oJ3N3aXBlcmlnaHQnLCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Z3RtRGF0YVB1c2hlcihfJHByZXZpb3VzLmRhdGEoJ2NhdGVnb3J5JyksIEFDVElPTl9TV0lQRSwgXyRwcmV2aW91cy5kYXRhKCdsYWJlbCcpKTtcblx0XHRcdGJpbmRTdGVwcygnbGVmdCcpO1xuXHRcdH0pO1xuXG5cdFx0XyRlbC5oYW1tZXIoKS5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24oKSB7XG5cblx0XHRcdGd0bURhdGFQdXNoZXIoXyRuZXh0LmRhdGEoJ2NhdGVnb3J5JyksIEFDVElPTl9TV0lQRSwgXyRuZXh0LmRhdGEoJ2xhYmVsJykpO1xuXHRcdFx0YmluZFN0ZXBzKCdyaWdodCcpO1xuXHRcdH0pO1xuXG5cdFx0XyRlbC5maW5kKCcuanMtY2Fyb3VzZWxfX2RvdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSBqcSh0aGlzKS5pbmRleCgpO1xuXHRcdFx0YmluZFN0ZXBzKG51bGwsIGkpO1xuXHRcdH0pO1xuXG5cblx0fVxuXG5cdGZ1bmN0aW9uIG5hdmlnYXRpb25TdHlsZSgpIHtcblxuXHRcdGlmIChfJGFsbENoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgaTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBfJGFsbENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRfbmF2aWdhdGlvbi5jcmVhdGVEb3RzKF8kYWxsQ2hpbGRyZW4uZXEoaSkuZGF0YSgnbmF2aWdhdGlvbi1kb3QtY29sb3InKSk7XG5cdFx0fVxuXG5cdFx0X25hdmlnYXRpb24uYWN0aXZhdGVEb3QoMSk7XG5cdH1cblxuXG5cdGZ1bmN0aW9uIF9yZXNpemUoZSwgcmVzaXplKSB7XG5cblx0XHRpZiAocmVzaXplID49IG1hdGNoTWVkaWEuTEFSR0VfV0lORE9XKSB7XG5cblx0XHRcdG1vdmVzUGVyU2l6ZSA9IDI7XG5cdFx0XHRjb2x1bXNQZXJTaXplID0gMztcblxuXHRcdH0gZWxzZSBpZiAocmVzaXplID09PSBtYXRjaE1lZGlhLk1FRElVTV9XSU5ET1cpIHtcblxuXHRcdFx0bW92ZXNQZXJTaXplID0gMjtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAyO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxLjE7XG5cdFx0fVxuXG5cdFx0c3R5bGVDb2x1bW5zKCk7XG5cblx0XHRpZiAoY2hpbGRyZW5Db3VudCA+IGNvbHVtc1BlclNpemUpIHtcblxuXHRcdFx0cmVzZXRTdGVwcygpO1xuXHRcdFx0Y2hlY2tTdGF0dXModHJ1ZSk7XG5cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNoZWNrU3RhdHVzKGZhbHNlKTtcblxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc2V0U3RlcHMoKSB7XG5cblx0XHR0b3RhbE1vdmVzID0gKChjaGlsZHJlbkNvdW50IC8gbW92ZXNQZXJTaXplKSAtIDEpIC0gKChjb2x1bXNQZXJTaXplIC8gbW92ZXNQZXJTaXplKSAtIDEpO1xuXG5cdFx0cmVzaXplTW92ZXMgPSAoY3VycmVudEVsZW1lbnRJbmRleCAtIDEpIC8gbW92ZXNQZXJTaXplO1xuXG5cdFx0dG90YWxNb3Zlc0xlZnQgPSByZXNpemVNb3ZlcyA+IHRvdGFsTW92ZXMgPyB0b3RhbE1vdmVzIDogcmVzaXplTW92ZXM7XG5cblx0XHR0b3RhbE1vdmVzUmlnaHQgPSB0b3RhbE1vdmVzIC0gdG90YWxNb3Zlc0xlZnQ7XG5cblx0XHRldmFsdWF0ZUNvbnRyb2xzKCk7XG5cdFx0YW5pbWF0ZSh0b3RhbE1vdmVzTGVmdCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN0eWxlQ29sdW1ucygpIHtcblxuXHRcdGNoaWxkcmVuTWFyZ2luUGN0ID0gZ2V0UGVyY2VudGFnZShjaGlsZHJlbk1hcmdpblB4KTtcblx0XHRjaGlsZHJlblBjdCA9IChmdWxsUGN0IC8gY29sdW1zUGVyU2l6ZSkgLSAoY2hpbGRyZW5NYXJnaW5QY3QpO1xuXG5cdFx0bmV3UGFyZW50UGN0ID0gY2hpbGRyZW5Db3VudCAqIChjaGlsZHJlblBjdCArIChjaGlsZHJlbk1hcmdpblBjdCAqIDIpKTtcblx0XHRuZXdNYXJnaW5QdGMgPSBmdWxsUGN0ICogY2hpbGRyZW5NYXJnaW5QY3QgLyAoY2hpbGRyZW5Db3VudCAqIGNoaWxkcmVuUGN0KTtcblx0XHRuZXdDaGlsZHJlblBjdCA9IGZ1bGxQY3QgLyBjaGlsZHJlbkNvdW50IC0gKG5ld01hcmdpblB0YyAqIDIpO1xuXG5cdFx0XyRjb250YWluZXIuY3NzKCd3aWR0aCcsIG5ld1BhcmVudFBjdCArICclJyk7XG5cdFx0XyRhbGxDaGlsZHJlbi5jc3Moe1xuXHRcdFx0J3dpZHRoJzogbmV3Q2hpbGRyZW5QY3QgKyAnJScsXG5cdFx0XHQnbWFyZ2luJzogbmV3TWFyZ2luUHRjIC8gMiArICclJ1xuXHRcdH0pO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjaGVja1N0YXR1cyhpc0FjdGl2ZSkge1xuXG5cdFx0aWYgKGNhcm91c2VsSXNBY3RpdmUgIT09IGlzQWN0aXZlKSB7XG5cblx0XHRcdGNhcm91c2VsSXNBY3RpdmUgPSBpc0FjdGl2ZTtcblxuXHRcdFx0Y2Fyb3VzZWxJc0FjdGl2ZSA/IGFjdGl2YXRlKCkgOiBkZWFjdGl2YXRlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQgQ2FsY3VsYXRpbmcgZWxlbWVudHNcblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXHRmdW5jdGlvbiBnZXRQZXJjZW50YWdlKGVsZW1lbnRTaXplKSB7XG5cblx0XHRyZXR1cm4gZWxlbWVudFNpemUgLyBwYXJlbnRQeCAqIGZ1bGxQY3Q7XG5cblx0fVxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0IENhcm91c2VsIFV0aWxzXG5cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblx0ZnVuY3Rpb24gYmluZFN0ZXBzKGRpcmVjdGlvbiwganVtcCkge1xuXHRcdGlmICh0b3RhbE1vdmVzUmlnaHQgPj0gMCkge1xuXG5cdFx0XHR0b3RhbE1vdmVzUmlnaHQgPSBjYWxjdWxhdGVUb3RhbE1vdmVzUmlnaHQoZGlyZWN0aW9uID09PSAncmlnaHQnLCBqdW1wKTtcblxuXHRcdFx0dG90YWxNb3Zlc0xlZnQgPSB0b3RhbE1vdmVzIC0gdG90YWxNb3Zlc1JpZ2h0O1xuXG5cdFx0XHRjdXJyZW50RWxlbWVudEluZGV4ID0gdG90YWxNb3Zlc0xlZnQgKiBtb3Zlc1BlclNpemUgKyAxO1xuXG5cdFx0XHRldmFsdWF0ZUNvbnRyb2xzKCk7XG5cblx0XHRcdGFuaW1hdGUodG90YWxNb3Zlc0xlZnQpO1xuXG5cdFx0XHRfbmF2aWdhdGlvbi5hY3RpdmF0ZURvdChNYXRoLnJvdW5kKGN1cnJlbnRFbGVtZW50SW5kZXgpKTtcblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsTW92ZXNSaWdodCh0LCBqKSB7XG5cdFx0dmFyIHRyO1xuXHRcdGlmICh0ICYmIGo9PT11bmRlZmluZWQpIHtcblx0XHRcdHRyID0gdG90YWxNb3Zlc1JpZ2h0ID49IDEgPyB0b3RhbE1vdmVzUmlnaHQgLSAxIDogdG90YWxNb3Zlc1JpZ2h0IC0gdG90YWxNb3Zlc1JpZ2h0O1xuXHRcdH0gZWxzZSBpZiAoIXQgJiYgaj09PXVuZGVmaW5lZCkge1xuXHRcdFx0dHIgPSB0b3RhbE1vdmVzTGVmdCA+PSAxID8gdG90YWxNb3Zlc1JpZ2h0ICsgMSA6IHRvdGFsTW92ZXNSaWdodCArIHRvdGFsTW92ZXNMZWZ0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0ciA9ICh0b3RhbE1vdmVzIC0gaiA+PSAwKSA/IHRvdGFsTW92ZXMgLSBqIDogMDtcblx0XHR9XG5cdFx0cmV0dXJuIHRyO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXZhbHVhdGVDb250cm9scygpIHtcblxuXHRcdF9hcnJvd1JpZ2h0LnN0YXR1cyh0b3RhbE1vdmVzUmlnaHQgPiAwKTtcblx0XHRfYXJyb3dMZWZ0LnN0YXR1cyh0b3RhbE1vdmVzTGVmdCA+IDApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhbmltYXRlKGRpc3RhbmNlKSB7XG5cblx0XHRUd2VlbkxpdGUudG8oXyRjb250YWluZXIsIEFOSU1BVEVfRFVSQVRJT04sIHtcblx0XHRcdHg6IC0oZGlzdGFuY2UgKiAoKG5ld0NoaWxkcmVuUGN0ICsgbmV3TWFyZ2luUHRjKSAqIG1vdmVzUGVyU2l6ZSkpICsgJyUnLFxuXHRcdFx0ZWFzZTogQ3ViaWMuZWFzZU91dFxuXHRcdH0pO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhY3RpdmF0ZSgpIHtcblxuXHRcdF9hcnJvd1JpZ2h0LmFjdGl2YXRlKCk7XG5cdFx0X2Fycm93TGVmdC5hY3RpdmF0ZSgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkZWFjdGl2YXRlKCkge1xuXG5cdFx0cmVzZXRTdGVwcygpO1xuXHRcdF9hcnJvd1JpZ2h0LmRlYWN0aXZhdGUoKTtcblx0XHRfYXJyb3dMZWZ0LmRlYWN0aXZhdGUoKTtcblxuXHR9XG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCJ2YXIgTUFYX0hFSUdIVCA9IDUwMCxcblx0Q0xBU1NfSVNfRkFERUQgPSAnaXMtZmFkZWQnO1xuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1mYWRpbmdUZXh0JztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cdHZhciBfJGVsLFxuXHRcdF8kd3JhcHBlcixcblx0XHRfJGJ1dHRvbjtcblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXHRcdF8kd3JhcHBlciA9IF8kZWwuZmluZCgnLmpzLWZhZGluZ1RleHRfX3dyYXBwZXInKTtcblx0XHRfJGJ1dHRvbiA9IF8kZWwuZmluZCgnLmpzLWZhZGluZ1RleHRfX2J1dHRvbicpO1xuXG5cdFx0aWYoXyR3cmFwcGVyLmhlaWdodCgpID49IE1BWF9IRUlHSFQpIHtcblxuXHRcdFx0XyRlbC5hZGRDbGFzcyhDTEFTU19JU19GQURFRCk7XG5cdFx0XHRfJGJ1dHRvbi5jbGljayhleHBhbmRCbG9jayk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gZXhwYW5kQmxvY2soKSB7XG5cblx0XHRfJGVsLnJlbW92ZUNsYXNzKENMQVNTX0lTX0ZBREVEKTtcblx0fVxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG5cbn07XG5cblxuXG4iLCIvLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xudmFyIGV2ZW50QnVzID0gcmVxdWlyZSgnLi4vLi4vY29yZS9ldmVudEJ1cycpO1xuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiBNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtY2xlYXJGaWx0ZXInO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblxuXHR2YXIgXyRlbCxcblx0XHRfZmlsdGVyVHlwZSxcblx0XHRfZmlsdGVySWQ7XG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEluaXRpYWxpemF0aW9uXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0X2ZpbHRlclR5cGUgPSBfJGVsLmRhdGEoJ2ZpbHRlci10eXBlJyk7XG5cdFx0X2ZpbHRlcklkID0gXyRlbC5kYXRhKCdmaWx0ZXItaWQnKTtcblxuXHRcdF8kZWwuY2xpY2sob25DbGljayk7XG5cblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5GSUxURVJfUkVRVUVTVCwgb25GaWx0ZXJSZXF1ZXN0KTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEV2ZW50IGhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gb25GaWx0ZXJSZXF1ZXN0KCkge1xuXG5cdFx0ZXZlbnRCdXMub2ZmKGV2ZW50QnVzLkZJTFRFUl9SRVFVRVNULCBvbkZpbHRlclJlcXVlc3QpO1xuXHRcdF8kZWwub2ZmKCk7XG5cblx0XHRfZmlsdGVyVHlwZSA9IG51bGw7XG5cdFx0XyRlbCA9IG51bGw7XG5cdH1cblxuXHRmdW5jdGlvbiBvbkNsaWNrKGUpIHtcblxuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdF8kZWwucGFyZW50KCkucmVtb3ZlKCk7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkZJTFRFUl9DTEVBUl9GSUVMRCwgW19maWx0ZXJUeXBlLCBfZmlsdGVySWRdKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwiLy8gUHJvamVjdCBkZXBlbmRlbmNpZXNcbnZhciBmaWx0ZXIgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2ZpbHRlcicpO1xuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0TW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLWZpbHRlckFuY2hvcic7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXG5cdHZhciBfJGVsLFxuXHRcdF9maWx0ZXJVcmw7XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCAgICBJbml0aWFsaXphdGlvblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXHRcdF9maWx0ZXJVcmwgPSBfJGVsLmF0dHIoJ2hyZWYnKTtcblxuXHRcdF8kZWwuY2xpY2sob25DbGljayk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIEV2ZW50IGhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gb25DbGljayhlKSB7XG5cblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRmaWx0ZXIubG9hZChfZmlsdGVyVXJsKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgICAgUHVibGljIE1ldGhvZHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCIvLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xudmFyICQgPSByZXF1aXJlKCdqcXVlcnknKSxcblx0bW9kdWxlRmFjdG9yeSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvbW9kdWxlRmFjdG9yeScpLFxuXHRMb2FkZXIgPSByZXF1aXJlKCcuLi8uLi91dGlscy9Mb2FkZXInKSxcblx0cGFyc2VMb2FkZWRSZXNwb25zZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL3BhcnNlTG9hZGVkUmVzcG9uc2UnKSxcblx0ZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cblx0Ly8gY29uc3RhbnRzXG5cdFNFTEVDVE9SX0NPTlRFTlQgPSAnLmpzLWZpbHRlckNvbnRlbnQnLFxuXHRTRUxFQ1RPUl9MT0FERVIgPSAnLmpzLWZpbHRlckNvbnRlbnRfX2xvYWRlcicsXG5cdENMQVNTX0lTX0ZJTFRFUklORyA9ICdpcy1maWx0ZXJpbmcnO1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gTW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSBTRUxFQ1RPUl9DT05URU5UO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblxuXHR2YXIgXyRlbCxcblx0XHRfbG9hZGVyO1xuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRJbml0aWFsaXphdGlvblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHR2YXIgJGxvYWRlciA9ICQoU0VMRUNUT1JfTE9BREVSKTtcblxuXHRcdGlmKCEkbG9hZGVyLmxlbmd0aCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcignYCcgKyBTRUxFQ1RPUl9DT05URU5UICsgJ2AgbW9kdWxlIG5lZWRzIGEgYCcgKyBTRUxFQ1RPUl9MT0FERVIgKyAnYCB0byBzaG93IGEgbG9hZGluZyBhbmltYXRpb24uJyk7XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0X2xvYWRlciA9IG5ldyBMb2FkZXIoKTtcblx0XHRfbG9hZGVyLmluaXQoJGxvYWRlcik7XG5cblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5GSUxURVJfUkVRVUVTVCwgb25GaWx0ZXJSZXF1ZXN0KTtcblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5GSUxURVJfUkVBRFksIG9uRmlsdGVyUmVhZHkpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0RXZlbnQgaGFuZGxpbmdcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblx0ZnVuY3Rpb24gb25GaWx0ZXJSZXF1ZXN0KCkge1xuXG5cdFx0XyRlbC5hZGRDbGFzcyhDTEFTU19JU19GSUxURVJJTkcpO1xuXHRcdFR3ZWVuTGl0ZS5kZWxheWVkQ2FsbCgwLjEsIF9sb2FkZXIuc2hvdywgdW5kZWZpbmVkLCBfbG9hZGVyKTsvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuXHR9XG5cblx0ZnVuY3Rpb24gb25GaWx0ZXJSZWFkeShlLCByZXNwb25zZSkge1xuXG5cdFx0dmFyIHBhcnNlZFJlc3BvbnNlID0gcGFyc2VMb2FkZWRSZXNwb25zZShyZXNwb25zZSwgU0VMRUNUT1JfQ09OVEVOVCk7XG5cblx0XHRfbG9hZGVyLmhpZGUoKVxuXHRcdFx0LnRoZW4oX2xvYWRlci5kaXNwb3NlKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKXtcblxuXHRcdFx0XHRfJGVsLmh0bWwocGFyc2VkUmVzcG9uc2UpO1xuXG5cdFx0XHRcdF9sb2FkZXIuaW5pdCgkKFNFTEVDVE9SX0xPQURFUikpO1xuXG5cdFx0XHRcdF8kZWwucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfRklMVEVSSU5HKTtcblxuXHRcdFx0XHRtb2R1bGVGYWN0b3J5LnJ1bihfJGVsKTtcblx0XHRcdH0pO1xuXG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRQdWJsaWMgTWV0aG9kc1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsIi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgZ2V0VXJsUGFyYW1ldGVyID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvZ2V0VXJsUGFyYW1ldGVyJyksXG5cbi8vIGNvbnN0YW50c1xuXHRDTEFTU19JU19ESVNBQkxFRCA9ICdpcy1kaXNhYmxlZCcsXG5cblx0U0VMRUNUT1JfU0VMRUNUX0NPTlRBSU5FUiA9ICcuanMtZmlsdGVyRXZlbnREcm9wZG93bnNfX2NvbnRhaW5lcicsXG5cdFNFTEVDVE9SX0NPVU5UUklFUyA9ICcuanMtZmlsdGVyRXZlbnREcm9wZG93bnNfX2NvdW50cmllcycsXG5cdC8vIFNFTEVDVE9SX0xPQ0FUSU9OUyA9ICcuanMtZmlsdGVyRXZlbnREcm9wZG93bnNfX2xvY2F0aW9ucycsXG5cdFNFTEVDVE9SX0NJVFlfREFUQSA9ICcuanMtZmlsdGVyRXZlbnREcm9wZG93bnNfX2NpdGllc0RhdGEnLFxuXHRTRUxFQ1RPUl9DSVRJRVMgPSAnLmpzLWZpbHRlckV2ZW50RHJvcGRvd25zX19jaXRpZXMnO1xuXG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtZmlsdGVyRXZlbnREcm9wZG93bnMnO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblxuXHR2YXIgXyRwYXJlbnQsXG5cdFx0XyRjb3VudHJpZXMsXG5cdFx0XyRjaXRpZXMsXG5cdFx0X2NpdHlEYXRhO1xuXHRcdC8vIF8kbG9jYXRpb25zO1xuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEluaXRpYWxpemF0aW9uXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdHZhciAkY2l0eURhdGE7XG5cblx0XHRfJHBhcmVudCA9ICRlbDtcblxuXHRcdF8kY291bnRyaWVzID0gXyRwYXJlbnQuZmluZChTRUxFQ1RPUl9DT1VOVFJJRVMpO1xuXHRcdF8kY2l0aWVzID0gXyRwYXJlbnQuZmluZChTRUxFQ1RPUl9DSVRJRVMpO1xuXHRcdC8vIF8kbG9jYXRpb25zID0gXyRwYXJlbnQuZmluZChTRUxFQ1RPUl9MT0NBVElPTlMpO1xuXHRcdF8kY291bnRyaWVzLmNoYW5nZShvbkNvdW50cnlDaGFuZ2UpO1xuXG5cdFx0JGNpdHlEYXRhID0gXyRwYXJlbnQuZmluZChTRUxFQ1RPUl9DSVRZX0RBVEEpO1xuXHRcdF9jaXR5RGF0YSA9IEpTT04ucGFyc2UoJGNpdHlEYXRhLmh0bWwoKSk7XG5cblx0XHR1cGRhdGVDaXRpZXMoZ2V0VXJsUGFyYW1ldGVyKCdjaXR5JykpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0RXZlbnQgaGFuZGxpbmdcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBvbkNvdW50cnlDaGFuZ2UoKSB7XG5cblx0XHR1cGRhdGVDaXRpZXMoKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEhlbHBlcnNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBjcmVhdGVPcHRpb25zSW5TZWxlY3Qob3B0aW9ucywgaW5pdGlhbFZhbHVlLCAkc2VsZWN0KSB7XG5cblx0XHR2YXIgJHNlbGVjdENvbnRhaW5lciA9ICRzZWxlY3QuY2xvc2VzdChTRUxFQ1RPUl9TRUxFQ1RfQ09OVEFJTkVSKSxcblx0XHRcdGluaXRpYWxPcHRpb24gPSBjb21wb3NlT3B0aW9uRWwoJycsICRzZWxlY3QuZGF0YSgnaW5pdGlhbC1sYWJlbCcpKSxcblx0XHRcdGlzRGlzYWJsZWQgPSBvcHRpb25zLmxlbmd0aCA9PT0gMCxcblx0XHRcdG9wdGlvbnNNYXJrdXAgPSBpbml0aWFsT3B0aW9uLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRpc1NlbGVjdGVkLFxuXHRcdFx0b3B0aW9uRGF0YTtcblxuXHRcdGZvcihpOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRvcHRpb25EYXRhID0gb3B0aW9uc1tpXTtcblx0XHRcdGlzU2VsZWN0ZWQgPSBpbml0aWFsVmFsdWUgPT09IG9wdGlvbkRhdGEuaWQ7XG5cdFx0XHRvcHRpb25zTWFya3VwICs9IGNvbXBvc2VPcHRpb25FbChvcHRpb25EYXRhLmlkLCBvcHRpb25EYXRhLmxhYmVsLCBpc1NlbGVjdGVkKTtcblx0XHR9XG5cblxuXHRcdGlmKGlzRGlzYWJsZWQpIHtcblxuXHRcdFx0JHNlbGVjdENvbnRhaW5lci5hZGRDbGFzcyhDTEFTU19JU19ESVNBQkxFRCk7XG5cdFx0XHQkc2VsZWN0LmF0dHIoJ2Rpc2FibGVkJywgJycpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0JHNlbGVjdENvbnRhaW5lci5yZW1vdmVDbGFzcyhDTEFTU19JU19ESVNBQkxFRCk7XG5cdFx0XHQkc2VsZWN0LnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG5cdFx0fVxuXHRcdCRzZWxlY3QuaHRtbChvcHRpb25zTWFya3VwKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUNpdGllcyhpbml0aWFsVmFsdWUpIHtcblxuXHRcdHZhciBjb3VudHJ5VmFsdWUgPSBfJGNvdW50cmllcy52YWwoKSxcblx0XHRcdGNpdGllcztcblxuXHRcdGlmKGNvdW50cnlWYWx1ZSA9PT0gJycpIHtcblxuXHRcdFx0Y2l0aWVzID0gW107XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjaXRpZXMgPSBfY2l0eURhdGFbY291bnRyeVZhbHVlXTtcblx0XHR9XG5cblx0XHRjcmVhdGVPcHRpb25zSW5TZWxlY3QoY2l0aWVzLCBpbml0aWFsVmFsdWUsIF8kY2l0aWVzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBvc2VPcHRpb25FbCh2YWx1ZSwgbGFiZWwsIGlzU2VsZWN0ZWQpIHtcblxuXHRcdHZhciBzZWxlY3RlZCA9IGlzU2VsZWN0ZWQgPyAnc2VsZWN0ZWQnIDogJyc7XG5cblx0XHRyZXR1cm4gJzxvcHRpb24gdmFsdWU9XCInICsgdmFsdWUgKyAnXCIgJyArIHNlbGVjdGVkICsgJz4nICsgbGFiZWwgKyAnPC9vcHRpb24+Jztcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwiLy8gUHJvamVjdCBkZXBlbmRlbmNpZXNcbnZhciAkID0gcmVxdWlyZSgnanF1ZXJ5JyksXG5cdGZpbHRlclJhZGlvQ2hlY2tib3ggPSByZXF1aXJlKCcuL2ZpbHRlclJhZGlvQ2hlY2tib3gnKSxcblx0ZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cdGZpbHRlciA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvZmlsdGVyJyksXG5cdGdldFVSTFBhcmFtZXRlciA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2dldFVybFBhcmFtZXRlcicpLFxuXHRndG1EYXRhUHVzaGVyID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvZ3RtRGF0YVB1c2hlcicpLFxuXG5cdC8vIGNvbnN0YW50c1xuXHRTRUxFQ1RPUl9JTlBVVCA9ICcuanMtZmlsdGVyRm9ybV9faW5wdXQnLFxuXG5cdFRZUEVfU0VMRUNUID0gJ3NlbGVjdCcsXG5cdFRZUEVfREFURSA9ICdkYXRlJyxcblx0VFlQRV9SQURJT0NIRUNLID0gJ3JhZGlvY2hlY2snO1xuXG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLWZpbHRlckV2ZW50c0Zvcm0nO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblxuXHR2YXIgXyRlbCxcblx0XHRfJGlucHV0cyxcblx0XHRfbGFzdFNlbGVjdDtcblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIEluaXRpYWxpemF0aW9uXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0XyRpbnB1dHMgPSBfJGVsLmZpbmQoU0VMRUNUT1JfSU5QVVQpO1xuXHRcdF8kaW5wdXRzLmVhY2gocHJlRmlsbElucHV0cyk7XG5cblx0XHRfJGVsLnN1Ym1pdChvblN1Ym1pdCk7XG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuRklMVEVSX0NMRUFSX0ZJRUxELCBvbkNsZWFyRmllbGQpO1xuXHRcdC8qIGVzbGludC1kaXNhYmxlICovXG5cblx0XHRpZiAoL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL2pRdWVyeSBoZXJlIGlzIHRoZSBvbGRlciB2ZXJzaW9uIG9mIGpRdWVyeSBzaGlwcGVkIHdpdGggd29yZHByZXNzIHRoYXQgY29udGFpbnMgalF1ZXJ5IFVJXG5cdFx0XHRqUXVlcnkoJy5maWx0ZXJfX2lucHV0LS1kYXRlJykuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0dGhpcy50eXBlID0gJ3RleHQnO1xuXHRcdFx0XHRpZiAoalF1ZXJ5KHRoaXMpLnZhbCgpICE9PSAnJykge1xuXHRcdFx0XHRcdHZhciBkID0gbmV3IERhdGUoalF1ZXJ5KHRoaXMpLnZhbCgpKVxuXHRcdFx0XHRcdGQgPSBqUXVlcnkuZGF0ZXBpY2tlci5mb3JtYXREYXRlKGpRdWVyeSh0aGlzKS5kYXRhKCdmb3JtYXQnKSwgbmV3IERhdGUoZC5nZXRUaW1lKCkgKyBuZXcgRGF0ZShkKS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDApKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0XHRcdFx0dGhpcy52YWx1ZSA9IGQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0alF1ZXJ5KCcuZmlsdGVyX19pbnB1dC0tc2VsZWN0Jykuc2VsZWN0bWVudSgpO1xuXHRcdFx0XyRkYXRlUGlja2VyID0galF1ZXJ5KCcuZGF0ZXBpY2tlci1jb250YWluZXInKTtcblx0XHRcdF8kc3RhcnREYXRlID0galF1ZXJ5KCdpbnB1dFtuYW1lPXN0YXJ0ZGF0ZV0nKTtcblx0XHRcdF8kZW5kRGF0ZSA9IGpRdWVyeSgnaW5wdXRbbmFtZT1lbmRkYXRlXScpO1xuXHRcdFx0X2NsZWFyRGF0ZXMgPSBfJGVsLmZpbmQoJy5qcy1jbGVhckRhdGVzJyk7XG5cdFx0XHRfJGRhdGVQaWNrZXIuZGF0ZXBpY2tlcih7XG5cdFx0XHRcdGRhdGVGb3JtYXQ6ICdtbS9kZC95Jyxcblx0XHRcdFx0ZGF5TmFtZXNNaW46IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXG5cdFx0XHRcdGFwcGVuZFRleHQ6ICcobW0vZGQveXl5eSknLFxuXHRcdFx0XHRzaG93T3RoZXJNb250aHM6IHRydWUsXG5cdFx0XHRcdHNlbGVjdE90aGVyTW9udGhzOiB0cnVlLFxuXHRcdFx0XHRmaXJzdERheTogMCxcblx0XHRcdFx0ZGVmYXVsdERhdGU6ICcwJyxcblx0XHRcdFx0YmVmb3JlU2hvd0RheTogZnVuY3Rpb24oZGF0ZSkge1xuXHRcdFx0XHRcdHZhciBkYXRlMSA9IGpRdWVyeS5kYXRlcGlja2VyLnBhcnNlRGF0ZShfJGRhdGVQaWNrZXIuZGF0ZXBpY2tlcignb3B0aW9uJywgJ2RhdGVGb3JtYXQnKSwgXyRzdGFydERhdGUudmFsKCkpO1xuXHRcdFx0XHRcdHZhciBkYXRlMiA9IGpRdWVyeS5kYXRlcGlja2VyLnBhcnNlRGF0ZShfJGRhdGVQaWNrZXIuZGF0ZXBpY2tlcignb3B0aW9uJywgJ2RhdGVGb3JtYXQnKSwgXyRlbmREYXRlLnZhbCgpKTtcblxuXHRcdFx0XHRcdHZhciBpc0hpZ2hsaWdodCA9XG5cdFx0XHRcdFx0XHRkYXRlMSAmJiAoKGRhdGUyICYmIGRhdGUgPiBkYXRlMSAmJiBkYXRlIDwgZGF0ZTIpKTtcblx0XHRcdFx0XHR2YXIgaXNTZWxlY3QgPSBkYXRlMSAmJiAoKGRhdGUuZ2V0VGltZSgpID09IGRhdGUxLmdldFRpbWUoKSkgfHwgKGRhdGUyICYmIGRhdGUgPj0gZGF0ZTEgJiYgZGF0ZSA8PSBkYXRlMikpO1xuXHRcdFx0XHRcdHJldHVybiBbdHJ1ZSwgaXNIaWdobGlnaHQgPyAnZHAtaGlnaGxpZ2h0JyA6IChpc1NlbGVjdCA/ICdkcC1zZWxlY3QnIDogJycpXTtcblx0XHRcdFx0fSxcblx0XHRcdFx0b25TZWxlY3Q6IGZ1bmN0aW9uKGRhdGVUZXh0LCBpbnN0KSB7XG5cdFx0XHRcdFx0dmFyIGRhdGUxID0galF1ZXJ5LmRhdGVwaWNrZXIucGFyc2VEYXRlKF8kZGF0ZVBpY2tlci5kYXRlcGlja2VyKCdvcHRpb24nLCAnZGF0ZUZvcm1hdCcpLCBfJHN0YXJ0RGF0ZS52YWwoKSk7XG5cdFx0XHRcdFx0dmFyIGRhdGUyID0galF1ZXJ5LmRhdGVwaWNrZXIucGFyc2VEYXRlKF8kZGF0ZVBpY2tlci5kYXRlcGlja2VyKCdvcHRpb24nLCAnZGF0ZUZvcm1hdCcpLCBfJGVuZERhdGUudmFsKCkpO1xuXHRcdFx0XHRcdHZhciBzZWxlY3RlZERhdGUgPSBqUXVlcnkuZGF0ZXBpY2tlci5wYXJzZURhdGUoXyRkYXRlUGlja2VyLmRhdGVwaWNrZXIoJ29wdGlvbicsICdkYXRlRm9ybWF0JyksIGRhdGVUZXh0KTtcblxuXHRcdFx0XHRcdGlmIChfbGFzdFNlbGVjdCAmJiBfbGFzdFNlbGVjdC5oYXNDbGFzcygnanMtc3RhcnRfX2RhdGUnKSkge1xuXHRcdFx0XHRcdFx0XyRzdGFydERhdGUudmFsKGRhdGVUZXh0KTtcblx0XHRcdFx0XHRcdGpRdWVyeSh0aGlzKS5kYXRlcGlja2VyKCk7XG5cdFx0XHRcdFx0XHRfJGRhdGVQaWNrZXIuaGlkZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc2VsZWN0ZWREYXRlIDwgZGF0ZTEpIHtcblx0XHRcdFx0XHRcdF8kZW5kRGF0ZS52YWwoXyRzdGFydERhdGUudmFsKCkpO1xuXHRcdFx0XHRcdFx0XyRzdGFydERhdGUudmFsKGRhdGVUZXh0KTtcblx0XHRcdFx0XHRcdGpRdWVyeSh0aGlzKS5kYXRlcGlja2VyKCk7XG5cdFx0XHRcdFx0XHRfJGRhdGVQaWNrZXIuaGlkZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRfJGVuZERhdGUudmFsKGRhdGVUZXh0KTtcblx0XHRcdFx0XHRcdGpRdWVyeSh0aGlzKS5kYXRlcGlja2VyKCk7XG5cdFx0XHRcdFx0XHRfJGRhdGVQaWNrZXIuaGlkZSgpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdF9sYXN0U2VsZWN0LmFkZENsYXNzKCdkYXRlLXNldCcpXG5cblx0XHRcdFx0XHQvLyBfJGRhdGVQaWNrZXIuYWRkQ2xhc3MoJ2RhdGUtc2V0JylcblxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdF8kZGF0ZVBpY2tlci5oaWRlKCk7XG5cdFx0XHRfJHN0YXJ0RGF0ZS5vbignZm9jdXMnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0X2xhc3RTZWxlY3QgPSBqUXVlcnkodGhpcyk7XG5cdFx0XHRcdGlmIChfJGRhdGVQaWNrZXIuaXMoJzpoaWRkZW4nKSkge1xuXHRcdFx0XHRcdF8kZGF0ZVBpY2tlci5zaG93KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0XyRlbmREYXRlLm9uKCdmb2N1cycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRfbGFzdFNlbGVjdCA9IGpRdWVyeSh0aGlzKTtcblx0XHRcdFx0aWYgKF8kZGF0ZVBpY2tlci5pcygnOmhpZGRlbicpKSB7XG5cdFx0XHRcdFx0XyRkYXRlUGlja2VyLnNob3coKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRfY2xlYXJEYXRlcy5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0X2xhc3RTZWxlY3QgPSBudWxsO1xuXHRcdFx0XHRqUXVlcnkodGhpcykuc2libGluZ3MoJ2lucHV0JykucmVtb3ZlQ2xhc3MoXCJkYXRlLXNldFwiKS52YWwoJycpXG5cdFx0XHRcdF8kZGF0ZVBpY2tlci5kYXRlcGlja2VyKFwicmVmcmVzaFwiKTtcblxuXHRcdFx0fSk7XG5cblx0XHRcdGpRdWVyeSgnLmZpbHRlcl9faW5wdXQtLXNlbGVjdCcpLnNlbGVjdG1lbnUoJ3JlZnJlc2gnKVxuXHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlICovXG5cdFx0fVxuXG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIEV2ZW50IGhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gb25TdWJtaXQoZSkge1xuXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGZpbHRlckNvbnRlbnQoKTtcblx0fVxuXG5cblx0ZnVuY3Rpb24gb25DbGVhckZpZWxkKGUsIGZpbHRlck5hbWUsIGZpbHRlcklkKSB7XG5cblxuXHRcdHZhciAkaW5wdXQsXG5cdFx0XHRuYW1lLFxuXHRcdFx0dHlwZSxcblx0XHRcdG11bHRpRmlsdGVyID0gZmlsdGVyTmFtZS5zcGxpdCgnLCcpLFxuXHRcdFx0aXNNdWx0aUZpbHRlciA9IG11bHRpRmlsdGVyLmxlbmd0aCA+IDEsXG5cdFx0XHRpID0gMCxcblx0XHRcdGlzQ2xlYXJlZCA9IGZhbHNlLFxuXHRcdFx0ajtcblxuXHRcdGZvciAoaTsgaSA8IF8kaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdCRpbnB1dCA9ICQoXyRpbnB1dHNbaV0pO1xuXHRcdFx0bmFtZSA9ICRpbnB1dC5hdHRyKCduYW1lJyk7XG5cblx0XHRcdGlmIChpc011bHRpRmlsdGVyKSB7XG5cblx0XHRcdFx0Zm9yIChqID0gMDsgaiA8IG11bHRpRmlsdGVyLmxlbmd0aDsgaisrKSB7XG5cblx0XHRcdFx0XHRjbGVhckZpbHRlck5hbWUobXVsdGlGaWx0ZXJbal0sIG5hbWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y2xlYXJGaWx0ZXJOYW1lKGZpbHRlck5hbWUsIG5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpc0NsZWFyZWQpIHtcblxuXHRcdFx0ZmlsdGVyQ29udGVudCgpO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNsZWFyRmlsdGVyTmFtZShmaWx0ZXJOYW1lLCBuYW1lKSB7XG5cblx0XHRcdGlmIChmaWx0ZXJOYW1lID09PSAnKicgfHwgbmFtZSA9PT0gZmlsdGVyTmFtZSkge1xuXG5cdFx0XHRcdGlzQ2xlYXJlZCA9IHRydWU7XG5cdFx0XHRcdHR5cGUgPSAkaW5wdXQuYXR0cigndHlwZScpO1xuXG5cdFx0XHRcdGlmICh0eXBlID09PSBUWVBFX1JBRElPQ0hFQ0spIHtcblxuXHRcdFx0XHRcdGNsZWFyTXVsdGlDaGVjaygkaW5wdXQsIGZpbHRlcklkKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCRpbnB1dC5kYXRhKCd0eXBlJykgPT09IFRZUEVfREFURSkge1xuXG5cdFx0XHRcdFx0Y2xlYXJJbnB1dCgkaW5wdXQpO1xuXHRcdFx0XHRcdCRpbnB1dFswXS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjbGVhcklucHV0KCRpbnB1dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIEhlbHBlcnNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBjbGVhcklucHV0KCRpbnB1dCkge1xuXG5cdFx0JGlucHV0LnZhbCgnJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBjbGVhck11bHRpQ2hlY2soJGlucHV0LCBmaWx0ZXJJZCkge1xuXG5cdFx0JGlucHV0LnRyaWdnZXIoZmlsdGVyUmFkaW9DaGVja2JveC5FVkVOVF9DTEVBUiwgZmlsdGVySWQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZmlsdGVyQ29udGVudCgpIHtcblxuXHRcdGZpbHRlci5sb2FkKGNvbXBvc2VGaWx0ZXJRdWVyeSgpKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBvc2VGaWx0ZXJRdWVyeSgpIHtcblxuXHRcdHZhciBxdWVyeSA9ICcnLFxuXHRcdGkgPSAwLFxuXHRcdGFuYWx5dGljc0FycmF5ID0gW10sXG5cdFx0ZGF0ZVN0cmluZyA9IFwiXCI7XG5cblx0XHRfJGlucHV0cy5lYWNoKGZ1bmN0aW9uKGluZGV4LCBpbnB1dEVsKSB7XG5cblx0XHRcdFx0dmFyICRpbnB1dCA9ICQoaW5wdXRFbCksXG5cdFx0XHRcdFx0dHlwZSA9ICRpbnB1dC5hdHRyKCd0eXBlJyksXG5cdFx0XHRcdFx0bmFtZSA9ICRpbnB1dC5hdHRyKCduYW1lJyksXG5cdFx0XHRcdFx0dmFsdWUgPSBnZXRWYWx1ZUJ5VHlwZSgkaW5wdXQsIHR5cGUpO1xuXG5cdFx0XHRcdGlmICh2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IDApIHtcblx0XHRcdFx0XHRhcHBlbmRUb1F1ZXJ5KG5hbWUsIHZhbHVlKTtcblx0XHRcdFx0XHRpZiAobmFtZSA9PT0gXCJpc3N1ZVwiKSB7XG5cdFx0XHRcdFx0XHRhbmFseXRpY3NBcnJheS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XCJhY3Rpb25cIjogXCJJc3N1ZXNcIixcblx0XHRcdFx0XHRcdFx0XCJsYWJlbFwiOiAkaW5wdXQuZmluZChcIjpjaGVja2VkXCIpLmRhdGEoXCJwcmV0dHktbGFiZWxcIilcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChuYW1lID09PSBcInN0YXJ0ZGF0ZVwiIHx8IG5hbWUgPT09IFwiZW5kZGF0ZVwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoZGF0ZVN0cmluZyA9PT0gXCJcIikge1xuXHRcdFx0XHRcdFx0XHRkYXRlU3RyaW5nICs9ICRpbnB1dC52YWwoKVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZGF0ZVN0cmluZyArPSBcIiAtIFwiICsgJGlucHV0LnZhbCgpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChuYW1lID09PSBcImNvdW50cnlcIikge1xuXHRcdFx0XHRcdGFuYWx5dGljc0FycmF5LnB1c2goe1xuXHRcdFx0XHRcdFx0XCJhY3Rpb25cIjogXCJMb2NhdGlvblwiLFxuXHRcdFx0XHRcdFx0XCJsYWJlbFwiOiAkaW5wdXQuZmluZChcIm9wdGlvbjpzZWxlY3RlZFwiKS50ZXh0KClcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmIChuYW1lID09PSBcImhvc3RcIikge1xuXHRcdFx0XHRcdGFuYWx5dGljc0FycmF5LnB1c2goe1xuXHRcdFx0XHRcdFx0XCJhY3Rpb25cIjogXCJIb3N0XCIsXG5cdFx0XHRcdFx0XHRcImxhYmVsXCI6ICRpbnB1dC5maW5kKFwib3B0aW9uOnNlbGVjdGVkXCIpLnRleHQoKVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKGRhdGVTdHJpbmcgIT09IFwiXCIpIHtcblx0XHRcdGFuYWx5dGljc0FycmF5LnB1c2goe1xuXHRcdFx0XHRcImFjdGlvblwiOiBcIkRhdGVcIixcblx0XHRcdFx0XCJsYWJlbFwiOiBkYXRlU3RyaW5nXG5cdFx0XHR9KVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDA7IGkgPCBhbmFseXRpY3NBcnJheS5sZW5ndGg7IGkrKykge1xuXHRcdFx0Z3RtRGF0YVB1c2hlcihcIkZpbHRlclwiLCBhbmFseXRpY3NBcnJheVtpXS5hY3Rpb24sIGFuYWx5dGljc0FycmF5W2ldLmxhYmVsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcXVlcnk7XG5cblxuXHRcdGZ1bmN0aW9uIGFwcGVuZFRvUXVlcnkobmFtZSwgdmFsdWUpIHtcblxuXHRcdFx0dmFyIHByZWZpeCA9IHF1ZXJ5Lmxlbmd0aCA9PT0gMCA/ICcnIDogJyYnO1xuXG5cdFx0XHRxdWVyeSArPSBwcmVmaXggKyBuYW1lICsgJz0nICsgdmFsdWU7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVCeVR5cGUoJGlucHV0LCB0eXBlKSB7XG5cblx0XHRcdHZhciB2YWx1ZTtcblxuXHRcdFx0c3dpdGNoICh0eXBlKSB7XG5cblx0XHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRcdFx0dmFsdWUgPSBnZXREYXRlVmFsdWUoJGlucHV0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRcdFx0dmFsdWUgPSBnZXREYXRlVmFsdWUoJGlucHV0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBUWVBFX1NFTEVDVDpcblx0XHRcdFx0XHR2YWx1ZSA9ICRpbnB1dC52YWwoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBUWVBFX1JBRElPQ0hFQ0s6XG5cdFx0XHRcdFx0dmFsdWUgPSAkaW5wdXQuZGF0YSgndmFsdWUnKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdUeXBlIGAnICsgdHlwZSArICdgIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZXZlbnRzIGZpbHRlci4nKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0RGF0ZVZhbHVlKCRpbnB1dCkge1xuXG5cdFx0dmFyIHZhbHVlID0gJGlucHV0LnZhbCgpLFxuXHRcdFx0ZGF0ZSxcblx0XHRcdGRheSxcblx0XHRcdG1vbnRoLFxuXHRcdFx0eWVhcjtcblxuXHRcdGlmICh2YWx1ZSAhPT0gJycpIHtcblx0XHRcdGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cdFx0XHRkYXkgPSBkb3VibGVEaWdpdFN0cmluZyhkYXRlLmdldERhdGUoKSk7XG5cdFx0XHRtb250aCA9IGRvdWJsZURpZ2l0U3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuXHRcdFx0eWVhciA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuXHRcdFx0dmFsdWUgPSBbeWVhciwgbW9udGgsIGRheV0uam9pbignLScpO1xuXHRcdH1cblxuXG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHQvLyBmdW5jdGlvbiBnZXRUZXh0VmFsdWUoJGlucHV0KSB7XG5cdC8vXG5cdC8vIFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCgkaW5wdXQudmFsKCkpO1xuXHQvLyB9XG5cblx0ZnVuY3Rpb24gcHJlRmlsbElucHV0cyhpbmRleCwgaW5wdXRFbCkge1xuXG5cdFx0dmFyICRpbnB1dCA9ICQoaW5wdXRFbCksXG5cdFx0XHRwYXJhbUtleSA9ICRpbnB1dC5hdHRyKCduYW1lJyksXG5cdFx0XHRpbml0aWFsVmFsdWUgPSBnZXRVUkxQYXJhbWV0ZXIocGFyYW1LZXkpO1xuXHRcdGlmIChpbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXG5cdFx0XHQvLyBEcm9wIGRvd25zIGRvIHRoZWlyIG93biBwcmUtZmlsbGluZyBpbiBmaWx0ZXJFdmVudERyb3Bkb3duLmpzLlxuXHRcdFx0Ly8gVGhleSdyZSBKU09OIGJhc2VkIHNvIHdlJ3JlIG5vdCBzdXJlIGlmIGFuZCB3aGVuIHRoZWlyIGRhdGEgaXMgYXZhaWxhYmxlXG5cdFx0XHRpZiAoJGlucHV0LmF0dHIoJ3R5cGUnKSA9PT0gVFlQRV9SQURJT0NIRUNLKSB7XG5cblx0XHRcdFx0JGlucHV0LnRyaWdnZXIoZmlsdGVyUmFkaW9DaGVja2JveC5FVkVOVF9VUERBVEUsIGluaXRpYWxWYWx1ZSk7XG5cblx0XHRcdH0gZWxzZSBpZiAoJGlucHV0LmRhdGEoJ3R5cGUnKSAhPT0gVFlQRV9EQVRFKSB7XG5cdFx0XHRcdCRpbnB1dC52YWwoaW5pdGlhbFZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBkb3VibGVEaWdpdFN0cmluZyhudW1iZXIpIHtcblxuXHRcdHZhciBwcmVwZW5kID0gJyc7XG5cblx0XHRpZiAobnVtYmVyIDwgMTApIHsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblxuXHRcdFx0cHJlcGVuZCA9ICcwJztcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJlcGVuZCArIG51bWJlcjtcblx0fVxuXG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCAgICBQdWJsaWMgTWV0aG9kc1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsIi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpLFxuXHRmaWx0ZXJNdWx0aVNlbGVjdCA9IHJlcXVpcmUoJy4vZmlsdGVyTXVsdGlTZWxlY3QnKSxcblx0ZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cdGZpbHRlciA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvZmlsdGVyJyksXG5cdGdldFVSTFBhcmFtZXRlciA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2dldFVybFBhcmFtZXRlcicpLFxuXG5cdC8vIGNvbnN0YW50c1xuXHRTRUxFQ1RPUl9JTlBVVCA9ICcuanMtZmlsdGVyRm9ybV9faW5wdXQnLFxuXG5cdFRZUEVfU0VMRUNUID0gJ3NlbGVjdCcsXG5cdFRZUEVfREFURSA9ICdkYXRlJyxcblx0VFlQRV9NVUxUSUNIRUNLID0gJ211bHRpY2hlY2snO1xuXG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtZmlsdGVyRm9ybSc7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXG5cdHZhciBfJGVsLFxuXHRcdF8kaW5wdXRzO1xuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgICAgSW5pdGlhbGl6YXRpb25cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBpbml0KCRlbCkge1xuXG5cblx0XHRfJGVsID0gJGVsO1xuXHRcdF8kaW5wdXRzID0gXyRlbC5maW5kKFNFTEVDVE9SX0lOUFVUKTtcblxuXHRcdF8kaW5wdXRzLmVhY2gocHJlRmlsbElucHV0cyk7XG5cblx0XHRfJGVsLnN1Ym1pdChvblN1Ym1pdCk7XG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuRklMVEVSX0NMRUFSX0ZJRUxELCBvbkNsZWFyRmllbGQpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCAgICBFdmVudCBoYW5kbGluZ1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uU3VibWl0KGUpIHtcblxuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGZpbHRlckNvbnRlbnQoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uQ2xlYXJGaWVsZChlLCBmaWx0ZXJOYW1lLCBmaWx0ZXJJZCkge1xuXG5cblx0XHR2YXIgJGlucHV0LFxuXHRcdFx0bmFtZSxcblx0XHRcdHR5cGUsXG5cdFx0XHRtdWx0aUZpbHRlciA9IGZpbHRlck5hbWUuc3BsaXQoJywnKSxcblx0XHRcdGlzTXVsdGlGaWx0ZXIgPSBtdWx0aUZpbHRlci5sZW5ndGggPiAxLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRpc0NsZWFyZWQgPSBmYWxzZSxcblx0XHRcdGo7XG5cblx0XHRmb3IoaTsgaSA8IF8kaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdCRpbnB1dCA9ICQoXyRpbnB1dHNbaV0pO1xuXHRcdFx0bmFtZSA9ICRpbnB1dC5hdHRyKCduYW1lJyk7XG5cblx0XHRcdGlmKGlzTXVsdGlGaWx0ZXIpIHtcblxuXHRcdFx0XHRmb3IoaiA9IDA7IGogPCBtdWx0aUZpbHRlci5sZW5ndGg7IGorKykge1xuXG5cdFx0XHRcdFx0Y2xlYXJGaWx0ZXJOYW1lKG11bHRpRmlsdGVyW2pdLCBuYW1lKTtcblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNsZWFyRmlsdGVyTmFtZShmaWx0ZXJOYW1lLCBuYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZihpc0NsZWFyZWQpIHtcblxuXHRcdFx0ZmlsdGVyQ29udGVudCgpO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNsZWFyRmlsdGVyTmFtZShmaWx0ZXJOYW1lLCBuYW1lKSB7XG5cblx0XHRcdGlmKGZpbHRlck5hbWUgPT09ICcqJyB8fCBuYW1lID09PSBmaWx0ZXJOYW1lKSB7XG5cblx0XHRcdFx0aXNDbGVhcmVkID0gdHJ1ZTtcblx0XHRcdFx0dHlwZSA9ICRpbnB1dC5hdHRyKCd0eXBlJyk7XG5cblx0XHRcdFx0aWYodHlwZSA9PT0gVFlQRV9NVUxUSUNIRUNLKSB7XG5cblx0XHRcdFx0XHRjbGVhck11bHRpQ2hlY2soJGlucHV0LCBmaWx0ZXJJZCk7XG5cblx0XHRcdFx0fSBlbHNlIGlmKCRpbnB1dC5kYXRhKCd0eXBlJykgPT09IFRZUEVfREFURSkge1xuXG5cdFx0XHRcdFx0Y2xlYXJJbnB1dCgkaW5wdXQpO1xuXHRcdFx0XHRcdCRpbnB1dFswXS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjbGVhcklucHV0KCRpbnB1dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIEhlbHBlcnNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBjbGVhcklucHV0KCRpbnB1dCkge1xuXG5cdFx0JGlucHV0LnZhbCgnJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBjbGVhck11bHRpQ2hlY2soJGlucHV0LCBmaWx0ZXJJZCkge1xuXG5cdFx0JGlucHV0LnRyaWdnZXIoZmlsdGVyTXVsdGlTZWxlY3QuRVZFTlRfQ0xFQVIsIGZpbHRlcklkKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbHRlckNvbnRlbnQoKSB7XG5cblx0XHRmaWx0ZXIubG9hZChjb21wb3NlRmlsdGVyUXVlcnkoKSk7XG5cdH1cblxuXHRmdW5jdGlvbiBjb21wb3NlRmlsdGVyUXVlcnkoKSB7XG5cblx0XHR2YXIgcXVlcnkgPSAnJztcblxuXHRcdF8kaW5wdXRzLmVhY2goZnVuY3Rpb24oaW5kZXgsIGlucHV0RWwpIHtcblxuXHRcdFx0dmFyICRpbnB1dCA9ICQoaW5wdXRFbCksXG5cdFx0XHRcdHR5cGUgPSAkaW5wdXQuYXR0cigndHlwZScpLFxuXHRcdFx0XHRuYW1lID0gJGlucHV0LmF0dHIoJ25hbWUnKSxcblx0XHRcdFx0dmFsdWUgPSBnZXRWYWx1ZUJ5VHlwZSgkaW5wdXQsIHR5cGUpO1xuXG5cdFx0XHRpZih2YWx1ZSAhPT0gJycpIHtcblxuXHRcdFx0XHRhcHBlbmRUb1F1ZXJ5KG5hbWUsIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBxdWVyeTtcblxuXG5cdFx0ZnVuY3Rpb24gYXBwZW5kVG9RdWVyeShuYW1lLCB2YWx1ZSkge1xuXG5cdFx0XHR2YXIgcHJlZml4ID0gcXVlcnkubGVuZ3RoID09PSAwID8gJycgOiAnJic7XG5cblx0XHRcdHF1ZXJ5ICs9IHByZWZpeCArIG5hbWUgKyAnPScgKyB2YWx1ZTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZUJ5VHlwZSgkaW5wdXQsIHR5cGUpIHtcblxuXHRcdFx0dmFyIHZhbHVlO1xuXG5cdFx0XHRzd2l0Y2godHlwZSkge1xuXG5cdFx0XHRcdGNhc2UgJ3RleHQnOiB2YWx1ZSA9IGdldFRleHRWYWx1ZSgkaW5wdXQpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnZGF0ZSc6IHZhbHVlID0gZ2V0RGF0ZVZhbHVlKCRpbnB1dCk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFRZUEVfU0VMRUNUOiB2YWx1ZSA9ICRpbnB1dC52YWwoKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgVFlQRV9NVUxUSUNIRUNLOiB2YWx1ZSA9ICRpbnB1dC5kYXRhKCd2YWx1ZScpOyBicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogY29uc29sZS5lcnJvcignVHlwZSBgJyArIHR5cGUgKyAnYCBpcyBub3Qgc3VwcG9ydGVkIGluIGZpbHRlci4nKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0RGF0ZVZhbHVlKCRpbnB1dCkge1xuXG5cdFx0dmFyIHZhbHVlID0gJGlucHV0LnZhbCgpLFxuXHRcdFx0ZGF0ZSxcblx0XHRcdGRheSxcblx0XHRcdG1vbnRoLFxuXHRcdFx0eWVhcjtcblxuXHRcdGlmKHZhbHVlICE9PSAnJykge1xuXG5cdFx0XHRkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuXHRcdFx0ZGF5ID0gZG91YmxlRGlnaXRTdHJpbmcoZGF0ZS5nZXREYXRlKCkpO1xuXHRcdFx0bW9udGggPSBkb3VibGVEaWdpdFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKTtcblx0XHRcdHllYXIgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKS5zdWJzdHIoLTIpOy8vZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cblx0XHRcdHZhbHVlID0gZGF5K21vbnRoK3llYXI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VGV4dFZhbHVlKCRpbnB1dCkge1xuXG5cdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCgkaW5wdXQudmFsKCkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJlRmlsbElucHV0cyhpbmRleCwgaW5wdXRFbCkge1xuXG5cdFx0dmFyICRpbnB1dCA9ICQoaW5wdXRFbCksXG5cdFx0XHRwYXJhbUtleSA9ICRpbnB1dC5hdHRyKCduYW1lJyksXG5cdFx0XHRpbml0aWFsVmFsdWUgPSBnZXRVUkxQYXJhbWV0ZXIocGFyYW1LZXkpO1xuXG5cdFx0aWYoaW5pdGlhbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblxuXHRcdFx0Ly8gRHJvcCBkb3ducyBkbyB0aGVpciBvd24gcHJlLWZpbGxpbmcgaW4gZmlsdGVyRXZlbnREcm9wZG93bi5qcy5cblx0XHRcdC8vIFRoZXkncmUgSlNPTiBiYXNlZCBzbyB3ZSdyZSBub3Qgc3VyZSBpZiBhbmQgd2hlbiB0aGVpciBkYXRhIGlzIGF2YWlsYWJsZVxuXHRcdFx0aWYoJGlucHV0LmF0dHIoJ3R5cGUnKSA9PT0gVFlQRV9NVUxUSUNIRUNLKSB7XG5cblx0XHRcdFx0JGlucHV0LnRyaWdnZXIoZmlsdGVyTXVsdGlTZWxlY3QuRVZFTlRfVVBEQVRFLCBpbml0aWFsVmFsdWUpO1xuXG5cdFx0XHR9IGVsc2UgaWYoJGlucHV0LmF0dHIoJ3R5cGUnKSAhPT0gVFlQRV9TRUxFQ1QgJiYgJGlucHV0LmRhdGEoJ3R5cGUnKSAhPT0gVFlQRV9EQVRFKSB7XG5cblx0XHRcdFx0JGlucHV0LnZhbChpbml0aWFsVmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGRvdWJsZURpZ2l0U3RyaW5nKG51bWJlcikge1xuXG5cdFx0dmFyIHByZXBlbmQgPSAnJztcblxuXHRcdGlmKG51bWJlciA8IDEwKSB7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cblx0XHRcdHByZXBlbmQgPSAnMCc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByZXBlbmQgKyBudW1iZXI7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwiLy8gVmVuZG9yIGRlcGVuZGVuY2llc1xudmFyICQgPSByZXF1aXJlKCdqcXVlcnknKSxcblxuLy8gQ29uc3RhbnRzXG5cdFNFTEVDVE9SX1ZBTFVFID0gJy5qcy1maWx0ZXJNdWx0aVNlbGVjdF9fdmFsdWUnLFxuXHRTRUxFQ1RPUl9BTEwgPSAnLmpzLWZpbHRlck11bHRpU2VsZWN0X19hbGwnLFxuXHRFVkVOVF9VUERBVEUgPSAnRVZFTlRfVVBEQVRFJyxcblx0RVZFTlRfQ0xFQVIgPSAnRVZFTlRfQ0xFQVInO1xuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiBNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuLy8gZXhwb3NlIGV2ZW50cyBzbyBmaWx0ZXJGb3JtIGNhbiBkaXNwYXRjaCBhY2NvcmRpbmdseVxuZXhwb3J0cy5FVkVOVF9VUERBVEUgPSBFVkVOVF9VUERBVEU7XG5leHBvcnRzLkVWRU5UX0NMRUFSID0gRVZFTlRfQ0xFQVI7XG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLWZpbHRlck11bHRpU2VsZWN0JztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cblx0dmFyIF8kZWwsXG5cdFx0XyR2YWx1ZXMsXG5cdFx0XyRhbGw7XG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEluaXRpYWxpemF0aW9uXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cblx0XHRfJHZhbHVlcyA9IF8kZWwuZmluZChTRUxFQ1RPUl9WQUxVRSk7XG5cdFx0XyRhbGwgPSBfJGVsLmZpbmQoU0VMRUNUT1JfQUxMKTtcblxuXHRcdHVwZGF0ZVZhbHVlKFtdKTtcblxuXHRcdF8kZWwub24oRVZFTlRfQ0xFQVIsIG9uQ2xlYXIpO1xuXHRcdF8kZWwub24oRVZFTlRfVVBEQVRFLCBvblVwZGF0ZSk7XG5cblx0XHRfJGFsbC5jaGFuZ2Uob25BbGxDaGFuZ2UpO1xuXHRcdF8kdmFsdWVzLmNoYW5nZShvblZhbHVlQ2hhbmdlKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEV2ZW50IGhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gb25DbGVhcihlLCBjbGVhcklkKSB7XG5cblx0XHR2YXIgaSA9IDAsXG5cdFx0XHQkdmFsdWUsXG5cdFx0XHR2YWx1ZUlkO1xuXG5cdFx0Zm9yKGk7IGkgPCBfJHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHQkdmFsdWUgPSAkKF8kdmFsdWVzW2ldKTtcblx0XHRcdHZhbHVlSWQgPSBOdW1iZXIoJHZhbHVlLnZhbCgpKTtcblxuXHRcdFx0aWYoY2xlYXJJZCA9PT0gJyonIHx8IHZhbHVlSWQgPT09IGNsZWFySWQpIHtcblxuXHRcdFx0XHQkdmFsdWUucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZXZhbHVhdGVWYWx1ZXMoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uVXBkYXRlKGUsIG5ld1ZhbHVlcykge1xuXG5cdFx0dmFyIG5ld1ZhbHVlc0Fycixcblx0XHRcdHZhbHVlLFxuXHRcdFx0aTtcblxuXHRcdGlmKHR5cGVvZiBuZXdWYWx1ZXMgIT09ICdzdHJpbmcnKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoJ2ZpbHRlck11bHRpU2VsZWN0IEVWRU5UX1VQREFURSBuZWVkcyBhIHN0cmluZyB0byBwYXJzZS4gWW91XFwncmUgcGFzc2luZyBhICcgKyB0eXBlb2YgbmV3VmFsdWUgKyAnIGluc3RlYWQuJyk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRuZXdWYWx1ZXNBcnIgPSBuZXdWYWx1ZXMuc3BsaXQoJywnKTtcblxuXHRcdFx0Zm9yKGkgPSAwOyBpIDwgbmV3VmFsdWVzQXJyLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0dmFsdWUgPSBuZXdWYWx1ZXNBcnJbaV07XG5cdFx0XHRcdF8kdmFsdWVzLmVhY2godXBkYXRlVmFsdWVFYWNoKTtcblx0XHRcdH1cblxuXHRcdFx0ZXZhbHVhdGVWYWx1ZXMoKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB1cGRhdGVWYWx1ZUVhY2goaW5kZXgsIGVsKSB7XG5cblx0XHRcdHZhciAkZWwgPSAkKGVsKSxcblx0XHRcdFx0aXNDaGVja2VkID0gdmFsdWUgPT09ICRlbC52YWwoKTtcblxuXHRcdFx0aWYoaXNDaGVja2VkKSB7XG5cblx0XHRcdFx0JGVsLnByb3AoJ2NoZWNrZWQnLCBpc0NoZWNrZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIG9uQWxsQ2hhbmdlKCkge1xuXG5cdFx0dXBkYXRlQWxsKHRoaXMuY2hlY2tlZCk7XG5cdFx0ZXZhbHVhdGVWYWx1ZXMoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uVmFsdWVDaGFuZ2UoKSB7XG5cblx0XHRldmFsdWF0ZVZhbHVlcygpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0SGVscGVyc1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBldmFsdWF0ZVZhbHVlcygpIHtcblxuXHRcdHZhciBuZXdWYWx1ZSA9IGNvbXBvc2VNdWx0aVNlbGVjdFZhbHVlKCksXG5cdFx0XHRhbGxWYWx1ZXNBcmVDaGVja2VkID0gbmV3VmFsdWUubGVuZ3RoID09PSBfJHZhbHVlcy5sZW5ndGg7XG5cblx0XHRfJGFsbC5wcm9wKCdjaGVja2VkJywgYWxsVmFsdWVzQXJlQ2hlY2tlZCk7XG5cblx0XHR1cGRhdGVWYWx1ZShuZXdWYWx1ZSk7XG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVBbGwobmV3VmFsdWUpIHtcblxuXHRcdF8kdmFsdWVzLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsKSB7XG5cblx0XHRcdCQoZWwpLnByb3AoJ2NoZWNrZWQnLCBuZXdWYWx1ZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBjb21wb3NlTXVsdGlTZWxlY3RWYWx1ZSgpIHtcblxuXHRcdHZhciB2YWx1ZSA9IFtdO1xuXG5cdFx0XyR2YWx1ZXMuZWFjaChmdW5jdGlvbihpbmRleCwgZWwpe1xuXG5cdFx0XHR2YXIgJGVsID0gJChlbCk7XG5cblx0XHRcdGlmKCRlbC5wcm9wKCdjaGVja2VkJykpIHtcblxuXHRcdFx0XHR2YWx1ZS5wdXNoKCRlbC52YWwoKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVWYWx1ZShhcnIpIHtcblxuXHRcdHZhciB2YWx1ZSA9IGFyci5qb2luKCcsJyk7XG5cblx0XHRfJGVsLmRhdGEoJ3ZhbHVlJywgdmFsdWUpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0UHVibGljIE1ldGhvZHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCIvLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xudmFyICQgPSByZXF1aXJlKCdqcXVlcnknKSxcblx0bWF0Y2hNZWRpYSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvZXZlbnRzL21hdGNoTWVkaWEnKSxcblx0ZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cdGNzc1ByZWZpeCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2Nzc1ByZWZpeCcpLFxuXG5cdC8vIGNvbnN0YW50c1xuXHRPRkZTRVRfRkFDVE9SID0gMC4zLC8vIGJhc2VkIG9uIHRoZSBgdG9wOjMwJWAgaW4gdGhlIGAuaXMtZml4ZWRgIGNsYXNzZXNcblx0VFJBTlNGT1JNX1BSRUZJWCA9IGNzc1ByZWZpeC5qcyArICdUcmFuc2Zvcm0nLFxuXHRDTEFTU19JU19GSVhFRCA9ICdpcy1maXhlZCcsXG5cdFNFTEVDVE9SX1BBUkVOVCA9ICcuanMtZmlsdGVyUG9zaXRpb25pbmdfX3BhcmVudCc7XG5cblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1maWx0ZXJQb3NpdGlvbmluZyc7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXG5cdHZhciBfJGVsLFxuXHRcdF8kcGFyZW50LFxuXHRcdF9kb250U25hcCxcblx0XHRfb25seU9uV2lkZSA9IGZhbHNlLFxuXHRcdF9pc0ZpeGVkID0gZmFsc2UsXG5cdFx0X29mZnNldCA9IDAsXG5cdFx0X3Bvc2l0aW9uaW5nT2Zmc2V0ID0gMCxcblx0XHRfc2Nyb2xsVG9wID0gMDtcblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0SW5pdGlhbGl6YXRpb25cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBpbml0KCRlbCkge1xuXG5cdFx0XyRlbCA9ICRlbDtcblx0XHRfJHBhcmVudCA9ICQoU0VMRUNUT1JfUEFSRU5UKTtcblx0XHRfb25seU9uV2lkZSA9IEJvb2xlYW4oXyRlbC5kYXRhKCdvbmx5LW9uLXdpZGUnKSk7XG5cblx0XHRpZihfJHBhcmVudC5sZW5ndGggIT09IDEpIHtcblxuXHRcdFx0Y29uc29sZS5sb2coJ2Bqcy1maWx0ZXJQb3NpdGlvbmluZ2AgbmVlZHMgb25lIGAnICsgU0VMRUNUT1JfUEFSRU5UICsgJ2Agb24gdGhlIHBhZ2UgJyArXG5cdFx0XHRcdCd0byBiYXNlIGl0cyBwb3NpdGlvbiBvbi4gQXQgdGhpcyBwb2ludCB5b3UgaGF2ZSAnICsgXyRwYXJlbnQubGVuZ3RoICsgJy4nKTtcblxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuU0NST0xMLCBvblNjcm9sbCk7XG5cdFx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5SRVNJWkUsIG9uUmVzaXplKTtcblx0XHR9XG5cdH1cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0RXZlbnQgaGFuZGxpbmdcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBvblNjcm9sbChlLCBzY3JvbGxWYWx1ZSkge1xuXG5cdFx0X3Njcm9sbFRvcCA9IHNjcm9sbFZhbHVlLnNjcm9sbFRvcDtcblxuXHRcdHJlZHJhdygpO1xuXHR9XG5cblx0ZnVuY3Rpb24gb25SZXNpemUoZSwgd2lkdGgsIGhlaWdodCkge1xuXG5cdFx0X3Bvc2l0aW9uaW5nT2Zmc2V0ID0gaGVpZ2h0ICogT0ZGU0VUX0ZBQ1RPUjtcblxuXHRcdGlmKF9vbmx5T25XaWRlKSB7XG5cblx0XHRcdF9kb250U25hcCA9IHdpZHRoIDwgbWF0Y2hNZWRpYS5MQVJHRV9XSU5ET1c7XG5cdFx0fVxuXG5cdFx0cmVkcmF3KCk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRIZWxwZXJzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gcmVkcmF3KCkge1xuXG5cdFx0dmFyIHBhcmVudE9mZnNldFRvcCA9IF8kcGFyZW50Lm9mZnNldCgpLnRvcCxcblx0XHRcdHBhcmVudFBvc2l0aW9uaW5nT2Zmc2V0ID0gXyRwYXJlbnQuaGVpZ2h0KCkgLSBfcG9zaXRpb25pbmdPZmZzZXQ7XG5cblx0XHQvLyBzbmFwIHRvIHRvcFxuXHRcdGlmKF9kb250U25hcCB8fCBwYXJlbnRPZmZzZXRUb3AgPj0gX3Njcm9sbFRvcCArIF9wb3NpdGlvbmluZ09mZnNldCkge1xuXG5cdFx0XHR1cGRhdGVJc0ZpeGVkKGZhbHNlKTtcblx0XHRcdHVwZGF0ZU9mZnNldCgwKTtcblxuXHRcdC8vIHNuYXAgdG8gYm90dG9tXG5cdFx0fSBlbHNlIGlmKHBhcmVudE9mZnNldFRvcCArIHBhcmVudFBvc2l0aW9uaW5nT2Zmc2V0IDw9IF9zY3JvbGxUb3AgKyBfcG9zaXRpb25pbmdPZmZzZXQpIHtcblxuXHRcdFx0dXBkYXRlSXNGaXhlZChmYWxzZSk7XG5cdFx0XHR1cGRhdGVPZmZzZXQoTWF0aC5yb3VuZChwYXJlbnRQb3NpdGlvbmluZ09mZnNldCkpO1xuXG5cdFx0Ly8gc25hcCB0byBtaWRkbGVcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR1cGRhdGVJc0ZpeGVkKHRydWUpO1xuXHRcdFx0dXBkYXRlT2Zmc2V0KDApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUlzRml4ZWQobmV3SXNGaXhlZCkge1xuXG5cdFx0aWYoX2lzRml4ZWQgIT09IG5ld0lzRml4ZWQpIHtcblxuXHRcdFx0X2lzRml4ZWQgPSBuZXdJc0ZpeGVkO1xuXG5cdFx0XHRpZihfaXNGaXhlZCkge1xuXG5cdFx0XHRcdF8kZWwuYWRkQ2xhc3MoQ0xBU1NfSVNfRklYRUQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF8kZWwucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfRklYRUQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZU9mZnNldChuZXdPZmZzZXQpIHtcblxuXHRcdGlmKF9vZmZzZXQgIT09IG5ld09mZnNldCkge1xuXG5cdFx0XHRfb2Zmc2V0ID0gbmV3T2Zmc2V0O1xuXG5cdFx0XHRpZihfb2Zmc2V0ID4gMCkge1xuXG5cdFx0XHRcdF8kZWwuY3NzKFRSQU5TRk9STV9QUkVGSVgsICd0cmFuc2xhdGVZKCcgKyBfb2Zmc2V0ICsgJ3B4KScpO1xuXHRcdFx0XHRfJGVsLmNzcyhUUkFOU0ZPUk1fUFJFRklYLCAndHJhbnNsYXRlM2QoMCwgJyArIF9vZmZzZXQgKyAncHgsIDApJyk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XyRlbC5jc3MoVFJBTlNGT1JNX1BSRUZJWCwgJycpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwiLy8gVmVuZG9yIGRlcGVuZGVuY2llc1xudmFyICQgPSByZXF1aXJlKCdqcXVlcnknKSxcblxuXHQvLyBDb25zdGFudHNcblx0U0VMRUNUT1JfVkFMVUUgPSAnLmpzLWZpbHRlclJhZGlvQ2hlY2tib3hfX3ZhbHVlJyxcblx0RVZFTlRfVVBEQVRFID0gJ0VWRU5UX1VQREFURScsXG5cdEVWRU5UX0NMRUFSID0gJ0VWRU5UX0NMRUFSJztcblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gTW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbi8vIGV4cG9zZSBldmVudHMgc28gZmlsdGVyRm9ybSBjYW4gZGlzcGF0Y2ggYWNjb3JkaW5nbHlcbmV4cG9ydHMuRVZFTlRfVVBEQVRFID0gRVZFTlRfVVBEQVRFO1xuZXhwb3J0cy5FVkVOVF9DTEVBUiA9IEVWRU5UX0NMRUFSO1xuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1maWx0ZXJJc3N1ZXNfX2NvbnRhaW5lcic7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXG5cdHZhciBfJGVsLFxuXHRcdF8kdmFsdWVzO1xuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0SW5pdGlhbGl6YXRpb25cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBpbml0KCRlbCkge1xuXHRcdF8kZWwgPSAkZWw7XG5cblx0XHRfJHZhbHVlcyA9IF8kZWwuZmluZChTRUxFQ1RPUl9WQUxVRSk7XG5cblx0XHRfJGVsLm9uKEVWRU5UX1VQREFURSwgb25VcGRhdGUpO1xuXHRcdF8kdmFsdWVzLmNoYW5nZShvblZhbHVlQ2hhbmdlKTtcblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEV2ZW50IGhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gb25WYWx1ZUNoYW5nZShlKSB7XG5cblx0XHR2YXIgaSA9IDAsXG5cdFx0XHQkdmFsdWUsXG5cdFx0XHR2YWx1ZUlkLFxuXHRcdFx0c2VsZWN0ZWQ7XG5cblx0XHRzZWxlY3RlZCA9IE51bWJlcigkKGUudGFyZ2V0KS52YWwoKSk7XG5cdFx0aWYgKHNlbGVjdGVkICYmICQoZS50YXJnZXQpLmlzKCc6Y2hlY2tlZCcpKSB7XG5cdFx0XHRfJGVsLmRhdGEoJ3ZhbHVlJywgc2VsZWN0ZWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRfJGVsLmRhdGEoJ3ZhbHVlJywgMCk7XG5cdFx0fVxuXHRcdGZvciAoaTsgaSA8IF8kdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdCR2YWx1ZSA9ICQoXyR2YWx1ZXNbaV0pO1xuXHRcdFx0dmFsdWVJZCA9IE51bWJlcigkdmFsdWUudmFsKCkpO1xuXG5cdFx0XHRpZiAoc2VsZWN0ZWQgIT09IHZhbHVlSWQpIHtcblx0XHRcdFx0JHZhbHVlLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBvblVwZGF0ZShlKSB7Ly9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cdFx0Ly9jb25zb2xlLmxvZyhlLCBuZXdWYWx1ZXMpO1xuXG5cblx0fVxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRQdWJsaWMgTWV0aG9kc1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsIi8vIHZlbmRvciBkZXBlbmRlbmNpZXNcbnZhciAkID0gcmVxdWlyZSgnanF1ZXJ5JyksXG5cblx0Ly8gcHJvamVjdCBkZXBlbmRlbmNpZXNcblx0Z2xvYmFsU2VsZWN0b3JzID0gcmVxdWlyZSgnLi4vLi4vY29yZS9nbG9iYWxTZWxlY3RvcnMnKSxcblxuXHQvLyBzZWxlY3RvcnNcblx0XyRib2R5ID0gZ2xvYmFsU2VsZWN0b3JzLiRib2R5LFxuXG5cdC8vIGNvbnN0YW50c1xuXHRTRUxFQ1RPUl9UT0dHTEVfVEFSR0VUID0gJy5qcy1maWx0ZXJUb2dnbGVfX3RhcmdldCcsXG5cdENMQVNTX0lTX09QRU4gPSAnaXMtb3BlbicsXG5cdENMQVNTX05PX1NDUk9MTF9GSUxURVIgPSAnbm8tc2Nyb2xsLS1maWx0ZXInO1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1maWx0ZXJUb2dnbGUnO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblxuXHR2YXIgXyRlbCxcblx0XHRfJHRhcmdldDtcblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRJbml0aWFsaXphdGlvblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXHRcdF8kdGFyZ2V0ID0gJChTRUxFQ1RPUl9UT0dHTEVfVEFSR0VUKTtcblx0XHRfJGVsLmNsaWNrKG9uQ2xpY2spO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0RXZlbnQgaGFuZGxpbmdcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBvbkNsaWNrKCkge1xuXG5cdFx0aWYoXyR0YXJnZXQuaGFzQ2xhc3MoQ0xBU1NfSVNfT1BFTikpIHtcblxuXHRcdFx0Y2xvc2UoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG9wZW4oKTtcblx0XHR9XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRTdGF0ZSBIYW5kbGluZ1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBvcGVuKCkge1xuXG5cdFx0XyRlbC5hZGRDbGFzcyhDTEFTU19JU19PUEVOKTtcblx0XHRfJHRhcmdldC5hZGRDbGFzcyhDTEFTU19JU19PUEVOKTtcblx0XHRfJGJvZHkuYWRkQ2xhc3MoQ0xBU1NfTk9fU0NST0xMX0ZJTFRFUik7XG5cdH1cblxuXHRmdW5jdGlvbiBjbG9zZSgpIHtcblxuXHRcdF8kZWwucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfT1BFTik7XG5cdFx0XyR0YXJnZXQucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfT1BFTik7XG5cdFx0XyRib2R5LnJlbW92ZUNsYXNzKENMQVNTX05PX1NDUk9MTF9GSUxURVIpO1xuXHR9XG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwidmFyIGd0bURhdGFQdXNoZXIgPSByZXF1aXJlKCcuLi91dGlscy9ndG1EYXRhUHVzaGVyJyksXG5cblx0QUNUSU9OX0NMSUNLID0gJ2NsaWNrJztcblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtZ3RtQ2xpY2snO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblx0dmFyIF8kZWwsXG5cdFx0X2NhdGVnb3J5LFxuXHRcdF9sYWJlbCxcblx0XHRfYWN0aW9uO1xuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEluaXRpYWxpemF0aW9uXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0X2NhdGVnb3J5ID0gXyRlbC5kYXRhKCdjYXRlZ29yeScpO1xuXHRcdF9sYWJlbCA9IF8kZWwuZGF0YSgnbGFiZWwnKTtcblx0XHRfYWN0aW9uID0gXyRlbC5kYXRhKCdhY3Rpb24nKSB8fCBBQ1RJT05fQ0xJQ0s7XG5cblxuXHRcdF8kZWwuY2xpY2sob25DbGljayk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRFdmVudCBIYW5kbGluZ1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG5cdFx0Z3RtRGF0YVB1c2hlcihfY2F0ZWdvcnksIF9hY3Rpb24sIF9sYWJlbCk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRQdWJsaWMgTWV0aG9kc1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsInZhciBndG1EYXRhUHVzaGVyID0gcmVxdWlyZSgnLi4vdXRpbHMvZ3RtRGF0YVB1c2hlcicpLFxuXG5cdEFDVElPTl9TVUJNSVQgPSAnY2xpY2snO1xuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0TW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1ndG1TdWJtaXQnO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblx0dmFyIF8kZWwsXG5cdFx0X2NhdGVnb3J5LFxuXHRcdF9sYWJlbDtcblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRJbml0aWFsaXphdGlvblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXHRcdF9jYXRlZ29yeSA9IF8kZWwuZGF0YSgnY2F0ZWdvcnknKTtcblx0XHRfbGFiZWwgPSBfJGVsLmRhdGEoJ2xhYmVsJyk7XG5cblx0XHRfJGVsLnN1Ym1pdChvblN1Ym1pdCk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRFdmVudCBIYW5kbGluZ1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uU3VibWl0KCkge1xuXG5cdFx0Z3RtRGF0YVB1c2hlcihfY2F0ZWdvcnksIEFDVElPTl9TVUJNSVQsIF9sYWJlbCk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRQdWJsaWMgTWV0aG9kc1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsInZhciBDTEFTU19JU19CTFVSUkVEID0gJ2lzLWJsdXJyZWQnLFxuXHRDTEFTU19JU19GT0NVU0VEID0gJ2lzLWZvY3VzZWQnLFxuXHRDTEFTU19JU19ISURERU4gPSAnaXMtaGlkZGVuJyxcblx0Q0xBU1NfSVNfU0hPV04gPSAnaXMtc2hvd24nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCRlbCkge1xuXG5cdHZhciBfJGVsID0gJGVsLFxuXHRcdF9pc0JsdXJyZWQgPSBmYWxzZSxcblx0XHRfaXNIaWRkZW4gPSBmYWxzZTtcblxuXHRmdW5jdGlvbiBibHVyKCkge1xuXG5cdFx0aWYoIV9pc0JsdXJyZWQpIHtcblxuXHRcdFx0X2lzQmx1cnJlZCA9IHRydWU7XG5cdFx0XHRfJGVsLnJlbW92ZUNsYXNzKENMQVNTX0lTX0ZPQ1VTRUQpO1xuXHRcdFx0XyRlbC5hZGRDbGFzcyhDTEFTU19JU19CTFVSUkVEKTtcblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGZvY3VzKGlzRm9yY2VkKSB7XG5cblx0XHRpZihfaXNCbHVycmVkKSB7XG5cblx0XHRcdF9pc0JsdXJyZWQgPSBmYWxzZTtcblx0XHRcdF8kZWwucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfQkxVUlJFRCk7XG5cblx0XHRcdGlmKGlzRm9yY2VkKSB7XG5cblx0XHRcdFx0XyRlbC5hZGRDbGFzcyhDTEFTU19JU19GT0NVU0VEKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBoaWRlKCkge1xuXG5cdFx0aWYoIV9pc0hpZGRlbikge1xuXG5cdFx0XHRfaXNIaWRkZW4gPSB0cnVlO1xuXG5cdFx0XHRfJGVsLmFkZENsYXNzKENMQVNTX0lTX0hJRERFTik7XG5cdFx0XHRfJGVsLnJlbW92ZUNsYXNzKENMQVNTX0lTX1NIT1dOKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBzaG93KCkge1xuXG5cdFx0aWYoX2lzSGlkZGVuKSB7XG5cblx0XHRcdF9pc0hpZGRlbiA9IGZhbHNlO1xuXHRcdFx0XyRlbC5yZW1vdmVDbGFzcyhDTEFTU19JU19ISURERU4pO1xuXHRcdFx0XyRlbC5hZGRDbGFzcyhDTEFTU19JU19TSE9XTik7XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5ibHVyID0gYmx1cjtcblx0dGhpcy5mb2N1cyA9IGZvY3VzO1xuXHR0aGlzLmhpZGUgPSBoaWRlO1xuXHR0aGlzLnNob3cgPSBzaG93O1xufTtcbiIsIi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cblx0SGVhZGVyRWxlbWVudCA9IHJlcXVpcmUoJy4vSGVhZGVyRWxlbWVudCcpLFxuXG4vLyBDb25zdGFudHNcblx0SEVBREVSX1NDUk9MTF9PRkZTRVQgPSAxNDAsXG5cdFZFTE9DSVRZX09GRlNFVCA9IC0wLjc1LFxuXG5cdFNFTEVDVE9SX0hFQURFUiA9ICcuanMtaGVhZGVyJyxcblx0U0VMRUNUT1JfSEVBREVSX0JBUiA9ICcuanMtaGVhZGVyX19iYXInLFxuXHRTRUxFQ1RPUl9JU1NVRVNfTkFWID0gJy5qcy1oZWFkZXJfX2lzc3VlcycsXG5cdFNFTEVDVE9SX1BBR0VTX05BViA9ICcuanMtaGVhZGVyX19wYWdlcycsXG5cdFNFTEVDVE9SX0hFQURFUl9PTl9QUk9HUkVTUyA9ICcuanMtaGVhZGVyX19vbi1wcm9ncmVzcycsXG5cdFNFTEVDVE9SX0NVUlJFTlRfQ09QWSA9ICcuanMtaGVhZGVyX19jdXJyZW50JztcblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgTW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5leHBvcnRzLnNlbGVjdG9yID0gU0VMRUNUT1JfSEVBREVSO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblxuXHR2YXIgXyRlbCxcblx0XHRfaGFzU3VibmF2LFxuXHRcdF9oZWFkZXJCYXIsXG5cdFx0X2hlYWRlck9uUHJvZ3Jlc3MsXG5cdFx0X25hdklzc3Vlcyxcblx0XHRfY3VycmVudGx5UmVhZGluZ0NvcHksXG5cdFx0X25hdlBhZ2VzLFxuXHRcdF9pc1JlYWRpbmdDb250ZW50LFxuXHRcdF9jdXJyZW50U2Nyb2xsVmFsdWVzO1xuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIEluaXRpYWxpemF0aW9uXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cblx0XHRfaGFzU3VibmF2ID0gXyRlbC5kYXRhKCdoYXMtc3VibmF2Jyk7XG5cblx0XHRfaGVhZGVyQmFyID0gbmV3IEhlYWRlckVsZW1lbnQoXyRlbC5maW5kKFNFTEVDVE9SX0hFQURFUl9CQVIpKTtcblx0XHRfbmF2SXNzdWVzID0gbmV3IEhlYWRlckVsZW1lbnQoXyRlbC5maW5kKFNFTEVDVE9SX0lTU1VFU19OQVYpKTtcblx0XHRfbmF2UGFnZXMgPSBuZXcgSGVhZGVyRWxlbWVudChfJGVsLmZpbmQoU0VMRUNUT1JfUEFHRVNfTkFWKSk7XG5cdFx0X2hlYWRlck9uUHJvZ3Jlc3MgPSBuZXcgSGVhZGVyRWxlbWVudChfJGVsLmZpbmQoU0VMRUNUT1JfSEVBREVSX09OX1BST0dSRVNTKSk7XG5cdFx0X2N1cnJlbnRseVJlYWRpbmdDb3B5ID0gbmV3IEhlYWRlckVsZW1lbnQoXyRlbC5maW5kKFNFTEVDVE9SX0NVUlJFTlRfQ09QWSkpO1xuXG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuU0NST0xMLCBvblNjcm9sbCk7XG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuQ09OVEVOVF9QUk9HUkVTUywgb25Db250ZW50UHJvZ3Jlc3MpO1xuXG5cdFx0XyRlbC5ob3ZlcihvbkhlYWRlckluLCBvbkhlYWRlck91dCk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIEV2ZW50IEhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uSGVhZGVySW4oKSB7XG5cblx0XHQvLyBkb24ndCBleHBhbmQgdGhlIGlzc3VlLW5hdiB3aGVuIHdlIGhhdmUgYSBzdWItbmF2aWdhdGlvblxuXHRcdGlmKF9oYXNTdWJuYXYgJiYgX2lzUmVhZGluZ0NvbnRlbnQpIHtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGhhbmRsZU5hdklzc3Vlcyh0cnVlKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uSGVhZGVyT3V0KCkge1xuXG5cdFx0aGFuZGxlTmF2SXNzdWVzKGZhbHNlKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9uU2Nyb2xsKGUsIG5ld1Njcm9sbFZhbHVlcykge1xuXG5cdFx0X2N1cnJlbnRTY3JvbGxWYWx1ZXMgPSBuZXdTY3JvbGxWYWx1ZXM7XG5cblx0XHRoYW5kbGVIZWFkZXJCYXIoKTtcblx0XHRoYW5kbGVOYXZJc3N1ZXMoZmFsc2UpO1xuXHR9XG5cblx0ZnVuY3Rpb24gb25Db250ZW50UHJvZ3Jlc3MoZSwgcHJvZ3Jlc3MpIHtcblxuXHRcdHZhciBuZXdJc1JlYWRpbmdDb250ZW50ID0gcHJvZ3Jlc3MgPiAwICYmIHByb2dyZXNzIDwgMTtcblxuXHRcdGlmKG5ld0lzUmVhZGluZ0NvbnRlbnQgIT09IF9pc1JlYWRpbmdDb250ZW50KSB7XG5cblx0XHRcdF9pc1JlYWRpbmdDb250ZW50ID0gbmV3SXNSZWFkaW5nQ29udGVudDtcblxuXHRcdFx0aWYoX2lzUmVhZGluZ0NvbnRlbnQpIHtcblxuXHRcdFx0XHRfaGVhZGVyT25Qcm9ncmVzcy5zaG93KCk7XG5cdFx0XHRcdF9uYXZJc3N1ZXMuaGlkZSgpO1xuXHRcdFx0XHRfbmF2UGFnZXMuaGlkZSgpO1xuXHRcdFx0XHRfY3VycmVudGx5UmVhZGluZ0NvcHkuc2hvdygpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9uYXZQYWdlcy5zaG93KCk7XG5cdFx0XHRcdF9uYXZJc3N1ZXMuc2hvdygpO1xuXHRcdFx0XHRfaGVhZGVyT25Qcm9ncmVzcy5oaWRlKCk7XG5cdFx0XHRcdF9jdXJyZW50bHlSZWFkaW5nQ29weS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0ICAgIFN0YXRlIEhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXHRmdW5jdGlvbiBoYW5kbGVIZWFkZXJCYXIoKSB7XG5cblx0XHR2YXIgaXNCbHVycmVkID0gX2N1cnJlbnRTY3JvbGxWYWx1ZXMuc2Nyb2xsVG9wID49IEhFQURFUl9TQ1JPTExfT0ZGU0VUO1xuXG5cdFx0aWYoaXNCbHVycmVkKSB7XG5cblx0XHRcdF9oZWFkZXJCYXIuYmx1cigpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2hlYWRlckJhci5mb2N1cygpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGhhbmRsZU5hdklzc3Vlcyhpc0ZvcmNlZEZvY3VzKSB7XG5cblx0XHRpZihpc0ZvcmNlZEZvY3VzIHx8XG5cdFx0XHRfY3VycmVudFNjcm9sbFZhbHVlcy52ZWxvY2l0eSA8IFZFTE9DSVRZX09GRlNFVCB8fFxuXHRcdFx0X2N1cnJlbnRTY3JvbGxWYWx1ZXMuc2Nyb2xsVG9wIDwgSEVBREVSX1NDUk9MTF9PRkZTRVQpIHtcblxuXHRcdFx0X25hdklzc3Vlcy5mb2N1cyhpc0ZvcmNlZEZvY3VzKTtcblxuXHRcdH0gZWxzZSBpZihfY3VycmVudFNjcm9sbFZhbHVlcy52ZWxvY2l0eSA+IDAgJiZcblx0XHRcdF9jdXJyZW50U2Nyb2xsVmFsdWVzLnNjcm9sbFRvcCA+PSBIRUFERVJfU0NST0xMX09GRlNFVCkge1xuXG5cdFx0XHRfbmF2SXNzdWVzLmJsdXIoKTtcblx0XHR9XG5cdH1cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCAgICBQdWJsaWMgTWV0aG9kc1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsIi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cdG1hdGNoTWVkaWEgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cy9tYXRjaE1lZGlhJyksXG5cdGd0bURhdGFQdXNoZXIgPSByZXF1aXJlKCcuLi8uLi91dGlscy9ndG1EYXRhUHVzaGVyJyksXG5cdEFycm93ID0gcmVxdWlyZSgnLi4vYXJyb3cnKSxcblx0TmF2aWdhdGlvbiA9IHJlcXVpcmUoJy4uL2Nhcm91c2VsL25hdmlnYXRpb24nKSxcblx0anEgPSByZXF1aXJlKCdqcXVlcnknKSxcblxuXHQvLyBjb25zdGFudHNcblxuXHRBQ1RJT05fU1dJUEUgPSAnc3dpcGUnLFxuXHRBTklNQVRFX0RVUkFUSU9OID0gMC41O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtaGVyb2VzJztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBJbml0aWFsaXplXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdC8vIE5PVEU6IFNpemVzIGFyZSBzZXBhcnRlZCBieSBweChwaXhlbHMpIGFuZCBwY3QgKHBlcmNlbnRhZ2UpXG5cblx0dmFyIGZ1bGxQY3QgPSAxMDAsXG5cblx0XHRfJGVsLFxuXHRcdF8kc2xpZGVzLFxuXHRcdF8kYWxsU2xpZGVzLFxuXHRcdF8kcHJldmlvdXMsXG5cdFx0XyRuZXh0LFxuXHRcdF8kYWxsSW1hZ2VzLFxuXHRcdF8kaW1hZ2VzLFxuXHRcdF8kbmF2aWdhdGlvbixcblx0XHRfJGFsbFZpZ25ldHRlcyxcblxuXHRcdGNoaWxkcmVuQ291bnQsXG5cdFx0cGFyZW50UHgsXG5cblx0XHRjaGlsZHJlbk1hcmdpblB4LFxuXG5cdFx0Y2hpbGRyZW5QY3QsXG5cdFx0Y2hpbGRyZW5NYXJnaW5QY3QsXG5cblx0XHQvLyBGaW5hbCBFbGVtZW50IFB0Y1xuXG5cdFx0bmV3UGFyZW50UGN0LFxuXHRcdG5ld0NoaWxkcmVuUGN0LFxuXHRcdG5ld01hcmdpblB0YyxcblxuXHRcdC8vIE9wdGlvbnNcblxuXHRcdF9hcnJvd1JpZ2h0LFxuXHRcdF9hcnJvd0xlZnQsXG5cdFx0X25hdmlnYXRpb24sXG5cblxuXHRcdGNhcm91c2VsSXNBY3RpdmUgPSBmYWxzZSxcblx0XHRjb2x1bXNQZXJTaXplLFxuXG5cdFx0Ly8gQ2Fyb3VzZWwgRGF0YVxuXG5cdFx0dG90YWxNb3Zlcyxcblx0XHR0b3RhbE1vdmVzUmlnaHQsXG5cdFx0dG90YWxNb3Zlc0xlZnQsXG5cdFx0cmVzaXplTW92ZXMsXG5cblx0XHRtb3Zlc1BlclNpemUsXG5cdFx0c3dpcGVTZXQsXG5cblx0XHRfaGVyb0ltYWdlQW5pbWF0aW9uRGVsYXksXG5cdFx0X2hlcm9JbWFnZUFuaW1hdGlvbk9uLFxuXHRcdF9hbmltYXRpb25UaW1lcixcblxuXG5cdFx0Y3VycmVudEVsZW1lbnRJbmRleCA9IDE7XG5cblxuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgICovXG5cdFx0X2hlcm9JbWFnZUFuaW1hdGlvbkRlbGF5ID0gd2luZG93LmFzcGVuX2dsb2JhbC5oZXJvSW1hZ2VBbmltYXRpb25EZWxheSB8fCA1MDAwO1xuXHRcdF9oZXJvSW1hZ2VBbmltYXRpb25PbiA9IHdpbmRvdy5hc3Blbl9nbG9iYWwuaGVyb0ltYWdlQW5pbWF0aW9uT247XG5cdFx0LyogZXNsaW50LWVuYWJsZSAqL1xuXG5cdFx0XyRzbGlkZXMgPSBfJGVsLmZpbmQoJy5qcy1oZXJvZXNfX2NvbnRhaW5lciAuaG9tZS1oZXJvZXNfX2NvbnRhaW5lcicpO1xuXHRcdF8kYWxsU2xpZGVzID0gXyRzbGlkZXMuY2hpbGRyZW4oKTtcblxuXHRcdF8kaW1hZ2VzID0gXyRlbC5maW5kKCcuanMtaGVyb2VzX19jb250YWluZXIgLmhvbWUtaGVyb2VzX19pbWFnZXMnKTtcblx0XHRfJGFsbEltYWdlcyA9IF8kaW1hZ2VzLmNoaWxkcmVuKCcuaG9tZS1oZXJvZXNfX2ltYWdlJyk7XG5cdFx0XyRhbGxWaWduZXR0ZXMgPSBfJGltYWdlcy5jaGlsZHJlbignLmhvbWUtaGVyb2VzX192aWduZXR0ZScpO1xuXG5cdFx0XyRwcmV2aW91cyA9IF8kZWwuZmluZCgnLmhvbWUtaGVyb2VzX19hcnJvdy0tdXAnKTtcblx0XHRfJG5leHQgPSBfJGVsLmZpbmQoJy5ob21lLWhlcm9lc19fYXJyb3ctLWRvd24nKTtcblx0XHQvLyBQYXJlbnQgVmFsdWVzXG5cblx0XHRwYXJlbnRQeCA9IF8kc2xpZGVzLndpZHRoKCk7XG5cblx0XHQvLyBDaGlsZHJlbiBWYWx1ZXNcblxuXHRcdGNoaWxkcmVuQ291bnQgPSBfJGFsbFNsaWRlcy5sZW5ndGg7XG5cblx0XHRjaGlsZHJlbk1hcmdpblB4ID0gKHBhcnNlRmxvYXQoXyRhbGxTbGlkZXMuY3NzKCdtYXJnaW4tcmlnaHQnKS5yZXBsYWNlKCdweCcsICcnKSkgK1xuXG5cdFx0XHRwYXJzZUZsb2F0KF8kYWxsU2xpZGVzLmNzcygnbWFyZ2luLWxlZnQnKS5yZXBsYWNlKCdweCcsICcnKSkpO1xuXG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuTUFUQ0hfTUVESUEsIF9yZXNpemUpO1xuXG5cdFx0XyRuYXZpZ2F0aW9uID0gXyRlbC5maW5kKCcuanMtY2Fyb3VzZWxfX25hdmlnYXRpb24nKTtcblxuXHRcdC8vXHRcdEluaXQgQXJyb3dzXG5cblx0XHRfbmF2aWdhdGlvbiA9IG5ldyBOYXZpZ2F0aW9uKF8kbmF2aWdhdGlvbik7XG5cdFx0X2Fycm93UmlnaHQgPSBuZXcgQXJyb3coXyRuZXh0LCAncmlnaHQnLCBiaW5kU3RlcHMpO1xuXHRcdF9hcnJvd0xlZnQgPSBuZXcgQXJyb3coXyRwcmV2aW91cywgJ2xlZnQnLCBiaW5kU3RlcHMpO1xuXG5cdFx0bmF2aWdhdGlvblN0eWxlKCk7XG5cblx0XHRfJGVsLmhhbW1lcigpLm9uKCdzd2lwZXJpZ2h0JywgZnVuY3Rpb24oKSB7XG5cblx0XHRcdGd0bURhdGFQdXNoZXIoXyRwcmV2aW91cy5kYXRhKCdjYXRlZ29yeScpLCBBQ1RJT05fU1dJUEUsIF8kcHJldmlvdXMuZGF0YSgnbGFiZWwnKSk7XG5cdFx0XHRiaW5kU3RlcHMoJ2xlZnQnKTtcblx0XHR9KTtcblxuXHRcdF8kZWwuaGFtbWVyKCkub24oJ3N3aXBlbGVmdCcsIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRndG1EYXRhUHVzaGVyKF8kbmV4dC5kYXRhKCdjYXRlZ29yeScpLCBBQ1RJT05fU1dJUEUsIF8kbmV4dC5kYXRhKCdsYWJlbCcpKTtcblx0XHRcdGJpbmRTdGVwcygncmlnaHQnKTtcblx0XHR9KTtcblxuXHRcdF8kZWwuZmluZCgnLmpzLWNhcm91c2VsX19kb3QnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0ganEodGhpcykuaW5kZXgoKTtcblx0XHRcdGJpbmRTdGVwcyhudWxsLCBpKTtcblx0XHR9KTtcblxuXHRcdHN0YXJ0QW5pbWF0aW9uKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG5hdmlnYXRpb25TdHlsZSgpIHtcblxuXHRcdGlmIChfJGFsbFNsaWRlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGk7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgXyRhbGxTbGlkZXMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0X25hdmlnYXRpb24uY3JlYXRlRG90cygpO1xuXG5cdFx0fVxuXG5cdFx0X25hdmlnYXRpb24uYWN0aXZhdGVEb3QoMSk7XG5cdH1cblxuXHRmdW5jdGlvbiBfcmVzaXplKGUsIHJlc2l6ZSkge1xuXG5cdFx0aWYgKHJlc2l6ZSA+IG1hdGNoTWVkaWEuTUVESVVNX1dJTkRPVykge1xuXG5cdFx0XHRzd2lwZVNldCA9IGZhbHNlO1xuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxO1xuXG5cdFx0fSBlbHNlIGlmIChyZXNpemUgPT09IG1hdGNoTWVkaWEuTUVESVVNX1dJTkRPVykge1xuXG5cdFx0XHRzd2lwZVNldCA9IGZhbHNlO1xuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0c3dpcGVTZXQgPSB0cnVlO1xuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxO1xuXHRcdH1cblxuXHRcdHN0eWxlQ29sdW1ucygpO1xuXG5cdFx0aWYgKGNoaWxkcmVuQ291bnQgPiBjb2x1bXNQZXJTaXplKSB7XG5cblx0XHRcdHJlc2V0U3RlcHMoKTtcblx0XHRcdGNoZWNrU3RhdHVzKHRydWUpO1xuXG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjaGVja1N0YXR1cyhmYWxzZSk7XG5cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiByZXNldFN0ZXBzKCkge1xuXG5cdFx0dG90YWxNb3ZlcyA9ICgoY2hpbGRyZW5Db3VudCAvIG1vdmVzUGVyU2l6ZSkgLSAxKSAtICgoY29sdW1zUGVyU2l6ZSAvIG1vdmVzUGVyU2l6ZSkgLSAxKTtcblxuXHRcdHJlc2l6ZU1vdmVzID0gKGN1cnJlbnRFbGVtZW50SW5kZXggLSAxKSAvIG1vdmVzUGVyU2l6ZTtcblxuXHRcdHRvdGFsTW92ZXNMZWZ0ID0gcmVzaXplTW92ZXMgPiB0b3RhbE1vdmVzID8gdG90YWxNb3ZlcyA6IHJlc2l6ZU1vdmVzO1xuXG5cdFx0dG90YWxNb3Zlc1JpZ2h0ID0gdG90YWxNb3ZlcyAtIHRvdGFsTW92ZXNMZWZ0O1xuXG5cdFx0ZXZhbHVhdGVDb250cm9scygpO1xuXG5cdFx0YW5pbWF0ZSh0b3RhbE1vdmVzTGVmdCk7XG5cblx0XHRfbmF2aWdhdGlvbi5hY3RpdmF0ZURvdChjdXJyZW50RWxlbWVudEluZGV4KTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc3R5bGVDb2x1bW5zKCkge1xuXG5cdFx0Y2hpbGRyZW5NYXJnaW5QY3QgPSBnZXRQZXJjZW50YWdlKGNoaWxkcmVuTWFyZ2luUHgpO1xuXHRcdGNoaWxkcmVuUGN0ID0gKGZ1bGxQY3QgLyBjb2x1bXNQZXJTaXplKSAtIChjaGlsZHJlbk1hcmdpblBjdCk7XG5cblx0XHRuZXdQYXJlbnRQY3QgPSBjaGlsZHJlbkNvdW50ICogKGNoaWxkcmVuUGN0ICsgKGNoaWxkcmVuTWFyZ2luUGN0ICogMikpO1xuXHRcdG5ld01hcmdpblB0YyA9IGZ1bGxQY3QgKiBjaGlsZHJlbk1hcmdpblBjdCAvIChjaGlsZHJlbkNvdW50ICogY2hpbGRyZW5QY3QpO1xuXHRcdG5ld0NoaWxkcmVuUGN0ID0gZnVsbFBjdCAvIGNoaWxkcmVuQ291bnQgLSAobmV3TWFyZ2luUHRjICogMik7XG5cblx0XHRpZiAoc3dpcGVTZXQpIHtcblx0XHRcdF8kc2xpZGVzLmNzcygnd2lkdGgnLCBuZXdQYXJlbnRQY3QgKyAnJScpO1xuXHRcdFx0XyRhbGxTbGlkZXMuY3NzKHtcblx0XHRcdFx0J3dpZHRoJzogbmV3Q2hpbGRyZW5QY3QgKyAnJScsXG5cdFx0XHRcdCdtYXJnaW4tbGVmdCc6IG5ld01hcmdpblB0YyAvIDIgKyAnJSdcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRfJHNsaWRlcy5jc3MoJ3dpZHRoJywgJzEwMCUnKTtcblx0XHRcdF8kYWxsU2xpZGVzLmNzcyh7XG5cdFx0XHRcdCd3aWR0aCc6ICcxMDAlJ1xuXHRcdFx0fSk7XG5cblx0XHR9XG5cblxuXHR9XG5cblx0ZnVuY3Rpb24gY2hlY2tTdGF0dXMoaXNBY3RpdmUpIHtcblxuXHRcdGlmIChjYXJvdXNlbElzQWN0aXZlICE9PSBpc0FjdGl2ZSkge1xuXG5cdFx0XHRjYXJvdXNlbElzQWN0aXZlID0gaXNBY3RpdmU7XG5cblx0XHRcdGNhcm91c2VsSXNBY3RpdmUgPyBhY3RpdmF0ZSgpIDogZGVhY3RpdmF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0IENhbGN1bGF0aW5nIGVsZW1lbnRzXG5cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblx0ZnVuY3Rpb24gZ2V0UGVyY2VudGFnZShlbGVtZW50U2l6ZSkge1xuXG5cdFx0cmV0dXJuIGVsZW1lbnRTaXplIC8gcGFyZW50UHggKiBmdWxsUGN0O1xuXG5cdH1cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCBDYXJvdXNlbCBVdGlsc1xuXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdGZ1bmN0aW9uIGJpbmRTdGVwcyhkaXJlY3Rpb24sIGp1bXApIHtcblx0XHRpZiAodG90YWxNb3Zlc1JpZ2h0ID49IDApIHtcblxuXHRcdFx0dG90YWxNb3Zlc1JpZ2h0ID0gY2FsY3VsYXRlVG90YWxNb3Zlc1JpZ2h0KGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JywganVtcCk7XG5cblx0XHRcdHRvdGFsTW92ZXNMZWZ0ID0gdG90YWxNb3ZlcyAtIHRvdGFsTW92ZXNSaWdodDtcblxuXHRcdFx0Y3VycmVudEVsZW1lbnRJbmRleCA9IHRvdGFsTW92ZXNMZWZ0ICogbW92ZXNQZXJTaXplICsgMTtcblxuXHRcdFx0ZXZhbHVhdGVDb250cm9scygpO1xuXG5cdFx0XHRhbmltYXRlKHRvdGFsTW92ZXNMZWZ0KTtcblxuXHRcdFx0X25hdmlnYXRpb24uYWN0aXZhdGVEb3QoTWF0aC5yb3VuZChjdXJyZW50RWxlbWVudEluZGV4KSk7XG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVUb3RhbE1vdmVzUmlnaHQodCwgaikge1xuXHRcdHZhciB0cjtcblx0XHRpZiAodCAmJiBqPT09dW5kZWZpbmVkKSB7XG5cdFx0XHR0ciA9IHRvdGFsTW92ZXNSaWdodCA+PSAxID8gdG90YWxNb3Zlc1JpZ2h0IC0gMSA6IHRvdGFsTW92ZXNSaWdodCAtIHRvdGFsTW92ZXNSaWdodDtcblx0XHR9IGVsc2UgaWYgKCF0ICYmIGo9PT11bmRlZmluZWQpIHtcblx0XHRcdHRyID0gdG90YWxNb3Zlc0xlZnQgPj0gMSA/IHRvdGFsTW92ZXNSaWdodCArIDEgOiB0b3RhbE1vdmVzUmlnaHQgKyB0b3RhbE1vdmVzTGVmdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dHIgPSAodG90YWxNb3ZlcyAtIGogPj0gMCkgPyB0b3RhbE1vdmVzIC0gaiA6IDA7XG5cdFx0fVxuXHRcdHJldHVybiB0cjtcblx0fVxuXG5cdGZ1bmN0aW9uIGV2YWx1YXRlQ29udHJvbHMoKSB7XG5cblx0XHRfYXJyb3dSaWdodC5zdGF0dXModG90YWxNb3Zlc1JpZ2h0ID4gMCk7XG5cdFx0X2Fycm93TGVmdC5zdGF0dXModG90YWxNb3Zlc0xlZnQgPiAwKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYW5pbWF0ZShkaXN0YW5jZSkge1xuXHRcdGNsZWFyQW5pbWF0aW9uKCk7XG5cdFx0XyRhbGxTbGlkZXMucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cblx0XHRpZiAoc3dpcGVTZXQpIHtcblx0XHRcdFR3ZWVuTGl0ZS50byhfJHNsaWRlcywgQU5JTUFURV9EVVJBVElPTiwge1xuXHRcdFx0XHR4OiAtKGRpc3RhbmNlICogKChuZXdDaGlsZHJlblBjdCArIG5ld01hcmdpblB0YykgKiBtb3Zlc1BlclNpemUpKSArICclJyxcblx0XHRcdFx0ZWFzZTogQ3ViaWMuZWFzZU91dFxuXHRcdFx0fSk7XG5cdFx0XHRfJGFsbFNsaWRlc1tjdXJyZW50RWxlbWVudEluZGV4IC0gMV0uY2xhc3NOYW1lICs9IFwiIGFjdGl2ZVwiO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdF8kYWxsU2xpZGVzW2N1cnJlbnRFbGVtZW50SW5kZXggLSAxXS5jbGFzc05hbWUgKz0gXCIgYWN0aXZlXCI7XG5cdFx0fVxuXG5cdFx0XyRhbGxJbWFnZXMucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0XyRhbGxWaWduZXR0ZXMucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cblx0XHRfJGFsbFZpZ25ldHRlc1tjdXJyZW50RWxlbWVudEluZGV4IC0gMV0uY2xhc3NOYW1lICs9IFwiIGFjdGl2ZVwiO1xuXHRcdF8kYWxsSW1hZ2VzW2N1cnJlbnRFbGVtZW50SW5kZXggLSAxXS5jbGFzc05hbWUgKz0gXCIgYWN0aXZlXCI7XG5cblx0XHRzdGFydEFuaW1hdGlvbigpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhY3RpdmF0ZSgpIHtcblxuXHRcdF9hcnJvd1JpZ2h0LmFjdGl2YXRlKCk7XG5cdFx0X2Fycm93TGVmdC5hY3RpdmF0ZSgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkZWFjdGl2YXRlKCkge1xuXG5cdFx0cmVzZXRTdGVwcygpO1xuXHRcdF9hcnJvd1JpZ2h0LmRlYWN0aXZhdGUoKTtcblx0XHRfYXJyb3dMZWZ0LmRlYWN0aXZhdGUoKTtcblxuXHR9XG5cblx0Ly8gQW5pbWF0aW9uIENvbnRyb2xzXG5cblx0ZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oKSB7XG5cdFx0aWYgKF9oZXJvSW1hZ2VBbmltYXRpb25Pbikge1xuXHRcdFx0X2FuaW1hdGlvblRpbWVyID0gc2V0SW50ZXJ2YWwoc3RlcEFuaW1hdGlvbiwgX2hlcm9JbWFnZUFuaW1hdGlvbkRlbGF5KTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBjbGVhckFuaW1hdGlvbigpIHtcblx0XHRjbGVhckludGVydmFsKF9hbmltYXRpb25UaW1lcik7XG5cdH1cblxuXHRmdW5jdGlvbiBzdGVwQW5pbWF0aW9uKCkge1xuXHRcdGlmICh0b3RhbE1vdmVzUmlnaHQgIT09IDApIHtcblx0XHRcdGJpbmRTdGVwcygncmlnaHQnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VycmVudEVsZW1lbnRJbmRleCA9IDE7XG5cdFx0XHRyZXNldFN0ZXBzKCk7XG5cdFx0fVxuXHR9XG5cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsIi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgZXZlbnRCdXMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50QnVzJyksXG5cdG1hdGNoTWVkaWEgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cy9tYXRjaE1lZGlhJyksXG5cdGd0bURhdGFQdXNoZXIgPSByZXF1aXJlKCcuLi8uLi91dGlscy9ndG1EYXRhUHVzaGVyJyksXG5cdEFycm93ID0gcmVxdWlyZSgnLi4vYXJyb3cnKSxcblx0TmF2aWdhdGlvbiA9IHJlcXVpcmUoJy4uL2Nhcm91c2VsL25hdmlnYXRpb24nKSxcblx0anEgPSByZXF1aXJlKCdqcXVlcnknKSxcblxuXHQvLyBjb25zdGFudHNcblxuXHRBQ1RJT05fU1dJUEUgPSAnc3dpcGUnLFxuXHRBTklNQVRFX0RVUkFUSU9OID0gMC41O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtaWRlYXMtaXNzdWVzJztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBJbml0aWFsaXplXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdC8vIE5PVEU6IFNpemVzIGFyZSBzZXBhcnRlZCBieSBweChwaXhlbHMpIGFuZCBwY3QgKHBlcmNlbnRhZ2UpXG5cblx0dmFyIGZ1bGxQY3QgPSAxMDAsXG5cblx0XHRfJGVsLFxuXHRcdF8kY29udGFpbmVyLFxuXHRcdF8kYWxsQ2hpbGRyZW4sXG5cdFx0XyRwcmV2aW91cyxcblx0XHRfJG5leHQsXG5cdFx0XyRuYXZpZ2F0aW9uLFxuXG5cdFx0Y2hpbGRyZW5Db3VudCxcblx0XHRwYXJlbnRQeCxcblxuXHRcdGNoaWxkcmVuTWFyZ2luUHgsXG5cblx0XHRjaGlsZHJlblBjdCxcblx0XHRjaGlsZHJlbk1hcmdpblBjdCxcblxuXHRcdC8vIEZpbmFsIEVsZW1lbnQgUHRjXG5cblx0XHRuZXdQYXJlbnRQY3QsXG5cdFx0bmV3Q2hpbGRyZW5QY3QsXG5cdFx0bmV3TWFyZ2luUHRjLFxuXG5cdFx0Ly8gT3B0aW9uc1xuXG5cdFx0X2Fycm93UmlnaHQsXG5cdFx0X2Fycm93TGVmdCxcblx0XHRfbmF2aWdhdGlvbixcblxuXG5cdFx0Y2Fyb3VzZWxJc0FjdGl2ZSA9IGZhbHNlLFxuXHRcdGNvbHVtc1BlclNpemUsXG5cblx0XHQvLyBDYXJvdXNlbCBEYXRhXG5cblx0XHR0b3RhbE1vdmVzLFxuXHRcdHRvdGFsTW92ZXNSaWdodCxcblx0XHR0b3RhbE1vdmVzTGVmdCxcblx0XHRyZXNpemVNb3ZlcyxcblxuXHRcdG1vdmVzUGVyU2l6ZSxcblxuXHRcdGN1cnJlbnRFbGVtZW50SW5kZXggPSAxO1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0XyRjb250YWluZXIgPSBfJGVsLmZpbmQoJy5qcy1tYWdhemluZS1jYXJvdXNlbF9fY29udGFpbmVyJyk7XG5cdFx0XyRhbGxDaGlsZHJlbiA9IF8kY29udGFpbmVyLmNoaWxkcmVuKCk7XG5cblx0XHRfJHByZXZpb3VzID0gXyRlbC5maW5kKCcuanMtY2Fyb3VzZWxfX3ByZXZpb3VzJyk7XG5cdFx0XyRuZXh0ID0gXyRlbC5maW5kKCcuanMtY2Fyb3VzZWxfX25leHQnKTtcblxuXHRcdC8vIFBhcmVudCBWYWx1ZXNcblxuXHRcdHBhcmVudFB4ID0gXyRjb250YWluZXIud2lkdGgoKTtcblxuXHRcdC8vIENoaWxkcmVuIFZhbHVlc1xuXG5cdFx0Y2hpbGRyZW5Db3VudCA9IF8kYWxsQ2hpbGRyZW4ubGVuZ3RoO1xuXG5cdFx0Y2hpbGRyZW5NYXJnaW5QeCA9IChwYXJzZUZsb2F0KF8kYWxsQ2hpbGRyZW4uY3NzKCdtYXJnaW4tcmlnaHQnKS5yZXBsYWNlKCdweCcsICcnKSkgK1xuXG5cdFx0XHRwYXJzZUZsb2F0KF8kYWxsQ2hpbGRyZW4uY3NzKCdtYXJnaW4tbGVmdCcpLnJlcGxhY2UoJ3B4JywgJycpKSk7XG5cblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5NQVRDSF9NRURJQSwgX3Jlc2l6ZSk7XG5cblx0XHRfJG5hdmlnYXRpb24gPSBfJGVsLmZpbmQoJy5qcy1jYXJvdXNlbF9fbmF2aWdhdGlvbicpO1xuXG5cdFx0Ly9cdFx0SW5pdCBBcnJvd3NcblxuXHRcdF9uYXZpZ2F0aW9uID0gbmV3IE5hdmlnYXRpb24oXyRuYXZpZ2F0aW9uKTtcblx0XHRfYXJyb3dSaWdodCA9IG5ldyBBcnJvdyhfJG5leHQsICdyaWdodCcsIGJpbmRTdGVwcyk7XG5cdFx0X2Fycm93TGVmdCA9IG5ldyBBcnJvdyhfJHByZXZpb3VzLCAnbGVmdCcsIGJpbmRTdGVwcyk7XG5cblx0XHRuYXZpZ2F0aW9uU3R5bGUoKTtcblxuXHRcdF8kZWwuaGFtbWVyKCkub24oJ3N3aXBlcmlnaHQnLCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Z3RtRGF0YVB1c2hlcihfJHByZXZpb3VzLmRhdGEoJ2NhdGVnb3J5JyksIEFDVElPTl9TV0lQRSwgXyRwcmV2aW91cy5kYXRhKCdsYWJlbCcpKTtcblx0XHRcdGJpbmRTdGVwcygnbGVmdCcpO1xuXHRcdH0pO1xuXG5cdFx0XyRlbC5oYW1tZXIoKS5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24oKSB7XG5cblx0XHRcdGd0bURhdGFQdXNoZXIoXyRuZXh0LmRhdGEoJ2NhdGVnb3J5JyksIEFDVElPTl9TV0lQRSwgXyRuZXh0LmRhdGEoJ2xhYmVsJykpO1xuXHRcdFx0YmluZFN0ZXBzKCdyaWdodCcpO1xuXHRcdH0pO1xuXG5cdFx0XyRlbC5maW5kKCcuanMtY2Fyb3VzZWxfX2RvdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSBqcSh0aGlzKS5pbmRleCgpO1xuXHRcdFx0YmluZFN0ZXBzKG51bGwsIGkpO1xuXHRcdH0pO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBuYXZpZ2F0aW9uU3R5bGUoKSB7XG5cblx0XHR2YXIgaTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBfJGFsbENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdF9uYXZpZ2F0aW9uLmNyZWF0ZURvdHMoKTtcblxuXHRcdH1cblxuXHRcdF9uYXZpZ2F0aW9uLmFjdGl2YXRlRG90KDEpO1xuXHR9XG5cblx0ZnVuY3Rpb24gX3Jlc2l6ZShlLCByZXNpemUpIHtcblxuXHRcdGlmIChyZXNpemUgPj0gbWF0Y2hNZWRpYS5MQVJHRV9XSU5ET1cpIHtcblxuXHRcdFx0ZnVsbFBjdCA9IDc1O1xuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxO1xuXG5cdFx0fSBlbHNlIGlmIChyZXNpemUgPT09IG1hdGNoTWVkaWEuTUVESVVNX1dJTkRPVykge1xuXG5cdFx0XHRmdWxsUGN0ID0gODA7XG5cdFx0XHRtb3Zlc1BlclNpemUgPSAxO1xuXHRcdFx0Y29sdW1zUGVyU2l6ZSA9IDE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRmdWxsUGN0ID0gMTAwO1xuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxO1xuXHRcdH1cblxuXHRcdHN0eWxlQ29sdW1ucygpO1xuXG5cdFx0aWYgKGNoaWxkcmVuQ291bnQgPiBjb2x1bXNQZXJTaXplKSB7XG5cblx0XHRcdHJlc2V0U3RlcHMoKTtcblx0XHRcdGNoZWNrU3RhdHVzKHRydWUpO1xuXG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjaGVja1N0YXR1cyhmYWxzZSk7XG5cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiByZXNldFN0ZXBzKCkge1xuXG5cdFx0dG90YWxNb3ZlcyA9ICgoY2hpbGRyZW5Db3VudCAvIG1vdmVzUGVyU2l6ZSkgLSAxKSAtICgoY29sdW1zUGVyU2l6ZSAvIG1vdmVzUGVyU2l6ZSkgLSAxKTtcblxuXHRcdHJlc2l6ZU1vdmVzID0gKGN1cnJlbnRFbGVtZW50SW5kZXggLSAxKSAvIG1vdmVzUGVyU2l6ZTtcblxuXHRcdHRvdGFsTW92ZXNMZWZ0ID0gcmVzaXplTW92ZXMgPiB0b3RhbE1vdmVzID8gdG90YWxNb3ZlcyA6IHJlc2l6ZU1vdmVzO1xuXG5cdFx0dG90YWxNb3Zlc1JpZ2h0ID0gdG90YWxNb3ZlcyAtIHRvdGFsTW92ZXNMZWZ0O1xuXG5cdFx0ZXZhbHVhdGVDb250cm9scygpO1xuXHRcdGFuaW1hdGUodG90YWxNb3Zlc0xlZnQpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzdHlsZUNvbHVtbnMoKSB7XG5cblx0XHRjaGlsZHJlbk1hcmdpblBjdCA9IGdldFBlcmNlbnRhZ2UoY2hpbGRyZW5NYXJnaW5QeCk7XG5cdFx0Y2hpbGRyZW5QY3QgPSAoZnVsbFBjdCAvIGNvbHVtc1BlclNpemUpIC0gKGNoaWxkcmVuTWFyZ2luUGN0KTtcblxuXHRcdG5ld1BhcmVudFBjdCA9IGNoaWxkcmVuQ291bnQgKiAoY2hpbGRyZW5QY3QgKyAoY2hpbGRyZW5NYXJnaW5QY3QgKiAyKSk7XG5cdFx0bmV3TWFyZ2luUHRjID0gZnVsbFBjdCAqIGNoaWxkcmVuTWFyZ2luUGN0IC8gKGNoaWxkcmVuQ291bnQgKiBjaGlsZHJlblBjdCk7XG5cdFx0bmV3Q2hpbGRyZW5QY3QgPSBmdWxsUGN0IC8gY2hpbGRyZW5Db3VudCAtIChuZXdNYXJnaW5QdGMgKiAyKTtcblxuXHRcdF8kY29udGFpbmVyLmNzcygnd2lkdGgnLCBuZXdQYXJlbnRQY3QgKyAnJScpO1xuXHRcdF8kYWxsQ2hpbGRyZW4uY3NzKHtcblx0XHRcdCd3aWR0aCc6IG5ld0NoaWxkcmVuUGN0ICsgJyUnLFxuXHRcdFx0J21hcmdpbic6IG5ld01hcmdpblB0YyAvIDIgKyAnJSdcblx0XHR9KTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY2hlY2tTdGF0dXMoaXNBY3RpdmUpIHtcblxuXHRcdGlmIChjYXJvdXNlbElzQWN0aXZlICE9PSBpc0FjdGl2ZSkge1xuXG5cdFx0XHRjYXJvdXNlbElzQWN0aXZlID0gaXNBY3RpdmU7XG5cblx0XHRcdGNhcm91c2VsSXNBY3RpdmUgPyBhY3RpdmF0ZSgpIDogZGVhY3RpdmF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0IENhbGN1bGF0aW5nIGVsZW1lbnRzXG5cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblx0ZnVuY3Rpb24gZ2V0UGVyY2VudGFnZShlbGVtZW50U2l6ZSkge1xuXG5cdFx0cmV0dXJuIGVsZW1lbnRTaXplIC8gcGFyZW50UHggKiBmdWxsUGN0O1xuXG5cdH1cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCBDYXJvdXNlbCBVdGlsc1xuXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdGZ1bmN0aW9uIGJpbmRTdGVwcyhkaXJlY3Rpb24sIGp1bXApIHtcblx0XHRpZiAodG90YWxNb3Zlc1JpZ2h0ID49IDApIHtcblxuXHRcdFx0dG90YWxNb3Zlc1JpZ2h0ID0gY2FsY3VsYXRlVG90YWxNb3Zlc1JpZ2h0KGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JywganVtcCk7XG5cblx0XHRcdHRvdGFsTW92ZXNMZWZ0ID0gdG90YWxNb3ZlcyAtIHRvdGFsTW92ZXNSaWdodDtcblxuXHRcdFx0Y3VycmVudEVsZW1lbnRJbmRleCA9IHRvdGFsTW92ZXNMZWZ0ICogbW92ZXNQZXJTaXplICsgMTtcblxuXHRcdFx0ZXZhbHVhdGVDb250cm9scygpO1xuXG5cdFx0XHRhbmltYXRlKHRvdGFsTW92ZXNMZWZ0KTtcblxuXHRcdFx0X25hdmlnYXRpb24uYWN0aXZhdGVEb3QoTWF0aC5yb3VuZChjdXJyZW50RWxlbWVudEluZGV4KSk7XG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVUb3RhbE1vdmVzUmlnaHQodCwgaikge1xuXHRcdHZhciB0cjtcblx0XHRpZiAodCAmJiBqPT09dW5kZWZpbmVkKSB7XG5cdFx0XHR0ciA9IHRvdGFsTW92ZXNSaWdodCA+PSAxID8gdG90YWxNb3Zlc1JpZ2h0IC0gMSA6IHRvdGFsTW92ZXNSaWdodCAtIHRvdGFsTW92ZXNSaWdodDtcblx0XHR9IGVsc2UgaWYgKCF0ICYmIGo9PT11bmRlZmluZWQpIHtcblx0XHRcdHRyID0gdG90YWxNb3Zlc0xlZnQgPj0gMSA/IHRvdGFsTW92ZXNSaWdodCArIDEgOiB0b3RhbE1vdmVzUmlnaHQgKyB0b3RhbE1vdmVzTGVmdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dHIgPSAodG90YWxNb3ZlcyAtIGogPj0gMCkgPyB0b3RhbE1vdmVzIC0gaiA6IDA7XG5cdFx0fVxuXHRcdHJldHVybiB0cjtcblx0fVxuXG5cdGZ1bmN0aW9uIGV2YWx1YXRlQ29udHJvbHMoKSB7XG5cblx0XHRfYXJyb3dSaWdodC5zdGF0dXModG90YWxNb3Zlc1JpZ2h0ID4gMCk7XG5cdFx0X2Fycm93TGVmdC5zdGF0dXModG90YWxNb3Zlc0xlZnQgPiAwKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYW5pbWF0ZShkaXN0YW5jZSkge1xuXG5cdFx0VHdlZW5MaXRlLnRvKF8kY29udGFpbmVyLCBBTklNQVRFX0RVUkFUSU9OLCB7XG5cdFx0XHR4OiAtKGRpc3RhbmNlICogKChuZXdDaGlsZHJlblBjdCArIG5ld01hcmdpblB0YykgKiBtb3Zlc1BlclNpemUpKSArICclJyxcblx0XHRcdGVhc2U6IEN1YmljLmVhc2VPdXRcblx0XHR9KS5ldmVudENhbGxiYWNrKFwib25TdGFydFwiLCBmdW5jdGlvbigpIHtcblx0XHRcdF8kYWxsQ2hpbGRyZW4ucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0XHRfJGFsbENoaWxkcmVuW2N1cnJlbnRFbGVtZW50SW5kZXggLSAxXS5jbGFzc05hbWUgKz0gXCIgYWN0aXZlXCI7XG5cdFx0fSkuZXZlbnRDYWxsYmFjayhcIm9uQ29tcGxldGVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBfJGFsbENoaWxkcmVuLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdFx0Ly8gXyRhbGxDaGlsZHJlbltjdXJyZW50RWxlbWVudEluZGV4LTFdLmNsYXNzTmFtZSArPSBcIiBhY3RpdmVcIjtcblx0XHR9KTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWN0aXZhdGUoKSB7XG5cblx0XHRfYXJyb3dSaWdodC5hY3RpdmF0ZSgpO1xuXHRcdF9hcnJvd0xlZnQuYWN0aXZhdGUoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGVhY3RpdmF0ZSgpIHtcblxuXHRcdHJlc2V0U3RlcHMoKTtcblx0XHRfYXJyb3dSaWdodC5kZWFjdGl2YXRlKCk7XG5cdFx0X2Fycm93TGVmdC5kZWFjdGl2YXRlKCk7XG5cblx0fVxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwiLy8gcHJvamVjdCBkZXBlbmRlbmNpZXNcbnZhciBnZXRVcmxQYXJhbWV0ZXIgPSByZXF1aXJlKCcuLi91dGlscy9nZXRVcmxQYXJhbWV0ZXInKSxcblxuLy8gY29uc3RhbnRzXG5cdElOVEVSVkFMX0RFTEFZID0gMzAwLFxuXHRNQVhfSU5URVJWQUxfVElDS1MgPSAxMDtcblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtam9pbkF1dG9maWxsJztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cdHZhciBfJGVsLCBcdFxuXHRcdF8kZm9ybTtcblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRJbml0aWFsaXphdGlvblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXG5cdFx0XyRmb3JtID0gXyRlbC5maW5kKCdmb3JtJyk7XG5cblx0XHRmb3JtQ2hlY2soKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZm9ybUNoZWNrKCkge1xuXG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0aW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChjaGVja0Zvcm0sIElOVEVSVkFMX0RFTEFZKTtcblxuXHRcdGZ1bmN0aW9uIGNoZWNrRm9ybSgpIHtcblxuXHRcdFx0aSsrO1xuXG5cdFx0XHRpZiAoXyRmb3JtWzBdKSB7XG5cblx0XHRcdFx0Y2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG5cdFx0XHRcdGdldFVybCgpO1xuXG5cdFx0XHR9IGVsc2UgaWYgKGkgPj0gTUFYX0lOVEVSVkFMX1RJQ0tTKSB7XG5cblx0XHRcdFx0Y2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VXJsKCkge1xuXG5cdFx0dmFyIGVtYWlsID0gZ2V0VXJsUGFyYW1ldGVyKCdlbWFpbCcpO1xuXG5cdFx0aWYoZW1haWwpIHtcblxuXHRcdFx0XyRmb3JtLmZpbmQoJ2lucHV0W25hbWUqPVwiZmllbGRzX2VtYWlsXCJdJyApLnZhbChlbWFpbCk7XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCIvLyBWZW5kb3IgZGVwZW5kZW5jaWVzXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpLFxuXG4vLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xuXHRMb2FkZXIgPSByZXF1aXJlKCcuLi91dGlscy9Mb2FkZXInKSxcblx0bW9kdWxlRmFjdG9yeSA9IHJlcXVpcmUoJy4uL2NvcmUvbW9kdWxlRmFjdG9yeScpLFxuXHRCYXNpY1ZpZXcgPSByZXF1aXJlKCcuLi91dGlscy9CYXNpY1ZpZXcnKSxcblx0cGFyc2VMb2FkZWRSZXNwb25zZSA9IHJlcXVpcmUoJy4uL3V0aWxzL3BhcnNlTG9hZGVkUmVzcG9uc2UnKSxcblx0ZGVmZXJyZWRBamF4ID0gcmVxdWlyZSgnLi4vdXRpbHMvZGVmZXJyZWRBamF4JyksXG5cbi8vIENvbnN0YW50c1xuXHRTRUxFQ1RPUl9DT05URU5UID0gJy5qcy1sb2FkTW9yZS1jb250ZW50Jyxcblx0U0VMRUNUT1JfTE9BREVSID0gJy5qcy1sb2FkTW9yZV9fbG9hZGVyJyxcblx0U0VMRUNUT1JfQ1RBID0gJy5qcy1sb2FkTW9yZV9fY3RhJztcblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gXHRNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtbG9hZE1vcmUnO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblxuXHR2YXIgXyRlbCxcblx0XHRfJGN0YUVsLFxuXHRcdF9sb2FkZXIsXG5cdFx0X2N0YSxcblx0XHRfcGFnaW5hdGlvblVybCxcblx0XHRfaXNMb2FkaW5nO1xuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgXHRJbml0aWFsaXphdGlvblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXHRcdF9pc0xvYWRpbmcgPSBmYWxzZTtcblxuXHRcdF9sb2FkZXIgPSBuZXcgTG9hZGVyKCk7XG5cdFx0X2N0YSA9IG5ldyBCYXNpY1ZpZXcoKTtcblxuXHRcdHNldHVwVmlld3MoKTtcblxuXG5cdH1cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBcdFZpZXcgSGFuZGxpbmdcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gc2V0dXBWaWV3cygpIHtcblxuXHRcdHZhciAkbG9hZGVyID0gXyRlbC5maW5kKFNFTEVDVE9SX0xPQURFUiksXG5cdFx0XHQkY29udGVudCA9ICQoU0VMRUNUT1JfQ09OVEVOVCk7XG5cblx0XHRfJGN0YUVsID0gXyRlbC5maW5kKFNFTEVDVE9SX0NUQSk7XG5cblxuXHRcdGlmKCEkY29udGVudC5sZW5ndGgpIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvcignYC5qcy1sb2FkTW9yZWAgbW9kdWxlIG5lZWRzIGEgYCcgKyBTRUxFQ1RPUl9DT05URU5UICsgJ2AgdG8gcGFyc2UgdGhlIGxvYWRlZCBjb250ZW50LicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmKCEkbG9hZGVyLmxlbmd0aCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCdgLmpzLWxvYWRNb3JlYCBtb2R1bGUgbmVlZHMgYSBgJyArIFNFTEVDVE9SX0xPQURFUiArICdgIHRvIHNob3cgdGhlIGxvYWRpbmcgYW5pbWF0aW9uLicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmKCFfJGN0YUVsLmxlbmd0aCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCdgLmpzLWxvYWRNb3JlYCBtb2R1bGUgbmVlZHMgYSBgJyArIFNFTEVDVE9SX0NUQSArICdgIHRvIGZldGNoIHRoZSBVUkwgYW5kIGFjdHVhbGx5IHRyaWdnZXIgdGhlIGNvbnRlbnQgbG9hZC4nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblxuXHRcdF9wYWdpbmF0aW9uVXJsID0gXyRjdGFFbC5hdHRyKCdocmVmJyk7XG5cblx0XHRfY3RhLmluaXQoXyRjdGFFbCk7XG5cdFx0X2xvYWRlci5pbml0KCRsb2FkZXIpO1xuXG5cdFx0X2N0YS5zaG93KCk7XG5cblx0XHRfJGN0YUVsLmNsaWNrKG9uQ3RhQ2xpY2spO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblxuXHRcdF9wYWdpbmF0aW9uVXJsID0gbnVsbDtcblxuXHRcdF8kY3RhRWwub2ZmKCk7XG5cdFx0XyRjdGFFbCA9IG51bGw7XG5cblx0XHRfbG9hZGVyLmRlc3Ryb3koKTtcblx0XHRfbG9hZGVyID0gbnVsbDtcblxuXHRcdF9jdGEuZGVzdHJveSgpO1xuXHRcdF9jdGEgPSBudWxsO1xuXG5cdFx0XyRlbC5vZmYoKTtcblx0XHRfJGVsLnJlbW92ZSgpO1xuXHRcdF8kZWwgPSBudWxsO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBcdEV2ZW50IEhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uQ3RhQ2xpY2soZSkge1xuXHRcdHZhciBieXBhc3MgPSBfJGVsLmRhdGEoJ2J5cGFzcycpO1xuXG5cdFx0aWYgKGJ5cGFzcyA9PT0gdHJ1ZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRsb2FkQ29udGVudCgpO1xuXHR9XG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgXHRMb2FkIEhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGxvYWRDb250ZW50KCkge1xuXG5cdFx0dmFyIHN0b3JlZFJlc3BvbnNlO1xuXG5cdFx0aWYoX2lzTG9hZGluZyAhPT0gZmFsc2UpIHtcblxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0X2lzTG9hZGluZyA9IHRydWU7XG5cblx0XHQvLyBXZSdyZSBoYW5kbGluZyB0aGUgYW5pbWF0aW9uIGJlZm9yZSBhY3R1YWxseSBsb2FkaW5nIHRvIG1ha2UgaXQgZmVlbCBsaWtlIGl0J3MgYWN0dWFsbHkgbG9hZGluZy5cblx0XHRyZXR1cm4gX2N0YS5oaWRlKClcblx0XHRcdC50aGVuKF9sb2FkZXIuc2hvdylcblxuXHRcdFx0Ly8gTm90IHN1cmUgaG93IHRvIHBhc3MgcmVzcG9uc2VzIHRvIGEgZGVlcGVyIHByb21pc2UsIHNvIHN0b3JpbmcgaXQgaW4gYmV0d2Vlbi5cblx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gZGVmZXJyZWRBamF4KF9wYWdpbmF0aW9uVXJsKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeyBzdG9yZWRSZXNwb25zZSA9IHBhcnNlTG9hZGVkUmVzcG9uc2UocmVzcG9uc2UsIFNFTEVDVE9SX0NPTlRFTlQsICcuanMtbG9hZE1vcmUtY29udGVudF9fcmVtb3ZlJyk7IH0pXG5cdFx0XHQudGhlbihfbG9hZGVyLmhpZGUpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XyRlbC5hZnRlcihzdG9yZWRSZXNwb25zZSk7XG5cdFx0XHR9KVxuXG5cdFx0XHQvLyBEZXN0cm95cyBpdHNlbGYgc28gdGhlIG1vZHVsZUZhY3RvcnkgY2FuIHJlLWluc3RhbnRpYXRlIHRoZSBuZXdseSBpbmplY3RlZCBsb2FkTW9yZSBtb2R1bGUuXG5cdFx0XHQudGhlbihkZXN0cm95KVxuXHRcdFx0LnRoZW4obW9kdWxlRmFjdG9yeS5ydW4pXG5cblx0XHRcdC5mYWlsKGZ1bmN0aW9uKGUpIHtcblxuXHRcdFx0XHRfaXNMb2FkaW5nID0gZmFsc2U7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvcignRW5jb3VudGVyZWQgaXNzdWVzIGR1cmluZyBMb2FkIE1vcmUnLCBlKTtcblx0XHRcdH0pXG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0IFx0UHVibGljIE1ldGhvZHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCJcbi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpLFxuXG4vLyBjb25zdGFudHNcblxuXHRDT05URU5UX0FOSU1BVEVfSU5fRFVSQVRJT04gPSAwLjI2LFxuXG5cdENPTlRFTlRfQU5JTUFURV9PVVRfRFVSQVRJT04gPSAwLjIzLFxuXHRXUkFQUEVSX0FOSU1BVEVfSU5fRFVSQVRJT04gPSAwLjM1LFxuXHRXUkFQUEVSX0FOSU1BVEVfT1VUX0RVUkFUSU9OID0gMC4yNSxcblx0Q09OVEVOVF9PRkZTRVQgPSAyMDtcblxuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0IE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1vdmVybGF5JztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0SW5pdGlhbGl6YXRpb25cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblx0dmFyIF8kZWwsXG5cdFx0XyRjb250ZW50LFxuXHRcdF8kdmlkZW9XcmFwcGVyLFxuXHRcdF8kdG9nZ2xlLFxuXHRcdF9pc1Nob3duID0gZmFsc2UsXG5cdFx0X3lvdXR1YmVJZDtcblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXG5cdFx0XyRjb250ZW50ID0gXyRlbC5maW5kKCcuanMtb3ZlcmxheV9fY29udGVudCcpO1xuXHRcdF8kdmlkZW9XcmFwcGVyID0gXyRlbC5maW5kKCcuanMtb3ZlcmxheV9fdmlkZW8td3JhcHBlcicpO1xuXHRcdF8kdG9nZ2xlID0gJCgnLmpzLW92ZXJsYXktdG9nZ2xlJyk7XG5cdFx0X3lvdXR1YmVJZCA9IF8kZWwuZGF0YSgneW91dHViZS1pZCcpO1xuXG5cdFx0XyR0b2dnbGUuY2xpY2sob25Ub2dnbGVDbGljayk7XG5cdH1cblxuXHRmdW5jdGlvbiBvblRvZ2dsZUNsaWNrKGUpIHtcblxuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGlmKF9pc1Nob3duKSB7XG5cblx0XHRcdGhpZGUoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHNob3coKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBzaG93KCkge1xuXG5cdFx0X2lzU2hvd24gPSB0cnVlO1xuXG5cdFx0JCgnYm9keScpLmNzcygnb3ZlcmZsb3cteScsICdoaWRkZW4nKTtcblx0XHRfJGVsLmNzcygnZGlzcGxheScsICdmbGV4Jyk7XG5cblx0XHRUd2VlbkxpdGUudG8oXyRjb250ZW50LCBXUkFQUEVSX0FOSU1BVEVfSU5fRFVSQVRJT04sIHt5OiAnMCUnLCBlYXNlOkV4cG8uZWFzZU91dH0pO1xuXHRcdFR3ZWVuTGl0ZS50byhfJGVsLCBDT05URU5UX0FOSU1BVEVfSU5fRFVSQVRJT04sIHtvcGFjaXR5OiAxLCBlYXNlOkV4cG8uZWFzZU91dH0pO1xuXG5cdFx0aWYgKF95b3V0dWJlSWQpIHtcblxuXHRcdFx0XyR2aWRlb1dyYXBwZXIuYXBwZW5kKCc8aWZyYW1lIGNsYXNzPVwib3ZlcmxheV9fdmlkZW9cIiBzcmM9XCJodHRwczovL3d3dy55b3V0dWJlLW5vY29va2llLmNvbS9lbWJlZC8nICsgX3lvdXR1YmVJZCArICc/YXV0b3BsYXk9MFwiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nKTtcblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGhpZGUoKSB7XG5cblx0XHRfaXNTaG93biA9IGZhbHNlO1xuXG5cdFx0JCgnYm9keScpLmNzcygnb3ZlcmZsb3cteScsICdhdXRvJyk7XG5cblx0XHRUd2VlbkxpdGUudG8oXyRjb250ZW50LCBXUkFQUEVSX0FOSU1BVEVfT1VUX0RVUkFUSU9OLCB7eTogQ09OVEVOVF9PRkZTRVQgKyAnJScsIGVhc2U6RXhwby5lYXNlT3V0fSk7XG5cblx0XHRUd2VlbkxpdGUudG8oXyRlbCwgQ09OVEVOVF9BTklNQVRFX09VVF9EVVJBVElPTiwge29wYWNpdHk6IDAsIGVhc2U6UXVpbnQuZWFzZU91dCwgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7XG5cblx0XHRcdF8kZWwuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuXHRcdFx0aWYoX3lvdXR1YmVJZCkge1xuXG5cdFx0XHRcdF8kdmlkZW9XcmFwcGVyLmZpbmQoJ2lmcmFtZScpLnJlbW92ZSgpO1xuXHRcdFx0fVxuXG5cdFx0fX0pO1xuXHR9XG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpLFxuXG5cdFNDUklQVF9UQUcgPSAnJywvLzxzY3JpcHQgYXN5bmMgc3JjPVwiLy9lbWJlZHIuZmxpY2tyLmNvbS9hc3NldHMvY2xpZW50LWNvZGUuanNcIiBjaGFyc2V0PVwidXRmLThcIj48L3NjcmlwdD4nLFxuXG4vLyBjb25zdGFudHNcblx0Q09OVEVOVF9BTklNQVRFX0lOX0RVUkFUSU9OID0gMC4yNixcblxuXHRDT05URU5UX0FOSU1BVEVfT1VUX0RVUkFUSU9OID0gMC4yMyxcblx0V1JBUFBFUl9BTklNQVRFX0lOX0RVUkFUSU9OID0gMC4zNSxcblx0V1JBUFBFUl9BTklNQVRFX09VVF9EVVJBVElPTiA9IDAuMjUsXG5cdENPTlRFTlRfT0ZGU0VUID0gMjA7XG5cblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBNb2R1bGUgQ29uZmlndXJhdGlvblxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtb3ZlcmxheUZsaWNrcic7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdEluaXRpYWxpemF0aW9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdHZhciBfJGVsLFxuXHRcdF9oYXNFbWJlZENvZGUsXG5cdFx0X2h0bWxEYXRhLFxuXHRcdF8kYm9keSxcblx0XHRfJGNvbnRlbnQsXG5cdFx0XyRjb250YWluZXIsXG5cdFx0XyR0b2dnbGUsXG5cdFx0X2lzU2hvd24gPSBmYWxzZTtcblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXHRcdF9oYXNFbWJlZENvZGUgPSBmYWxzZTtcblxuXHRcdF9odG1sRGF0YSA9IF8kZWwuZGF0YSgnZmxpY2tyLWVtYmVkJyk7XG5cblx0XHRfJGJvZHkgPSAkKCdib2R5Jyk7XG5cdFx0XyRjb250YWluZXIgPSBfJGVsLmZpbmQoJy5qcy1vdmVybGF5RmxpY2tyX19jb250YWluZXInKTtcblx0XHRfJGNvbnRlbnQgPSBfJGVsLmZpbmQoJy5qcy1vdmVybGF5RmxpY2tyX19jb250ZW50Jyk7XG5cdFx0XyR0b2dnbGUgPSBfJGVsLmZpbmQoJy5qcy1vdmVybGF5RmxpY2tyX190b2dnbGUnKTtcblxuXHRcdF8kZWwuY2xpY2sob25Ub2dnbGVDbGljayk7XG5cdFx0XyR0b2dnbGUuY2xpY2sob25Ub2dnbGVDbGljayk7XG5cblx0XHRUd2VlbkxpdGUudG8oXyRjb250ZW50LCAwLCB7eTogQ09OVEVOVF9PRkZTRVQgKyAnJScsIGVhc2U6RXhwby5lYXNlT3V0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBvblRvZ2dsZUNsaWNrKGUpIHtcblxuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGlmKF9pc1Nob3duKSB7XG5cblx0XHRcdGhpZGUoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHNob3coKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBzaG93KCkge1xuXG5cdFx0X2lzU2hvd24gPSB0cnVlO1xuXG5cdFx0XyRib2R5LmNzcygnb3ZlcmZsb3cteScsICdoaWRkZW4nKTtcblx0XHRfJGNvbnRhaW5lci5jc3MoJ2Rpc3BsYXknLCAnZmxleCcpO1xuXG5cdFx0VHdlZW5MaXRlLnRvKF8kY29udGVudCwgV1JBUFBFUl9BTklNQVRFX0lOX0RVUkFUSU9OLCB7eTogJzAlJywgZWFzZTpFeHBvLmVhc2VPdXR9KTtcblx0XHRUd2VlbkxpdGUudG8oXyRjb250YWluZXIsIENPTlRFTlRfQU5JTUFURV9JTl9EVVJBVElPTiwge29wYWNpdHk6IDEsIGVhc2U6RXhwby5lYXNlT3V0fSk7XG5cblx0XHRpZighX2hhc0VtYmVkQ29kZSkge1xuXG5cdFx0XHRhZGRFbWJlZENvZGUoKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBoaWRlKCkge1xuXG5cdFx0X2lzU2hvd24gPSBmYWxzZTtcblxuXHRcdF8kYm9keS5jc3MoJ292ZXJmbG93LXknLCAnYXV0bycpO1xuXG5cdFx0VHdlZW5MaXRlLnRvKF8kY29udGVudCwgV1JBUFBFUl9BTklNQVRFX09VVF9EVVJBVElPTiwge3k6IENPTlRFTlRfT0ZGU0VUICsgJyUnLCBlYXNlOkV4cG8uZWFzZU91dH0pO1xuXG5cdFx0VHdlZW5MaXRlLnRvKF8kY29udGFpbmVyLCBDT05URU5UX0FOSU1BVEVfT1VUX0RVUkFUSU9OLCB7b3BhY2l0eTogMCwgZWFzZTpRdWludC5lYXNlT3V0LCBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XyRjb250YWluZXIuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuXHRcdH19KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGFkZEVtYmVkQ29kZSgpIHtcblxuXHRcdF9oYXNFbWJlZENvZGUgPSB0cnVlO1xuXHRcdF8kY29udGVudC5odG1sKF9odG1sRGF0YSArIFNDUklQVF9UQUcpO1xuXHR9XG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCIvLyBWZW5kb3IgZGVwZW5kZW5jaWVzXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpLFxuXG4vLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xuXHRwYXJzZUxvYWRlZFJlc3BvbnNlID0gcmVxdWlyZSgnLi4vdXRpbHMvcGFyc2VMb2FkZWRSZXNwb25zZScpLFxuXHRtb2R1bGVGYWN0b3J5ID0gcmVxdWlyZSgnLi4vY29yZS9tb2R1bGVGYWN0b3J5JyksXG5cdGRlZmVycmVkQWpheCA9IHJlcXVpcmUoJy4uL3V0aWxzL2RlZmVycmVkQWpheCcpLFxuXHRMb2FkZXIgPSByZXF1aXJlKCcuLi91dGlscy9Mb2FkZXInKSxcblxuLy8gQ29uc3RhbnRzXG5cdFBBR0VfUEFUSCA9ICcvc2VhcmNoLycsXG5cdENMQVNTX0lTX0ZJTFRFUklORyA9ICdpcy1maWx0ZXJpbmcnLFxuXHRTRUxFQ1RPUl9MT0FERVIgPSAnLmpzLXNlYXJjaF9fbG9hZGVyJyxcblx0U0VMRUNUT1JfRk9STSA9ICcuc2VhcmNoX19iYXInLFxuXHRTRUxFQ1RPUl9JTlBVVCA9ICcuc2VhcmNoX19iYXJfX2lucHV0Jyxcblx0U0VMRUNUT1JfQ09OVEVOVCA9ICcuanMtbG9hZE1vcmUtY29udGVudCc7XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiBcdE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1zZWFyY2gnO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblx0dmFyIF93aW4gPSB3aW5kb3csXG5cdFx0X2Jhc2VVcmwsXG5cdFx0XyRlbCxcblx0XHRfJGlucHV0LFxuXHRcdF8kZm9ybSxcblx0XHRfJGNvbnRlbnQsXG5cdFx0X2xvYWRlcjtcblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBcdEluaXRpYWxpemF0aW9uXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF9iYXNlVXJsID0gbG9jYXRpb24ub3JpZ2luO1xuXHRcdF8kZWwgPSAkZWw7XG5cdFx0XyRmb3JtID0gXyRlbC5maW5kKFNFTEVDVE9SX0ZPUk0pO1xuXHRcdF8kaW5wdXQgPSBfJGVsLmZpbmQoU0VMRUNUT1JfSU5QVVQpO1xuXHRcdF8kY29udGVudCA9IF8kZWwuZmluZChTRUxFQ1RPUl9DT05URU5UKTtcblxuXHRcdF93aW4uYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBvblBvcFN0YXRlKTtcblxuXHRcdF9sb2FkZXIgPSBuZXcgTG9hZGVyKCk7XG5cdFx0X2xvYWRlci5pbml0KF8kZWwuZmluZChTRUxFQ1RPUl9MT0FERVIpKTtcblxuXHRcdF8kaW5wdXQuZm9jdXMoZnVuY3Rpb24oKSB7XG5cblx0XHRcdGlmKF8kaW5wdXQudmFsKCkgPT09ICdzZWFyY2gnKSB7XG5cblx0XHRcdFx0XyRpbnB1dC52YWwoJycpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0XyRmb3JtLnN1Ym1pdChvbkZvcm1TdWJtaXQpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvbkZvcm1TdWJtaXQoZSkge1xuXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XyRpbnB1dC5ibHVyKCk7XG5cblxuXHRcdHB1c2hTdGF0ZShlbmNvZGVVUklDb21wb25lbnQoXyRpbnB1dC52YWwoKSkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2V0dXBMb2FkKHF1ZXJ5KSB7XG5cblx0XHRpZihxdWVyeSA9PT0gJycpIHtcblxuXHRcdFx0Ly8gaWdub3JpbmcgbG9hZGluZyBlbXB0eSBzZWFyY2gsIGp1c3QgcmVtb3ZlIHRoZSBjdXJyZW50IHJlc3VsdHNcblx0XHRcdF8kY29udGVudC5maW5kKCcuY2FyZC1zZWFyY2gsIC5jYXJkLWdyaWRfX2xvYWQtbW9yZScpLnJlbW92ZSgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0XyRjb250ZW50LmFkZENsYXNzKENMQVNTX0lTX0ZJTFRFUklORyk7XG5cdFx0XHRfJGlucHV0LnZhbChkZWNvZGVVUklDb21wb25lbnQocXVlcnkpKTtcblxuXG5cdFx0XHRUd2VlbkxpdGUua2lsbERlbGF5ZWRDYWxsc1RvKHN0YXJ0TG9hZGluZyk7XG5cdFx0XHRUd2VlbkxpdGUuZGVsYXllZENhbGwoMC4xLCBzdGFydExvYWRpbmcsIFtxdWVyeV0pOy8vZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gc3RhcnRMb2FkaW5nKHF1ZXJ5KXtcblxuXHRcdF9sb2FkZXIuc2hvdygpO1xuXG5cdFx0ZGVmZXJyZWRBamF4KF9iYXNlVXJsICsgUEFHRV9QQVRIICsgcXVlcnkpXG5cdFx0XHQudGhlbihzaG93TmV3Q29udGVudCk7XG5cdH1cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBcdExvYWQgSGFuZGxpbmdcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gc2hvd05ld0NvbnRlbnQocmVzcG9uc2UpIHtcblxuXHRcdHZhciBwYXJzZWRSZXNwb25zZSA9IHBhcnNlTG9hZGVkUmVzcG9uc2UocmVzcG9uc2UsIFNFTEVDVE9SX0NPTlRFTlQpO1xuXG5cdFx0X2xvYWRlci5oaWRlKClcblx0XHRcdC50aGVuKF9sb2FkZXIuZGlzcG9zZSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uKCl7XG5cblx0XHRcdFx0XyRjb250ZW50Lmh0bWwocGFyc2VkUmVzcG9uc2UpO1xuXG5cdFx0XHRcdF9sb2FkZXIuaW5pdCgkKFNFTEVDVE9SX0xPQURFUikpO1xuXG5cdFx0XHRcdF8kY29udGVudC5yZW1vdmVDbGFzcyhDTEFTU19JU19GSUxURVJJTkcpO1xuXG5cdFx0XHRcdG1vZHVsZUZhY3RvcnkucnVuKF8kZWwpO1xuXHRcdFx0fSlcblx0XHRcdC5mYWlsKGZ1bmN0aW9uKGUpIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdFbmNvdW50ZXJlZCBpc3N1ZXMgZHVyaW5nIFNlYXJjaCcsIGUpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBvblBvcFN0YXRlKCkge1xuXG5cdFx0c2V0dXBMb2FkKF93aW4ubG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZShQQUdFX1BBVEgsICcnKSk7XG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU3RhdGUocXVlcnkpIHtcblxuXHRcdHZhciB1cmw7XG5cblx0XHRpZihfd2luLmhpc3RvcnkpIHtcblxuXHRcdFx0dXJsID0gX2Jhc2VVcmwgKyBQQUdFX1BBVEggKyBxdWVyeTtcblxuXHRcdFx0X3dpbi5oaXN0b3J5LnB1c2hTdGF0ZShcblx0XHRcdFx0eyB1cmw6IHVybCB9LFxuXHRcdFx0XHQnJyxcblx0XHRcdFx0dXJsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHNldHVwTG9hZChxdWVyeSk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0IFx0UHVibGljIE1ldGhvZHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCIvLyBQcm9qZWN0IGRlcGVuZGVuY2llc1xudmFyIG1hdGNoTWVkaWEgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50cy9tYXRjaE1lZGlhJyksXG5cdGV2ZW50QnVzID0gcmVxdWlyZSgnLi4vY29yZS9ldmVudEJ1cycpLFxuXHRjc3NQcmVmaXggPSByZXF1aXJlKCcuLi91dGlscy9jc3NQcmVmaXgnKSxcblxuLy8gY29uc3RhbnRzXG5cdE9GRlNFVF9GQUNUT1IgPSAwLjEyNSwvLyBiYXNlZCBvbiB0aGUgYHRvcDoxMi41JWAgaW4gdGhlIGAuaXMtZml4ZWRgIGNsYXNzZXNcblx0VFJBTlNGT1JNX1BSRUZJWCA9IGNzc1ByZWZpeC5qcyArICdUcmFuc2Zvcm0nLFxuXHRDTEFTU19JU19GSVhFRCA9ICdpcy1maXhlZCc7XG5cblxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gTW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLXNoYXJlQmFyJztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cblx0dmFyIF8kZWwsXG5cdFx0XyRjb250YWluZXIsXG5cdFx0X3dpbmRvd0hlaWdodCxcblx0XHRfY29udGFpbmVySGVpZ2h0LFxuXHRcdF8kcGFyZW50LFxuXHRcdF9kb250U25hcCxcblx0XHRfaXNGaXhlZCA9IGZhbHNlLFxuXHRcdF9vZmZzZXQgPSAwLFxuXHRcdF9wb3NpdGlvbmluZ09mZnNldCA9IDAsXG5cdFx0X3Njcm9sbFRvcCA9IDA7XG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgSW5pdGlhbGl6YXRpb25cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBpbml0KCRlbCkge1xuXG5cdFx0XyRlbCA9ICRlbDtcblx0XHRfJGNvbnRhaW5lciA9IF8kZWwuZmluZCgnLnNoYXJlX19jb250YWluZXInKTtcblx0XHRfJHBhcmVudCA9IF8kZWwucGFyZW50KCk7XG5cblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5TQ1JPTEwsIG9uU2Nyb2xsKTtcblx0XHRldmVudEJ1cy5vbihldmVudEJ1cy5SRVNJWkUsIG9uUmVzaXplKTtcblx0fVxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0IEV2ZW50IGhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdGZ1bmN0aW9uIG9uU2Nyb2xsKGUsIHNjcm9sbFZhbHVlKSB7XG5cblx0XHRfc2Nyb2xsVG9wID0gc2Nyb2xsVmFsdWUuc2Nyb2xsVG9wO1xuXG5cdFx0cmVkcmF3KCk7XG5cdH1cblxuXHRmdW5jdGlvbiBvblJlc2l6ZShlLCB3aWR0aCwgaGVpZ2h0KSB7XG5cblx0XHR2YXIgbmV3V2lkdGggPSBNYXRoLnJvdW5kKF8kZWwud2lkdGgoKSAvIDIpO1xuXG5cdFx0X3dpbmRvd0hlaWdodCA9IGhlaWdodDtcblx0XHRfY29udGFpbmVySGVpZ2h0ID0gXyRjb250YWluZXIuaGVpZ2h0KCk7XG5cdFx0X3Bvc2l0aW9uaW5nT2Zmc2V0ID0gaGVpZ2h0ICogT0ZGU0VUX0ZBQ1RPUjtcblxuXHRcdF9kb250U25hcCA9IHdpZHRoIDwgbWF0Y2hNZWRpYS5MQVJHRV9XSU5ET1c7XG5cblx0XHRpZighX2RvbnRTbmFwKSB7XG5cblx0XHRcdF8kY29udGFpbmVyLndpZHRoKG5ld1dpZHRoKTtcblx0XHRcdF8kY29udGFpbmVyLmNzcygnbWFyZ2luLWxlZnQnLCBNYXRoLnJvdW5kKG5ld1dpZHRoIC8gMikpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0XyRjb250YWluZXIuY3NzKCd3aWR0aCcsICcnKTtcblx0XHRcdF8kY29udGFpbmVyLmNzcygnbWFyZ2luLWxlZnQnLCAnJyk7XG5cdFx0fVxuXG5cdFx0cmVkcmF3KCk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0IEhlbHBlcnNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiByZWRyYXcoKSB7XG5cblx0XHR2YXIgcGFyZW50T2Zmc2V0VG9wID0gXyRwYXJlbnQub2Zmc2V0KCkudG9wLFxuXHRcdFx0cGFyZW50UG9zaXRpb25pbmdPZmZzZXQsXG5cdFx0XHRzbmFwVG9Ub3AsXG5cdFx0XHRzbmFwVG9Cb3R0b207XG5cblx0XHRpZihfZG9udFNuYXApIHtcblxuXHRcdFx0dXBkYXRlSXNGaXhlZChmYWxzZSk7XG5cdFx0XHR1cGRhdGVPZmZzZXQoMCk7XG5cblx0XHRcdGlmKF8kcGFyZW50LmhlaWdodCgpIC0gX3dpbmRvd0hlaWdodCArIHBhcmVudE9mZnNldFRvcCA8PSBfc2Nyb2xsVG9wKSB7XG5cblx0XHRcdFx0aGlkZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHNob3coKTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHBhcmVudFBvc2l0aW9uaW5nT2Zmc2V0ID0gXyRwYXJlbnQuaGVpZ2h0KCkgLSBfcG9zaXRpb25pbmdPZmZzZXQgLSBfY29udGFpbmVySGVpZ2h0O1xuXHRcdFx0c25hcFRvVG9wID0gcGFyZW50T2Zmc2V0VG9wID49IF9zY3JvbGxUb3AgKyBfcG9zaXRpb25pbmdPZmZzZXQ7XG5cdFx0XHRzbmFwVG9Cb3R0b20gPSBwYXJlbnRPZmZzZXRUb3AgKyBwYXJlbnRQb3NpdGlvbmluZ09mZnNldCA8PSBfc2Nyb2xsVG9wICsgX3Bvc2l0aW9uaW5nT2Zmc2V0O1xuXHRcdH1cblxuXG5cdFx0aWYoc25hcFRvVG9wKSB7XG5cblx0XHRcdHVwZGF0ZUlzRml4ZWQoZmFsc2UpO1xuXHRcdFx0dXBkYXRlT2Zmc2V0KDApO1xuXG5cdFx0fSBlbHNlIGlmKHNuYXBUb0JvdHRvbSkge1xuXG5cdFx0XHR1cGRhdGVJc0ZpeGVkKGZhbHNlKTtcblx0XHRcdHVwZGF0ZU9mZnNldChNYXRoLnJvdW5kKHBhcmVudFBvc2l0aW9uaW5nT2Zmc2V0KSk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR1cGRhdGVJc0ZpeGVkKHRydWUpO1xuXHRcdFx0dXBkYXRlT2Zmc2V0KDApO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGhpZGUoKSB7XG5cblx0XHRfJGVsLmFkZENsYXNzKCdpcy1oaWRkZW4nKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNob3coKSB7XG5cblx0XHRfJGVsLnJlbW92ZUNsYXNzKCdpcy1oaWRkZW4nKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUlzRml4ZWQobmV3SXNGaXhlZCkge1xuXG5cdFx0aWYoX2lzRml4ZWQgIT09IG5ld0lzRml4ZWQpIHtcblxuXHRcdFx0X2lzRml4ZWQgPSBuZXdJc0ZpeGVkO1xuXG5cdFx0XHRpZihfaXNGaXhlZCkge1xuXG5cdFx0XHRcdF8kZWwuYWRkQ2xhc3MoQ0xBU1NfSVNfRklYRUQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF8kZWwucmVtb3ZlQ2xhc3MoQ0xBU1NfSVNfRklYRUQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZU9mZnNldChuZXdPZmZzZXQpIHtcblxuXHRcdGlmKF9vZmZzZXQgIT09IG5ld09mZnNldCkge1xuXG5cdFx0XHRfb2Zmc2V0ID0gbmV3T2Zmc2V0O1xuXG5cdFx0XHRpZihfb2Zmc2V0ID4gMCkge1xuXG5cdFx0XHRcdF8kZWwuY3NzKFRSQU5TRk9STV9QUkVGSVgsICd0cmFuc2xhdGVZKCcgKyBfb2Zmc2V0ICsgJ3B4KScpO1xuXHRcdFx0XHRfJGVsLmNzcyhUUkFOU0ZPUk1fUFJFRklYLCAndHJhbnNsYXRlM2QoMCwgJyArIF9vZmZzZXQgKyAncHgsIDApJyk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XyRlbC5jc3MoVFJBTlNGT1JNX1BSRUZJWCwgJycpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwidmFyICQgPSByZXF1aXJlKCdqcXVlcnknKSxcblxuXHRORVRXT1JLX0ZBQ0VCT09LID0gJ2ZhY2Vib29rJyxcblx0TkVUV09SS19UV0lUVEVSID0gJ3R3aXR0ZXInO1xuXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0TW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5leHBvcnRzLnNlbGVjdG9yID0gJy5qcy1zb2NpYWxTaGFyZSc7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXHR2YXIgXyRlbCxcblx0XHRfbmV0d29yaztcblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRJbml0aWFsaXphdGlvblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIGluaXQoJGVsKSB7XG5cblx0XHRfJGVsID0gJGVsO1xuXHRcdF9uZXR3b3JrID0gXyRlbC5kYXRhKCduZXR3b3JrJyk7XG5cblx0XHRfJGVsLmNsaWNrKG9uQ2xpY2spO1xuXG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRFdmVudCBIYW5kbGluZ1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG5cblx0XHR2YXIgdGl0bGUgPSBlbmNvZGVVUklDb21wb25lbnQoJCgndGl0bGUnKS5odG1sKCkpLFxuXHRcdFx0dXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuXHRcdHN3aXRjaChfbmV0d29yaykge1xuXG5cdFx0XHRjYXNlIE5FVFdPUktfRkFDRUJPT0s6XG5cblx0XHRcdFx0b3BlbkxpbmsoJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIvc2hhcmVyLnBocD91PScgKyB1cmwpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIE5FVFdPUktfVFdJVFRFUjpcblxuXHRcdFx0XHRvcGVuTGluaygnaHR0cHM6Ly90d2l0dGVyLmNvbS9pbnRlbnQvdHdlZXQ/JyArICd0ZXh0PScgKyB0aXRsZSArICcmdXJsPScgKyB1cmwgKyAnJnZpYT1hc3Blbmluc3RpdHV0ZScpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRIZWxwZXJzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9wZW5MaW5rKHVybCkge1xuXG5cdFx0dmFyIGFuY2hvckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG5cdFx0YW5jaG9yRWwudGFyZ2V0ID0gJ19ibGFuayc7XG5cdFx0YW5jaG9yRWwuaHJlZiA9IHVybDtcblxuXHRcdGNvbnNvbGUubG9nKGFuY2hvckVsKTtcblxuXHRcdGFuY2hvckVsLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0UHVibGljIE1ldGhvZHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCIvLyBjb25zdGFudHNcbnZhciBDTEFTU19JU19PUEVOID0gJ2lzLW9wZW4nO1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtc3ViTmF2JztcblxuZXhwb3J0cy5jb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKCkge1xuXG5cdHZhciBfJGVsLFxuXHRcdF8kdG9nZ2xlRWw7XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0SW5pdGlhbGl6YXRpb25cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuXHRmdW5jdGlvbiBpbml0KCRlbCkge1xuXG5cdFx0XyRlbCA9ICRlbDtcblx0XHRfJHRvZ2dsZUVsID0gXyRlbC5maW5kKCcuanMtc3ViTmF2X190b2dnbGUnKTtcblxuXHRcdF8kdG9nZ2xlRWwuY2xpY2sob25Ub2dnbGVDbGljayk7XG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRFdmVudCBIYW5kbGluZ1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uVG9nZ2xlQ2xpY2soZSkge1xuXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYoXyRlbC5oYXNDbGFzcyhDTEFTU19JU19PUEVOKSkge1xuXG5cdFx0XHRfJGVsLnJlbW92ZUNsYXNzKENMQVNTX0lTX09QRU4pXG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfJGVsLmFkZENsYXNzKENMQVNTX0lTX09QRU4pXG5cdFx0fVxuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0UHVibGljIE1ldGhvZHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0dGhpcy5pbml0ID0gaW5pdDtcbn07XG4iLCIvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gSWRlYSB0YWtlbiBmcm9tIGh0dHA6Ly9vc3ZhbGRhcy5pbmZvL2NhY2hpbmctc3ZnLXNwcml0ZS1pbi1sb2NhbHN0b3JhZ2VcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vIFByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpLFxuXG4vLyBjb25zdGFudHNcblx0TE9DQUxfU1RPUkFHRV9LRVlfSU5MSU5FX1NWRyA9ICdpbmxpbmVTVkdkYXRhJyxcblx0TE9DQUxfU1RPUkFHRV9LRVlfUkVWSVNJT04gPSAnaW5saW5lU1ZHcmV2JyxcblxuLy8gc2VsZWN0b3JzXG5cdF93aW4gPSB3aW5kb3csXG5cdF9kb2MgPSBkb2N1bWVudCxcblxuLy8gZ2xvYmFsIHZhcnNcblx0X2hhc0xvY2FsU3RvcmFnZSA9ICdsb2NhbFN0b3JhZ2UnIGluIF93aW4gJiYgX3dpblsnbG9jYWxTdG9yYWdlJ10gIT09IG51bGw7XG5cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgTW9kdWxlIENvbmZpZ3VyYXRpb25cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbmV4cG9ydHMuc2VsZWN0b3IgPSAnLmpzLXN2Z0ljb25Mb2FkZXInO1xuXG5leHBvcnRzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7XG5cblxuXHR2YXIgX3N2Z1BhdGgsXG5cdFx0XyRlbCxcblx0XHRSRVZJU0lPTiA9IDIsXG5cdFx0X2RhdGE7XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBcdEluaXRpYWxpemF0aW9uXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cdFx0X3N2Z1BhdGggPSBfJGVsLmRhdGEoJ3N2Zy1wYXRoJyk7XG5cblx0XHQvLyBpZiBTVkcgaXMgbm90IHN1cHBvcnRlZCwgYWJvcnRcblx0XHRpZighX2RvYy5jcmVhdGVFbGVtZW50TlMgfHwgIV9kb2MuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKS5jcmVhdGVTVkdSZWN0KSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIGlmIGxvY2FsIHN0b3JhZ2UgaXMgYXZhaWxhYmxlIGFuZCB0aGUgcmV2aXNpb24gaXMgY3VycmVudCwgZmV0Y2ggdGhlIGRhdGEgZnJvbSBsb2NhbCBzdG9yYWdlXG5cdFx0aWYoX2hhc0xvY2FsU3RvcmFnZSAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWV9SRVZJU0lPTikgPT09IFJFVklTSU9OKSB7XG5cblx0XHRcdF9kYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVlfSU5MSU5FX1NWRyk7XG5cblx0XHRcdC8vIGlmIHdlIGFjdHVhbGx5IGhhdmUgZGF0YSwgd2UgY2FuIHJldHVybiBhbmQgZ28gb24gd2l0aCBvdXIgbGl2ZXNcblx0XHRcdGlmKF9kYXRhKSB7XG5cblx0XHRcdFx0cHJlcGVuZFN2ZygpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQkLmFqYXgoX3N2Z1BhdGgse2RhdGFUeXBlOid0ZXh0J30pXG5cdFx0XHQuZG9uZShvblN2Z1BhdGhMb2FkZWQpXG5cdH1cblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0IFx0UHJpdmF0ZSBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdGZ1bmN0aW9uIG9uU3ZnUGF0aExvYWRlZChkYXRhKSB7XG5cblx0XHRfZGF0YSA9IGRhdGE7XG5cblx0XHRwcmVwZW5kU3ZnKCk7XG5cdFx0c3RvcmVMb2NhbGx5KCk7XG5cdH1cblxuXHRmdW5jdGlvbiBzdG9yZUxvY2FsbHkoKSB7XG5cblx0XHRpZiAoX2hhc0xvY2FsU3RvcmFnZSkge1xuXG5cdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWV9JTkxJTkVfU1ZHLCBfZGF0YSk7XG5cdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWV9SRVZJU0lPTiwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHByZXBlbmRTdmcoKSB7XG5cblx0XHRfJGVsLnByZXBlbmQoX2RhdGEpO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBcdFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG59O1xuIiwiLy8gUHJvamVjdCBkZXBlbmRlbmNpZXNcbnZhciBldmVudEJ1cyA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvZXZlbnRCdXMnKSxcblx0bWF0Y2hNZWRpYSA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvZXZlbnRzL21hdGNoTWVkaWEnKSxcblx0Z3RtRGF0YVB1c2hlciA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2d0bURhdGFQdXNoZXInKSxcblx0TmF2aWdhdGlvbiA9IHJlcXVpcmUoJy4uL2Nhcm91c2VsL25hdmlnYXRpb24nKSxcblx0anEgPSByZXF1aXJlKCdqcXVlcnknKSxcblxuXHQvLyBjb25zdGFudHNcblxuXHRBQ1RJT05fU1dJUEUgPSAnc3dpcGUnLFxuXHRBTklNQVRFX0RVUkFUSU9OID0gMC41O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIE1vZHVsZSBDb25maWd1cmF0aW9uXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuZXhwb3J0cy5zZWxlY3RvciA9ICcuanMtdG9wLWV2ZW50LWxvY2F0aW9ucyc7XG5cbmV4cG9ydHMuY29uc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgSW5pdGlhbGl6ZVxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXHQvLyBOT1RFOiBTaXplcyBhcmUgc2VwYXJ0ZWQgYnkgcHgocGl4ZWxzKSBhbmQgcGN0IChwZXJjZW50YWdlKVxuXG5cdHZhciBmdWxsUGN0ID0gMTAwLFxuXG5cdFx0XyRlbCxcblx0XHRfJGNvbnRhaW5lcixcblx0XHRfJGFsbENoaWxkcmVuLFxuXHRcdF8kbmF2aWdhdGlvbixcblxuXHRcdGNoaWxkcmVuQ291bnQsXG5cdFx0cGFyZW50UHgsXG5cblx0XHRjaGlsZHJlbk1hcmdpblB4LFxuXG5cdFx0Y2hpbGRyZW5QY3QsXG5cdFx0Y2hpbGRyZW5NYXJnaW5QY3QsXG5cblx0XHQvLyBGaW5hbCBFbGVtZW50IFB0Y1xuXG5cdFx0bmV3UGFyZW50UGN0LFxuXHRcdG5ld0NoaWxkcmVuUGN0LFxuXHRcdG5ld01hcmdpblB0YyxcblxuXHRcdF9uYXZpZ2F0aW9uLFxuXG5cdFx0Y2Fyb3VzZWxJc0FjdGl2ZSA9IGZhbHNlLFxuXHRcdGNvbHVtc1BlclNpemUsXG5cblx0XHQvLyBDYXJvdXNlbCBEYXRhXG5cblx0XHR0b3RhbE1vdmVzLFxuXHRcdHRvdGFsTW92ZXNSaWdodCxcblx0XHR0b3RhbE1vdmVzTGVmdCxcblx0XHRyZXNpemVNb3ZlcyxcblxuXHRcdG1vdmVzUGVyU2l6ZSxcblxuXHRcdGN1cnJlbnRFbGVtZW50SW5kZXggPSAxO1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdF8kZWwgPSAkZWw7XG5cblxuXHRcdF8kY29udGFpbmVyID0gXyRlbC5maW5kKCcuanMtdG9wLWV2ZW50LWxvY2F0aW9uc19fY29udGFpbmVyJyk7XG5cdFx0XyRhbGxDaGlsZHJlbiA9IF8kY29udGFpbmVyLmNoaWxkcmVuKCk7XG5cblx0XHQvLyBQYXJlbnQgVmFsdWVzXG5cblx0XHRwYXJlbnRQeCA9IF8kY29udGFpbmVyLndpZHRoKCk7XG5cblx0XHQvLyBDaGlsZHJlbiBWYWx1ZXNcblxuXHRcdGNoaWxkcmVuQ291bnQgPSBfJGFsbENoaWxkcmVuLmxlbmd0aDtcblxuXHRcdGNoaWxkcmVuTWFyZ2luUHggPSAocGFyc2VGbG9hdChfJGFsbENoaWxkcmVuLmNzcygnbWFyZ2luLXJpZ2h0JykucmVwbGFjZSgncHgnLCAnJykpICtcblxuXHRcdFx0cGFyc2VGbG9hdChfJGFsbENoaWxkcmVuLmNzcygnbWFyZ2luLWxlZnQnKS5yZXBsYWNlKCdweCcsICcnKSkpO1xuXG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuTUFUQ0hfTUVESUEsIF9yZXNpemUpO1xuXG5cdFx0XyRuYXZpZ2F0aW9uID0gXyRlbC5maW5kKCcuanMtY2Fyb3VzZWxfX25hdmlnYXRpb24nKTtcblxuXHRcdC8vXHRcdEluaXQgQXJyb3dzXG5cblx0XHRfbmF2aWdhdGlvbiA9IG5ldyBOYXZpZ2F0aW9uKF8kbmF2aWdhdGlvbik7XG5cblx0XHRuYXZpZ2F0aW9uU3R5bGUoKTtcblxuXG5cdFx0XyRlbC5oYW1tZXIoKS5vbignc3dpcGVyaWdodCcsIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRndG1EYXRhUHVzaGVyKFwiRXZlbnRzX1VwY29taW5nIEV2ZW50c1wiLCBBQ1RJT05fU1dJUEUsIFwiTGVmdCBOYXZcIik7XG5cdFx0XHRiaW5kU3RlcHMoJ2xlZnQnKTtcblx0XHR9KTtcblxuXHRcdF8kZWwuaGFtbWVyKCkub24oJ3N3aXBlbGVmdCcsIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRndG1EYXRhUHVzaGVyKFwiRXZlbnRzX1VwY29taW5nIEV2ZW50c1wiLCBBQ1RJT05fU1dJUEUsIFwiUmlnaHQgTmF2XCIpO1xuXHRcdFx0YmluZFN0ZXBzKCdyaWdodCcpO1xuXHRcdH0pO1xuXG5cdFx0XyRlbC5maW5kKCcuanMtY2Fyb3VzZWxfX2RvdCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSBqcSh0aGlzKS5pbmRleCgpO1xuXHRcdFx0YmluZFN0ZXBzKG51bGwsIGkpO1xuXHRcdH0pO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBuYXZpZ2F0aW9uU3R5bGUoKSB7XG5cblx0XHRpZiAoXyRhbGxDaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGk7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgXyRhbGxDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRfbmF2aWdhdGlvbi5jcmVhdGVEb3RzKCk7XG5cblx0XHR9XG5cblx0XHRfbmF2aWdhdGlvbi5hY3RpdmF0ZURvdCgxKTtcblx0fVxuXG5cdGZ1bmN0aW9uIF9yZXNpemUoZSwgcmVzaXplKSB7XG5cblx0XHRpZiAocmVzaXplID49IG1hdGNoTWVkaWEuTEFSR0VfV0lORE9XKSB7XG5cblx0XHRcdG1vdmVzUGVyU2l6ZSA9IDI7XG5cdFx0XHRjb2x1bXNQZXJTaXplID0gNTtcblxuXHRcdH0gZWxzZSBpZiAocmVzaXplID09PSBtYXRjaE1lZGlhLk1FRElVTV9XSU5ET1cpIHtcblxuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bW92ZXNQZXJTaXplID0gMTtcblx0XHRcdGNvbHVtc1BlclNpemUgPSAxLjE7XG5cdFx0fVxuXG5cblx0XHRpZiAoY2hpbGRyZW5Db3VudCA+IGNvbHVtc1BlclNpemUpIHtcblxuXHRcdFx0c3R5bGVDb2x1bW5zKHRydWUpO1xuXHRcdFx0Y2hlY2tTdGF0dXModHJ1ZSk7XG5cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHN0eWxlQ29sdW1ucyhmYWxzZSk7XG5cdFx0XHRjaGVja1N0YXR1cyhmYWxzZSk7XG5cblx0XHR9XG5cdFx0cmVzZXRTdGVwcygpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZXNldFN0ZXBzKCkge1xuXG5cdFx0dG90YWxNb3ZlcyA9ICgoY2hpbGRyZW5Db3VudCAvIG1vdmVzUGVyU2l6ZSkgLSAxKSAtICgoY29sdW1zUGVyU2l6ZSAvIG1vdmVzUGVyU2l6ZSkgLSAxKTtcblxuXHRcdHJlc2l6ZU1vdmVzID0gKGN1cnJlbnRFbGVtZW50SW5kZXggLSAxKSAvIG1vdmVzUGVyU2l6ZTtcblxuXHRcdHRvdGFsTW92ZXNMZWZ0ID0gcmVzaXplTW92ZXMgPiB0b3RhbE1vdmVzID8gdG90YWxNb3ZlcyA6IHJlc2l6ZU1vdmVzO1xuXG5cdFx0dG90YWxNb3Zlc1JpZ2h0ID0gdG90YWxNb3ZlcyAtIHRvdGFsTW92ZXNMZWZ0O1xuXG5cdFx0YW5pbWF0ZSh0b3RhbE1vdmVzTGVmdCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN0eWxlQ29sdW1ucyh0KSB7XG5cblx0XHRjaGlsZHJlbk1hcmdpblBjdCA9IGdldFBlcmNlbnRhZ2UoY2hpbGRyZW5NYXJnaW5QeCk7XG5cdFx0Y2hpbGRyZW5QY3QgPSAoZnVsbFBjdCAvIGNvbHVtc1BlclNpemUpIC0gKGNoaWxkcmVuTWFyZ2luUGN0KTtcblxuXHRcdG5ld1BhcmVudFBjdCA9IGNoaWxkcmVuQ291bnQgKiAoY2hpbGRyZW5QY3QgKyAoY2hpbGRyZW5NYXJnaW5QY3QgKiAyKSk7XG5cdFx0bmV3TWFyZ2luUHRjID0gZnVsbFBjdCAqIGNoaWxkcmVuTWFyZ2luUGN0IC8gKGNoaWxkcmVuQ291bnQgKiBjaGlsZHJlblBjdCk7XG5cdFx0bmV3Q2hpbGRyZW5QY3QgPSBmdWxsUGN0IC8gY2hpbGRyZW5Db3VudCAtIChuZXdNYXJnaW5QdGMgKiAyKTtcblxuXG5cdFx0aWYgKHQpIHtcblx0XHRcdF8kY29udGFpbmVyLmNzcygnd2lkdGgnLCBuZXdQYXJlbnRQY3QgKyAnJScpO1xuXHRcdFx0XyRhbGxDaGlsZHJlbi5jc3Moe1xuXHRcdFx0XHQnd2lkdGgnOiBuZXdDaGlsZHJlblBjdCArICclJyxcblx0XHRcdFx0J21hcmdpbic6IG5ld01hcmdpblB0YyAvIDIgKyAnJSdcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRfJGNvbnRhaW5lci5jc3MoJ3dpZHRoJywgJycpO1xuXHRcdFx0XyRhbGxDaGlsZHJlbi5jc3Moe1xuXHRcdFx0XHQnd2lkdGgnOiAnJyxcblx0XHRcdFx0J21hcmdpbic6ICcnXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gXyRlbE9mZnNldCA9IF8kZWwucG9zaXRpb24oKS5sZWZ0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjaGVja1N0YXR1cyhpc0FjdGl2ZSkge1xuXG5cdFx0aWYgKGNhcm91c2VsSXNBY3RpdmUgIT09IGlzQWN0aXZlKSB7XG5cblx0XHRcdGNhcm91c2VsSXNBY3RpdmUgPSBpc0FjdGl2ZTtcblxuXHRcdFx0Y2Fyb3VzZWxJc0FjdGl2ZSA/IGFjdGl2YXRlKCkgOiBkZWFjdGl2YXRlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQgQ2FsY3VsYXRpbmcgZWxlbWVudHNcblxuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXHRmdW5jdGlvbiBnZXRQZXJjZW50YWdlKGVsZW1lbnRTaXplKSB7XG5cblx0XHRyZXR1cm4gZWxlbWVudFNpemUgLyBwYXJlbnRQeCAqIGZ1bGxQY3Q7XG5cblx0fVxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0IENhcm91c2VsIFV0aWxzXG5cblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblx0ZnVuY3Rpb24gYmluZFN0ZXBzKGRpcmVjdGlvbiwganVtcCkge1xuXHRcdGlmICh0b3RhbE1vdmVzUmlnaHQgPj0gMCkge1xuXG5cdFx0XHR0b3RhbE1vdmVzUmlnaHQgPSBjYWxjdWxhdGVUb3RhbE1vdmVzUmlnaHQoZGlyZWN0aW9uID09PSAncmlnaHQnLCBqdW1wKTtcblxuXHRcdFx0dG90YWxNb3Zlc0xlZnQgPSB0b3RhbE1vdmVzIC0gdG90YWxNb3Zlc1JpZ2h0O1xuXG5cdFx0XHRjdXJyZW50RWxlbWVudEluZGV4ID0gdG90YWxNb3Zlc0xlZnQgKiBtb3Zlc1BlclNpemUgKyAxO1xuXG5cdFx0XHRhbmltYXRlKHRvdGFsTW92ZXNMZWZ0KTtcblxuXHRcdFx0X25hdmlnYXRpb24uYWN0aXZhdGVEb3QoTWF0aC5yb3VuZChjdXJyZW50RWxlbWVudEluZGV4KSk7XG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVUb3RhbE1vdmVzUmlnaHQodCwgaikge1xuXHRcdHZhciB0cjtcblx0XHRpZiAodCAmJiBqPT09dW5kZWZpbmVkKSB7XG5cdFx0XHR0ciA9IHRvdGFsTW92ZXNSaWdodCA+PSAxID8gdG90YWxNb3Zlc1JpZ2h0IC0gMSA6IHRvdGFsTW92ZXNSaWdodCAtIHRvdGFsTW92ZXNSaWdodDtcblx0XHR9IGVsc2UgaWYgKCF0ICYmIGo9PT11bmRlZmluZWQpIHtcblx0XHRcdHRyID0gdG90YWxNb3Zlc0xlZnQgPj0gMSA/IHRvdGFsTW92ZXNSaWdodCArIDEgOiB0b3RhbE1vdmVzUmlnaHQgKyB0b3RhbE1vdmVzTGVmdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dHIgPSAodG90YWxNb3ZlcyAtIGogPj0gMCkgPyB0b3RhbE1vdmVzIC0gaiA6IDA7XG5cdFx0fVxuXHRcdHJldHVybiB0cjtcblx0fVxuXG5cblx0ZnVuY3Rpb24gYW5pbWF0ZShkaXN0YW5jZSkge1xuXG5cdFx0VHdlZW5MaXRlLnRvKF8kY29udGFpbmVyLCBBTklNQVRFX0RVUkFUSU9OLCB7XG5cdFx0XHR4OiAtKGRpc3RhbmNlICogKChuZXdDaGlsZHJlblBjdCArIG5ld01hcmdpblB0YykgKiBtb3Zlc1BlclNpemUpKSArICclJyxcblx0XHRcdGVhc2U6IEN1YmljLmVhc2VPdXRcblx0XHR9KTtcblxuXHR9XG5cblxuXG5cblx0ZnVuY3Rpb24gYWN0aXZhdGUoKSB7XG5cblx0XHRyZXNldFN0ZXBzKCk7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWFjdGl2YXRlKCkge1xuXG5cdFx0cmVzZXRTdGVwcygpO1xuXG5cdH1cblxuXHR0aGlzLmluaXQgPSBpbml0O1xufTtcbiIsIi8vIHByb2plY3QgZGVwZW5kZW5jaWVzXG52YXIgUSA9IHJlcXVpcmUoJ2tldycpLFxuXG4vLyBjb25zdGFudHNcblx0REVGQVVMVF9ERUxBWSA9IDM1MCxcblx0Q0xBU1NfU0hPV04gPSAnaXMtc2hvd24nO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpe1xuXG5cdHZhciBfJGVsLFxuXHRcdF9zaG93RGVsYXksXG5cdFx0X2hpZGVEZWxheTtcblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0IFx0U3RhdGUgaGFuZGxpbmdcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cblx0ZnVuY3Rpb24gaW5pdCgkZWwpIHtcblxuXHRcdHZhciBkZWZhdWx0RGVsYXk7XG5cblx0XHRfJGVsID0gJGVsO1xuXG5cdFx0ZGVmYXVsdERlbGF5ID0gXyRlbC5kYXRhKCdkZWxheScpIHx8IERFRkFVTFRfREVMQVk7XG5cblx0XHRfc2hvd0RlbGF5ID0gXyRlbC5kYXRhKCdzaG93LWRlbGF5JykgfHwgZGVmYXVsdERlbGF5O1xuXHRcdF9oaWRlRGVsYXkgPSBfJGVsLmRhdGEoJ2hpZGUtZGVsYXknKSB8fCBkZWZhdWx0RGVsYXk7XG5cdH1cblxuXHRmdW5jdGlvbiBzaG93KCkge1xuXG5cdFx0XyRlbC5hZGRDbGFzcyhDTEFTU19TSE9XTik7XG5cblx0XHRyZXR1cm4gUS5kZWxheShfc2hvd0RlbGF5KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGhpZGUoKSB7XG5cblx0XHRfJGVsLnJlbW92ZUNsYXNzKENMQVNTX1NIT1dOKTtcblxuXHRcdHJldHVybiBRLmRlbGF5KF9oaWRlRGVsYXkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblxuXHRcdF8kZWwgPSBudWxsO1xuXHR9XG5cblxuXG5cdC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdCBcdFB1YmxpYyBNZXRob2RzXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG5cdHRoaXMuc2hvdyA9IHNob3c7XG5cdHRoaXMuaGlkZSA9IGhpZGU7XG5cdHRoaXMuZGVzdHJveSA9IGRlc3Ryb3k7XG59O1xuIiwidmFyIFEgPSByZXF1aXJlKCdrZXcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblxuXHR2YXIgXyRsb2FkZXIsXG5cdFx0XyRsb2FkZXJTcXVhcmVzLFxuXHRcdF9zaG93VHdlZW4sXG5cdFx0X3JvdGF0aW9uVHdlZW4sXG5cdFx0X3Nob3VsZEhpZGUsXG5cdFx0X2hpZGVEZWZlcjtcblxuXG5cblx0LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0IFN0YXRlIGhhbmRsaW5nXG5cdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXHRmdW5jdGlvbiBpbml0KCRlbCkge1xuXG5cdFx0dmFyIFRJTUVfUk9UQVRJT05fVFdFRU4gPSAwLjgsXG5cdFx0XHRUSU1FX1NIT1dfVFdFRU4gPSAxO1xuXG5cdFx0XyRsb2FkZXIgPSAkZWw7XG5cdFx0XyRsb2FkZXJTcXVhcmVzID1fJGxvYWRlci5maW5kKCcuanMtbG9hZGVyU3F1YXJlJyk7XG5cblx0XHRfc2hvdWxkSGlkZSA9IGZhbHNlO1xuXG5cdFx0VHdlZW5MaXRlLnNldChfJGxvYWRlclNxdWFyZXMsIHthdXRvQWxwaGE6IDAsIHNjYWxlOiAwfSk7XG5cblx0XHRfcm90YXRpb25Ud2VlbiA9IFR3ZWVuTGl0ZS50byhfJGxvYWRlciwgVElNRV9ST1RBVElPTl9UV0VFTiwge1xuXHRcdFx0XHRyb3RhdGlvbjogXCItPTM2MFwiLFxuXHRcdFx0XHRlYXNlOkxpbmVhci5lYXNlTm9uZSxcblx0XHRcdFx0cGF1c2VkOnRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0X3JvdGF0aW9uVHdlZW4udmFycy5vbkNvbXBsZXRlID0gX3JvdGF0aW9uVHdlZW4ucmVzdGFydDtcblx0XHRfcm90YXRpb25Ud2Vlbi52YXJzLm9uQ29tcGxldGVTY29wZSA9IF9yb3RhdGlvblR3ZWVuO1xuXG5cdFx0X3Nob3dUd2VlbiA9IFR3ZWVuTGl0ZS50byhfJGxvYWRlclNxdWFyZXMsIFRJTUVfU0hPV19UV0VFTiwge1xuXHRcdFx0XHRhdXRvQWxwaGE6IDEsXG5cdFx0XHRcdHNjYWxlOiAxLFxuXHRcdFx0XHRlYXNlOkJhY2suZWFzZU91dCxcblx0XHRcdFx0Zm9yY2UzRDp0cnVlLFxuXHRcdFx0XHR0cmFuc2Zvcm1PcmlnaW46XCJjZW50ZXIgY2VudGVyXCIsXG5cdFx0XHRcdHNtb290aE9yaWdpbjpmYWxzZSxcblx0XHRcdFx0cGF1c2VkOnRydWUsXG5cdFx0XHRcdG9uQ29tcGxldGU6IG91dEFuaW1cblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgQW5pbWF0aW9uIEZ1bmN0aW9uc1xuXHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXHRmdW5jdGlvbiBvdXRBbmltICgpIHtcblxuXHRcdHZhciBUSU1FX1NRVUFSRV9UV0VFTiA9IDAuNTUsXG5cdFx0XHRERUxBWV9GQUNUT1JfU1FVQVJFX1RXRUVOID0gVElNRV9TUVVBUkVfVFdFRU4gLyAxMCwvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuXHRcdFx0U0NBTEVfVE9fU1FVQVJFID0gMC4zLFxuXHRcdFx0b25Db21wbGV0ZSxcblx0XHRcdHRvdGFsRWxlbWVudHMgPSBfJGxvYWRlclNxdWFyZXMubGVuZ3RoLFxuXHRcdFx0aTtcblxuXHRcdGZvcihpID0gdG90YWxFbGVtZW50cyAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cblx0XHRcdGlmKGkgPT09IDApIHtcblxuXHRcdFx0XHRvbkNvbXBsZXRlID0gZXZhbHVhdGVPbkNvbXBsZXRlO1xuXHRcdFx0fVxuXG5cdFx0XHRUd2VlbkxpdGUuZnJvbVRvKF8kbG9hZGVyU3F1YXJlc1tpXSwgVElNRV9TUVVBUkVfVFdFRU4sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRhdXRvQWxwaGE6IDEsXG5cdFx0XHRcdFx0c2NhbGU6IDFcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGF1dG9BbHBoYTogMCxcblx0XHRcdFx0XHRzY2FsZTogU0NBTEVfVE9fU1FVQVJFLFxuXHRcdFx0XHRcdGVhc2U6IFF1YXJ0LmVhc2VPdXQsXG5cdFx0XHRcdFx0dHJhbnNmb3JtT3JpZ2luOiBcImNlbnRlciBjZW50ZXJcIixcblx0XHRcdFx0XHRzbW9vdGhPcmlnaW46IGZhbHNlLFxuXHRcdFx0XHRcdGRlbGF5OiBpICogREVMQVlfRkFDVE9SX1NRVUFSRV9UV0VFTixcblx0XHRcdFx0XHRvbkNvbXBsZXRlOiBvbkNvbXBsZXRlXG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gZXZhbHVhdGVPbkNvbXBsZXRlKCkge1xuXG5cdFx0aWYoX3Nob3VsZEhpZGUpIHtcblxuXHRcdFx0c3RvcE91dEFuaW0oKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlc3RhcnRTaG93KCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzdGFydFNob3coKSB7XG5cblx0XHRUd2VlbkxpdGUuZGVsYXllZENhbGwoMC4yNSwgX3Nob3dUd2Vlbi5yZXN0YXJ0LCB1bmRlZmluZWQsIF9zaG93VHdlZW4pOy8vZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cdH1cblxuXG5cdGZ1bmN0aW9uIHN0b3BPdXRBbmltICgpIHtcblxuXHRcdC8vIGFkZGVkIGEgbGl0dGxlIGRlbGF5IHRvIG1ha2UgaXQgZmVlbCBsZXNzIGFicnVwdCB3aGVuIGhpZGUgaXMgZmluaXNoZWRcblx0XHRUd2VlbkxpdGUuZGVsYXllZENhbGwoMC42LCBfaGlkZURlZmVyLnJlc29sdmUsIHVuZGVmaW5lZCwgX2hpZGVEZWZlcik7Ly9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblx0fVxuXG5cdGZ1bmN0aW9uIHNob3coKSB7XG5cblx0XHR2YXIgZGVmZXIgPSBRLmRlZmVyKCk7XG5cblx0XHRfc2hvd1R3ZWVuLnBsYXkoKTtcblx0XHRfcm90YXRpb25Ud2Vlbi5wbGF5KCk7XG5cblx0XHRkZWZlci5yZXNvbHZlKCk7XG5cblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZTtcblx0fVxuXG5cdGZ1bmN0aW9uIGhpZGUoKSB7XG5cblx0XHRfaGlkZURlZmVyID0gUS5kZWZlcigpO1xuXHRcdF9zaG91bGRIaWRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiBfaGlkZURlZmVyLnByb21pc2U7XG5cdH1cblxuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXG5cdFx0X3JvdGF0aW9uVHdlZW4ucGF1c2UoKTtcblx0XHRfc2hvd1R3ZWVuLnBhdXNlKCk7XG5cblx0XHRfc2hvd1R3ZWVuLmtpbGwoKTtcblx0XHRfcm90YXRpb25Ud2Vlbi5raWxsKCk7XG5cdH1cblxuXHQvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQgUHVibGljIE1ldGhvZHNcblx0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cdHRoaXMuaW5pdCA9IGluaXQ7XG5cdHRoaXMuc2hvdyA9IHNob3c7XG5cdHRoaXMuaGlkZSA9IGhpZGU7XG5cdHRoaXMuZGVzdHJveSA9IGRlc3Ryb3k7XG59O1xuXG4iLCIvLyBwcm9qZWN0IGRlcGVuZGVuY2llc1xudmFyIGV2ZW50QnVzID0gcmVxdWlyZSgnLi4vY29yZS9ldmVudEJ1cycpLFxuXG5cdF93aW5kb3dIZWlnaHQsXG5cdF9zY3JvbGxUb3A7XG5cbmV2ZW50QnVzLm9uKGV2ZW50QnVzLlJFU0laRSwgb25SZXNpemUpO1xuZXZlbnRCdXMub24oZXZlbnRCdXMuU0NST0xMLCBvblNjcm9sbCk7XG5cbmZ1bmN0aW9uIG9uUmVzaXplKGUsIG5ld1dpZHRoLCBuZXdIZWlnaHQpIHtcblxuXHRfd2luZG93SGVpZ2h0ID0gbmV3SGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBvblNjcm9sbChlLCBuZXdTY3JvbGxWYWx1ZSkge1xuXG5cdF9zY3JvbGxUb3AgPSBuZXdTY3JvbGxWYWx1ZS5zY3JvbGxUb3A7XG59XG5cblxuZnVuY3Rpb24gY2hlY2tJblZpZXcoJGVsKSB7XG5cblx0dmFyIGVsZW1lbnRIZWlnaHQgPSAkZWwuaGVpZ2h0KCksXG5cdFx0b2Zmc2V0ID0gJGVsLm9mZnNldCgpLnRvcCxcblx0XHRpc0luVmlldyA9IF93aW5kb3dIZWlnaHQgKyBfc2Nyb2xsVG9wID4gb2Zmc2V0ICYmIF9zY3JvbGxUb3AgPCBvZmZzZXQgKyBlbGVtZW50SGVpZ2h0O1xuXG5cdHJldHVybiBpc0luVmlldztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja0luVmlldztcbiIsIi8vIGJvcnJvd2VkIGZyb20gOiBodHRwczovL2Rhdmlkd2Fsc2gubmFtZS92ZW5kb3ItcHJlZml4XG52YXIgcHJlZml4ID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJycpLFxuXHRcdHByZSA9IChBcnJheS5wcm90b3R5cGUuc2xpY2Vcblx0XHRcdFx0LmNhbGwoc3R5bGVzKVxuXHRcdFx0XHQuam9pbignJylcblx0XHRcdFx0Lm1hdGNoKC8tKG1venx3ZWJraXR8bXMpLS8pIHx8IChzdHlsZXMuT0xpbmsgPT09ICcnICYmIFsnJywgJ28nXSlcblx0XHQpWzFdLFxuXHRcdGRvbSA9ICgnV2ViS2l0fE1venxNU3xPJykubWF0Y2gobmV3IFJlZ0V4cCgnKCcgKyBwcmUgKyAnKScsICdpJykpWzFdO1xuXHRyZXR1cm4ge1xuXHRcdGRvbTogZG9tLFxuXHRcdGxvd2VyY2FzZTogcHJlLFxuXHRcdGNzczogJy0nICsgcHJlICsgJy0nLFxuXHRcdGpzOiBwcmVbMF0udG9VcHBlckNhc2UoKSArIHByZS5zdWJzdHIoMSlcblx0fTtcbn0pKCk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVmaXg7XG4iLCIvLyBWZW5kb3IgZGVwZW5kZW5jaWVzXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpLFxuXHRRID0gcmVxdWlyZSgna2V3Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7XG5cblx0dmFyIGRlZmVyID0gUS5kZWZlcigpO1xuXG5cdCQuYWpheCh1cmwsIG9wdGlvbnMpXG5cdFx0LmRvbmUoZnVuY3Rpb24oZGF0YSkgeyBkZWZlci5yZXNvbHZlKGRhdGEpOyB9KVxuXHRcdC5mYWlsKGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7XG5cblx0XHRcdGRlZmVyLnJlamVjdChuZXcgRXJyb3IodGV4dFN0YXR1cyArICcgLSAnICsgZXJyb3JUaHJvd24pKTtcblx0XHR9KTtcblxuXHRyZXR1cm4gZGVmZXIucHJvbWlzZTtcbn07XG4iLCIvLyB0YWtlbiBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxOTAzMTE5LzkyMTk2NFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihyZXF1ZXN0ZWRLZXkpIHtcblxuXHR2YXIgcGFnZVVSTCA9IGRlY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKSksXG5cdFx0VVJMVmFyaWFibGVzID0gcGFnZVVSTC5zcGxpdCgnJicpLFxuXHRcdHBhcmFtZXRlcixcblx0XHRwYXJhbWV0ZXJLZXksXG5cdFx0cGFyYW1ldGVyVmFsdWUsXG5cdFx0aTtcblxuXHRmb3IgKGkgPSAwOyBpIDwgVVJMVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRwYXJhbWV0ZXIgPSBVUkxWYXJpYWJsZXNbaV0uc3BsaXQoJz0nKTtcblx0XHRwYXJhbWV0ZXJLZXkgPSBwYXJhbWV0ZXJbMF07XG5cblx0XHRpZihwYXJhbWV0ZXJLZXkgPT09IHJlcXVlc3RlZEtleSkge1xuXG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZSA9IHBhcmFtZXRlclsxXTtcblxuXHRcdFx0cmV0dXJuIHBhcmFtZXRlclZhbHVlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1ldGVyVmFsdWU7XG5cdFx0fVxuXHR9XG59O1xuIiwidmFyIEdUTV9DTElDS19FVkVOVCA9ICdndG0uZXZlbnQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsKSB7XG5cblx0Z3RtRGF0YUxheWVyLnB1c2goe1xuXHRcdCdldmVudCc6IEdUTV9DTElDS19FVkVOVCxcblx0XHQnY2F0ZWdvcnknOiBjYXRlZ29yeSxcblx0XHQnYWN0aW9uJyA6IGFjdGlvbixcblx0XHQnbGFiZWwnOiBsYWJlbFxuXHR9KTtcbn07XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHJlc3BvbnNlLCBjb250ZW50U2VsZWN0b3IsIHJlbW92ZVNlbGVjdG9yKSB7XG5cblx0dmFyICRwYXJzZWRSZXNwb25zZSA9ICQocmVzcG9uc2UpLmZpbmQoY29udGVudFNlbGVjdG9yKSxcblx0XHQkcmVtb3ZlO1xuXG5cdC8vIHJlbW92ZVNlbGVjdG9yIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBjZXJ0YWluIGVsZW1lbnRzIGZyb20gdGhlIGxvYWRlZCBjb250ZW50XG5cdC8vIChmb3IgZXhhbXBsZSB0aGUgZmlsdGVyIGxvYWRlciBhdCB0aGUgdG9wIG9mIHRoZSBncmlkKVxuXHRpZihyZW1vdmVTZWxlY3Rvcikge1xuXG5cdFx0JHJlbW92ZSA9ICRwYXJzZWRSZXNwb25zZS5maW5kKHJlbW92ZVNlbGVjdG9yKTtcblx0XHQkcmVtb3ZlLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuICRwYXJzZWRSZXNwb25zZS5odG1sKCk7XG59O1xuIiwiLyohIEhhbW1lci5KUyAtIHYyLjAuNyAtIDIwMTYtMDQtMjJcbiAqIGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IEpvcmlrIFRhbmdlbGRlcjtcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAqL1xuKGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsIGV4cG9ydE5hbWUsIHVuZGVmaW5lZCkge1xuICAndXNlIHN0cmljdCc7XG5cbnZhciBWRU5ET1JfUFJFRklYRVMgPSBbJycsICd3ZWJraXQnLCAnTW96JywgJ01TJywgJ21zJywgJ28nXTtcbnZhciBURVNUX0VMRU1FTlQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxudmFyIFRZUEVfRlVOQ1RJT04gPSAnZnVuY3Rpb24nO1xuXG52YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIG5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIHNldCBhIHRpbWVvdXQgd2l0aCBhIGdpdmVuIHNjb3BlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBzZXRUaW1lb3V0Q29udGV4dChmbiwgdGltZW91dCwgY29udGV4dCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGJpbmRGbihmbiwgY29udGV4dCksIHRpbWVvdXQpO1xufVxuXG4vKipcbiAqIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBhcnJheSwgd2Ugd2FudCB0byBleGVjdXRlIHRoZSBmbiBvbiBlYWNoIGVudHJ5XG4gKiBpZiBpdCBhaW50IGFuIGFycmF5IHdlIGRvbid0IHdhbnQgdG8gZG8gYSB0aGluZy5cbiAqIHRoaXMgaXMgdXNlZCBieSBhbGwgdGhlIG1ldGhvZHMgdGhhdCBhY2NlcHQgYSBzaW5nbGUgYW5kIGFycmF5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfEFycmF5fSBhcmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBmblxuICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGludm9rZUFycmF5QXJnKGFyZywgZm4sIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgIGVhY2goYXJnLCBjb250ZXh0W2ZuXSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogd2FsayBvYmplY3RzIGFuZCBhcnJheXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICovXG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgaTtcblxuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLmZvckVhY2gpIHtcbiAgICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IG9iai5sZW5ndGgpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGkpICYmIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIHdyYXAgYSBtZXRob2Qgd2l0aCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHN0YWNrIHRyYWNlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB3cmFwcGluZyB0aGUgc3VwcGxpZWQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBkZXByZWNhdGUobWV0aG9kLCBuYW1lLCBtZXNzYWdlKSB7XG4gICAgdmFyIGRlcHJlY2F0aW9uTWVzc2FnZSA9ICdERVBSRUNBVEVEIE1FVEhPRDogJyArIG5hbWUgKyAnXFxuJyArIG1lc3NhZ2UgKyAnIEFUIFxcbic7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcignZ2V0LXN0YWNrLXRyYWNlJyk7XG4gICAgICAgIHZhciBzdGFjayA9IGUgJiYgZS5zdGFjayA/IGUuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFxzK2F0XFxzKy9nbSwgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXk9iamVjdC48YW5vbnltb3VzPlxccypcXCgvZ20sICd7YW5vbnltb3VzfSgpQCcpIDogJ1Vua25vd24gU3RhY2sgVHJhY2UnO1xuXG4gICAgICAgIHZhciBsb2cgPSB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUud2FybiB8fCB3aW5kb3cuY29uc29sZS5sb2cpO1xuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgICBsb2cuY2FsbCh3aW5kb3cuY29uc29sZSwgZGVwcmVjYXRpb25NZXNzYWdlLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cbi8qKlxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHsuLi5PYmplY3R9IG9iamVjdHNfdG9fYXNzaWduXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB0YXJnZXRcbiAqL1xudmFyIGFzc2lnbjtcbmlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9O1xufSBlbHNlIHtcbiAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xufVxuXG4vKipcbiAqIGV4dGVuZCBvYmplY3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV1cbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xudmFyIGV4dGVuZCA9IGRlcHJlY2F0ZShmdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjLCBtZXJnZSkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc3JjKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBrZXlzLmxlbmd0aCkge1xuICAgICAgICBpZiAoIW1lcmdlIHx8IChtZXJnZSAmJiBkZXN0W2tleXNbaV1dID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBkZXN0W2tleXNbaV1dID0gc3JjW2tleXNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59LCAnZXh0ZW5kJywgJ1VzZSBgYXNzaWduYC4nKTtcblxuLyoqXG4gKiBtZXJnZSB0aGUgdmFsdWVzIGZyb20gc3JjIGluIHRoZSBkZXN0LlxuICogbWVhbnMgdGhhdCBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgaW4gZGVzdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiBieSBzcmNcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBkZXN0XG4gKi9cbnZhciBtZXJnZSA9IGRlcHJlY2F0ZShmdW5jdGlvbiBtZXJnZShkZXN0LCBzcmMpIHtcbiAgICByZXR1cm4gZXh0ZW5kKGRlc3QsIHNyYywgdHJ1ZSk7XG59LCAnbWVyZ2UnLCAnVXNlIGBhc3NpZ25gLicpO1xuXG4vKipcbiAqIHNpbXBsZSBjbGFzcyBpbmhlcml0YW5jZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2hpbGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJhc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc11cbiAqL1xuZnVuY3Rpb24gaW5oZXJpdChjaGlsZCwgYmFzZSwgcHJvcGVydGllcykge1xuICAgIHZhciBiYXNlUCA9IGJhc2UucHJvdG90eXBlLFxuICAgICAgICBjaGlsZFA7XG5cbiAgICBjaGlsZFAgPSBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGJhc2VQKTtcbiAgICBjaGlsZFAuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICBjaGlsZFAuX3N1cGVyID0gYmFzZVA7XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICBhc3NpZ24oY2hpbGRQLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cbi8qKlxuICogc2ltcGxlIGZ1bmN0aW9uIGJpbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBiaW5kRm4oZm4sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYm91bmRGbigpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBsZXQgYSBib29sZWFuIHZhbHVlIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIGEgYm9vbGVhblxuICogdGhpcyBmaXJzdCBpdGVtIGluIGFyZ3Mgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0ge0Jvb2xlYW58RnVuY3Rpb259IHZhbFxuICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gYm9vbE9yRm4odmFsLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT0gVFlQRV9GVU5DVElPTikge1xuICAgICAgICByZXR1cm4gdmFsLmFwcGx5KGFyZ3MgPyBhcmdzWzBdIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59XG5cbi8qKlxuICogdXNlIHRoZSB2YWwyIHdoZW4gdmFsMSBpcyB1bmRlZmluZWRcbiAqIEBwYXJhbSB7Kn0gdmFsMVxuICogQHBhcmFtIHsqfSB2YWwyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gaWZVbmRlZmluZWQodmFsMSwgdmFsMikge1xuICAgIHJldHVybiAodmFsMSA9PT0gdW5kZWZpbmVkKSA/IHZhbDIgOiB2YWwxO1xufVxuXG4vKipcbiAqIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcnModGFyZ2V0LCB0eXBlcywgaGFuZGxlcikge1xuICAgIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiByZW1vdmVFdmVudExpc3RlbmVyIHdpdGggbXVsdGlwbGUgZXZlbnRzIGF0IG9uY2VcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRhcmdldCwgdHlwZXMsIGhhbmRsZXIpIHtcbiAgICBlYWNoKHNwbGl0U3RyKHR5cGVzKSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogZmluZCBpZiBhIG5vZGUgaXMgaW4gdGhlIGdpdmVuIHBhcmVudFxuICogQG1ldGhvZCBoYXNQYXJlbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudFxuICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAqL1xuZnVuY3Rpb24gaGFzUGFyZW50KG5vZGUsIHBhcmVudCkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IHBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIHNtYWxsIGluZGV4T2Ygd3JhcHBlclxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBmb3VuZFxuICovXG5mdW5jdGlvbiBpblN0cihzdHIsIGZpbmQpIHtcbiAgICByZXR1cm4gc3RyLmluZGV4T2YoZmluZCkgPiAtMTtcbn1cblxuLyoqXG4gKiBzcGxpdCBzdHJpbmcgb24gd2hpdGVzcGFjZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybnMge0FycmF5fSB3b3Jkc1xuICovXG5mdW5jdGlvbiBzcGxpdFN0cihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbn1cblxuLyoqXG4gKiBmaW5kIGlmIGEgYXJyYXkgY29udGFpbnMgdGhlIG9iamVjdCB1c2luZyBpbmRleE9mIG9yIGEgc2ltcGxlIHBvbHlGaWxsXG4gKiBAcGFyYW0ge0FycmF5fSBzcmNcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ZpbmRCeUtleV1cbiAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gKi9cbmZ1bmN0aW9uIGluQXJyYXkoc3JjLCBmaW5kLCBmaW5kQnlLZXkpIHtcbiAgICBpZiAoc3JjLmluZGV4T2YgJiYgIWZpbmRCeUtleSkge1xuICAgICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICgoZmluZEJ5S2V5ICYmIHNyY1tpXVtmaW5kQnlLZXldID09IGZpbmQpIHx8ICghZmluZEJ5S2V5ICYmIHNyY1tpXSA9PT0gZmluZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxufVxuXG4vKipcbiAqIGNvbnZlcnQgYXJyYXktbGlrZSBvYmplY3RzIHRvIHJlYWwgYXJyYXlzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkob2JqKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaiwgMCk7XG59XG5cbi8qKlxuICogdW5pcXVlIGFycmF5IHdpdGggb2JqZWN0cyBiYXNlZCBvbiBhIGtleSAobGlrZSAnaWQnKSBvciBqdXN0IGJ5IHRoZSBhcnJheSdzIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5fSBzcmMgW3tpZDoxfSx7aWQ6Mn0se2lkOjF9XVxuICogQHBhcmFtIHtTdHJpbmd9IFtrZXldXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtzb3J0PUZhbHNlXVxuICogQHJldHVybnMge0FycmF5fSBbe2lkOjF9LHtpZDoyfV1cbiAqL1xuZnVuY3Rpb24gdW5pcXVlQXJyYXkoc3JjLCBrZXksIHNvcnQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbCA9IGtleSA/IHNyY1tpXVtrZXldIDogc3JjW2ldO1xuICAgICAgICBpZiAoaW5BcnJheSh2YWx1ZXMsIHZhbCkgPCAwKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goc3JjW2ldKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNbaV0gPSB2YWw7XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoc29ydCkge1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydChmdW5jdGlvbiBzb3J0VW5pcXVlQXJyYXkoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhW2tleV0gPiBiW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIGdldCB0aGUgcHJlZml4ZWQgcHJvcGVydHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICogQHJldHVybnMge1N0cmluZ3xVbmRlZmluZWR9IHByZWZpeGVkXG4gKi9cbmZ1bmN0aW9uIHByZWZpeGVkKG9iaiwgcHJvcGVydHkpIHtcbiAgICB2YXIgcHJlZml4LCBwcm9wO1xuICAgIHZhciBjYW1lbFByb3AgPSBwcm9wZXJ0eVswXS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBWRU5ET1JfUFJFRklYRVMubGVuZ3RoKSB7XG4gICAgICAgIHByZWZpeCA9IFZFTkRPUl9QUkVGSVhFU1tpXTtcbiAgICAgICAgcHJvcCA9IChwcmVmaXgpID8gcHJlZml4ICsgY2FtZWxQcm9wIDogcHJvcGVydHk7XG5cbiAgICAgICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogZ2V0IGEgdW5pcXVlIGlkXG4gKiBAcmV0dXJucyB7bnVtYmVyfSB1bmlxdWVJZFxuICovXG52YXIgX3VuaXF1ZUlkID0gMTtcbmZ1bmN0aW9uIHVuaXF1ZUlkKCkge1xuICAgIHJldHVybiBfdW5pcXVlSWQrKztcbn1cblxuLyoqXG4gKiBnZXQgdGhlIHdpbmRvdyBvYmplY3Qgb2YgYW4gZWxlbWVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybnMge0RvY3VtZW50Vmlld3xXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvd0ZvckVsZW1lbnQoZWxlbWVudCkge1xuICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudDtcbiAgICByZXR1cm4gKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93IHx8IHdpbmRvdyk7XG59XG5cbnZhciBNT0JJTEVfUkVHRVggPSAvbW9iaWxlfHRhYmxldHxpcChhZHxob25lfG9kKXxhbmRyb2lkL2k7XG5cbnZhciBTVVBQT1JUX1RPVUNIID0gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyk7XG52YXIgU1VQUE9SVF9QT0lOVEVSX0VWRU5UUyA9IHByZWZpeGVkKHdpbmRvdywgJ1BvaW50ZXJFdmVudCcpICE9PSB1bmRlZmluZWQ7XG52YXIgU1VQUE9SVF9PTkxZX1RPVUNIID0gU1VQUE9SVF9UT1VDSCAmJiBNT0JJTEVfUkVHRVgudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxudmFyIElOUFVUX1RZUEVfVE9VQ0ggPSAndG91Y2gnO1xudmFyIElOUFVUX1RZUEVfUEVOID0gJ3Blbic7XG52YXIgSU5QVVRfVFlQRV9NT1VTRSA9ICdtb3VzZSc7XG52YXIgSU5QVVRfVFlQRV9LSU5FQ1QgPSAna2luZWN0JztcblxudmFyIENPTVBVVEVfSU5URVJWQUwgPSAyNTtcblxudmFyIElOUFVUX1NUQVJUID0gMTtcbnZhciBJTlBVVF9NT1ZFID0gMjtcbnZhciBJTlBVVF9FTkQgPSA0O1xudmFyIElOUFVUX0NBTkNFTCA9IDg7XG5cbnZhciBESVJFQ1RJT05fTk9ORSA9IDE7XG52YXIgRElSRUNUSU9OX0xFRlQgPSAyO1xudmFyIERJUkVDVElPTl9SSUdIVCA9IDQ7XG52YXIgRElSRUNUSU9OX1VQID0gODtcbnZhciBESVJFQ1RJT05fRE9XTiA9IDE2O1xuXG52YXIgRElSRUNUSU9OX0hPUklaT05UQUwgPSBESVJFQ1RJT05fTEVGVCB8IERJUkVDVElPTl9SSUdIVDtcbnZhciBESVJFQ1RJT05fVkVSVElDQUwgPSBESVJFQ1RJT05fVVAgfCBESVJFQ1RJT05fRE9XTjtcbnZhciBESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUw7XG5cbnZhciBQUk9QU19YWSA9IFsneCcsICd5J107XG52YXIgUFJPUFNfQ0xJRU5UX1hZID0gWydjbGllbnRYJywgJ2NsaWVudFknXTtcblxuLyoqXG4gKiBjcmVhdGUgbmV3IGlucHV0IHR5cGUgbWFuYWdlclxuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0lucHV0fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIElucHV0KG1hbmFnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICB0aGlzLnRhcmdldCA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dFRhcmdldDtcblxuICAgIC8vIHNtYWxsZXIgd3JhcHBlciBhcm91bmQgdGhlIGhhbmRsZXIsIGZvciB0aGUgc2NvcGUgYW5kIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBtYW5hZ2VyLFxuICAgIC8vIHNvIHdoZW4gZGlzYWJsZWQgdGhlIGlucHV0IGV2ZW50cyBhcmUgY29tcGxldGVseSBieXBhc3NlZC5cbiAgICB0aGlzLmRvbUhhbmRsZXIgPSBmdW5jdGlvbihldikge1xuICAgICAgICBpZiAoYm9vbE9yRm4obWFuYWdlci5vcHRpb25zLmVuYWJsZSwgW21hbmFnZXJdKSkge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVyKGV2KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXQoKTtcblxufVxuXG5JbnB1dC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2hvdWxkIGhhbmRsZSB0aGUgaW5wdXRFdmVudCBkYXRhIGFuZCB0cmlnZ2VyIHRoZSBjYWxsYmFja1xuICAgICAqIEB2aXJ0dWFsXG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7IH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5ldkVsICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2VGFyZ2V0ICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2V2luICYmIGFkZEV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdW5iaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5ldkVsICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2VGFyZ2V0ICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgICB0aGlzLmV2V2luICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgaW5wdXQgdHlwZSBtYW5hZ2VyXG4gKiBjYWxsZWQgYnkgdGhlIE1hbmFnZXIgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gKiBAcmV0dXJucyB7SW5wdXR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0SW5zdGFuY2UobWFuYWdlcikge1xuICAgIHZhciBUeXBlO1xuICAgIHZhciBpbnB1dENsYXNzID0gbWFuYWdlci5vcHRpb25zLmlucHV0Q2xhc3M7XG5cbiAgICBpZiAoaW5wdXRDbGFzcykge1xuICAgICAgICBUeXBlID0gaW5wdXRDbGFzcztcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMpIHtcbiAgICAgICAgVHlwZSA9IFBvaW50ZXJFdmVudElucHV0O1xuICAgIH0gZWxzZSBpZiAoU1VQUE9SVF9PTkxZX1RPVUNIKSB7XG4gICAgICAgIFR5cGUgPSBUb3VjaElucHV0O1xuICAgIH0gZWxzZSBpZiAoIVNVUFBPUlRfVE9VQ0gpIHtcbiAgICAgICAgVHlwZSA9IE1vdXNlSW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgVHlwZSA9IFRvdWNoTW91c2VJbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyAoVHlwZSkobWFuYWdlciwgaW5wdXRIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBoYW5kbGUgaW5wdXQgZXZlbnRzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBpbnB1dEhhbmRsZXIobWFuYWdlciwgZXZlbnRUeXBlLCBpbnB1dCkge1xuICAgIHZhciBwb2ludGVyc0xlbiA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aDtcbiAgICB2YXIgY2hhbmdlZFBvaW50ZXJzTGVuID0gaW5wdXQuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aDtcbiAgICB2YXIgaXNGaXJzdCA9IChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAocG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDApKTtcbiAgICB2YXIgaXNGaW5hbCA9IChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiAocG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDApKTtcblxuICAgIGlucHV0LmlzRmlyc3QgPSAhIWlzRmlyc3Q7XG4gICAgaW5wdXQuaXNGaW5hbCA9ICEhaXNGaW5hbDtcblxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgIG1hbmFnZXIuc2Vzc2lvbiA9IHt9O1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSBldmVudCBpcyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgZG9tRXZlbnRzXG4gICAgLy8gbGlrZSAndG91Y2hzdGFydCwgbW91c2V1cCwgcG9pbnRlcmRvd24nXG4gICAgaW5wdXQuZXZlbnRUeXBlID0gZXZlbnRUeXBlO1xuXG4gICAgLy8gY29tcHV0ZSBzY2FsZSwgcm90YXRpb24gZXRjXG4gICAgY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCk7XG5cbiAgICAvLyBlbWl0IHNlY3JldCBldmVudFxuICAgIG1hbmFnZXIuZW1pdCgnaGFtbWVyLmlucHV0JywgaW5wdXQpO1xuXG4gICAgbWFuYWdlci5yZWNvZ25pemUoaW5wdXQpO1xuICAgIG1hbmFnZXIuc2Vzc2lvbi5wcmV2SW5wdXQgPSBpbnB1dDtcbn1cblxuLyoqXG4gKiBleHRlbmQgdGhlIGRhdGEgd2l0aCBzb21lIHVzYWJsZSBwcm9wZXJ0aWVzIGxpa2Ugc2NhbGUsIHJvdGF0ZSwgdmVsb2NpdHkgZXRjXG4gKiBAcGFyYW0ge09iamVjdH0gbWFuYWdlclxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVJbnB1dERhdGEobWFuYWdlciwgaW5wdXQpIHtcbiAgICB2YXIgc2Vzc2lvbiA9IG1hbmFnZXIuc2Vzc2lvbjtcbiAgICB2YXIgcG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycztcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7XG5cbiAgICAvLyBzdG9yZSB0aGUgZmlyc3QgaW5wdXQgdG8gY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBhbmQgZGlyZWN0aW9uXG4gICAgaWYgKCFzZXNzaW9uLmZpcnN0SW5wdXQpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdElucHV0ID0gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpO1xuICAgIH1cblxuICAgIC8vIHRvIGNvbXB1dGUgc2NhbGUgYW5kIHJvdGF0aW9uIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG11bHRpcGxlIHRvdWNoZXNcbiAgICBpZiAocG9pbnRlcnNMZW5ndGggPiAxICYmICFzZXNzaW9uLmZpcnN0TXVsdGlwbGUpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpcnN0SW5wdXQgPSBzZXNzaW9uLmZpcnN0SW5wdXQ7XG4gICAgdmFyIGZpcnN0TXVsdGlwbGUgPSBzZXNzaW9uLmZpcnN0TXVsdGlwbGU7XG4gICAgdmFyIG9mZnNldENlbnRlciA9IGZpcnN0TXVsdGlwbGUgPyBmaXJzdE11bHRpcGxlLmNlbnRlciA6IGZpcnN0SW5wdXQuY2VudGVyO1xuXG4gICAgdmFyIGNlbnRlciA9IGlucHV0LmNlbnRlciA9IGdldENlbnRlcihwb2ludGVycyk7XG4gICAgaW5wdXQudGltZVN0YW1wID0gbm93KCk7XG4gICAgaW5wdXQuZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gZmlyc3RJbnB1dC50aW1lU3RhbXA7XG5cbiAgICBpbnB1dC5hbmdsZSA9IGdldEFuZ2xlKG9mZnNldENlbnRlciwgY2VudGVyKTtcbiAgICBpbnB1dC5kaXN0YW5jZSA9IGdldERpc3RhbmNlKG9mZnNldENlbnRlciwgY2VudGVyKTtcblxuICAgIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KTtcbiAgICBpbnB1dC5vZmZzZXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuXG4gICAgdmFyIG92ZXJhbGxWZWxvY2l0eSA9IGdldFZlbG9jaXR5KGlucHV0LmRlbHRhVGltZSwgaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eVggPSBvdmVyYWxsVmVsb2NpdHkueDtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlZID0gb3ZlcmFsbFZlbG9jaXR5Lnk7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5ID0gKGFicyhvdmVyYWxsVmVsb2NpdHkueCkgPiBhYnMob3ZlcmFsbFZlbG9jaXR5LnkpKSA/IG92ZXJhbGxWZWxvY2l0eS54IDogb3ZlcmFsbFZlbG9jaXR5Lnk7XG5cbiAgICBpbnB1dC5zY2FsZSA9IGZpcnN0TXVsdGlwbGUgPyBnZXRTY2FsZShmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAxO1xuICAgIGlucHV0LnJvdGF0aW9uID0gZmlyc3RNdWx0aXBsZSA/IGdldFJvdGF0aW9uKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDA7XG5cbiAgICBpbnB1dC5tYXhQb2ludGVycyA9ICFzZXNzaW9uLnByZXZJbnB1dCA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6ICgoaW5wdXQucG9pbnRlcnMubGVuZ3RoID5cbiAgICAgICAgc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnMpID8gaW5wdXQucG9pbnRlcnMubGVuZ3RoIDogc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnMpO1xuXG4gICAgY29tcHV0ZUludGVydmFsSW5wdXREYXRhKHNlc3Npb24sIGlucHV0KTtcblxuICAgIC8vIGZpbmQgdGhlIGNvcnJlY3QgdGFyZ2V0XG4gICAgdmFyIHRhcmdldCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICBpZiAoaGFzUGFyZW50KGlucHV0LnNyY0V2ZW50LnRhcmdldCwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSBpbnB1dC5zcmNFdmVudC50YXJnZXQ7XG4gICAgfVxuICAgIGlucHV0LnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZURlbHRhWFkoc2Vzc2lvbiwgaW5wdXQpIHtcbiAgICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyO1xuICAgIHZhciBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2RGVsdGEgPSBzZXNzaW9uLnByZXZEZWx0YSB8fCB7fTtcbiAgICB2YXIgcHJldklucHV0ID0gc2Vzc2lvbi5wcmV2SW5wdXQgfHwge307XG5cbiAgICBpZiAoaW5wdXQuZXZlbnRUeXBlID09PSBJTlBVVF9TVEFSVCB8fCBwcmV2SW5wdXQuZXZlbnRUeXBlID09PSBJTlBVVF9FTkQpIHtcbiAgICAgICAgcHJldkRlbHRhID0gc2Vzc2lvbi5wcmV2RGVsdGEgPSB7XG4gICAgICAgICAgICB4OiBwcmV2SW5wdXQuZGVsdGFYIHx8IDAsXG4gICAgICAgICAgICB5OiBwcmV2SW5wdXQuZGVsdGFZIHx8IDBcbiAgICAgICAgfTtcblxuICAgICAgICBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhID0ge1xuICAgICAgICAgICAgeDogY2VudGVyLngsXG4gICAgICAgICAgICB5OiBjZW50ZXIueVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlucHV0LmRlbHRhWCA9IHByZXZEZWx0YS54ICsgKGNlbnRlci54IC0gb2Zmc2V0LngpO1xuICAgIGlucHV0LmRlbHRhWSA9IHByZXZEZWx0YS55ICsgKGNlbnRlci55IC0gb2Zmc2V0LnkpO1xufVxuXG4vKipcbiAqIHZlbG9jaXR5IGlzIGNhbGN1bGF0ZWQgZXZlcnkgeCBtc1xuICogQHBhcmFtIHtPYmplY3R9IHNlc3Npb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5mdW5jdGlvbiBjb21wdXRlSW50ZXJ2YWxJbnB1dERhdGEoc2Vzc2lvbiwgaW5wdXQpIHtcbiAgICB2YXIgbGFzdCA9IHNlc3Npb24ubGFzdEludGVydmFsIHx8IGlucHV0LFxuICAgICAgICBkZWx0YVRpbWUgPSBpbnB1dC50aW1lU3RhbXAgLSBsYXN0LnRpbWVTdGFtcCxcbiAgICAgICAgdmVsb2NpdHksIHZlbG9jaXR5WCwgdmVsb2NpdHlZLCBkaXJlY3Rpb247XG5cbiAgICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9IElOUFVUX0NBTkNFTCAmJiAoZGVsdGFUaW1lID4gQ09NUFVURV9JTlRFUlZBTCB8fCBsYXN0LnZlbG9jaXR5ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHZhciBkZWx0YVggPSBpbnB1dC5kZWx0YVggLSBsYXN0LmRlbHRhWDtcbiAgICAgICAgdmFyIGRlbHRhWSA9IGlucHV0LmRlbHRhWSAtIGxhc3QuZGVsdGFZO1xuXG4gICAgICAgIHZhciB2ID0gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIHZlbG9jaXR5WCA9IHYueDtcbiAgICAgICAgdmVsb2NpdHlZID0gdi55O1xuICAgICAgICB2ZWxvY2l0eSA9IChhYnModi54KSA+IGFicyh2LnkpKSA/IHYueCA6IHYueTtcbiAgICAgICAgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKGRlbHRhWCwgZGVsdGFZKTtcblxuICAgICAgICBzZXNzaW9uLmxhc3RJbnRlcnZhbCA9IGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBsYXRlc3QgdmVsb2NpdHkgaW5mbyBpZiBpdCBkb2Vzbid0IG92ZXJ0YWtlIGEgbWluaW11bSBwZXJpb2RcbiAgICAgICAgdmVsb2NpdHkgPSBsYXN0LnZlbG9jaXR5O1xuICAgICAgICB2ZWxvY2l0eVggPSBsYXN0LnZlbG9jaXR5WDtcbiAgICAgICAgdmVsb2NpdHlZID0gbGFzdC52ZWxvY2l0eVk7XG4gICAgICAgIGRpcmVjdGlvbiA9IGxhc3QuZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIGlucHV0LnZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gICAgaW5wdXQudmVsb2NpdHlYID0gdmVsb2NpdHlYO1xuICAgIGlucHV0LnZlbG9jaXR5WSA9IHZlbG9jaXR5WTtcbiAgICBpbnB1dC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG59XG5cbi8qKlxuICogY3JlYXRlIGEgc2ltcGxlIGNsb25lIGZyb20gdGhlIGlucHV0IHVzZWQgZm9yIHN0b3JhZ2Ugb2YgZmlyc3RJbnB1dCBhbmQgZmlyc3RNdWx0aXBsZVxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBjbG9uZWRJbnB1dERhdGFcbiAqL1xuZnVuY3Rpb24gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpIHtcbiAgICAvLyBtYWtlIGEgc2ltcGxlIGNvcHkgb2YgdGhlIHBvaW50ZXJzIGJlY2F1c2Ugd2Ugd2lsbCBnZXQgYSByZWZlcmVuY2UgaWYgd2UgZG9uJ3RcbiAgICAvLyB3ZSBvbmx5IG5lZWQgY2xpZW50WFkgZm9yIHRoZSBjYWxjdWxhdGlvbnNcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBpbnB1dC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICAgICAgcG9pbnRlcnNbaV0gPSB7XG4gICAgICAgICAgICBjbGllbnRYOiByb3VuZChpbnB1dC5wb2ludGVyc1tpXS5jbGllbnRYKSxcbiAgICAgICAgICAgIGNsaWVudFk6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFkpXG4gICAgICAgIH07XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0aW1lU3RhbXA6IG5vdygpLFxuICAgICAgICBwb2ludGVyczogcG9pbnRlcnMsXG4gICAgICAgIGNlbnRlcjogZ2V0Q2VudGVyKHBvaW50ZXJzKSxcbiAgICAgICAgZGVsdGFYOiBpbnB1dC5kZWx0YVgsXG4gICAgICAgIGRlbHRhWTogaW5wdXQuZGVsdGFZXG4gICAgfTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBwb2ludGVyc1xuICogQHJldHVybiB7T2JqZWN0fSBjZW50ZXIgY29udGFpbnMgYHhgIGFuZCBgeWAgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBnZXRDZW50ZXIocG9pbnRlcnMpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7XG5cbiAgICAvLyBubyBuZWVkIHRvIGxvb3Agd2hlbiBvbmx5IG9uZSB0b3VjaFxuICAgIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcm91bmQocG9pbnRlcnNbMF0uY2xpZW50WCksXG4gICAgICAgICAgICB5OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRZKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciB4ID0gMCwgeSA9IDAsIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgcG9pbnRlcnNMZW5ndGgpIHtcbiAgICAgICAgeCArPSBwb2ludGVyc1tpXS5jbGllbnRYO1xuICAgICAgICB5ICs9IHBvaW50ZXJzW2ldLmNsaWVudFk7XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByb3VuZCh4IC8gcG9pbnRlcnNMZW5ndGgpLFxuICAgICAgICB5OiByb3VuZCh5IC8gcG9pbnRlcnNMZW5ndGgpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGJldHdlZW4gdHdvIHBvaW50cy4gdW5pdCBpcyBpbiBweCBwZXIgbXMuXG4gKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEByZXR1cm4ge09iamVjdH0gdmVsb2NpdHkgYHhgIGFuZCBgeWBcbiAqL1xuZnVuY3Rpb24gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCB4LCB5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAvIGRlbHRhVGltZSB8fCAwLFxuICAgICAgICB5OiB5IC8gZGVsdGFUaW1lIHx8IDBcbiAgICB9O1xufVxuXG4vKipcbiAqIGdldCB0aGUgZGlyZWN0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGRpcmVjdGlvblxuICovXG5mdW5jdGlvbiBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAgIHJldHVybiBESVJFQ1RJT05fTk9ORTtcbiAgICB9XG5cbiAgICBpZiAoYWJzKHgpID49IGFicyh5KSkge1xuICAgICAgICByZXR1cm4geCA8IDAgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICB9XG4gICAgcmV0dXJuIHkgPCAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMSB7eCwgeX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwMiB7eCwgeX1cbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0RGlzdGFuY2UocDEsIHAyLCBwcm9wcykge1xuICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBQUk9QU19YWTtcbiAgICB9XG4gICAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV0sXG4gICAgICAgIHkgPSBwMltwcm9wc1sxXV0gLSBwMVtwcm9wc1sxXV07XG5cbiAgICByZXR1cm4gTWF0aC5zcXJ0KCh4ICogeCkgKyAoeSAqIHkpKTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge09iamVjdH0gcDFcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMlxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICovXG5mdW5jdGlvbiBnZXRBbmdsZShwMSwgcDIsIHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcykge1xuICAgICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cbiAgICB2YXIgeCA9IHAyW3Byb3BzWzBdXSAtIHAxW3Byb3BzWzBdXSxcbiAgICAgICAgeSA9IHAyW3Byb3BzWzFdXSAtIHAxW3Byb3BzWzFdXTtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LCB4KSAqIDE4MCAvIE1hdGguUEk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJvdGF0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gZ2V0QW5nbGUoZW5kWzFdLCBlbmRbMF0sIFBST1BTX0NMSUVOVF9YWSkgKyBnZXRBbmdsZShzdGFydFsxXSwgc3RhcnRbMF0sIFBST1BTX0NMSUVOVF9YWSk7XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAqIG5vIHNjYWxlIGlzIDEsIGFuZCBnb2VzIGRvd24gdG8gMCB3aGVuIHBpbmNoZWQgdG9nZXRoZXIsIGFuZCBiaWdnZXIgd2hlbiBwaW5jaGVkIG91dFxuICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICogQHJldHVybiB7TnVtYmVyfSBzY2FsZVxuICovXG5mdW5jdGlvbiBnZXRTY2FsZShzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIGdldERpc3RhbmNlKGVuZFswXSwgZW5kWzFdLCBQUk9QU19DTElFTlRfWFkpIC8gZ2V0RGlzdGFuY2Uoc3RhcnRbMF0sIHN0YXJ0WzFdLCBQUk9QU19DTElFTlRfWFkpO1xufVxuXG52YXIgTU9VU0VfSU5QVVRfTUFQID0ge1xuICAgIG1vdXNlZG93bjogSU5QVVRfU1RBUlQsXG4gICAgbW91c2Vtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIG1vdXNldXA6IElOUFVUX0VORFxufTtcblxudmFyIE1PVVNFX0VMRU1FTlRfRVZFTlRTID0gJ21vdXNlZG93bic7XG52YXIgTU9VU0VfV0lORE9XX0VWRU5UUyA9ICdtb3VzZW1vdmUgbW91c2V1cCc7XG5cbi8qKlxuICogTW91c2UgZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIE1vdXNlSW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gTU9VU0VfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IE1PVVNFX1dJTkRPV19FVkVOVFM7XG5cbiAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTsgLy8gbW91c2Vkb3duIHN0YXRlXG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KE1vdXNlSW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIE1FaGFuZGxlcihldikge1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfSU5QVVRfTUFQW2V2LnR5cGVdO1xuXG4gICAgICAgIC8vIG9uIHN0YXJ0IHdlIHdhbnQgdG8gaGF2ZSB0aGUgbGVmdCBtb3VzZSBidXR0b24gZG93blxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgZXYuYnV0dG9uID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX01PVkUgJiYgZXYud2hpY2ggIT09IDEpIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IElOUFVUX0VORDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1vdXNlIG11c3QgYmUgZG93blxuICAgICAgICBpZiAoIXRoaXMucHJlc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX01PVVNFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG52YXIgUE9JTlRFUl9JTlBVVF9NQVAgPSB7XG4gICAgcG9pbnRlcmRvd246IElOUFVUX1NUQVJULFxuICAgIHBvaW50ZXJtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHBvaW50ZXJ1cDogSU5QVVRfRU5ELFxuICAgIHBvaW50ZXJjYW5jZWw6IElOUFVUX0NBTkNFTCxcbiAgICBwb2ludGVyb3V0OiBJTlBVVF9DQU5DRUxcbn07XG5cbi8vIGluIElFMTAgdGhlIHBvaW50ZXIgdHlwZXMgaXMgZGVmaW5lZCBhcyBhbiBlbnVtXG52YXIgSUUxMF9QT0lOVEVSX1RZUEVfRU5VTSA9IHtcbiAgICAyOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgIDM6IElOUFVUX1RZUEVfUEVOLFxuICAgIDQ6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgNTogSU5QVVRfVFlQRV9LSU5FQ1QgLy8gc2VlIGh0dHBzOi8vdHdpdHRlci5jb20vamFjb2Jyb3NzaS9zdGF0dXMvNDgwNTk2NDM4NDg5ODkwODE2XG59O1xuXG52YXIgUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyA9ICdwb2ludGVyZG93bic7XG52YXIgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ3BvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsJztcblxuLy8gSUUxMCBoYXMgcHJlZml4ZWQgc3VwcG9ydCwgYW5kIGNhc2Utc2Vuc2l0aXZlXG5pZiAod2luZG93Lk1TUG9pbnRlckV2ZW50ICYmICF3aW5kb3cuUG9pbnRlckV2ZW50KSB7XG4gICAgUE9JTlRFUl9FTEVNRU5UX0VWRU5UUyA9ICdNU1BvaW50ZXJEb3duJztcbiAgICBQT0lOVEVSX1dJTkRPV19FVkVOVFMgPSAnTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBNU1BvaW50ZXJDYW5jZWwnO1xufVxuXG4vKipcbiAqIFBvaW50ZXIgZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFBvaW50ZXJFdmVudElucHV0KCkge1xuICAgIHRoaXMuZXZFbCA9IFBPSU5URVJfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IFBPSU5URVJfV0lORE9XX0VWRU5UUztcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLnN0b3JlID0gKHRoaXMubWFuYWdlci5zZXNzaW9uLnBvaW50ZXJFdmVudHMgPSBbXSk7XG59XG5cbmluaGVyaXQoUG9pbnRlckV2ZW50SW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFBFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgICAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBldmVudFR5cGVOb3JtYWxpemVkID0gZXYudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ21zJywgJycpO1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gUE9JTlRFUl9JTlBVVF9NQVBbZXZlbnRUeXBlTm9ybWFsaXplZF07XG4gICAgICAgIHZhciBwb2ludGVyVHlwZSA9IElFMTBfUE9JTlRFUl9UWVBFX0VOVU1bZXYucG9pbnRlclR5cGVdIHx8IGV2LnBvaW50ZXJUeXBlO1xuXG4gICAgICAgIHZhciBpc1RvdWNoID0gKHBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfVE9VQ0gpO1xuXG4gICAgICAgIC8vIGdldCBpbmRleCBvZiB0aGUgZXZlbnQgaW4gdGhlIHN0b3JlXG4gICAgICAgIHZhciBzdG9yZUluZGV4ID0gaW5BcnJheShzdG9yZSwgZXYucG9pbnRlcklkLCAncG9pbnRlcklkJyk7XG5cbiAgICAgICAgLy8gc3RhcnQgYW5kIG1vdXNlIG11c3QgYmUgZG93blxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgKGV2LmJ1dHRvbiA9PT0gMCB8fCBpc1RvdWNoKSkge1xuICAgICAgICAgICAgaWYgKHN0b3JlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChldik7XG4gICAgICAgICAgICAgICAgc3RvcmVJbmRleCA9IHN0b3JlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgICAgIHJlbW92ZVBvaW50ZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaXQgbm90IGZvdW5kLCBzbyB0aGUgcG9pbnRlciBoYXNuJ3QgYmVlbiBkb3duIChzbyBpdCdzIHByb2JhYmx5IGEgaG92ZXIpXG4gICAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBldmVudCBpbiB0aGUgc3RvcmVcbiAgICAgICAgc3RvcmVbc3RvcmVJbmRleF0gPSBldjtcblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogc3RvcmUsXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IFtldl0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlbW92ZVBvaW50ZXIpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBzdG9yZVxuICAgICAgICAgICAgc3RvcmUuc3BsaWNlKHN0b3JlSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbnZhciBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQID0ge1xuICAgIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICAgIHRvdWNobW92ZTogSU5QVVRfTU9WRSxcbiAgICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICAgIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG5cbnZhciBTSU5HTEVfVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0JztcbnZhciBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG5cbi8qKlxuICogVG91Y2ggZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFNpbmdsZVRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUztcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoU2luZ2xlVG91Y2hJbnB1dCwgSW5wdXQsIHtcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBURWhhbmRsZXIoZXYpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdO1xuXG4gICAgICAgIC8vIHNob3VsZCB3ZSBoYW5kbGUgdGhlIHRvdWNoIGV2ZW50cz9cbiAgICAgICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0b3VjaGVzID0gbm9ybWFsaXplU2luZ2xlVG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTtcblxuICAgICAgICAvLyB3aGVuIGRvbmUsIHJlc2V0IHRoZSBzdGFydGVkIHN0YXRlXG4gICAgICAgIGlmICh0eXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgdG91Y2hlc1swXS5sZW5ndGggLSB0b3VjaGVzWzFdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgdHlwZSwge1xuICAgICAgICAgICAgcG9pbnRlcnM6IHRvdWNoZXNbMF0sXG4gICAgICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICogQHBhcmFtIHtOdW1iZXJ9IHR5cGUgZmxhZ1xuICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2luZ2xlVG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGwgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciBjaGFuZ2VkID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyk7XG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIGFsbCA9IHVuaXF1ZUFycmF5KGFsbC5jb25jYXQoY2hhbmdlZCksICdpZGVudGlmaWVyJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFthbGwsIGNoYW5nZWRdO1xufVxuXG52YXIgVE9VQ0hfSU5QVVRfTUFQID0ge1xuICAgIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICAgIHRvdWNobW92ZTogSU5QVVRfTU9WRSxcbiAgICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICAgIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG5cbnZhciBUT1VDSF9UQVJHRVRfRVZFTlRTID0gJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJztcblxuLyoqXG4gKiBNdWx0aS11c2VyIHRvdWNoIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5mdW5jdGlvbiBUb3VjaElucHV0KCkge1xuICAgIHRoaXMuZXZUYXJnZXQgPSBUT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMudGFyZ2V0SWRzID0ge307XG5cbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KFRvdWNoSW5wdXQsIElucHV0LCB7XG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTVRFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgdHlwZSA9IFRPVUNIX0lOUFVUX01BUFtldi50eXBlXTtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBnZXRUb3VjaGVzLmNhbGwodGhpcywgZXYsIHR5cGUpO1xuICAgICAgICBpZiAoIXRvdWNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogdG91Y2hlc1swXSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogdG91Y2hlc1sxXSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEB0aGlzIHtUb3VjaElucHV0fVxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKiBAcGFyYW0ge051bWJlcn0gdHlwZSBmbGFnXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfEFycmF5fSBbYWxsLCBjaGFuZ2VkXVxuICovXG5mdW5jdGlvbiBnZXRUb3VjaGVzKGV2LCB0eXBlKSB7XG4gICAgdmFyIGFsbFRvdWNoZXMgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciB0YXJnZXRJZHMgPSB0aGlzLnRhcmdldElkcztcblxuICAgIC8vIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgdG91Y2gsIHRoZSBwcm9jZXNzIGNhbiBiZSBzaW1wbGlmaWVkXG4gICAgaWYgKHR5cGUgJiAoSU5QVVRfU1RBUlQgfCBJTlBVVF9NT1ZFKSAmJiBhbGxUb3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0YXJnZXRJZHNbYWxsVG91Y2hlc1swXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBbYWxsVG91Y2hlcywgYWxsVG91Y2hlc107XG4gICAgfVxuXG4gICAgdmFyIGksXG4gICAgICAgIHRhcmdldFRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyksXG4gICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzID0gW10sXG4gICAgICAgIHRhcmdldCA9IHRoaXMudGFyZ2V0O1xuXG4gICAgLy8gZ2V0IHRhcmdldCB0b3VjaGVzIGZyb20gdG91Y2hlc1xuICAgIHRhcmdldFRvdWNoZXMgPSBhbGxUb3VjaGVzLmZpbHRlcihmdW5jdGlvbih0b3VjaCkge1xuICAgICAgICByZXR1cm4gaGFzUGFyZW50KHRvdWNoLnRhcmdldCwgdGFyZ2V0KTtcbiAgICB9KTtcblxuICAgIC8vIGNvbGxlY3QgdG91Y2hlc1xuICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgICBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCB0YXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGFyZ2V0SWRzW3RhcmdldFRvdWNoZXNbaV0uaWRlbnRpZmllcl0gPSB0cnVlO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIGNoYW5nZWQgdG91Y2hlcyB0byBvbmx5IGNvbnRhaW4gdG91Y2hlcyB0aGF0IGV4aXN0IGluIHRoZSBjb2xsZWN0ZWQgdGFyZ2V0IGlkc1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0YXJnZXRJZHNbY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzLnB1c2goY2hhbmdlZFRvdWNoZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYW51cCByZW1vdmVkIHRvdWNoZXNcbiAgICAgICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuXG4gICAgaWYgKCFjaGFuZ2VkVGFyZ2V0VG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAgIC8vIG1lcmdlIHRhcmdldFRvdWNoZXMgd2l0aCBjaGFuZ2VkVGFyZ2V0VG91Y2hlcyBzbyBpdCBjb250YWlucyBBTEwgdG91Y2hlcywgaW5jbHVkaW5nICdlbmQnIGFuZCAnY2FuY2VsJ1xuICAgICAgICB1bmlxdWVBcnJheSh0YXJnZXRUb3VjaGVzLmNvbmNhdChjaGFuZ2VkVGFyZ2V0VG91Y2hlcyksICdpZGVudGlmaWVyJywgdHJ1ZSksXG4gICAgICAgIGNoYW5nZWRUYXJnZXRUb3VjaGVzXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb21iaW5lZCB0b3VjaCBhbmQgbW91c2UgaW5wdXRcbiAqXG4gKiBUb3VjaCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhlbiBtb3VzZSwgYW5kIHdoaWxlIHRvdWNoaW5nIG5vIG1vdXNlIGV2ZW50cyBhcmUgYWxsb3dlZC5cbiAqIFRoaXMgYmVjYXVzZSB0b3VjaCBkZXZpY2VzIGFsc28gZW1pdCBtb3VzZSBldmVudHMgd2hpbGUgZG9pbmcgYSB0b3VjaC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cblxudmFyIERFRFVQX1RJTUVPVVQgPSAyNTAwO1xudmFyIERFRFVQX0RJU1RBTkNFID0gMjU7XG5cbmZ1bmN0aW9uIFRvdWNoTW91c2VJbnB1dCgpIHtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdmFyIGhhbmRsZXIgPSBiaW5kRm4odGhpcy5oYW5kbGVyLCB0aGlzKTtcbiAgICB0aGlzLnRvdWNoID0gbmV3IFRvdWNoSW5wdXQodGhpcy5tYW5hZ2VyLCBoYW5kbGVyKTtcbiAgICB0aGlzLm1vdXNlID0gbmV3IE1vdXNlSW5wdXQodGhpcy5tYW5hZ2VyLCBoYW5kbGVyKTtcblxuICAgIHRoaXMucHJpbWFyeVRvdWNoID0gbnVsbDtcbiAgICB0aGlzLmxhc3RUb3VjaGVzID0gW107XG59XG5cbmluaGVyaXQoVG91Y2hNb3VzZUlucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRFdmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBUTUVoYW5kbGVyKG1hbmFnZXIsIGlucHV0RXZlbnQsIGlucHV0RGF0YSkge1xuICAgICAgICB2YXIgaXNUb3VjaCA9IChpbnB1dERhdGEucG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCksXG4gICAgICAgICAgICBpc01vdXNlID0gKGlucHV0RGF0YS5wb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX01PVVNFKTtcblxuICAgICAgICBpZiAoaXNNb3VzZSAmJiBpbnB1dERhdGEuc291cmNlQ2FwYWJpbGl0aWVzICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiB3ZSdyZSBpbiBhIHRvdWNoIGV2ZW50LCByZWNvcmQgdG91Y2hlcyB0byAgZGUtZHVwZSBzeW50aGV0aWMgbW91c2UgZXZlbnRcbiAgICAgICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgICAgICAgIHJlY29yZFRvdWNoZXMuY2FsbCh0aGlzLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW91c2UgJiYgaXNTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGlucHV0RGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRvdWNoLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3VzZS5kZXN0cm95KCk7XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlY29yZFRvdWNoZXMoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBldmVudERhdGEuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXI7XG4gICAgICAgIHNldExhc3RUb3VjaC5jYWxsKHRoaXMsIGV2ZW50RGF0YSk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0TGFzdFRvdWNoKGV2ZW50RGF0YSkge1xuICAgIHZhciB0b3VjaCA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnNbMF07XG5cbiAgICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5wcmltYXJ5VG91Y2gpIHtcbiAgICAgICAgdmFyIGxhc3RUb3VjaCA9IHt4OiB0b3VjaC5jbGllbnRYLCB5OiB0b3VjaC5jbGllbnRZfTtcbiAgICAgICAgdGhpcy5sYXN0VG91Y2hlcy5wdXNoKGxhc3RUb3VjaCk7XG4gICAgICAgIHZhciBsdHMgPSB0aGlzLmxhc3RUb3VjaGVzO1xuICAgICAgICB2YXIgcmVtb3ZlTGFzdFRvdWNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGx0cy5pbmRleE9mKGxhc3RUb3VjaCk7XG4gICAgICAgICAgICBpZiAoaSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbHRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2V0VGltZW91dChyZW1vdmVMYXN0VG91Y2gsIERFRFVQX1RJTUVPVVQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNTeW50aGV0aWNFdmVudChldmVudERhdGEpIHtcbiAgICB2YXIgeCA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRYLCB5ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5sYXN0VG91Y2hlc1tpXTtcbiAgICAgICAgdmFyIGR4ID0gTWF0aC5hYnMoeCAtIHQueCksIGR5ID0gTWF0aC5hYnMoeSAtIHQueSk7XG4gICAgICAgIGlmIChkeCA8PSBERURVUF9ESVNUQU5DRSAmJiBkeSA8PSBERURVUF9ESVNUQU5DRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgUFJFRklYRURfVE9VQ0hfQUNUSU9OID0gcHJlZml4ZWQoVEVTVF9FTEVNRU5ULnN0eWxlLCAndG91Y2hBY3Rpb24nKTtcbnZhciBOQVRJVkVfVE9VQ0hfQUNUSU9OID0gUFJFRklYRURfVE9VQ0hfQUNUSU9OICE9PSB1bmRlZmluZWQ7XG5cbi8vIG1hZ2ljYWwgdG91Y2hBY3Rpb24gdmFsdWVcbnZhciBUT1VDSF9BQ1RJT05fQ09NUFVURSA9ICdjb21wdXRlJztcbnZhciBUT1VDSF9BQ1RJT05fQVVUTyA9ICdhdXRvJztcbnZhciBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OID0gJ21hbmlwdWxhdGlvbic7IC8vIG5vdCBpbXBsZW1lbnRlZFxudmFyIFRPVUNIX0FDVElPTl9OT05FID0gJ25vbmUnO1xudmFyIFRPVUNIX0FDVElPTl9QQU5fWCA9ICdwYW4teCc7XG52YXIgVE9VQ0hfQUNUSU9OX1BBTl9ZID0gJ3Bhbi15JztcbnZhciBUT1VDSF9BQ1RJT05fTUFQID0gZ2V0VG91Y2hBY3Rpb25Qcm9wcygpO1xuXG4vKipcbiAqIFRvdWNoIEFjdGlvblxuICogc2V0cyB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgb3IgdXNlcyB0aGUganMgYWx0ZXJuYXRpdmVcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVG91Y2hBY3Rpb24obWFuYWdlciwgdmFsdWUpIHtcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbn1cblxuVG91Y2hBY3Rpb24ucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWUgb24gdGhlIGVsZW1lbnQgb3IgZW5hYmxlIHRoZSBwb2x5ZmlsbFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gZmluZCBvdXQgdGhlIHRvdWNoLWFjdGlvbiBieSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgaWYgKHZhbHVlID09IFRPVUNIX0FDVElPTl9DT01QVVRFKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE5BVElWRV9UT1VDSF9BQ1RJT04gJiYgdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGUgJiYgVE9VQ0hfQUNUSU9OX01BUFt2YWx1ZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW1BSRUZJWEVEX1RPVUNIX0FDVElPTl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGlvbnMgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICoganVzdCByZS1zZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5IGJhc2VkIG9uIHRoZSByZWNvZ25pemVyJ3Mgc2V0dGluZ3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICAgIGNvbXB1dGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYWN0aW9ucyA9IFtdO1xuICAgICAgICBlYWNoKHRoaXMubWFuYWdlci5yZWNvZ25pemVycywgZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICAgICAgaWYgKGJvb2xPckZuKHJlY29nbml6ZXIub3B0aW9ucy5lbmFibGUsIFtyZWNvZ25pemVyXSkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zID0gYWN0aW9ucy5jb25jYXQocmVjb2duaXplci5nZXRUb3VjaEFjdGlvbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zLmpvaW4oJyAnKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBlYWNoIGlucHV0IGN5Y2xlIGFuZCBwcm92aWRlcyB0aGUgcHJldmVudGluZyBvZiB0aGUgYnJvd3NlciBiZWhhdmlvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0czogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHNyY0V2ZW50ID0gaW5wdXQuc3JjRXZlbnQ7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5vZmZzZXREaXJlY3Rpb247XG5cbiAgICAgICAgLy8gaWYgdGhlIHRvdWNoIGFjdGlvbiBkaWQgcHJldmVudGVkIG9uY2UgdGhpcyBzZXNzaW9uXG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucztcbiAgICAgICAgdmFyIGhhc05vbmUgPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTk9ORSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgICAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9ZXTtcbiAgICAgICAgdmFyIGhhc1BhblggPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1gpICYmICFUT1VDSF9BQ1RJT05fTUFQW1RPVUNIX0FDVElPTl9QQU5fWF07XG5cbiAgICAgICAgaWYgKGhhc05vbmUpIHtcbiAgICAgICAgICAgIC8vZG8gbm90IHByZXZlbnQgZGVmYXVsdHMgaWYgdGhpcyBpcyBhIHRhcCBnZXN0dXJlXG5cbiAgICAgICAgICAgIHZhciBpc1RhcFBvaW50ZXIgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB2YXIgaXNUYXBNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgMjtcbiAgICAgICAgICAgIHZhciBpc1RhcFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IDI1MDtcblxuICAgICAgICAgICAgaWYgKGlzVGFwUG9pbnRlciAmJiBpc1RhcE1vdmVtZW50ICYmIGlzVGFwVG91Y2hUaW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1BhblggJiYgaGFzUGFuWSkge1xuICAgICAgICAgICAgLy8gYHBhbi14IHBhbi15YCBtZWFucyBicm93c2VyIGhhbmRsZXMgYWxsIHNjcm9sbGluZy9wYW5uaW5nLCBkbyBub3QgcHJldmVudFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc05vbmUgfHxcbiAgICAgICAgICAgIChoYXNQYW5ZICYmIGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB8fFxuICAgICAgICAgICAgKGhhc1BhblggJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmVudFNyYyhzcmNFdmVudCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FsbCBwcmV2ZW50RGVmYXVsdCB0byBwcmV2ZW50IHRoZSBicm93c2VyJ3MgZGVmYXVsdCBiZWhhdmlvciAoc2Nyb2xsaW5nIGluIG1vc3QgY2FzZXMpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNyY0V2ZW50XG4gICAgICovXG4gICAgcHJldmVudFNyYzogZnVuY3Rpb24oc3JjRXZlbnQpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIHdoZW4gdGhlIHRvdWNoQWN0aW9ucyBhcmUgY29sbGVjdGVkIHRoZXkgYXJlIG5vdCBhIHZhbGlkIHZhbHVlLCBzbyB3ZSBuZWVkIHRvIGNsZWFuIHRoaW5ncyB1cC4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbnNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zKSB7XG4gICAgLy8gbm9uZVxuICAgIGlmIChpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTk9ORSkpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSk7XG5cbiAgICAvLyBpZiBib3RoIHBhbi14IGFuZCBwYW4teSBhcmUgc2V0IChkaWZmZXJlbnQgcmVjb2duaXplcnNcbiAgICAvLyBmb3IgZGlmZmVyZW50IGRpcmVjdGlvbnMsIGUuZy4gaG9yaXpvbnRhbCBwYW4gYnV0IHZlcnRpY2FsIHN3aXBlPylcbiAgICAvLyB3ZSBuZWVkIG5vbmUgKGFzIG90aGVyd2lzZSB3aXRoIHBhbi14IHBhbi15IGNvbWJpbmVkIG5vbmUgb2YgdGhlc2VcbiAgICAvLyByZWNvZ25pemVycyB3aWxsIHdvcmssIHNpbmNlIHRoZSBicm93c2VyIHdvdWxkIGhhbmRsZSBhbGwgcGFubmluZ1xuICAgIGlmIChoYXNQYW5YICYmIGhhc1BhblkpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIC8vIHBhbi14IE9SIHBhbi15XG4gICAgaWYgKGhhc1BhblggfHwgaGFzUGFuWSkge1xuICAgICAgICByZXR1cm4gaGFzUGFuWCA/IFRPVUNIX0FDVElPTl9QQU5fWCA6IFRPVUNIX0FDVElPTl9QQU5fWTtcbiAgICB9XG5cbiAgICAvLyBtYW5pcHVsYXRpb25cbiAgICBpZiAoaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTikpIHtcbiAgICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT047XG4gICAgfVxuXG4gICAgcmV0dXJuIFRPVUNIX0FDVElPTl9BVVRPO1xufVxuXG5mdW5jdGlvbiBnZXRUb3VjaEFjdGlvblByb3BzKCkge1xuICAgIGlmICghTkFUSVZFX1RPVUNIX0FDVElPTikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB0b3VjaE1hcCA9IHt9O1xuICAgIHZhciBjc3NTdXBwb3J0cyA9IHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5zdXBwb3J0cztcbiAgICBbJ2F1dG8nLCAnbWFuaXB1bGF0aW9uJywgJ3Bhbi15JywgJ3Bhbi14JywgJ3Bhbi14IHBhbi15JywgJ25vbmUnXS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCkge1xuXG4gICAgICAgIC8vIElmIGNzcy5zdXBwb3J0cyBpcyBub3Qgc3VwcG9ydGVkIGJ1dCB0aGVyZSBpcyBuYXRpdmUgdG91Y2gtYWN0aW9uIGFzc3VtZSBpdCBzdXBwb3J0c1xuICAgICAgICAvLyBhbGwgdmFsdWVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBJRSAxMCBhbmQgMTEuXG4gICAgICAgIHRvdWNoTWFwW3ZhbF0gPSBjc3NTdXBwb3J0cyA/IHdpbmRvdy5DU1Muc3VwcG9ydHMoJ3RvdWNoLWFjdGlvbicsIHZhbCkgOiB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0b3VjaE1hcDtcbn1cblxuLyoqXG4gKiBSZWNvZ25pemVyIGZsb3cgZXhwbGFpbmVkOyAqXG4gKiBBbGwgcmVjb2duaXplcnMgaGF2ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBQT1NTSUJMRSB3aGVuIGEgaW5wdXQgc2Vzc2lvbiBzdGFydHMuXG4gKiBUaGUgZGVmaW5pdGlvbiBvZiBhIGlucHV0IHNlc3Npb24gaXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgdW50aWwgdGhlIGxhc3QgaW5wdXQsIHdpdGggYWxsIGl0J3MgbW92ZW1lbnQgaW4gaXQuICpcbiAqIEV4YW1wbGUgc2Vzc2lvbiBmb3IgbW91c2UtaW5wdXQ6IG1vdXNlZG93biAtPiBtb3VzZW1vdmUgLT4gbW91c2V1cFxuICpcbiAqIE9uIGVhY2ggcmVjb2duaXppbmcgY3ljbGUgKHNlZSBNYW5hZ2VyLnJlY29nbml6ZSkgdGhlIC5yZWNvZ25pemUoKSBtZXRob2QgaXMgZXhlY3V0ZWRcbiAqIHdoaWNoIGRldGVybWluZXMgd2l0aCBzdGF0ZSBpdCBzaG91bGQgYmUuXG4gKlxuICogSWYgdGhlIHJlY29nbml6ZXIgaGFzIHRoZSBzdGF0ZSBGQUlMRUQsIENBTkNFTExFRCBvciBSRUNPR05JWkVEIChlcXVhbHMgRU5ERUQpLCBpdCBpcyByZXNldCB0b1xuICogUE9TU0lCTEUgdG8gZ2l2ZSBpdCBhbm90aGVyIGNoYW5nZSBvbiB0aGUgbmV4dCBjeWNsZS5cbiAqXG4gKiAgICAgICAgICAgICAgIFBvc3NpYmxlXG4gKiAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLStcbiAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgKy0tLS0tKy0tLS0tKyAgICAgICAgICAgICAgIHxcbiAqICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgIHxcbiAqICAgRmFpbGVkICAgICAgQ2FuY2VsbGVkICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSstLS0tLS0rXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXplZCAgICAgICBCZWdhblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kZWQvUmVjb2duaXplZFxuICovXG52YXIgU1RBVEVfUE9TU0lCTEUgPSAxO1xudmFyIFNUQVRFX0JFR0FOID0gMjtcbnZhciBTVEFURV9DSEFOR0VEID0gNDtcbnZhciBTVEFURV9FTkRFRCA9IDg7XG52YXIgU1RBVEVfUkVDT0dOSVpFRCA9IFNUQVRFX0VOREVEO1xudmFyIFNUQVRFX0NBTkNFTExFRCA9IDE2O1xudmFyIFNUQVRFX0ZBSUxFRCA9IDMyO1xuXG4vKipcbiAqIFJlY29nbml6ZXJcbiAqIEV2ZXJ5IHJlY29nbml6ZXIgbmVlZHMgdG8gZXh0ZW5kIGZyb20gdGhpcyBjbGFzcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRoaXMuaWQgPSB1bmlxdWVJZCgpO1xuXG4gICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcblxuICAgIC8vIGRlZmF1bHQgaXMgZW5hYmxlIHRydWVcbiAgICB0aGlzLm9wdGlvbnMuZW5hYmxlID0gaWZVbmRlZmluZWQodGhpcy5vcHRpb25zLmVuYWJsZSwgdHJ1ZSk7XG5cbiAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG5cbiAgICB0aGlzLnNpbXVsdGFuZW91cyA9IHt9O1xuICAgIHRoaXMucmVxdWlyZUZhaWwgPSBbXTtcbn1cblxuUmVjb2duaXplci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIHNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtSZWNvZ25pemVyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBhc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBhbHNvIHVwZGF0ZSB0aGUgdG91Y2hBY3Rpb24sIGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgYWJvdXQgdGhlIGRpcmVjdGlvbnMvZW5hYmxlZCBzdGF0ZVxuICAgICAgICB0aGlzLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAncmVjb2duaXplV2l0aCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaW11bHRhbmVvdXMgPSB0aGlzLnNpbXVsdGFuZW91cztcbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBpZiAoIXNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdKSB7XG4gICAgICAgICAgICBzaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXSA9IG90aGVyUmVjb2duaXplcjtcbiAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZWNvZ25pemVXaXRoKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSBzaW11bHRhbmVvdXMgbGluay4gaXQgZG9lc250IHJlbW92ZSB0aGUgbGluayBvbiB0aGUgb3RoZXIgcmVjb2duaXplci5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgZHJvcFJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplciBjYW4gb25seSBydW4gd2hlbiBhbiBvdGhlciBpcyBmYWlsaW5nXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlcXVpcmVGYWlsdXJlOiBmdW5jdGlvbihvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ3JlcXVpcmVGYWlsdXJlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlcXVpcmVGYWlsID0gdGhpcy5yZXF1aXJlRmFpbDtcbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICBpZiAoaW5BcnJheShyZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlcXVpcmVGYWlsLnB1c2gob3RoZXJSZWNvZ25pemVyKTtcbiAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZXF1aXJlRmFpbHVyZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZHJvcCB0aGUgcmVxdWlyZUZhaWx1cmUgbGluay4gaXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVxdWlyZUZhaWx1cmU6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlcXVpcmVGYWlsdXJlJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHRoaXMucmVxdWlyZUZhaWwsIG90aGVyUmVjb2duaXplcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVGYWlsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhhcyByZXF1aXJlIGZhaWx1cmVzIGJvb2xlYW5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNSZXF1aXJlRmFpbHVyZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGggPiAwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGUgcmVjb2duaXplciBjYW4gcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNhblJlY29nbml6ZVdpdGg6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICByZXR1cm4gISF0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBZb3Ugc2hvdWxkIHVzZSBgdHJ5RW1pdGAgaW5zdGVhZCBvZiBgZW1pdGAgZGlyZWN0bHkgdG8gY2hlY2tcbiAgICAgKiB0aGF0IGFsbCB0aGUgbmVlZGVkIHJlY29nbml6ZXJzIGhhcyBmYWlsZWQgYmVmb3JlIGVtaXR0aW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICBmdW5jdGlvbiBlbWl0KGV2ZW50KSB7XG4gICAgICAgICAgICBzZWxmLm1hbmFnZXIuZW1pdChldmVudCwgaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJ3BhbnN0YXJ0JyBhbmQgJ3Bhbm1vdmUnXG4gICAgICAgIGlmIChzdGF0ZSA8IFNUQVRFX0VOREVEKSB7XG4gICAgICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCk7IC8vIHNpbXBsZSAnZXZlbnROYW1lJyBldmVudHNcblxuICAgICAgICBpZiAoaW5wdXQuYWRkaXRpb25hbEV2ZW50KSB7IC8vIGFkZGl0aW9uYWwgZXZlbnQocGFubGVmdCwgcGFucmlnaHQsIHBpbmNoaW4sIHBpbmNob3V0Li4uKVxuICAgICAgICAgICAgZW1pdChpbnB1dC5hZGRpdGlvbmFsRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFuZW5kIGFuZCBwYW5jYW5jZWxcbiAgICAgICAgaWYgKHN0YXRlID49IFNUQVRFX0VOREVEKSB7XG4gICAgICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmUgZmFpbHVyZSByZWNvZ25pemVycyBoYXMgZmFpbGVkLFxuICAgICAqIGlmIHRydWUsIGl0IGVtaXRzIGEgZ2VzdHVyZSBldmVudCxcbiAgICAgKiBvdGhlcndpc2UsIHNldHVwIHRoZSBzdGF0ZSB0byBGQUlMRUQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgdHJ5RW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuRW1pdCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpdCdzIGZhaWxpbmcgYW55d2F5XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNhbiB3ZSBlbWl0P1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNhbkVtaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMucmVxdWlyZUZhaWxbaV0uc3RhdGUgJiAoU1RBVEVfRkFJTEVEIHwgU1RBVEVfUE9TU0lCTEUpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSByZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24oaW5wdXREYXRhKSB7XG4gICAgICAgIC8vIG1ha2UgYSBuZXcgY29weSBvZiB0aGUgaW5wdXREYXRhXG4gICAgICAgIC8vIHNvIHdlIGNhbiBjaGFuZ2UgdGhlIGlucHV0RGF0YSB3aXRob3V0IG1lc3NpbmcgdXAgdGhlIG90aGVyIHJlY29nbml6ZXJzXG4gICAgICAgIHZhciBpbnB1dERhdGFDbG9uZSA9IGFzc2lnbih7fSwgaW5wdXREYXRhKTtcblxuICAgICAgICAvLyBpcyBpcyBlbmFibGVkIGFuZCBhbGxvdyByZWNvZ25pemluZz9cbiAgICAgICAgaWYgKCFib29sT3JGbih0aGlzLm9wdGlvbnMuZW5hYmxlLCBbdGhpcywgaW5wdXREYXRhQ2xvbmVdKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlc2V0IHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX1JFQ09HTklaRUQgfCBTVEFURV9DQU5DRUxMRUQgfCBTVEFURV9GQUlMRUQpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5wcm9jZXNzKGlucHV0RGF0YUNsb25lKTtcblxuICAgICAgICAvLyB0aGUgcmVjb2duaXplciBoYXMgcmVjb2duaXplZCBhIGdlc3R1cmVcbiAgICAgICAgLy8gc28gdHJpZ2dlciBhbiBldmVudFxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQgfCBTVEFURV9FTkRFRCB8IFNUQVRFX0NBTkNFTExFRCkpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5RW1pdChpbnB1dERhdGFDbG9uZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgcmVjb2duaXplclxuICAgICAqIHRoZSBhY3R1YWwgcmVjb2duaXppbmcgaGFwcGVucyBpbiB0aGlzIG1ldGhvZFxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqIEByZXR1cm5zIHtDb25zdH0gU1RBVEVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dERhdGEpIHsgfSwgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHByZWZlcnJlZCB0b3VjaC1hY3Rpb25cbiAgICAgKiBAdmlydHVhbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7IH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZ2VzdHVyZSBpc24ndCBhbGxvd2VkIHRvIHJlY29nbml6ZVxuICAgICAqIGxpa2Ugd2hlbiBhbm90aGVyIGlzIGJlaW5nIHJlY29nbml6ZWQgb3IgaXQgaXMgZGlzYWJsZWRcbiAgICAgKiBAdmlydHVhbFxuICAgICAqL1xuICAgIHJlc2V0OiBmdW5jdGlvbigpIHsgfVxufTtcblxuLyoqXG4gKiBnZXQgYSB1c2FibGUgc3RyaW5nLCB1c2VkIGFzIGV2ZW50IHBvc3RmaXhcbiAqIEBwYXJhbSB7Q29uc3R9IHN0YXRlXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdGF0ZVxuICovXG5mdW5jdGlvbiBzdGF0ZVN0cihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZSAmIFNUQVRFX0NBTkNFTExFRCkge1xuICAgICAgICByZXR1cm4gJ2NhbmNlbCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0VOREVEKSB7XG4gICAgICAgIHJldHVybiAnZW5kJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfQ0hBTkdFRCkge1xuICAgICAgICByZXR1cm4gJ21vdmUnO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9CRUdBTikge1xuICAgICAgICByZXR1cm4gJ3N0YXJ0JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIGRpcmVjdGlvbiBjb25zIHRvIHN0cmluZ1xuICogQHBhcmFtIHtDb25zdH0gZGlyZWN0aW9uXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBkaXJlY3Rpb25TdHIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTikge1xuICAgICAgICByZXR1cm4gJ2Rvd24nO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9VUCkge1xuICAgICAgICByZXR1cm4gJ3VwJztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fTEVGVCkge1xuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9SSUdIVCkge1xuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIGdldCBhIHJlY29nbml6ZXIgYnkgbmFtZSBpZiBpdCBpcyBib3VuZCB0byBhIG1hbmFnZXJcbiAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IG90aGVyUmVjb2duaXplclxuICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gKiBAcmV0dXJucyB7UmVjb2duaXplcn1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHJlY29nbml6ZXIpIHtcbiAgICB2YXIgbWFuYWdlciA9IHJlY29nbml6ZXIubWFuYWdlcjtcbiAgICBpZiAobWFuYWdlcikge1xuICAgICAgICByZXR1cm4gbWFuYWdlci5nZXQob3RoZXJSZWNvZ25pemVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG90aGVyUmVjb2duaXplcjtcbn1cblxuLyoqXG4gKiBUaGlzIHJlY29nbml6ZXIgaXMganVzdCB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgcmVjb2duaXplcnMuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gQXR0clJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5pbmhlcml0KEF0dHJSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBBdHRyUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICBwb2ludGVyczogMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIGl0IHRoZSByZWNvZ25pemVyIHJlY2VpdmVzIHZhbGlkIGlucHV0LCBsaWtlIGlucHV0LmRpc3RhbmNlID4gMTAuXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHJlY29nbml6ZWRcbiAgICAgKi9cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvblBvaW50ZXJzID0gdGhpcy5vcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICByZXR1cm4gb3B0aW9uUG9pbnRlcnMgPT09IDAgfHwgaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25Qb2ludGVycztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgaW5wdXQgYW5kIHJldHVybiB0aGUgc3RhdGUgZm9yIHRoZSByZWNvZ25pemVyXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMgeyp9IFN0YXRlXG4gICAgICovXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdmFyIGV2ZW50VHlwZSA9IGlucHV0LmV2ZW50VHlwZTtcblxuICAgICAgICB2YXIgaXNSZWNvZ25pemVkID0gc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEKTtcbiAgICAgICAgdmFyIGlzVmFsaWQgPSB0aGlzLmF0dHJUZXN0KGlucHV0KTtcblxuICAgICAgICAvLyBvbiBjYW5jZWwgaW5wdXQgYW5kIHdlJ3ZlIHJlY29nbml6ZWQgYmVmb3JlLCByZXR1cm4gU1RBVEVfQ0FOQ0VMTEVEXG4gICAgICAgIGlmIChpc1JlY29nbml6ZWQgJiYgKGV2ZW50VHlwZSAmIElOUFVUX0NBTkNFTCB8fCAhaXNWYWxpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0NBTkNFTExFRDtcbiAgICAgICAgfSBlbHNlIGlmIChpc1JlY29nbml6ZWQgfHwgaXNWYWxpZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0VOREVEO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghKHN0YXRlICYgU1RBVEVfQkVHQU4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0JFR0FOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfQ0hBTkdFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFBhblxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gYW5kIG1vdmVkIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUGFuUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5wWCA9IG51bGw7XG4gICAgdGhpcy5wWSA9IG51bGw7XG59XG5cbmluaGVyaXQoUGFuUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBhblJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3BhbicsXG4gICAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9BTExcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aW9ucztcbiAgICB9LFxuXG4gICAgZGlyZWN0aW9uVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHZhciBoYXNNb3ZlZCA9IHRydWU7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9IGlucHV0LmRpc3RhbmNlO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gaW5wdXQuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgeCA9IGlucHV0LmRlbHRhWDtcbiAgICAgICAgdmFyIHkgPSBpbnB1dC5kZWx0YVk7XG5cbiAgICAgICAgLy8gbG9jayB0byBheGlzP1xuICAgICAgICBpZiAoIShkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gKHggPT09IDApID8gRElSRUNUSU9OX05PTkUgOiAoeCA8IDApID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgICAgICAgaGFzTW92ZWQgPSB4ICE9IHRoaXMucFg7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAoeSA9PT0gMCkgPyBESVJFQ1RJT05fTk9ORSA6ICh5IDwgMCkgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlZCA9IHkgIT0gdGhpcy5wWTtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0LmRlbHRhWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICByZXR1cm4gaGFzTW92ZWQgJiYgZGlzdGFuY2UgPiBvcHRpb25zLnRocmVzaG9sZCAmJiBkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbjtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBBdHRyUmVjb2duaXplci5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgICh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4gfHwgKCEodGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKSAmJiB0aGlzLmRpcmVjdGlvblRlc3QoaW5wdXQpKSk7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG5cbiAgICAgICAgdGhpcy5wWCA9IGlucHV0LmRlbHRhWDtcbiAgICAgICAgdGhpcy5wWSA9IGlucHV0LmRlbHRhWTtcblxuICAgICAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0LmRpcmVjdGlvbik7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLCBpbnB1dCk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogUGluY2hcbiAqIFJlY29nbml6ZWQgd2hlbiB0d28gb3IgbW9yZSBwb2ludGVycyBhcmUgbW92aW5nIHRvd2FyZCAoem9vbS1pbikgb3IgYXdheSBmcm9tIGVhY2ggb3RoZXIgKHpvb20tb3V0KS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUGluY2hSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoUGluY2hSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdwaW5jaCcsXG4gICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKE1hdGguYWJzKGlucHV0LnNjYWxlIC0gMSkgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5zY2FsZSAhPT0gMSkge1xuICAgICAgICAgICAgdmFyIGluT3V0ID0gaW5wdXQuc2NhbGUgPCAxID8gJ2luJyA6ICdvdXQnO1xuICAgICAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgaW5PdXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBQcmVzc1xuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gZm9yIHggbXMgd2l0aG91dCBhbnkgbW92ZW1lbnQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gUHJlc3NSZWNvZ25pemVyKCkge1xuICAgIFJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG59XG5cbmluaGVyaXQoUHJlc3NSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQcmVzc1JlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3ByZXNzJyxcbiAgICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICAgIHRpbWU6IDI1MSwgLy8gbWluaW1hbCB0aW1lIG9mIHRoZSBwb2ludGVyIHRvIGJlIHByZXNzZWRcbiAgICAgICAgdGhyZXNob2xkOiA5IC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fQVVUT107XG4gICAgfSxcblxuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICAgICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB2YXIgdmFsaWRUaW1lID0gaW5wdXQuZGVsdGFUaW1lID4gb3B0aW9ucy50aW1lO1xuXG4gICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgICAgLy8gYW5kIHdlJ3ZlIHJlYWNoZWQgYW4gZW5kIGV2ZW50LCBzbyBhIHRhcCBpcyBwb3NzaWJsZVxuICAgICAgICBpZiAoIXZhbGlkTW92ZW1lbnQgfHwgIXZhbGlkUG9pbnRlcnMgfHwgKGlucHV0LmV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmICF2YWxpZFRpbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLnRpbWUsIHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlucHV0ICYmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyAndXAnLCBpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8qKlxuICogUm90YXRlXG4gKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlciBhcmUgbW92aW5nIGluIGEgY2lyY3VsYXIgbW90aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBSb3RhdGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoUm90YXRlUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFJvdGF0ZVJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3JvdGF0ZScsXG4gICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKE1hdGguYWJzKGlucHV0LnJvdGF0aW9uKSA+IHRoaXMub3B0aW9ucy50aHJlc2hvbGQgfHwgdGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBTd2lwZVxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIG1vdmluZyBmYXN0ICh2ZWxvY2l0eSksIHdpdGggZW5vdWdoIGRpc3RhbmNlIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gU3dpcGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoU3dpcGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgU3dpcGVSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICdzd2lwZScsXG4gICAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICAgIHZlbG9jaXR5OiAwLjMsXG4gICAgICAgIGRpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwsXG4gICAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFBhblJlY29nbml6ZXIucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyk7XG4gICAgfSxcblxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIHZlbG9jaXR5O1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gJiAoRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYO1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICAgICAgdmVsb2NpdHkgPSBpbnB1dC5vdmVyYWxsVmVsb2NpdHlZO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICBkaXJlY3Rpb24gJiBpbnB1dC5vZmZzZXREaXJlY3Rpb24gJiZcbiAgICAgICAgICAgIGlucHV0LmRpc3RhbmNlID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCAmJlxuICAgICAgICAgICAgaW5wdXQubWF4UG9pbnRlcnMgPT0gdGhpcy5vcHRpb25zLnBvaW50ZXJzICYmXG4gICAgICAgICAgICBhYnModmVsb2NpdHkpID4gdGhpcy5vcHRpb25zLnZlbG9jaXR5ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORDtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvblN0cihpbnB1dC5vZmZzZXREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb24sIGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgaW5wdXQpO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEEgdGFwIGlzIGVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvaW5nIGEgc21hbGwgdGFwL2NsaWNrLiBNdWx0aXBsZSB0YXBzIGFyZSByZWNvZ25pemVkIGlmIHRoZXkgb2NjdXJcbiAqIGJldHdlZW4gdGhlIGdpdmVuIGludGVydmFsIGFuZCBwb3NpdGlvbi4gVGhlIGRlbGF5IG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUgbXVsdGktdGFwcyB3aXRob3V0IGZpcmluZ1xuICogYSBzaW5nbGUgdGFwLlxuICpcbiAqIFRoZSBldmVudERhdGEgZnJvbSB0aGUgZW1pdHRlZCBldmVudCBjb250YWlucyB0aGUgcHJvcGVydHkgYHRhcENvdW50YCwgd2hpY2ggY29udGFpbnMgdGhlIGFtb3VudCBvZlxuICogbXVsdGktdGFwcyBiZWluZyByZWNvZ25pemVkLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFRhcFJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gcHJldmlvdXMgdGltZSBhbmQgY2VudGVyLFxuICAgIC8vIHVzZWQgZm9yIHRhcCBjb3VudGluZ1xuICAgIHRoaXMucFRpbWUgPSBmYWxzZTtcbiAgICB0aGlzLnBDZW50ZXIgPSBmYWxzZTtcblxuICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG4gICAgdGhpcy5jb3VudCA9IDA7XG59XG5cbmluaGVyaXQoVGFwUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgZXZlbnQ6ICd0YXAnLFxuICAgICAgICBwb2ludGVyczogMSxcbiAgICAgICAgdGFwczogMSxcbiAgICAgICAgaW50ZXJ2YWw6IDMwMCwgLy8gbWF4IHRpbWUgYmV0d2VlbiB0aGUgbXVsdGktdGFwIHRhcHNcbiAgICAgICAgdGltZTogMjUwLCAvLyBtYXggdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBkb3duIChsaWtlIGZpbmdlciBvbiB0aGUgc2NyZWVuKVxuICAgICAgICB0aHJlc2hvbGQ6IDksIC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgICAgIHBvc1RocmVzaG9sZDogMTAgLy8gYSBtdWx0aS10YXAgY2FuIGJlIGEgYml0IG9mZiB0aGUgaW5pdGlhbCBwb3NpdGlvblxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTl07XG4gICAgfSxcblxuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICB2YXIgdmFsaWRNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHZhciB2YWxpZFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IG9wdGlvbnMudGltZTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgaWYgKChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkgJiYgKHRoaXMuY291bnQgPT09IDApKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgICAgLy8gYW5kIHdlJ3ZlIHJlYWNoZWQgYW4gZW5kIGV2ZW50LCBzbyBhIHRhcCBpcyBwb3NzaWJsZVxuICAgICAgICBpZiAodmFsaWRNb3ZlbWVudCAmJiB2YWxpZFRvdWNoVGltZSAmJiB2YWxpZFBvaW50ZXJzKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9IElOUFVUX0VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB2YWxpZEludGVydmFsID0gdGhpcy5wVGltZSA/IChpbnB1dC50aW1lU3RhbXAgLSB0aGlzLnBUaW1lIDwgb3B0aW9ucy5pbnRlcnZhbCkgOiB0cnVlO1xuICAgICAgICAgICAgdmFyIHZhbGlkTXVsdGlUYXAgPSAhdGhpcy5wQ2VudGVyIHx8IGdldERpc3RhbmNlKHRoaXMucENlbnRlciwgaW5wdXQuY2VudGVyKSA8IG9wdGlvbnMucG9zVGhyZXNob2xkO1xuXG4gICAgICAgICAgICB0aGlzLnBUaW1lID0gaW5wdXQudGltZVN0YW1wO1xuICAgICAgICAgICAgdGhpcy5wQ2VudGVyID0gaW5wdXQuY2VudGVyO1xuXG4gICAgICAgICAgICBpZiAoIXZhbGlkTXVsdGlUYXAgfHwgIXZhbGlkSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgICAgICAvLyBpZiB0YXAgY291bnQgbWF0Y2hlcyB3ZSBoYXZlIHJlY29nbml6ZWQgaXQsXG4gICAgICAgICAgICAvLyBlbHNlIGl0IGhhcyBiZWdhbiByZWNvZ25pemluZy4uLlxuICAgICAgICAgICAgdmFyIHRhcENvdW50ID0gdGhpcy5jb3VudCAlIG9wdGlvbnMudGFwcztcbiAgICAgICAgICAgIGlmICh0YXBDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGZhaWxpbmcgcmVxdWlyZW1lbnRzLCBpbW1lZGlhdGVseSB0cmlnZ2VyIHRoZSB0YXAgZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBvciB3YWl0IGFzIGxvbmcgYXMgdGhlIG11bHRpdGFwIGludGVydmFsIHRvIHRyaWdnZXJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIG9wdGlvbnMuaW50ZXJ2YWwsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIGZhaWxUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgICAgIH0sIHRoaXMub3B0aW9ucy5pbnRlcnZhbCwgdGhpcyk7XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRhcENvdW50ID0gdGhpcy5jb3VudDtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8qKlxuICogU2ltcGxlIHdheSB0byBjcmVhdGUgYSBtYW5hZ2VyIHdpdGggYSBkZWZhdWx0IHNldCBvZiByZWNvZ25pemVycy5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBIYW1tZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmVjb2duaXplcnMgPSBpZlVuZGVmaW5lZChvcHRpb25zLnJlY29nbml6ZXJzLCBIYW1tZXIuZGVmYXVsdHMucHJlc2V0KTtcbiAgICByZXR1cm4gbmV3IE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogQGNvbnN0IHtzdHJpbmd9XG4gKi9cbkhhbW1lci5WRVJTSU9OID0gJzIuMC43JztcblxuLyoqXG4gKiBkZWZhdWx0IHNldHRpbmdzXG4gKiBAbmFtZXNwYWNlXG4gKi9cbkhhbW1lci5kZWZhdWx0cyA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgaWYgRE9NIGV2ZW50cyBhcmUgYmVpbmcgdHJpZ2dlcmVkLlxuICAgICAqIEJ1dCB0aGlzIGlzIHNsb3dlciBhbmQgdW51c2VkIGJ5IHNpbXBsZSBpbXBsZW1lbnRhdGlvbnMsIHNvIGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBkb21FdmVudHM6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGZvciB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkvZmFsbGJhY2suXG4gICAgICogV2hlbiBzZXQgdG8gYGNvbXB1dGVgIGl0IHdpbGwgbWFnaWNhbGx5IHNldCB0aGUgY29ycmVjdCB2YWx1ZSBiYXNlZCBvbiB0aGUgYWRkZWQgcmVjb2duaXplcnMuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKiBAZGVmYXVsdCBjb21wdXRlXG4gICAgICovXG4gICAgdG91Y2hBY3Rpb246IFRPVUNIX0FDVElPTl9DT01QVVRFLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZTogdHJ1ZSxcblxuICAgIC8qKlxuICAgICAqIEVYUEVSSU1FTlRBTCBGRUFUVVJFIC0tIGNhbiBiZSByZW1vdmVkL2NoYW5nZWRcbiAgICAgKiBDaGFuZ2UgdGhlIHBhcmVudCBpbnB1dCB0YXJnZXQgZWxlbWVudC5cbiAgICAgKiBJZiBOdWxsLCB0aGVuIGl0IGlzIGJlaW5nIHNldCB0aGUgdG8gbWFpbiBlbGVtZW50LlxuICAgICAqIEB0eXBlIHtOdWxsfEV2ZW50VGFyZ2V0fVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBpbnB1dFRhcmdldDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIGZvcmNlIGFuIGlucHV0IGNsYXNzXG4gICAgICogQHR5cGUge051bGx8RnVuY3Rpb259XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuICAgIGlucHV0Q2xhc3M6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHJlY29nbml6ZXIgc2V0dXAgd2hlbiBjYWxsaW5nIGBIYW1tZXIoKWBcbiAgICAgKiBXaGVuIGNyZWF0aW5nIGEgbmV3IE1hbmFnZXIgdGhlc2Ugd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgKi9cbiAgICBwcmVzZXQ6IFtcbiAgICAgICAgLy8gUmVjb2duaXplckNsYXNzLCBvcHRpb25zLCBbcmVjb2duaXplV2l0aCwgLi4uXSwgW3JlcXVpcmVGYWlsdXJlLCAuLi5dXG4gICAgICAgIFtSb3RhdGVSZWNvZ25pemVyLCB7ZW5hYmxlOiBmYWxzZX1dLFxuICAgICAgICBbUGluY2hSZWNvZ25pemVyLCB7ZW5hYmxlOiBmYWxzZX0sIFsncm90YXRlJ11dLFxuICAgICAgICBbU3dpcGVSZWNvZ25pemVyLCB7ZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTH1dLFxuICAgICAgICBbUGFuUmVjb2duaXplciwge2RpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUx9LCBbJ3N3aXBlJ11dLFxuICAgICAgICBbVGFwUmVjb2duaXplcl0sXG4gICAgICAgIFtUYXBSZWNvZ25pemVyLCB7ZXZlbnQ6ICdkb3VibGV0YXAnLCB0YXBzOiAyfSwgWyd0YXAnXV0sXG4gICAgICAgIFtQcmVzc1JlY29nbml6ZXJdXG4gICAgXSxcblxuICAgIC8qKlxuICAgICAqIFNvbWUgQ1NTIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgd29ya2luZyBvZiBIYW1tZXIuXG4gICAgICogQWRkIHRoZW0gdG8gdGhpcyBtZXRob2QgYW5kIHRoZXkgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyLlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKi9cbiAgICBjc3NQcm9wczoge1xuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGV4dCBzZWxlY3Rpb24gdG8gaW1wcm92ZSB0aGUgZHJhZ2dpbmcgZ2VzdHVyZS4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZSB0aGUgV2luZG93cyBQaG9uZSBncmlwcGVycyB3aGVuIHByZXNzaW5nIGFuIGVsZW1lbnQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2hTZWxlY3Q6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlzYWJsZXMgdGhlIGRlZmF1bHQgY2FsbG91dCBzaG93biB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldC5cbiAgICAgICAgICogT24gaU9TLCB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldCBzdWNoIGFzIGEgbGluaywgU2FmYXJpIGRpc3BsYXlzXG4gICAgICAgICAqIGEgY2FsbG91dCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rLiBUaGlzIHByb3BlcnR5IGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGF0IGNhbGxvdXQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHpvb21pbmcgaXMgZW5hYmxlZC4gVXNlZCBieSBJRTEwPlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIGNvbnRlbnRab29taW5nOiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGF0IGFuIGVudGlyZSBlbGVtZW50IHNob3VsZCBiZSBkcmFnZ2FibGUgaW5zdGVhZCBvZiBpdHMgY29udGVudHMuIE1haW5seSBmb3IgZGVza3RvcCBicm93c2Vycy5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyRHJhZzogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPdmVycmlkZXMgdGhlIGhpZ2hsaWdodCBjb2xvciBzaG93biB3aGVuIHRoZSB1c2VyIHRhcHMgYSBsaW5rIG9yIGEgSmF2YVNjcmlwdFxuICAgICAgICAgKiBjbGlja2FibGUgZWxlbWVudCBpbiBpT1MuIFRoaXMgcHJvcGVydHkgb2JleXMgdGhlIGFscGhhIHZhbHVlLCBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdyZ2JhKDAsMCwwLDApJ1xuICAgICAgICAgKi9cbiAgICAgICAgdGFwSGlnaGxpZ2h0Q29sb3I6ICdyZ2JhKDAsMCwwLDApJ1xuICAgIH1cbn07XG5cbnZhciBTVE9QID0gMTtcbnZhciBGT1JDRURfU1RPUCA9IDI7XG5cbi8qKlxuICogTWFuYWdlclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgSGFtbWVyLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldCA9IHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldCB8fCBlbGVtZW50O1xuXG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMucmVjb2duaXplcnMgPSBbXTtcbiAgICB0aGlzLm9sZENzc1Byb3BzID0ge307XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuaW5wdXQgPSBjcmVhdGVJbnB1dEluc3RhbmNlKHRoaXMpO1xuICAgIHRoaXMudG91Y2hBY3Rpb24gPSBuZXcgVG91Y2hBY3Rpb24odGhpcywgdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKTtcblxuICAgIHRvZ2dsZUNzc1Byb3BzKHRoaXMsIHRydWUpO1xuXG4gICAgZWFjaCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgdmFyIHJlY29nbml6ZXIgPSB0aGlzLmFkZChuZXcgKGl0ZW1bMF0pKGl0ZW1bMV0pKTtcbiAgICAgICAgaXRlbVsyXSAmJiByZWNvZ25pemVyLnJlY29nbml6ZVdpdGgoaXRlbVsyXSk7XG4gICAgICAgIGl0ZW1bM10gJiYgcmVjb2duaXplci5yZXF1aXJlRmFpbHVyZShpdGVtWzNdKTtcbiAgICB9LCB0aGlzKTtcbn1cblxuTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBhc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBPcHRpb25zIHRoYXQgbmVlZCBhIGxpdHRsZSBtb3JlIHNldHVwXG4gICAgICAgIGlmIChvcHRpb25zLnRvdWNoQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmlucHV0VGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBldmVudCBsaXN0ZW5lcnMgYW5kIHJlaW5pdGlhbGl6ZVxuICAgICAgICAgICAgdGhpcy5pbnB1dC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0LnRhcmdldCA9IG9wdGlvbnMuaW5wdXRUYXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmlucHV0LmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc3RvcCByZWNvZ25pemluZyBmb3IgdGhpcyBzZXNzaW9uLlxuICAgICAqIFRoaXMgc2Vzc2lvbiB3aWxsIGJlIGRpc2NhcmRlZCwgd2hlbiBhIG5ldyBbaW5wdXRdc3RhcnQgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogV2hlbiBmb3JjZWQsIHRoZSByZWNvZ25pemVyIGN5Y2xlIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VdXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24oZm9yY2UpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnN0b3BwZWQgPSBmb3JjZSA/IEZPUkNFRF9TVE9QIDogU1RPUDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcnVuIHRoZSByZWNvZ25pemVycyFcbiAgICAgKiBjYWxsZWQgYnkgdGhlIGlucHV0SGFuZGxlciBmdW5jdGlvbiBvbiBldmVyeSBtb3ZlbWVudCBvZiB0aGUgcG9pbnRlcnMgKHRvdWNoZXMpXG4gICAgICogaXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHJlY29nbml6ZXJzIGFuZCB0cmllcyB0byBkZXRlY3QgdGhlIGdlc3R1cmUgdGhhdCBpcyBiZWluZyBtYWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24oaW5wdXREYXRhKSB7XG4gICAgICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zdG9wcGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW4gdGhlIHRvdWNoLWFjdGlvbiBwb2x5ZmlsbFxuICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnByZXZlbnREZWZhdWx0cyhpbnB1dERhdGEpO1xuXG4gICAgICAgIHZhciByZWNvZ25pemVyO1xuICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuXG4gICAgICAgIC8vIHRoaXMgaG9sZHMgdGhlIHJlY29nbml6ZXIgdGhhdCBpcyBiZWluZyByZWNvZ25pemVkLlxuICAgICAgICAvLyBzbyB0aGUgcmVjb2duaXplcidzIHN0YXRlIG5lZWRzIHRvIGJlIEJFR0FOLCBDSEFOR0VELCBFTkRFRCBvciBSRUNPR05JWkVEXG4gICAgICAgIC8vIGlmIG5vIHJlY29nbml6ZXIgaXMgZGV0ZWN0aW5nIGEgdGhpbmcsIGl0IGlzIHNldCB0byBgbnVsbGBcbiAgICAgICAgdmFyIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXI7XG5cbiAgICAgICAgLy8gcmVzZXQgd2hlbiB0aGUgbGFzdCByZWNvZ25pemVyIGlzIHJlY29nbml6ZWRcbiAgICAgICAgLy8gb3Igd2hlbiB3ZSdyZSBpbiBhIG5ldyBzZXNzaW9uXG4gICAgICAgIGlmICghY3VyUmVjb2duaXplciB8fCAoY3VyUmVjb2duaXplciAmJiBjdXJSZWNvZ25pemVyLnN0YXRlICYgU1RBVEVfUkVDT0dOSVpFRCkpIHtcbiAgICAgICAgICAgIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHJlY29nbml6ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVjb2duaXplciA9IHJlY29nbml6ZXJzW2ldO1xuXG4gICAgICAgICAgICAvLyBmaW5kIG91dCBpZiB3ZSBhcmUgYWxsb3dlZCB0cnkgdG8gcmVjb2duaXplIHRoZSBpbnB1dCBmb3IgdGhpcyBvbmUuXG4gICAgICAgICAgICAvLyAxLiAgIGFsbG93IGlmIHRoZSBzZXNzaW9uIGlzIE5PVCBmb3JjZWQgc3RvcHBlZCAoc2VlIHRoZSAuc3RvcCgpIG1ldGhvZClcbiAgICAgICAgICAgIC8vIDIuICAgYWxsb3cgaWYgd2Ugc3RpbGwgaGF2ZW4ndCByZWNvZ25pemVkIGEgZ2VzdHVyZSBpbiB0aGlzIHNlc3Npb24sIG9yIHRoZSB0aGlzIHJlY29nbml6ZXIgaXMgdGhlIG9uZVxuICAgICAgICAgICAgLy8gICAgICB0aGF0IGlzIGJlaW5nIHJlY29nbml6ZWQuXG4gICAgICAgICAgICAvLyAzLiAgIGFsbG93IGlmIHRoZSByZWNvZ25pemVyIGlzIGFsbG93ZWQgdG8gcnVuIHNpbXVsdGFuZW91cyB3aXRoIHRoZSBjdXJyZW50IHJlY29nbml6ZWQgcmVjb2duaXplci5cbiAgICAgICAgICAgIC8vICAgICAgdGhpcyBjYW4gYmUgc2V0dXAgd2l0aCB0aGUgYHJlY29nbml6ZVdpdGgoKWAgbWV0aG9kIG9uIHRoZSByZWNvZ25pemVyLlxuICAgICAgICAgICAgaWYgKHNlc3Npb24uc3RvcHBlZCAhPT0gRk9SQ0VEX1NUT1AgJiYgKCAvLyAxXG4gICAgICAgICAgICAgICAgICAgICFjdXJSZWNvZ25pemVyIHx8IHJlY29nbml6ZXIgPT0gY3VyUmVjb2duaXplciB8fCAvLyAyXG4gICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXIuY2FuUmVjb2duaXplV2l0aChjdXJSZWNvZ25pemVyKSkpIHsgLy8gM1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXIucmVjb2duaXplKGlucHV0RGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29nbml6ZXIgaGFzIGJlZW4gcmVjb2duaXppbmcgdGhlIGlucHV0IGFzIGEgdmFsaWQgZ2VzdHVyZSwgd2Ugd2FudCB0byBzdG9yZSB0aGlzIG9uZSBhcyB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJlY29nbml6ZXIuIGJ1dCBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgcmVjb2duaXplclxuICAgICAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyICYmIHJlY29nbml6ZXIuc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEIHwgU1RBVEVfRU5ERUQpKSB7XG4gICAgICAgICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IHJlY29nbml6ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZ2V0IGEgcmVjb2duaXplciBieSBpdHMgZXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TnVsbH1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKHJlY29nbml6ZXIgaW5zdGFuY2VvZiBSZWNvZ25pemVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjb2duaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb2duaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChyZWNvZ25pemVyc1tpXS5vcHRpb25zLmV2ZW50ID09IHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb2duaXplcnNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGFkZCBhIHJlY29nbml6ZXIgdG8gdGhlIG1hbmFnZXJcbiAgICAgKiBleGlzdGluZyByZWNvZ25pemVycyB3aXRoIHRoZSBzYW1lIGV2ZW50IG5hbWUgd2lsbCBiZSByZW1vdmVkXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TWFuYWdlcn1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdhZGQnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmdcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdGhpcy5nZXQocmVjb2duaXplci5vcHRpb25zLmV2ZW50KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZShleGlzdGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2duaXplcik7XG4gICAgICAgIHJlY29nbml6ZXIubWFuYWdlciA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHJlY29nbml6ZXI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhIHJlY29nbml6ZXIgYnkgbmFtZSBvciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7TWFuYWdlcn1cbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHtcbiAgICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdyZW1vdmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICByZWNvZ25pemVyID0gdGhpcy5nZXQocmVjb2duaXplcik7XG5cbiAgICAgICAgLy8gbGV0J3MgbWFrZSBzdXJlIHRoaXMgcmVjb2duaXplciBleGlzdHNcbiAgICAgICAgaWYgKHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHJlY29nbml6ZXJzLCByZWNvZ25pemVyKTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlY29nbml6ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIGV2ZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tldmVudF0gPSBoYW5kbGVyc1tldmVudF0gfHwgW107XG4gICAgICAgICAgICBoYW5kbGVyc1tldmVudF0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgZXZlbnQsIGxlYXZlIGVtaXQgYmxhbmsgdG8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaGFuZGxlcl1cbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihldmVudHMsIGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlcnNbZXZlbnRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1tldmVudF0gJiYgaGFuZGxlcnNbZXZlbnRdLnNwbGljZShpbkFycmF5KGhhbmRsZXJzW2V2ZW50XSwgaGFuZGxlciksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGVtaXQgZXZlbnQgdG8gdGhlIGxpc3RlbmVyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgLy8gd2UgYWxzbyB3YW50IHRvIHRyaWdnZXIgZG9tIGV2ZW50c1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRvbUV2ZW50cykge1xuICAgICAgICAgICAgdHJpZ2dlckRvbUV2ZW50KGV2ZW50LCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGhhbmRsZXJzLCBzbyBza2lwIGl0IGFsbFxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW2V2ZW50XSAmJiB0aGlzLmhhbmRsZXJzW2V2ZW50XS5zbGljZSgpO1xuICAgICAgICBpZiAoIWhhbmRsZXJzIHx8ICFoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEudHlwZSA9IGV2ZW50O1xuICAgICAgICBkYXRhLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBkYXRhLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgaGFuZGxlcnNbaV0oZGF0YSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZGVzdHJveSB0aGUgbWFuYWdlciBhbmQgdW5iaW5kcyBhbGwgZXZlbnRzXG4gICAgICogaXQgZG9lc24ndCB1bmJpbmQgZG9tIGV2ZW50cywgdGhhdCBpcyB0aGUgdXNlciBvd24gcmVzcG9uc2liaWxpdHlcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ICYmIHRvZ2dsZUNzc1Byb3BzKHRoaXMsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICB9XG59O1xuXG4vKipcbiAqIGFkZC9yZW1vdmUgdGhlIGNzcyBwcm9wZXJ0aWVzIGFzIGRlZmluZWQgaW4gbWFuYWdlci5vcHRpb25zLmNzc1Byb3BzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYWRkXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNzc1Byb3BzKG1hbmFnZXIsIGFkZCkge1xuICAgIHZhciBlbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIGlmICghZWxlbWVudC5zdHlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwcm9wO1xuICAgIGVhY2gobWFuYWdlci5vcHRpb25zLmNzc1Byb3BzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBwcm9wID0gcHJlZml4ZWQoZWxlbWVudC5zdHlsZSwgbmFtZSk7XG4gICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gPSBlbGVtZW50LnN0eWxlW3Byb3BdO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gfHwgJyc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWFkZCkge1xuICAgICAgICBtYW5hZ2VyLm9sZENzc1Byb3BzID0ge307XG4gICAgfVxufVxuXG4vKipcbiAqIHRyaWdnZXIgZG9tIGV2ZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyaWdnZXJEb21FdmVudChldmVudCwgZGF0YSkge1xuICAgIHZhciBnZXN0dXJlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBnZXN0dXJlRXZlbnQuaW5pdEV2ZW50KGV2ZW50LCB0cnVlLCB0cnVlKTtcbiAgICBnZXN0dXJlRXZlbnQuZ2VzdHVyZSA9IGRhdGE7XG4gICAgZGF0YS50YXJnZXQuZGlzcGF0Y2hFdmVudChnZXN0dXJlRXZlbnQpO1xufVxuXG5hc3NpZ24oSGFtbWVyLCB7XG4gICAgSU5QVVRfU1RBUlQ6IElOUFVUX1NUQVJULFxuICAgIElOUFVUX01PVkU6IElOUFVUX01PVkUsXG4gICAgSU5QVVRfRU5EOiBJTlBVVF9FTkQsXG4gICAgSU5QVVRfQ0FOQ0VMOiBJTlBVVF9DQU5DRUwsXG5cbiAgICBTVEFURV9QT1NTSUJMRTogU1RBVEVfUE9TU0lCTEUsXG4gICAgU1RBVEVfQkVHQU46IFNUQVRFX0JFR0FOLFxuICAgIFNUQVRFX0NIQU5HRUQ6IFNUQVRFX0NIQU5HRUQsXG4gICAgU1RBVEVfRU5ERUQ6IFNUQVRFX0VOREVELFxuICAgIFNUQVRFX1JFQ09HTklaRUQ6IFNUQVRFX1JFQ09HTklaRUQsXG4gICAgU1RBVEVfQ0FOQ0VMTEVEOiBTVEFURV9DQU5DRUxMRUQsXG4gICAgU1RBVEVfRkFJTEVEOiBTVEFURV9GQUlMRUQsXG5cbiAgICBESVJFQ1RJT05fTk9ORTogRElSRUNUSU9OX05PTkUsXG4gICAgRElSRUNUSU9OX0xFRlQ6IERJUkVDVElPTl9MRUZULFxuICAgIERJUkVDVElPTl9SSUdIVDogRElSRUNUSU9OX1JJR0hULFxuICAgIERJUkVDVElPTl9VUDogRElSRUNUSU9OX1VQLFxuICAgIERJUkVDVElPTl9ET1dOOiBESVJFQ1RJT05fRE9XTixcbiAgICBESVJFQ1RJT05fSE9SSVpPTlRBTDogRElSRUNUSU9OX0hPUklaT05UQUwsXG4gICAgRElSRUNUSU9OX1ZFUlRJQ0FMOiBESVJFQ1RJT05fVkVSVElDQUwsXG4gICAgRElSRUNUSU9OX0FMTDogRElSRUNUSU9OX0FMTCxcblxuICAgIE1hbmFnZXI6IE1hbmFnZXIsXG4gICAgSW5wdXQ6IElucHV0LFxuICAgIFRvdWNoQWN0aW9uOiBUb3VjaEFjdGlvbixcblxuICAgIFRvdWNoSW5wdXQ6IFRvdWNoSW5wdXQsXG4gICAgTW91c2VJbnB1dDogTW91c2VJbnB1dCxcbiAgICBQb2ludGVyRXZlbnRJbnB1dDogUG9pbnRlckV2ZW50SW5wdXQsXG4gICAgVG91Y2hNb3VzZUlucHV0OiBUb3VjaE1vdXNlSW5wdXQsXG4gICAgU2luZ2xlVG91Y2hJbnB1dDogU2luZ2xlVG91Y2hJbnB1dCxcblxuICAgIFJlY29nbml6ZXI6IFJlY29nbml6ZXIsXG4gICAgQXR0clJlY29nbml6ZXI6IEF0dHJSZWNvZ25pemVyLFxuICAgIFRhcDogVGFwUmVjb2duaXplcixcbiAgICBQYW46IFBhblJlY29nbml6ZXIsXG4gICAgU3dpcGU6IFN3aXBlUmVjb2duaXplcixcbiAgICBQaW5jaDogUGluY2hSZWNvZ25pemVyLFxuICAgIFJvdGF0ZTogUm90YXRlUmVjb2duaXplcixcbiAgICBQcmVzczogUHJlc3NSZWNvZ25pemVyLFxuXG4gICAgb246IGFkZEV2ZW50TGlzdGVuZXJzLFxuICAgIG9mZjogcmVtb3ZlRXZlbnRMaXN0ZW5lcnMsXG4gICAgZWFjaDogZWFjaCxcbiAgICBtZXJnZTogbWVyZ2UsXG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgYXNzaWduOiBhc3NpZ24sXG4gICAgaW5oZXJpdDogaW5oZXJpdCxcbiAgICBiaW5kRm46IGJpbmRGbixcbiAgICBwcmVmaXhlZDogcHJlZml4ZWRcbn0pO1xuXG4vLyB0aGlzIHByZXZlbnRzIGVycm9ycyB3aGVuIEhhbW1lciBpcyBsb2FkZWQgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRFxuLy8gIHN0eWxlIGxvYWRlciBidXQgYnkgc2NyaXB0IHRhZywgbm90IGJ5IHRoZSBsb2FkZXIuXG52YXIgZnJlZUdsb2JhbCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6ICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5mcmVlR2xvYmFsLkhhbW1lciA9IEhhbW1lcjtcblxuaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEhhbW1lcjtcbiAgICB9KTtcbn0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gSGFtbWVyO1xufSBlbHNlIHtcbiAgICB3aW5kb3dbZXhwb3J0TmFtZV0gPSBIYW1tZXI7XG59XG5cbn0pKHdpbmRvdywgZG9jdW1lbnQsICdIYW1tZXInKTtcbiIsIihmdW5jdGlvbihmYWN0b3J5KSB7XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5JywgJ2hhbW1lcmpzJ10sIGZhY3RvcnkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpLCByZXF1aXJlKCdoYW1tZXJqcycpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmFjdG9yeShqUXVlcnksIEhhbW1lcik7XHJcbiAgICB9XHJcbn0oZnVuY3Rpb24oJCwgSGFtbWVyKSB7XHJcbiAgICBmdW5jdGlvbiBoYW1tZXJpZnkoZWwsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgJGVsID0gJChlbCk7XHJcbiAgICAgICAgaWYoISRlbC5kYXRhKFwiaGFtbWVyXCIpKSB7XHJcbiAgICAgICAgICAgICRlbC5kYXRhKFwiaGFtbWVyXCIsIG5ldyBIYW1tZXIoJGVsWzBdLCBvcHRpb25zKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgICQuZm4uaGFtbWVyID0gZnVuY3Rpb24ob3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGhhbW1lcmlmeSh0aGlzLCBvcHRpb25zKTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gZXh0ZW5kIHRoZSBlbWl0IG1ldGhvZCB0byBhbHNvIHRyaWdnZXIgalF1ZXJ5IGV2ZW50c1xyXG4gICAgSGFtbWVyLk1hbmFnZXIucHJvdG90eXBlLmVtaXQgPSAoZnVuY3Rpb24ob3JpZ2luYWxFbWl0KSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUsIGRhdGEpIHtcclxuICAgICAgICAgICAgb3JpZ2luYWxFbWl0LmNhbGwodGhpcywgdHlwZSwgZGF0YSk7XHJcbiAgICAgICAgICAgICQodGhpcy5lbGVtZW50KS50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICBnZXN0dXJlOiBkYXRhXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICB9KShIYW1tZXIuTWFuYWdlci5wcm90b3R5cGUuZW1pdCk7XHJcbn0pKTtcclxuIl19\n"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","module","$","resizeEvent","matchMedia","scrollEvent","_$eventBus","RESIZE","MATCH_MEDIA","SCROLL","CONTENT_PROGRESS","COMMENTS","FILTER_CLEAR_FIELD","FILTER_REQUEST","FILTER_READY","LOAD_MORE_REQUEST","LOAD_MORE_READY","init","triggerResize","triggerScroll","on","event","handler","trigger","args","off","./events/matchMedia","./events/resize","./events/scroll","jquery","2","_currentSize","eventBus","MEDIA_SIZES","onResize","resize","triggerMatchMedia","size","SMALL_WINDOW","MEDIUM_WINDOW","LARGE_WINDOW","XLARGE_WINDOW","../eventBus","3","_windowWidth","_windowHeight","globalSelectors","_win","window","_$window","$window","newWindowWidth","innerWidth","newWindowHeight","innerHeight","../globalSelectors","4","_fraction","_velocity","_currentScrollPosition","_scrollMax","VELOCITY_CLAMP","_window","_doc","document","_$document","$document","_previousScrollPosition","newScrollMax","height","calculateScrollOffset","onScroll","isForced","isUpdated","newScrollPosition","pageYOffset","documentElement","scrollTop","body","prepVelocity","Math","min","max","updateValue","original","newValue","fraction","velocity","scrollMax","5","_baseUrl","deferredAjax","_storedFilterQuery","_isLoading","load","filterQuery","url","then","response","fail","onPopState","location","search","replace","origin","pathname","addEventListener","filter","history","pushState","../utils/deferredAjax","./eventBus","6","$body","7","_$menuToggle","_$mobileMenu","_$subNav","_delayedCall","_$body","DELAYED_TIME","CLASS_IS_OPEN","CLASS_IS_HIDDEN","CLASS_NO_SCROLL","_isOpen","onMenuToggleClick","preventDefault","removeClass","setTimeout","addClass","clearTimeout","click","./globalSelectors","8","moduleConfigs","run","$parent","forEach","config","$selector","find","selector","each","index","el","constructor","$el","substr","../modules/about-location","../modules/aboutTimeline","../modules/accordion","../modules/animateIn","../modules/carousel","../modules/contentProgressBar","../modules/contentProgressEvent","../modules/disqusToggle","../modules/events-featured","../modules/fadingText","../modules/filtering/clearFilter","../modules/filtering/filterAnchor","../modules/filtering/filterContent","../modules/filtering/filterEventDropdowns","../modules/filtering/filterEvents","../modules/filtering/filterForm","../modules/filtering/filterMultiSelect","../modules/filtering/filterPositioning","../modules/filtering/filterRadioCheckbox","../modules/filtering/filterToggle","../modules/gtmClick","../modules/gtmSubmit","../modules/header","../modules/heroes","../modules/ideas-issues","../modules/joinAutofill","../modules/loadMore","../modules/overlay","../modules/overlayFlickr","../modules/search","../modules/shareBar","../modules/socialShare","../modules/subNav","../modules/svgIconLoader","../modules/top-events","9","menuToggle","moduleFactory","./core/eventBus","./core/filter","./core/menuToggle","./core/moduleFactory","hammerjs","jquery-hammerjs","10","element","direction","parentAction","_$el","_direction","bind","animateIn","css","animateOut","activate","deactivate","11","toggleStatus","_isActive","_toggleClass","toggleClass","mouseenter","mouseleave","12","Pin","EachNavigation","Navigation","_$pinWrap","_$basePin","_$allNavigation","eachPin","navigation","allNav","allPins","isActive","_pinsCreated","updateNavigation","goToIndex","_resize","push","this","data","create","checkStatus","status","remove","../../core/eventBus","../../core/events/matchMedia","./eachNavigation","./navigation","./pin","13","Arrow","children","_arrowTop","_arrowBottom","childrenCount","elementPerView","eachChildrenSize","totalMoves","totalMovesBottom","totalMovesTop","_$childrenWrapper","_$children","_$arrowTop","_$arrowBottom","reset","updateArrows","animate","_bindSteps","arrow","count","TweenLite","to","y","ease","Cubic","easeOut","elementHeight","parseFloat","_$allChildren","bindSteps","./arrow","14","parent","base","x","_$parent","clone","updateNav","_toggleStatus","append","text","left","top","15","CLASS_IS_ACTIVE","CLASS_CONTROL_ACTIVE","_$cards","_$arrowLeft","_$arrowRight","_$dots","_cardsInView","_currentIndex","_totalIndex","_maxIndex","onElClick","updateIndex","newWidth","redraw","onLeftArrowClick","onRightArrowClick","newIndex","updateEls","hide","show","noAnimation","focusedIndex","cardWidth","width","time","$els","hammer","../core/eventBus","../core/events/matchMedia","16","_$this","next","hasClass","slideUp","slideToggle","17","checkInView","../utils/checkInView","18","_parentBind","_element","isActivated","19","20","gtmDataPusher","jq","_$container","_$navigation","_$previous","_$next","parentPx","childrenMarginPx","childrenPct","childrenMarginPct","newParentPct","newChildrenPct","newMarginPtc","_navigation","_arrowRight","_arrowLeft","dataCols","columsPerSize","totalMovesRight","totalMovesLeft","resizeMoves","movesPerSize","fullPct","carouselIsActive","currentElementIndex","margin-left","margin-right","cols","resetSteps","evaluateControls","jump","j","tr","undefined","activateDot","round","distance","Sine","createDots","../../utils/gtmDataPusher","21","activeNum","activeIndex","eq","22","onContentProgress","progress","23","_contentScrollTop","_contentHeight","_pageScrollTop","_currentOffset","_currentProgress","scroll","newProgress","offset","offsetHeight","newOffset","roundedProgress","../core/globalSelectors","24","_$cta","_discusConfig","onCtaClick","scriptFrame","date","createElement","Date","src","disqus_config","setAttribute","getTime","head","appendChild","identifier","title","page","25","margin","../arrow","../carousel/navigation","26","CLASS_IS_FADED","_$wrapper","_$button","expandBlock","27","_filterType","_filterId","onFilterRequest","onClick","28","_filterUrl","attr","../../core/filter","29","Loader","parseLoadedResponse","SELECTOR_CONTENT","SELECTOR_LOADER","CLASS_IS_FILTERING","_loader","delayedCall","onFilterReady","parsedResponse","dispose","html","$loader","../../core/moduleFactory","../../utils/Loader","../../utils/parseLoadedResponse","30","getUrlParameter","CLASS_IS_DISABLED","_$countries","_$cities","_cityData","onCountryChange","updateCities","initialValue","isSelected","optionData","countryValue","val","cities","options","$select","$selectContainer","closest","initialOption","composeOptionEl","isDisabled","optionsMarkup","id","label","removeAttr","value","change","$cityData","JSON","parse","../../utils/getUrlParameter","31","filterRadioCheckbox","getURLParameter","TYPE_RADIOCHECK","_$inputs","_lastSelect","onSubmit","filterContent","onClearField","filterName","filterId","$input","name","multiFilter","split","isMultiFilter","isCleared","clearFilterName","EVENT_CLEAR","clearInput","dispatchEvent","Event","query","analyticsArray","dateString","inputEl","prefix","type","getDateValue","action","day","month","doubleDigitString","getDate","getMonth","String","getFullYear","join","preFillInputs","paramKey","EVENT_UPDATE","number","submit","test","navigator","userAgent","jQuery","d","datepicker","formatDate","getTimezoneOffset","selectmenu","_$datePicker","_$startDate","_$endDate","_clearDates","dateFormat","dayNamesMin","appendText","showOtherMonths","selectOtherMonths","firstDay","defaultDate","beforeShowDay","date1","parseDate","date2","isHighlight","isSelect","onSelect","dateText","inst","selectedDate","is","siblings","./filterRadioCheckbox","32","filterMultiSelect","TYPE_MULTICHECK","encodeURIComponent","year","./filterMultiSelect","33","_$values","_$all","onClear","clearId","$value","valueId","Number","prop","evaluateValues","onUpdate","newValues","newValuesArr","updateValueEach","isChecked","onAllChange","checked","onValueChange","allValuesAreChecked","arr","34","cssPrefix","TRANSFORM_PREFIX","js","CLASS_IS_FIXED","SELECTOR_PARENT","_dontSnap","_onlyOnWide","_isFixed","_offset","_positioningOffset","_scrollTop","scrollValue","parentOffsetTop","parentPositioningOffset","updateIsFixed","updateOffset","newIsFixed","Boolean","../../utils/cssPrefix","35","selected","target","36","CLASS_NO_SCROLL_FILTER","_$target","../../core/globalSelectors","37","_category","_label","_action","../utils/gtmDataPusher","38","39","CLASS_IS_BLURRED","CLASS_IS_FOCUSED","CLASS_IS_SHOWN","_isBlurred","_isHidden","blur","focus","40","HeaderElement","_hasSubnav","_headerBar","_headerOnProgress","_navIssues","_currentlyReadingCopy","_navPages","_isReadingContent","_currentScrollValues","onHeaderIn","handleNavIssues","onHeaderOut","newScrollValues","newIsReadingContent","isForcedFocus","hover","./HeaderElement","41","_$slides","_$allSlides","_$allImages","_$allVignettes","swipeSet","_heroImageAnimationDelay","_heroImageAnimationOn","_animationTimer","clearInterval","className","startAnimation","setInterval","stepAnimation","aspen_global","heroImageAnimationDelay","heroImageAnimationOn","_$images","42","eventCallback","43","_$form","interval","email","../utils/getUrlParameter","44","BasicView","SELECTOR_CTA","_$ctaEl","_cta","_paginationUrl","destroy","storedResponse","bypass","after","$content","../core/moduleFactory","../utils/BasicView","../utils/Loader","../utils/parseLoadedResponse","45","_$content","_$videoWrapper","_$toggle","_youtubeId","_isShown","onToggleClick","CONTENT_OFFSET","Expo","opacity","Quint","onComplete","46","_hasEmbedCode","_htmlData","47","PAGE_PATH","_$input","onFormSubmit","setupLoad","decodeURIComponent","killDelayedCallsTo","startLoading","showNewContent","48","_containerHeight","snapToTop","snapToBottom","../utils/cssPrefix","49","_network","href","openLink","anchorEl","MouseEvent","50","51","LOCAL_STORAGE_KEY_INLINE_SVG","LOCAL_STORAGE_KEY_REVISION","_hasLocalStorage","_svgPath","_data","onSvgPathLoaded","prependSvg","localStorage","setItem","prepend","createElementNS","createSVGRect","getItem","ajax","dataType","done","52","styleColumns","53","Q","CLASS_SHOWN","_showDelay","_hideDelay","defaultDelay","delay","kew","54","_$loader","_$loaderSquares","_showTween","_rotationTween","_shouldHide","_hideDefer","outAnim","evaluateOnComplete","fromTo","autoAlpha","scale","Quart","transformOrigin","smoothOrigin","resolve","restart","set","rotation","Linear","easeNone","paused","vars","onCompleteScope","Back","force3D","defer","play","promise","pause","kill","55","newHeight","newScrollValue","56","styles","getComputedStyle","pre","Array","prototype","slice","match","OLink","dom","RegExp","lowercase","toUpperCase","57","jqXHR","textStatus","errorThrown","reject","58","requestedKey","parameterValue","URLVariables","substring","parameter","59","category","gtmDataLayer","60","contentSelector","removeSelector","$parsedResponse","61","VENDOR_PREFIXES","TEST_ELEMENT","TYPE_FUNCTION","abs","now","setTimeoutContext","fn","timeout","context","bindFn","invokeArrayArg","arg","isArray","obj","iterator","hasOwnProperty","deprecate","method","message","deprecationMessage","stack","log","console","warn","apply","arguments","assign","Object","TypeError","output","source","nextKey","extend","dest","merge","keys","inherit","child","properties","baseP","childP","_super","boolOrFn","ifUndefined","val1","val2","addEventListeners","types","splitStr","removeEventListeners","removeEventListener","hasParent","node","parentNode","inStr","str","indexOf","trim","inArray","findByKey","toArray","uniqueArray","key","sort","results","values","b","prefixed","property","camelProp","_uniqueId","getWindowForElement","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","INPUT_TYPE_TOUCH","INPUT_TYPE_MOUSE","COMPUTE_INTERVAL","INPUT_START","INPUT_END","INPUT_CANCEL","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","PROPS_XY","PROPS_CLIENT_XY","Input","manager","callback","self","inputTarget","domHandler","ev","enable","inputHandler","eventType","input","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","overallVelocity","timeStamp","deltaTime","angle","getAngle","getDistance","offsetDelta","prevDelta","prevInput","deltaX","deltaY","offsetDirection","getDirection","getVelocity","overallVelocityX","overallVelocityY","start","end","maxPointers","velocityX","velocityY","last","lastInterval","v","srcEvent","emit","recognize","clientX","clientY","p1","p2","props","sqrt","atan2","PI","evEl","evTarget","evWin","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","touches","all","changed","changedTouches","concat","TOUCH_INPUT_MAP","TouchInput","targetIds","allTouches","targetTouches","changedTargetTouches","touch","DEDUP_TIMEOUT","TouchMouseInput","mouse","primaryTouch","lastTouches","setLastTouch","eventData","lastTouch","lts","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","recordTouches","dx","dy","touchMap","cssSupports","PREFIXED_TOUCH_ACTION","style","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","CSS","supports","TouchAction","compute","actions","update","touchAction","hasPanX","hasPanY","recognizers","recognizer","getTouchAction","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","Recognizer","defaults","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","get","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","Hammer","preset","Manager","recognizeWith","dropRecognizeWith","requireFailure","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","process","attrTest","optionPointers","isRecognized","isValid","threshold","directionTest","hasMoved","inOut","validPointers","validMovement","validTime","taps","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","inputClass","cssProps","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","handlers","oldCssProps","toggleCssProps","item","add","stop","force","stopped","curRecognizer","existing","events","gestureEvent","createEvent","initEvent","gesture","INPUT_MOVE","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","Tap","Pan","Swipe","Pinch","Rotate","Press","define","amd","62","factory","originalEmit"],"mappings":"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"}