{"version":3,"file":"flickityv230pkgd.js","names":["window","factory","define","amd","jQuery","module","exports","require","jQueryBridget","arraySlice","Array","prototype","slice","console","logError","message","error","namespace","PluginClass","$","option","opts","isPlainObject","this","options","extend","fn","arg0","$elems","methodName","args","returnValue","pluginMethodStr","each","i","elem","instance","data","method","charAt","value","apply","undefined","methodCall","call","arguments","_init","updateJQuery","bridget","global","EvEmitter","proto","on","eventName","listener","events","_events","listeners","indexOf","push","once","onceEvents","_onceEvents","off","length","index","splice","emitEvent","onceListeners","allOff","getSize","getStyleSize","num","parseFloat","isNaN","measurements","measurementsLength","getStyle","style","getComputedStyle","isBoxSizeOuter","isSetup","div","document","createElement","width","padding","borderStyle","borderWidth","boxSizing","body","documentElement","appendChild","Math","round","removeChild","setup","querySelector","nodeType","display","size","height","innerWidth","innerHeight","outerWidth","outerHeight","getZeroSize","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","matchesSelector","matchesMethod","ElemProto","Element","matches","prefixes","selector","fizzyUIUtils","utils","a","b","prop","makeArray","obj","isArray","removeFrom","ary","getParent","parentNode","getQueryElement","handleEvent","event","type","filterFindElements","elems","ffElems","forEach","HTMLElement","childElems","querySelectorAll","debounceMethod","_class","threshold","timeoutName","timeout","clearTimeout","_this","setTimeout","docReady","callback","readyState","addEventListener","toDashed","str","replace","match","$1","$2","toLowerCase","htmlInit","WidgetClass","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","concat","dataOptionsAttr","attr","getAttribute","JSON","parse","className","Flickity","Cell","parent","element","create","position","setAttribute","x","shift","originSide","destroy","unselect","side","transform","removeAttribute","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","target","cellAlign","sideOffset","adjustedX","percentPosition","getPositionValue","select","classList","add","remove","wrapShift","slideableWidth","Slide","isOriginLeft","cells","addCell","cell","max","beginMargin","firstMargin","endMargin","lastCell","getLastCell","lastMargin","slideWidth","getCellElements","map","animatePrototype","isAnimating","restingFrames","animate","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","requestAnimationFrame","wrapAround","modulo","shiftWrapCells","setTranslateX","dispatchScrollEvent","is3d","cursorPosition","rightToLeft","translateX","slider","firstSlide","slides","positionX","progress","slidesWidth","dispatchEvent","selectedSlide","velocity","isPointerDown","isFreeScrolling","selectedIndex","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","cellShift","getFrictionFactor","force","isDraggable","dragForce","dragX","applyForce","selectedAttraction","_Flickity","moveElements","toElem","GUID","instances","queryElement","flickityGUID","$element","constructor","defaults","_create","accessibility","freeScrollFriction","friction","namespaceJQueryEvents","resize","setGallerySize","createMethods","id","guid","viewport","_createSlider","watchCSS","activate","isActive","_filterFindCellElements","children","reloadCells","tabIndex","selectInitialIndex","isInitActivated","cellSelector","_makeCells","positionCells","_getWrapShiftCells","cellElem","getLastSlide","_sizeCells","_positionCells","maxCellHeight","cellX","startCell","len","updateSlides","_containSlides","slide","nextMargin","canCellFit","_getCanCellFit","updateSelectedSlide","groupCells","number","parseInt","percentMatch","percent","reposition","positionSliderAtSelected","setCellAlign","cellAlignShorthands","center","left","right","shorthand","adaptiveHeight","_unshiftCells","gapX","cellIndex","_getGapCells","increment","contain","isRightToLeft","contentWidth","isContentSmaller","beginBound","endBound","min","emitArgs","$event","jQEvent","Event","trigger","isWrap","isInstant","_wrapSelect","prevIndex","startAnimation","wrapIndex","delta","abs","backWrapDelta","forewardWrapDelta","isDragSelect","previous","next","unselectSelectedSlide","selectedCells","selectedElements","selectedCell","selectedElement","initialIndex","queryCell","selectCell","getCellSlideIndex","getCell","getCells","getParentCell","getAdjacentCellElements","adjCount","cellElems","slideIndex","uiChange","childUIPointerDown","preventDefault","focus","onresize","isDragging","content","deactivate","onkeydown","isNotFocused","activeElement","handler","keyboardHandlers","keyCode","leftMethod","rightMethod","prevScrollY","pageYOffset","preventScroll","scrollTo","pageXOffset","removeEventListener","removeData","setJQuery","jq","Unipointer","Object","bindStartEvent","_bindStartEvent","unbindStartEvent","isAdd","bindMethod","startEvent","PointerEvent","getTouch","touches","touch","identifier","pointerIdentifier","onmousedown","button","_pointerDown","ontouchstart","changedTouches","onpointerdown","pointer","pointerId","pointerDown","_bindPostStartEvents","postStartEvents","mousedown","touchstart","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","pointerMove","onmouseup","_pointerUp","onpointerup","ontouchend","_pointerDone","pointerUp","_pointerReset","pointerDone","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","getPointerPoint","pageX","y","pageY","Unidragger","bindHandles","_bindHandles","unbindHandles","touchAction","_touchActionValue","handles","handle","okayPointerDown","pointerDownPointer","pointerDownBlur","cursorNodes","TEXTAREA","INPUT","SELECT","OPTION","clickTypes","radio","checkbox","submit","image","file","isCursorNode","nodeName","isClickType","isOkay","focused","blur","moveVector","_dragPointerMove","_dragMove","hasDragStarted","_dragStart","_dragPointerUp","_dragEnd","_staticClick","isPreventingClicks","dragStart","dragMove","bind","dragEnd","onclick","isIgnoringMouseUp","staticClick","draggable","dragThreshold","_createDrag","onActivateDrag","_uiChangeDrag","onDeactivateDrag","updateDraggable","bindDrag","unbindDrag","_pointerDownPreventDefault","pointerDownFocus","pointerDownScroll","getScrollPosition","_pointerDownDefault","focusNodes","isTouchStart","isTouchPointer","pointerType","isFocusNode","isTouchScrolling","dragStartPosition","previousDragX","direction","originBound","dragMoveTime","Date","freeScroll","dragEndRestingSelect","restingX","getRestingPosition","dragEndBoostSelect","distance","getSlideDistance","positiveResting","_getClosestResting","negativeResting","minDistance","Infinity","condition","dist","minDist","isWrapAround","wrap","floor","clickedCell","onscroll","scroll","scrollMoveX","scrollMoveY","svgURI","PrevNextButton","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","update","createElementNS","path","pathMovements","shape","x0","x1","y1","x2","y2","x3","getArrowMovements","arrowShape","enable","disabled","lastIndex","boundIndex","prevNextButtons","_createPrevNextButtons","prevButton","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","PageDots","holder","dots","handleClick","onClick","setDots","addDots","removeDots","count","fragment","createDocumentFragment","newDots","dot","updateSelected","selectedDot","onTap","pageDots","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","state","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","play","hidden","tick","time","autoPlay","clear","stop","pause","unpause","pauseAutoPlayOnHover","_createPlayer","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","insert","getCellsFragment","isAppend","insertCellElement","insertBefore","endCells","cellChange","append","prepend","minCellIndex","cellSizeChange","changedCellIndex","isPositioningSlider","prevSelectedElem","LazyLoader","img","flickity","load","_createLazyload","lazyLoad","lazyImages","lazyCellImages","lazyloadAttr","srcAttr","srcsetAttr","lazySelector","imgs","getCellLazyImages","src","srcset","onload","complete","onerror","_createAsNavFor","activateAsNavFor","deactivateAsNavFor","destroyAsNavFor","asNavForOption","asNavFor","setNavCompanion","companion","navCompanion","onNavCompanionSelect","navCompanionSelect","onNavStaticClick","companionCells","t","firstIndex","selectIndex","removeNavSelectedElements","navSelectedElements","changeNavSelectedClass","navElem","cellElement","imagesLoaded","ImagesLoaded","onAlways","queryElem","elements","getImages","jqDeferred","Deferred","check","images","addElementImages","addImage","background","addElementBackgroundImages","elementNodeTypes","childImgs","child","LoadingImage","Background","url","Image","reURL","exec","backgroundImage","addBackground","loadingImage","onProgress","progressedCount","hasAnyBroken","isLoaded","notify","debug","log","isComplete","jqMethod","getIsImageComplete","confirm","naturalWidth","proxyImage","unbindEvents","makeJQueryPlugin","promise","_createImagesLoaded"],"sources":["flickityv230pkgd.js"],"sourcesContent":["/* eslint-disable */\n\n/*!\n * Flickity PACKAGED v2.3.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2021 Metafizzy\n */\n\n/**\n * Bridget makes jQuery widgets\n * v2.0.1\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n// https://unpkg.com/flickity@2.3.0/dist/flickity.pkgd.js\n\n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /* globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'jquery-bridget/jquery-bridget',['jquery'], function( jQuery ) {\n return factory( window, jQuery );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('jquery')\n );\n } else {\n // browser global\n window.jQueryBridget = factory(\n window,\n window.jQuery\n );\n }\n \n}( window, function factory( window, jQuery ) {\n 'use strict';\n \n // ----- utils ----- //\n \n var arraySlice = Array.prototype.slice;\n \n // helper function for logging errors\n // $.error breaks jQuery chaining\n var console = window.console;\n var logError = typeof console == 'undefined' ? function() {} :\n function( message ) {\n console.error( message );\n };\n \n // ----- jQueryBridget ----- //\n \n function jQueryBridget( namespace, PluginClass, $ ) {\n $ = $ || jQuery || window.jQuery;\n if ( !$ ) {\n return;\n }\n \n // add option method -> $().plugin('option', {...})\n if ( !PluginClass.prototype.option ) {\n // option setter\n PluginClass.prototype.option = function( opts ) {\n // bail out if not an object\n if ( !$.isPlainObject( opts ) ){\n return;\n }\n this.options = $.extend( true, this.options, opts );\n };\n }\n \n // make jQuery plugin\n $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {\n if ( typeof arg0 == 'string' ) {\n // method call $().plugin( 'methodName', { options } )\n // shift arguments by 1\n var args = arraySlice.call( arguments, 1 );\n return methodCall( this, arg0, args );\n }\n // just $().plugin({ options })\n plainCall( this, arg0 );\n return this;\n };\n \n // $().plugin('methodName')\n function methodCall( $elems, methodName, args ) {\n var returnValue;\n var pluginMethodStr = '$().' + namespace + '(\"' + methodName + '\")';\n \n $elems.each( function( i, elem ) {\n // get instance\n var instance = $.data( elem, namespace );\n if ( !instance ) {\n logError( namespace + ' not initialized. Cannot call methods, i.e. ' +\n pluginMethodStr );\n return;\n }\n \n var method = instance[ methodName ];\n if ( !method || methodName.charAt(0) == '_' ) {\n logError( pluginMethodStr + ' is not a valid method' );\n return;\n }\n \n // apply method, get return value\n var value = method.apply( instance, args );\n // set return value if value is returned, use only first value\n returnValue = returnValue === undefined ? value : returnValue;\n });\n \n return returnValue !== undefined ? returnValue : $elems;\n }\n \n function plainCall( $elems, options ) {\n $elems.each( function( i, elem ) {\n var instance = $.data( elem, namespace );\n if ( instance ) {\n // set options & init\n instance.option( options );\n instance._init();\n } else {\n // initialize new instance\n instance = new PluginClass( elem, options );\n $.data( elem, namespace, instance );\n }\n });\n }\n \n updateJQuery( $ );\n \n }\n \n // ----- updateJQuery ----- //\n \n // set $.bridget for v1 backwards compatibility\n function updateJQuery( $ ) {\n if ( !$ || ( $ && $.bridget ) ) {\n return;\n }\n $.bridget = jQueryBridget;\n }\n \n updateJQuery( jQuery || window.jQuery );\n \n // ----- ----- //\n \n return jQueryBridget;\n \n}));\n \n/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n \n/* jshint unused: true, undef: true, strict: true */\n \n( function( global, factory ) {\n // universal module definition\n /* jshint strict: false */ /* globals define, module, window */\n if ( typeof define == 'function' && define.amd ) {\n // AMD - RequireJS\n define( 'ev-emitter/ev-emitter',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n \n}( typeof window != 'undefined' ? window : this, function() {\n \n \n \n function EvEmitter() {}\n \n var proto = EvEmitter.prototype;\n \n proto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // set events hash\n var events = this._events = this._events || {};\n // set listeners array\n var listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( listeners.indexOf( listener ) == -1 ) {\n listeners.push( listener );\n }\n \n return this;\n };\n \n proto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) {\n return;\n }\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n var onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n \n return this;\n };\n \n proto.off = function( eventName, listener ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n var index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n \n return this;\n };\n \n proto.emitEvent = function( eventName, args ) {\n var listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) {\n return;\n }\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice(0);\n args = args || [];\n // once stuff\n var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n \n for ( var i=0; i < listeners.length; i++ ) {\n var listener = listeners[i];\n var isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n \n return this;\n };\n \n proto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n };\n \n return EvEmitter;\n \n}));\n \n/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n \n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n \n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'get-size/get-size',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.getSize = factory();\n }\n \n})( window, function factory() {\n 'use strict';\n \n // -------------------------- helpers -------------------------- //\n \n // get a number from a string, not a percentage\n function getStyleSize( value ) {\n var num = parseFloat( value );\n // not a percent like '100%', and a number\n var isValid = value.indexOf('%') == -1 && !isNaN( num );\n return isValid && num;\n }\n \n function noop() {}\n \n var logError = typeof console == 'undefined' ? noop :\n function( message ) {\n console.error( message );\n };\n \n // -------------------------- measurements -------------------------- //\n \n var measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n ];\n \n var measurementsLength = measurements.length;\n \n function getZeroSize() {\n var size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n };\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n size[ measurement ] = 0;\n }\n return size;\n }\n \n // -------------------------- getStyle -------------------------- //\n \n /**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\n function getStyle( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n logError( 'Style returned ' + style +\n '. Are you running this code in a hidden iframe on Firefox? ' +\n 'See https://bit.ly/getsizebug1' );\n }\n return style;\n }\n \n // -------------------------- setup -------------------------- //\n \n var isSetup = false;\n \n var isBoxSizeOuter;\n \n /**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\n function setup() {\n // setup once\n if ( isSetup ) {\n return;\n }\n isSetup = true;\n \n // -------------------------- box sizing -------------------------- //\n \n /**\n * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & Firefox<29 measures the inner-width\n */\n var div = document.createElement('div');\n div.style.width = '200px';\n div.style.padding = '1px 2px 3px 4px';\n div.style.borderStyle = 'solid';\n div.style.borderWidth = '1px 2px 3px 4px';\n div.style.boxSizing = 'border-box';\n \n var body = document.body || document.documentElement;\n body.appendChild( div );\n var style = getStyle( div );\n // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n \n body.removeChild( div );\n }\n \n // -------------------------- getSize -------------------------- //\n \n function getSize( elem ) {\n setup();\n \n // use querySeletor if elem is string\n if ( typeof elem == 'string' ) {\n elem = document.querySelector( elem );\n }\n \n // do not proceed on non-objects\n if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n return;\n }\n \n var style = getStyle( elem );\n \n // if hidden, everything is 0\n if ( style.display == 'none' ) {\n return getZeroSize();\n }\n \n var size = {};\n size.width = elem.offsetWidth;\n size.height = elem.offsetHeight;\n \n var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n \n // get all measurements\n for ( var i=0; i < measurementsLength; i++ ) {\n var measurement = measurements[i];\n var value = style[ measurement ];\n var num = parseFloat( value );\n // any 'auto', 'medium' value will be 0\n size[ measurement ] = !isNaN( num ) ? num : 0;\n }\n \n var paddingWidth = size.paddingLeft + size.paddingRight;\n var paddingHeight = size.paddingTop + size.paddingBottom;\n var marginWidth = size.marginLeft + size.marginRight;\n var marginHeight = size.marginTop + size.marginBottom;\n var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n \n var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n \n // overwrite width and height if we can get it from style\n var styleWidth = getStyleSize( style.width );\n if ( styleWidth !== false ) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n }\n \n var styleHeight = getStyleSize( style.height );\n if ( styleHeight !== false ) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n }\n \n size.innerWidth = size.width - ( paddingWidth + borderWidth );\n size.innerHeight = size.height - ( paddingHeight + borderHeight );\n \n size.outerWidth = size.width + marginWidth;\n size.outerHeight = size.height + marginHeight;\n \n return size;\n }\n \n return getSize;\n \n});\n \n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n \n/*jshint browser: true, strict: true, undef: true, unused: true */\n \n( function( window, factory ) {\n /*global define: false, module: false */\n 'use strict';\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'desandro-matches-selector/matches-selector',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.matchesSelector = factory();\n }\n \n}( window, function factory() {\n 'use strict';\n \n var matchesMethod = ( function() {\n var ElemProto = window.Element.prototype;\n // check for the standard method name first\n if ( ElemProto.matches ) {\n return 'matches';\n }\n // check un-prefixed\n if ( ElemProto.matchesSelector ) {\n return 'matchesSelector';\n }\n // check vendor prefixes\n var prefixes = ['webkit', 'moz', 'ms', 'o'];\n \n for ( var i=0; i < prefixes.length; i++ ) {\n var prefix = prefixes[i];\n var method = prefix + 'MatchesSelector';\n if ( ElemProto[ method ] ) {\n return method;\n }\n }\n })();\n \n return function matchesSelector( elem, selector ) {\n return elem[ matchesMethod ]( selector );\n };\n \n}));\n \n/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n \n/*jshint browser: true, undef: true, unused: true, strict: true */\n \n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n \n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'fizzy-ui-utils/utils',[\n 'desandro-matches-selector/matches-selector'\n ], function( matchesSelector ) {\n return factory( window, matchesSelector );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('desandro-matches-selector')\n );\n } else {\n // browser global\n window.fizzyUIUtils = factory(\n window,\n window.matchesSelector\n );\n }\n \n}( window, function factory( window, matchesSelector ) {\n \n \n \n var utils = {};\n \n // ----- extend ----- //\n \n // extends objects\n utils.extend = function( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n };\n \n // ----- modulo ----- //\n \n utils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n };\n \n // ----- makeArray ----- //\n \n var arraySlice = Array.prototype.slice;\n \n // turn element or nodeList into an array\n utils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n \n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n \n // array of single index\n return [obj];\n };\n \n // ----- removeFrom ----- //\n \n utils.removeFrom = function( ary, obj ) {\n var index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n };\n \n // ----- getParent ----- //\n \n utils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( matchesSelector( elem, selector ) ) {\n return elem;\n }\n }\n };\n \n // ----- getQueryElement ----- //\n \n // use element as selector string\n utils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n };\n \n // ----- handleEvent ----- //\n \n // enable .ontype to trigger from .addEventListener( elem, 'type' )\n utils.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n };\n \n // ----- filterFindElements ----- //\n \n utils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n var ffElems = [];\n \n elems.forEach( function( elem ) {\n // check that elem is an actual element\n if ( !( elem instanceof HTMLElement ) ) {\n return;\n }\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return;\n }\n // filter & find items if we have a selector\n // filter\n if ( matchesSelector( elem, selector ) ) {\n ffElems.push( elem );\n }\n // find children\n var childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n for ( var i=0; i < childElems.length; i++ ) {\n ffElems.push( childElems[i] );\n }\n });\n \n return ffElems;\n };\n \n // ----- debounceMethod ----- //\n \n utils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n var method = _class.prototype[ methodName ];\n var timeoutName = methodName + 'Timeout';\n \n _class.prototype[ methodName ] = function() {\n var timeout = this[ timeoutName ];\n clearTimeout( timeout );\n \n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\n };\n };\n \n // ----- docReady ----- //\n \n utils.docReady = function( callback ) {\n var readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( callback );\n } else {\n document.addEventListener( 'DOMContentLoaded', callback );\n }\n };\n \n // ----- htmlInit ----- //\n \n // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\n utils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n }).toLowerCase();\n };\n \n var console = window.console;\n /**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\n utils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\n var dashedNamespace = utils.toDashed( namespace );\n var dataAttr = 'data-' + dashedNamespace;\n var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n var elems = utils.makeArray( dataAttrElems )\n .concat( utils.makeArray( jsDashElems ) );\n var dataOptionsAttr = dataAttr + '-options';\n var jQuery = window.jQuery;\n \n elems.forEach( function( elem ) {\n var attr = elem.getAttribute( dataAttr ) ||\n elem.getAttribute( dataOptionsAttr );\n var options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n ': ' + error );\n }\n return;\n }\n // initialize\n var instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n });\n \n });\n };\n \n // ----- ----- //\n \n return utils;\n \n}));\n \n// Flickity.Cell\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/cell',[\n 'get-size/get-size'\n ], function( getSize ) {\n return factory( window, getSize );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('get-size')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Cell = factory(\n window,\n window.getSize\n );\n }\n \n}( window, function factory( window, getSize ) {\n \n \n \n function Cell( elem, parent ) {\n this.element = elem;\n this.parent = parent;\n \n this.create();\n }\n \n var proto = Cell.prototype;\n \n proto.create = function() {\n this.element.style.position = 'absolute';\n this.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n this.element.style[ this.parent.originSide ] = 0;\n };\n \n proto.destroy = function() {\n // reset style\n this.unselect();\n this.element.style.position = '';\n var side = this.parent.originSide;\n this.element.style[ side ] = '';\n this.element.style.transform = '';\n this.element.removeAttribute('aria-hidden');\n };\n \n proto.getSize = function() {\n this.size = getSize( this.element );\n };\n \n proto.setPosition = function( x ) {\n this.x = x;\n this.updateTarget();\n this.renderPosition( x );\n };\n \n // setDefaultTarget v1 method, backwards compatibility, remove in v3\n proto.updateTarget = proto.setDefaultTarget = function() {\n var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n this.target = this.x + this.size[ marginProperty ] +\n this.size.width * this.parent.cellAlign;\n };\n \n proto.renderPosition = function( x ) {\n // render position of cell with in slider\n var sideOffset = this.parent.originSide === 'left' ? 1 : -1;\n \n var adjustedX = this.parent.options.percentPosition ?\n x * sideOffset * ( this.parent.size.innerWidth / this.size.width ) :\n x * sideOffset;\n \n this.element.style.transform = 'translateX(' +\n this.parent.getPositionValue( adjustedX ) + ')';\n };\n \n proto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n };\n \n proto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\n };\n \n /**\n * @param {Integer} shift - 0, 1, or -1\n */\n proto.wrapShift = function( shift ) {\n this.shift = shift;\n this.renderPosition( this.x + this.parent.slideableWidth * shift );\n };\n \n proto.remove = function() {\n this.element.parentNode.removeChild( this.element );\n };\n \n return Cell;\n \n} ) );\n \n// slide\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/slide',factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory();\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.Slide = factory();\n }\n \n}( window, function factory() {\n 'use strict';\n \n function Slide( parent ) {\n this.parent = parent;\n this.isOriginLeft = parent.originSide == 'left';\n this.cells = [];\n this.outerWidth = 0;\n this.height = 0;\n }\n \n var proto = Slide.prototype;\n \n proto.addCell = function( cell ) {\n this.cells.push( cell );\n this.outerWidth += cell.size.outerWidth;\n this.height = Math.max( cell.size.outerHeight, this.height ) + 190;\n // first cell stuff\n if ( this.cells.length == 1 ) {\n this.x = cell.x; // x comes from first cell\n var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n this.firstMargin = cell.size[ beginMargin ];\n }\n };\n \n proto.updateTarget = function() {\n var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n var lastCell = this.getLastCell();\n var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n };\n \n proto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n };\n \n proto.select = function() {\n this.cells.forEach( function( cell ) {\n cell.select();\n } );\n };\n \n proto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\n } );\n };\n \n proto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n } );\n };\n \n return Slide;\n \n} ) );\n \n// animate\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/animate',[\n 'fizzy-ui-utils/utils'\n ], function( utils ) {\n return factory( window, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = window.Flickity || {};\n window.Flickity.animatePrototype = factory(\n window,\n window.fizzyUIUtils\n );\n }\n \n}( window, function factory( window, utils ) {\n \n \n \n // -------------------------- animate -------------------------- //\n \n var proto = {};\n \n proto.startAnimation = function() {\n if ( this.isAnimating ) {\n return;\n }\n \n this.isAnimating = true;\n this.restingFrames = 0;\n this.animate();\n };\n \n proto.animate = function() {\n this.applyDragForce();\n this.applySelectedAttraction();\n \n var previousX = this.x;\n \n this.integratePhysics();\n this.positionSlider();\n this.settle( previousX );\n // animate next frame\n if ( this.isAnimating ) {\n var _this = this;\n requestAnimationFrame( function animateFrame() {\n _this.animate();\n } );\n }\n };\n \n proto.positionSlider = function() {\n var x = this.x;\n // wrap position around\n if ( this.options.wrapAround && this.cells.length > 1 ) {\n x = utils.modulo( x, this.slideableWidth );\n x -= this.slideableWidth;\n this.shiftWrapCells( x );\n }\n \n this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n };\n \n proto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var translateX = this.getPositionValue( x );\n // use 3D transforms for hardware acceleration on iOS\n // but use 2D when settled, for better font-rendering\n this.slider.style.transform = is3d ?\n 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n };\n \n proto.dispatchScrollEvent = function() {\n var firstSlide = this.slides[0];\n if ( !firstSlide ) {\n return;\n }\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [progress, positionX] );\n };\n \n proto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\n this.positionSlider();\n };\n \n proto.getPositionValue = function( position ) {\n if ( this.options.percentPosition ) {\n // percent position, round to 2 digits, like 12.34%\n return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n } else {\n // pixel positioning\n return Math.round( position ) + 'px';\n }\n };\n \n proto.settle = function( previousX ) {\n // keep track of frames where x hasn't moved\n var isResting = !this.isPointerDown &&\n Math.round( this.x * 100 ) == Math.round( previousX * 100 );\n if ( isResting ) {\n this.restingFrames++;\n }\n // stop animating if resting for 3 or more frames\n if ( this.restingFrames > 2 ) {\n this.isAnimating = false;\n delete this.isFreeScrolling;\n // render position with translateX when settled\n this.positionSlider();\n this.dispatchEvent( 'settle', null, [this.selectedIndex] );\n }\n };\n \n proto.shiftWrapCells = function( x ) {\n // shift before cells\n var beforeGap = this.cursorPosition + x;\n this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n // shift after cells\n var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n this._shiftCells( this.afterShiftCells, afterGap, 1 );\n };\n \n proto._shiftCells = function( cells, gap, shift ) {\n for ( var i = 0; i < cells.length; i++ ) {\n var cell = cells[i];\n var cellShift = gap > 0 ? shift : 0;\n cell.wrapShift( cellShift );\n gap -= cell.size.outerWidth;\n }\n };\n \n proto._unshiftCells = function( cells ) {\n if ( !cells || !cells.length ) {\n return;\n }\n for ( var i = 0; i < cells.length; i++ ) {\n cells[i].wrapShift( 0 );\n }\n };\n \n // -------------------------- physics -------------------------- //\n \n proto.integratePhysics = function() {\n this.x += this.velocity;\n this.velocity *= this.getFrictionFactor();\n };\n \n proto.applyForce = function( force ) {\n this.velocity += force;\n };\n \n proto.getFrictionFactor = function() {\n return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n };\n \n proto.getRestingPosition = function() {\n // my thanks to Steven Wittens, who simplified this math greatly\n return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n };\n \n proto.applyDragForce = function() {\n if ( !this.isDraggable || !this.isPointerDown ) {\n return;\n }\n // change the position to drag position by applying force\n var dragVelocity = this.dragX - this.x;\n var dragForce = dragVelocity - this.velocity;\n this.applyForce( dragForce );\n };\n \n proto.applySelectedAttraction = function() {\n // do not attract if pointer down or no slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n return;\n }\n var distance = this.selectedSlide.target * -1 - this.x;\n var force = distance * this.options.selectedAttraction;\n this.applyForce( force );\n };\n \n return proto;\n \n} ) );\n \n// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/flickity',[\n 'ev-emitter/ev-emitter',\n 'get-size/get-size',\n 'fizzy-ui-utils/utils',\n './cell',\n './slide',\n './animate'\n ], function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter'),\n require('get-size'),\n require('fizzy-ui-utils'),\n require('./cell'),\n require('./slide'),\n require('./animate')\n );\n } else {\n // browser global\n var _Flickity = window.Flickity;\n \n window.Flickity = factory(\n window,\n window.EvEmitter,\n window.getSize,\n window.fizzyUIUtils,\n _Flickity.Cell,\n _Flickity.Slide,\n _Flickity.animatePrototype\n );\n }\n \n}( window, function factory( window, EvEmitter, getSize,\n utils, Cell, Slide, animatePrototype ) {\n \n /* eslint-enable max-params */\n \n \n // vars\n var jQuery = window.jQuery;\n var getComputedStyle = window.getComputedStyle;\n var console = window.console;\n \n function moveElements( elems, toElem ) {\n elems = utils.makeArray( elems );\n while ( elems.length ) {\n toElem.appendChild( elems.shift() );\n }\n }\n \n // -------------------------- Flickity -------------------------- //\n \n // globally unique identifiers\n var GUID = 0;\n // internal store of all Flickity intances\n var instances = {};\n \n function Flickity( element, options ) {\n var queryElement = utils.getQueryElement( element );\n if ( !queryElement ) {\n if ( console ) {\n console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n }\n return;\n }\n this.element = queryElement;\n // do not initialize twice on same element\n if ( this.element.flickityGUID ) {\n var instance = instances[ this.element.flickityGUID ];\n if ( instance ) instance.option( options );\n return instance;\n }\n \n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n // options\n this.options = utils.extend( {}, this.constructor.defaults );\n this.option( options );\n \n // kick things off\n this._create();\n }\n \n Flickity.defaults = {\n accessibility: true,\n // adaptiveHeight: false,\n cellAlign: 'center',\n // cellSelector: undefined,\n // contain: false,\n freeScrollFriction: 0.075, // friction when free-scrolling\n friction: 0.28, // friction when selecting\n namespaceJQueryEvents: true,\n // initialIndex: 0,\n percentPosition: true,\n resize: true,\n selectedAttraction: 0.025,\n setGallerySize: true\n // watchCSS: false,\n // wrapAround: false\n };\n \n // hash of methods triggered on _create()\n Flickity.createMethods = [];\n \n var proto = Flickity.prototype;\n // inherit EventEmitter\n utils.extend( proto, EvEmitter.prototype );\n \n proto._create = function() {\n // add id for Flickity.data\n var id = this.guid = ++GUID;\n this.element.flickityGUID = id; // expando\n instances[ id ] = this; // associate via id\n // initial properties\n this.selectedIndex = 0;\n // how many frames slider has been in same position\n this.restingFrames = 0;\n // initial physics properties\n this.x = 0;\n this.velocity = 0;\n this.originSide = this.options.rightToLeft ? 'right' : 'left';\n // create viewport & slider\n this.viewport = document.createElement('div');\n this.viewport.className = 'flickity-viewport';\n this._createSlider();\n \n if ( this.options.resize || this.options.watchCSS ) {\n window.addEventListener( 'resize', this );\n }\n \n // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\n }\n \n Flickity.createMethods.forEach( function( method ) {\n this[ method ]();\n }, this );\n \n if ( this.options.watchCSS ) {\n this.watchCSS();\n } else {\n this.activate();\n }\n \n };\n \n /**\n * set options\n * @param {Object} opts - options to extend\n */\n proto.option = function( opts ) {\n utils.extend( this.options, opts );\n };\n \n proto.activate = function() {\n if ( this.isActive ) {\n return;\n }\n this.isActive = true;\n this.element.classList.add('flickity-enabled');\n if ( this.options.rightToLeft ) {\n this.element.classList.add('flickity-rtl');\n }\n \n this.getSize();\n // move initial cell elements so they can be loaded as cells\n var cellElems = this._filterFindCellElements( this.element.children );\n moveElements( cellElems, this.slider );\n this.viewport.appendChild( this.slider );\n this.element.appendChild( this.viewport );\n // get cells from children\n this.reloadCells();\n \n if ( this.options.accessibility ) {\n // allow element to focusable\n this.element.tabIndex = 0;\n // listen for key presses\n this.element.addEventListener( 'keydown', this );\n }\n \n this.emitEvent('activate');\n this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\n };\n \n // slider positions the cells\n proto._createSlider = function() {\n // slider element does all the positioning\n var slider = document.createElement('div');\n slider.className = 'flickity-slider';\n slider.style[ this.originSide ] = 0;\n this.slider = slider;\n };\n \n proto._filterFindCellElements = function( elems ) {\n return utils.filterFindElements( elems, this.options.cellSelector );\n };\n \n // goes through all children\n proto.reloadCells = function() {\n // collection of item elements\n this.cells = this._makeCells( this.slider.children );\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n };\n \n /**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\n proto._makeCells = function( elems ) {\n var cellElems = this._filterFindCellElements( elems );\n \n // create new Flickity for collection\n var cells = cellElems.map( function( cellElem ) {\n return new Cell( cellElem, this );\n }, this );\n \n return cells;\n };\n \n proto.getLastCell = function() {\n return this.cells[ this.cells.length - 1 ];\n };\n \n proto.getLastSlide = function() {\n return this.slides[ this.slides.length - 1 ];\n };\n \n // positions all cells\n proto.positionCells = function() {\n // size all cells\n this._sizeCells( this.cells );\n // position all cells\n this._positionCells( 0 );\n };\n \n /**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\n proto._positionCells = function( index ) {\n index = index || 0;\n // also measure maxCellHeight\n // start 0 if positioning all cells\n this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n var cellX = 0;\n // get cellX\n if ( index > 0 ) {\n var startCell = this.cells[ index - 1 ];\n cellX = startCell.x + startCell.size.outerWidth;\n }\n var len = this.cells.length;\n for ( var i = index; i < len; i++ ) {\n var cell = this.cells[i];\n cell.setPosition( cellX );\n cellX += cell.size.outerWidth;\n this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n }\n // keep track of cellX for wrap-around\n this.slideableWidth = cellX;\n // slides\n this.updateSlides();\n // contain slides target\n this._containSlides();\n // update slidesWidth\n this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n };\n \n /**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\n proto._sizeCells = function( cells ) {\n cells.forEach( function( cell ) {\n cell.getSize();\n } );\n };\n \n // -------------------------- -------------------------- //\n \n proto.updateSlides = function() {\n this.slides = [];\n if ( !this.cells.length ) {\n return;\n }\n \n var slide = new Slide( this );\n this.slides.push( slide );\n var isOriginLeft = this.originSide == 'left';\n var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n \n var canCellFit = this._getCanCellFit();\n \n this.cells.forEach( function( cell, i ) {\n // just add cell if first cell in slide\n if ( !slide.cells.length ) {\n slide.addCell( cell );\n return;\n }\n \n var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n ( cell.size.outerWidth - cell.size[ nextMargin ] );\n \n if ( canCellFit.call( this, i, slideWidth ) ) {\n slide.addCell( cell );\n } else {\n // doesn't fit, new slide\n slide.updateTarget();\n \n slide = new Slide( this );\n this.slides.push( slide );\n slide.addCell( cell );\n }\n }, this );\n // last slide\n slide.updateTarget();\n // update .selectedSlide\n this.updateSelectedSlide();\n };\n \n proto._getCanCellFit = function() {\n var groupCells = this.options.groupCells;\n if ( !groupCells ) {\n return function() {\n return false;\n };\n } else if ( typeof groupCells == 'number' ) {\n // group by number. 3 -> [0,1,2], [3,4,5], ...\n var number = parseInt( groupCells, 10 );\n return function( i ) {\n return ( i % number ) !== 0;\n };\n }\n // default, group by width of slide\n // parse '75%\n var percentMatch = typeof groupCells == 'string' &&\n groupCells.match( /^(\\d+)%$/ );\n var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n return function( i, slideWidth ) {\n /* eslint-disable-next-line no-invalid-this */\n return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n };\n };\n \n // alias _init for jQuery plugin .flickity()\n proto._init =\n proto.reposition = function() {\n this.positionCells();\n this.positionSliderAtSelected();\n };\n \n proto.getSize = function() {\n this.size = getSize( this.element );\n this.setCellAlign();\n this.cursorPosition = this.size.innerWidth * this.cellAlign;\n };\n \n var cellAlignShorthands = {\n // cell align, then based on origin side\n center: {\n left: 0.5,\n right: 0.5\n },\n left: {\n left: 0,\n right: 1\n },\n right: {\n right: 0,\n left: 1\n }\n };\n \n proto.setCellAlign = function() {\n var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n };\n \n proto.setGallerySize = function() {\n if ( this.options.setGallerySize ) {\n var height = this.options.adaptiveHeight && this.selectedSlide ?\n this.selectedSlide.height : this.maxCellHeight;\n this.viewport.style.height = height + 'px';\n }\n };\n \n proto._getWrapShiftCells = function() {\n // only for wrap-around\n if ( !this.options.wrapAround ) {\n return;\n }\n // unshift previous cells\n this._unshiftCells( this.beforeShiftCells );\n this._unshiftCells( this.afterShiftCells );\n // get before cells\n // initial gap\n var gapX = this.cursorPosition;\n var cellIndex = this.cells.length - 1;\n this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n // get after cells\n // ending gap between last cell and end of gallery viewport\n gapX = this.size.innerWidth - this.cursorPosition;\n // start cloning at first cell, working forwards\n this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n };\n \n proto._getGapCells = function( gapX, cellIndex, increment ) {\n // keep adding cells until the cover the initial gap\n var cells = [];\n while ( gapX > 0 ) {\n var cell = this.cells[ cellIndex ];\n if ( !cell ) {\n break;\n }\n cells.push( cell );\n cellIndex += increment;\n gapX -= cell.size.outerWidth;\n }\n return cells;\n };\n \n // ----- contain ----- //\n \n // contain cell targets so no excess sliding\n proto._containSlides = function() {\n if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n return;\n }\n var isRightToLeft = this.options.rightToLeft;\n var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n // content is less than gallery size\n var isContentSmaller = contentWidth < this.size.innerWidth;\n // bounds\n var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n // contain each cell target\n this.slides.forEach( function( slide ) {\n if ( isContentSmaller ) {\n // all cells fit inside gallery\n slide.target = contentWidth * this.cellAlign;\n } else {\n // contain to bounds\n slide.target = Math.max( slide.target, beginBound );\n slide.target = Math.min( slide.target, endBound );\n }\n }, this );\n };\n \n // ----- ----- //\n \n /**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\n proto.dispatchEvent = function( type, event, args ) {\n var emitArgs = event ? [event].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n \n if ( jQuery && this.$element ) {\n // default trigger with type if no event\n type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n var $event = type;\n if ( event ) {\n // create jQuery event\n var jQEvent = new jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n }\n };\n \n // -------------------------- select -------------------------- //\n \n /**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\n proto.select = function( index, isWrap, isInstant ) {\n if ( !this.isActive ) {\n return;\n }\n index = parseInt( index, 10 );\n this._wrapSelect( index );\n \n if ( this.options.wrapAround || isWrap ) {\n index = utils.modulo( index, this.slides.length );\n }\n // bail if invalid index\n if ( !this.slides[ index ] ) {\n return;\n }\n var prevIndex = this.selectedIndex;\n this.selectedIndex = index;\n this.updateSelectedSlide();\n if ( isInstant ) {\n this.positionSliderAtSelected();\n } else {\n this.startAnimation();\n }\n if ( this.options.adaptiveHeight ) {\n this.setGallerySize();\n }\n // events\n this.dispatchEvent( 'select', null, [index] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [index] );\n }\n // old v1 event name, remove in v3\n this.dispatchEvent('cellSelect');\n };\n \n // wraps position for wrapAround, to move to closest slide. #113\n proto._wrapSelect = function( index ) {\n var len = this.slides.length;\n var isWrapping = this.options.wrapAround && len > 1;\n if ( !isWrapping ) {\n return index;\n }\n var wrapIndex = utils.modulo( index, len );\n // go to shortest\n var delta = Math.abs( wrapIndex - this.selectedIndex );\n var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n if ( !this.isDragSelect && backWrapDelta < delta ) {\n index += len;\n } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n index -= len;\n }\n // wrap position so slider is within normal area\n if ( index < 0 ) {\n this.x -= this.slideableWidth;\n } else if ( index >= len ) {\n this.x += this.slideableWidth;\n }\n };\n \n proto.previous = function( isWrap, isInstant ) {\n this.select( this.selectedIndex - 1, isWrap, isInstant );\n };\n \n proto.next = function( isWrap, isInstant ) {\n this.select( this.selectedIndex + 1, isWrap, isInstant );\n };\n \n proto.updateSelectedSlide = function() {\n var slide = this.slides[ this.selectedIndex ];\n // selectedIndex could be outside of slides, if triggered before resize()\n if ( !slide ) {\n return;\n }\n // unselect previous selected slide\n this.unselectSelectedSlide();\n // update new selected slide\n this.selectedSlide = slide;\n slide.select();\n this.selectedCells = slide.cells;\n this.selectedElements = slide.getCellElements();\n // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n // Remove in v3?\n this.selectedCell = slide.cells[0];\n this.selectedElement = this.selectedElements[0];\n };\n \n proto.unselectSelectedSlide = function() {\n if ( this.selectedSlide ) {\n this.selectedSlide.unselect();\n }\n };\n \n proto.selectInitialIndex = function() {\n var initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n var cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n \n var index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\n };\n \n /**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\n proto.selectCell = function( value, isWrap, isInstant ) {\n // get cell\n var cell = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n \n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n };\n \n proto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i = 0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\n }\n }\n };\n \n // -------------------------- get cells -------------------------- //\n \n /**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\n proto.getCell = function( elem ) {\n // loop through cells to get the one that matches\n for ( var i = 0; i < this.cells.length; i++ ) {\n var cell = this.cells[i];\n if ( cell.element == elem ) {\n return cell;\n }\n }\n };\n \n /**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\n proto.getCells = function( elems ) {\n elems = utils.makeArray( elems );\n var cells = [];\n elems.forEach( function( elem ) {\n var cell = this.getCell( elem );\n if ( cell ) {\n cells.push( cell );\n }\n }, this );\n return cells;\n };\n \n /**\n * get cell elements\n * @returns {Array} cellElems\n */\n proto.getCellElements = function() {\n return this.cells.map( function( cell ) {\n return cell.element;\n } );\n };\n \n /**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\n proto.getParentCell = function( elem ) {\n // first check if elem is cell\n var cell = this.getCell( elem );\n if ( cell ) {\n return cell;\n }\n // try to get parent cell elem\n elem = utils.getParent( elem, '.flickity-slider > *' );\n return this.getCell( elem );\n };\n \n /**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\n proto.getAdjacentCellElements = function( adjCount, index ) {\n if ( !adjCount ) {\n return this.selectedSlide.getCellElements();\n }\n index = index === undefined ? this.selectedIndex : index;\n \n var len = this.slides.length;\n if ( 1 + ( adjCount * 2 ) >= len ) {\n return this.getCellElements();\n }\n \n var cellElems = [];\n for ( var i = index - adjCount; i <= index + adjCount; i++ ) {\n var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n var slide = this.slides[ slideIndex ];\n if ( slide ) {\n cellElems = cellElems.concat( slide.getCellElements() );\n }\n }\n return cellElems;\n };\n \n /**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\n proto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // do not select invalid selectors from hash: #123, #/. #791\n if ( selector.match( /^[#.]?[\\d/]/ ) ) {\n return;\n }\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n };\n \n // -------------------------- events -------------------------- //\n \n proto.uiChange = function() {\n this.emitEvent('uiChange');\n };\n \n // keep focus on element when child UI elements are clicked\n proto.childUIPointerDown = function( event ) {\n // HACK iOS does not allow touch events to bubble up?!\n if ( event.type != 'touchstart' ) {\n event.preventDefault();\n }\n this.focus();\n };\n \n // ----- resize ----- //\n \n proto.onresize = function() {\n this.watchCSS();\n this.resize();\n };\n \n utils.debounceMethod( Flickity, 'onresize', 150 );\n \n proto.resize = function() {\n // #1177 disable resize behavior when animating or dragging for iOS 15\n if ( !this.isActive || this.isAnimating || this.isDragging ) {\n return;\n }\n this.getSize();\n // wrap values\n if ( this.options.wrapAround ) {\n this.x = utils.modulo( this.x, this.slideableWidth );\n }\n this.positionCells();\n this._getWrapShiftCells();\n this.setGallerySize();\n this.emitEvent('resize');\n // update selected index for group slides, instant\n // TODO: position can be lost between groups of various numbers\n var selectedElement = this.selectedElements && this.selectedElements[0];\n this.selectCell( selectedElement, false, true );\n };\n \n // watches the :after property, activates/deactivates\n proto.watchCSS = function() {\n var watchOption = this.options.watchCSS;\n if ( !watchOption ) {\n return;\n }\n \n var afterContent = getComputedStyle( this.element, ':after' ).content;\n // activate if :after { content: 'flickity' }\n if ( afterContent.indexOf('flickity') != -1 ) {\n this.activate();\n } else {\n this.deactivate();\n }\n };\n \n // ----- keydown ----- //\n \n // go previous/next if left/right keys pressed\n proto.onkeydown = function( event ) {\n // only work if element is in focus\n var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility || isNotFocused ) {\n return;\n }\n \n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n };\n \n Flickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n }\n };\n \n // ----- focus ----- //\n \n proto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus ...\n // #Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\n }\n };\n \n // -------------------------- destroy -------------------------- //\n \n // deactivate all Flickity functionality, but keep stuff available\n proto.deactivate = function() {\n if ( !this.isActive ) {\n return;\n }\n this.element.classList.remove('flickity-enabled');\n this.element.classList.remove('flickity-rtl');\n this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n } );\n this.element.removeChild( this.viewport );\n // move child elements back into element\n moveElements( this.slider.children, this.element );\n if ( this.options.accessibility ) {\n this.element.removeAttribute('tabIndex');\n this.element.removeEventListener( 'keydown', this );\n }\n // set flags\n this.isActive = false;\n this.emitEvent('deactivate');\n };\n \n proto.destroy = function() {\n this.deactivate();\n window.removeEventListener( 'resize', this );\n this.allOff();\n this.emitEvent('destroy');\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'flickity' );\n }\n delete this.element.flickityGUID;\n delete instances[ this.guid ];\n };\n \n // -------------------------- prototype -------------------------- //\n \n utils.extend( proto, animatePrototype );\n \n // -------------------------- extras -------------------------- //\n \n /**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\n Flickity.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n var id = elem && elem.flickityGUID;\n return id && instances[ id ];\n };\n \n utils.htmlInit( Flickity, 'flickity' );\n \n if ( jQuery && jQuery.bridget ) {\n jQuery.bridget( 'flickity', Flickity );\n }\n \n // set internal jQuery, for Webpack + jQuery v3, #478\n Flickity.setJQuery = function( jq ) {\n jQuery = jq;\n };\n \n Flickity.Cell = Cell;\n Flickity.Slide = Slide;\n \n return Flickity;\n \n} ) );\n \n/*!\n * Unipointer v2.4.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n \n/*jshint browser: true, undef: true, unused: true, strict: true */\n \n( function( window, factory ) {\n // universal module definition\n /* jshint strict: false */ /*global define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'unipointer/unipointer',[\n 'ev-emitter/ev-emitter'\n ], function( EvEmitter ) {\n return factory( window, EvEmitter );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter')\n );\n } else {\n // browser global\n window.Unipointer = factory(\n window,\n window.EvEmitter\n );\n }\n \n}( window, function factory( window, EvEmitter ) {\n \n \n \n function noop() {}\n \n function Unipointer() {}\n \n // inherit EvEmitter\n var proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n \n proto.bindStartEvent = function( elem ) {\n this._bindStartEvent( elem, true );\n };\n \n proto.unbindStartEvent = function( elem ) {\n this._bindStartEvent( elem, false );\n };\n \n /**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\n proto._bindStartEvent = function( elem, isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n \n // default to mouse events\n var startEvent = 'mousedown';\n if ( 'ontouchstart' in window ) {\n // HACK prefer Touch Events as you can preventDefault on touchstart to\n // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n startEvent = 'touchstart';\n } else if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n }\n elem[ bindMethod ]( startEvent, this );\n };\n \n // trigger handler methods for events\n proto.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n };\n \n // returns the touch that we're keeping track of\n proto.getTouch = function( touches ) {\n for ( var i=0; i < touches.length; i++ ) {\n var touch = touches[i];\n if ( touch.identifier == this.pointerIdentifier ) {\n return touch;\n }\n }\n };\n \n // ----- start event ----- //\n \n proto.onmousedown = function( event ) {\n // dismiss clicks from right or middle buttons\n var button = event.button;\n if ( button && ( button !== 0 && button !== 1 ) ) {\n return;\n }\n this._pointerDown( event, event );\n };\n \n proto.ontouchstart = function( event ) {\n this._pointerDown( event, event.changedTouches[0] );\n };\n \n proto.onpointerdown = function( event ) {\n this._pointerDown( event, event );\n };\n \n /**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\n proto._pointerDown = function( event, pointer ) {\n // dismiss right click and other pointers\n // button = 0 is okay, 1-4 not\n if ( event.button || this.isPointerDown ) {\n return;\n }\n \n this.isPointerDown = true;\n // save pointer identifier to match up touch events\n this.pointerIdentifier = pointer.pointerId !== undefined ?\n // pointerId for pointer events, touch.indentifier for touch events\n pointer.pointerId : pointer.identifier;\n \n this.pointerDown( event, pointer );\n };\n \n proto.pointerDown = function( event, pointer ) {\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [event, pointer] );\n };\n \n // hash of events to be bound after start event\n var postStartEvents = {\n mousedown: ['mousemove', 'mouseup'],\n touchstart: ['touchmove', 'touchend', 'touchcancel'],\n pointerdown: ['pointermove', 'pointerup', 'pointercancel']\n };\n \n proto._bindPostStartEvents = function( event ) {\n if ( !event ) {\n return;\n }\n // get proper events to match start event\n var events = postStartEvents[ event.type ];\n // bind events to node\n events.forEach( function( eventName ) {\n window.addEventListener( eventName, this );\n }, this );\n // save these arguments\n this._boundPointerEvents = events;\n };\n \n proto._unbindPostStartEvents = function() {\n // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n if ( !this._boundPointerEvents ) {\n return;\n }\n this._boundPointerEvents.forEach( function( eventName ) {\n window.removeEventListener( eventName, this );\n }, this );\n \n delete this._boundPointerEvents;\n };\n \n // ----- move event ----- //\n \n proto.onmousemove = function( event ) {\n this._pointerMove( event, event );\n };\n \n proto.onpointermove = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerMove( event, event );\n }\n };\n \n proto.ontouchmove = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerMove( event, touch );\n }\n };\n \n /**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\n proto._pointerMove = function( event, pointer ) {\n this.pointerMove( event, pointer );\n };\n \n // public\n proto.pointerMove = function( event, pointer ) {\n this.emitEvent( 'pointerMove', [event, pointer] );\n };\n \n // ----- end event ----- //\n \n \n proto.onmouseup = function( event ) {\n this._pointerUp( event, event );\n };\n \n proto.onpointerup = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerUp( event, event );\n }\n };\n \n proto.ontouchend = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerUp( event, touch );\n }\n };\n \n /**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\n proto._pointerUp = function( event, pointer ) {\n this._pointerDone();\n this.pointerUp( event, pointer );\n };\n \n // public\n proto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [event, pointer] );\n };\n \n // ----- pointer done ----- //\n \n // triggered on pointer up & pointer cancel\n proto._pointerDone = function() {\n this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n };\n \n proto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\n };\n \n proto.pointerDone = noop;\n \n // ----- pointer cancel ----- //\n \n proto.onpointercancel = function( event ) {\n if ( event.pointerId == this.pointerIdentifier ) {\n this._pointerCancel( event, event );\n }\n };\n \n proto.ontouchcancel = function( event ) {\n var touch = this.getTouch( event.changedTouches );\n if ( touch ) {\n this._pointerCancel( event, touch );\n }\n };\n \n /**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\n proto._pointerCancel = function( event, pointer ) {\n this._pointerDone();\n this.pointerCancel( event, pointer );\n };\n \n // public\n proto.pointerCancel = function( event, pointer ) {\n this.emitEvent( 'pointerCancel', [event, pointer] );\n };\n \n // ----- ----- //\n \n // utility function for getting x/y coords from event\n Unipointer.getPointerPoint = function( pointer ) {\n return {\n x: pointer.pageX,\n y: pointer.pageY\n };\n };\n \n // ----- ----- //\n \n return Unipointer;\n \n}));\n \n/*!\n * Unidragger v2.4.0\n * Draggable base class\n * MIT license\n */\n \n/*jshint browser: true, unused: true, undef: true, strict: true */\n \n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n \n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'unidragger/unidragger',[\n 'unipointer/unipointer'\n ], function( Unipointer ) {\n return factory( window, Unipointer );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('unipointer')\n );\n } else {\n // browser global\n window.Unidragger = factory(\n window,\n window.Unipointer\n );\n }\n \n}( window, function factory( window, Unipointer ) {\n \n \n \n // -------------------------- Unidragger -------------------------- //\n \n function Unidragger() {}\n \n // inherit Unipointer & EvEmitter\n var proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n \n // ----- bind start ----- //\n \n proto.bindHandles = function() {\n this._bindHandles( true );\n };\n \n proto.unbindHandles = function() {\n this._bindHandles( false );\n };\n \n /**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\n proto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\n }\n }\n };\n \n // prototype so it can be overwriteable by Flickity\n proto._touchActionValue = 'none';\n \n // ----- start event ----- //\n \n /**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\n proto.pointerDown = function( event, pointer ) {\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY\n };\n \n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [event, pointer] );\n };\n \n // nodes that have text fields\n var cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: true,\n OPTION: true\n };\n \n // input types that do not have text fields\n var clickTypes = {\n radio: true,\n checkbox: true,\n button: true,\n submit: true,\n image: true,\n file: true\n };\n \n // dismiss inputs with text fields. flickity#403, flickity#404\n proto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n };\n \n // kludge to blur previously focused input\n proto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\n };\n \n // ----- move event ----- //\n \n /**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\n proto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.emitEvent( 'pointerMove', [event, pointer, moveVector] );\n this._dragMove( event, pointer, moveVector );\n };\n \n // base pointer move logic\n proto._dragPointerMove = function( event, pointer ) {\n var moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\n };\n // start drag if pointer has moved far enough to start drag\n if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n this._dragStart( event, pointer );\n }\n return moveVector;\n };\n \n // condition if pointer has moved far enough to start drag\n proto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n };\n \n // ----- end event ----- //\n \n /**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\n proto.pointerUp = function( event, pointer ) {\n this.emitEvent( 'pointerUp', [event, pointer] );\n this._dragPointerUp( event, pointer );\n };\n \n proto._dragPointerUp = function( event, pointer ) {\n if ( this.isDragging ) {\n this._dragEnd( event, pointer );\n } else {\n // pointer didn't move enough for drag to start\n this._staticClick( event, pointer );\n }\n };\n \n // -------------------------- drag -------------------------- //\n \n // dragStart\n proto._dragStart = function( event, pointer ) {\n this.isDragging = true;\n // prevent clicks\n this.isPreventingClicks = true;\n this.dragStart( event, pointer );\n };\n \n proto.dragStart = function( event, pointer ) {\n this.emitEvent( 'dragStart', [event, pointer] );\n };\n \n // dragMove\n proto._dragMove = function( event, pointer, moveVector ) {\n // do not drag if not dragging yet\n if ( !this.isDragging ) {\n return;\n }\n \n this.dragMove( event, pointer, moveVector );\n };\n \n proto.dragMove = function( event, pointer, moveVector ) {\n event.preventDefault();\n this.emitEvent( 'dragMove', [event, pointer, moveVector] );\n };\n \n // dragEnd\n proto._dragEnd = function( event, pointer ) {\n // set flags\n this.isDragging = false;\n // re-enable clicking async\n setTimeout( function() {\n delete this.isPreventingClicks;\n }.bind( this ) );\n \n this.dragEnd( event, pointer );\n };\n \n proto.dragEnd = function( event, pointer ) {\n this.emitEvent( 'dragEnd', [event, pointer] );\n };\n \n // ----- onclick ----- //\n \n // handle all clicks and prevent clicks when dragging\n proto.onclick = function( event ) {\n if ( this.isPreventingClicks ) {\n event.preventDefault();\n }\n };\n \n // ----- staticClick ----- //\n \n // triggered after pointer down & up with no/tiny movement\n proto._staticClick = function( event, pointer ) {\n // ignore emulated mouse up clicks\n if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n return;\n }\n \n this.staticClick( event, pointer );\n \n // set flag for emulated clicks 300ms after touchend\n if ( event.type != 'mouseup' ) {\n this.isIgnoringMouseUp = true;\n // reset flag after 300ms\n setTimeout( function() {\n delete this.isIgnoringMouseUp;\n }.bind( this ), 400 );\n }\n };\n \n proto.staticClick = function( event, pointer ) {\n this.emitEvent( 'staticClick', [event, pointer] );\n };\n \n // ----- utils ----- //\n \n Unidragger.getPointerPoint = Unipointer.getPointerPoint;\n \n // ----- ----- //\n \n return Unidragger;\n \n}));\n \n// drag\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/drag',[\n './flickity',\n 'unidragger/unidragger',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unidragger, utils ) {\n return factory( window, Flickity, Unidragger, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unidragger'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.Unidragger,\n window.fizzyUIUtils\n );\n }\n \n}( window, function factory( window, Flickity, Unidragger, utils ) {\n \n \n \n // ----- defaults ----- //\n \n utils.extend( Flickity.defaults, {\n draggable: '>1',\n dragThreshold: 3\n } );\n \n // ----- create ----- //\n \n Flickity.createMethods.push('_createDrag');\n \n // -------------------------- drag prototype -------------------------- //\n \n var proto = Flickity.prototype;\n utils.extend( proto, Unidragger.prototype );\n proto._touchActionValue = 'pan-y';\n \n // -------------------------- -------------------------- //\n \n proto._createDrag = function() {\n this.on( 'activate', this.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n // TODO updateDraggable on resize? if groupCells & slides change\n };\n \n proto.onActivateDrag = function() {\n this.handles = [this.viewport];\n this.bindHandles();\n this.updateDraggable();\n };\n \n proto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n };\n \n proto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable == '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n if ( this.isDraggable ) {\n this.element.classList.add('is-draggable');\n } else {\n this.element.classList.remove('is-draggable');\n }\n };\n \n // backwards compatibility\n proto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n };\n \n proto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n };\n \n proto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n };\n \n // -------------------------- pointer events -------------------------- //\n \n proto.pointerDown = function( event, pointer ) {\n if ( !this.isDraggable ) {\n this._pointerDownDefault( event, pointer );\n return;\n }\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n \n this._pointerDownPreventDefault( event );\n this.pointerDownFocus( event );\n // blur\n if ( document.activeElement != this.element ) {\n // do not blur if already focused\n this.pointerDownBlur();\n }\n \n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n \n this._pointerDownDefault( event, pointer );\n };\n \n // default pointerDown logic, used for staticClick\n proto._pointerDownDefault = function( event, pointer ) {\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY\n };\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [pointer] );\n };\n \n var focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true\n };\n \n proto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n };\n \n proto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\n };\n \n // ----- move ----- //\n \n proto.hasDragStarted = function( moveVector ) {\n return Math.abs( moveVector.x ) > this.options.dragThreshold;\n };\n \n // ----- up ----- //\n \n proto.pointerUp = function( event, pointer ) {\n delete this.isTouchScrolling;\n this.viewport.classList.remove('is-pointer-down');\n this.dispatchEvent( 'pointerUp', event, [pointer] );\n this._dragPointerUp( event, pointer );\n };\n \n proto.pointerDone = function() {\n window.removeEventListener( 'scroll', this );\n delete this.pointerDownScroll;\n };\n \n // -------------------------- dragging -------------------------- //\n \n proto.dragStart = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n this.dragStartPosition = this.x;\n this.startAnimation();\n window.removeEventListener( 'scroll', this );\n this.dispatchEvent( 'dragStart', event, [pointer] );\n };\n \n proto.pointerMove = function( event, pointer ) {\n var moveVector = this._dragPointerMove( event, pointer );\n this.dispatchEvent( 'pointerMove', event, [pointer, moveVector] );\n this._dragMove( event, pointer, moveVector );\n };\n \n proto.dragMove = function( event, pointer, moveVector ) {\n if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n \n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x %= this.slideableWidth;\n }\n var dragX = this.dragStartPosition + moveVector.x * direction;\n \n if ( !this.options.wrapAround && this.slides.length ) {\n // slow drag\n var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n }\n \n this.dragX = dragX;\n \n this.dragMoveTime = new Date();\n this.dispatchEvent( 'dragMove', event, [pointer, moveVector] );\n };\n \n proto.dragEnd = function( event, pointer ) {\n if ( !this.isDraggable ) {\n return;\n }\n if ( this.options.freeScroll ) {\n this.isFreeScrolling = true;\n }\n // set selectedIndex based on where flick will end up\n var index = this.dragEndRestingSelect();\n \n if ( this.options.freeScroll && !this.options.wrapAround ) {\n // if free-scroll & not wrap around\n // do not free-scroll if going outside of bounding slides\n // so bounding slides can attract slider, and keep it in bounds\n var restingX = this.getRestingPosition();\n this.isFreeScrolling = -restingX > this.slides[0].target &&\n -restingX < this.getLastSlide().target;\n } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n // boost selection if selected index has not changed\n index += this.dragEndBoostSelect();\n }\n delete this.previousDragX;\n // apply selection\n // TODO refactor this, selecting here feels weird\n // HACK, set flag so dragging stays in correct direction\n this.isDragSelect = this.options.wrapAround;\n this.select( index );\n delete this.isDragSelect;\n this.dispatchEvent( 'dragEnd', event, [pointer] );\n };\n \n proto.dragEndRestingSelect = function() {\n var restingX = this.getRestingPosition();\n // how far away from selected slide\n var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n // get closet resting going up and going down\n var positiveResting = this._getClosestResting( restingX, distance, 1 );\n var negativeResting = this._getClosestResting( restingX, distance, -1 );\n // use closer resting for wrap-around\n var index = positiveResting.distance < negativeResting.distance ?\n positiveResting.index : negativeResting.index;\n return index;\n };\n \n /**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\n proto._getClosestResting = function( restingX, distance, increment ) {\n var index = this.selectedIndex;\n var minDistance = Infinity;\n var condition = this.options.contain && !this.options.wrapAround ?\n // if contain, keep going if distance is equal to minDistance\n function( dist, minDist ) {\n return dist <= minDist;\n } : function( dist, minDist ) {\n return dist < minDist;\n };\n while ( condition( distance, minDistance ) ) {\n // measure distance to next cell\n index += increment;\n minDistance = distance;\n distance = this.getSlideDistance( -restingX, index );\n if ( distance === null ) {\n break;\n }\n distance = Math.abs( distance );\n }\n return {\n distance: minDistance,\n // selected was previous index\n index: index - increment\n };\n };\n \n /**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\n proto.getSlideDistance = function( x, index ) {\n var len = this.slides.length;\n // wrap around if at least 2 slides\n var isWrapAround = this.options.wrapAround && len > 1;\n var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n var slide = this.slides[ slideIndex ];\n if ( !slide ) {\n return null;\n }\n // add distance for wrap-around slides\n var wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n return x - ( slide.target + wrap );\n };\n \n proto.dragEndBoostSelect = function() {\n // do not boost if no previousDragX or dragMoveTime\n if ( this.previousDragX === undefined || !this.dragMoveTime ||\n // or if drag was held for 100 ms\n new Date() - this.dragMoveTime > 100 ) {\n return 0;\n }\n \n var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n var delta = this.previousDragX - this.dragX;\n if ( distance > 0 && delta > 0 ) {\n // boost to next if moving towards the right, and positive velocity\n return 1;\n } else if ( distance < 0 && delta < 0 ) {\n // boost to previous if moving towards the left, and negative velocity\n return -1;\n }\n return 0;\n };\n \n // ----- staticClick ----- //\n \n proto.staticClick = function( event, pointer ) {\n // get clickedCell, if cell was clicked\n var clickedCell = this.getParentCell( event.target );\n var cellElem = clickedCell && clickedCell.element;\n var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n this.dispatchEvent( 'staticClick', event, [pointer, cellElem, cellIndex] );\n };\n \n // ----- scroll ----- //\n \n proto.onscroll = function() {\n var scroll = getScrollPosition();\n var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n // cancel click/tap if scroll is too much\n if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n this._pointerDone();\n }\n };\n \n // ----- utils ----- //\n \n function getScrollPosition() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n }\n \n // ----- ----- //\n \n return Flickity;\n \n} ) );\n \n// prev/next buttons\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/prev-next-button',[\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n \n}( window, function factory( window, Flickity, Unipointer, utils ) {\n 'use strict';\n \n var svgURI = 'http://www.w3.org/2000/svg';\n \n // -------------------------- PrevNextButton -------------------------- //\n \n function PrevNextButton( direction, parent ) {\n this.direction = direction;\n this.parent = parent;\n this._create();\n }\n \n PrevNextButton.prototype = Object.create( Unipointer.prototype );\n \n PrevNextButton.prototype._create = function() {\n // properties\n this.isEnabled = true;\n this.isPrevious = this.direction == -1;\n var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n this.isLeft = this.direction == leftDirection;\n \n var element = this.element = document.createElement('button');\n element.className = 'flickity-button flickity-prev-next-button';\n element.className += this.isPrevious ? ' previous' : ' next';\n // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n element.setAttribute( 'type', 'button' );\n // init as disabled\n this.disable();\n \n element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n \n // create arrow\n var svg = this.createSVG();\n element.appendChild( svg );\n // events\n this.parent.on( 'select', this.update.bind( this ) );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n };\n \n PrevNextButton.prototype.activate = function() {\n this.bindStartEvent( this.element );\n this.element.addEventListener( 'click', this );\n // add to DOM\n this.parent.element.appendChild( this.element );\n };\n \n PrevNextButton.prototype.deactivate = function() {\n // remove from DOM\n this.parent.element.removeChild( this.element );\n // click events\n this.unbindStartEvent( this.element );\n this.element.removeEventListener( 'click', this );\n };\n \n PrevNextButton.prototype.createSVG = function() {\n var svg = document.createElementNS( svgURI, 'svg' );\n svg.setAttribute( 'class', 'flickity-button-icon' );\n svg.setAttribute( 'viewBox', '0 0 100 100' );\n var path = document.createElementNS( svgURI, 'path' );\n var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n path.setAttribute( 'd', pathMovements );\n path.setAttribute( 'class', 'arrow' );\n // rotate arrow\n if ( !this.isLeft ) {\n path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n }\n svg.appendChild( path );\n return svg;\n };\n \n // get SVG path movmement\n function getArrowMovements( shape ) {\n // use shape as movement if string\n if ( typeof shape == 'string' ) {\n return shape;\n }\n // create movement string\n return 'M ' + shape.x0 + ',50' +\n ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n ' L ' + shape.x3 + ',50 ' +\n ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n ' Z';\n }\n \n PrevNextButton.prototype.handleEvent = utils.handleEvent;\n \n PrevNextButton.prototype.onclick = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.parent.uiChange();\n var method = this.isPrevious ? 'previous' : 'next';\n this.parent[ method ]();\n };\n \n // ----- ----- //\n \n PrevNextButton.prototype.enable = function() {\n if ( this.isEnabled ) {\n return;\n }\n this.element.disabled = false;\n this.isEnabled = true;\n };\n \n PrevNextButton.prototype.disable = function() {\n if ( !this.isEnabled ) {\n return;\n }\n this.element.disabled = true;\n this.isEnabled = false;\n };\n \n PrevNextButton.prototype.update = function() {\n // index of first or last slide, if previous or next\n var slides = this.parent.slides;\n // enable is wrapAround and at least 2 slides\n if ( this.parent.options.wrapAround && slides.length > 1 ) {\n this.enable();\n return;\n }\n var lastIndex = slides.length ? slides.length - 1 : 0;\n var boundIndex = this.isPrevious ? 0 : lastIndex;\n var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n this[ method ]();\n };\n \n PrevNextButton.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n };\n \n // -------------------------- Flickity prototype -------------------------- //\n \n utils.extend( Flickity.defaults, {\n prevNextButtons: true,\n arrowShape: {\n x0: 10,\n x1: 60, y1: 50,\n x2: 70, y2: 40,\n x3: 30\n }\n } );\n \n Flickity.createMethods.push('_createPrevNextButtons');\n var proto = Flickity.prototype;\n \n proto._createPrevNextButtons = function() {\n if ( !this.options.prevNextButtons ) {\n return;\n }\n \n this.prevButton = new PrevNextButton( -1, this );\n this.nextButton = new PrevNextButton( 1, this );\n \n this.on( 'activate', this.activatePrevNextButtons );\n };\n \n proto.activatePrevNextButtons = function() {\n this.prevButton.activate();\n this.nextButton.activate();\n this.on( 'deactivate', this.deactivatePrevNextButtons );\n };\n \n proto.deactivatePrevNextButtons = function() {\n this.prevButton.deactivate();\n this.nextButton.deactivate();\n this.off( 'deactivate', this.deactivatePrevNextButtons );\n };\n \n // -------------------------- -------------------------- //\n \n Flickity.PrevNextButton = PrevNextButton;\n \n return Flickity;\n \n} ) );\n \n// page dots\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/page-dots',[\n './flickity',\n 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n \n}( window, function factory( window, Flickity, Unipointer, utils ) {\n \n // -------------------------- PageDots -------------------------- //\n \n \n \n function PageDots( parent ) {\n this.parent = parent;\n this._create();\n }\n \n PageDots.prototype = Object.create( Unipointer.prototype );\n \n PageDots.prototype._create = function() {\n // create holder element\n this.holder = document.createElement('ol');\n this.holder.className = 'flickity-page-dots';\n // create dots, array of elements\n this.dots = [];\n // events\n this.handleClick = this.onClick.bind( this );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n };\n \n PageDots.prototype.activate = function() {\n this.setDots();\n this.holder.addEventListener( 'click', this.handleClick );\n this.bindStartEvent( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n };\n \n PageDots.prototype.deactivate = function() {\n this.holder.removeEventListener( 'click', this.handleClick );\n this.unbindStartEvent( this.holder );\n // remove from DOM\n this.parent.element.removeChild( this.holder );\n };\n \n PageDots.prototype.setDots = function() {\n // get difference between number of slides and number of dots\n var delta = this.parent.slides.length - this.dots.length;\n if ( delta > 0 ) {\n this.addDots( delta );\n } else if ( delta < 0 ) {\n this.removeDots( -delta );\n }\n };\n \n PageDots.prototype.addDots = function( count ) {\n var fragment = document.createDocumentFragment();\n var newDots = [];\n var length = this.dots.length;\n var max = length + count;\n \n for ( var i = length; i < max; i++ ) {\n var dot = document.createElement('li');\n dot.className = 'dot';\n dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n fragment.appendChild( dot );\n newDots.push( dot );\n }\n \n this.holder.appendChild( fragment );\n this.dots = this.dots.concat( newDots );\n };\n \n PageDots.prototype.removeDots = function( count ) {\n // remove from this.dots collection\n var removeDots = this.dots.splice( this.dots.length - count, count );\n // remove from DOM\n removeDots.forEach( function( dot ) {\n this.holder.removeChild( dot );\n }, this );\n };\n \n PageDots.prototype.updateSelected = function() {\n // remove selected class on previous\n if ( this.selectedDot ) {\n this.selectedDot.className = 'dot';\n this.selectedDot.removeAttribute('aria-current');\n }\n // don't proceed if no dots\n if ( !this.dots.length ) {\n return;\n }\n this.selectedDot = this.dots[ this.parent.selectedIndex ];\n this.selectedDot.className = 'dot is-selected';\n this.selectedDot.setAttribute( 'aria-current', 'step' );\n };\n \n PageDots.prototype.onTap = // old method name, backwards-compatible\n PageDots.prototype.onClick = function( event ) {\n var target = event.target;\n // only care about dot clicks\n if ( target.nodeName != 'LI' ) {\n return;\n }\n \n this.parent.uiChange();\n var index = this.dots.indexOf( target );\n this.parent.select( index );\n };\n \n PageDots.prototype.destroy = function() {\n this.deactivate();\n this.allOff();\n };\n \n Flickity.PageDots = PageDots;\n \n // -------------------------- Flickity -------------------------- //\n \n utils.extend( Flickity.defaults, {\n pageDots: true\n } );\n \n Flickity.createMethods.push('_createPageDots');\n \n var proto = Flickity.prototype;\n \n proto._createPageDots = function() {\n if ( !this.options.pageDots ) {\n return;\n }\n this.pageDots = new PageDots( this );\n // events\n this.on( 'activate', this.activatePageDots );\n this.on( 'select', this.updateSelectedPageDots );\n this.on( 'cellChange', this.updatePageDots );\n this.on( 'resize', this.updatePageDots );\n this.on( 'deactivate', this.deactivatePageDots );\n };\n \n proto.activatePageDots = function() {\n this.pageDots.activate();\n };\n \n proto.updateSelectedPageDots = function() {\n this.pageDots.updateSelected();\n };\n \n proto.updatePageDots = function() {\n this.pageDots.setDots();\n };\n \n proto.deactivatePageDots = function() {\n this.pageDots.deactivate();\n };\n \n // ----- ----- //\n \n Flickity.PageDots = PageDots;\n \n return Flickity;\n \n} ) );\n \n// player & autoPlay\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/player',[\n 'ev-emitter/ev-emitter',\n 'fizzy-ui-utils/utils',\n './flickity'\n ], function( EvEmitter, utils, Flickity ) {\n return factory( EvEmitter, utils, Flickity );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('ev-emitter'),\n require('fizzy-ui-utils'),\n require('./flickity')\n );\n } else {\n // browser global\n factory(\n window.EvEmitter,\n window.fizzyUIUtils,\n window.Flickity\n );\n }\n \n}( window, function factory( EvEmitter, utils, Flickity ) {\n \n \n \n // -------------------------- Player -------------------------- //\n \n function Player( parent ) {\n this.parent = parent;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\n }\n \n Player.prototype = Object.create( EvEmitter.prototype );\n \n // start play\n Player.prototype.play = function() {\n if ( this.state == 'playing' ) {\n return;\n }\n // do not play if page is hidden, start playing when page is visible\n var isPageHidden = document.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n \n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n // start ticking\n this.tick();\n };\n \n Player.prototype.tick = function() {\n // do not tick if not playing\n if ( this.state != 'playing' ) {\n return;\n }\n \n var time = this.parent.options.autoPlay;\n // default to 3 seconds\n time = typeof time == 'number' ? time : 3000;\n var _this = this;\n // HACK: reset ticks if stopped and started within interval\n this.clear();\n this.timeout = setTimeout( function() {\n _this.parent.next( true );\n _this.tick();\n }, time );\n };\n \n Player.prototype.stop = function() {\n this.state = 'stopped';\n this.clear();\n // remove visibility change event\n document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n };\n \n Player.prototype.clear = function() {\n clearTimeout( this.timeout );\n };\n \n Player.prototype.pause = function() {\n if ( this.state == 'playing' ) {\n this.state = 'paused';\n this.clear();\n }\n };\n \n Player.prototype.unpause = function() {\n // re-start play if paused\n if ( this.state == 'paused' ) {\n this.play();\n }\n };\n \n // pause if page visibility is hidden, unpause if visible\n Player.prototype.visibilityChange = function() {\n var isPageHidden = document.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n };\n \n Player.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n };\n \n // -------------------------- Flickity -------------------------- //\n \n utils.extend( Flickity.defaults, {\n pauseAutoPlayOnHover: true\n } );\n \n Flickity.createMethods.push('_createPlayer');\n var proto = Flickity.prototype;\n \n proto._createPlayer = function() {\n this.player = new Player( this );\n \n this.on( 'activate', this.activatePlayer );\n this.on( 'uiChange', this.stopPlayer );\n this.on( 'pointerDown', this.stopPlayer );\n this.on( 'deactivate', this.deactivatePlayer );\n };\n \n proto.activatePlayer = function() {\n if ( !this.options.autoPlay ) {\n return;\n }\n this.player.play();\n this.element.addEventListener( 'mouseenter', this );\n };\n \n // Player API, don't hate the ... thanks I know where the door is\n \n proto.playPlayer = function() {\n this.player.play();\n };\n \n proto.stopPlayer = function() {\n this.player.stop();\n };\n \n proto.pausePlayer = function() {\n this.player.pause();\n };\n \n proto.unpausePlayer = function() {\n this.player.unpause();\n };\n \n proto.deactivatePlayer = function() {\n this.player.stop();\n this.element.removeEventListener( 'mouseenter', this );\n };\n \n // ----- mouseenter/leave ----- //\n \n // pause auto-play on hover\n proto.onmouseenter = function() {\n if ( !this.options.pauseAutoPlayOnHover ) {\n return;\n }\n this.player.pause();\n this.element.addEventListener( 'mouseleave', this );\n };\n \n // resume auto-play on hover off\n proto.onmouseleave = function() {\n this.player.unpause();\n this.element.removeEventListener( 'mouseleave', this );\n };\n \n // ----- ----- //\n \n Flickity.Player = Player;\n \n return Flickity;\n \n} ) );\n \n// add, remove cell\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/add-remove-cell',[\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n \n}( window, function factory( window, Flickity, utils ) {\n \n \n \n // append cells to a document fragment\n function getCellsFragment( cells ) {\n var fragment = document.createDocumentFragment();\n cells.forEach( function( cell ) {\n fragment.appendChild( cell.element );\n } );\n return fragment;\n }\n \n // -------------------------- add/remove cell prototype -------------------------- //\n \n var proto = Flickity.prototype;\n \n /**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\n proto.insert = function( elems, index ) {\n var cells = this._makeCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n var len = this.cells.length;\n // default to append\n index = index === undefined ? len : index;\n // add cells with document fragment\n var fragment = getCellsFragment( cells );\n // append to slider\n var isAppend = index == len;\n if ( isAppend ) {\n this.slider.appendChild( fragment );\n } else {\n var insertCellElement = this.cells[ index ].element;\n this.slider.insertBefore( fragment, insertCellElement );\n }\n // add to this.cells\n if ( index === 0 ) {\n // prepend, add to start\n this.cells = cells.concat( this.cells );\n } else if ( isAppend ) {\n // append, add to end\n this.cells = this.cells.concat( cells );\n } else {\n // insert in this.cells\n var endCells = this.cells.splice( index, len - index );\n this.cells = this.cells.concat( cells ).concat( endCells );\n }\n \n this._sizeCells( cells );\n this.cellChange( index, true );\n };\n \n proto.append = function( elems ) {\n this.insert( elems, this.cells.length );\n };\n \n proto.prepend = function( elems ) {\n this.insert( elems, 0 );\n };\n \n /**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\n proto.remove = function( elems ) {\n var cells = this.getCells( elems );\n if ( !cells || !cells.length ) {\n return;\n }\n \n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n \n this.cellChange( minCellIndex, true );\n };\n \n /**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\n proto.cellSizeChange = function( elem ) {\n var cell = this.getCell( elem );\n if ( !cell ) {\n return;\n }\n cell.getSize();\n \n var index = this.cells.indexOf( cell );\n this.cellChange( index );\n };\n \n /**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n * @param {Boolean} isPositioningSlider - Positions slider after selection\n */\n proto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n var prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n \n this.emitEvent( 'cellChange', [changedCellIndex] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\n }\n };\n \n // ----- ----- //\n \n return Flickity;\n \n} ) );\n \n// lazyload\n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/lazyload',[\n './flickity',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, utils ) {\n return factory( window, Flickity, utils );\n } );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n \n}( window, function factory( window, Flickity, utils ) {\n 'use strict';\n \n Flickity.createMethods.push('_createLazyload');\n var proto = Flickity.prototype;\n \n proto._createLazyload = function() {\n this.on( 'select', this.lazyLoad );\n };\n \n proto.lazyLoad = function() {\n var lazyLoad = this.options.lazyLoad;\n if ( !lazyLoad ) {\n return;\n }\n // get adjacent cells, use lazyLoad option for adjacent count\n var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n var cellElems = this.getAdjacentCellElements( adjCount );\n // get lazy images in those cells\n var lazyImages = [];\n cellElems.forEach( function( cellElem ) {\n var lazyCellImages = getCellLazyImages( cellElem );\n lazyImages = lazyImages.concat( lazyCellImages );\n } );\n // load lazy images\n lazyImages.forEach( function( img ) {\n new LazyLoader( img, this );\n }, this );\n };\n \n function getCellLazyImages( cellElem ) {\n // check if cell element is lazy image\n if ( cellElem.nodeName == 'IMG' ) {\n var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [cellElem];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\n return utils.makeArray( imgs );\n }\n \n // -------------------------- LazyLoader -------------------------- //\n \n /**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Flickity} flickity - Flickity instance\n */\n function LazyLoader( img, flickity ) {\n this.img = img;\n this.flickity = flickity;\n this.load();\n }\n \n LazyLoader.prototype.handleEvent = utils.handleEvent;\n \n LazyLoader.prototype.load = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\n };\n \n LazyLoader.prototype.onload = function( event ) {\n this.complete( event, 'flickity-lazyloaded' );\n };\n \n LazyLoader.prototype.onerror = function( event ) {\n this.complete( event, 'flickity-lazyerror' );\n };\n \n LazyLoader.prototype.complete = function( event, className ) {\n // unbind events\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n \n var cell = this.flickity.getParentCell( this.img );\n var cellElem = cell && cell.element;\n this.flickity.cellSizeChange( cellElem );\n \n this.img.classList.add( className );\n this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n };\n \n // ----- ----- //\n \n Flickity.LazyLoader = LazyLoader;\n \n return Flickity;\n \n} ) );\n \n/*!\n * Flickity v2.3.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2021 Metafizzy\n */\n \n( function( window, factory ) {\n // universal module definition\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity/js/index',[\n './flickity',\n './drag',\n './prev-next-button',\n './page-dots',\n './player',\n './add-remove-cell',\n './lazyload'\n ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('./flickity'),\n require('./drag'),\n require('./prev-next-button'),\n require('./page-dots'),\n require('./player'),\n require('./add-remove-cell'),\n require('./lazyload')\n );\n }\n \n} )( window, function factory( Flickity ) {\n return Flickity;\n} );\n \n/*!\n * Flickity asNavFor v2.0.2\n * enable asNavFor for Flickity\n */\n \n/*jshint browser: true, undef: true, unused: true, strict: true*/\n \n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'flickity-as-nav-for/as-nav-for',[\n 'flickity/js/index',\n 'fizzy-ui-utils/utils'\n ], factory );\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n require('flickity'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window.Flickity,\n window.fizzyUIUtils\n );\n }\n \n}( window, function factory( Flickity, utils ) {\n \n \n \n // -------------------------- asNavFor prototype -------------------------- //\n \n // Flickity.defaults.asNavFor = null;\n \n Flickity.createMethods.push('_createAsNavFor');\n \n var proto = Flickity.prototype;\n \n proto._createAsNavFor = function() {\n this.on( 'activate', this.activateAsNavFor );\n this.on( 'deactivate', this.deactivateAsNavFor );\n this.on( 'destroy', this.destroyAsNavFor );\n \n var asNavForOption = this.options.asNavFor;\n if ( !asNavForOption ) {\n return;\n }\n // HACK do async, give time for other flickity to be initalized\n var _this = this;\n setTimeout( function initNavCompanion() {\n _this.setNavCompanion( asNavForOption );\n });\n };\n \n proto.setNavCompanion = function( elem ) {\n elem = utils.getQueryElement( elem );\n var companion = Flickity.data( elem );\n // stop if no companion or companion is self\n if ( !companion || companion == this ) {\n return;\n }\n \n this.navCompanion = companion;\n // companion select\n var _this = this;\n this.onNavCompanionSelect = function() {\n _this.navCompanionSelect();\n };\n companion.on( 'select', this.onNavCompanionSelect );\n // click\n this.on( 'staticClick', this.onNavStaticClick );\n \n this.navCompanionSelect( true );\n };\n \n proto.navCompanionSelect = function( isInstant ) {\n // wait for companion & selectedCells first. #8\n var companionCells = this.navCompanion && this.navCompanion.selectedCells;\n if ( !companionCells ) {\n return;\n }\n // select slide that matches first cell of slide\n var selectedCell = companionCells[0];\n var firstIndex = this.navCompanion.cells.indexOf( selectedCell );\n var lastIndex = firstIndex + companionCells.length - 1;\n var selectIndex = Math.floor( lerp( firstIndex, lastIndex,\n this.navCompanion.cellAlign ) );\n this.selectCell( selectIndex, false, isInstant );\n // set nav selected class\n this.removeNavSelectedElements();\n // stop if companion has more cells than this one\n if ( selectIndex >= this.cells.length ) {\n return;\n }\n \n var selectedCells = this.cells.slice( firstIndex, lastIndex + 1 );\n this.navSelectedElements = selectedCells.map( function( cell ) {\n return cell.element;\n });\n this.changeNavSelectedClass('add');\n };\n \n function lerp( a, b, t ) {\n return ( b - a ) * t + a;\n }\n \n proto.changeNavSelectedClass = function( method ) {\n this.navSelectedElements.forEach( function( navElem ) {\n navElem.classList[ method ]('is-nav-selected');\n });\n };\n \n proto.activateAsNavFor = function() {\n this.navCompanionSelect( true );\n };\n \n proto.removeNavSelectedElements = function() {\n if ( !this.navSelectedElements ) {\n return;\n }\n this.changeNavSelectedClass('remove');\n delete this.navSelectedElements;\n };\n \n proto.onNavStaticClick = function( event, pointer, cellElement, cellIndex ) {\n if ( typeof cellIndex == 'number' ) {\n this.navCompanion.selectCell( cellIndex );\n }\n };\n \n proto.deactivateAsNavFor = function() {\n this.removeNavSelectedElements();\n };\n \n proto.destroyAsNavFor = function() {\n if ( !this.navCompanion ) {\n return;\n }\n this.navCompanion.off( 'select', this.onNavCompanionSelect );\n this.off( 'staticClick', this.onNavStaticClick );\n delete this.navCompanion;\n };\n \n // ----- ----- //\n \n return Flickity;\n \n}));\n \n/*!\n * imagesLoaded v4.1.4\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n \n( function( window, factory ) {\n 'use strict';\n // universal module definition\n \n /*global define: false, module: false, require: false */\n \n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( 'imagesloaded/imagesloaded',[\n 'ev-emitter/ev-emitter'\n ], function( EvEmitter ) {\n return factory( window, EvEmitter );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('ev-emitter')\n );\n } else {\n // browser global\n window.imagesLoaded = factory(\n window,\n window.EvEmitter\n );\n }\n \n})( typeof window !== 'undefined' ? window : this,\n \n // -------------------------- factory -------------------------- //\n \n function factory( window, EvEmitter ) {\n \n \n \n var $ = window.jQuery;\n var console = window.console;\n \n // -------------------------- helpers -------------------------- //\n \n // extend objects\n function extend( a, b ) {\n for ( var prop in b ) {\n a[ prop ] = b[ prop ];\n }\n return a;\n }\n \n var arraySlice = Array.prototype.slice;\n \n // turn element or nodeList into an array\n function makeArray( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n \n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n \n // array of single index\n return [obj];\n }\n \n // -------------------------- imagesLoaded -------------------------- //\n \n /**\n * @param {Array, Element, NodeList, String} elem\n * @param {Object or Function} options - if function, use as callback\n * @param {Function} onAlways - callback function\n */\n function ImagesLoaded( elem, options, onAlways ) {\n // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n if ( !( this instanceof ImagesLoaded ) ) {\n return new ImagesLoaded( elem, options, onAlways );\n }\n // use elem as selector string\n var queryElem = elem;\n if ( typeof elem == 'string' ) {\n queryElem = document.querySelectorAll( elem );\n }\n // bail if bad element\n if ( !queryElem ) {\n console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );\n return;\n }\n \n this.elements = makeArray( queryElem );\n this.options = extend( {}, this.options );\n // shift arguments if no options set\n if ( typeof options == 'function' ) {\n onAlways = options;\n } else {\n extend( this.options, options );\n }\n \n if ( onAlways ) {\n this.on( 'always', onAlways );\n }\n \n this.getImages();\n \n if ( $ ) {\n // add jQuery Deferred object\n this.jqDeferred = new $.Deferred();\n }\n \n // HACK check async to allow time to bind listeners\n setTimeout( this.check.bind( this ) );\n }\n \n ImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n \n ImagesLoaded.prototype.options = {};\n \n ImagesLoaded.prototype.getImages = function() {\n this.images = [];\n \n // filter & find items if we have an item selector\n this.elements.forEach( this.addElementImages, this );\n };\n \n /**\n * @param {Node} element\n */\n ImagesLoaded.prototype.addElementImages = function( elem ) {\n // filter siblings\n if ( elem.nodeName == 'IMG' ) {\n this.addImage( elem );\n }\n // get background image on element\n if ( this.options.background === true ) {\n this.addElementBackgroundImages( elem );\n }\n \n // find children\n // no non-element nodes, #143\n var nodeType = elem.nodeType;\n if ( !nodeType || !elementNodeTypes[ nodeType ] ) {\n return;\n }\n var childImgs = elem.querySelectorAll('img');\n // concat childElems to filterFound array\n for ( var i=0; i < childImgs.length; i++ ) {\n var img = childImgs[i];\n this.addImage( img );\n }\n \n // get child background images\n if ( typeof this.options.background == 'string' ) {\n var children = elem.querySelectorAll( this.options.background );\n for ( i=0; i < children.length; i++ ) {\n var child = children[i];\n this.addElementBackgroundImages( child );\n }\n }\n };\n \n var elementNodeTypes = {\n 1: true,\n 9: true,\n 11: true\n };\n \n ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n var style = getComputedStyle( elem );\n if ( !style ) {\n // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n return;\n }\n // get url inside url(\"...\")\n var reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n var matches = reURL.exec( style.backgroundImage );\n while ( matches !== null ) {\n var url = matches && matches[2];\n if ( url ) {\n this.addBackground( url, elem );\n }\n matches = reURL.exec( style.backgroundImage );\n }\n };\n \n /**\n * @param {Image} img\n */\n ImagesLoaded.prototype.addImage = function( img ) {\n var loadingImage = new LoadingImage( img );\n this.images.push( loadingImage );\n };\n \n ImagesLoaded.prototype.addBackground = function( url, elem ) {\n var background = new Background( url, elem );\n this.images.push( background );\n };\n \n ImagesLoaded.prototype.check = function() {\n var _this = this;\n this.progressedCount = 0;\n this.hasAnyBroken = false;\n // complete if no images\n if ( !this.images.length ) {\n this.complete();\n return;\n }\n \n function onProgress( image, elem, message ) {\n // HACK - Chrome triggers event before object properties have changed. #83\n setTimeout( function() {\n _this.progress( image, elem, message );\n });\n }\n \n this.images.forEach( function( loadingImage ) {\n loadingImage.once( 'progress', onProgress );\n loadingImage.check();\n });\n };\n \n ImagesLoaded.prototype.progress = function( image, elem, message ) {\n this.progressedCount++;\n this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n // progress event\n this.emitEvent( 'progress', [this, image, elem] );\n if ( this.jqDeferred && this.jqDeferred.notify ) {\n this.jqDeferred.notify( this, image );\n }\n // check if completed\n if ( this.progressedCount == this.images.length ) {\n this.complete();\n }\n \n if ( this.options.debug && console ) {\n console.log( 'progress: ' + message, image, elem );\n }\n };\n \n ImagesLoaded.prototype.complete = function() {\n var eventName = this.hasAnyBroken ? 'fail' : 'done';\n this.isComplete = true;\n this.emitEvent( eventName, [this] );\n this.emitEvent( 'always', [this] );\n if ( this.jqDeferred ) {\n var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n this.jqDeferred[ jqMethod ]( this );\n }\n };\n \n // -------------------------- -------------------------- //\n \n function LoadingImage( img ) {\n this.img = img;\n }\n \n LoadingImage.prototype = Object.create( EvEmitter.prototype );\n \n LoadingImage.prototype.check = function() {\n // If complete is true and browser supports natural sizes,\n // try to check for image status manually.\n var isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n // report based on naturalWidth\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n return;\n }\n \n // If none of the checks above matched, simulate loading on detached element.\n this.proxyImage = new Image();\n this.proxyImage.addEventListener( 'load', this );\n this.proxyImage.addEventListener( 'error', this );\n // bind to image as well for Firefox. #191\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.proxyImage.src = this.img.src;\n };\n \n LoadingImage.prototype.getIsImageComplete = function() {\n // check for non-zero, non-undefined naturalWidth\n // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n return this.img.complete && this.img.naturalWidth;\n };\n \n LoadingImage.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n this.emitEvent( 'progress', [this, this.img, message] );\n };\n \n // ----- events ----- //\n \n // trigger specified handler for event type\n LoadingImage.prototype.handleEvent = function( event ) {\n var method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n };\n \n LoadingImage.prototype.onload = function() {\n this.confirm( true, 'onload' );\n this.unbindEvents();\n };\n \n LoadingImage.prototype.onerror = function() {\n this.confirm( false, 'onerror' );\n this.unbindEvents();\n };\n \n LoadingImage.prototype.unbindEvents = function() {\n this.proxyImage.removeEventListener( 'load', this );\n this.proxyImage.removeEventListener( 'error', this );\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n };\n \n // -------------------------- Background -------------------------- //\n \n function Background( url, element ) {\n this.url = url;\n this.element = element;\n this.img = new Image();\n }\n \n // inherit LoadingImage prototype\n Background.prototype = Object.create( LoadingImage.prototype );\n \n Background.prototype.check = function() {\n this.img.addEventListener( 'load', this );\n this.img.addEventListener( 'error', this );\n this.img.src = this.url;\n // check if image is already complete\n var isComplete = this.getIsImageComplete();\n if ( isComplete ) {\n this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n this.unbindEvents();\n }\n };\n \n Background.prototype.unbindEvents = function() {\n this.img.removeEventListener( 'load', this );\n this.img.removeEventListener( 'error', this );\n };\n \n Background.prototype.confirm = function( isLoaded, message ) {\n this.isLoaded = isLoaded;\n this.emitEvent( 'progress', [this, this.element, message] );\n };\n \n // -------------------------- jQuery -------------------------- //\n \n ImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n jQuery = jQuery || window.jQuery;\n if ( !jQuery ) {\n return;\n }\n // set local variable\n $ = jQuery;\n // $().imagesLoaded()\n $.fn.imagesLoaded = function( options, callback ) {\n var instance = new ImagesLoaded( this, options, callback );\n return instance.jqDeferred.promise( $(this) );\n };\n };\n // try making plugin\n ImagesLoaded.makeJQueryPlugin();\n \n // -------------------------- -------------------------- //\n \n return ImagesLoaded;\n \n });\n \n/*!\n * Flickity imagesLoaded v2.0.0\n * enables imagesLoaded option for Flickity\n */\n \n/*jshint browser: true, strict: true, undef: true, unused: true */\n \n( function( window, factory ) {\n // universal module definition\n /*jshint strict: false */ /*globals define, module, require */\n if ( typeof define == 'function' && define.amd ) {\n // AMD\n define( [\n 'flickity/js/index',\n 'imagesloaded/imagesloaded'\n ], function( Flickity, imagesLoaded ) {\n return factory( window, Flickity, imagesLoaded );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('flickity'),\n require('imagesloaded')\n );\n } else {\n // browser global\n window.Flickity = factory(\n window,\n window.Flickity,\n window.imagesLoaded\n );\n }\n \n}( window, function factory( window, Flickity, imagesLoaded ) {\n 'use strict';\n \n Flickity.createMethods.push('_createImagesLoaded');\n \n var proto = Flickity.prototype;\n \n proto._createImagesLoaded = function() {\n this.on( 'activate', this.imagesLoaded );\n };\n \n proto.imagesLoaded = function() {\n if ( !this.options.imagesLoaded ) {\n return;\n }\n var _this = this;\n function onImagesLoadedProgress( instance, image ) {\n var cell = _this.getParentCell( image.img );\n _this.cellSizeChange( cell && cell.element );\n if ( !_this.options.freeScroll ) {\n _this.positionSliderAtSelected();\n }\n }\n imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n };\n \n return Flickity;\n \n}));\n "],"mappings":";;;;;;;;;;CAsBE,SAAUA,EAAQC,GAGM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,gCAAgC,CAAC,WAAW,SAAUE,GAC1D,OAAOH,EAASD,EAAQI,EAC5B,IACyB,iBAAVC,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,WAIZP,EAAOQ,cAAgBP,EACnBD,EACAA,EAAOI,OAInB,CAtBA,CAsBGJ,QAAQ,SAAkBA,EAAQI,GACjC,aAIA,IAAIK,EAAaC,MAAMC,UAAUC,MAI7BC,EAAUb,EAAOa,QACjBC,OAA6B,IAAXD,EAAyB,WAAY,EACvD,SAAUE,GACNF,EAAQG,MAAOD,EACnB,EAIJ,SAASP,EAAeS,EAAWC,EAAaC,IAC5CA,EAAIA,GAAKf,GAAUJ,EAAOI,UAMpBc,EAAYP,UAAUS,SAExBF,EAAYP,UAAUS,OAAS,SAAUC,GAE/BF,EAAEG,cAAeD,KAGvBE,KAAKC,QAAUL,EAAEM,QAAQ,EAAMF,KAAKC,QAASH,GACjD,GAIJF,EAAEO,GAAIT,GAAc,SAAUU,GAItB,IAqCoBH,EAxCxB,MAAoB,iBAARG,EAYhB,SAAqBC,EAAQC,EAAYC,GACrC,IAAIC,EACAC,EAAkB,OAASf,EAAY,KAAOY,EAAa,KAuB/D,OArBAD,EAAOK,MAAM,SAAUC,EAAGC,GAEtB,IAAIC,EAAWjB,EAAEkB,KAAMF,EAAMlB,GAC7B,GAAMmB,EAAN,CAMA,IAAIE,EAASF,EAAUP,GACvB,GAAMS,GAAkC,KAAxBT,EAAWU,OAAO,GAAlC,CAMA,IAAIC,EAAQF,EAAOG,MAAOL,EAAUN,GAEpCC,OAA8BW,IAAhBX,EAA4BS,EAAQT,CALlD,MAFIjB,EAAUkB,EAAkB,yBAJhC,MAHIlB,EAAUG,EAAY,+CAC9Be,EAcA,SAEuBU,IAAhBX,EAA4BA,EAAcH,CACrD,CAlCee,CAAYpB,KAAMI,EADdlB,EAAWmC,KAAMC,UAAW,KAqCnBrB,EAjCPG,EAANJ,KAkCJU,MAAM,SAAUC,EAAGC,GACtB,IAAIC,EAAWjB,EAAEkB,KAAMF,EAAMlB,GACxBmB,GAEDA,EAAShB,OAAQI,GACjBY,EAASU,UAGTV,EAAW,IAAIlB,EAAaiB,EAAMX,GAClCL,EAAEkB,KAAMF,EAAMlB,EAAWmB,GAEjC,IA5COb,KACX,EA8CAwB,EAAc5B,GAElB,CAKA,SAAS4B,EAAc5B,IACbA,GAAOA,GAAKA,EAAE6B,UAGpB7B,EAAE6B,QAAUxC,EAChB,CAMA,OAJAuC,EAAc3C,GAAUJ,EAAOI,QAIxBI,CAEX,IAUE,SAAUyC,EAAQhD,GAGM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,wBAAwBD,GACP,iBAAVI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,IAGjBgD,EAAOC,UAAYjD,GAG3B,CAdA,CAcoB,oBAAVD,OAAwBA,OAASuB,MAAM,WAI7C,SAAS2B,IAAa,CAEtB,IAAIC,EAAQD,EAAUvC,UAiFtB,OA/EAwC,EAAMC,GAAK,SAAUC,EAAWC,GAC5B,GAAMD,GAAcC,EAApB,CAIA,IAAIC,EAAShC,KAAKiC,QAAUjC,KAAKiC,SAAW,CAAC,EAEzCC,EAAYF,EAAQF,GAAcE,EAAQF,IAAe,GAM7D,OAJuC,GAAlCI,EAAUC,QAASJ,IACpBG,EAAUE,KAAML,GAGb/B,IAVP,CAWJ,EAEA4B,EAAMS,KAAO,SAAUP,EAAWC,GAC9B,GAAMD,GAAcC,EAApB,CAIA/B,KAAK6B,GAAIC,EAAWC,GAGpB,IAAIO,EAAatC,KAAKuC,YAAcvC,KAAKuC,aAAe,CAAC,EAMzD,OAJoBD,EAAYR,GAAcQ,EAAYR,IAAe,CAAC,GAE3DC,IAAa,EAErB/B,IAXP,CAYJ,EAEA4B,EAAMY,IAAM,SAAUV,EAAWC,GAC7B,IAAIG,EAAYlC,KAAKiC,SAAWjC,KAAKiC,QAASH,GAC9C,GAAMI,GAAcA,EAAUO,OAA9B,CAGA,IAAIC,EAAQR,EAAUC,QAASJ,GAK/B,OAJe,GAAVW,GACDR,EAAUS,OAAQD,EAAO,GAGtB1C,IANP,CAOJ,EAEA4B,EAAMgB,UAAY,SAAUd,EAAWvB,GACnC,IAAI2B,EAAYlC,KAAKiC,SAAWjC,KAAKiC,QAASH,GAC9C,GAAMI,GAAcA,EAAUO,OAA9B,CAIAP,EAAYA,EAAU7C,MAAM,GAC5BkB,EAAOA,GAAQ,GAIf,IAFA,IAAIsC,EAAgB7C,KAAKuC,aAAevC,KAAKuC,YAAaT,GAEhDnB,EAAE,EAAGA,EAAIuB,EAAUO,OAAQ9B,IAAM,CACvC,IAAIoB,EAAWG,EAAUvB,GACZkC,GAAiBA,EAAed,KAIzC/B,KAAKwC,IAAKV,EAAWC,UAEdc,EAAed,IAG1BA,EAASb,MAAOlB,KAAMO,EAC1B,CAEA,OAAOP,IArBP,CAsBJ,EAEA4B,EAAMkB,OAAS,kBACJ9C,KAAKiC,eACLjC,KAAKuC,WAChB,EAEOZ,CAEX;;;;;;AAWA,SAAYlD,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,oBAAoBD,GACH,iBAAVI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,IAGjBD,EAAOsE,QAAUrE,GAGxB,CAbD,CAaID,QAAQ,WACR,aAKA,SAASuE,EAAc/B,GACnB,IAAIgC,EAAMC,WAAYjC,GAGtB,OADqC,GAAvBA,EAAMkB,QAAQ,OAAegB,MAAOF,IAChCA,CACtB,CAIA,IAAI1D,EAA6B,oBAAXD,QAFtB,WAAiB,EAGb,SAAUE,GAEV,EAIA4D,EAAe,CACf,cACA,eACA,aACA,gBACA,aACA,cACA,YACA,eACA,kBACA,mBACA,iBACA,qBAGAC,EAAqBD,EAAaX,OAwBtC,SAASa,EAAU1C,GACf,IAAI2C,EAAQC,iBAAkB5C,GAM9B,OALM2C,GACFhE,EAAU,kBAAoBgE,EAApB,6FAIPA,CACX,CAIA,IAEIE,EAFAC,GAAU,EAyCd,SAASX,EAASnC,GASd,GAzCJ,WAEI,IAAK8C,EAAL,CAGAA,GAAU,EAQV,IAAIC,EAAMC,SAASC,cAAc,OACjCF,EAAIJ,MAAMO,MAAQ,QAClBH,EAAIJ,MAAMQ,QAAU,kBACpBJ,EAAIJ,MAAMS,YAAc,QACxBL,EAAIJ,MAAMU,YAAc,kBACxBN,EAAIJ,MAAMW,UAAY,aAEtB,IAAIC,EAAOP,SAASO,MAAQP,SAASQ,gBACrCD,EAAKE,YAAaV,GAClB,IAAIJ,EAAQD,EAAUK,GAEtBF,EAA8D,KAA7Ca,KAAKC,MAAOvB,EAAcO,EAAMO,QACjDf,EAAQU,eAAiBA,EAEzBU,EAAKK,YAAab,EAvBlB,CAwBJ,CAKIc,GAGoB,iBAAR7D,IACRA,EAAOgD,SAASc,cAAe9D,IAI7BA,GAAuB,iBAARA,GAAqBA,EAAK+D,SAA/C,CAIA,IAAIpB,EAAQD,EAAU1C,GAGtB,GAAsB,QAAjB2C,EAAMqB,QACP,OA5FR,WASI,IARA,IAAIC,EAAO,CACPf,MAAa,EACbgB,OAAa,EACbC,WAAa,EACbC,YAAa,EACbC,WAAa,EACbC,YAAa,GAEPvE,EAAE,EAAGA,EAAI0C,EAAoB1C,IAEnCkE,EADkBzB,EAAazC,IACT,EAE1B,OAAOkE,CACX,CA8EeM,GAGX,IAAIN,EAAO,CAAC,EACZA,EAAKf,MAAQlD,EAAKwE,YAClBP,EAAKC,OAASlE,EAAKyE,aAKnB,IAHA,IAAIC,EAAcT,EAAKS,YAAiC,cAAnB/B,EAAMW,UAGjCvD,EAAE,EAAGA,EAAI0C,EAAoB1C,IAAM,CACzC,IAAI4E,EAAcnC,EAAazC,GAC3BM,EAAQsC,EAAOgC,GACftC,EAAMC,WAAYjC,GAEtB4D,EAAMU,GAAiBpC,MAAOF,GAAc,EAANA,CAC1C,CAEA,IAAIuC,EAAeX,EAAKY,YAAcZ,EAAKa,aACvCC,EAAgBd,EAAKe,WAAaf,EAAKgB,cACvCC,EAAcjB,EAAKkB,WAAalB,EAAKmB,YACrCC,EAAepB,EAAKqB,UAAYrB,EAAKsB,aACrClC,EAAcY,EAAKuB,gBAAkBvB,EAAKwB,iBAC1CC,EAAezB,EAAK0B,eAAiB1B,EAAK2B,kBAE1CC,EAAuBnB,GAAe7B,EAGtCiD,EAAa1D,EAAcO,EAAMO,QACjB,IAAf4C,IACD7B,EAAKf,MAAQ4C,GAEfD,EAAuB,EAAIjB,EAAevB,IAG5C,IAAI0C,EAAc3D,EAAcO,EAAMuB,QAatC,OAZqB,IAAhB6B,IACD9B,EAAKC,OAAS6B,GAEhBF,EAAuB,EAAId,EAAgBW,IAG7CzB,EAAKE,WAAaF,EAAKf,OAAU0B,EAAevB,GAChDY,EAAKG,YAAcH,EAAKC,QAAWa,EAAgBW,GAEnDzB,EAAKI,WAAaJ,EAAKf,MAAQgC,EAC/BjB,EAAKK,YAAcL,EAAKC,OAASmB,EAE1BpB,CAtDP,CAuDJ,CAEA,OAAO9B,CAEX,IAUE,SAAUtE,EAAQC,GAEhB,aAEsB,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,6CAA6CD,GAC5B,iBAAVI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,IAGjBD,EAAOmI,gBAAkBlI,GAGjC,CAfA,CAeGD,QAAQ,WACP,aAEA,IAAIoI,EAAgB,WAChB,IAAIC,EAAYrI,OAAOsI,QAAQ3H,UAE/B,GAAK0H,EAAUE,QACX,MAAO,UAGX,GAAKF,EAAUF,gBACX,MAAO,kBAKX,IAFA,IAAIK,EAAW,CAAC,SAAU,MAAO,KAAM,KAE7BtG,EAAE,EAAGA,EAAIsG,EAASxE,OAAQ9B,IAAM,CACtC,IACII,EADSkG,EAAStG,GACA,kBACtB,GAAKmG,EAAW/F,GACZ,OAAOA,CAEf,CACH,CApBmB,GAsBpB,OAAO,SAA0BH,EAAMsG,GACnC,OAAOtG,EAAMiG,GAAiBK,EAClC,CAEJ,IASE,SAAUzI,EAAQC,GAIM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,uBAAuB,CAC3B,+CACD,SAAUiI,GACT,OAAOlI,EAASD,EAAQmI,EAC5B,IACyB,iBAAV9H,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,8BAIZP,EAAO0I,aAAezI,EAClBD,EACAA,EAAOmI,gBAInB,CAzBA,CAyBGnI,QAAQ,SAAkBA,EAAQmI,GAIjC,IAAIQ,EAAQ,CAKZA,OAAe,SAAUC,EAAGC,GACxB,IAAM,IAAIC,KAAQD,EACdD,EAAGE,GAASD,EAAGC,GAEnB,OAAOF,CACX,EAIAD,OAAe,SAAUnE,EAAKU,GAC1B,OAAWV,EAAMU,EAAQA,GAAQA,CACrC,GAIIzE,EAAaC,MAAMC,UAAUC,MAGjC+H,EAAMI,UAAY,SAAUC,GACxB,OAAKtI,MAAMuI,QAASD,GAETA,EAGNA,QACM,GAGqB,iBAAPA,GAAwC,iBAAdA,EAAIhF,OAG5CvD,EAAWmC,KAAMoG,GAIrB,CAACA,EACZ,EAIAL,EAAMO,WAAa,SAAUC,EAAKH,GAC9B,IAAI/E,EAAQkF,EAAIzF,QAASsF,IACV,GAAV/E,GACDkF,EAAIjF,OAAQD,EAAO,EAE3B,EAIA0E,EAAMS,UAAY,SAAUjH,EAAMsG,GAC9B,KAAQtG,EAAKkH,YAAclH,GAAQgD,SAASO,MAExC,GADAvD,EAAOA,EAAKkH,WACPlB,EAAiBhG,EAAMsG,GACxB,OAAOtG,CAGnB,EAKAwG,EAAMW,gBAAkB,SAAUnH,GAC9B,MAAoB,iBAARA,EACDgD,SAASc,cAAe9D,GAE5BA,CACX,EAKAwG,EAAMY,YAAc,SAAUC,GAC1B,IAAIlH,EAAS,KAAOkH,EAAMC,KACrBlI,KAAMe,IACPf,KAAMe,GAAUkH,EAExB,EAIAb,EAAMe,mBAAqB,SAAUC,EAAOlB,GAExCkB,EAAQhB,EAAMI,UAAWY,GACzB,IAAIC,EAAU,GAyBd,OAvBAD,EAAME,SAAS,SAAU1H,GAErB,GAAQA,aAAgB2H,YAIxB,GAAMrB,EAAN,CAMKN,EAAiBhG,EAAMsG,IACxBmB,EAAQjG,KAAMxB,GAKlB,IAFA,IAAI4H,EAAa5H,EAAK6H,iBAAkBvB,GAE9BvG,EAAE,EAAGA,EAAI6H,EAAW/F,OAAQ9B,IAClC0H,EAAQjG,KAAMoG,EAAW7H,GAV7B,MAFI0H,EAAQjG,KAAMxB,EActB,IAEOyH,CACX,EAIAjB,EAAMsB,eAAiB,SAAUC,EAAQrI,EAAYsI,GACjDA,EAAYA,GAAa,IAEzB,IAAI7H,EAAS4H,EAAOvJ,UAAWkB,GAC3BuI,EAAcvI,EAAa,UAE/BqI,EAAOvJ,UAAWkB,GAAe,WAC7B,IAAIwI,EAAU9I,KAAM6I,GACpBE,aAAcD,GAEd,IAAIvI,EAAOe,UACP0H,EAAQhJ,KACZA,KAAM6I,GAAgBI,YAAY,WAC9BlI,EAAOG,MAAO8H,EAAOzI,UACdyI,EAAOH,EAClB,GAAGD,EACP,CACJ,EAIAxB,EAAM8B,SAAW,SAAUC,GACvB,IAAIC,EAAaxF,SAASwF,WACP,YAAdA,GAA0C,eAAdA,EAE7BH,WAAYE,GAEZvF,SAASyF,iBAAkB,mBAAoBF,EAEvD,EAKA/B,EAAMkC,SAAW,SAAUC,GACvB,OAAOA,EAAIC,QAAS,eAAe,SAAUC,EAAOC,EAAIC,GACpD,OAAOD,EAAK,IAAMC,CACtB,IAAGC,aACP,EAEA,IAAItK,EAAUb,EAAOa,QA4CrB,OAtCA8H,EAAMyC,SAAW,SAAUC,EAAapK,GACpC0H,EAAM8B,UAAU,WACZ,IAAIa,EAAkB3C,EAAMkC,SAAU5J,GAClCsK,EAAW,QAAUD,EACrBE,EAAgBrG,SAAS6E,iBAAkB,IAAMuB,EAAW,KAC5DE,EAActG,SAAS6E,iBAAkB,OAASsB,GAClD3B,EAAQhB,EAAMI,UAAWyC,GACxBE,OAAQ/C,EAAMI,UAAW0C,IAC1BE,EAAkBJ,EAAW,WAC7BnL,EAASJ,EAAOI,OAEpBuJ,EAAME,SAAS,SAAU1H,GACrB,IAEIX,EAFAoK,EAAOzJ,EAAK0J,aAAcN,IACpCpJ,EAAK0J,aAAcF,GAEb,IACInK,EAAUoK,GAAQE,KAAKC,MAAOH,EAClC,CAAE,MAAQ5K,GAMN,YAJKH,GACDA,EAAQG,MAAO,iBAAmBuK,EAAW,OAASpJ,EAAK6J,UACvE,KAAOhL,GAGH,CAEA,IAAIoB,EAAW,IAAIiJ,EAAalJ,EAAMX,GAEjCpB,GACDA,EAAOiC,KAAMF,EAAMlB,EAAWmB,EAEtC,GAEJ,GACJ,EAIOuG,CAEX,IAGE,SAAU3I,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,mBAAmB,CACvB,sBACD,SAAUoE,GACT,OAAOrE,EAASD,EAAQsE,EAC5B,IACyB,iBAAVjE,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,cAIZP,EAAOiM,SAAWjM,EAAOiM,UAAY,CAAC,EACtCjM,EAAOiM,SAASC,KAAOjM,EACnBD,EACAA,EAAOsE,SAInB,CAxBA,CAwBGtE,QAAQ,SAAkBA,EAAQsE,GAIjC,SAAS4H,EAAM/J,EAAMgK,GACjB5K,KAAK6K,QAAUjK,EACfZ,KAAK4K,OAASA,EAEd5K,KAAK8K,QACT,CAEA,IAAIlJ,EAAQ+I,EAAKvL,UAuEjB,OArEAwC,EAAMkJ,OAAS,WACX9K,KAAK6K,QAAQtH,MAAMwH,SAAW,WAC9B/K,KAAK6K,QAAQG,aAAc,cAAe,QAC1ChL,KAAKiL,EAAI,EACTjL,KAAKkL,MAAQ,EACblL,KAAK6K,QAAQtH,MAAOvD,KAAK4K,OAAOO,YAAe,CACnD,EAEAvJ,EAAMwJ,QAAU,WAEZpL,KAAKqL,WACLrL,KAAK6K,QAAQtH,MAAMwH,SAAW,GAC9B,IAAIO,EAAOtL,KAAK4K,OAAOO,WACvBnL,KAAK6K,QAAQtH,MAAO+H,GAAS,GAC7BtL,KAAK6K,QAAQtH,MAAMgI,UAAY,GAC/BvL,KAAK6K,QAAQW,gBAAgB,cACjC,EAEA5J,EAAMmB,QAAU,WACZ/C,KAAK6E,KAAO9B,EAAS/C,KAAK6K,QAC9B,EAEAjJ,EAAM6J,YAAc,SAAUR,GAC1BjL,KAAKiL,EAAIA,EACTjL,KAAK0L,eACL1L,KAAK2L,eAAgBV,EACzB,EAGArJ,EAAM8J,aAAe9J,EAAMgK,iBAAmB,WAC1C,IAAIC,EAA2C,QAA1B7L,KAAK4K,OAAOO,WAAuB,aAAe,cACvEnL,KAAK8L,OAAS9L,KAAKiL,EAAIjL,KAAK6E,KAAMgH,GACpC7L,KAAK6E,KAAKf,MAAQ9D,KAAK4K,OAAOmB,SAChC,EAEAnK,EAAM+J,eAAiB,SAAUV,GAE7B,IAAIe,EAAwC,SAA3BhM,KAAK4K,OAAOO,WAAwB,GAAK,EAEtDc,EAAYjM,KAAK4K,OAAO3K,QAAQiM,gBAChCjB,EAAIe,GAAehM,KAAK4K,OAAO/F,KAAKE,WAAa/E,KAAK6E,KAAKf,OAC3DmH,EAAIe,EAERhM,KAAK6K,QAAQtH,MAAMgI,UAAY,cACjCvL,KAAK4K,OAAOuB,iBAAkBF,GAAc,GAC9C,EAEArK,EAAMwK,OAAS,WACXpM,KAAK6K,QAAQwB,UAAUC,IAAI,eAC3BtM,KAAK6K,QAAQW,gBAAgB,cACjC,EAEA5J,EAAMyJ,SAAW,WACbrL,KAAK6K,QAAQwB,UAAUE,OAAO,eAC9BvM,KAAK6K,QAAQG,aAAc,cAAe,OAC9C,EAKApJ,EAAM4K,UAAY,SAAUtB,GACxBlL,KAAKkL,MAAQA,EACblL,KAAK2L,eAAgB3L,KAAKiL,EAAIjL,KAAK4K,OAAO6B,eAAiBvB,EAC/D,EAEAtJ,EAAM2K,OAAS,WACXvM,KAAK6K,QAAQ/C,WAAWtD,YAAaxE,KAAK6K,QAC9C,EAEOF,CAEX,IAGE,SAAUlM,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,oBAAoBD,GACH,iBAAVI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,KAGjBD,EAAOiM,SAAWjM,EAAOiM,UAAY,CAAC,EACtCjM,EAAOiM,SAASgC,MAAQhO,IAGhC,CAdA,CAcGD,QAAQ,WACP,aAEA,SAASiO,EAAO9B,GACZ5K,KAAK4K,OAASA,EACd5K,KAAK2M,aAAoC,QAArB/B,EAAOO,WAC3BnL,KAAK4M,MAAQ,GACb5M,KAAKiF,WAAa,EAClBjF,KAAK8E,OAAS,CAClB,CAEA,IAAIlD,EAAQ8K,EAAMtN,UA4ClB,OA1CAwC,EAAMiL,QAAU,SAAUC,GAKtB,GAJA9M,KAAK4M,MAAMxK,KAAM0K,GACjB9M,KAAKiF,YAAc6H,EAAKjI,KAAKI,WAC7BjF,KAAK8E,OAASR,KAAKyI,IAAKD,EAAKjI,KAAKK,YAAalF,KAAK8E,QAAW,IAErC,GAArB9E,KAAK4M,MAAMnK,OAAc,CAC1BzC,KAAKiL,EAAI6B,EAAK7B,EACd,IAAI+B,EAAchN,KAAK2M,aAAe,aAAe,cACrD3M,KAAKiN,YAAcH,EAAKjI,KAAMmI,EAClC,CACJ,EAEApL,EAAM8J,aAAe,WACjB,IAAIwB,EAAYlN,KAAK2M,aAAe,cAAgB,aAChDQ,EAAWnN,KAAKoN,cAChBC,EAAaF,EAAWA,EAAStI,KAAMqI,GAAc,EACrDI,EAAatN,KAAKiF,YAAejF,KAAKiN,YAAcI,GACxDrN,KAAK8L,OAAS9L,KAAKiL,EAAIjL,KAAKiN,YAAcK,EAAatN,KAAK4K,OAAOmB,SACvE,EAEAnK,EAAMwL,YAAc,WAChB,OAAOpN,KAAK4M,MAAO5M,KAAK4M,MAAMnK,OAAS,EAC3C,EAEAb,EAAMwK,OAAS,WACXpM,KAAK4M,MAAMtE,SAAS,SAAUwE,GAC1BA,EAAKV,QACT,GACJ,EAEAxK,EAAMyJ,SAAW,WACbrL,KAAK4M,MAAMtE,SAAS,SAAUwE,GAC1BA,EAAKzB,UACT,GACJ,EAEAzJ,EAAM2L,gBAAkB,WACpB,OAAOvN,KAAK4M,MAAMY,KAAK,SAAUV,GAC7B,OAAOA,EAAKjC,OAChB,GACJ,EAEO6B,CAEX,IAGE,SAAUjO,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,sBAAsB,CAC1B,yBACD,SAAUyI,GACT,OAAO1I,EAASD,EAAQ2I,EAC5B,IACyB,iBAAVtI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,oBAIZP,EAAOiM,SAAWjM,EAAOiM,UAAY,CAAC,EACtCjM,EAAOiM,SAAS+C,iBAAmB/O,EAC/BD,EACAA,EAAO0I,cAInB,CAxBA,CAwBG1I,QAAQ,SAAkBA,EAAQ2I,GAMjC,IAAIxF,EAAQ,CAEZA,eAAuB,WACd5B,KAAK0N,cAIV1N,KAAK0N,aAAc,EACnB1N,KAAK2N,cAAgB,EACrB3N,KAAK4N,UACT,EAEAhM,QAAgB,WACZ5B,KAAK6N,iBACL7N,KAAK8N,0BAEL,IAAIC,EAAY/N,KAAKiL,EAMrB,GAJAjL,KAAKgO,mBACLhO,KAAKiO,iBACLjO,KAAKkO,OAAQH,GAER/N,KAAK0N,YAAc,CACpB,IAAI1E,EAAQhJ,KACZmO,uBAAuB,WACnBnF,EAAM4E,SACV,GACJ,CACJ,EAEAhM,eAAuB,WACnB,IAAIqJ,EAAIjL,KAAKiL,EAERjL,KAAKC,QAAQmO,YAAcpO,KAAK4M,MAAMnK,OAAS,IAChDwI,EAAI7D,EAAMiH,OAAQpD,EAAGjL,KAAKyM,gBAC1BxB,GAAKjL,KAAKyM,eACVzM,KAAKsO,eAAgBrD,IAGzBjL,KAAKuO,cAAetD,EAAGjL,KAAK0N,aAC5B1N,KAAKwO,qBACT,EAEA5M,cAAsB,SAAUqJ,EAAGwD,GAC/BxD,GAAKjL,KAAK0O,eAEVzD,EAAIjL,KAAKC,QAAQ0O,aAAe1D,EAAIA,EACpC,IAAI2D,EAAa5O,KAAKmM,iBAAkBlB,GAGxCjL,KAAK6O,OAAOtL,MAAMgI,UAAYkD,EAC1B,eAAiBG,EAAa,QAAU,cAAgBA,EAAa,GAC7E,EAEAhN,oBAA4B,WACxB,IAAIkN,EAAa9O,KAAK+O,OAAO,GAC7B,GAAMD,EAAN,CAGA,IAAIE,GAAahP,KAAKiL,EAAI6D,EAAWhD,OACjCmD,EAAWD,EAAYhP,KAAKkP,YAChClP,KAAKmP,cAAe,SAAU,KAAM,CAACF,EAAUD,GAH/C,CAIJ,EAEApN,yBAAiC,WACvB5B,KAAK4M,MAAMnK,SAGjBzC,KAAKiL,GAAKjL,KAAKoP,cAActD,OAC7B9L,KAAKqP,SAAW,EAChBrP,KAAKiO,iBACT,EAEArM,iBAAyB,SAAUmJ,GAC/B,OAAK/K,KAAKC,QAAQiM,gBAEuD,IAA5D5H,KAAKC,MAASwG,EAAW/K,KAAK6E,KAAKE,WAAe,KAAmB,IAGvET,KAAKC,MAAOwG,GAAa,IAExC,EAEAnJ,OAAe,SAAUmM,IAEJ/N,KAAKsP,eACtBhL,KAAKC,MAAgB,IAATvE,KAAKiL,IAAa3G,KAAKC,MAAmB,IAAZwJ,IAEtC/N,KAAK2N,gBAGJ3N,KAAK2N,cAAgB,IACtB3N,KAAK0N,aAAc,SACZ1N,KAAKuP,gBAEZvP,KAAKiO,iBACLjO,KAAKmP,cAAe,SAAU,KAAM,CAACnP,KAAKwP,gBAElD,EAEA5N,eAAuB,SAAUqJ,GAE7B,IAAIwE,EAAYzP,KAAK0O,eAAiBzD,EACtCjL,KAAK0P,YAAa1P,KAAK2P,iBAAkBF,GAAY,GAErD,IAAIG,EAAW5P,KAAK6E,KAAKE,YAAekG,EAAIjL,KAAKyM,eAAiBzM,KAAK0O,gBACvE1O,KAAK0P,YAAa1P,KAAK6P,gBAAiBD,EAAU,EACtD,EAEAhO,YAAoB,SAAUgL,EAAOkD,EAAK5E,GACtC,IAAM,IAAIvK,EAAI,EAAGA,EAAIiM,EAAMnK,OAAQ9B,IAAM,CACrC,IAAImM,EAAOF,EAAMjM,GACboP,EAAYD,EAAM,EAAI5E,EAAQ,EAClC4B,EAAKN,UAAWuD,GAChBD,GAAOhD,EAAKjI,KAAKI,UACrB,CACJ,EAEArD,cAAsB,SAAUgL,GAC5B,GAAMA,GAAUA,EAAMnK,OAGtB,IAAM,IAAI9B,EAAI,EAAGA,EAAIiM,EAAMnK,OAAQ9B,IAC/BiM,EAAMjM,GAAG6L,UAAW,EAE5B,EAIA5K,iBAAyB,WACrB5B,KAAKiL,GAAKjL,KAAKqP,SACfrP,KAAKqP,UAAYrP,KAAKgQ,mBAC1B,EAEApO,WAAmB,SAAUqO,GACzBjQ,KAAKqP,UAAYY,CACrB,EAEArO,kBAA0B,WACtB,OAAO,EAAI5B,KAAKC,QAASD,KAAKuP,gBAAkB,qBAAuB,WAC3E,EAEA3N,mBAA2B,WAEvB,OAAO5B,KAAKiL,EAAIjL,KAAKqP,UAAa,EAAIrP,KAAKgQ,oBAC/C,EAEApO,eAAuB,WACnB,GAAM5B,KAAKkQ,aAAgBlQ,KAAKsP,cAAhC,CAIA,IACIa,EADenQ,KAAKoQ,MAAQpQ,KAAKiL,EACNjL,KAAKqP,SACpCrP,KAAKqQ,WAAYF,EAJjB,CAKJ,EAEAvO,wBAAgC,WAG5B,KADe5B,KAAKkQ,aAAelQ,KAAKsP,iBACvBtP,KAAKuP,iBAAoBvP,KAAK+O,OAAOtM,OAAtD,CAGA,IACIwN,IADwC,EAA7BjQ,KAAKoP,cAActD,OAAc9L,KAAKiL,GAC9BjL,KAAKC,QAAQqQ,mBACpCtQ,KAAKqQ,WAAYJ,EAHjB,CAIJ,GAEA,OAAOrO,CAEX,IAIE,SAAUnD,EAAQC,GAEhB,GAAsB,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,uBAAuB,CAC3B,wBACA,oBACA,uBACA,SACA,UACA,cACD,SAAUgD,EAAWoB,EAASqE,EAAOuD,EAAM+B,EAAOe,GACjD,OAAO/O,EAASD,EAAQkD,EAAWoB,EAASqE,EAAOuD,EAAM+B,EAAOe,EACpE,SACG,GAAsB,iBAAV3O,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,cACRA,QAAQ,YACRA,QAAQ,kBACRA,QAAQ,UACRA,QAAQ,WACRA,QAAQ,kBAET,CAEH,IAAIuR,EAAY9R,EAAOiM,SAEvBjM,EAAOiM,SAAWhM,EACdD,EACAA,EAAOkD,UACPlD,EAAOsE,QACPtE,EAAO0I,aACPoJ,EAAU5F,KACV4F,EAAU7D,MACV6D,EAAU9C,iBAElB,CAEJ,CAxCA,CAwCGhP,QAAQ,SAAkBA,EAAQkD,EAAWoB,EAC5CqE,EAAOuD,EAAM+B,EAAOe,GAMpB,IAAI5O,EAASJ,EAAOI,OAChB2E,EAAmB/E,EAAO+E,iBAC1BlE,EAAUb,EAAOa,QAErB,SAASkR,EAAcpI,EAAOqI,GAE1B,IADArI,EAAQhB,EAAMI,UAAWY,GACjBA,EAAM3F,QACVgO,EAAOpM,YAAa+D,EAAM8C,QAElC,CAKA,IAAIwF,EAAO,EAEPC,EAAY,CAAC,EAEjB,SAASjG,EAAUG,EAAS5K,GACxB,IAAI2Q,EAAexJ,EAAMW,gBAAiB8C,GAC1C,GAAM+F,EAAN,CAQA,GAFA5Q,KAAK6K,QAAU+F,EAEV5Q,KAAK6K,QAAQgG,aAAe,CAC7B,IAAIhQ,EAAW8P,EAAW3Q,KAAK6K,QAAQgG,cAEvC,OADKhQ,GAAWA,EAAShB,OAAQI,GAC1BY,CACX,CAGKhC,IACDmB,KAAK8Q,SAAWjS,EAAQmB,KAAK6K,UAGjC7K,KAAKC,QAAUmH,EAAMlH,OAAQ,CAAC,EAAGF,KAAK+Q,YAAYC,UAClDhR,KAAKH,OAAQI,GAGbD,KAAKiR,SAlBL,MAJS3R,GACDA,EAAQG,MAAO,8BAAiCmR,GAAgB/F,GAsB5E,CAEAH,EAASsG,SAAW,CAChBE,eAAuB,EAEvBnF,UAAuB,SAGvBoF,mBAAuB,KACvBC,SAAuB,IACvBC,uBAAuB,EAEvBnF,iBAAuB,EACvBoF,QAAuB,EACvBhB,mBAAuB,KACvBiB,gBAAuB,GAM3B7G,EAAS8G,cAAgB,GAEzB,IAAI5P,EAAQ8I,EAAStL,UAErBgI,EAAMlH,OAAQ0B,EAAOD,EAAUvC,WAE/BwC,EAAMqP,QAAU,WAEZ,IAAIQ,EAAKzR,KAAK0R,OAAShB,EAqBvB,IAAM,IAAI5O,KApBV9B,KAAK6K,QAAQgG,aAAeY,EAC5Bd,EAAWc,GAAOzR,KAElBA,KAAKwP,cAAgB,EAErBxP,KAAK2N,cAAgB,EAErB3N,KAAKiL,EAAI,EACTjL,KAAKqP,SAAW,EAChBrP,KAAKmL,WAAanL,KAAKC,QAAQ0O,YAAc,QAAU,OAEvD3O,KAAK2R,SAAW/N,SAASC,cAAc,OACvC7D,KAAK2R,SAASlH,UAAY,oBAC1BzK,KAAK4R,iBAEA5R,KAAKC,QAAQqR,QAAUtR,KAAKC,QAAQ4R,WACrCpT,EAAO4K,iBAAkB,SAAUrJ,MAIhBA,KAAKC,QAAQ4B,GAAK,CACrC,IAAIE,EAAW/B,KAAKC,QAAQ4B,GAAIC,GAChC9B,KAAK6B,GAAIC,EAAWC,EACxB,CAEA2I,EAAS8G,cAAclJ,SAAS,SAAUvH,GACtCf,KAAMe,IACV,GAAGf,MAEEA,KAAKC,QAAQ4R,SACd7R,KAAK6R,WAEL7R,KAAK8R,UAGb,EAMAlQ,EAAM/B,OAAS,SAAUC,GACrBsH,EAAMlH,OAAQF,KAAKC,QAASH,EAChC,EAEA8B,EAAMkQ,SAAW,WACR9R,KAAK+R,WAGV/R,KAAK+R,UAAW,EAChB/R,KAAK6K,QAAQwB,UAAUC,IAAI,oBACtBtM,KAAKC,QAAQ0O,aACd3O,KAAK6K,QAAQwB,UAAUC,IAAI,gBAG/BtM,KAAK+C,UAGLyN,EADgBxQ,KAAKgS,wBAAyBhS,KAAK6K,QAAQoH,UAClCjS,KAAK6O,QAC9B7O,KAAK2R,SAAStN,YAAarE,KAAK6O,QAChC7O,KAAK6K,QAAQxG,YAAarE,KAAK2R,UAE/B3R,KAAKkS,cAEAlS,KAAKC,QAAQiR,gBAEdlR,KAAK6K,QAAQsH,SAAW,EAExBnS,KAAK6K,QAAQxB,iBAAkB,UAAWrJ,OAG9CA,KAAK4C,UAAU,YACf5C,KAAKoS,qBAELpS,KAAKqS,iBAAkB,EAEvBrS,KAAKmP,cAAc,SACvB,EAGAvN,EAAMgQ,cAAgB,WAElB,IAAI/C,EAASjL,SAASC,cAAc,OACpCgL,EAAOpE,UAAY,kBACnBoE,EAAOtL,MAAOvD,KAAKmL,YAAe,EAClCnL,KAAK6O,OAASA,CAClB,EAEAjN,EAAMoQ,wBAA0B,SAAU5J,GACtC,OAAOhB,EAAMe,mBAAoBC,EAAOpI,KAAKC,QAAQqS,aACzD,EAGA1Q,EAAMsQ,YAAc,WAEhBlS,KAAK4M,MAAQ5M,KAAKuS,WAAYvS,KAAK6O,OAAOoD,UAC1CjS,KAAKwS,gBACLxS,KAAKyS,qBACLzS,KAAKuR,gBACT,EAOA3P,EAAM2Q,WAAa,SAAUnK,GAQzB,OAPgBpI,KAAKgS,wBAAyB5J,GAGxBoF,KAAK,SAAUkF,GACjC,OAAO,IAAI/H,EAAM+H,EAAU1S,KAC/B,GAAGA,KAGP,EAEA4B,EAAMwL,YAAc,WAChB,OAAOpN,KAAK4M,MAAO5M,KAAK4M,MAAMnK,OAAS,EAC3C,EAEAb,EAAM+Q,aAAe,WACjB,OAAO3S,KAAK+O,OAAQ/O,KAAK+O,OAAOtM,OAAS,EAC7C,EAGAb,EAAM4Q,cAAgB,WAElBxS,KAAK4S,WAAY5S,KAAK4M,OAEtB5M,KAAK6S,eAAgB,EACzB,EAMAjR,EAAMiR,eAAiB,SAAUnQ,GAC7BA,EAAQA,GAAS,EAGjB1C,KAAK8S,cAAgBpQ,GAAQ1C,KAAK8S,eAAqB,EACvD,IAAIC,EAAQ,EAEZ,GAAKrQ,EAAQ,EAAI,CACb,IAAIsQ,EAAYhT,KAAK4M,MAAOlK,EAAQ,GACpCqQ,EAAQC,EAAU/H,EAAI+H,EAAUnO,KAAKI,UACzC,CAEA,IADA,IAAIgO,EAAMjT,KAAK4M,MAAMnK,OACX9B,EAAI+B,EAAO/B,EAAIsS,EAAKtS,IAAM,CAChC,IAAImM,EAAO9M,KAAK4M,MAAMjM,GACtBmM,EAAKrB,YAAasH,GAClBA,GAASjG,EAAKjI,KAAKI,WACnBjF,KAAK8S,cAAgBxO,KAAKyI,IAAKD,EAAKjI,KAAKK,YAAalF,KAAK8S,cAC/D,CAEA9S,KAAKyM,eAAiBsG,EAEtB/S,KAAKkT,eAELlT,KAAKmT,iBAELnT,KAAKkP,YAAc+D,EAAMjT,KAAK2S,eAAe7G,OAAS9L,KAAK+O,OAAO,GAAGjD,OAAS,CAClF,EAMAlK,EAAMgR,WAAa,SAAUhG,GACzBA,EAAMtE,SAAS,SAAUwE,GACrBA,EAAK/J,SACT,GACJ,EAIAnB,EAAMsR,aAAe,WAEjB,GADAlT,KAAK+O,OAAS,GACR/O,KAAK4M,MAAMnK,OAAjB,CAIA,IAAI2Q,EAAQ,IAAI1G,EAAO1M,MACvBA,KAAK+O,OAAO3M,KAAMgR,GAClB,IACIC,EADkC,QAAnBrT,KAAKmL,WACQ,cAAgB,aAE5CmI,EAAatT,KAAKuT,iBAEtBvT,KAAK4M,MAAMtE,SAAS,SAAUwE,EAAMnM,GAEhC,GAAMyS,EAAMxG,MAAMnK,OAAlB,CAKA,IAAI6K,EAAe8F,EAAMnO,WAAamO,EAAMnG,aAC9CH,EAAKjI,KAAKI,WAAa6H,EAAKjI,KAAMwO,IAE3BC,EAAWjS,KAAMrB,KAAMW,EAAG2M,KAI3B8F,EAAM1H,eAEN0H,EAAQ,IAAI1G,EAAO1M,MACnBA,KAAK+O,OAAO3M,KAAMgR,IANlBA,EAAMvG,QAASC,EANnB,MAFIsG,EAAMvG,QAASC,EAiBvB,GAAG9M,MAEHoT,EAAM1H,eAEN1L,KAAKwT,qBAjCL,CAkCJ,EAEA5R,EAAM2R,eAAiB,WACnB,IAAIE,EAAazT,KAAKC,QAAQwT,WAC9B,IAAMA,EACF,OAAO,WACH,OAAO,CACX,EACG,GAA0B,iBAAdA,EAAyB,CAExC,IAAIC,EAASC,SAAUF,EAAY,IACnC,OAAO,SAAU9S,GACb,OAASA,EAAI+S,GAAa,CAC9B,CACJ,CAGA,IAAIE,EAAoC,iBAAdH,GAC5BA,EAAWhK,MAAO,YACZoK,EAAUD,EAAeD,SAAUC,EAAa,GAAI,IAAO,IAAM,EACrE,OAAO,SAAUjT,EAAG2M,GAEhB,OAAOA,IAAgBtN,KAAK6E,KAAKE,WAAa,GAAM8O,CACxD,CACJ,EAGAjS,EAAML,MACRK,EAAMkS,WAAa,WACf9T,KAAKwS,gBACLxS,KAAK+T,0BACT,EAEEnS,EAAMmB,QAAU,WACZ/C,KAAK6E,KAAO9B,EAAS/C,KAAK6K,SAC1B7K,KAAKgU,eACLhU,KAAK0O,eAAiB1O,KAAK6E,KAAKE,WAAa/E,KAAK+L,SACtD,EAEA,IAAIkI,EAAsB,CAEtBC,OAAQ,CACJC,KAAO,GACPC,MAAO,IAEXD,KAAM,CACFA,KAAO,EACPC,MAAO,GAEXA,MAAO,CACHA,MAAO,EACPD,KAAO,IAgiBf,OA5hBAvS,EAAMoS,aAAe,WACjB,IAAIK,EAAYJ,EAAqBjU,KAAKC,QAAQ8L,WAClD/L,KAAK+L,UAAYsI,EAAYA,EAAWrU,KAAKmL,YAAenL,KAAKC,QAAQ8L,SAC7E,EAEAnK,EAAM2P,eAAiB,WACnB,GAAKvR,KAAKC,QAAQsR,eAAiB,CAC/B,IAAIzM,EAAS9E,KAAKC,QAAQqU,gBAAkBtU,KAAKoP,cAC7CpP,KAAKoP,cAActK,OAAS9E,KAAK8S,cACrC9S,KAAK2R,SAASpO,MAAMuB,OAASA,EAAS,IAC1C,CACJ,EAEAlD,EAAM6Q,mBAAqB,WAEvB,GAAMzS,KAAKC,QAAQmO,WAAnB,CAIApO,KAAKuU,cAAevU,KAAK2P,kBACzB3P,KAAKuU,cAAevU,KAAK6P,iBAGzB,IAAI2E,EAAOxU,KAAK0O,eACZ+F,EAAYzU,KAAK4M,MAAMnK,OAAS,EACpCzC,KAAK2P,iBAAmB3P,KAAK0U,aAAcF,EAAMC,GAAY,GAG7DD,EAAOxU,KAAK6E,KAAKE,WAAa/E,KAAK0O,eAEnC1O,KAAK6P,gBAAkB7P,KAAK0U,aAAcF,EAAM,EAAG,EAbnD,CAcJ,EAEA5S,EAAM8S,aAAe,SAAUF,EAAMC,EAAWE,GAG5C,IADA,IAAI/H,EAAQ,GACJ4H,EAAO,GAAI,CACf,IAAI1H,EAAO9M,KAAK4M,MAAO6H,GACvB,IAAM3H,EACF,MAEJF,EAAMxK,KAAM0K,GACZ2H,GAAaE,EACbH,GAAQ1H,EAAKjI,KAAKI,UACtB,CACA,OAAO2H,CACX,EAKAhL,EAAMuR,eAAiB,WACnB,GAAMnT,KAAKC,QAAQ2U,UAAW5U,KAAKC,QAAQmO,YAAepO,KAAK4M,MAAMnK,OAArE,CAGA,IAAIoS,EAAgB7U,KAAKC,QAAQ0O,YAC7B3B,EAAc6H,EAAgB,cAAgB,aAC9C3H,EAAY2H,EAAgB,aAAe,cAC3CC,EAAe9U,KAAKyM,eAAiBzM,KAAKoN,cAAcvI,KAAMqI,GAE9D6H,EAAmBD,EAAe9U,KAAK6E,KAAKE,WAE5CiQ,EAAahV,KAAK0O,eAAiB1O,KAAK4M,MAAM,GAAG/H,KAAMmI,GACvDiI,EAAWH,EAAe9U,KAAK6E,KAAKE,YAAe,EAAI/E,KAAK+L,WAEhE/L,KAAK+O,OAAOzG,SAAS,SAAU8K,GACtB2B,EAED3B,EAAMtH,OAASgJ,EAAe9U,KAAK+L,WAGnCqH,EAAMtH,OAASxH,KAAKyI,IAAKqG,EAAMtH,OAAQkJ,GACvC5B,EAAMtH,OAASxH,KAAK4Q,IAAK9B,EAAMtH,OAAQmJ,GAE/C,GAAGjV,KApBH,CAqBJ,EAUA4B,EAAMuN,cAAgB,SAAUjH,EAAMD,EAAO1H,GACzC,IAAI4U,EAAWlN,EAAQ,CAACA,GAAOkC,OAAQ5J,GAASA,EAGhD,GAFAP,KAAK4C,UAAWsF,EAAMiN,GAEjBtW,GAAUmB,KAAK8Q,SAAW,CAG3B,IAAIsE,EADJlN,GAAQlI,KAAKC,QAAQoR,sBAAwB,YAAc,GAE3D,GAAKpJ,EAAQ,CAET,IAAIoN,EAAU,IAAIxW,EAAOyW,MAAOrN,GAChCoN,EAAQnN,KAAOA,EACfkN,EAASC,CACb,CACArV,KAAK8Q,SAASyE,QAASH,EAAQ7U,EACnC,CACJ,EASAqB,EAAMwK,OAAS,SAAU1J,EAAO8S,EAAQC,GACpC,GAAMzV,KAAK+R,WAGXrP,EAAQiR,SAAUjR,EAAO,IACzB1C,KAAK0V,YAAahT,IAEb1C,KAAKC,QAAQmO,YAAcoH,KAC5B9S,EAAQ0E,EAAMiH,OAAQ3L,EAAO1C,KAAK+O,OAAOtM,SAGvCzC,KAAK+O,OAAQrM,IAAnB,CAGA,IAAIiT,EAAY3V,KAAKwP,cACrBxP,KAAKwP,cAAgB9M,EACrB1C,KAAKwT,sBACAiC,EACDzV,KAAK+T,2BAEL/T,KAAK4V,iBAEJ5V,KAAKC,QAAQqU,gBACdtU,KAAKuR,iBAGTvR,KAAKmP,cAAe,SAAU,KAAM,CAACzM,IAEhCA,GAASiT,GACV3V,KAAKmP,cAAe,SAAU,KAAM,CAACzM,IAGzC1C,KAAKmP,cAAc,aAnBnB,CAoBJ,EAGAvN,EAAM8T,YAAc,SAAUhT,GAC1B,IAAIuQ,EAAMjT,KAAK+O,OAAOtM,OAEtB,KADiBzC,KAAKC,QAAQmO,YAAc6E,EAAM,GAE9C,OAAOvQ,EAEX,IAAImT,EAAYzO,EAAMiH,OAAQ3L,EAAOuQ,GAEjC6C,EAAQxR,KAAKyR,IAAKF,EAAY7V,KAAKwP,eACnCwG,EAAgB1R,KAAKyR,IAAOF,EAAY5C,EAAQjT,KAAKwP,eACrDyG,EAAoB3R,KAAKyR,IAAOF,EAAY5C,EAAQjT,KAAKwP,gBACvDxP,KAAKkW,cAAgBF,EAAgBF,EACvCpT,GAASuQ,GACAjT,KAAKkW,cAAgBD,EAAoBH,IAClDpT,GAASuQ,GAGRvQ,EAAQ,EACT1C,KAAKiL,GAAKjL,KAAKyM,eACP/J,GAASuQ,IACjBjT,KAAKiL,GAAKjL,KAAKyM,eAEvB,EAEA7K,EAAMuU,SAAW,SAAUX,EAAQC,GAC/BzV,KAAKoM,OAAQpM,KAAKwP,cAAgB,EAAGgG,EAAQC,EACjD,EAEA7T,EAAMwU,KAAO,SAAUZ,EAAQC,GAC3BzV,KAAKoM,OAAQpM,KAAKwP,cAAgB,EAAGgG,EAAQC,EACjD,EAEA7T,EAAM4R,oBAAsB,WACxB,IAAIJ,EAAQpT,KAAK+O,OAAQ/O,KAAKwP,eAExB4D,IAINpT,KAAKqW,wBAELrW,KAAKoP,cAAgBgE,EACrBA,EAAMhH,SACNpM,KAAKsW,cAAgBlD,EAAMxG,MAC3B5M,KAAKuW,iBAAmBnD,EAAM7F,kBAG9BvN,KAAKwW,aAAepD,EAAMxG,MAAM,GAChC5M,KAAKyW,gBAAkBzW,KAAKuW,iBAAiB,GACjD,EAEA3U,EAAMyU,sBAAwB,WACrBrW,KAAKoP,eACNpP,KAAKoP,cAAc/D,UAE3B,EAEAzJ,EAAMwQ,mBAAqB,WACvB,IAAIsE,EAAe1W,KAAKC,QAAQyW,aAEhC,GAAK1W,KAAKqS,gBACNrS,KAAKoM,OAAQpM,KAAKwP,eAAe,GAAO,OAD5C,CAKA,GAAKkH,GAAuC,iBAAhBA,EAExB,GADW1W,KAAK2W,UAAWD,GAGvB,YADA1W,KAAK4W,WAAYF,GAAc,GAAO,GAK9C,IAAIhU,EAAQ,EAEPgU,GAAgB1W,KAAK+O,OAAQ2H,KAC9BhU,EAAQgU,GAGZ1W,KAAKoM,OAAQ1J,GAAO,GAAO,EAhB3B,CAiBJ,EAQAd,EAAMgV,WAAa,SAAU3V,EAAOuU,EAAQC,GAExC,IAAI3I,EAAO9M,KAAK2W,UAAW1V,GAC3B,GAAM6L,EAAN,CAIA,IAAIpK,EAAQ1C,KAAK6W,kBAAmB/J,GACpC9M,KAAKoM,OAAQ1J,EAAO8S,EAAQC,EAH5B,CAIJ,EAEA7T,EAAMiV,kBAAoB,SAAU/J,GAEhC,IAAM,IAAInM,EAAI,EAAGA,EAAIX,KAAK+O,OAAOtM,OAAQ9B,IAAM,CAG3C,IAAe,GAFHX,KAAK+O,OAAOpO,GACNiM,MAAMzK,QAAS2K,GAE7B,OAAOnM,CAEf,CACJ,EASAiB,EAAMkV,QAAU,SAAUlW,GAEtB,IAAM,IAAID,EAAI,EAAGA,EAAIX,KAAK4M,MAAMnK,OAAQ9B,IAAM,CAC1C,IAAImM,EAAO9M,KAAK4M,MAAMjM,GACtB,GAAKmM,EAAKjC,SAAWjK,EACjB,OAAOkM,CAEf,CACJ,EAOAlL,EAAMmV,SAAW,SAAU3O,GACvBA,EAAQhB,EAAMI,UAAWY,GACzB,IAAIwE,EAAQ,GAOZ,OANAxE,EAAME,SAAS,SAAU1H,GACrB,IAAIkM,EAAO9M,KAAK8W,QAASlW,GACpBkM,GACDF,EAAMxK,KAAM0K,EAEpB,GAAG9M,MACI4M,CACX,EAMAhL,EAAM2L,gBAAkB,WACpB,OAAOvN,KAAK4M,MAAMY,KAAK,SAAUV,GAC7B,OAAOA,EAAKjC,OAChB,GACJ,EAOAjJ,EAAMoV,cAAgB,SAAUpW,GAE5B,IAAIkM,EAAO9M,KAAK8W,QAASlW,GACzB,OAAKkM,IAILlM,EAAOwG,EAAMS,UAAWjH,EAAM,wBACvBZ,KAAK8W,QAASlW,GACzB,EAQAgB,EAAMqV,wBAA0B,SAAUC,EAAUxU,GAChD,IAAMwU,EACF,OAAOlX,KAAKoP,cAAc7B,kBAE9B7K,OAAkBvB,IAAVuB,EAAsB1C,KAAKwP,cAAgB9M,EAEnD,IAAIuQ,EAAMjT,KAAK+O,OAAOtM,OACtB,GAAK,EAAiB,EAAXyU,GAAkBjE,EACzB,OAAOjT,KAAKuN,kBAIhB,IADA,IAAI4J,EAAY,GACNxW,EAAI+B,EAAQwU,EAAUvW,GAAK+B,EAAQwU,EAAUvW,IAAM,CACzD,IAAIyW,EAAapX,KAAKC,QAAQmO,WAAahH,EAAMiH,OAAQ1N,EAAGsS,GAAQtS,EAChEyS,EAAQpT,KAAK+O,OAAQqI,GACpBhE,IACD+D,EAAYA,EAAUhN,OAAQiJ,EAAM7F,mBAE5C,CACA,OAAO4J,CACX,EAOAvV,EAAM+U,UAAY,SAAUzP,GACxB,GAAwB,iBAAZA,EAER,OAAOlH,KAAK4M,MAAO1F,GAEvB,GAAwB,iBAAZA,EAAuB,CAE/B,GAAKA,EAASuC,MAAO,eACjB,OAGJvC,EAAWlH,KAAK6K,QAAQnG,cAAewC,EAC3C,CAEA,OAAOlH,KAAK8W,QAAS5P,EACzB,EAIAtF,EAAMyV,SAAW,WACbrX,KAAK4C,UAAU,WACnB,EAGAhB,EAAM0V,mBAAqB,SAAUrP,GAEd,cAAdA,EAAMC,MACPD,EAAMsP,iBAEVvX,KAAKwX,OACT,EAIA5V,EAAM6V,SAAW,WACbzX,KAAK6R,WACL7R,KAAKsR,QACT,EAEAlK,EAAMsB,eAAgBgC,EAAU,WAAY,KAE5C9I,EAAM0P,OAAS,WAEX,GAAMtR,KAAK+R,WAAY/R,KAAK0N,cAAe1N,KAAK0X,WAAhD,CAGA1X,KAAK+C,UAEA/C,KAAKC,QAAQmO,aACdpO,KAAKiL,EAAI7D,EAAMiH,OAAQrO,KAAKiL,EAAGjL,KAAKyM,iBAExCzM,KAAKwS,gBACLxS,KAAKyS,qBACLzS,KAAKuR,iBACLvR,KAAK4C,UAAU,UAGf,IAAI6T,EAAkBzW,KAAKuW,kBAAoBvW,KAAKuW,iBAAiB,GACrEvW,KAAK4W,WAAYH,GAAiB,GAAO,EAbzC,CAcJ,EAGA7U,EAAMiQ,SAAW,WACK7R,KAAKC,QAAQ4R,YAOW,GAFvBrO,EAAkBxD,KAAK6K,QAAS,UAAW8M,QAE5CxV,QAAQ,YACtBnC,KAAK8R,WAEL9R,KAAK4X,aAEb,EAKAhW,EAAMiW,UAAY,SAAU5P,GAExB,IAAI6P,EAAelU,SAASmU,eAAiBnU,SAASmU,eAAiB/X,KAAK6K,QAC5E,GAAM7K,KAAKC,QAAQiR,gBAAiB4G,EAApC,CAIA,IAAIE,EAAUtN,EAASuN,iBAAkBhQ,EAAMiQ,SAC1CF,GACDA,EAAQ3W,KAAMrB,KAJlB,CAMJ,EAEA0K,EAASuN,iBAAmB,CAExB,GAAI,WACA,IAAIE,EAAanY,KAAKC,QAAQ0O,YAAc,OAAS,WACrD3O,KAAKqX,WACLrX,KAAMmY,IACV,EAEA,GAAI,WACA,IAAIC,EAAcpY,KAAKC,QAAQ0O,YAAc,WAAa,OAC1D3O,KAAKqX,WACLrX,KAAMoY,IACV,GAKJxW,EAAM4V,MAAQ,WAIV,IAAIa,EAAc5Z,EAAO6Z,YACzBtY,KAAK6K,QAAQ2M,MAAM,CAAEe,eAAe,IAE/B9Z,EAAO6Z,aAAeD,GACvB5Z,EAAO+Z,SAAU/Z,EAAOga,YAAaJ,EAE7C,EAKAzW,EAAMgW,WAAa,WACT5X,KAAK+R,WAGX/R,KAAK6K,QAAQwB,UAAUE,OAAO,oBAC9BvM,KAAK6K,QAAQwB,UAAUE,OAAO,gBAC9BvM,KAAKqW,wBAELrW,KAAK4M,MAAMtE,SAAS,SAAUwE,GAC1BA,EAAK1B,SACT,IACApL,KAAK6K,QAAQrG,YAAaxE,KAAK2R,UAE/BnB,EAAcxQ,KAAK6O,OAAOoD,SAAUjS,KAAK6K,SACpC7K,KAAKC,QAAQiR,gBACdlR,KAAK6K,QAAQW,gBAAgB,YAC7BxL,KAAK6K,QAAQ6N,oBAAqB,UAAW1Y,OAGjDA,KAAK+R,UAAW,EAChB/R,KAAK4C,UAAU,cACnB,EAEAhB,EAAMwJ,QAAU,WACZpL,KAAK4X,aACLnZ,EAAOia,oBAAqB,SAAU1Y,MACtCA,KAAK8C,SACL9C,KAAK4C,UAAU,WACV/D,GAAUmB,KAAK8Q,UAChBjS,EAAO8Z,WAAY3Y,KAAK6K,QAAS,mBAE9B7K,KAAK6K,QAAQgG,oBACbF,EAAW3Q,KAAK0R,KAC3B,EAIAtK,EAAMlH,OAAQ0B,EAAO6L,GASrB/C,EAAS5J,KAAO,SAAUF,GAEtB,IAAI6Q,GADJ7Q,EAAOwG,EAAMW,gBAAiBnH,KACbA,EAAKiQ,aACtB,OAAOY,GAAMd,EAAWc,EAC5B,EAEArK,EAAMyC,SAAUa,EAAU,YAErB7L,GAAUA,EAAO4C,SAClB5C,EAAO4C,QAAS,WAAYiJ,GAIhCA,EAASkO,UAAY,SAAUC,GAC3Bha,EAASga,CACb,EAEAnO,EAASC,KAAOA,EAChBD,EAASgC,MAAQA,EAEVhC,CAEX;;;;;;AAUE,SAAUjM,EAAQC,GAGM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,wBAAwB,CAC5B,0BACD,SAAUgD,GACT,OAAOjD,EAASD,EAAQkD,EAC5B,IACyB,iBAAV7C,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,eAIZP,EAAOqa,WAAapa,EAChBD,EACAA,EAAOkD,UAInB,CAxBA,CAwBGlD,QAAQ,SAAkBA,EAAQkD,GAMjC,SAASmX,IAAc,CAGvB,IAAIlX,EAAQkX,EAAW1Z,UAAY2Z,OAAOjO,OAAQnJ,EAAUvC,WAE5DwC,EAAMoX,eAAiB,SAAUpY,GAC7BZ,KAAKiZ,gBAAiBrY,GAAM,EAChC,EAEAgB,EAAMsX,iBAAmB,SAAUtY,GAC/BZ,KAAKiZ,gBAAiBrY,GAAM,EAChC,EAMAgB,EAAMqX,gBAAkB,SAAUrY,EAAMuY,GAGpC,IAAIC,GADJD,OAAkBhY,IAAVgY,GAA6BA,GACZ,mBAAqB,sBAG1CE,EAAa,YACZ,iBAAkB5a,EAGnB4a,EAAa,aACL5a,EAAO6a,eAEfD,EAAa,eAEjBzY,EAAMwY,GAAcC,EAAYrZ,KACpC,EAGA4B,EAAMoG,YAAc,SAAUC,GAC1B,IAAIlH,EAAS,KAAOkH,EAAMC,KACrBlI,KAAMe,IACPf,KAAMe,GAAUkH,EAExB,EAGArG,EAAM2X,SAAW,SAAUC,GACvB,IAAM,IAAI7Y,EAAE,EAAGA,EAAI6Y,EAAQ/W,OAAQ9B,IAAM,CACrC,IAAI8Y,EAAQD,EAAQ7Y,GACpB,GAAK8Y,EAAMC,YAAc1Z,KAAK2Z,kBAC1B,OAAOF,CAEf,CACJ,EAIA7X,EAAMgY,YAAc,SAAU3R,GAE1B,IAAI4R,EAAS5R,EAAM4R,OACdA,GAAuB,IAAXA,GAA2B,IAAXA,GAGjC7Z,KAAK8Z,aAAc7R,EAAOA,EAC9B,EAEArG,EAAMmY,aAAe,SAAU9R,GAC3BjI,KAAK8Z,aAAc7R,EAAOA,EAAM+R,eAAe,GACnD,EAEApY,EAAMqY,cAAgB,SAAUhS,GAC5BjI,KAAK8Z,aAAc7R,EAAOA,EAC9B,EAOArG,EAAMkY,aAAe,SAAU7R,EAAOiS,GAG7BjS,EAAM4R,QAAU7Z,KAAKsP,gBAI1BtP,KAAKsP,eAAgB,EAErBtP,KAAK2Z,uBAA0CxY,IAAtB+Y,EAAQC,UAE7BD,EAAQC,UAAYD,EAAQR,WAEhC1Z,KAAKoa,YAAanS,EAAOiS,GAC7B,EAEAtY,EAAMwY,YAAc,SAAUnS,EAAOiS,GACjCla,KAAKqa,qBAAsBpS,GAC3BjI,KAAK4C,UAAW,cAAe,CAACqF,EAAOiS,GAC3C,EAGA,IAAII,EAAkB,CAClBC,UAAa,CAAC,YAAa,WAC3BC,WAAa,CAAC,YAAa,WAAY,eACvCC,YAAa,CAAC,cAAe,YAAa,kBA+J9C,OA5JA7Y,EAAMyY,qBAAuB,SAAUpS,GACnC,GAAMA,EAAN,CAIA,IAAIjG,EAASsY,EAAiBrS,EAAMC,MAEpClG,EAAOsG,SAAS,SAAUxG,GACtBrD,EAAO4K,iBAAkBvH,EAAW9B,KACxC,GAAGA,MAEHA,KAAK0a,oBAAsB1Y,CAR3B,CASJ,EAEAJ,EAAM+Y,uBAAyB,WAErB3a,KAAK0a,sBAGX1a,KAAK0a,oBAAoBpS,SAAS,SAAUxG,GACxCrD,EAAOia,oBAAqB5W,EAAW9B,KAC3C,GAAGA,aAEIA,KAAK0a,oBAChB,EAIA9Y,EAAMgZ,YAAc,SAAU3S,GAC1BjI,KAAK6a,aAAc5S,EAAOA,EAC9B,EAEArG,EAAMkZ,cAAgB,SAAU7S,GACvBA,EAAMkS,WAAana,KAAK2Z,mBACzB3Z,KAAK6a,aAAc5S,EAAOA,EAElC,EAEArG,EAAMmZ,YAAc,SAAU9S,GAC1B,IAAIwR,EAAQzZ,KAAKuZ,SAAUtR,EAAM+R,gBAC5BP,GACDzZ,KAAK6a,aAAc5S,EAAOwR,EAElC,EAQA7X,EAAMiZ,aAAe,SAAU5S,EAAOiS,GAClCla,KAAKgb,YAAa/S,EAAOiS,EAC7B,EAGAtY,EAAMoZ,YAAc,SAAU/S,EAAOiS,GACjCla,KAAK4C,UAAW,cAAe,CAACqF,EAAOiS,GAC3C,EAKAtY,EAAMqZ,UAAY,SAAUhT,GACxBjI,KAAKkb,WAAYjT,EAAOA,EAC5B,EAEArG,EAAMuZ,YAAc,SAAUlT,GACrBA,EAAMkS,WAAana,KAAK2Z,mBACzB3Z,KAAKkb,WAAYjT,EAAOA,EAEhC,EAEArG,EAAMwZ,WAAa,SAAUnT,GACzB,IAAIwR,EAAQzZ,KAAKuZ,SAAUtR,EAAM+R,gBAC5BP,GACDzZ,KAAKkb,WAAYjT,EAAOwR,EAEhC,EAQA7X,EAAMsZ,WAAa,SAAUjT,EAAOiS,GAChCla,KAAKqb,eACLrb,KAAKsb,UAAWrT,EAAOiS,EAC3B,EAGAtY,EAAM0Z,UAAY,SAAUrT,EAAOiS,GAC/Bla,KAAK4C,UAAW,YAAa,CAACqF,EAAOiS,GACzC,EAKAtY,EAAMyZ,aAAe,WACjBrb,KAAKub,gBACLvb,KAAK2a,yBACL3a,KAAKwb,aACT,EAEA5Z,EAAM2Z,cAAgB,WAElBvb,KAAKsP,eAAgB,SACdtP,KAAK2Z,iBAChB,EAEA/X,EAAM4Z,YA1NN,WAAiB,EA8NjB5Z,EAAM6Z,gBAAkB,SAAUxT,GACzBA,EAAMkS,WAAana,KAAK2Z,mBACzB3Z,KAAK0b,eAAgBzT,EAAOA,EAEpC,EAEArG,EAAM+Z,cAAgB,SAAU1T,GAC5B,IAAIwR,EAAQzZ,KAAKuZ,SAAUtR,EAAM+R,gBAC5BP,GACDzZ,KAAK0b,eAAgBzT,EAAOwR,EAEpC,EAQA7X,EAAM8Z,eAAiB,SAAUzT,EAAOiS,GACpCla,KAAKqb,eACLrb,KAAK4b,cAAe3T,EAAOiS,EAC/B,EAGAtY,EAAMga,cAAgB,SAAU3T,EAAOiS,GACnCla,KAAK4C,UAAW,gBAAiB,CAACqF,EAAOiS,GAC7C,EAKApB,EAAW+C,gBAAkB,SAAU3B,GACnC,MAAO,CACHjP,EAAGiP,EAAQ4B,MACXC,EAAG7B,EAAQ8B,MAEnB,EAIOlD,CAEX;;;;;;AAUE,SAAUra,EAAQC,GAIM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,wBAAwB,CAC5B,0BACD,SAAUma,GACT,OAAOpa,EAASD,EAAQqa,EAC5B,IACyB,iBAAVha,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,eAIZP,EAAOwd,WAAavd,EAChBD,EACAA,EAAOqa,WAInB,CAzBA,CAyBGra,QAAQ,SAAkBA,EAAQqa,GAMjC,SAASmD,IAAc,CAGvB,IAAIra,EAAQqa,EAAW7c,UAAY2Z,OAAOjO,OAAQgO,EAAW1Z,WAI7DwC,EAAMsa,YAAc,WAChBlc,KAAKmc,cAAc,EACvB,EAEAva,EAAMwa,cAAgB,WAClBpc,KAAKmc,cAAc,EACvB,EAMAva,EAAMua,aAAe,SAAUhD,GAM3B,IAFA,IAAIC,GAFJD,OAAkBhY,IAAVgY,GAA6BA,GAEZ,mBAAqB,sBAC1CkD,EAAclD,EAAQnZ,KAAKsc,kBAAoB,GACzC3b,EAAE,EAAGA,EAAIX,KAAKuc,QAAQ9Z,OAAQ9B,IAAM,CAC1C,IAAI6b,EAASxc,KAAKuc,QAAQ5b,GAC1BX,KAAKiZ,gBAAiBuD,EAAQrD,GAC9BqD,EAAQpD,GAAc,QAASpZ,MAE1BvB,EAAO6a,eACRkD,EAAOjZ,MAAM8Y,YAAcA,EAEnC,CACJ,EAGAza,EAAM0a,kBAAoB,OAS1B1a,EAAMwY,YAAc,SAAUnS,EAAOiS,GACpBla,KAAKyc,gBAAiBxU,KAMnCjI,KAAK0c,mBAAqB,CACtBZ,MAAO5B,EAAQ4B,MACfE,MAAO9B,EAAQ8B,OAGnB/T,EAAMsP,iBACNvX,KAAK2c,kBAEL3c,KAAKqa,qBAAsBpS,GAC3BjI,KAAK4C,UAAW,cAAe,CAACqF,EAAOiS,IAC3C,EAGA,IAAI0C,EAAc,CACdC,UAAU,EACVC,OAAU,EACVC,QAAU,EACVC,QAAU,GAIVC,EAAa,CACbC,OAAU,EACVC,UAAU,EACVtD,QAAU,EACVuD,QAAU,EACVC,OAAU,EACVC,MAAU,GAiKd,OA7JA1b,EAAM6a,gBAAkB,SAAUxU,GAC9B,IAAIsV,EAAeX,EAAa3U,EAAM6D,OAAO0R,UACzCC,EAAcR,EAAYhV,EAAM6D,OAAO5D,MACvCwV,GAAUH,GAAgBE,EAI9B,OAHMC,GACF1d,KAAKub,gBAEFmC,CACX,EAGA9b,EAAM+a,gBAAkB,WACpB,IAAIgB,EAAU/Z,SAASmU,cAET4F,GAAWA,EAAQC,MAAQD,GAAW/Z,SAASO,MAEzDwZ,EAAQC,MAEhB,EASAhc,EAAMoZ,YAAc,SAAU/S,EAAOiS,GACjC,IAAI2D,EAAa7d,KAAK8d,iBAAkB7V,EAAOiS,GAC/Cla,KAAK4C,UAAW,cAAe,CAACqF,EAAOiS,EAAS2D,IAChD7d,KAAK+d,UAAW9V,EAAOiS,EAAS2D,EACpC,EAGAjc,EAAMkc,iBAAmB,SAAU7V,EAAOiS,GACtC,IAAI2D,EAAa,CACb5S,EAAGiP,EAAQ4B,MAAQ9b,KAAK0c,mBAAmBZ,MAC3CC,EAAG7B,EAAQ8B,MAAQhc,KAAK0c,mBAAmBV,OAM/C,OAHMhc,KAAK0X,YAAc1X,KAAKge,eAAgBH,IAC1C7d,KAAKie,WAAYhW,EAAOiS,GAErB2D,CACX,EAGAjc,EAAMoc,eAAiB,SAAUH,GAC7B,OAAOvZ,KAAKyR,IAAK8H,EAAW5S,GAAM,GAAK3G,KAAKyR,IAAK8H,EAAW9B,GAAM,CACtE,EASAna,EAAM0Z,UAAY,SAAUrT,EAAOiS,GAC/Bla,KAAK4C,UAAW,YAAa,CAACqF,EAAOiS,IACrCla,KAAKke,eAAgBjW,EAAOiS,EAChC,EAEAtY,EAAMsc,eAAiB,SAAUjW,EAAOiS,GAC/Bla,KAAK0X,WACN1X,KAAKme,SAAUlW,EAAOiS,GAGtBla,KAAKoe,aAAcnW,EAAOiS,EAElC,EAKAtY,EAAMqc,WAAa,SAAUhW,EAAOiS,GAChCla,KAAK0X,YAAa,EAElB1X,KAAKqe,oBAAqB,EAC1Bre,KAAKse,UAAWrW,EAAOiS,EAC3B,EAEAtY,EAAM0c,UAAY,SAAUrW,EAAOiS,GAC/Bla,KAAK4C,UAAW,YAAa,CAACqF,EAAOiS,GACzC,EAGAtY,EAAMmc,UAAY,SAAU9V,EAAOiS,EAAS2D,GAElC7d,KAAK0X,YAIX1X,KAAKue,SAAUtW,EAAOiS,EAAS2D,EACnC,EAEAjc,EAAM2c,SAAW,SAAUtW,EAAOiS,EAAS2D,GACvC5V,EAAMsP,iBACNvX,KAAK4C,UAAW,WAAY,CAACqF,EAAOiS,EAAS2D,GACjD,EAGAjc,EAAMuc,SAAW,SAAUlW,EAAOiS,GAE9Bla,KAAK0X,YAAa,EAElBzO,WAAY,kBACDjJ,KAAKqe,kBAChB,EAAEG,KAAMxe,OAERA,KAAKye,QAASxW,EAAOiS,EACzB,EAEAtY,EAAM6c,QAAU,SAAUxW,EAAOiS,GAC7Bla,KAAK4C,UAAW,UAAW,CAACqF,EAAOiS,GACvC,EAKAtY,EAAM8c,QAAU,SAAUzW,GACjBjI,KAAKqe,oBACNpW,EAAMsP,gBAEd,EAKA3V,EAAMwc,aAAe,SAAUnW,EAAOiS,GAE7Bla,KAAK2e,mBAAmC,WAAd1W,EAAMC,OAIrClI,KAAK4e,YAAa3W,EAAOiS,GAGN,WAAdjS,EAAMC,OACPlI,KAAK2e,mBAAoB,EAEzB1V,WAAY,kBACDjJ,KAAK2e,iBAChB,EAAEH,KAAMxe,MAAQ,MAExB,EAEA4B,EAAMgd,YAAc,SAAU3W,EAAOiS,GACjCla,KAAK4C,UAAW,cAAe,CAACqF,EAAOiS,GAC3C,EAIA+B,EAAWJ,gBAAkB/C,EAAW+C,gBAIjCI,CAEX,IAGE,SAAUxd,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,mBAAmB,CACvB,aACA,wBACA,yBACD,SAAU+L,EAAUuR,EAAY7U,GAC/B,OAAO1I,EAASD,EAAQiM,EAAUuR,EAAY7U,EAClD,IACyB,iBAAVtI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,cACRA,QAAQ,cACRA,QAAQ,mBAIZP,EAAOiM,SAAWhM,EACdD,EACAA,EAAOiM,SACPjM,EAAOwd,WACPxd,EAAO0I,aAInB,CA7BA,CA6BG1I,QAAQ,SAAkBA,EAAQiM,EAAUuR,EAAY7U,GAMvDA,EAAMlH,OAAQwK,EAASsG,SAAU,CAC7B6N,UAAe,KACfC,cAAe,IAKnBpU,EAAS8G,cAAcpP,KAAK,eAI5B,IAAIR,EAAQ8I,EAAStL,UACrBgI,EAAMlH,OAAQ0B,EAAOqa,EAAW7c,WAChCwC,EAAM0a,kBAAoB,QAI1B1a,EAAMmd,YAAc,WAChB/e,KAAK6B,GAAI,WAAY7B,KAAKgf,gBAC1Bhf,KAAK6B,GAAI,WAAY7B,KAAKif,eAC1Bjf,KAAK6B,GAAI,aAAc7B,KAAKkf,kBAC5Blf,KAAK6B,GAAI,aAAc7B,KAAKmf,gBAEhC,EAEAvd,EAAMod,eAAiB,WACnBhf,KAAKuc,QAAU,CAACvc,KAAK2R,UACrB3R,KAAKkc,cACLlc,KAAKmf,iBACT,EAEAvd,EAAMsd,iBAAmB,WACrBlf,KAAKoc,gBACLpc,KAAK6K,QAAQwB,UAAUE,OAAO,eAClC,EAEA3K,EAAMud,gBAAkB,WAEW,MAA1Bnf,KAAKC,QAAQ4e,UACd7e,KAAKkQ,YAAclQ,KAAK+O,OAAOtM,OAAS,EAExCzC,KAAKkQ,YAAclQ,KAAKC,QAAQ4e,UAE/B7e,KAAKkQ,YACNlQ,KAAK6K,QAAQwB,UAAUC,IAAI,gBAE3BtM,KAAK6K,QAAQwB,UAAUE,OAAO,eAEtC,EAGA3K,EAAMwd,SAAW,WACbpf,KAAKC,QAAQ4e,WAAY,EACzB7e,KAAKmf,iBACT,EAEAvd,EAAMyd,WAAa,WACfrf,KAAKC,QAAQ4e,WAAY,EACzB7e,KAAKmf,iBACT,EAEAvd,EAAMqd,cAAgB,kBACXjf,KAAKuP,eAChB,EAIA3N,EAAMwY,YAAc,SAAUnS,EAAOiS,GAC3Bla,KAAKkQ,YAIElQ,KAAKyc,gBAAiBxU,KAKnCjI,KAAKsf,2BAA4BrX,GACjCjI,KAAKuf,iBAAkBtX,GAElBrE,SAASmU,eAAiB/X,KAAK6K,SAEhC7K,KAAK2c,kBAIT3c,KAAKoQ,MAAQpQ,KAAKiL,EAClBjL,KAAK2R,SAAStF,UAAUC,IAAI,mBAE5BtM,KAAKwf,kBAAoBC,IACzBhhB,EAAO4K,iBAAkB,SAAUrJ,MAEnCA,KAAK0f,oBAAqBzX,EAAOiS,IAvB7Bla,KAAK0f,oBAAqBzX,EAAOiS,EAwBzC,EAGAtY,EAAM8d,oBAAsB,SAAUzX,EAAOiS,GAGzCla,KAAK0c,mBAAqB,CACtBZ,MAAO5B,EAAQ4B,MACfE,MAAO9B,EAAQ8B,OAGnBhc,KAAKqa,qBAAsBpS,GAC3BjI,KAAKmP,cAAe,cAAelH,EAAO,CAACiS,GAC/C,EAEA,IAAIyF,EAAa,CACb7C,OAAU,EACVD,UAAU,EACVE,QAAU,GAqOd,SAAS0C,IACL,MAAO,CACHxU,EAAGxM,EAAOga,YACVsD,EAAGtd,EAAO6Z,YAElB,CAIA,OA3OA1W,EAAM2d,iBAAmB,SAAUtX,GACb0X,EAAY1X,EAAM6D,OAAO0R,WAEvCxd,KAAKwX,OAEb,EAEA5V,EAAM0d,2BAA6B,SAAUrX,GACzC,IAAI2X,EAA6B,cAAd3X,EAAMC,KACrB2X,EAAsC,SAArB5X,EAAM6X,YACvBC,EAAcJ,EAAY1X,EAAM6D,OAAO0R,UACrCoC,GAAiBC,GAAmBE,GACtC9X,EAAMsP,gBAEd,EAIA3V,EAAMoc,eAAiB,SAAUH,GAC7B,OAAOvZ,KAAKyR,IAAK8H,EAAW5S,GAAMjL,KAAKC,QAAQ6e,aACnD,EAIAld,EAAM0Z,UAAY,SAAUrT,EAAOiS,UACxBla,KAAKggB,iBACZhgB,KAAK2R,SAAStF,UAAUE,OAAO,mBAC/BvM,KAAKmP,cAAe,YAAalH,EAAO,CAACiS,IACzCla,KAAKke,eAAgBjW,EAAOiS,EAChC,EAEAtY,EAAM4Z,YAAc,WAChB/c,EAAOia,oBAAqB,SAAU1Y,aAC/BA,KAAKwf,iBAChB,EAIA5d,EAAM0c,UAAY,SAAUrW,EAAOiS,GACzBla,KAAKkQ,cAGXlQ,KAAKigB,kBAAoBjgB,KAAKiL,EAC9BjL,KAAK4V,iBACLnX,EAAOia,oBAAqB,SAAU1Y,MACtCA,KAAKmP,cAAe,YAAalH,EAAO,CAACiS,IAC7C,EAEAtY,EAAMoZ,YAAc,SAAU/S,EAAOiS,GACjC,IAAI2D,EAAa7d,KAAK8d,iBAAkB7V,EAAOiS,GAC/Cla,KAAKmP,cAAe,cAAelH,EAAO,CAACiS,EAAS2D,IACpD7d,KAAK+d,UAAW9V,EAAOiS,EAAS2D,EACpC,EAEAjc,EAAM2c,SAAW,SAAUtW,EAAOiS,EAAS2D,GACvC,GAAM7d,KAAKkQ,YAAX,CAGAjI,EAAMsP,iBAENvX,KAAKkgB,cAAgBlgB,KAAKoQ,MAE1B,IAAI+P,EAAYngB,KAAKC,QAAQ0O,aAAe,EAAI,EAC3C3O,KAAKC,QAAQmO,aAEdyP,EAAW5S,GAAKjL,KAAKyM,gBAEzB,IAAI2D,EAAQpQ,KAAKigB,kBAAoBpC,EAAW5S,EAAIkV,EAEpD,IAAMngB,KAAKC,QAAQmO,YAAcpO,KAAK+O,OAAOtM,OAAS,CAElD,IAAI2d,EAAc9b,KAAKyI,KAAM/M,KAAK+O,OAAO,GAAGjD,OAAQ9L,KAAKigB,mBACzD7P,EAAQA,EAAQgQ,EAAwC,IAAxBhQ,EAAQgQ,GAAsBhQ,EAC9D,IAAI6E,EAAW3Q,KAAK4Q,KAAMlV,KAAK2S,eAAe7G,OAAQ9L,KAAKigB,mBAC3D7P,EAAQA,EAAQ6E,EAAkC,IAArB7E,EAAQ6E,GAAmB7E,CAC5D,CAEApQ,KAAKoQ,MAAQA,EAEbpQ,KAAKqgB,aAAe,IAAIC,KACxBtgB,KAAKmP,cAAe,WAAYlH,EAAO,CAACiS,EAAS2D,GAvBjD,CAwBJ,EAEAjc,EAAM6c,QAAU,SAAUxW,EAAOiS,GAC7B,GAAMla,KAAKkQ,YAAX,CAGKlQ,KAAKC,QAAQsgB,aACdvgB,KAAKuP,iBAAkB,GAG3B,IAAI7M,EAAQ1C,KAAKwgB,uBAEjB,GAAKxgB,KAAKC,QAAQsgB,aAAevgB,KAAKC,QAAQmO,WAAa,CAIvD,IAAIqS,EAAWzgB,KAAK0gB,qBACpB1gB,KAAKuP,iBAAmBkR,EAAWzgB,KAAK+O,OAAO,GAAGjD,SACrD2U,EAAWzgB,KAAK2S,eAAe7G,MAChC,MAAa9L,KAAKC,QAAQsgB,YAAc7d,GAAS1C,KAAKwP,gBAElD9M,GAAS1C,KAAK2gB,6BAEX3gB,KAAKkgB,cAIZlgB,KAAKkW,aAAelW,KAAKC,QAAQmO,WACjCpO,KAAKoM,OAAQ1J,UACN1C,KAAKkW,aACZlW,KAAKmP,cAAe,UAAWlH,EAAO,CAACiS,GAzBvC,CA0BJ,EAEAtY,EAAM4e,qBAAuB,WACzB,IAAIC,EAAWzgB,KAAK0gB,qBAEhBE,EAAWtc,KAAKyR,IAAK/V,KAAK6gB,kBAAmBJ,EAAUzgB,KAAKwP,gBAE5DsR,EAAkB9gB,KAAK+gB,mBAAoBN,EAAUG,EAAU,GAC/DI,EAAkBhhB,KAAK+gB,mBAAoBN,EAAUG,GAAW,GAIpE,OAFYE,EAAgBF,SAAWI,EAAgBJ,SACnDE,EAAgBpe,MAAQse,EAAgBte,KAEhD,EAUAd,EAAMmf,mBAAqB,SAAUN,EAAUG,EAAUjM,GAUrD,IATA,IAAIjS,EAAQ1C,KAAKwP,cACbyR,EAAcC,IACdC,EAAYnhB,KAAKC,QAAQ2U,UAAY5U,KAAKC,QAAQmO,WAElD,SAAUgT,EAAMC,GACZ,OAAOD,GAAQC,CACnB,EAAI,SAAUD,EAAMC,GAChB,OAAOD,EAAOC,CAClB,EACIF,EAAWP,EAAUK,KAEzBve,GAASiS,EACTsM,EAAcL,EAEI,QADlBA,EAAW5gB,KAAK6gB,kBAAmBJ,EAAU/d,MAI7Cke,EAAWtc,KAAKyR,IAAK6K,GAEzB,MAAO,CACHA,SAAUK,EAEVve,MAAUA,EAAQiS,EAE1B,EAQA/S,EAAMif,iBAAmB,SAAU5V,EAAGvI,GAClC,IAAIuQ,EAAMjT,KAAK+O,OAAOtM,OAElB6e,EAAethB,KAAKC,QAAQmO,YAAc6E,EAAM,EAChDmE,EAAakK,EAAela,EAAMiH,OAAQ3L,EAAOuQ,GAAQvQ,EACzD0Q,EAAQpT,KAAK+O,OAAQqI,GACzB,IAAMhE,EACF,OAAO,KAGX,IAAImO,EAAOD,EAAethB,KAAKyM,eAAiBnI,KAAKkd,MAAO9e,EAAMuQ,GAAQ,EAC1E,OAAOhI,GAAMmI,EAAMtH,OAASyV,EAChC,EAEA3f,EAAM+e,mBAAqB,WAEvB,QAA4Bxf,IAAvBnB,KAAKkgB,gBAAgClgB,KAAKqgB,cAEjD,IAAIC,KAAStgB,KAAKqgB,aAAe,IAC3B,OAAO,EAGX,IAAIO,EAAW5gB,KAAK6gB,kBAAmB7gB,KAAKoQ,MAAOpQ,KAAKwP,eACpDsG,EAAQ9V,KAAKkgB,cAAgBlgB,KAAKoQ,MACtC,OAAKwQ,EAAW,GAAK9K,EAAQ,EAElB,EACC8K,EAAW,GAAK9K,EAAQ,GAExB,EAEL,CACX,EAIAlU,EAAMgd,YAAc,SAAU3W,EAAOiS,GAEjC,IAAIuH,EAAczhB,KAAKgX,cAAe/O,EAAM6D,QACxC4G,EAAW+O,GAAeA,EAAY5W,QACtC4J,EAAYgN,GAAezhB,KAAK4M,MAAMzK,QAASsf,GACnDzhB,KAAKmP,cAAe,cAAelH,EAAO,CAACiS,EAASxH,EAAU+B,GAClE,EAIA7S,EAAM8f,SAAW,WACb,IAAIC,EAASlC,IACTmC,EAAc5hB,KAAKwf,kBAAkBvU,EAAI0W,EAAO1W,EAChD4W,EAAc7hB,KAAKwf,kBAAkBzD,EAAI4F,EAAO5F,GAE/CzX,KAAKyR,IAAK6L,GAAgB,GAAKtd,KAAKyR,IAAK8L,GAAgB,IAC1D7hB,KAAKqb,cAEb,EAaO3Q,CAEX,IAGE,SAAUjM,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,+BAA+B,CACnC,aACA,wBACA,yBACD,SAAU+L,EAAUoO,EAAY1R,GAC/B,OAAO1I,EAASD,EAAQiM,EAAUoO,EAAY1R,EAClD,IACyB,iBAAVtI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,cACRA,QAAQ,cACRA,QAAQ,mBAIZN,EACID,EACAA,EAAOiM,SACPjM,EAAOqa,WACPra,EAAO0I,aAInB,CA7BA,CA6BG1I,QAAQ,SAAkBA,EAAQiM,EAAUoO,EAAY1R,GACvD,aAEA,IAAI0a,EAAS,6BAIb,SAASC,EAAgB5B,EAAWvV,GAChC5K,KAAKmgB,UAAYA,EACjBngB,KAAK4K,OAASA,EACd5K,KAAKiR,SACT,CAEA8Q,EAAe3iB,UAAY2Z,OAAOjO,OAAQgO,EAAW1Z,WAErD2iB,EAAe3iB,UAAU6R,QAAU,WAE/BjR,KAAKgiB,WAAY,EACjBhiB,KAAKiiB,YAAgC,GAAnBjiB,KAAKmgB,UACvB,IAAI+B,EAAgBliB,KAAK4K,OAAO3K,QAAQ0O,YAAc,GAAK,EAC3D3O,KAAKmiB,OAASniB,KAAKmgB,WAAa+B,EAEhC,IAAIrX,EAAU7K,KAAK6K,QAAUjH,SAASC,cAAc,UACpDgH,EAAQJ,UAAY,4CACpBI,EAAQJ,WAAazK,KAAKiiB,WAAa,YAAc,QAErDpX,EAAQG,aAAc,OAAQ,UAE9BhL,KAAKoiB,UAELvX,EAAQG,aAAc,aAAchL,KAAKiiB,WAAa,WAAa,QAGnE,IAAII,EAAMriB,KAAKsiB,YACfzX,EAAQxG,YAAage,GAErBriB,KAAK4K,OAAO/I,GAAI,SAAU7B,KAAKuiB,OAAO/D,KAAMxe,OAC5CA,KAAK6B,GAAI,cAAe7B,KAAK4K,OAAO0M,mBAAmBkH,KAAMxe,KAAK4K,QACtE,EAEAmX,EAAe3iB,UAAU0S,SAAW,WAChC9R,KAAKgZ,eAAgBhZ,KAAK6K,SAC1B7K,KAAK6K,QAAQxB,iBAAkB,QAASrJ,MAExCA,KAAK4K,OAAOC,QAAQxG,YAAarE,KAAK6K,QAC1C,EAEAkX,EAAe3iB,UAAUwY,WAAa,WAElC5X,KAAK4K,OAAOC,QAAQrG,YAAaxE,KAAK6K,SAEtC7K,KAAKkZ,iBAAkBlZ,KAAK6K,SAC5B7K,KAAK6K,QAAQ6N,oBAAqB,QAAS1Y,KAC/C,EAEA+hB,EAAe3iB,UAAUkjB,UAAY,WACjC,IAAID,EAAMze,SAAS4e,gBAAiBV,EAAQ,OAC5CO,EAAIrX,aAAc,QAAS,wBAC3BqX,EAAIrX,aAAc,UAAW,eAC7B,IAAIyX,EAAO7e,SAAS4e,gBAAiBV,EAAQ,QACzCY,EAYR,SAA4BC,GAExB,GAAqB,iBAATA,EACR,OAAOA,EAGX,MAAO,KAAOA,EAAMC,GAAb,SACDD,EAAME,GAAK,KAAQF,EAAMG,GAAK,IACtC,MAAQH,EAAMI,GAAK,KAAQJ,EAAMK,GAAK,IACtC,MAAQL,EAAMM,GAHL,UAIDN,EAAMI,GAAK,KAAQ,GAAKJ,EAAMK,IACtC,MAAQL,EAAME,GAAK,KAAQ,GAAKF,EAAMG,IACtC,IACF,CAzBwBI,CAAmBljB,KAAK4K,OAAO3K,QAAQkjB,YAQ3D,OAPAV,EAAKzX,aAAc,IAAK0X,GACxBD,EAAKzX,aAAc,QAAS,SAEtBhL,KAAKmiB,QACPM,EAAKzX,aAAc,YAAa,oCAEpCqX,EAAIhe,YAAaoe,GACVJ,CACX,EAkBAN,EAAe3iB,UAAU4I,YAAcZ,EAAMY,YAE7C+Z,EAAe3iB,UAAUsf,QAAU,WAC/B,GAAM1e,KAAKgiB,UAAX,CAGAhiB,KAAK4K,OAAOyM,WACZ,IAAItW,EAASf,KAAKiiB,WAAa,WAAa,OAC5CjiB,KAAK4K,OAAQ7J,IAHb,CAIJ,EAIAghB,EAAe3iB,UAAUgkB,OAAS,WACzBpjB,KAAKgiB,YAGVhiB,KAAK6K,QAAQwY,UAAW,EACxBrjB,KAAKgiB,WAAY,EACrB,EAEAD,EAAe3iB,UAAUgjB,QAAU,WACzBpiB,KAAKgiB,YAGXhiB,KAAK6K,QAAQwY,UAAW,EACxBrjB,KAAKgiB,WAAY,EACrB,EAEAD,EAAe3iB,UAAUmjB,OAAS,WAE9B,IAAIxT,EAAS/O,KAAK4K,OAAOmE,OAEzB,GAAK/O,KAAK4K,OAAO3K,QAAQmO,YAAcW,EAAOtM,OAAS,EACnDzC,KAAKojB,aADT,CAIA,IAAIE,EAAYvU,EAAOtM,OAASsM,EAAOtM,OAAS,EAAI,EAChD8gB,EAAavjB,KAAKiiB,WAAa,EAAIqB,EAEvCtjB,KADaA,KAAK4K,OAAO4E,eAAiB+T,EAAa,UAAY,WAHnE,CAKJ,EAEAxB,EAAe3iB,UAAUgM,QAAU,WAC/BpL,KAAK4X,aACL5X,KAAK8C,QACT,EAIAsE,EAAMlH,OAAQwK,EAASsG,SAAU,CAC7BwS,iBAAiB,EACjBL,WAAiB,CACbP,GAAI,GACJC,GAAI,GAAIC,GAAI,GACZC,GAAI,GAAIC,GAAI,GACZC,GAAI,MAIZvY,EAAS8G,cAAcpP,KAAK,0BAC5B,IAAIR,EAAQ8I,EAAStL,UA6BrB,OA3BAwC,EAAM6hB,uBAAyB,WACrBzjB,KAAKC,QAAQujB,kBAInBxjB,KAAK0jB,WAAa,IAAI3B,GAAiB,EAAG/hB,MAC1CA,KAAK2jB,WAAa,IAAI5B,EAAgB,EAAG/hB,MAEzCA,KAAK6B,GAAI,WAAY7B,KAAK4jB,yBAC9B,EAEAhiB,EAAMgiB,wBAA0B,WAC5B5jB,KAAK0jB,WAAW5R,WAChB9R,KAAK2jB,WAAW7R,WAChB9R,KAAK6B,GAAI,aAAc7B,KAAK6jB,0BAChC,EAEAjiB,EAAMiiB,0BAA4B,WAC9B7jB,KAAK0jB,WAAW9L,aAChB5X,KAAK2jB,WAAW/L,aAChB5X,KAAKwC,IAAK,aAAcxC,KAAK6jB,0BACjC,EAIAnZ,EAASqX,eAAiBA,EAEnBrX,CAEX,IAGE,SAAUjM,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,wBAAwB,CAC5B,aACA,wBACA,yBACD,SAAU+L,EAAUoO,EAAY1R,GAC/B,OAAO1I,EAASD,EAAQiM,EAAUoO,EAAY1R,EAClD,IACyB,iBAAVtI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,cACRA,QAAQ,cACRA,QAAQ,mBAIZN,EACID,EACAA,EAAOiM,SACPjM,EAAOqa,WACPra,EAAO0I,aAInB,CA7BA,CA6BG1I,QAAQ,SAAkBA,EAAQiM,EAAUoO,EAAY1R,GAMvD,SAAS0c,EAAUlZ,GACf5K,KAAK4K,OAASA,EACd5K,KAAKiR,SACT,CAEA6S,EAAS1kB,UAAY2Z,OAAOjO,OAAQgO,EAAW1Z,WAE/C0kB,EAAS1kB,UAAU6R,QAAU,WAEzBjR,KAAK+jB,OAASngB,SAASC,cAAc,MACrC7D,KAAK+jB,OAAOtZ,UAAY,qBAExBzK,KAAKgkB,KAAO,GAEZhkB,KAAKikB,YAAcjkB,KAAKkkB,QAAQ1F,KAAMxe,MACtCA,KAAK6B,GAAI,cAAe7B,KAAK4K,OAAO0M,mBAAmBkH,KAAMxe,KAAK4K,QACtE,EAEAkZ,EAAS1kB,UAAU0S,SAAW,WAC1B9R,KAAKmkB,UACLnkB,KAAK+jB,OAAO1a,iBAAkB,QAASrJ,KAAKikB,aAC5CjkB,KAAKgZ,eAAgBhZ,KAAK+jB,QAE1B/jB,KAAK4K,OAAOC,QAAQxG,YAAarE,KAAK+jB,OAC1C,EAEAD,EAAS1kB,UAAUwY,WAAa,WAC5B5X,KAAK+jB,OAAOrL,oBAAqB,QAAS1Y,KAAKikB,aAC/CjkB,KAAKkZ,iBAAkBlZ,KAAK+jB,QAE5B/jB,KAAK4K,OAAOC,QAAQrG,YAAaxE,KAAK+jB,OAC1C,EAEAD,EAAS1kB,UAAU+kB,QAAU,WAEzB,IAAIrO,EAAQ9V,KAAK4K,OAAOmE,OAAOtM,OAASzC,KAAKgkB,KAAKvhB,OAC7CqT,EAAQ,EACT9V,KAAKokB,QAAStO,GACNA,EAAQ,GAChB9V,KAAKqkB,YAAavO,EAE1B,EAEAgO,EAAS1kB,UAAUglB,QAAU,SAAUE,GAMnC,IALA,IAAIC,EAAW3gB,SAAS4gB,yBACpBC,EAAU,GACVhiB,EAASzC,KAAKgkB,KAAKvhB,OACnBsK,EAAMtK,EAAS6hB,EAET3jB,EAAI8B,EAAQ9B,EAAIoM,EAAKpM,IAAM,CACjC,IAAI+jB,EAAM9gB,SAASC,cAAc,MACjC6gB,EAAIja,UAAY,MAChBia,EAAI1Z,aAAc,aAAc,aAAgBrK,EAAI,IACpD4jB,EAASlgB,YAAaqgB,GACtBD,EAAQriB,KAAMsiB,EAClB,CAEA1kB,KAAK+jB,OAAO1f,YAAakgB,GACzBvkB,KAAKgkB,KAAOhkB,KAAKgkB,KAAK7Z,OAAQsa,EAClC,EAEAX,EAAS1kB,UAAUilB,WAAa,SAAUC,GAErBtkB,KAAKgkB,KAAKrhB,OAAQ3C,KAAKgkB,KAAKvhB,OAAS6hB,EAAOA,GAElDhc,SAAS,SAAUoc,GAC1B1kB,KAAK+jB,OAAOvf,YAAakgB,EAC7B,GAAG1kB,KACP,EAEA8jB,EAAS1kB,UAAUulB,eAAiB,WAE3B3kB,KAAK4kB,cACN5kB,KAAK4kB,YAAYna,UAAY,MAC7BzK,KAAK4kB,YAAYpZ,gBAAgB,iBAG/BxL,KAAKgkB,KAAKvhB,SAGhBzC,KAAK4kB,YAAc5kB,KAAKgkB,KAAMhkB,KAAK4K,OAAO4E,eAC1CxP,KAAK4kB,YAAYna,UAAY,kBAC7BzK,KAAK4kB,YAAY5Z,aAAc,eAAgB,QACnD,EAEA8Y,EAAS1kB,UAAUylB,MACrBf,EAAS1kB,UAAU8kB,QAAU,SAAUjc,GACnC,IAAI6D,EAAS7D,EAAM6D,OAEnB,GAAwB,MAAnBA,EAAO0R,SAAZ,CAIAxd,KAAK4K,OAAOyM,WACZ,IAAI3U,EAAQ1C,KAAKgkB,KAAK7hB,QAAS2J,GAC/B9L,KAAK4K,OAAOwB,OAAQ1J,EAJpB,CAKJ,EAEEohB,EAAS1kB,UAAUgM,QAAU,WACzBpL,KAAK4X,aACL5X,KAAK8C,QACT,EAEA4H,EAASoZ,SAAWA,EAIpB1c,EAAMlH,OAAQwK,EAASsG,SAAU,CAC7B8T,UAAU,IAGdpa,EAAS8G,cAAcpP,KAAK,mBAE5B,IAAIR,EAAQ8I,EAAStL,UAmCrB,OAjCAwC,EAAMmjB,gBAAkB,WACd/kB,KAAKC,QAAQ6kB,WAGnB9kB,KAAK8kB,SAAW,IAAIhB,EAAU9jB,MAE9BA,KAAK6B,GAAI,WAAY7B,KAAKglB,kBAC1BhlB,KAAK6B,GAAI,SAAU7B,KAAKilB,wBACxBjlB,KAAK6B,GAAI,aAAc7B,KAAKklB,gBAC5BllB,KAAK6B,GAAI,SAAU7B,KAAKklB,gBACxBllB,KAAK6B,GAAI,aAAc7B,KAAKmlB,oBAChC,EAEAvjB,EAAMojB,iBAAmB,WACrBhlB,KAAK8kB,SAAShT,UAClB,EAEAlQ,EAAMqjB,uBAAyB,WAC3BjlB,KAAK8kB,SAASH,gBAClB,EAEA/iB,EAAMsjB,eAAiB,WACnBllB,KAAK8kB,SAASX,SAClB,EAEAviB,EAAMujB,mBAAqB,WACvBnlB,KAAK8kB,SAASlN,YAClB,EAIAlN,EAASoZ,SAAWA,EAEbpZ,CAEX,IAGE,SAAUjM,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,qBAAqB,CACzB,wBACA,uBACA,eACD,SAAUgD,EAAWyF,EAAOsD,GAC3B,OAAOhM,EAASiD,EAAWyF,EAAOsD,EACtC,IACyB,iBAAV5L,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbM,QAAQ,cACRA,QAAQ,kBACRA,QAAQ,eAIZN,EACID,EAAOkD,UACPlD,EAAO0I,aACP1I,EAAOiM,SAInB,CA3BA,CA2BGjM,QAAQ,SAAkBkD,EAAWyF,EAAOsD,GAM3C,SAAS0a,EAAQxa,GACb5K,KAAK4K,OAASA,EACd5K,KAAKqlB,MAAQ,UAEbrlB,KAAKslB,mBAAqBtlB,KAAKulB,iBAAiB/G,KAAMxe,MACtDA,KAAKwlB,iBAAmBxlB,KAAKylB,eAAejH,KAAMxe,KACtD,CAEAolB,EAAOhmB,UAAY2Z,OAAOjO,OAAQnJ,EAAUvC,WAG5CgmB,EAAOhmB,UAAUsmB,KAAO,WACD,WAAd1lB,KAAKqlB,QAISzhB,SAAS+hB,OAExB/hB,SAASyF,iBAAkB,mBAAoBrJ,KAAKwlB,mBAIxDxlB,KAAKqlB,MAAQ,UAEbzhB,SAASyF,iBAAkB,mBAAoBrJ,KAAKslB,oBAEpDtlB,KAAK4lB,QACT,EAEAR,EAAOhmB,UAAUwmB,KAAO,WAEpB,GAAmB,WAAd5lB,KAAKqlB,MAAV,CAIA,IAAIQ,EAAO7lB,KAAK4K,OAAO3K,QAAQ6lB,SAE/BD,EAAsB,iBAARA,EAAmBA,EAAO,IACxC,IAAI7c,EAAQhJ,KAEZA,KAAK+lB,QACL/lB,KAAK8I,QAAUG,YAAY,WACvBD,EAAM4B,OAAOwL,MAAM,GACnBpN,EAAM4c,MACV,GAAGC,EAXH,CAYJ,EAEAT,EAAOhmB,UAAU4mB,KAAO,WACpBhmB,KAAKqlB,MAAQ,UACbrlB,KAAK+lB,QAELniB,SAAS8U,oBAAqB,mBAAoB1Y,KAAKslB,mBAC3D,EAEAF,EAAOhmB,UAAU2mB,MAAQ,WACrBhd,aAAc/I,KAAK8I,QACvB,EAEAsc,EAAOhmB,UAAU6mB,MAAQ,WACF,WAAdjmB,KAAKqlB,QACNrlB,KAAKqlB,MAAQ,SACbrlB,KAAK+lB,QAEb,EAEAX,EAAOhmB,UAAU8mB,QAAU,WAEJ,UAAdlmB,KAAKqlB,OACNrlB,KAAK0lB,MAEb,EAGAN,EAAOhmB,UAAUmmB,iBAAmB,WAEhCvlB,KADmB4D,SAAS+hB,OACP,QAAU,YACnC,EAEAP,EAAOhmB,UAAUqmB,eAAiB,WAC9BzlB,KAAK0lB,OACL9hB,SAAS8U,oBAAqB,mBAAoB1Y,KAAKwlB,iBAC3D,EAIApe,EAAMlH,OAAQwK,EAASsG,SAAU,CAC7BmV,sBAAsB,IAG1Bzb,EAAS8G,cAAcpP,KAAK,iBAC5B,IAAIR,EAAQ8I,EAAStL,UA+DrB,OA7DAwC,EAAMwkB,cAAgB,WAClBpmB,KAAKqmB,OAAS,IAAIjB,EAAQplB,MAE1BA,KAAK6B,GAAI,WAAY7B,KAAKsmB,gBAC1BtmB,KAAK6B,GAAI,WAAY7B,KAAKumB,YAC1BvmB,KAAK6B,GAAI,cAAe7B,KAAKumB,YAC7BvmB,KAAK6B,GAAI,aAAc7B,KAAKwmB,iBAChC,EAEA5kB,EAAM0kB,eAAiB,WACbtmB,KAAKC,QAAQ6lB,WAGnB9lB,KAAKqmB,OAAOX,OACZ1lB,KAAK6K,QAAQxB,iBAAkB,aAAcrJ,MACjD,EAIA4B,EAAM6kB,WAAa,WACfzmB,KAAKqmB,OAAOX,MAChB,EAEA9jB,EAAM2kB,WAAa,WACfvmB,KAAKqmB,OAAOL,MAChB,EAEApkB,EAAM8kB,YAAc,WAChB1mB,KAAKqmB,OAAOJ,OAChB,EAEArkB,EAAM+kB,cAAgB,WAClB3mB,KAAKqmB,OAAOH,SAChB,EAEAtkB,EAAM4kB,iBAAmB,WACrBxmB,KAAKqmB,OAAOL,OACZhmB,KAAK6K,QAAQ6N,oBAAqB,aAAc1Y,KACpD,EAKA4B,EAAMglB,aAAe,WACX5mB,KAAKC,QAAQkmB,uBAGnBnmB,KAAKqmB,OAAOJ,QACZjmB,KAAK6K,QAAQxB,iBAAkB,aAAcrJ,MACjD,EAGA4B,EAAMilB,aAAe,WACjB7mB,KAAKqmB,OAAOH,UACZlmB,KAAK6K,QAAQ6N,oBAAqB,aAAc1Y,KACpD,EAIA0K,EAAS0a,OAASA,EAEX1a,CAEX,IAGE,SAAUjM,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,8BAA8B,CAClC,aACA,yBACD,SAAU+L,EAAUtD,GACnB,OAAO1I,EAASD,EAAQiM,EAAUtD,EACtC,IACyB,iBAAVtI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,cACRA,QAAQ,mBAIZN,EACID,EACAA,EAAOiM,SACPjM,EAAO0I,aAInB,CA1BA,CA0BG1I,QAAQ,SAAkBA,EAAQiM,EAAUtD,GAe3C,IAAIxF,EAAQ8I,EAAStL,UAoHrB,OA7GAwC,EAAMklB,OAAS,SAAU1e,EAAO1F,GAC5B,IAAIkK,EAAQ5M,KAAKuS,WAAYnK,GAC7B,GAAMwE,GAAUA,EAAMnK,OAAtB,CAGA,IAAIwQ,EAAMjT,KAAK4M,MAAMnK,OAErBC,OAAkBvB,IAAVuB,EAAsBuQ,EAAMvQ,EAEpC,IAAI6hB,EA1BR,SAA2B3X,GACvB,IAAI2X,EAAW3gB,SAAS4gB,yBAIxB,OAHA5X,EAAMtE,SAAS,SAAUwE,GACrByX,EAASlgB,YAAayI,EAAKjC,QAC/B,IACO0Z,CACX,CAoBmBwC,CAAkBna,GAE7Boa,EAAWtkB,GAASuQ,EACxB,GAAK+T,EACDhnB,KAAK6O,OAAOxK,YAAakgB,OACtB,CACH,IAAI0C,EAAoBjnB,KAAK4M,MAAOlK,GAAQmI,QAC5C7K,KAAK6O,OAAOqY,aAAc3C,EAAU0C,EACxC,CAEA,GAAe,IAAVvkB,EAED1C,KAAK4M,MAAQA,EAAMzC,OAAQnK,KAAK4M,YAC7B,GAAKoa,EAERhnB,KAAK4M,MAAQ5M,KAAK4M,MAAMzC,OAAQyC,OAC7B,CAEH,IAAIua,EAAWnnB,KAAK4M,MAAMjK,OAAQD,EAAOuQ,EAAMvQ,GAC/C1C,KAAK4M,MAAQ5M,KAAK4M,MAAMzC,OAAQyC,GAAQzC,OAAQgd,EACpD,CAEAnnB,KAAK4S,WAAYhG,GACjB5M,KAAKonB,WAAY1kB,GAAO,EA5BxB,CA6BJ,EAEAd,EAAMylB,OAAS,SAAUjf,GACrBpI,KAAK8mB,OAAQ1e,EAAOpI,KAAK4M,MAAMnK,OACnC,EAEAb,EAAM0lB,QAAU,SAAUlf,GACtBpI,KAAK8mB,OAAQ1e,EAAO,EACxB,EAMAxG,EAAM2K,OAAS,SAAUnE,GACrB,IAAIwE,EAAQ5M,KAAK+W,SAAU3O,GAC3B,GAAMwE,GAAUA,EAAMnK,OAAtB,CAIA,IAAI8kB,EAAevnB,KAAK4M,MAAMnK,OAAS,EAEvCmK,EAAMtE,SAAS,SAAUwE,GACrBA,EAAKP,SACL,IAAI7J,EAAQ1C,KAAK4M,MAAMzK,QAAS2K,GAChCya,EAAejjB,KAAK4Q,IAAKxS,EAAO6kB,GAChCngB,EAAMO,WAAY3H,KAAK4M,MAAOE,EAClC,GAAG9M,MAEHA,KAAKonB,WAAYG,GAAc,EAX/B,CAYJ,EAMA3lB,EAAM4lB,eAAiB,SAAU5mB,GAC7B,IAAIkM,EAAO9M,KAAK8W,QAASlW,GACzB,GAAMkM,EAAN,CAGAA,EAAK/J,UAEL,IAAIL,EAAQ1C,KAAK4M,MAAMzK,QAAS2K,GAChC9M,KAAKonB,WAAY1kB,EAJjB,CAKJ,EAOAd,EAAMwlB,WAAa,SAAUK,EAAkBC,GAC3C,IAAIC,EAAmB3nB,KAAKyW,gBAC5BzW,KAAK6S,eAAgB4U,GACrBznB,KAAKyS,qBACLzS,KAAKuR,iBAGL,IAAIzE,EAAO9M,KAAK8W,QAAS6Q,GACpB7a,IACD9M,KAAKwP,cAAgBxP,KAAK6W,kBAAmB/J,IAEjD9M,KAAKwP,cAAgBlL,KAAK4Q,IAAKlV,KAAK+O,OAAOtM,OAAS,EAAGzC,KAAKwP,eAE5DxP,KAAK4C,UAAW,aAAc,CAAC6kB,IAE/BznB,KAAKoM,OAAQpM,KAAKwP,eAEbkY,GACD1nB,KAAK+T,0BAEb,EAIOrJ,CAEX,IAGE,SAAUjM,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,uBAAuB,CAC3B,aACA,yBACD,SAAU+L,EAAUtD,GACnB,OAAO1I,EAASD,EAAQiM,EAAUtD,EACtC,IACyB,iBAAVtI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,cACRA,QAAQ,mBAIZN,EACID,EACAA,EAAOiM,SACPjM,EAAO0I,aAInB,CA1BA,CA0BG1I,QAAQ,SAAkBA,EAAQiM,EAAUtD,GAC3C,aAEAsD,EAAS8G,cAAcpP,KAAK,mBAC5B,IAAIR,EAAQ8I,EAAStL,UAkDrB,SAASwoB,EAAYC,EAAKC,GACtB9nB,KAAK6nB,IAAMA,EACX7nB,KAAK8nB,SAAWA,EAChB9nB,KAAK+nB,MACT,CA+CA,OAnGAnmB,EAAMomB,gBAAkB,WACpBhoB,KAAK6B,GAAI,SAAU7B,KAAKioB,SAC5B,EAEArmB,EAAMqmB,SAAW,WACb,IAAIA,EAAWjoB,KAAKC,QAAQgoB,SAC5B,GAAMA,EAAN,CAIA,IAAI/Q,EAA8B,iBAAZ+Q,EAAuBA,EAAW,EACpD9Q,EAAYnX,KAAKiX,wBAAyBC,GAE1CgR,EAAa,GACjB/Q,EAAU7O,SAAS,SAAUoK,GACzB,IAAIyV,EASZ,SAA4BzV,GAExB,GAA0B,OAArBA,EAAS8K,SAAoB,CAC9B,IAAI4K,EAAe1V,EAASpI,aAAa,0BACrC+d,EAAU3V,EAASpI,aAAa,8BAChCge,EAAa5V,EAASpI,aAAa,iCACvC,GAAK8d,GAAgBC,GAAWC,EAC5B,MAAO,CAAC5V,EAEhB,CAEA,IAAI6V,EAAe,mGAEfC,EAAO9V,EAASjK,iBAAkB8f,GACtC,OAAOnhB,EAAMI,UAAWghB,EAC5B,CAxB6BC,CAAmB/V,GACxCwV,EAAaA,EAAW/d,OAAQge,EACpC,IAEAD,EAAW5f,SAAS,SAAUuf,GAC1B,IAAID,EAAYC,EAAK7nB,KACzB,GAAGA,KAbH,CAcJ,EAgCA4nB,EAAWxoB,UAAU4I,YAAcZ,EAAMY,YAEzC4f,EAAWxoB,UAAU2oB,KAAO,WACxB/nB,KAAK6nB,IAAIxe,iBAAkB,OAAQrJ,MACnCA,KAAK6nB,IAAIxe,iBAAkB,QAASrJ,MAEpC,IAAI0oB,EAAM1oB,KAAK6nB,IAAIvd,aAAa,2BAClCtK,KAAK6nB,IAAIvd,aAAa,8BAChBqe,EAAS3oB,KAAK6nB,IAAIvd,aAAa,iCAEnCtK,KAAK6nB,IAAIa,IAAMA,EACVC,GACD3oB,KAAK6nB,IAAI7c,aAAc,SAAU2d,GAGrC3oB,KAAK6nB,IAAIrc,gBAAgB,0BACzBxL,KAAK6nB,IAAIrc,gBAAgB,8BACzBxL,KAAK6nB,IAAIrc,gBAAgB,gCAC7B,EAEAoc,EAAWxoB,UAAUwpB,OAAS,SAAU3gB,GACpCjI,KAAK6oB,SAAU5gB,EAAO,sBAC1B,EAEA2f,EAAWxoB,UAAU0pB,QAAU,SAAU7gB,GACrCjI,KAAK6oB,SAAU5gB,EAAO,qBAC1B,EAEA2f,EAAWxoB,UAAUypB,SAAW,SAAU5gB,EAAOwC,GAE7CzK,KAAK6nB,IAAInP,oBAAqB,OAAQ1Y,MACtCA,KAAK6nB,IAAInP,oBAAqB,QAAS1Y,MAEvC,IAAI8M,EAAO9M,KAAK8nB,SAAS9Q,cAAehX,KAAK6nB,KACzCnV,EAAW5F,GAAQA,EAAKjC,QAC5B7K,KAAK8nB,SAASN,eAAgB9U,GAE9B1S,KAAK6nB,IAAIxb,UAAUC,IAAK7B,GACxBzK,KAAK8nB,SAAS3Y,cAAe,WAAYlH,EAAOyK,EACpD,EAIAhI,EAASkd,WAAaA,EAEfld,CAEX;;;;;;;;;;;AAaA,SAAYjM,EAAQC,GAEM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,oBAAoB,CACxB,aACA,SACA,qBACA,cACA,WACA,oBACA,cACDD,GACsB,iBAAVI,QAAsBA,OAAOC,UAE5CD,OAAOC,QAAUL,EACbM,QAAQ,cACRA,QAAQ,UACRA,QAAQ,sBACRA,QAAQ,eACRA,QAAQ,YACRA,QAAQ,qBACRA,QAAQ,eAIlB,CA1BF,CA0BKP,QAAQ,SAAkBiM,GAC3B,OAAOA,CACX;;;;;AASE,SAAUjM,EAAQC,GAGM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,iCAAiC,CACrC,oBACA,wBACDD,GACsB,iBAAVI,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbM,QAAQ,YACRA,QAAQ,mBAIZP,EAAOiM,SAAWhM,EACdD,EAAOiM,SACPjM,EAAO0I,aAInB,CAvBA,CAuBG1I,QAAQ,SAAkBiM,EAAUtD,GAQnCsD,EAAS8G,cAAcpP,KAAK,mBAE5B,IAAIR,EAAQ8I,EAAStL,UA6GrB,OA3GAwC,EAAMmnB,gBAAkB,WACpB/oB,KAAK6B,GAAI,WAAY7B,KAAKgpB,kBAC1BhpB,KAAK6B,GAAI,aAAc7B,KAAKipB,oBAC5BjpB,KAAK6B,GAAI,UAAW7B,KAAKkpB,iBAEzB,IAAIC,EAAiBnpB,KAAKC,QAAQmpB,SAClC,GAAMD,EAAN,CAIA,IAAIngB,EAAQhJ,KACZiJ,YAAY,WACRD,EAAMqgB,gBAAiBF,EAC3B,GALA,CAMJ,EAEAvnB,EAAMynB,gBAAkB,SAAUzoB,GAC9BA,EAAOwG,EAAMW,gBAAiBnH,GAC9B,IAAI0oB,EAAY5e,EAAS5J,KAAMF,GAE/B,GAAM0oB,GAAaA,GAAatpB,KAAhC,CAIAA,KAAKupB,aAAeD,EAEpB,IAAItgB,EAAQhJ,KACZA,KAAKwpB,qBAAuB,WACxBxgB,EAAMygB,oBACV,EACAH,EAAUznB,GAAI,SAAU7B,KAAKwpB,sBAE7BxpB,KAAK6B,GAAI,cAAe7B,KAAK0pB,kBAE7B1pB,KAAKypB,oBAAoB,EAZzB,CAaJ,EAEA7nB,EAAM6nB,mBAAqB,SAAUhU,GAEjC,IAAIkU,EAAiB3pB,KAAKupB,cAAgBvpB,KAAKupB,aAAajT,cAC5D,GAAMqT,EAAN,CAIA,IAoBWtiB,EAAGC,EAAGsiB,EApBbpT,EAAemT,EAAe,GAC9BE,EAAa7pB,KAAKupB,aAAa3c,MAAMzK,QAASqU,GAC9C8M,EAAYuG,EAAaF,EAAelnB,OAAS,EACjDqnB,EAAcxlB,KAAKkd,OAiBZna,EAjByBwiB,EAiBtBviB,EAjBkCgc,EAiB/BsG,EAhBb5pB,KAAKupB,aAAaxd,WAiBbzE,EAAID,GAAMuiB,EAAIviB,IAZvB,GAJArH,KAAK4W,WAAYkT,GAAa,EAAOrU,GAErCzV,KAAK+pB,8BAEAD,GAAe9pB,KAAK4M,MAAMnK,QAA/B,CAIA,IAAI6T,EAAgBtW,KAAK4M,MAAMvN,MAAOwqB,EAAYvG,EAAY,GAC9DtjB,KAAKgqB,oBAAsB1T,EAAc9I,KAAK,SAAUV,GACpD,OAAOA,EAAKjC,OAChB,IACA7K,KAAKiqB,uBAAuB,MAN5B,CAbA,CAoBJ,EAMAroB,EAAMqoB,uBAAyB,SAAUlpB,GACrCf,KAAKgqB,oBAAoB1hB,SAAS,SAAU4hB,GACxCA,EAAQ7d,UAAWtL,GAAS,kBAChC,GACJ,EAEAa,EAAMonB,iBAAmB,WACrBhpB,KAAKypB,oBAAoB,EAC7B,EAEA7nB,EAAMmoB,0BAA4B,WACxB/pB,KAAKgqB,sBAGXhqB,KAAKiqB,uBAAuB,iBACrBjqB,KAAKgqB,oBAChB,EAEApoB,EAAM8nB,iBAAmB,SAAUzhB,EAAOiS,EAASiQ,EAAa1V,GACnC,iBAAbA,GACRzU,KAAKupB,aAAa3S,WAAYnC,EAEtC,EAEA7S,EAAMqnB,mBAAqB,WACvBjpB,KAAK+pB,2BACT,EAEAnoB,EAAMsnB,gBAAkB,WACdlpB,KAAKupB,eAGXvpB,KAAKupB,aAAa/mB,IAAK,SAAUxC,KAAKwpB,sBACtCxpB,KAAKwC,IAAK,cAAexC,KAAK0pB,yBACvB1pB,KAAKupB,aAChB,EAIO7e,CAEX;;;;;;AAQA,SAAYjM,EAAQC,GAChB,aAKsB,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,4BAA4B,CAChC,0BACD,SAAUgD,GACT,OAAOjD,EAASD,EAAQkD,EAC5B,IACyB,iBAAV7C,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,eAIZP,EAAO2rB,aAAe1rB,EAClBD,EACAA,EAAOkD,UAIlB,CA3BD,CA2BsB,oBAAXlD,OAAyBA,OAASuB,MAIzC,SAAkBvB,EAAQkD,GAItB,IAAI/B,EAAInB,EAAOI,OACXS,EAAUb,EAAOa,QAKrB,SAASY,EAAQmH,EAAGC,GAChB,IAAM,IAAIC,KAAQD,EACdD,EAAGE,GAASD,EAAGC,GAEnB,OAAOF,CACX,CAEA,IAAInI,EAAaC,MAAMC,UAAUC,MA0BjC,SAASgrB,EAAczpB,EAAMX,EAASqqB,GAElC,KAAQtqB,gBAAgBqqB,GACpB,OAAO,IAAIA,EAAczpB,EAAMX,EAASqqB,GAG5C,IA7BgB7iB,EA6BZ8iB,EAAY3pB,GACI,iBAARA,IACR2pB,EAAY3mB,SAAS6E,iBAAkB7H,IAGrC2pB,IAKNvqB,KAAKwqB,UAvCW/iB,EAuCW8iB,EAtCtBprB,MAAMuI,QAASD,GAETA,EAGqB,iBAAPA,GAAwC,iBAAdA,EAAIhF,OAG5CvD,EAAWmC,KAAMoG,GAIrB,CAACA,IA2BRzH,KAAKC,QAAUC,EAAQ,CAAC,EAAGF,KAAKC,SAET,mBAAXA,EACRqqB,EAAWrqB,EAEXC,EAAQF,KAAKC,QAASA,GAGrBqqB,GACDtqB,KAAK6B,GAAI,SAAUyoB,GAGvBtqB,KAAKyqB,YAEA7qB,IAEDI,KAAK0qB,WAAa,IAAI9qB,EAAE+qB,UAI5B1hB,WAAYjJ,KAAK4qB,MAAMpM,KAAMxe,QAzBzBV,EAAQG,MAAO,iCAAoC8qB,GAAa3pB,GA0BxE,CAEAypB,EAAajrB,UAAY2Z,OAAOjO,OAAQnJ,EAAUvC,WAElDirB,EAAajrB,UAAUa,QAAU,CAAC,EAElCoqB,EAAajrB,UAAUqrB,UAAY,WAC/BzqB,KAAK6qB,OAAS,GAGd7qB,KAAKwqB,SAASliB,QAAStI,KAAK8qB,iBAAkB9qB,KAClD,EAKAqqB,EAAajrB,UAAU0rB,iBAAmB,SAAUlqB,GAE1B,OAAjBA,EAAK4c,UACNxd,KAAK+qB,SAAUnqB,IAGc,IAA5BZ,KAAKC,QAAQ+qB,YACdhrB,KAAKirB,2BAA4BrqB,GAKrC,IAAI+D,EAAW/D,EAAK+D,SACpB,GAAMA,GAAaumB,EAAkBvmB,GAArC,CAKA,IAFA,IAAIwmB,EAAYvqB,EAAK6H,iBAAiB,OAE5B9H,EAAE,EAAGA,EAAIwqB,EAAU1oB,OAAQ9B,IAAM,CACvC,IAAIknB,EAAMsD,EAAUxqB,GACpBX,KAAK+qB,SAAUlD,EACnB,CAGA,GAAuC,iBAA3B7nB,KAAKC,QAAQ+qB,WAAyB,CAC9C,IAAI/Y,EAAWrR,EAAK6H,iBAAkBzI,KAAKC,QAAQ+qB,YACnD,IAAMrqB,EAAE,EAAGA,EAAIsR,EAASxP,OAAQ9B,IAAM,CAClC,IAAIyqB,EAAQnZ,EAAStR,GACrBX,KAAKirB,2BAA4BG,EACrC,CACJ,CAfA,CAgBJ,EAEA,IAAIF,EAAmB,CACnB,GAAI,EACJ,GAAI,EACJ,IAAI,GAwFR,SAASG,EAAcxD,GACnB7nB,KAAK6nB,IAAMA,CACf,CAgEA,SAASyD,EAAYC,EAAK1gB,GACtB7K,KAAKurB,IAAMA,EACXvrB,KAAK6K,QAAUA,EACf7K,KAAK6nB,IAAM,IAAI2D,KACnB,CA+CA,OA1MAnB,EAAajrB,UAAU6rB,2BAA6B,SAAUrqB,GAC1D,IAAI2C,EAAQC,iBAAkB5C,GAC9B,GAAM2C,EAON,IAFA,IAAIkoB,EAAQ,0BACRzkB,EAAUykB,EAAMC,KAAMnoB,EAAMooB,iBACZ,OAAZ3kB,GAAmB,CACvB,IAAIukB,EAAMvkB,GAAWA,EAAQ,GACxBukB,GACDvrB,KAAK4rB,cAAeL,EAAK3qB,GAE7BoG,EAAUykB,EAAMC,KAAMnoB,EAAMooB,gBAChC,CACJ,EAKAtB,EAAajrB,UAAU2rB,SAAW,SAAUlD,GACxC,IAAIgE,EAAe,IAAIR,EAAcxD,GACrC7nB,KAAK6qB,OAAOzoB,KAAMypB,EACtB,EAEAxB,EAAajrB,UAAUwsB,cAAgB,SAAUL,EAAK3qB,GAClD,IAAIoqB,EAAa,IAAIM,EAAYC,EAAK3qB,GACtCZ,KAAK6qB,OAAOzoB,KAAM4oB,EACtB,EAEAX,EAAajrB,UAAUwrB,MAAQ,WAC3B,IAAI5hB,EAAQhJ,KASZ,SAAS8rB,EAAYzO,EAAOzc,EAAMpB,GAE9ByJ,YAAY,WACRD,EAAMiG,SAAUoO,EAAOzc,EAAMpB,EACjC,GACJ,CAbAQ,KAAK+rB,gBAAkB,EACvB/rB,KAAKgsB,cAAe,EAEdhsB,KAAK6qB,OAAOpoB,OAYlBzC,KAAK6qB,OAAOviB,SAAS,SAAUujB,GAC3BA,EAAaxpB,KAAM,WAAYypB,GAC/BD,EAAajB,OACjB,IAdI5qB,KAAK6oB,UAeb,EAEAwB,EAAajrB,UAAU6P,SAAW,SAAUoO,EAAOzc,EAAMpB,GACrDQ,KAAK+rB,kBACL/rB,KAAKgsB,aAAehsB,KAAKgsB,eAAiB3O,EAAM4O,SAEhDjsB,KAAK4C,UAAW,WAAY,CAAC5C,KAAMqd,EAAOzc,IACrCZ,KAAK0qB,YAAc1qB,KAAK0qB,WAAWwB,QACpClsB,KAAK0qB,WAAWwB,OAAQlsB,KAAMqd,GAG7Brd,KAAK+rB,iBAAmB/rB,KAAK6qB,OAAOpoB,QACrCzC,KAAK6oB,WAGJ7oB,KAAKC,QAAQksB,OAAS7sB,GACvBA,EAAQ8sB,IAAK,aAAe5sB,EAAS6d,EAAOzc,EAEpD,EAEAypB,EAAajrB,UAAUypB,SAAW,WAC9B,IAAI/mB,EAAY9B,KAAKgsB,aAAe,OAAS,OAI7C,GAHAhsB,KAAKqsB,YAAa,EAClBrsB,KAAK4C,UAAWd,EAAW,CAAC9B,OAC5BA,KAAK4C,UAAW,SAAU,CAAC5C,OACtBA,KAAK0qB,WAAa,CACnB,IAAI4B,EAAWtsB,KAAKgsB,aAAe,SAAW,UAC9ChsB,KAAK0qB,WAAY4B,GAAYtsB,KACjC,CACJ,EAQAqrB,EAAajsB,UAAY2Z,OAAOjO,OAAQnJ,EAAUvC,WAElDisB,EAAajsB,UAAUwrB,MAAQ,WAGV5qB,KAAKusB,qBAGlBvsB,KAAKwsB,QAAmC,IAA1BxsB,KAAK6nB,IAAI4E,aAAoB,iBAK/CzsB,KAAK0sB,WAAa,IAAIlB,MACtBxrB,KAAK0sB,WAAWrjB,iBAAkB,OAAQrJ,MAC1CA,KAAK0sB,WAAWrjB,iBAAkB,QAASrJ,MAE3CA,KAAK6nB,IAAIxe,iBAAkB,OAAQrJ,MACnCA,KAAK6nB,IAAIxe,iBAAkB,QAASrJ,MACpCA,KAAK0sB,WAAWhE,IAAM1oB,KAAK6nB,IAAIa,IACnC,EAEA2C,EAAajsB,UAAUmtB,mBAAqB,WAGxC,OAAOvsB,KAAK6nB,IAAIgB,UAAY7oB,KAAK6nB,IAAI4E,YACzC,EAEApB,EAAajsB,UAAUotB,QAAU,SAAUP,EAAUzsB,GACjDQ,KAAKisB,SAAWA,EAChBjsB,KAAK4C,UAAW,WAAY,CAAC5C,KAAMA,KAAK6nB,IAAKroB,GACjD,EAKA6rB,EAAajsB,UAAU4I,YAAc,SAAUC,GAC3C,IAAIlH,EAAS,KAAOkH,EAAMC,KACrBlI,KAAMe,IACPf,KAAMe,GAAUkH,EAExB,EAEAojB,EAAajsB,UAAUwpB,OAAS,WAC5B5oB,KAAKwsB,SAAS,EAAM,UACpBxsB,KAAK2sB,cACT,EAEAtB,EAAajsB,UAAU0pB,QAAU,WAC7B9oB,KAAKwsB,SAAS,EAAO,WACrBxsB,KAAK2sB,cACT,EAEAtB,EAAajsB,UAAUutB,aAAe,WAClC3sB,KAAK0sB,WAAWhU,oBAAqB,OAAQ1Y,MAC7CA,KAAK0sB,WAAWhU,oBAAqB,QAAS1Y,MAC9CA,KAAK6nB,IAAInP,oBAAqB,OAAQ1Y,MACtCA,KAAK6nB,IAAInP,oBAAqB,QAAS1Y,KAC3C,EAWAsrB,EAAWlsB,UAAY2Z,OAAOjO,OAAQugB,EAAajsB,WAEnDksB,EAAWlsB,UAAUwrB,MAAQ,WACzB5qB,KAAK6nB,IAAIxe,iBAAkB,OAAQrJ,MACnCA,KAAK6nB,IAAIxe,iBAAkB,QAASrJ,MACpCA,KAAK6nB,IAAIa,IAAM1oB,KAAKurB,IAEHvrB,KAAKusB,uBAElBvsB,KAAKwsB,QAAmC,IAA1BxsB,KAAK6nB,IAAI4E,aAAoB,gBAC3CzsB,KAAK2sB,eAEb,EAEArB,EAAWlsB,UAAUutB,aAAe,WAChC3sB,KAAK6nB,IAAInP,oBAAqB,OAAQ1Y,MACtCA,KAAK6nB,IAAInP,oBAAqB,QAAS1Y,KAC3C,EAEAsrB,EAAWlsB,UAAUotB,QAAU,SAAUP,EAAUzsB,GAC/CQ,KAAKisB,SAAWA,EAChBjsB,KAAK4C,UAAW,WAAY,CAAC5C,KAAMA,KAAK6K,QAASrL,GACrD,EAIA6qB,EAAauC,iBAAmB,SAAU/tB,IACtCA,EAASA,GAAUJ,EAAOI,WAK1Be,EAAIf,GAEFsB,GAAGiqB,aAAe,SAAUnqB,EAASkJ,GAEnC,OADe,IAAIkhB,EAAcrqB,KAAMC,EAASkJ,GAChCuhB,WAAWmC,QAASjtB,EAAEI,MAC1C,EACJ,EAEAqqB,EAAauC,mBAINvC,CAEX;;;;;AASF,SAAU5rB,EAAQC,GAGM,mBAAVC,QAAwBA,OAAOC,IAEvCD,OAAQ,CACJ,oBACA,8BACD,SAAU+L,EAAU0f,GACnB,OAAO1rB,EAASD,EAAQiM,EAAU0f,EACtC,IACyB,iBAAVtrB,QAAsBA,OAAOC,QAE5CD,OAAOC,QAAUL,EACbD,EACAO,QAAQ,YACRA,QAAQ,iBAIZP,EAAOiM,SAAWhM,EACdD,EACAA,EAAOiM,SACPjM,EAAO2rB,aAInB,CA3BA,CA2BG3rB,QAAQ,SAAkBA,EAAQiM,EAAU0f,GAC3C,aAEA1f,EAAS8G,cAAcpP,KAAK,uBAE5B,IAAIR,EAAQ8I,EAAStL,UAqBrB,OAnBAwC,EAAMkrB,oBAAsB,WACxB9sB,KAAK6B,GAAI,WAAY7B,KAAKoqB,aAC9B,EAEAxoB,EAAMwoB,aAAe,WACjB,GAAMpqB,KAAKC,QAAQmqB,aAAnB,CAGA,IAAIphB,EAAQhJ,KAQZoqB,EAAcpqB,KAAK6O,QAAShN,GAAI,YAPhC,SAAiChB,EAAUwc,GACvC,IAAIvQ,EAAO9D,EAAMgO,cAAeqG,EAAMwK,KACtC7e,EAAMwe,eAAgB1a,GAAQA,EAAKjC,SAC7B7B,EAAM/I,QAAQsgB,YAChBvX,EAAM+K,0BAEd,GARA,CAUJ,EAEOrJ,CAEX"}